react-router
Version:
Declarative routing for React
1 lines • 38.3 kB
Source Map (JSON)
{"version":3,"file":"react-router.min.js","sources":["../modules/miniCreateReactContext.js","../modules/createContext.js","../modules/createNamedContext.js","../modules/HistoryContext.js","../modules/RouterContext.js","../modules/Router.js","../modules/MemoryRouter.js","../modules/Lifecycle.js","../modules/Prompt.js","../modules/generatePath.js","../modules/Redirect.js","../modules/matchPath.js","../modules/Route.js","../modules/StaticRouter.js","../modules/Switch.js","../modules/withRouter.js","../modules/hooks.js"],"sourcesContent":["// MIT License\n// Copyright (c) 2019-present StringEpsilon <StringEpsilon@gmail.com>\n// Copyright (c) 2017-2019 James Kyle <me@thejameskyle.com>\n// https://github.com/StringEpsilon/mini-create-react-context\nimport React from \"react\";\nimport PropTypes from \"prop-types\";\nimport warning from \"tiny-warning\";\n\nconst MAX_SIGNED_31_BIT_INT = 1073741823;\n\nconst commonjsGlobal =\n typeof globalThis !== \"undefined\" // 'global proper'\n ? // eslint-disable-next-line no-undef\n globalThis\n : typeof window !== \"undefined\"\n ? window // Browser\n : typeof global !== \"undefined\"\n ? global // node.js\n : {};\n\nfunction getUniqueId() {\n let key = \"__global_unique_id__\";\n return (commonjsGlobal[key] = (commonjsGlobal[key] || 0) + 1);\n}\n\n// Inlined Object.is polyfill.\n// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/is\nfunction objectIs(x, y) {\n if (x === y) {\n return x !== 0 || 1 / x === 1 / y;\n } else {\n // eslint-disable-next-line no-self-compare\n return x !== x && y !== y;\n }\n}\n\nfunction createEventEmitter(value) {\n let handlers = [];\n return {\n on(handler) {\n handlers.push(handler);\n },\n\n off(handler) {\n handlers = handlers.filter(h => h !== handler);\n },\n\n get() {\n return value;\n },\n\n set(newValue, changedBits) {\n value = newValue;\n handlers.forEach(handler => handler(value, changedBits));\n }\n };\n}\n\nfunction onlyChild(children) {\n return Array.isArray(children) ? children[0] : children;\n}\n\nexport default function createReactContext(defaultValue, calculateChangedBits) {\n const contextProp = \"__create-react-context-\" + getUniqueId() + \"__\";\n\n class Provider extends React.Component {\n emitter = createEventEmitter(this.props.value);\n\n static childContextTypes = {\n [contextProp]: PropTypes.object.isRequired\n };\n\n getChildContext() {\n return {\n [contextProp]: this.emitter\n };\n }\n\n componentWillReceiveProps(nextProps) {\n if (this.props.value !== nextProps.value) {\n let oldValue = this.props.value;\n let newValue = nextProps.value;\n let changedBits;\n\n if (objectIs(oldValue, newValue)) {\n changedBits = 0; // No change\n } else {\n changedBits =\n typeof calculateChangedBits === \"function\"\n ? calculateChangedBits(oldValue, newValue)\n : MAX_SIGNED_31_BIT_INT;\n if (process.env.NODE_ENV !== \"production\") {\n warning(\n (changedBits & MAX_SIGNED_31_BIT_INT) === changedBits,\n \"calculateChangedBits: Expected the return value to be a \" +\n \"31-bit integer. Instead received: \" +\n changedBits\n );\n }\n\n changedBits |= 0;\n\n if (changedBits !== 0) {\n this.emitter.set(nextProps.value, changedBits);\n }\n }\n }\n }\n\n render() {\n return this.props.children;\n }\n }\n\n class Consumer extends React.Component {\n static contextTypes = {\n [contextProp]: PropTypes.object\n };\n\n observedBits;\n\n state = {\n value: this.getValue()\n };\n\n componentWillReceiveProps(nextProps) {\n let { observedBits } = nextProps;\n this.observedBits =\n observedBits === undefined || observedBits === null\n ? MAX_SIGNED_31_BIT_INT // Subscribe to all changes by default\n : observedBits;\n }\n\n componentDidMount() {\n if (this.context[contextProp]) {\n this.context[contextProp].on(this.onUpdate);\n }\n let { observedBits } = this.props;\n this.observedBits =\n observedBits === undefined || observedBits === null\n ? MAX_SIGNED_31_BIT_INT // Subscribe to all changes by default\n : observedBits;\n }\n\n componentWillUnmount() {\n if (this.context[contextProp]) {\n this.context[contextProp].off(this.onUpdate);\n }\n }\n\n getValue() {\n if (this.context[contextProp]) {\n return this.context[contextProp].get();\n } else {\n return defaultValue;\n }\n }\n\n onUpdate = (newValue, changedBits) => {\n const observedBits = this.observedBits | 0;\n if ((observedBits & changedBits) !== 0) {\n this.setState({ value: this.getValue() });\n }\n };\n\n render() {\n return onlyChild(this.props.children)(this.state.value);\n }\n }\n\n return {\n Provider,\n Consumer\n };\n}\n","// MIT License\n// Copyright (c) 2019-present StringEpsilon <StringEpsilon@gmail.com>\n// Copyright (c) 2017-2019 James Kyle <me@thejameskyle.com>\n// https://github.com/StringEpsilon/mini-create-react-context\nimport React from \"react\";\nimport createReactContext from \"./miniCreateReactContext\";\n\nexport default React.createContext || createReactContext;\n","// TODO: Replace with React.createContext once we can assume React 16+\nimport createContext from \"./createContext\";\n\nconst createNamedContext = name => {\n const context = createContext();\n context.displayName = name;\n\n return context;\n};\n\nexport default createNamedContext;\n","import createNamedContext from \"./createNamedContext\";\n\nconst historyContext = /*#__PURE__*/ createNamedContext(\"Router-History\");\nexport default historyContext;\n","import createNamedContext from \"./createNamedContext\";\n\nconst context = /*#__PURE__*/ createNamedContext(\"Router\");\nexport default context;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport warning from \"tiny-warning\";\n\nimport HistoryContext from \"./HistoryContext.js\";\nimport RouterContext from \"./RouterContext.js\";\n\n/**\n * The public API for putting history on context.\n */\nclass Router extends React.Component {\n static computeRootMatch(pathname) {\n return { path: \"/\", url: \"/\", params: {}, isExact: pathname === \"/\" };\n }\n\n constructor(props) {\n super(props);\n\n this.state = {\n location: props.history.location\n };\n\n // This is a bit of a hack. We have to start listening for location\n // changes here in the constructor in case there are any <Redirect>s\n // on the initial render. If there are, they will replace/push when\n // they mount and since cDM fires in children before parents, we may\n // get a new location before the <Router> is mounted.\n this._isMounted = false;\n this._pendingLocation = null;\n\n if (!props.staticContext) {\n this.unlisten = props.history.listen(location => {\n this._pendingLocation = location;\n });\n }\n }\n\n componentDidMount() {\n this._isMounted = true;\n\n if (this.unlisten) {\n // Any pre-mount location changes have been captured at\n // this point, so unregister the listener.\n this.unlisten();\n }\n if (!this.props.staticContext) {\n this.unlisten = this.props.history.listen(location => {\n if (this._isMounted) {\n this.setState({ location });\n }\n });\n }\n if (this._pendingLocation) {\n this.setState({ location: this._pendingLocation });\n }\n }\n\n componentWillUnmount() {\n if (this.unlisten) {\n this.unlisten();\n this._isMounted = false;\n this._pendingLocation = null;\n }\n }\n\n render() {\n return (\n <RouterContext.Provider\n value={{\n history: this.props.history,\n location: this.state.location,\n match: Router.computeRootMatch(this.state.location.pathname),\n staticContext: this.props.staticContext\n }}\n >\n <HistoryContext.Provider\n children={this.props.children || null}\n value={this.props.history}\n />\n </RouterContext.Provider>\n );\n }\n}\n\nif (__DEV__) {\n Router.propTypes = {\n children: PropTypes.node,\n history: PropTypes.object.isRequired,\n staticContext: PropTypes.object\n };\n\n Router.prototype.componentDidUpdate = function(prevProps) {\n warning(\n prevProps.history === this.props.history,\n \"You cannot change <Router history>\"\n );\n };\n}\n\nexport default Router;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { createMemoryHistory as createHistory } from \"history\";\nimport warning from \"tiny-warning\";\n\nimport Router from \"./Router.js\";\n\n/**\n * The public API for a <Router> that stores location in memory.\n */\nclass MemoryRouter extends React.Component {\n history = createHistory(this.props);\n\n render() {\n return <Router history={this.history} children={this.props.children} />;\n }\n}\n\nif (__DEV__) {\n MemoryRouter.propTypes = {\n initialEntries: PropTypes.array,\n initialIndex: PropTypes.number,\n getUserConfirmation: PropTypes.func,\n keyLength: PropTypes.number,\n children: PropTypes.node\n };\n\n MemoryRouter.prototype.componentDidMount = function() {\n warning(\n !this.props.history,\n \"<MemoryRouter> ignores the history prop. To use a custom history, \" +\n \"use `import { Router }` instead of `import { MemoryRouter as Router }`.\"\n );\n };\n}\n\nexport default MemoryRouter;\n","import React from \"react\";\n\nclass Lifecycle extends React.Component {\n componentDidMount() {\n if (this.props.onMount) this.props.onMount.call(this, this);\n }\n\n componentDidUpdate(prevProps) {\n if (this.props.onUpdate) this.props.onUpdate.call(this, this, prevProps);\n }\n\n componentWillUnmount() {\n if (this.props.onUnmount) this.props.onUnmount.call(this, this);\n }\n\n render() {\n return null;\n }\n}\n\nexport default Lifecycle;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport invariant from \"tiny-invariant\";\n\nimport Lifecycle from \"./Lifecycle.js\";\nimport RouterContext from \"./RouterContext.js\";\n\n/**\n * The public API for prompting the user before navigating away from a screen.\n */\nfunction Prompt({ message, when = true }) {\n return (\n <RouterContext.Consumer>\n {context => {\n invariant(context, \"You should not use <Prompt> outside a <Router>\");\n\n if (!when || context.staticContext) return null;\n\n const method = context.history.block;\n\n return (\n <Lifecycle\n onMount={self => {\n self.release = method(message);\n }}\n onUpdate={(self, prevProps) => {\n if (prevProps.message !== message) {\n self.release();\n self.release = method(message);\n }\n }}\n onUnmount={self => {\n self.release();\n }}\n message={message}\n />\n );\n }}\n </RouterContext.Consumer>\n );\n}\n\nif (__DEV__) {\n const messageType = PropTypes.oneOfType([PropTypes.func, PropTypes.string]);\n\n Prompt.propTypes = {\n when: PropTypes.bool,\n message: messageType.isRequired\n };\n}\n\nexport default Prompt;\n","import pathToRegexp from \"path-to-regexp\";\n\nconst cache = {};\nconst cacheLimit = 10000;\nlet cacheCount = 0;\n\nfunction compilePath(path) {\n if (cache[path]) return cache[path];\n\n const generator = pathToRegexp.compile(path);\n\n if (cacheCount < cacheLimit) {\n cache[path] = generator;\n cacheCount++;\n }\n\n return generator;\n}\n\n/**\n * Public API for generating a URL pathname from a path and parameters.\n */\nfunction generatePath(path = \"/\", params = {}) {\n return path === \"/\" ? path : compilePath(path)(params, { pretty: true });\n}\n\nexport default generatePath;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { createLocation, locationsAreEqual } from \"history\";\nimport invariant from \"tiny-invariant\";\n\nimport Lifecycle from \"./Lifecycle.js\";\nimport RouterContext from \"./RouterContext.js\";\nimport generatePath from \"./generatePath.js\";\n\n/**\n * The public API for navigating programmatically with a component.\n */\nfunction Redirect({ computedMatch, to, push = false }) {\n return (\n <RouterContext.Consumer>\n {context => {\n invariant(context, \"You should not use <Redirect> outside a <Router>\");\n\n const { history, staticContext } = context;\n\n const method = push ? history.push : history.replace;\n const location = createLocation(\n computedMatch\n ? typeof to === \"string\"\n ? generatePath(to, computedMatch.params)\n : {\n ...to,\n pathname: generatePath(to.pathname, computedMatch.params)\n }\n : to\n );\n\n // When rendering in a static context,\n // set the new location immediately.\n if (staticContext) {\n method(location);\n return null;\n }\n\n return (\n <Lifecycle\n onMount={() => {\n method(location);\n }}\n onUpdate={(self, prevProps) => {\n const prevLocation = createLocation(prevProps.to);\n if (\n !locationsAreEqual(prevLocation, {\n ...location,\n key: prevLocation.key\n })\n ) {\n method(location);\n }\n }}\n to={to}\n />\n );\n }}\n </RouterContext.Consumer>\n );\n}\n\nif (__DEV__) {\n Redirect.propTypes = {\n push: PropTypes.bool,\n from: PropTypes.string,\n to: PropTypes.oneOfType([PropTypes.string, PropTypes.object]).isRequired\n };\n}\n\nexport default Redirect;\n","import pathToRegexp from \"path-to-regexp\";\n\nconst cache = {};\nconst cacheLimit = 10000;\nlet cacheCount = 0;\n\nfunction compilePath(path, options) {\n const cacheKey = `${options.end}${options.strict}${options.sensitive}`;\n const pathCache = cache[cacheKey] || (cache[cacheKey] = {});\n\n if (pathCache[path]) return pathCache[path];\n\n const keys = [];\n const regexp = pathToRegexp(path, keys, options);\n const result = { regexp, keys };\n\n if (cacheCount < cacheLimit) {\n pathCache[path] = result;\n cacheCount++;\n }\n\n return result;\n}\n\n/**\n * Public API for matching a URL pathname to a path.\n */\nfunction matchPath(pathname, options = {}) {\n if (typeof options === \"string\" || Array.isArray(options)) {\n options = { path: options };\n }\n\n const { path, exact = false, strict = false, sensitive = false } = options;\n\n const paths = [].concat(path);\n\n return paths.reduce((matched, path) => {\n if (!path && path !== \"\") return null;\n if (matched) return matched;\n\n const { regexp, keys } = compilePath(path, {\n end: exact,\n strict,\n sensitive\n });\n const match = regexp.exec(pathname);\n\n if (!match) return null;\n\n const [url, ...values] = match;\n const isExact = pathname === url;\n\n if (exact && !isExact) return null;\n\n return {\n path, // the path used to match\n url: path === \"/\" && url === \"\" ? \"/\" : url, // the matched portion of the URL\n isExact, // whether or not we matched exactly\n params: keys.reduce((memo, key, index) => {\n memo[key.name] = values[index];\n return memo;\n }, {})\n };\n }, null);\n}\n\nexport default matchPath;\n","import React from \"react\";\nimport { isValidElementType } from \"react-is\";\nimport PropTypes from \"prop-types\";\nimport invariant from \"tiny-invariant\";\nimport warning from \"tiny-warning\";\n\nimport RouterContext from \"./RouterContext.js\";\nimport matchPath from \"./matchPath.js\";\n\nfunction isEmptyChildren(children) {\n return React.Children.count(children) === 0;\n}\n\nfunction evalChildrenDev(children, props, path) {\n const value = children(props);\n\n warning(\n value !== undefined,\n \"You returned `undefined` from the `children` function of \" +\n `<Route${path ? ` path=\"${path}\"` : \"\"}>, but you ` +\n \"should have returned a React element or `null`\"\n );\n\n return value || null;\n}\n\n/**\n * The public API for matching a single path and rendering.\n */\nclass Route extends React.Component {\n render() {\n return (\n <RouterContext.Consumer>\n {context => {\n invariant(context, \"You should not use <Route> outside a <Router>\");\n\n const location = this.props.location || context.location;\n const match = this.props.computedMatch\n ? this.props.computedMatch // <Switch> already computed the match for us\n : this.props.path\n ? matchPath(location.pathname, this.props)\n : context.match;\n\n const props = { ...context, location, match };\n\n let { children, component, render } = this.props;\n\n // Preact uses an empty array as children by\n // default, so use null if that's the case.\n if (Array.isArray(children) && isEmptyChildren(children)) {\n children = null;\n }\n\n return (\n <RouterContext.Provider value={props}>\n {props.match\n ? children\n ? typeof children === \"function\"\n ? __DEV__\n ? evalChildrenDev(children, props, this.props.path)\n : children(props)\n : children\n : component\n ? React.createElement(component, props)\n : render\n ? render(props)\n : null\n : typeof children === \"function\"\n ? __DEV__\n ? evalChildrenDev(children, props, this.props.path)\n : children(props)\n : null}\n </RouterContext.Provider>\n );\n }}\n </RouterContext.Consumer>\n );\n }\n}\n\nif (__DEV__) {\n Route.propTypes = {\n children: PropTypes.oneOfType([PropTypes.func, PropTypes.node]),\n component: (props, propName) => {\n if (props[propName] && !isValidElementType(props[propName])) {\n return new Error(\n `Invalid prop 'component' supplied to 'Route': the prop is not a valid React component`\n );\n }\n },\n exact: PropTypes.bool,\n location: PropTypes.object,\n path: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.arrayOf(PropTypes.string)\n ]),\n render: PropTypes.func,\n sensitive: PropTypes.bool,\n strict: PropTypes.bool\n };\n\n Route.prototype.componentDidMount = function() {\n warning(\n !(\n this.props.children &&\n !isEmptyChildren(this.props.children) &&\n this.props.component\n ),\n \"You should not use <Route component> and <Route children> in the same route; <Route component> will be ignored\"\n );\n\n warning(\n !(\n this.props.children &&\n !isEmptyChildren(this.props.children) &&\n this.props.render\n ),\n \"You should not use <Route render> and <Route children> in the same route; <Route render> will be ignored\"\n );\n\n warning(\n !(this.props.component && this.props.render),\n \"You should not use <Route component> and <Route render> in the same route; <Route render> will be ignored\"\n );\n };\n\n Route.prototype.componentDidUpdate = function(prevProps) {\n warning(\n !(this.props.location && !prevProps.location),\n '<Route> elements should not change from uncontrolled to controlled (or vice versa). You initially used no \"location\" prop and then provided one on a subsequent render.'\n );\n\n warning(\n !(!this.props.location && prevProps.location),\n '<Route> elements should not change from controlled to uncontrolled (or vice versa). You provided a \"location\" prop initially but omitted it on a subsequent render.'\n );\n };\n}\n\nexport default Route;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport { createLocation, createPath } from \"history\";\nimport invariant from \"tiny-invariant\";\nimport warning from \"tiny-warning\";\n\nimport Router from \"./Router.js\";\n\nfunction addLeadingSlash(path) {\n return path.charAt(0) === \"/\" ? path : \"/\" + path;\n}\n\nfunction addBasename(basename, location) {\n if (!basename) return location;\n\n return {\n ...location,\n pathname: addLeadingSlash(basename) + location.pathname\n };\n}\n\nfunction stripBasename(basename, location) {\n if (!basename) return location;\n\n const base = addLeadingSlash(basename);\n\n if (location.pathname.indexOf(base) !== 0) return location;\n\n return {\n ...location,\n pathname: location.pathname.substr(base.length)\n };\n}\n\nfunction createURL(location) {\n return typeof location === \"string\" ? location : createPath(location);\n}\n\nfunction staticHandler(methodName) {\n return () => {\n invariant(false, \"You cannot %s with <StaticRouter>\", methodName);\n };\n}\n\nfunction noop() {}\n\n/**\n * The public top-level API for a \"static\" <Router>, so-called because it\n * can't actually change the current location. Instead, it just records\n * location changes in a context object. Useful mainly in testing and\n * server-rendering scenarios.\n */\nclass StaticRouter extends React.Component {\n navigateTo(location, action) {\n const { basename = \"\", context = {} } = this.props;\n context.action = action;\n context.location = addBasename(basename, createLocation(location));\n context.url = createURL(context.location);\n }\n\n handlePush = location => this.navigateTo(location, \"PUSH\");\n handleReplace = location => this.navigateTo(location, \"REPLACE\");\n handleListen = () => noop;\n handleBlock = () => noop;\n\n render() {\n const { basename = \"\", context = {}, location = \"/\", ...rest } = this.props;\n\n const history = {\n createHref: path => addLeadingSlash(basename + createURL(path)),\n action: \"POP\",\n location: stripBasename(basename, createLocation(location)),\n push: this.handlePush,\n replace: this.handleReplace,\n go: staticHandler(\"go\"),\n goBack: staticHandler(\"goBack\"),\n goForward: staticHandler(\"goForward\"),\n listen: this.handleListen,\n block: this.handleBlock\n };\n\n return <Router {...rest} history={history} staticContext={context} />;\n }\n}\n\nif (__DEV__) {\n StaticRouter.propTypes = {\n basename: PropTypes.string,\n context: PropTypes.object,\n location: PropTypes.oneOfType([PropTypes.string, PropTypes.object])\n };\n\n StaticRouter.prototype.componentDidMount = function() {\n warning(\n !this.props.history,\n \"<StaticRouter> ignores the history prop. To use a custom history, \" +\n \"use `import { Router }` instead of `import { StaticRouter as Router }`.\"\n );\n };\n}\n\nexport default StaticRouter;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport invariant from \"tiny-invariant\";\nimport warning from \"tiny-warning\";\n\nimport RouterContext from \"./RouterContext.js\";\nimport matchPath from \"./matchPath.js\";\n\n/**\n * The public API for rendering the first <Route> that matches.\n */\nclass Switch extends React.Component {\n render() {\n return (\n <RouterContext.Consumer>\n {context => {\n invariant(context, \"You should not use <Switch> outside a <Router>\");\n\n const location = this.props.location || context.location;\n\n let element, match;\n\n // We use React.Children.forEach instead of React.Children.toArray().find()\n // here because toArray adds keys to all child elements and we do not want\n // to trigger an unmount/remount for two <Route>s that render the same\n // component at different URLs.\n React.Children.forEach(this.props.children, child => {\n if (match == null && React.isValidElement(child)) {\n element = child;\n\n const path = child.props.path || child.props.from;\n\n match = path\n ? matchPath(location.pathname, { ...child.props, path })\n : context.match;\n }\n });\n\n return match\n ? React.cloneElement(element, { location, computedMatch: match })\n : null;\n }}\n </RouterContext.Consumer>\n );\n }\n}\n\nif (__DEV__) {\n Switch.propTypes = {\n children: PropTypes.node,\n location: PropTypes.object\n };\n\n Switch.prototype.componentDidUpdate = function(prevProps) {\n warning(\n !(this.props.location && !prevProps.location),\n '<Switch> elements should not change from uncontrolled to controlled (or vice versa). You initially used no \"location\" prop and then provided one on a subsequent render.'\n );\n\n warning(\n !(!this.props.location && prevProps.location),\n '<Switch> elements should not change from controlled to uncontrolled (or vice versa). You provided a \"location\" prop initially but omitted it on a subsequent render.'\n );\n };\n}\n\nexport default Switch;\n","import React from \"react\";\nimport PropTypes from \"prop-types\";\nimport hoistStatics from \"hoist-non-react-statics\";\nimport invariant from \"tiny-invariant\";\n\nimport RouterContext from \"./RouterContext.js\";\n\n/**\n * A public higher-order component to access the imperative API\n */\nfunction withRouter(Component) {\n const displayName = `withRouter(${Component.displayName || Component.name})`;\n const C = props => {\n const { wrappedComponentRef, ...remainingProps } = props;\n\n return (\n <RouterContext.Consumer>\n {context => {\n invariant(\n context,\n `You should not use <${displayName} /> outside a <Router>`\n );\n return (\n <Component\n {...remainingProps}\n {...context}\n ref={wrappedComponentRef}\n />\n );\n }}\n </RouterContext.Consumer>\n );\n };\n\n C.displayName = displayName;\n C.WrappedComponent = Component;\n\n if (__DEV__) {\n C.propTypes = {\n wrappedComponentRef: PropTypes.oneOfType([\n PropTypes.string,\n PropTypes.func,\n PropTypes.object\n ])\n };\n }\n\n return hoistStatics(C, Component);\n}\n\nexport default withRouter;\n","import React from \"react\";\nimport invariant from \"tiny-invariant\";\n\nimport RouterContext from \"./RouterContext.js\";\nimport HistoryContext from \"./HistoryContext.js\";\nimport matchPath from \"./matchPath.js\";\n\nconst useContext = React.useContext;\n\nexport function useHistory() {\n if (__DEV__) {\n invariant(\n typeof useContext === \"function\",\n \"You must use React >= 16.8 in order to use useHistory()\"\n );\n }\n\n return useContext(HistoryContext);\n}\n\nexport function useLocation() {\n if (__DEV__) {\n invariant(\n typeof useContext === \"function\",\n \"You must use React >= 16.8 in order to use useLocation()\"\n );\n }\n\n return useContext(RouterContext).location;\n}\n\nexport function useParams() {\n if (__DEV__) {\n invariant(\n typeof useContext === \"function\",\n \"You must use React >= 16.8 in order to use useParams()\"\n );\n }\n\n const match = useContext(RouterContext).match;\n return match ? match.params : {};\n}\n\nexport function useRouteMatch(path) {\n if (__DEV__) {\n invariant(\n typeof useContext === \"function\",\n \"You must use React >= 16.8 in order to use useRouteMatch()\"\n );\n }\n\n const location = useLocation();\n const match = useContext(RouterContext).match;\n return path ? matchPath(location.pathname, path) : match;\n}\n"],"names":["MAX_SIGNED_31_BIT_INT","commonjsGlobal","globalThis","window","global","getUniqueId","key","objectIs","x","y","createEventEmitter","value","handlers","on","handler","push","off","filter","h","get","set","newValue","changedBits","forEach","onlyChild","children","Array","isArray","createReactContext","defaultValue","calculateChangedBits","contextProp","Provider","emitter","_this","props","getChildContext","this","componentWillReceiveProps","nextProps","oldValue","render","React","Component","childContextTypes","PropTypes","object","isRequired","Consumer","observedBits","state","_this2","getValue","onUpdate","setState","componentDidMount","context","componentWillUnmount","contextTypes","createContext","createNamedContext","name","displayName","historyContext","Router","location","history","_isMounted","_pendingLocation","staticContext","unlisten","listen","computeRootMatch","pathname","path","url","params","isExact","RouterContext","match","HistoryContext","MemoryRouter","createHistory","Lifecycle","onMount","call","componentDidUpdate","prevProps","onUnmount","Prompt","message","when","invariant","method","block","self","release","cache","cacheLimit","cacheCount","compilePath","generator","pathToRegexp","compile","generatePath","pretty","Redirect","computedMatch","to","replace","createLocation","prevLocation","locationsAreEqual","options","cacheKey","end","strict","sensitive","pathCache","keys","result","regexp","matchPath","exact","concat","reduce","matched","exec","values","memo","index","isEmptyChildren","Children","count","Route","component","createElement","addLeadingSlash","charAt","addBasename","basename","stripBasename","base","indexOf","substr","length","createURL","createPath","staticHandler","methodName","noop","StaticRouter","handlePush","navigateTo","handleReplace","handleListen","handleBlock","action","rest","createHref","go","goBack","goForward","Switch","element","child","isValidElement","from","cloneElement","withRouter","C","wrappedComponentRef","remainingProps","ref","WrappedComponent","hoistStatics","useContext","useHistory","useLocation","useParams","useRouteMatch"],"mappings":"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"}