UNPKG

gatsby

Version:
109 lines (104 loc) 5.87 kB
"use strict"; "use client"; exports.__esModule = true; exports.Slice = Slice; var _react = _interopRequireWildcard(require("react")); var _serverSlice = require("./slice/server-slice"); var _inlineSlice = require("./slice/inline-slice"); var _context = require("./slice/context"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function Slice(props) { if (process.env.GATSBY_SLICES) { // we use sliceName internally, so remap alias to sliceName const internalProps = { ...props, sliceName: props.alias }; delete internalProps.alias; delete internalProps.__renderedByLocation; const slicesContext = (0, _react.useContext)(_context.SlicesContext); // validate props const propErrors = validateSliceProps(props); if (Object.keys(propErrors).length) { throw new SlicePropsError(slicesContext.renderEnvironment === `browser`, internalProps.sliceName, propErrors, props.__renderedByLocation); } if (slicesContext.renderEnvironment === `server`) { return /*#__PURE__*/_react.default.createElement(_serverSlice.ServerSlice, internalProps); } else if (slicesContext.renderEnvironment === `browser`) { // in the browser, we'll just render the component as is return /*#__PURE__*/_react.default.createElement(_inlineSlice.InlineSlice, internalProps); } else if (slicesContext.renderEnvironment === `engines` || slicesContext.renderEnvironment === `dev-ssr`) { // if we're in SSR, we'll just render the component as is return /*#__PURE__*/_react.default.createElement(_inlineSlice.InlineSlice, internalProps); } else if (slicesContext.renderEnvironment === `slices`) { // we are not yet supporting nested slices let additionalContextMessage = ``; // just in case generating additional contextual information fails, we still want the base message to show // and not show another cryptic error message try { additionalContextMessage = `\n\nSlice component "${slicesContext.sliceRoot.name}" (${slicesContext.sliceRoot.componentPath}) tried to render <Slice alias="${props.alias}"/>`; } catch { // don't need to handle it, we will just skip the additional context message if we fail to generate it } throw new Error(`Nested slices are not supported.${additionalContextMessage}\n\nSee https://gatsbyjs.com/docs/reference/built-in-components/gatsby-slice#nested-slices`); } else { throw new Error(`Slice context "${slicesContext.renderEnvironment}" is not supported.`); } } else { throw new Error(`Slices are disabled.`); } } class SlicePropsError extends Error { constructor(inBrowser, sliceName, propErrors, renderedByLocation) { const errors = Object.entries(propErrors).map(([key, value]) => `not serializable "${value}" type passed to "${key}" prop`).join(`, `); const name = `SlicePropsError`; let stack = ``; let message = ``; if (inBrowser) { // They're just (kinda) kidding, I promise... You can still work here <3 // https://www.gatsbyjs.com/careers/ const fullStack = _react.default.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactDebugCurrentFrame.getCurrentStack(); // remove the first line of the stack trace const stackLines = fullStack.trim().split(`\n`).slice(1); stackLines[0] = stackLines[0].trim(); stack = `\n` + stackLines.join(`\n`); message = `Slice "${sliceName}" was passed props that are not serializable (${errors}).`; } else { // we can't really grab any extra info outside of the browser, so just print what we can message = `${name}: Slice "${sliceName}" was passed props that are not serializable (${errors}).`; const stackLines = new Error().stack.trim().split(`\n`).slice(2); stack = `${message}\n${stackLines.join(`\n`)}`; } super(message); this.name = name; if (stack) { this.stack = stack; } else { Error.captureStackTrace(this, SlicePropsError); } if (renderedByLocation) { this.forcedLocation = { ...renderedByLocation, functionName: `Slice` }; } } } const validateSliceProps = (props, errors = {}, seenObjects = [], path = null) => { // recursively validate all props for (const [name, value] of Object.entries(props)) { if (value === undefined || value === null || !path && name === `children`) { continue; } const propPath = path ? `${path}.${name}` : name; if (typeof value === `function`) { errors[propPath] = typeof value; } else if (typeof value === `object` && seenObjects.indexOf(value) <= 0) { seenObjects.push(value); validateSliceProps(value, errors, seenObjects, propPath); } } return errors; }; //# sourceMappingURL=slice.js.map