@dr.pogodin/react-utils 1.31.0 → 1.31.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/build/development/index.js +1 -1
- package/build/development/index.js.map +1 -1
- package/build/development/server/index.js +1 -1
- package/build/development/server/index.js.map +1 -1
- package/build/development/server/utils/index.js +1 -1
- package/build/development/shared/components/Modal/index.js +17 -0
- package/build/development/shared/components/Modal/index.js.map +1 -1
- package/build/development/shared/components/WithTooltip/index.js +1 -1
- package/build/development/shared/components/WithTooltip/index.js.map +1 -1
- package/build/development/shared/components/index.js +1 -1
- package/build/development/shared/components/index.js.map +1 -1
- package/build/development/shared/components/selectors/CustomDropdown/Options/index.js +30 -29
- package/build/development/shared/components/selectors/CustomDropdown/Options/index.js.map +1 -1
- package/build/development/shared/components/selectors/CustomDropdown/index.js +68 -14
- package/build/development/shared/components/selectors/CustomDropdown/index.js.map +1 -1
- package/build/development/shared/components/selectors/common.js +4 -1
- package/build/development/shared/components/selectors/common.js.map +1 -1
- package/build/development/shared/utils/index.js +1 -1
- package/build/development/shared/utils/index.js.map +1 -1
- package/build/development/shared/utils/jest/E2eSsrEnv.js +3 -0
- package/build/development/shared/utils/jest/E2eSsrEnv.js.map +1 -1
- package/build/development/shared/utils/jest/index.js +1 -1
- package/build/development/shared/utils/jest/index.js.map +1 -1
- package/build/development/style.css +18 -2
- package/build/development/web.bundle.js +15 -15
- package/build/production/index.js +1 -1
- package/build/production/index.js.map +1 -1
- package/build/production/server/index.js +1 -1
- package/build/production/server/index.js.map +1 -1
- package/build/production/server/utils/index.js +1 -1
- package/build/production/shared/components/Modal/index.js +3 -2
- package/build/production/shared/components/Modal/index.js.map +1 -1
- package/build/production/shared/components/WithTooltip/index.js +1 -1
- package/build/production/shared/components/WithTooltip/index.js.map +1 -1
- package/build/production/shared/components/index.js +1 -1
- package/build/production/shared/components/index.js.map +1 -1
- package/build/production/shared/components/selectors/CustomDropdown/Options/index.js +2 -2
- package/build/production/shared/components/selectors/CustomDropdown/Options/index.js.map +1 -1
- package/build/production/shared/components/selectors/CustomDropdown/index.js +7 -3
- package/build/production/shared/components/selectors/CustomDropdown/index.js.map +1 -1
- package/build/production/shared/components/selectors/common.js +3 -1
- package/build/production/shared/components/selectors/common.js.map +1 -1
- package/build/production/shared/utils/index.js +1 -1
- package/build/production/shared/utils/index.js.map +1 -1
- package/build/production/shared/utils/jest/E2eSsrEnv.js +3 -1
- package/build/production/shared/utils/jest/E2eSsrEnv.js.map +1 -1
- package/build/production/shared/utils/jest/index.js +1 -1
- package/build/production/shared/utils/jest/index.js.map +1 -1
- package/build/production/style.css +1 -1
- package/build/production/style.css.map +1 -1
- package/build/production/web.bundle.js +1 -1
- package/build/production/web.bundle.js.map +1 -1
- package/build/types-code/shared/components/Modal/index.d.ts +1 -0
- package/build/types-code/shared/components/selectors/CustomDropdown/Options/index.d.ts +11 -6
- package/build/types-code/shared/components/selectors/common.d.ts +1 -1
- package/build/types-scss/src/shared/components/selectors/CustomDropdown/theme.scss.d.ts +1 -0
- package/package.json +27 -27
- package/src/shared/components/Modal/index.tsx +18 -0
- package/src/shared/components/selectors/CustomDropdown/Options/index.tsx +40 -34
- package/src/shared/components/selectors/CustomDropdown/index.tsx +73 -12
- package/src/shared/components/selectors/CustomDropdown/theme.scss +33 -5
- package/src/shared/components/selectors/common.ts +4 -0
- package/src/shared/utils/jest/E2eSsrEnv.ts +5 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["require","_http","_interopRequireDefault","_https","_lodash","_server","_interopRequireWildcard","_renderer","_utils","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","normalizePort","value","port","toNumber","isFinite","isNumber","launchServer","webpackConfig","options","ops","cloneDeep","process","env","PORT","defaults","httpsRedirect","logger","undefined","newDefaultLogger","defaultLogLevel","defaultLoggerLogLevel","expressServer","serverFactory","httpServer","https","createServer","cert","key","http","on","error","syscall","bind","isString","code","exit","addr","address","info","NODE_ENV","listen","SCRIPT_LOCATIONS"],"sources":["../../../src/server/index.ts"],"sourcesContent":["import 'source-map-support/register';\n\nimport http from 'http';\nimport https from 'https';\n\nimport {\n cloneDeep,\n defaults,\n isFinite,\n isNumber,\n isString,\n toNumber,\n} from 'lodash';\n\n/* Polyfill required by ReactJS. */\nimport 'raf/polyfill';\n\nimport { type Configuration } from 'webpack';\n\nimport serverFactory, { type OptionsT as ServerOptionsT } from './server';\nimport { SCRIPT_LOCATIONS, newDefaultLogger } from './renderer';\n\nexport {\n getDefaultCspSettings,\n} from './server';\n\nexport { errors } from './utils';\n\n/**\n * Normalizes a port into a number, string, or false.\n * TODO: Drop this function?\n * @param value Port name or number.\n * @return Port number (Number), name (String), or false.\n */\nfunction normalizePort(value: number | string) {\n const port = toNumber(value);\n if (isFinite(port)) return port; /* port number */\n if (!isNumber(port)) return value; /* named pipe */\n return false;\n}\n\ntype OptionsT = ServerOptionsT & {\n https?: {\n cert: string;\n key: string;\n },\n\n // TODO: Should we limit it to number | string, and throw if it is different value?\n port?: false | number | string;\n};\n\n/**\n * Creates and launches web-server for ReactJS application. Allows zero\n * or detailed configuration, supports server-side rendering,\n * and development tools, including Hot Module Reloading (HMR).\n *\n * NOTE: Many of options defined below are passed down to the server and\n * renderer factories, and their declared default values are set in those\n * factories, rather than here.\n *\n * @param {object} webpackConfig Webpack configuration used to build\n * the frontend bundle. In production mode the server will read out of it\n * `context`, `publicPath`, and a few other parameters, necessary to locate\n * and serve the app bundle. In development mode the server will use entire\n * provided config to build the app bundle in memory, and further watch and\n * update it via HMR.\n * @param {object} [options] Additional parameters.\n * @param {Component} [options.Application] The root ReactJS component of\n * the app to use for the server-side rendering. When not provided\n * the server-side rendering is disabled.\n * @param {function} [options.beforeExpressJsError] Asynchronous callback\n * (`(server) => Promise<boolean>`) to be executed just before the default error\n * handler is added to ExpressJS server. If the callback is provided and its\n * result resolves to a truthy value, `react-utils` won't attach the default\n * error handler.\n * @param {function} [options.beforeExpressJsSetup] Asynchronous callback\n * (`(server) => Promise) to be executed right after ExpressJS server creation,\n * before any configuration is performed.\n * @param {BeforeRenderHook} [options.beforeRender] The hook to run just before\n * the server-side rendering. For each incoming request, it will be executed\n * just before the HTML markup is generated at the server. It allows to load\n * and provide the data necessary for server-side rendering, and also to inject\n * additional configuration and scripts into the generated HTML code.\n * @param {boolean} [options.noCsp] Set `true` to disable\n * Content-Security-Policy (CSP) headers altogether.\n * @param {function} [options.cspSettingsHook] A hook allowing\n * to customize [CSP](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP)\n * settings for [helmet](https://github.com/helmetjs/helmet)'s\n * `contentSecurityPolicy` middleware on per-request basis.\n *\n * If provided it should be a with signature: \\\n * `(defaultSettings: object, req: object)` ⇒ `object` \\\n * which gets the default settings (also used without the hook),\n * and the incoming request object. The hook response will be passed\n * as options to the helmet `contentSecurityPolicy` middleware.\n *\n * Currently, the default settings is the following object in production\n * environment:\n * ```js\n * {\n * directives: {\n * defaultSrc: [\"'self'\"],\n * baseUri: [\"'self'\"],\n * blockAllMixedContent: [],\n * fontSrc: [\"'self'\", 'https:', 'data:'],\n * frameAncestors: [\"'self'\"],\n * frameSrc: [\"'self'\", 'https://*.youtube.com'],\n * imgSrc: [\"'self'\", 'data:'],\n * objectSrc: [\"'none'\"],\n * scriptSrc: [\"'self'\", \"'unsafe-eval'\", `'nonce-UNIQUE_NONCE_VALUE'`],\n * scriptSrcAttr: [\"'none'\"],\n * styleSrc: [\"'self'\", 'https:', \"'unsafe-inline'\"],\n * upgradeInsecureRequests: [] // Removed in dev mode.\n * }\n * }\n * ```\n * It matches the default value used by Helmet with a few updates:\n * - YouTube host is whitelisted in the `frameSrc` directive to ensure\n * the {@link YouTubeVideo} component works.\n * - An unique per-request nonce is added to `scriptSrc` directive to\n * whitelist auxiliary scripts injected by react-utils. The actual nonce\n * value can be fetched by host code via `.nonce` field of `req` argument\n * of `.beforeRender` hook.\n * - `upgradeInsecureRequests` directive is removed in development mode,\n * to simplify local testing with http requests.\n * @param {string} [options.defaultLoggerLogLevel='info'] Log level for\n * the default logger, which is created if no `logger` option provided.\n * @param {boolean} [options.devMode] Pass in `true` to start the server in\n * development mode.\n * @param {string} [options.favicon] Path to the favicon to use by the server.\n * By default no favicon is used.\n * @param {object} [options.https] If provided, HTTPS server will be started,\n * instead of HTTP otherwise. The object should provide SSL certificate and key\n * via two string fields: `cert`, and `key`.\n * @param {string} [options.https.cert] SSL Certificate.\n * @param {string} [options.https.key] SSL key.\n * @param {boolean} [options.httpsRedirect=true] Pass in `true` to enable\n * automatic redirection of all incoming HTTP requests to HTTPS.\n *\n * To smoothly use it at `localhost` you need to run the server in HTTPS mode,\n * and also properly create and install a self-signed SSL sertificate on your\n * system. This article is helpful:\n * [How to get HTTPS working on your local development environment in 5 minutes](https://medium.freecodecamp.org/how-to-get-https-working-on-your-local-development-environment-in-5-minutes-7af615770eec)\n * @param {Logger} [options.logger] The logger to use at server side.\n * By default [`winston`](https://www.npmjs.com/package/winston) logger\n * with console transport is used. The logger you provide, or the default\n * `winston` logger otherwise, will be attached to the created ExpressJS server\n * object.\n * @param {function} [options.onExpressJsSetup] An async callback\n * (`(server) => Promise`) to be triggered when most of the server\n * configuration is completed, just before the server-side renderer,\n * and the default error handler are attached. You can use it to mount\n * custom API routes. The server-side logger can be accessed as `server.logger`.\n * @param {number|string} [options.port=3000] The port to start the server on.\n * @param {number} [options.staticCacheSize=1.e7] The maximum\n * static cache size in bytes. Defaults to ~10 MB.\n * @param {function} [options.staticCacheController] When given, it activates,\n * and controls the static caching of generated HTML markup. When this function\n * is provided, on each incoming request it is triggered with the request\n * passed in as the argument. To attempt to serve the response from the cache\n * it should return the object with the following fields:\n * - `key: string` – the cache key for the response;\n * - `maxage?: number` – the maximum age of cached result in ms.\n * If undefined - infinite age is assumed.\n * @param {number} [options.maxSsrRounds=10] Maximum number of SSR rounds.\n * @param {number} [options.ssrTimeout=1000] SSR timeout in milliseconds,\n * defaults to 1 second.\n * @return {Promise<{ expressServer: object, httpServer: object }>} Resolves to\n * an object with created Express and HTTP servers.\n */\nexport default async function launchServer(webpackConfig: Configuration, options: OptionsT) {\n /* Options normalization. */\n const ops = options ? cloneDeep(options) : {};\n ops.port = normalizePort(ops.port || process.env.PORT || 3000);\n defaults(ops, { httpsRedirect: true });\n\n // TODO: Need a separate type for normalized options, which guarantees\n // the logger is set!\n if (ops.logger === undefined) {\n ops.logger = newDefaultLogger({\n defaultLogLevel: ops.defaultLoggerLogLevel,\n });\n }\n\n /* Creates servers, resolves and sets the port. */\n const expressServer = await serverFactory(webpackConfig, ops);\n\n let httpServer: http.Server;\n if (ops.https) {\n httpServer = https.createServer({\n cert: ops.https.cert,\n key: ops.https.key,\n }, expressServer);\n } else httpServer = http.createServer(expressServer);\n\n /* Sets error handler for HTTP(S) server. */\n httpServer.on('error', (error: Error) => {\n if ((error as any).syscall !== 'listen') throw error;\n const bind = isString(ops.port) ? `Pipe ${ops.port}` : `Port ${ops.port}`;\n\n /* Human-readable message for some specific listen errors. */\n switch ((error as any).code) {\n case 'EACCES':\n ops.logger!.error(`${bind} requires elevated privileges`);\n return process.exit(1);\n case 'EADDRINUSE':\n ops.logger!.error(`${bind} is already in use`);\n return process.exit(1);\n default:\n throw error;\n }\n });\n\n /* Listening event handler for HTTP(S) server. */\n httpServer.on('listening', () => {\n const addr = httpServer.address()!;\n const bind = isString(addr) ? `pipe ${addr}` : `port ${addr.port}`;\n ops.logger!.info(`Server listening on ${bind} in ${\n process.env.NODE_ENV} mode`);\n });\n\n httpServer.listen(ops.port);\n\n return {\n expressServer,\n httpServer,\n };\n}\n\nlaunchServer.SCRIPT_LOCATIONS = SCRIPT_LOCATIONS;\n"],"mappings":"mZAAAA,OAAA,gCAEA,IAAAC,KAAA,CAAAC,sBAAA,CAAAF,OAAA,UACA,IAAAG,MAAA,CAAAD,sBAAA,CAAAF,OAAA,WAEA,IAAAI,OAAA,CAAAJ,OAAA,WAUAA,OAAA,iBAEAA,OAAA,YAEA,IAAAK,OAAA,CAAAC,uBAAA,CAAAN,OAAA,cACA,IAAAO,SAAA,CAAAP,OAAA,eAMA,IAAAQ,MAAA,CAAAR,OAAA,YAAiC,SAAAS,yBAAAC,CAAA,wBAAAC,OAAA,iBAAAC,CAAA,KAAAD,OAAA,CAAAE,CAAA,KAAAF,OAAA,QAAAF,wBAAA,SAAAA,CAAAC,CAAA,SAAAA,CAAA,CAAAG,CAAA,CAAAD,CAAA,GAAAF,CAAA,WAAAJ,wBAAAI,CAAA,CAAAE,CAAA,MAAAA,CAAA,EAAAF,CAAA,EAAAA,CAAA,CAAAI,UAAA,QAAAJ,CAAA,WAAAA,CAAA,mBAAAA,CAAA,qBAAAA,CAAA,QAAAK,OAAA,CAAAL,CAAA,MAAAG,CAAA,CAAAJ,wBAAA,CAAAG,CAAA,KAAAC,CAAA,EAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,SAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,MAAAQ,CAAA,EAAAC,SAAA,OAAAC,CAAA,CAAAC,MAAA,CAAAC,cAAA,EAAAD,MAAA,CAAAE,wBAAA,SAAAC,CAAA,IAAAd,CAAA,gBAAAc,CAAA,EAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAjB,CAAA,CAAAc,CAAA,OAAAI,CAAA,CAAAR,CAAA,CAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,CAAAc,CAAA,OAAAI,CAAA,GAAAA,CAAA,CAAAX,GAAA,EAAAW,CAAA,CAAAC,GAAA,EAAAR,MAAA,CAAAC,cAAA,CAAAJ,CAAA,CAAAM,CAAA,CAAAI,CAAA,EAAAV,CAAA,CAAAM,CAAA,EAAAd,CAAA,CAAAc,CAAA,SAAAN,CAAA,CAAAH,OAAA,CAAAL,CAAA,CAAAG,CAAA,EAAAA,CAAA,CAAAgB,GAAA,CAAAnB,CAAA,CAAAQ,CAAA,EAAAA,CAAA,CAZjC,oCAcA;AACA;AACA;AACA;AACA;AACA,GACA,QAAS,CAAAY,aAAaA,CAACC,KAAsB,CAAE,CAC7C,KAAM,CAAAC,IAAI,CAAG,GAAAC,gBAAQ,EAACF,KAAK,CAAC,CAC5B,GAAI,GAAAG,gBAAQ,EAACF,IAAI,CAAC,CAAE,MAAO,CAAAA,IAAI,CAAE,iBACjC,GAAI,CAAC,GAAAG,gBAAQ,EAACH,IAAI,CAAC,CAAE,MAAO,CAAAD,KAAK,CAAE,gBACnC,MAAO,MACT,CAYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GACe,cAAe,CAAAK,YAAYA,CAACC,aAA4B,CAAEC,OAAiB,CAAE,CAC1F,4BACA,KAAM,CAAAC,GAAG,CAAGD,OAAO,CAAG,GAAAE,iBAAS,EAACF,OAAO,CAAC,CAAG,CAAC,CAAC,CAC7CC,GAAG,CAACP,IAAI,CAAGF,aAAa,CAACS,GAAG,CAACP,IAAI,EAAIS,OAAO,CAACC,GAAG,CAACC,IAAI,EAAI,IAAI,CAAC,CAC9D,GAAAC,gBAAQ,EAACL,GAAG,CAAE,CAAEM,aAAa,CAAE,IAAK,CAAC,CAAC,CAEtC;AACA;AACA,GAAIN,GAAG,CAACO,MAAM,GAAKC,SAAS,CAAE,CAC5BR,GAAG,CAACO,MAAM,CAAG,GAAAE,0BAAgB,EAAC,CAC5BC,eAAe,CAAEV,GAAG,CAACW,qBACvB,CAAC,CACH,CAEA,kDACA,KAAM,CAAAC,aAAa,CAAG,KAAM,GAAAC,eAAa,EAACf,aAAa,CAAEE,GAAG,CAAC,CAE7D,GAAI,CAAAc,UAAuB,CAC3B,GAAId,GAAG,CAACe,KAAK,CAAE,CACbD,UAAU,CAAGC,cAAK,CAACC,YAAY,CAAC,CAC9BC,IAAI,CAAEjB,GAAG,CAACe,KAAK,CAACE,IAAI,CACpBC,GAAG,CAAElB,GAAG,CAACe,KAAK,CAACG,GACjB,CAAC,CAAEN,aAAa,CAClB,CAAC,IAAM,CAAAE,UAAU,CAAGK,aAAI,CAACH,YAAY,CAACJ,aAAa,CAAC,CAEpD,4CACAE,UAAU,CAACM,EAAE,CAAC,OAAO,CAAGC,KAAY,EAAK,CACvC,GAAKA,KAAK,CAASC,OAAO,GAAK,QAAQ,CAAE,KAAM,CAAAD,KAAK,CACpD,KAAM,CAAAE,IAAI,CAAG,GAAAC,gBAAQ,EAACxB,GAAG,CAACP,IAAI,CAAC,CAAI,QAAOO,GAAG,CAACP,IAAK,EAAC,CAAI,QAAOO,GAAG,CAACP,IAAK,EAAC,CAEzE,6DACA,OAAS4B,KAAK,CAASI,IAAI,EACzB,IAAK,QAAQ,CACXzB,GAAG,CAACO,MAAM,CAAEc,KAAK,CAAE,GAAEE,IAAK,+BAA8B,CAAC,CACzD,MAAO,CAAArB,OAAO,CAACwB,IAAI,CAAC,CAAC,CAAC,CACxB,IAAK,YAAY,CACf1B,GAAG,CAACO,MAAM,CAAEc,KAAK,CAAE,GAAEE,IAAK,oBAAmB,CAAC,CAC9C,MAAO,CAAArB,OAAO,CAACwB,IAAI,CAAC,CAAC,CAAC,CACxB,QACE,KAAM,CAAAL,KACV,CACF,CAAC,CAAC,CAEF,iDACAP,UAAU,CAACM,EAAE,CAAC,WAAW,CAAE,IAAM,CAC/B,KAAM,CAAAO,IAAI,CAAGb,UAAU,CAACc,OAAO,CAAC,CAAE,CAClC,KAAM,CAAAL,IAAI,CAAG,GAAAC,gBAAQ,EAACG,IAAI,CAAC,CAAI,QAAOA,IAAK,EAAC,CAAI,QAAOA,IAAI,CAAClC,IAAK,EAAC,CAClEO,GAAG,CAACO,MAAM,CAAEsB,IAAI,CAAE,uBAAsBN,IAAK,OAC3CrB,OAAO,CAACC,GAAG,CAAC2B,QAAS,OAAM,CAC/B,CAAC,CAAC,CAEFhB,UAAU,CAACiB,MAAM,CAAC/B,GAAG,CAACP,IAAI,CAAC,CAE3B,MAAO,CACLmB,aAAa,CACbE,UACF,CACF,CAEAjB,YAAY,CAACmC,gBAAgB,CAAGA,0BAAgB","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["require","_http","_interopRequireDefault","_https","_lodash","_server","_interopRequireWildcard","_renderer","_utils","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","normalizePort","value","port","toNumber","isFinite","isNumber","launchServer","webpackConfig","options","ops","cloneDeep","process","env","PORT","defaults","httpsRedirect","logger","undefined","newDefaultLogger","defaultLogLevel","defaultLoggerLogLevel","expressServer","serverFactory","httpServer","https","createServer","cert","key","http","on","error","syscall","bind","isString","code","exit","addr","address","info","NODE_ENV","listen","SCRIPT_LOCATIONS"],"sources":["../../../src/server/index.ts"],"sourcesContent":["import 'source-map-support/register';\n\nimport http from 'http';\nimport https from 'https';\n\nimport {\n cloneDeep,\n defaults,\n isFinite,\n isNumber,\n isString,\n toNumber,\n} from 'lodash';\n\n/* Polyfill required by ReactJS. */\nimport 'raf/polyfill';\n\nimport { type Configuration } from 'webpack';\n\nimport serverFactory, { type OptionsT as ServerOptionsT } from './server';\nimport { SCRIPT_LOCATIONS, newDefaultLogger } from './renderer';\n\nexport {\n getDefaultCspSettings,\n} from './server';\n\nexport { errors } from './utils';\n\n/**\n * Normalizes a port into a number, string, or false.\n * TODO: Drop this function?\n * @param value Port name or number.\n * @return Port number (Number), name (String), or false.\n */\nfunction normalizePort(value: number | string) {\n const port = toNumber(value);\n if (isFinite(port)) return port; /* port number */\n if (!isNumber(port)) return value; /* named pipe */\n return false;\n}\n\ntype OptionsT = ServerOptionsT & {\n https?: {\n cert: string;\n key: string;\n },\n\n // TODO: Should we limit it to number | string, and throw if it is different value?\n port?: false | number | string;\n};\n\n/**\n * Creates and launches web-server for ReactJS application. Allows zero\n * or detailed configuration, supports server-side rendering,\n * and development tools, including Hot Module Reloading (HMR).\n *\n * NOTE: Many of options defined below are passed down to the server and\n * renderer factories, and their declared default values are set in those\n * factories, rather than here.\n *\n * @param {object} webpackConfig Webpack configuration used to build\n * the frontend bundle. In production mode the server will read out of it\n * `context`, `publicPath`, and a few other parameters, necessary to locate\n * and serve the app bundle. In development mode the server will use entire\n * provided config to build the app bundle in memory, and further watch and\n * update it via HMR.\n * @param {object} [options] Additional parameters.\n * @param {Component} [options.Application] The root ReactJS component of\n * the app to use for the server-side rendering. When not provided\n * the server-side rendering is disabled.\n * @param {function} [options.beforeExpressJsError] Asynchronous callback\n * (`(server) => Promise<boolean>`) to be executed just before the default error\n * handler is added to ExpressJS server. If the callback is provided and its\n * result resolves to a truthy value, `react-utils` won't attach the default\n * error handler.\n * @param {function} [options.beforeExpressJsSetup] Asynchronous callback\n * (`(server) => Promise) to be executed right after ExpressJS server creation,\n * before any configuration is performed.\n * @param {BeforeRenderHook} [options.beforeRender] The hook to run just before\n * the server-side rendering. For each incoming request, it will be executed\n * just before the HTML markup is generated at the server. It allows to load\n * and provide the data necessary for server-side rendering, and also to inject\n * additional configuration and scripts into the generated HTML code.\n * @param {boolean} [options.noCsp] Set `true` to disable\n * Content-Security-Policy (CSP) headers altogether.\n * @param {function} [options.cspSettingsHook] A hook allowing\n * to customize [CSP](https://developer.mozilla.org/en-US/docs/Web/HTTP/CSP)\n * settings for [helmet](https://github.com/helmetjs/helmet)'s\n * `contentSecurityPolicy` middleware on per-request basis.\n *\n * If provided it should be a with signature: \\\n * `(defaultSettings: object, req: object)` ⇒ `object` \\\n * which gets the default settings (also used without the hook),\n * and the incoming request object. The hook response will be passed\n * as options to the helmet `contentSecurityPolicy` middleware.\n *\n * Currently, the default settings is the following object in production\n * environment:\n * ```js\n * {\n * directives: {\n * defaultSrc: [\"'self'\"],\n * baseUri: [\"'self'\"],\n * blockAllMixedContent: [],\n * fontSrc: [\"'self'\", 'https:', 'data:'],\n * frameAncestors: [\"'self'\"],\n * frameSrc: [\"'self'\", 'https://*.youtube.com'],\n * imgSrc: [\"'self'\", 'data:'],\n * objectSrc: [\"'none'\"],\n * scriptSrc: [\"'self'\", \"'unsafe-eval'\", `'nonce-UNIQUE_NONCE_VALUE'`],\n * scriptSrcAttr: [\"'none'\"],\n * styleSrc: [\"'self'\", 'https:', \"'unsafe-inline'\"],\n * upgradeInsecureRequests: [] // Removed in dev mode.\n * }\n * }\n * ```\n * It matches the default value used by Helmet with a few updates:\n * - YouTube host is whitelisted in the `frameSrc` directive to ensure\n * the {@link YouTubeVideo} component works.\n * - An unique per-request nonce is added to `scriptSrc` directive to\n * whitelist auxiliary scripts injected by react-utils. The actual nonce\n * value can be fetched by host code via `.nonce` field of `req` argument\n * of `.beforeRender` hook.\n * - `upgradeInsecureRequests` directive is removed in development mode,\n * to simplify local testing with http requests.\n * @param {string} [options.defaultLoggerLogLevel='info'] Log level for\n * the default logger, which is created if no `logger` option provided.\n * @param {boolean} [options.devMode] Pass in `true` to start the server in\n * development mode.\n * @param {string} [options.favicon] Path to the favicon to use by the server.\n * By default no favicon is used.\n * @param {object} [options.https] If provided, HTTPS server will be started,\n * instead of HTTP otherwise. The object should provide SSL certificate and key\n * via two string fields: `cert`, and `key`.\n * @param {string} [options.https.cert] SSL Certificate.\n * @param {string} [options.https.key] SSL key.\n * @param {boolean} [options.httpsRedirect=true] Pass in `true` to enable\n * automatic redirection of all incoming HTTP requests to HTTPS.\n *\n * To smoothly use it at `localhost` you need to run the server in HTTPS mode,\n * and also properly create and install a self-signed SSL sertificate on your\n * system. This article is helpful:\n * [How to get HTTPS working on your local development environment in 5 minutes](https://medium.freecodecamp.org/how-to-get-https-working-on-your-local-development-environment-in-5-minutes-7af615770eec)\n * @param {Logger} [options.logger] The logger to use at server side.\n * By default [`winston`](https://www.npmjs.com/package/winston) logger\n * with console transport is used. The logger you provide, or the default\n * `winston` logger otherwise, will be attached to the created ExpressJS server\n * object.\n * @param {function} [options.onExpressJsSetup] An async callback\n * (`(server) => Promise`) to be triggered when most of the server\n * configuration is completed, just before the server-side renderer,\n * and the default error handler are attached. You can use it to mount\n * custom API routes. The server-side logger can be accessed as `server.logger`.\n * @param {number|string} [options.port=3000] The port to start the server on.\n * @param {number} [options.staticCacheSize=1.e7] The maximum\n * static cache size in bytes. Defaults to ~10 MB.\n * @param {function} [options.staticCacheController] When given, it activates,\n * and controls the static caching of generated HTML markup. When this function\n * is provided, on each incoming request it is triggered with the request\n * passed in as the argument. To attempt to serve the response from the cache\n * it should return the object with the following fields:\n * - `key: string` – the cache key for the response;\n * - `maxage?: number` – the maximum age of cached result in ms.\n * If undefined - infinite age is assumed.\n * @param {number} [options.maxSsrRounds=10] Maximum number of SSR rounds.\n * @param {number} [options.ssrTimeout=1000] SSR timeout in milliseconds,\n * defaults to 1 second.\n * @return {Promise<{ expressServer: object, httpServer: object }>} Resolves to\n * an object with created Express and HTTP servers.\n */\nexport default async function launchServer(webpackConfig: Configuration, options: OptionsT) {\n /* Options normalization. */\n const ops = options ? cloneDeep(options) : {};\n ops.port = normalizePort(ops.port || process.env.PORT || 3000);\n defaults(ops, { httpsRedirect: true });\n\n // TODO: Need a separate type for normalized options, which guarantees\n // the logger is set!\n if (ops.logger === undefined) {\n ops.logger = newDefaultLogger({\n defaultLogLevel: ops.defaultLoggerLogLevel,\n });\n }\n\n /* Creates servers, resolves and sets the port. */\n const expressServer = await serverFactory(webpackConfig, ops);\n\n let httpServer: http.Server;\n if (ops.https) {\n httpServer = https.createServer({\n cert: ops.https.cert,\n key: ops.https.key,\n }, expressServer);\n } else httpServer = http.createServer(expressServer);\n\n /* Sets error handler for HTTP(S) server. */\n httpServer.on('error', (error: Error) => {\n if ((error as any).syscall !== 'listen') throw error;\n const bind = isString(ops.port) ? `Pipe ${ops.port}` : `Port ${ops.port}`;\n\n /* Human-readable message for some specific listen errors. */\n switch ((error as any).code) {\n case 'EACCES':\n ops.logger!.error(`${bind} requires elevated privileges`);\n return process.exit(1);\n case 'EADDRINUSE':\n ops.logger!.error(`${bind} is already in use`);\n return process.exit(1);\n default:\n throw error;\n }\n });\n\n /* Listening event handler for HTTP(S) server. */\n httpServer.on('listening', () => {\n const addr = httpServer.address()!;\n const bind = isString(addr) ? `pipe ${addr}` : `port ${addr.port}`;\n ops.logger!.info(`Server listening on ${bind} in ${\n process.env.NODE_ENV} mode`);\n });\n\n httpServer.listen(ops.port);\n\n return {\n expressServer,\n httpServer,\n };\n}\n\nlaunchServer.SCRIPT_LOCATIONS = SCRIPT_LOCATIONS;\n"],"mappings":"mZAAAA,OAAA,gCAEA,IAAAC,KAAA,CAAAC,sBAAA,CAAAF,OAAA,UACA,IAAAG,MAAA,CAAAD,sBAAA,CAAAF,OAAA,WAEA,IAAAI,OAAA,CAAAJ,OAAA,WAUAA,OAAA,iBAEAA,OAAA,YAEA,IAAAK,OAAA,CAAAC,uBAAA,CAAAN,OAAA,cACA,IAAAO,SAAA,CAAAP,OAAA,eAMA,IAAAQ,MAAA,CAAAR,OAAA,YAAiC,SAAAS,yBAAAC,CAAA,wBAAAC,OAAA,iBAAAC,CAAA,KAAAD,OAAA,CAAAE,CAAA,KAAAF,OAAA,QAAAF,wBAAA,SAAAA,CAAAC,CAAA,SAAAA,CAAA,CAAAG,CAAA,CAAAD,CAAA,GAAAF,CAAA,WAAAJ,wBAAAI,CAAA,CAAAE,CAAA,MAAAA,CAAA,EAAAF,CAAA,EAAAA,CAAA,CAAAI,UAAA,QAAAJ,CAAA,WAAAA,CAAA,mBAAAA,CAAA,qBAAAA,CAAA,QAAAK,OAAA,CAAAL,CAAA,MAAAG,CAAA,CAAAJ,wBAAA,CAAAG,CAAA,KAAAC,CAAA,EAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,SAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,MAAAQ,CAAA,EAAAC,SAAA,OAAAC,CAAA,CAAAC,MAAA,CAAAC,cAAA,EAAAD,MAAA,CAAAE,wBAAA,SAAAC,CAAA,IAAAd,CAAA,gBAAAc,CAAA,KAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,CAAAc,CAAA,OAAAG,CAAA,CAAAP,CAAA,CAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,CAAAc,CAAA,OAAAG,CAAA,GAAAA,CAAA,CAAAV,GAAA,EAAAU,CAAA,CAAAC,GAAA,EAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,CAAAM,CAAA,CAAAG,CAAA,EAAAT,CAAA,CAAAM,CAAA,EAAAd,CAAA,CAAAc,CAAA,SAAAN,CAAA,CAAAH,OAAA,CAAAL,CAAA,CAAAG,CAAA,EAAAA,CAAA,CAAAe,GAAA,CAAAlB,CAAA,CAAAQ,CAAA,EAAAA,CAAA,CAZjC,oCAcA;AACA;AACA;AACA;AACA;AACA,GACA,QAAS,CAAAW,aAAaA,CAACC,KAAsB,CAAE,CAC7C,KAAM,CAAAC,IAAI,CAAG,GAAAC,gBAAQ,EAACF,KAAK,CAAC,CAC5B,GAAI,GAAAG,gBAAQ,EAACF,IAAI,CAAC,CAAE,MAAO,CAAAA,IAAI,CAAE,iBACjC,GAAI,CAAC,GAAAG,gBAAQ,EAACH,IAAI,CAAC,CAAE,MAAO,CAAAD,KAAK,CAAE,gBACnC,MAAO,MACT,CAYA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,GACe,cAAe,CAAAK,YAAYA,CAACC,aAA4B,CAAEC,OAAiB,CAAE,CAC1F,4BACA,KAAM,CAAAC,GAAG,CAAGD,OAAO,CAAG,GAAAE,iBAAS,EAACF,OAAO,CAAC,CAAG,CAAC,CAAC,CAC7CC,GAAG,CAACP,IAAI,CAAGF,aAAa,CAACS,GAAG,CAACP,IAAI,EAAIS,OAAO,CAACC,GAAG,CAACC,IAAI,EAAI,IAAI,CAAC,CAC9D,GAAAC,gBAAQ,EAACL,GAAG,CAAE,CAAEM,aAAa,CAAE,IAAK,CAAC,CAAC,CAEtC;AACA;AACA,GAAIN,GAAG,CAACO,MAAM,GAAKC,SAAS,CAAE,CAC5BR,GAAG,CAACO,MAAM,CAAG,GAAAE,0BAAgB,EAAC,CAC5BC,eAAe,CAAEV,GAAG,CAACW,qBACvB,CAAC,CACH,CAEA,kDACA,KAAM,CAAAC,aAAa,CAAG,KAAM,GAAAC,eAAa,EAACf,aAAa,CAAEE,GAAG,CAAC,CAE7D,GAAI,CAAAc,UAAuB,CAC3B,GAAId,GAAG,CAACe,KAAK,CAAE,CACbD,UAAU,CAAGC,cAAK,CAACC,YAAY,CAAC,CAC9BC,IAAI,CAAEjB,GAAG,CAACe,KAAK,CAACE,IAAI,CACpBC,GAAG,CAAElB,GAAG,CAACe,KAAK,CAACG,GACjB,CAAC,CAAEN,aAAa,CAClB,CAAC,IAAM,CAAAE,UAAU,CAAGK,aAAI,CAACH,YAAY,CAACJ,aAAa,CAAC,CAEpD,4CACAE,UAAU,CAACM,EAAE,CAAC,OAAO,CAAGC,KAAY,EAAK,CACvC,GAAKA,KAAK,CAASC,OAAO,GAAK,QAAQ,CAAE,KAAM,CAAAD,KAAK,CACpD,KAAM,CAAAE,IAAI,CAAG,GAAAC,gBAAQ,EAACxB,GAAG,CAACP,IAAI,CAAC,CAAI,QAAOO,GAAG,CAACP,IAAK,EAAC,CAAI,QAAOO,GAAG,CAACP,IAAK,EAAC,CAEzE,6DACA,OAAS4B,KAAK,CAASI,IAAI,EACzB,IAAK,QAAQ,CACXzB,GAAG,CAACO,MAAM,CAAEc,KAAK,CAAE,GAAEE,IAAK,+BAA8B,CAAC,CACzD,MAAO,CAAArB,OAAO,CAACwB,IAAI,CAAC,CAAC,CAAC,CACxB,IAAK,YAAY,CACf1B,GAAG,CAACO,MAAM,CAAEc,KAAK,CAAE,GAAEE,IAAK,oBAAmB,CAAC,CAC9C,MAAO,CAAArB,OAAO,CAACwB,IAAI,CAAC,CAAC,CAAC,CACxB,QACE,KAAM,CAAAL,KACV,CACF,CAAC,CAAC,CAEF,iDACAP,UAAU,CAACM,EAAE,CAAC,WAAW,CAAE,IAAM,CAC/B,KAAM,CAAAO,IAAI,CAAGb,UAAU,CAACc,OAAO,CAAC,CAAE,CAClC,KAAM,CAAAL,IAAI,CAAG,GAAAC,gBAAQ,EAACG,IAAI,CAAC,CAAI,QAAOA,IAAK,EAAC,CAAI,QAAOA,IAAI,CAAClC,IAAK,EAAC,CAClEO,GAAG,CAACO,MAAM,CAAEsB,IAAI,CAAE,uBAAsBN,IAAK,OAC3CrB,OAAO,CAACC,GAAG,CAAC2B,QAAS,OAAM,CAC/B,CAAC,CAAC,CAEFhB,UAAU,CAACiB,MAAM,CAAC/B,GAAG,CAACP,IAAI,CAAC,CAE3B,MAAO,CACLmB,aAAa,CACbE,UACF,CACF,CAEAjB,YAAY,CAACmC,gBAAgB,CAAGA,0BAAgB","ignoreList":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.errors=void 0;var _errors=_interopRequireWildcard(require("./errors"));exports.errors=_errors;function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap,t=new WeakMap;return(_getRequireWildcardCache=function(e){return e?t:r})(e)}function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&
|
|
1
|
+
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.errors=void 0;var _errors=_interopRequireWildcard(require("./errors"));exports.errors=_errors;function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap,t=new WeakMap;return(_getRequireWildcardCache=function(e){return e?t:r})(e)}function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&{}.hasOwnProperty.call(e,u)){var i=a?Object.getOwnPropertyDescriptor(e,u):null;i&&(i.get||i.set)?Object.defineProperty(n,u,i):n[u]=e[u]}return n.default=e,t&&t.set(e,n),n}
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -8,6 +8,7 @@
|
|
|
8
8
|
* clicks outside the modal, or presses Escape. It is expected to hide the
|
|
9
9
|
* modal.
|
|
10
10
|
* @param {ModalTheme} [props.theme] _Ad hoc_ theme.
|
|
11
|
-
*/const BaseModal=({children,containerStyle,dontDisableScrolling,onCancel,theme})=>{const containerRef=(0,_react.useRef)(null);const overlayRef=(0,_react.useRef)(null);const[portal,setPortal]=(0,_react.useState)();(0,_react.useEffect)(()=>{const p=document.createElement("div");document.body.appendChild(p);setPortal(p);return()=>{document.body.removeChild(p)}},[]);//
|
|
12
|
-
(0,_react.useEffect)(()=>{if(
|
|
11
|
+
*/const BaseModal=({cancelOnScrolling,children,containerStyle,dontDisableScrolling,onCancel,theme})=>{const containerRef=(0,_react.useRef)(null);const overlayRef=(0,_react.useRef)(null);const[portal,setPortal]=(0,_react.useState)();(0,_react.useEffect)(()=>{const p=document.createElement("div");document.body.appendChild(p);setPortal(p);return()=>{document.body.removeChild(p)}},[]);// Sets up modal cancellation of scrolling, if opted-in.
|
|
12
|
+
(0,_react.useEffect)(()=>{if(cancelOnScrolling&&onCancel){window.addEventListener("scroll",onCancel);window.addEventListener("wheel",onCancel)}return()=>{if(cancelOnScrolling&&onCancel){window.removeEventListener("scroll",onCancel);window.removeEventListener("wheel",onCancel)}}},[cancelOnScrolling,onCancel]);// Disables window scrolling, if it is not opted-out.
|
|
13
|
+
(0,_react.useEffect)(()=>{if(!dontDisableScrolling){document.body.classList.add(S.scrollingDisabledByModal)}return()=>{if(!dontDisableScrolling){document.body.classList.remove(S.scrollingDisabledByModal)}}},[dontDisableScrolling]);const focusLast=(0,_react.useMemo)(()=>/*#__PURE__*/(0,_jsxRuntime.jsx)("div",{onFocus:()=>{const elems=containerRef.current?.querySelectorAll("*");for(let i=elems.length-1;i>=0;--i){elems[i].focus();if(document.activeElement===elems[i])return}overlayRef.current?.focus()}/* eslint-disable jsx-a11y/no-noninteractive-tabindex */,tabIndex:0/* eslint-enable jsx-a11y/no-noninteractive-tabindex */}),[]);return portal?/*#__PURE__*/_reactDom.default.createPortal(/*#__PURE__*/(0,_jsxRuntime.jsxs)(_jsxRuntime.Fragment,{children:[focusLast,/*#__PURE__*/(0,_jsxRuntime.jsx)("div",{"aria-label":"Cancel",className:theme.overlay,onClick:()=>onCancel&&onCancel(),onKeyDown:e=>{if(e.key==="Escape"&&onCancel)onCancel()},ref:node=>{if(node&&node!==overlayRef.current){overlayRef.current=node;node.focus()}},role:"button",tabIndex:0}),/*#__PURE__*/(0,_jsxRuntime.jsx)("div",{"aria-modal":"true",className:theme.container,onWheel:event=>event.stopPropagation(),ref:containerRef,role:"dialog",style:containerStyle,children:children}),/*#__PURE__*/(0,_jsxRuntime.jsx)("div",{onFocus:()=>{overlayRef.current?.focus()}/* eslint-disable jsx-a11y/no-noninteractive-tabindex */,tabIndex:0/* eslint-enable jsx-a11y/no-noninteractive-tabindex */}),focusLast]}),portal):null};exports.BaseModal=BaseModal;const ThemedModal=(0,_reactThemes.default)(BaseModal,"Modal",validThemeKeys,baseTheme);BaseModal.propTypes={cancelOnScrolling:_propTypes.default.bool,children:_propTypes.default.node,containerStyle:_propTypes.default.shape({}),dontDisableScrolling:_propTypes.default.bool,onCancel:_propTypes.default.func,theme:ThemedModal.themeType.isRequired};BaseModal.defaultProps={cancelOnScrolling:false,children:null,containerStyle:undefined,dontDisableScrolling:false,onCancel:_lodash.noop};var _default=exports.default=ThemedModal;/* Non-themed version of the Modal. */
|
|
13
14
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_lodash","require","_react","_reactDom","_interopRequireDefault","_propTypes","_reactThemes","_jsxRuntime","baseTheme","S","validThemeKeys","BaseModal","children","containerStyle","dontDisableScrolling","onCancel","theme","containerRef","useRef","overlayRef","portal","setPortal","useState","useEffect","p","document","createElement","body","appendChild","removeChild","classList","add","scrollingDisabledByModal","remove","focusLast","useMemo","jsx","onFocus","elems","current","querySelectorAll","i","length","focus","activeElement","tabIndex","ReactDom","createPortal","jsxs","Fragment","className","overlay","onClick","onKeyDown","e","key","ref","node","role","container","onWheel","event","stopPropagation","style","exports","ThemedModal","themed","propTypes","PT","
|
|
1
|
+
{"version":3,"file":"index.js","names":["_lodash","require","_react","_reactDom","_interopRequireDefault","_propTypes","_reactThemes","_jsxRuntime","baseTheme","S","validThemeKeys","BaseModal","cancelOnScrolling","children","containerStyle","dontDisableScrolling","onCancel","theme","containerRef","useRef","overlayRef","portal","setPortal","useState","useEffect","p","document","createElement","body","appendChild","removeChild","window","addEventListener","removeEventListener","classList","add","scrollingDisabledByModal","remove","focusLast","useMemo","jsx","onFocus","elems","current","querySelectorAll","i","length","focus","activeElement","tabIndex","ReactDom","createPortal","jsxs","Fragment","className","overlay","onClick","onKeyDown","e","key","ref","node","role","container","onWheel","event","stopPropagation","style","exports","ThemedModal","themed","propTypes","PT","bool","shape","func","themeType","isRequired","defaultProps","undefined","noop","_default","default"],"sources":["../../../../../src/shared/components/Modal/index.tsx"],"sourcesContent":["/* global document */\n\nimport { noop } from 'lodash';\n\nimport {\n type ReactNode,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\n\nimport ReactDom from 'react-dom';\nimport PT from 'prop-types';\nimport themed, { type Theme } from '@dr.pogodin/react-themes';\n\nimport baseTheme from './base-theme.scss';\nimport S from './styles.scss';\n\nconst validThemeKeys = ['container', 'overlay'] as const;\n\ntype PropsT = {\n cancelOnScrolling?: boolean;\n children?: ReactNode;\n containerStyle?: React.CSSProperties;\n dontDisableScrolling?: boolean;\n onCancel?: () => void;\n theme: Theme<typeof validThemeKeys>;\n};\n\n/**\n * The `<Modal>` component implements a simple themeable modal window, wrapped\n * into the default theme. `<BaseModal>` exposes the base non-themed component.\n * **Children:** Component children are rendered as the modal content.\n * @param {object} props Component properties. Beside props documented below,\n * [Other theming properties](https://www.npmjs.com/package/@dr.pogodin/react-themes#themed-component-properties) are supported as well.\n * @param {function} [props.onCancel] The callback to trigger when user\n * clicks outside the modal, or presses Escape. It is expected to hide the\n * modal.\n * @param {ModalTheme} [props.theme] _Ad hoc_ theme.\n */\nconst BaseModal: React.FunctionComponent<PropsT> = ({\n cancelOnScrolling,\n children,\n containerStyle,\n dontDisableScrolling,\n onCancel,\n theme,\n}) => {\n const containerRef = useRef<HTMLDivElement | null>(null);\n const overlayRef = useRef<HTMLDivElement | null>(null);\n const [portal, setPortal] = useState<HTMLDivElement>();\n\n useEffect(() => {\n const p = document.createElement('div');\n document.body.appendChild(p);\n setPortal(p);\n return () => {\n document.body.removeChild(p);\n };\n }, []);\n\n // Sets up modal cancellation of scrolling, if opted-in.\n useEffect(() => {\n if (cancelOnScrolling && onCancel) {\n window.addEventListener('scroll', onCancel);\n window.addEventListener('wheel', onCancel);\n }\n return () => {\n if (cancelOnScrolling && onCancel) {\n window.removeEventListener('scroll', onCancel);\n window.removeEventListener('wheel', onCancel);\n }\n };\n }, [cancelOnScrolling, onCancel]);\n\n // Disables window scrolling, if it is not opted-out.\n useEffect(() => {\n if (!dontDisableScrolling) {\n document.body.classList.add(S.scrollingDisabledByModal);\n }\n return () => {\n if (!dontDisableScrolling) {\n document.body.classList.remove(S.scrollingDisabledByModal);\n }\n };\n }, [dontDisableScrolling]);\n\n const focusLast = useMemo(() => (\n <div\n onFocus={() => {\n const elems = containerRef.current?.querySelectorAll('*') as NodeListOf<HTMLElement>;\n for (let i = elems.length - 1; i >= 0; --i) {\n elems[i].focus();\n if (document.activeElement === elems[i]) return;\n }\n overlayRef.current?.focus();\n }}\n /* eslint-disable jsx-a11y/no-noninteractive-tabindex */\n tabIndex={0}\n /* eslint-enable jsx-a11y/no-noninteractive-tabindex */\n />\n ), []);\n\n return portal ? ReactDom.createPortal(\n (\n <>\n {focusLast}\n <div\n aria-label=\"Cancel\"\n className={theme.overlay}\n onClick={() => onCancel && onCancel()}\n onKeyDown={(e) => {\n if (e.key === 'Escape' && onCancel) onCancel();\n }}\n ref={(node) => {\n if (node && node !== overlayRef.current) {\n overlayRef.current = node;\n node.focus();\n }\n }}\n role=\"button\"\n tabIndex={0}\n />\n <div\n aria-modal=\"true\"\n className={theme.container}\n onWheel={(event) => event.stopPropagation()}\n ref={containerRef}\n role=\"dialog\"\n style={containerStyle}\n >\n {children}\n </div>\n <div\n onFocus={() => {\n overlayRef.current?.focus();\n }}\n /* eslint-disable jsx-a11y/no-noninteractive-tabindex */\n tabIndex={0}\n /* eslint-enable jsx-a11y/no-noninteractive-tabindex */\n />\n {focusLast}\n </>\n ),\n portal,\n ) : null;\n};\n\nconst ThemedModal = themed(\n BaseModal,\n 'Modal',\n validThemeKeys,\n baseTheme,\n);\n\nBaseModal.propTypes = {\n cancelOnScrolling: PT.bool,\n children: PT.node,\n containerStyle: PT.shape({}),\n dontDisableScrolling: PT.bool,\n onCancel: PT.func,\n theme: ThemedModal.themeType.isRequired,\n};\n\nBaseModal.defaultProps = {\n cancelOnScrolling: false,\n children: null,\n containerStyle: undefined,\n dontDisableScrolling: false,\n onCancel: noop,\n};\n\nexport default ThemedModal;\n\n/* Non-themed version of the Modal. */\nexport { BaseModal };\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _propTypes=_interopRequireDefault(require("prop-types"));var _react=require("react");var _reactThemes=_interopRequireDefault(require("@dr.pogodin/react-themes"));var _Tooltip=_interopRequireWildcard(require("./Tooltip"));var _jsxRuntime=require("react/jsx-runtime");function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap,t=new WeakMap;return(_getRequireWildcardCache=function(e){return e?t:r})(e)}function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&
|
|
1
|
+
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _propTypes=_interopRequireDefault(require("prop-types"));var _react=require("react");var _reactThemes=_interopRequireDefault(require("@dr.pogodin/react-themes"));var _Tooltip=_interopRequireWildcard(require("./Tooltip"));var _jsxRuntime=require("react/jsx-runtime");function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap,t=new WeakMap;return(_getRequireWildcardCache=function(e){return e?t:r})(e)}function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&{}.hasOwnProperty.call(e,u)){var i=a?Object.getOwnPropertyDescriptor(e,u):null;i&&(i.get||i.set)?Object.defineProperty(n,u,i):n[u]=e[u]}return n.default=e,t&&t.set(e,n),n}/* global window */const defaultTheme={"ad":"_4xT7zE","hoc":"zd-vnH","context":"GdZucr","appearance":"L4ubm-","arrow":"M9gywF","container":"f9gY8K","wrapper":"_4qDBRM"};const validThemeKeys=[..._Tooltip.validThemeKeys,"wrapper"];/**
|
|
2
2
|
* Implements a simple to use and themeable tooltip component, _e.g._
|
|
3
3
|
* ```js
|
|
4
4
|
* <WithTooltip tip="This is example tooltip.">
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_propTypes","_interopRequireDefault","require","_react","_reactThemes","_Tooltip","_interopRequireWildcard","_jsxRuntime","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","prototype","hasOwnProperty","call","i","set","defaultTheme","validThemeKeys","validTooltipThemeKeys","Wrapper","children","placement","tip","theme","current","heap","useRef","lastCursorX","lastCursorY","triggeredByTouch","timerId","undefined","tooltipRef","wrapperRef","showTooltip","setShowTooltip","useState","updatePortalPosition","cursorX","cursorY","setTimeout","wrapperRect","getBoundingClientRect","left","right","top","bottom","pointTo","window","scrollX","scrollY","useEffect","listener","addEventListener","removeEventListener","jsxs","className","wrapper","onMouseLeave","onMouseMove","clientX","clientY","onClick","clearTimeout","onTouchStart","ref","role","jsx","ThemedWrapper","themed","PLACEMENTS","propTypes","PT","node","oneOf","values","themeType","isRequired","defaultProps","ABOVE_CURSOR","_default","exports"],"sources":["../../../../../src/shared/components/WithTooltip/index.tsx"],"sourcesContent":["/* global window */\n\nimport PT from 'prop-types';\nimport {\n type ReactNode,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nimport themed, { type Theme } from '@dr.pogodin/react-themes';\n\nimport Tooltip, {\n PLACEMENTS,\n validThemeKeys as validTooltipThemeKeys,\n} from './Tooltip';\n\nimport defaultTheme from './default-theme.scss';\n\nconst validThemeKeys = [...validTooltipThemeKeys, 'wrapper'] as const;\n\ntype PropsT = {\n children?: ReactNode;\n placement?: PLACEMENTS;\n tip?: ReactNode;\n theme: Theme<typeof validThemeKeys>;\n};\n\ntype TooltipRefT = {\n pointTo: (\n x: number,\n y: number,\n placement: PLACEMENTS,\n wrapperRef: HTMLDivElement,\n ) => void;\n};\n\ntype HeapT = {\n lastCursorX: number;\n lastCursorY: number;\n triggeredByTouch: boolean;\n timerId?: NodeJS.Timeout;\n};\n\n/**\n * Implements a simple to use and themeable tooltip component, _e.g._\n * ```js\n * <WithTooltip tip=\"This is example tooltip.\">\n * <p>Hover to see the tooltip.</p>\n * </WithTooltip>\n * ```\n * **Children:** Children are rendered in the place of `<WithTooltip>`,\n * and when hovered the tooltip is shown. By default the wrapper itself is\n * `<div>` block with `display: inline-block`.\n * @param {object} props Component properties.\n * @param {React.node} props.tip – Anything React is able to render,\n * _e.g._ a tooltip text. This will be the tooltip content.\n * @param {WithTooltipTheme} props.theme _Ad hoc_ theme.\n */\nconst Wrapper: React.FunctionComponent<PropsT> = ({\n children,\n placement,\n tip,\n theme,\n}) => {\n const { current: heap } = useRef<HeapT>({\n lastCursorX: 0,\n lastCursorY: 0,\n triggeredByTouch: false,\n timerId: undefined,\n });\n const tooltipRef = useRef<TooltipRefT>();\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [showTooltip, setShowTooltip] = useState(false);\n\n const updatePortalPosition = (cursorX: number, cursorY: number) => {\n if (!showTooltip) {\n heap.lastCursorX = cursorX;\n heap.lastCursorY = cursorY;\n\n // If tooltip was triggered by a touch, we delay its opening by a bit,\n // to ensure it was not a touch-click - in the case of touch click we\n // want to do the click, rather than show the tooltip, and the delay\n // gives click handler a chance to abort the tooltip openning.\n if (heap.triggeredByTouch) {\n if (!heap.timerId) {\n heap.timerId = setTimeout(() => {\n heap.triggeredByTouch = false;\n heap.timerId = undefined;\n setShowTooltip(true);\n }, 300);\n }\n\n // Otherwise we can just open the tooltip right away.\n } else setShowTooltip(true);\n } else {\n const wrapperRect = wrapperRef.current!.getBoundingClientRect();\n if (\n cursorX < wrapperRect.left\n || cursorX > wrapperRect.right\n || cursorY < wrapperRect.top\n || cursorY > wrapperRect.bottom\n ) {\n setShowTooltip(false);\n } else if (tooltipRef.current) {\n tooltipRef.current.pointTo(\n cursorX + window.scrollX,\n cursorY + window.scrollY,\n placement!,\n wrapperRef.current!,\n );\n }\n }\n };\n\n useEffect(() => {\n if (showTooltip && tip !== null) {\n // This is necessary to ensure that even when a single mouse event\n // arrives to a tool-tipped component, the tooltip is correctly positioned\n // once opened (because similar call above does not have effect until\n // the tooltip is fully mounted, and that is delayed to future rendering\n // cycle due to the implementation).\n if (tooltipRef.current) {\n tooltipRef.current.pointTo(\n heap.lastCursorX + window.scrollX,\n heap.lastCursorY + window.scrollY,\n placement!,\n wrapperRef.current!,\n );\n }\n\n const listener = () => setShowTooltip(false);\n window.addEventListener('scroll', listener);\n return () => window.removeEventListener('scroll', listener);\n }\n return undefined;\n }, [\n heap.lastCursorX,\n heap.lastCursorY,\n placement,\n showTooltip,\n tip,\n ]);\n\n return (\n <div\n className={theme.wrapper}\n onMouseLeave={() => setShowTooltip(false)}\n onMouseMove={(e) => updatePortalPosition(e.clientX, e.clientY)}\n onClick={() => {\n if (heap.timerId) {\n clearTimeout(heap.timerId);\n heap.timerId = undefined;\n heap.triggeredByTouch = false;\n }\n }}\n onTouchStart={() => {\n heap.triggeredByTouch = true;\n }}\n ref={wrapperRef}\n role=\"presentation\"\n >\n {\n showTooltip && tip !== null ? (\n <Tooltip ref={tooltipRef} theme={theme}>{tip}</Tooltip>\n ) : null\n }\n {children}\n </div>\n );\n};\n\nconst ThemedWrapper = themed(\n Wrapper,\n 'WithTooltip',\n [\n 'appearance',\n 'arrow',\n 'container',\n 'content',\n 'wrapper',\n ],\n defaultTheme,\n);\n\ntype ExportT = typeof ThemedWrapper & {\n PLACEMENTS: typeof PLACEMENTS;\n};\n\nconst e: ExportT = ThemedWrapper as ExportT;\n\ne.PLACEMENTS = PLACEMENTS;\n\nWrapper.propTypes = {\n children: PT.node,\n placement: PT.oneOf(Object.values(PLACEMENTS)),\n theme: ThemedWrapper.themeType.isRequired,\n tip: PT.node,\n};\n\nWrapper.defaultProps = {\n children: null,\n placement: PLACEMENTS.ABOVE_CURSOR,\n tip: null,\n};\n\nexport default e;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_propTypes","_interopRequireDefault","require","_react","_reactThemes","_Tooltip","_interopRequireWildcard","_jsxRuntime","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","defaultTheme","validThemeKeys","validTooltipThemeKeys","Wrapper","children","placement","tip","theme","current","heap","useRef","lastCursorX","lastCursorY","triggeredByTouch","timerId","undefined","tooltipRef","wrapperRef","showTooltip","setShowTooltip","useState","updatePortalPosition","cursorX","cursorY","setTimeout","wrapperRect","getBoundingClientRect","left","right","top","bottom","pointTo","window","scrollX","scrollY","useEffect","listener","addEventListener","removeEventListener","jsxs","className","wrapper","onMouseLeave","onMouseMove","clientX","clientY","onClick","clearTimeout","onTouchStart","ref","role","jsx","ThemedWrapper","themed","PLACEMENTS","propTypes","PT","node","oneOf","values","themeType","isRequired","defaultProps","ABOVE_CURSOR","_default","exports"],"sources":["../../../../../src/shared/components/WithTooltip/index.tsx"],"sourcesContent":["/* global window */\n\nimport PT from 'prop-types';\nimport {\n type ReactNode,\n useEffect,\n useRef,\n useState,\n} from 'react';\n\nimport themed, { type Theme } from '@dr.pogodin/react-themes';\n\nimport Tooltip, {\n PLACEMENTS,\n validThemeKeys as validTooltipThemeKeys,\n} from './Tooltip';\n\nimport defaultTheme from './default-theme.scss';\n\nconst validThemeKeys = [...validTooltipThemeKeys, 'wrapper'] as const;\n\ntype PropsT = {\n children?: ReactNode;\n placement?: PLACEMENTS;\n tip?: ReactNode;\n theme: Theme<typeof validThemeKeys>;\n};\n\ntype TooltipRefT = {\n pointTo: (\n x: number,\n y: number,\n placement: PLACEMENTS,\n wrapperRef: HTMLDivElement,\n ) => void;\n};\n\ntype HeapT = {\n lastCursorX: number;\n lastCursorY: number;\n triggeredByTouch: boolean;\n timerId?: NodeJS.Timeout;\n};\n\n/**\n * Implements a simple to use and themeable tooltip component, _e.g._\n * ```js\n * <WithTooltip tip=\"This is example tooltip.\">\n * <p>Hover to see the tooltip.</p>\n * </WithTooltip>\n * ```\n * **Children:** Children are rendered in the place of `<WithTooltip>`,\n * and when hovered the tooltip is shown. By default the wrapper itself is\n * `<div>` block with `display: inline-block`.\n * @param {object} props Component properties.\n * @param {React.node} props.tip – Anything React is able to render,\n * _e.g._ a tooltip text. This will be the tooltip content.\n * @param {WithTooltipTheme} props.theme _Ad hoc_ theme.\n */\nconst Wrapper: React.FunctionComponent<PropsT> = ({\n children,\n placement,\n tip,\n theme,\n}) => {\n const { current: heap } = useRef<HeapT>({\n lastCursorX: 0,\n lastCursorY: 0,\n triggeredByTouch: false,\n timerId: undefined,\n });\n const tooltipRef = useRef<TooltipRefT>();\n const wrapperRef = useRef<HTMLDivElement>(null);\n const [showTooltip, setShowTooltip] = useState(false);\n\n const updatePortalPosition = (cursorX: number, cursorY: number) => {\n if (!showTooltip) {\n heap.lastCursorX = cursorX;\n heap.lastCursorY = cursorY;\n\n // If tooltip was triggered by a touch, we delay its opening by a bit,\n // to ensure it was not a touch-click - in the case of touch click we\n // want to do the click, rather than show the tooltip, and the delay\n // gives click handler a chance to abort the tooltip openning.\n if (heap.triggeredByTouch) {\n if (!heap.timerId) {\n heap.timerId = setTimeout(() => {\n heap.triggeredByTouch = false;\n heap.timerId = undefined;\n setShowTooltip(true);\n }, 300);\n }\n\n // Otherwise we can just open the tooltip right away.\n } else setShowTooltip(true);\n } else {\n const wrapperRect = wrapperRef.current!.getBoundingClientRect();\n if (\n cursorX < wrapperRect.left\n || cursorX > wrapperRect.right\n || cursorY < wrapperRect.top\n || cursorY > wrapperRect.bottom\n ) {\n setShowTooltip(false);\n } else if (tooltipRef.current) {\n tooltipRef.current.pointTo(\n cursorX + window.scrollX,\n cursorY + window.scrollY,\n placement!,\n wrapperRef.current!,\n );\n }\n }\n };\n\n useEffect(() => {\n if (showTooltip && tip !== null) {\n // This is necessary to ensure that even when a single mouse event\n // arrives to a tool-tipped component, the tooltip is correctly positioned\n // once opened (because similar call above does not have effect until\n // the tooltip is fully mounted, and that is delayed to future rendering\n // cycle due to the implementation).\n if (tooltipRef.current) {\n tooltipRef.current.pointTo(\n heap.lastCursorX + window.scrollX,\n heap.lastCursorY + window.scrollY,\n placement!,\n wrapperRef.current!,\n );\n }\n\n const listener = () => setShowTooltip(false);\n window.addEventListener('scroll', listener);\n return () => window.removeEventListener('scroll', listener);\n }\n return undefined;\n }, [\n heap.lastCursorX,\n heap.lastCursorY,\n placement,\n showTooltip,\n tip,\n ]);\n\n return (\n <div\n className={theme.wrapper}\n onMouseLeave={() => setShowTooltip(false)}\n onMouseMove={(e) => updatePortalPosition(e.clientX, e.clientY)}\n onClick={() => {\n if (heap.timerId) {\n clearTimeout(heap.timerId);\n heap.timerId = undefined;\n heap.triggeredByTouch = false;\n }\n }}\n onTouchStart={() => {\n heap.triggeredByTouch = true;\n }}\n ref={wrapperRef}\n role=\"presentation\"\n >\n {\n showTooltip && tip !== null ? (\n <Tooltip ref={tooltipRef} theme={theme}>{tip}</Tooltip>\n ) : null\n }\n {children}\n </div>\n );\n};\n\nconst ThemedWrapper = themed(\n Wrapper,\n 'WithTooltip',\n [\n 'appearance',\n 'arrow',\n 'container',\n 'content',\n 'wrapper',\n ],\n defaultTheme,\n);\n\ntype ExportT = typeof ThemedWrapper & {\n PLACEMENTS: typeof PLACEMENTS;\n};\n\nconst e: ExportT = ThemedWrapper as ExportT;\n\ne.PLACEMENTS = PLACEMENTS;\n\nWrapper.propTypes = {\n children: PT.node,\n placement: PT.oneOf(Object.values(PLACEMENTS)),\n theme: ThemedWrapper.themeType.isRequired,\n tip: PT.node,\n};\n\nWrapper.defaultProps = {\n children: null,\n placement: PLACEMENTS.ABOVE_CURSOR,\n tip: null,\n};\n\nexport default e;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});var _exportNames={Button:true,Checkbox:true,Input:true,Link:true,PageLayout:true,MetaTags:true,Modal:true,BaseModal:true,NavLink:true,Throbber:true,WithTooltip:true,YouTubeVideo:true,TextArea:true};Object.defineProperty(exports,"BaseModal",{enumerable:true,get:function(){return _Modal.BaseModal}});Object.defineProperty(exports,"Button",{enumerable:true,get:function(){return _Button.default}});Object.defineProperty(exports,"Checkbox",{enumerable:true,get:function(){return _Checkbox.default}});Object.defineProperty(exports,"Input",{enumerable:true,get:function(){return _Input.default}});Object.defineProperty(exports,"Link",{enumerable:true,get:function(){return _Link.default}});Object.defineProperty(exports,"MetaTags",{enumerable:true,get:function(){return _MetaTags.default}});Object.defineProperty(exports,"Modal",{enumerable:true,get:function(){return _Modal.default}});Object.defineProperty(exports,"NavLink",{enumerable:true,get:function(){return _NavLink.default}});Object.defineProperty(exports,"PageLayout",{enumerable:true,get:function(){return _PageLayout.default}});Object.defineProperty(exports,"TextArea",{enumerable:true,get:function(){return _TextArea.default}});Object.defineProperty(exports,"Throbber",{enumerable:true,get:function(){return _Throbber.default}});Object.defineProperty(exports,"WithTooltip",{enumerable:true,get:function(){return _WithTooltip.default}});Object.defineProperty(exports,"YouTubeVideo",{enumerable:true,get:function(){return _YouTubeVideo.default}});var _selectors=require("./selectors");Object.keys(_selectors).forEach(function(key){if(key==="default"||key==="__esModule")return;if(Object.prototype.hasOwnProperty.call(_exportNames,key))return;if(key in exports&&exports[key]===_selectors[key])return;Object.defineProperty(exports,key,{enumerable:true,get:function(){return _selectors[key]}})});var _Button=_interopRequireDefault(require("./Button"));var _Checkbox=_interopRequireDefault(require("./Checkbox"));var _Input=_interopRequireDefault(require("./Input"));var _Link=_interopRequireDefault(require("./Link"));var _PageLayout=_interopRequireDefault(require("./PageLayout"));var _MetaTags=_interopRequireDefault(require("./MetaTags"));var _Modal=_interopRequireWildcard(require("./Modal"));var _NavLink=_interopRequireDefault(require("./NavLink"));var _Throbber=_interopRequireDefault(require("./Throbber"));var _WithTooltip=_interopRequireDefault(require("./WithTooltip"));var _YouTubeVideo=_interopRequireDefault(require("./YouTubeVideo"));var _TextArea=_interopRequireDefault(require("./TextArea"));function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap,t=new WeakMap;return(_getRequireWildcardCache=function(e){return e?t:r})(e)}function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&
|
|
1
|
+
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});var _exportNames={Button:true,Checkbox:true,Input:true,Link:true,PageLayout:true,MetaTags:true,Modal:true,BaseModal:true,NavLink:true,Throbber:true,WithTooltip:true,YouTubeVideo:true,TextArea:true};Object.defineProperty(exports,"BaseModal",{enumerable:true,get:function(){return _Modal.BaseModal}});Object.defineProperty(exports,"Button",{enumerable:true,get:function(){return _Button.default}});Object.defineProperty(exports,"Checkbox",{enumerable:true,get:function(){return _Checkbox.default}});Object.defineProperty(exports,"Input",{enumerable:true,get:function(){return _Input.default}});Object.defineProperty(exports,"Link",{enumerable:true,get:function(){return _Link.default}});Object.defineProperty(exports,"MetaTags",{enumerable:true,get:function(){return _MetaTags.default}});Object.defineProperty(exports,"Modal",{enumerable:true,get:function(){return _Modal.default}});Object.defineProperty(exports,"NavLink",{enumerable:true,get:function(){return _NavLink.default}});Object.defineProperty(exports,"PageLayout",{enumerable:true,get:function(){return _PageLayout.default}});Object.defineProperty(exports,"TextArea",{enumerable:true,get:function(){return _TextArea.default}});Object.defineProperty(exports,"Throbber",{enumerable:true,get:function(){return _Throbber.default}});Object.defineProperty(exports,"WithTooltip",{enumerable:true,get:function(){return _WithTooltip.default}});Object.defineProperty(exports,"YouTubeVideo",{enumerable:true,get:function(){return _YouTubeVideo.default}});var _selectors=require("./selectors");Object.keys(_selectors).forEach(function(key){if(key==="default"||key==="__esModule")return;if(Object.prototype.hasOwnProperty.call(_exportNames,key))return;if(key in exports&&exports[key]===_selectors[key])return;Object.defineProperty(exports,key,{enumerable:true,get:function(){return _selectors[key]}})});var _Button=_interopRequireDefault(require("./Button"));var _Checkbox=_interopRequireDefault(require("./Checkbox"));var _Input=_interopRequireDefault(require("./Input"));var _Link=_interopRequireDefault(require("./Link"));var _PageLayout=_interopRequireDefault(require("./PageLayout"));var _MetaTags=_interopRequireDefault(require("./MetaTags"));var _Modal=_interopRequireWildcard(require("./Modal"));var _NavLink=_interopRequireDefault(require("./NavLink"));var _Throbber=_interopRequireDefault(require("./Throbber"));var _WithTooltip=_interopRequireDefault(require("./WithTooltip"));var _YouTubeVideo=_interopRequireDefault(require("./YouTubeVideo"));var _TextArea=_interopRequireDefault(require("./TextArea"));function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap,t=new WeakMap;return(_getRequireWildcardCache=function(e){return e?t:r})(e)}function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&{}.hasOwnProperty.call(e,u)){var i=a?Object.getOwnPropertyDescriptor(e,u):null;i&&(i.get||i.set)?Object.defineProperty(n,u,i):n[u]=e[u]}return n.default=e,t&&t.set(e,n),n}
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_selectors","require","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_Button","_interopRequireDefault","_Checkbox","_Input","_Link","_PageLayout","_MetaTags","_Modal","_interopRequireWildcard","_NavLink","_Throbber","_WithTooltip","_YouTubeVideo","_TextArea","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","n","__proto__","a","getOwnPropertyDescriptor","u","i","set"],"sources":["../../../../src/shared/components/index.ts"],"sourcesContent":["/**\n * Just an aggregation of all exported components into a single module.\n */\n\nexport * from 'components/selectors';\n\nexport { default as Button } from 'components/Button';\nexport { default as Checkbox } from 'components/Checkbox';\nexport { default as Input } from 'components/Input';\nexport { default as Link } from 'components/Link';\nexport { default as PageLayout } from 'components/PageLayout';\nexport { default as MetaTags } from 'components/MetaTags';\nexport { default as Modal, BaseModal } from 'components/Modal';\nexport { default as NavLink } from 'components/NavLink';\nexport { default as Throbber } from 'components/Throbber';\nexport { default as WithTooltip } from 'components/WithTooltip';\nexport { default as YouTubeVideo } from 'components/YouTubeVideo';\n\nexport { default as TextArea } from './TextArea';\n"],"mappings":"wnDAIA,IAAAA,UAAA,CAAAC,OAAA,gBAAAC,MAAA,CAAAC,IAAA,CAAAH,UAAA,EAAAI,OAAA,UAAAC,GAAA,KAAAA,GAAA,cAAAA,GAAA,0BAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,CAAAJ,GAAA,YAAAA,GAAA,IAAAK,OAAA,EAAAA,OAAA,CAAAL,GAAA,IAAAL,UAAA,CAAAK,GAAA,SAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,CAAAL,GAAA,EAAAO,UAAA,MAAAC,GAAA,SAAAA,CAAA,SAAAb,UAAA,CAAAK,GAAA,OAEA,IAAAS,OAAA,CAAAC,sBAAA,CAAAd,OAAA,cACA,IAAAe,SAAA,CAAAD,sBAAA,CAAAd,OAAA,gBACA,IAAAgB,MAAA,CAAAF,sBAAA,CAAAd,OAAA,aACA,IAAAiB,KAAA,CAAAH,sBAAA,CAAAd,OAAA,YACA,IAAAkB,WAAA,CAAAJ,sBAAA,CAAAd,OAAA,kBACA,IAAAmB,SAAA,CAAAL,sBAAA,CAAAd,OAAA,gBACA,IAAAoB,MAAA,CAAAC,uBAAA,CAAArB,OAAA,aACA,IAAAsB,QAAA,CAAAR,sBAAA,CAAAd,OAAA,eACA,IAAAuB,SAAA,CAAAT,sBAAA,CAAAd,OAAA,gBACA,IAAAwB,YAAA,CAAAV,sBAAA,CAAAd,OAAA,mBACA,IAAAyB,aAAA,CAAAX,sBAAA,CAAAd,OAAA,oBAEA,IAAA0B,SAAA,CAAAZ,sBAAA,CAAAd,OAAA,gBAAiD,SAAA2B,yBAAAC,CAAA,wBAAAC,OAAA,iBAAAC,CAAA,KAAAD,OAAA,CAAAE,CAAA,KAAAF,OAAA,QAAAF,wBAAA,SAAAA,CAAAC,CAAA,SAAAA,CAAA,CAAAG,CAAA,CAAAD,CAAA,GAAAF,CAAA,WAAAP,wBAAAO,CAAA,CAAAE,CAAA,MAAAA,CAAA,EAAAF,CAAA,EAAAA,CAAA,CAAAI,UAAA,QAAAJ,CAAA,WAAAA,CAAA,mBAAAA,CAAA,qBAAAA,CAAA,QAAAK,OAAA,CAAAL,CAAA,MAAAG,CAAA,CAAAJ,wBAAA,CAAAG,CAAA,KAAAC,CAAA,EAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,SAAAG,CAAA,CAAAnB,GAAA,CAAAgB,CAAA,MAAAO,CAAA,EAAAC,SAAA,OAAAC,CAAA,CAAApC,MAAA,CAAAS,cAAA,EAAAT,MAAA,CAAAqC,wBAAA,SAAAC,CAAA,IAAAX,CAAA,gBAAAW,CAAA,
|
|
1
|
+
{"version":3,"file":"index.js","names":["_selectors","require","Object","keys","forEach","key","prototype","hasOwnProperty","call","_exportNames","exports","defineProperty","enumerable","get","_Button","_interopRequireDefault","_Checkbox","_Input","_Link","_PageLayout","_MetaTags","_Modal","_interopRequireWildcard","_NavLink","_Throbber","_WithTooltip","_YouTubeVideo","_TextArea","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","n","__proto__","a","getOwnPropertyDescriptor","u","i","set"],"sources":["../../../../src/shared/components/index.ts"],"sourcesContent":["/**\n * Just an aggregation of all exported components into a single module.\n */\n\nexport * from 'components/selectors';\n\nexport { default as Button } from 'components/Button';\nexport { default as Checkbox } from 'components/Checkbox';\nexport { default as Input } from 'components/Input';\nexport { default as Link } from 'components/Link';\nexport { default as PageLayout } from 'components/PageLayout';\nexport { default as MetaTags } from 'components/MetaTags';\nexport { default as Modal, BaseModal } from 'components/Modal';\nexport { default as NavLink } from 'components/NavLink';\nexport { default as Throbber } from 'components/Throbber';\nexport { default as WithTooltip } from 'components/WithTooltip';\nexport { default as YouTubeVideo } from 'components/YouTubeVideo';\n\nexport { default as TextArea } from './TextArea';\n"],"mappings":"wnDAIA,IAAAA,UAAA,CAAAC,OAAA,gBAAAC,MAAA,CAAAC,IAAA,CAAAH,UAAA,EAAAI,OAAA,UAAAC,GAAA,KAAAA,GAAA,cAAAA,GAAA,0BAAAH,MAAA,CAAAI,SAAA,CAAAC,cAAA,CAAAC,IAAA,CAAAC,YAAA,CAAAJ,GAAA,YAAAA,GAAA,IAAAK,OAAA,EAAAA,OAAA,CAAAL,GAAA,IAAAL,UAAA,CAAAK,GAAA,SAAAH,MAAA,CAAAS,cAAA,CAAAD,OAAA,CAAAL,GAAA,EAAAO,UAAA,MAAAC,GAAA,SAAAA,CAAA,SAAAb,UAAA,CAAAK,GAAA,OAEA,IAAAS,OAAA,CAAAC,sBAAA,CAAAd,OAAA,cACA,IAAAe,SAAA,CAAAD,sBAAA,CAAAd,OAAA,gBACA,IAAAgB,MAAA,CAAAF,sBAAA,CAAAd,OAAA,aACA,IAAAiB,KAAA,CAAAH,sBAAA,CAAAd,OAAA,YACA,IAAAkB,WAAA,CAAAJ,sBAAA,CAAAd,OAAA,kBACA,IAAAmB,SAAA,CAAAL,sBAAA,CAAAd,OAAA,gBACA,IAAAoB,MAAA,CAAAC,uBAAA,CAAArB,OAAA,aACA,IAAAsB,QAAA,CAAAR,sBAAA,CAAAd,OAAA,eACA,IAAAuB,SAAA,CAAAT,sBAAA,CAAAd,OAAA,gBACA,IAAAwB,YAAA,CAAAV,sBAAA,CAAAd,OAAA,mBACA,IAAAyB,aAAA,CAAAX,sBAAA,CAAAd,OAAA,oBAEA,IAAA0B,SAAA,CAAAZ,sBAAA,CAAAd,OAAA,gBAAiD,SAAA2B,yBAAAC,CAAA,wBAAAC,OAAA,iBAAAC,CAAA,KAAAD,OAAA,CAAAE,CAAA,KAAAF,OAAA,QAAAF,wBAAA,SAAAA,CAAAC,CAAA,SAAAA,CAAA,CAAAG,CAAA,CAAAD,CAAA,GAAAF,CAAA,WAAAP,wBAAAO,CAAA,CAAAE,CAAA,MAAAA,CAAA,EAAAF,CAAA,EAAAA,CAAA,CAAAI,UAAA,QAAAJ,CAAA,WAAAA,CAAA,mBAAAA,CAAA,qBAAAA,CAAA,QAAAK,OAAA,CAAAL,CAAA,MAAAG,CAAA,CAAAJ,wBAAA,CAAAG,CAAA,KAAAC,CAAA,EAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,SAAAG,CAAA,CAAAnB,GAAA,CAAAgB,CAAA,MAAAO,CAAA,EAAAC,SAAA,OAAAC,CAAA,CAAApC,MAAA,CAAAS,cAAA,EAAAT,MAAA,CAAAqC,wBAAA,SAAAC,CAAA,IAAAX,CAAA,gBAAAW,CAAA,KAAAjC,cAAA,CAAAC,IAAA,CAAAqB,CAAA,CAAAW,CAAA,OAAAC,CAAA,CAAAH,CAAA,CAAApC,MAAA,CAAAqC,wBAAA,CAAAV,CAAA,CAAAW,CAAA,OAAAC,CAAA,GAAAA,CAAA,CAAA5B,GAAA,EAAA4B,CAAA,CAAAC,GAAA,EAAAxC,MAAA,CAAAS,cAAA,CAAAyB,CAAA,CAAAI,CAAA,CAAAC,CAAA,EAAAL,CAAA,CAAAI,CAAA,EAAAX,CAAA,CAAAW,CAAA,SAAAJ,CAAA,CAAAF,OAAA,CAAAL,CAAA,CAAAG,CAAA,EAAAA,CAAA,CAAAU,GAAA,CAAAb,CAAA,CAAAO,CAAA,EAAAA,CAAA","ignoreList":[]}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _propTypes=_interopRequireDefault(require("prop-types"));var _react=require("react");var _Modal=require("../../../Modal");var _common=require("../../common");var _jsxRuntime=require("react/jsx-runtime");const S={"overlay":"jKsMKG"};const Options
|
|
1
|
+
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.areEqual=areEqual;exports.default=void 0;var _propTypes=_interopRequireDefault(require("prop-types"));var _react=require("react");var _Modal=require("../../../Modal");var _common=require("../../common");var _jsxRuntime=require("react/jsx-runtime");const S={"overlay":"jKsMKG"};function areEqual(a,b){return a?.left===b?.left&&a?.top===b?.top&&a?.width===b?.width}const Options=/*#__PURE__*/(0,_react.forwardRef)(({containerClass,containerStyle,filter,onCancel,onChange,optionClass,options},ref)=>{const opsRef=(0,_react.useRef)(null);(0,_react.useImperativeHandle)(ref,()=>({measure:()=>opsRef.current?.getBoundingClientRect()}),[]);const optionNodes=[];for(let i=0;i<options.length;++i){const option=options[i];if(!filter||filter(option)){const[iValue,iName]=(0,_common.optionValueName)(option);optionNodes.push(/*#__PURE__*/(0,_jsxRuntime.jsx)("div",{className:optionClass,onClick:()=>onChange(iValue),onKeyDown:e=>{if(e.key==="Enter"){onChange(iValue)}},role:"button",tabIndex:0,children:iName},iValue))}}return/*#__PURE__*/(0,_jsxRuntime.jsx)(_Modal.BaseModal// Closes the dropdown (cancels the selection) on any page scrolling attempt.
|
|
2
2
|
// This is the same native <select> elements do on scrolling, and at least for
|
|
3
3
|
// now we have no reason to deal with complications needed to support open
|
|
4
4
|
// dropdowns during the scrolling (that would need to re-position it in
|
|
5
5
|
// response to the position changes of the root dropdown element).
|
|
6
|
-
|
|
6
|
+
,{cancelOnScrolling:true,containerStyle:containerStyle,dontDisableScrolling:true,onCancel:onCancel,theme:{ad:"",hoc:"",container:containerClass,context:"",overlay:S.overlay},children:/*#__PURE__*/(0,_jsxRuntime.jsx)("div",{ref:opsRef,children:optionNodes})})});Options.propTypes={containerClass:_propTypes.default.string.isRequired,containerStyle:_propTypes.default.shape({left:_propTypes.default.number.isRequired,top:_propTypes.default.number.isRequired,width:_propTypes.default.number.isRequired}),filter:_propTypes.default.func,onCancel:_propTypes.default.func.isRequired,onChange:_propTypes.default.func.isRequired,optionClass:_propTypes.default.string.isRequired,options:_common.optionsValidator.isRequired};Options.defaultProps={containerStyle:undefined,filter:undefined};var _default=exports.default=Options;
|
|
7
7
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_propTypes","_interopRequireDefault","require","_react","_Modal","_common","_jsxRuntime","S","Options","
|
|
1
|
+
{"version":3,"file":"index.js","names":["_propTypes","_interopRequireDefault","require","_react","_Modal","_common","_jsxRuntime","S","areEqual","a","b","left","top","width","Options","forwardRef","containerClass","containerStyle","filter","onCancel","onChange","optionClass","options","ref","opsRef","useRef","useImperativeHandle","measure","current","getBoundingClientRect","optionNodes","i","length","option","iValue","iName","optionValueName","push","jsx","className","onClick","onKeyDown","e","key","role","tabIndex","children","BaseModal","cancelOnScrolling","dontDisableScrolling","theme","ad","hoc","container","context","overlay","propTypes","PT","string","isRequired","shape","number","func","optionsValidator","defaultProps","undefined","_default","exports","default"],"sources":["../../../../../../../src/shared/components/selectors/CustomDropdown/Options/index.tsx"],"sourcesContent":["import PT from 'prop-types';\nimport { forwardRef, useImperativeHandle, useRef } from 'react';\n\nimport { BaseModal } from 'components/Modal';\n\nimport S from './style.scss';\n\nimport {\n type OptionT,\n type OptionsT,\n optionsValidator,\n optionValueName,\n} from '../../common';\n\nexport type ContainerPosT = {\n left: number;\n top: number;\n width: number;\n};\n\nexport function areEqual(a?: ContainerPosT, b?: ContainerPosT): boolean {\n return a?.left === b?.left && a?.top === b?.top && a?.width === b?.width;\n}\n\nexport type RefT = {\n measure: () => DOMRect | undefined;\n};\n\ntype PropsT = {\n containerClass: string;\n containerStyle?: ContainerPosT;\n filter?: (item: OptionT<React.ReactNode> | string) => boolean;\n optionClass: string;\n options: OptionsT<React.ReactNode>;\n onCancel: () => void;\n onChange: (value: string) => void;\n};\n\nconst Options = forwardRef<RefT, PropsT>(({\n containerClass,\n containerStyle,\n filter,\n onCancel,\n onChange,\n optionClass,\n options,\n}, ref) => {\n const opsRef = useRef<HTMLDivElement>(null);\n\n useImperativeHandle(ref, () => ({\n measure: () => opsRef.current?.getBoundingClientRect(),\n }), []);\n\n const optionNodes: React.ReactNode[] = [];\n for (let i = 0; i < options.length; ++i) {\n const option = options[i];\n if (!filter || filter(option)) {\n const [iValue, iName] = optionValueName(option);\n optionNodes.push(\n <div\n className={optionClass}\n onClick={() => onChange(iValue)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') {\n onChange(iValue);\n }\n }}\n key={iValue}\n role=\"button\"\n tabIndex={0}\n >\n {iName}\n </div>,\n );\n }\n }\n\n return (\n <BaseModal\n // Closes the dropdown (cancels the selection) on any page scrolling attempt.\n // This is the same native <select> elements do on scrolling, and at least for\n // now we have no reason to deal with complications needed to support open\n // dropdowns during the scrolling (that would need to re-position it in\n // response to the position changes of the root dropdown element).\n cancelOnScrolling\n containerStyle={containerStyle}\n dontDisableScrolling\n onCancel={onCancel}\n theme={{\n ad: '',\n hoc: '',\n container: containerClass,\n context: '',\n overlay: S.overlay,\n }}\n >\n <div ref={opsRef}>{optionNodes}</div>\n </BaseModal>\n );\n});\n\nOptions.propTypes = {\n containerClass: PT.string.isRequired,\n\n containerStyle: PT.shape({\n left: PT.number.isRequired,\n top: PT.number.isRequired,\n width: PT.number.isRequired,\n }),\n\n filter: PT.func,\n onCancel: PT.func.isRequired,\n onChange: PT.func.isRequired,\n optionClass: PT.string.isRequired,\n options: optionsValidator.isRequired,\n};\n\nOptions.defaultProps = {\n containerStyle: undefined,\n filter: undefined,\n};\n\nexport default Options;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,4 +1,8 @@
|
|
|
1
|
-
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _propTypes=_interopRequireDefault(require("prop-types"));var _react=require("react");var _reactThemes=_interopRequireDefault(require("@dr.pogodin/react-themes"));var _Options=
|
|
2
|
-
//
|
|
3
|
-
|
|
1
|
+
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.default=void 0;var _propTypes=_interopRequireDefault(require("prop-types"));var _react=require("react");var _reactThemes=_interopRequireDefault(require("@dr.pogodin/react-themes"));var _Options=_interopRequireWildcard(require("./Options"));var _common=require("../common");var _jsxRuntime=require("react/jsx-runtime");function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap,t=new WeakMap;return(_getRequireWildcardCache=function(e){return e?t:r})(e)}function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&{}.hasOwnProperty.call(e,u)){var i=a?Object.getOwnPropertyDescriptor(e,u):null;i&&(i.get||i.set)?Object.defineProperty(n,u,i):n[u]=e[u]}return n.default=e,t&&t.set(e,n),n}const defaultTheme={"context":"_9Tod5r","ad":"R58zIg","hoc":"O-Tp1i","container":"oQKv0Y","label":"YUPUNs","dropdown":"pNEyAA","option":"LD2Kzy","select":"LP5azC","arrow":"-wscve","active":"k2UDsV","upward":"HWRvu4"};const BaseCustomDropdown=({filter,label,onChange,options,theme,value})=>{if(!options)throw Error("Internal error");const[active,setActive]=(0,_react.useState)(false);const dropdownRef=(0,_react.useRef)(null);const opsRef=(0,_react.useRef)(null);const[opsPos,setOpsPos]=(0,_react.useState)();const[upward,setUpward]=(0,_react.useState)(false);(0,_react.useEffect)(()=>{if(!active)return undefined;let id;const cb=()=>{const anchor=dropdownRef.current?.getBoundingClientRect();const opsRect=opsRef.current?.measure();if(anchor&&opsRect){const fitsDown=anchor.bottom+opsRect.height<(window.visualViewport?.height??0);const fitsUp=anchor.top-opsRect.height>0;const up=!fitsDown&&fitsUp;setUpward(up);const pos=up?{top:anchor.top-opsRect.height-1,left:anchor.left,width:anchor.width}:{left:anchor.left,top:anchor.bottom,width:anchor.width};setOpsPos(now=>(0,_Options.areEqual)(now,pos)?now:pos)}id=requestAnimationFrame(cb)};requestAnimationFrame(cb);return()=>{cancelAnimationFrame(id)}},[active]);const openList=()=>{const view=window.visualViewport;const rect=dropdownRef.current.getBoundingClientRect();setActive(true);// NOTE: This first opens the dropdown off-screen, where it is measured
|
|
2
|
+
// by an effect declared above, and then positioned below, or above
|
|
3
|
+
// the original dropdown element, depending where it fits best
|
|
4
|
+
// (if we first open it downward, it would flick if we immediately
|
|
5
|
+
// move it above, at least with the current position update via local
|
|
6
|
+
// react state, and not imperatively).
|
|
7
|
+
setOpsPos({left:view?.width||0,top:view?.height||0,width:rect.width})};let selected=/*#__PURE__*/(0,_jsxRuntime.jsx)(_jsxRuntime.Fragment,{children:"\u200C"});for(let i=0;i<options.length;++i){const option=options[i];if(!filter||filter(option)){const[iValue,iName]=(0,_common.optionValueName)(option);if(iValue===value){selected=iName;break}}}let containerClassName=theme.container;if(active)containerClassName+=` ${theme.active}`;let opsContainerClass=theme.select||"";if(upward){containerClassName+=` ${theme.upward}`;opsContainerClass+=` ${theme.upward}`}return/*#__PURE__*/(0,_jsxRuntime.jsxs)("div",{className:containerClassName,children:[label===undefined?null:/*#__PURE__*/(0,_jsxRuntime.jsx)("div",{className:theme.label,children:label}),/*#__PURE__*/(0,_jsxRuntime.jsxs)("div",{className:theme.dropdown,onClick:openList,onKeyDown:e=>{if(e.key==="Enter")openList()},ref:dropdownRef,role:"listbox",tabIndex:0,children:[selected,/*#__PURE__*/(0,_jsxRuntime.jsx)("div",{className:theme.arrow})]}),active?/*#__PURE__*/(0,_jsxRuntime.jsx)(_Options.default,{containerClass:opsContainerClass,containerStyle:opsPos,onCancel:()=>{setActive(false)},onChange:newValue=>{setActive(false);if(onChange)onChange(newValue)},optionClass:theme.option||"",options:options,ref:opsRef}):null]})};const ThemedCustomDropdown=(0,_reactThemes.default)(BaseCustomDropdown,"CustomDropdown",_common.validThemeKeys,defaultTheme);BaseCustomDropdown.propTypes={filter:_propTypes.default.func,label:_propTypes.default.node,onChange:_propTypes.default.func,options:_propTypes.default.arrayOf(_common.optionValidator.isRequired),theme:ThemedCustomDropdown.themeType.isRequired,value:_propTypes.default.string};BaseCustomDropdown.defaultProps={filter:undefined,label:undefined,onChange:undefined,options:[],value:undefined};var _default=exports.default=ThemedCustomDropdown;
|
|
4
8
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_propTypes","_interopRequireDefault","require","_react","_reactThemes","_Options","_common","_jsxRuntime","defaultTheme","BaseCustomDropdown","filter","label","onChange","options","theme","value","Error","dropdownRef","useRef","anchor","setAnchor","useState","openList","current","getBoundingClientRect","selected","jsx","Fragment","children","i","length","option","iValue","iName","optionValueName","containerClassName","container","active","jsxs","className","undefined","dropdown","onClick","onKeyDown","e","key","ref","role","tabIndex","arrow","default","anchorRect","containerClass","select","onCancel","newValue","optionClass","ThemedCustomDropdown","themed","validThemeKeys","propTypes","PT","func","node","arrayOf","optionValidator","isRequired","themeType","string","defaultProps","_default","exports"],"sources":["../../../../../../src/shared/components/selectors/CustomDropdown/index.tsx"],"sourcesContent":["import PT from 'prop-types';\nimport { useRef, useState } from 'react';\n\nimport themed from '@dr.pogodin/react-themes';\n\nimport Options from './Options';\n\nimport defaultTheme from './theme.scss';\n\nimport {\n type PropsT,\n optionValidator,\n optionValueName,\n validThemeKeys,\n} from '../common';\n\nconst BaseCustomDropdown: React.FunctionComponent<\nPropsT<React.ReactNode, (value: string) => void>\n> = ({\n filter,\n label,\n onChange,\n options,\n theme,\n value,\n}) => {\n if (!options) throw Error('Internal error');\n\n const dropdownRef = useRef<HTMLDivElement>(null);\n\n // If \"null\" the dropdown is closed, otherwise it is displayed\n // at the specified coordinates.\n const [anchor, setAnchor] = useState<DOMRect | null>(null);\n\n const openList = () => {\n setAnchor(dropdownRef.current!.getBoundingClientRect());\n };\n\n let selected: React.ReactNode = <>‌</>;\n for (let i = 0; i < options.length; ++i) {\n const option = options[i];\n if (!filter || filter(option)) {\n const [iValue, iName] = optionValueName(option);\n if (iValue === value) {\n selected = iName;\n break;\n }\n }\n }\n\n let containerClassName = theme.container;\n if (anchor) containerClassName += ` ${theme.active}`;\n\n return (\n <div className={containerClassName}>\n {label === undefined ? null : (\n <div className={theme.label}>{label}</div>\n )}\n <div\n className={theme.dropdown}\n onClick={openList}\n onKeyDown={(e) => {\n if (e.key === 'Enter') openList();\n }}\n ref={dropdownRef}\n role=\"listbox\"\n tabIndex={0}\n >\n {selected}\n <div className={theme.arrow} />\n </div>\n {\n anchor ? (\n <Options\n anchorRect={anchor}\n containerClass={theme.select || ''}\n onCancel={() => setAnchor(null)}\n onChange={(newValue) => {\n setAnchor(null);\n if (onChange) onChange(newValue);\n }}\n optionClass={theme.option || ''}\n options={options}\n />\n ) : null\n }\n </div>\n );\n};\n\nconst ThemedCustomDropdown = themed(\n BaseCustomDropdown,\n 'CustomDropdown',\n validThemeKeys,\n defaultTheme,\n);\n\nBaseCustomDropdown.propTypes = {\n filter: PT.func,\n label: PT.node,\n onChange: PT.func,\n options: PT.arrayOf(optionValidator.isRequired),\n theme: ThemedCustomDropdown.themeType.isRequired,\n value: PT.string,\n};\n\nBaseCustomDropdown.defaultProps = {\n filter: undefined,\n label: undefined,\n onChange: undefined,\n options: [],\n value: undefined,\n};\n\nexport default ThemedCustomDropdown;\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["_propTypes","_interopRequireDefault","require","_react","_reactThemes","_Options","_interopRequireWildcard","_common","_jsxRuntime","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","defaultTheme","BaseCustomDropdown","filter","label","onChange","options","theme","value","Error","active","setActive","useState","dropdownRef","useRef","opsRef","opsPos","setOpsPos","upward","setUpward","useEffect","undefined","id","cb","anchor","current","getBoundingClientRect","opsRect","measure","fitsDown","bottom","height","window","visualViewport","fitsUp","top","up","pos","left","width","now","areEqual","requestAnimationFrame","cancelAnimationFrame","openList","view","rect","selected","jsx","Fragment","children","length","option","iValue","iName","optionValueName","containerClassName","container","opsContainerClass","select","jsxs","className","dropdown","onClick","onKeyDown","key","ref","role","tabIndex","arrow","containerClass","containerStyle","onCancel","newValue","optionClass","ThemedCustomDropdown","themed","validThemeKeys","propTypes","PT","func","node","arrayOf","optionValidator","isRequired","themeType","string","defaultProps","_default","exports"],"sources":["../../../../../../src/shared/components/selectors/CustomDropdown/index.tsx"],"sourcesContent":["import PT from 'prop-types';\nimport { useEffect, useRef, useState } from 'react';\n\nimport themed from '@dr.pogodin/react-themes';\n\nimport Options, { type ContainerPosT, type RefT, areEqual } from './Options';\n\nimport defaultTheme from './theme.scss';\n\nimport {\n type PropsT,\n optionValidator,\n optionValueName,\n validThemeKeys,\n} from '../common';\n\nconst BaseCustomDropdown: React.FunctionComponent<\nPropsT<React.ReactNode, (value: string) => void>\n> = ({\n filter,\n label,\n onChange,\n options,\n theme,\n value,\n}) => {\n if (!options) throw Error('Internal error');\n\n const [active, setActive] = useState(false);\n\n const dropdownRef = useRef<HTMLDivElement>(null);\n const opsRef = useRef<RefT>(null);\n\n const [opsPos, setOpsPos] = useState<ContainerPosT>();\n const [upward, setUpward] = useState(false);\n\n useEffect(() => {\n if (!active) return undefined;\n\n let id: number;\n const cb = () => {\n const anchor = dropdownRef.current?.getBoundingClientRect();\n const opsRect = opsRef.current?.measure();\n if (anchor && opsRect) {\n const fitsDown = anchor.bottom + opsRect.height\n < (window.visualViewport?.height ?? 0);\n const fitsUp = anchor.top - opsRect.height > 0;\n\n const up = !fitsDown && fitsUp;\n setUpward(up);\n\n const pos = up ? {\n top: anchor.top - opsRect.height - 1,\n left: anchor.left,\n width: anchor.width,\n } : {\n left: anchor.left,\n top: anchor.bottom,\n width: anchor.width,\n };\n\n setOpsPos((now) => (areEqual(now, pos) ? now : pos));\n }\n id = requestAnimationFrame(cb);\n };\n requestAnimationFrame(cb);\n\n return () => {\n cancelAnimationFrame(id);\n };\n }, [active]);\n\n const openList = () => {\n const view = window.visualViewport;\n const rect = dropdownRef.current!.getBoundingClientRect();\n setActive(true);\n\n // NOTE: This first opens the dropdown off-screen, where it is measured\n // by an effect declared above, and then positioned below, or above\n // the original dropdown element, depending where it fits best\n // (if we first open it downward, it would flick if we immediately\n // move it above, at least with the current position update via local\n // react state, and not imperatively).\n setOpsPos({\n left: view?.width || 0,\n top: view?.height || 0,\n width: rect.width,\n });\n };\n\n let selected: React.ReactNode = <>‌</>;\n for (let i = 0; i < options.length; ++i) {\n const option = options[i];\n if (!filter || filter(option)) {\n const [iValue, iName] = optionValueName(option);\n if (iValue === value) {\n selected = iName;\n break;\n }\n }\n }\n\n let containerClassName = theme.container;\n if (active) containerClassName += ` ${theme.active}`;\n\n let opsContainerClass = theme.select || '';\n if (upward) {\n containerClassName += ` ${theme.upward}`;\n opsContainerClass += ` ${theme.upward}`;\n }\n\n return (\n <div className={containerClassName}>\n {label === undefined ? null : (\n <div className={theme.label}>{label}</div>\n )}\n <div\n className={theme.dropdown}\n onClick={openList}\n onKeyDown={(e) => {\n if (e.key === 'Enter') openList();\n }}\n ref={dropdownRef}\n role=\"listbox\"\n tabIndex={0}\n >\n {selected}\n <div className={theme.arrow} />\n </div>\n {\n active ? (\n <Options\n containerClass={opsContainerClass}\n containerStyle={opsPos}\n onCancel={() => {\n setActive(false);\n }}\n onChange={(newValue) => {\n setActive(false);\n if (onChange) onChange(newValue);\n }}\n optionClass={theme.option || ''}\n options={options}\n ref={opsRef}\n />\n ) : null\n }\n </div>\n );\n};\n\nconst ThemedCustomDropdown = themed(\n BaseCustomDropdown,\n 'CustomDropdown',\n validThemeKeys,\n defaultTheme,\n);\n\nBaseCustomDropdown.propTypes = {\n filter: PT.func,\n label: PT.node,\n onChange: PT.func,\n options: PT.arrayOf(optionValidator.isRequired),\n theme: ThemedCustomDropdown.themeType.isRequired,\n value: PT.string,\n};\n\nBaseCustomDropdown.defaultProps = {\n filter: undefined,\n label: undefined,\n onChange: undefined,\n options: [],\n value: undefined,\n};\n\nexport default ThemedCustomDropdown;\n"],"mappings":"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","ignoreList":[]}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
1
|
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});exports.optionValidator=void 0;exports.optionValueName=optionValueName;exports.validThemeKeys=exports.optionsValidator=void 0;var _propTypes=_interopRequireDefault(require("prop-types"));// The stuff common between different dropdown implementations.
|
|
2
|
-
const validThemeKeys=exports.validThemeKeys=["active","arrow","container","dropdown","hiddenOption","label","option","select"
|
|
2
|
+
const validThemeKeys=exports.validThemeKeys=["active","arrow","container","dropdown","hiddenOption","label","option","select",// TODO: This is only valid for <CustomDropdown>, thus we need to re-factor it
|
|
3
|
+
// into a separate theme spec for that component.
|
|
4
|
+
"upward"];const optionValidator=exports.optionValidator=_propTypes.default.oneOfType([_propTypes.default.shape({name:_propTypes.default.string,value:_propTypes.default.string.isRequired}).isRequired,_propTypes.default.string.isRequired]);const optionsValidator=exports.optionsValidator=_propTypes.default.arrayOf(optionValidator.isRequired);/** Returns option value and name as a tuple. */function optionValueName(option){return typeof option==="string"?[option,option]:[option.value,option.name??option.value]}
|
|
3
5
|
//# sourceMappingURL=common.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"common.js","names":["_propTypes","_interopRequireDefault","require","validThemeKeys","exports","optionValidator","PT","oneOfType","shape","name","string","value","isRequired","optionsValidator","arrayOf","optionValueName","option"],"sources":["../../../../../src/shared/components/selectors/common.ts"],"sourcesContent":["// The stuff common between different dropdown implementations.\n\nimport PT from 'prop-types';\n\nimport type { Theme } from '@dr.pogodin/react-themes';\n\nexport const validThemeKeys = [\n 'active',\n 'arrow',\n 'container',\n 'dropdown',\n 'hiddenOption',\n 'label',\n 'option',\n 'select',\n] as const;\n\nexport type OptionT<NameT> = {\n name?: NameT | null;\n value: string;\n};\n\nexport type OptionsT<NameT> = Array<OptionT<NameT> | string>;\n\nexport type PropsT<\n NameT,\n OnChangeT = React.ChangeEventHandler<HTMLSelectElement>,\n> = {\n filter?: (item: OptionT<NameT> | string) => boolean;\n label?: React.ReactNode;\n onChange?: OnChangeT;\n options?: OptionsT<NameT>;\n theme: Theme<typeof validThemeKeys>;\n value?: string;\n};\n\nexport const optionValidator = PT.oneOfType([\n PT.shape({\n name: PT.string,\n value: PT.string.isRequired,\n }).isRequired,\n PT.string.isRequired,\n]);\n\nexport const optionsValidator = PT.arrayOf(optionValidator.isRequired);\n\n/** Returns option value and name as a tuple. */\nexport function optionValueName<NameT>(\n option: OptionT<NameT> | string,\n): [string, NameT | string] {\n return typeof option === 'string'\n ? [option, option]\n : [option.value, option.name ?? option.value];\n}\n"],"mappings":"uRAEA,IAAAA,UAAA,CAAAC,sBAAA,CAAAC,OAAA,gBAFA;AAMO,KAAM,CAAAC,cAAc,CAAAC,OAAA,CAAAD,cAAA,CAAG,CAC5B,QAAQ,CACR,OAAO,CACP,WAAW,CACX,UAAU,CACV,cAAc,CACd,OAAO,CACP,QAAQ,CACR,QAAQ,CACA,CAqBH,KAAM,CAAAE,eAAe,CAAAD,OAAA,CAAAC,eAAA,CAAGC,kBAAE,CAACC,SAAS,CAAC,CAC1CD,kBAAE,CAACE,KAAK,CAAC,CACPC,IAAI,CAAEH,kBAAE,CAACI,MAAM,CACfC,KAAK,CAAEL,kBAAE,CAACI,MAAM,CAACE,UACnB,CAAC,CAAC,CAACA,UAAU,CACbN,kBAAE,CAACI,MAAM,CAACE,UAAU,CACrB,CAAC,CAEK,KAAM,CAAAC,gBAAgB,CAAAT,OAAA,CAAAS,gBAAA,CAAGP,kBAAE,CAACQ,OAAO,CAACT,eAAe,CAACO,UAAU,CAAC,CAEtE,gDACO,QAAS,CAAAG,eAAeA,CAC7BC,MAA+B,CACL,CAC1B,MAAO,OAAO,CAAAA,MAAM,GAAK,QAAQ,CAC7B,CAACA,MAAM,CAAEA,MAAM,CAAC,CAChB,CAACA,MAAM,CAACL,KAAK,CAAEK,MAAM,CAACP,IAAI,EAAIO,MAAM,CAACL,KAAK,CAChD","ignoreList":[]}
|
|
1
|
+
{"version":3,"file":"common.js","names":["_propTypes","_interopRequireDefault","require","validThemeKeys","exports","optionValidator","PT","oneOfType","shape","name","string","value","isRequired","optionsValidator","arrayOf","optionValueName","option"],"sources":["../../../../../src/shared/components/selectors/common.ts"],"sourcesContent":["// The stuff common between different dropdown implementations.\n\nimport PT from 'prop-types';\n\nimport type { Theme } from '@dr.pogodin/react-themes';\n\nexport const validThemeKeys = [\n 'active',\n 'arrow',\n 'container',\n 'dropdown',\n 'hiddenOption',\n 'label',\n 'option',\n 'select',\n\n // TODO: This is only valid for <CustomDropdown>, thus we need to re-factor it\n // into a separate theme spec for that component.\n 'upward',\n] as const;\n\nexport type OptionT<NameT> = {\n name?: NameT | null;\n value: string;\n};\n\nexport type OptionsT<NameT> = Array<OptionT<NameT> | string>;\n\nexport type PropsT<\n NameT,\n OnChangeT = React.ChangeEventHandler<HTMLSelectElement>,\n> = {\n filter?: (item: OptionT<NameT> | string) => boolean;\n label?: React.ReactNode;\n onChange?: OnChangeT;\n options?: OptionsT<NameT>;\n theme: Theme<typeof validThemeKeys>;\n value?: string;\n};\n\nexport const optionValidator = PT.oneOfType([\n PT.shape({\n name: PT.string,\n value: PT.string.isRequired,\n }).isRequired,\n PT.string.isRequired,\n]);\n\nexport const optionsValidator = PT.arrayOf(optionValidator.isRequired);\n\n/** Returns option value and name as a tuple. */\nexport function optionValueName<NameT>(\n option: OptionT<NameT> | string,\n): [string, NameT | string] {\n return typeof option === 'string'\n ? [option, option]\n : [option.value, option.name ?? option.value];\n}\n"],"mappings":"uRAEA,IAAAA,UAAA,CAAAC,sBAAA,CAAAC,OAAA,gBAFA;AAMO,KAAM,CAAAC,cAAc,CAAAC,OAAA,CAAAD,cAAA,CAAG,CAC5B,QAAQ,CACR,OAAO,CACP,WAAW,CACX,UAAU,CACV,cAAc,CACd,OAAO,CACP,QAAQ,CACR,QAAQ,CAER;AACA;AACA,QAAQ,CACA,CAqBH,KAAM,CAAAE,eAAe,CAAAD,OAAA,CAAAC,eAAA,CAAGC,kBAAE,CAACC,SAAS,CAAC,CAC1CD,kBAAE,CAACE,KAAK,CAAC,CACPC,IAAI,CAAEH,kBAAE,CAACI,MAAM,CACfC,KAAK,CAAEL,kBAAE,CAACI,MAAM,CAACE,UACnB,CAAC,CAAC,CAACA,UAAU,CACbN,kBAAE,CAACI,MAAM,CAACE,UAAU,CACrB,CAAC,CAEK,KAAM,CAAAC,gBAAgB,CAAAT,OAAA,CAAAS,gBAAA,CAAGP,kBAAE,CAACQ,OAAO,CAACT,eAAe,CAACO,UAAU,CAAC,CAEtE,gDACO,QAAS,CAAAG,eAAeA,CAC7BC,MAA+B,CACL,CAC1B,MAAO,OAAO,CAAAA,MAAM,GAAK,QAAQ,CAC7B,CAACA,MAAM,CAAEA,MAAM,CAAC,CAChB,CAACA,MAAM,CAACL,KAAK,CAAEK,MAAM,CAACP,IAAI,EAAIO,MAAM,CAACL,KAAK,CAChD","ignoreList":[]}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"Barrier",{enumerable:true,get:function(){return _jsUtils.Barrier}});Object.defineProperty(exports,"Emitter",{enumerable:true,get:function(){return _jsUtils.Emitter}});exports.JU=void 0;Object.defineProperty(exports,"Semaphore",{enumerable:true,get:function(){return _jsUtils.Semaphore}});Object.defineProperty(exports,"ThemeProvider",{enumerable:true,get:function(){return _reactThemes.ThemeProvider}});Object.defineProperty(exports,"config",{enumerable:true,get:function(){return _config.default}});Object.defineProperty(exports,"getSsrContext",{enumerable:true,get:function(){return _globalState.getSsrContext}});exports.isomorphy=void 0;Object.defineProperty(exports,"splitComponent",{enumerable:true,get:function(){return _splitComponent.default}});exports.themed=void 0;Object.defineProperty(exports,"time",{enumerable:true,get:function(){return _time.default}});exports.webpack=void 0;Object.defineProperty(exports,"withRetries",{enumerable:true,get:function(){return _jsUtils.withRetries}});var _reactThemes=_interopRequireWildcard(require("@dr.pogodin/react-themes"));var _config=_interopRequireDefault(require("./config"));var isomorphy=_interopRequireWildcard(require("./isomorphy"));exports.isomorphy=isomorphy;var _time=_interopRequireDefault(require("./time"));var webpack=_interopRequireWildcard(require("./webpack"));exports.webpack=webpack;var _jsUtils=require("@dr.pogodin/js-utils");var _globalState=require("./globalState");var _splitComponent=_interopRequireDefault(require("./splitComponent"));function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap,t=new WeakMap;return(_getRequireWildcardCache=function(e){return e?t:r})(e)}function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&
|
|
1
|
+
"use strict";var _interopRequireDefault=require("@babel/runtime/helpers/interopRequireDefault");Object.defineProperty(exports,"__esModule",{value:true});Object.defineProperty(exports,"Barrier",{enumerable:true,get:function(){return _jsUtils.Barrier}});Object.defineProperty(exports,"Emitter",{enumerable:true,get:function(){return _jsUtils.Emitter}});exports.JU=void 0;Object.defineProperty(exports,"Semaphore",{enumerable:true,get:function(){return _jsUtils.Semaphore}});Object.defineProperty(exports,"ThemeProvider",{enumerable:true,get:function(){return _reactThemes.ThemeProvider}});Object.defineProperty(exports,"config",{enumerable:true,get:function(){return _config.default}});Object.defineProperty(exports,"getSsrContext",{enumerable:true,get:function(){return _globalState.getSsrContext}});exports.isomorphy=void 0;Object.defineProperty(exports,"splitComponent",{enumerable:true,get:function(){return _splitComponent.default}});exports.themed=void 0;Object.defineProperty(exports,"time",{enumerable:true,get:function(){return _time.default}});exports.webpack=void 0;Object.defineProperty(exports,"withRetries",{enumerable:true,get:function(){return _jsUtils.withRetries}});var _reactThemes=_interopRequireWildcard(require("@dr.pogodin/react-themes"));var _config=_interopRequireDefault(require("./config"));var isomorphy=_interopRequireWildcard(require("./isomorphy"));exports.isomorphy=isomorphy;var _time=_interopRequireDefault(require("./time"));var webpack=_interopRequireWildcard(require("./webpack"));exports.webpack=webpack;var _jsUtils=require("@dr.pogodin/js-utils");var _globalState=require("./globalState");var _splitComponent=_interopRequireDefault(require("./splitComponent"));function _getRequireWildcardCache(e){if("function"!=typeof WeakMap)return null;var r=new WeakMap,t=new WeakMap;return(_getRequireWildcardCache=function(e){return e?t:r})(e)}function _interopRequireWildcard(e,r){if(!r&&e&&e.__esModule)return e;if(null===e||"object"!=typeof e&&"function"!=typeof e)return{default:e};var t=_getRequireWildcardCache(r);if(t&&t.has(e))return t.get(e);var n={__proto__:null},a=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var u in e)if("default"!==u&&{}.hasOwnProperty.call(e,u)){var i=a?Object.getOwnPropertyDescriptor(e,u):null;i&&(i.get||i.set)?Object.defineProperty(n,u,i):n[u]=e[u]}return n.default=e,t&&t.set(e,n),n}const themed=exports.themed=_reactThemes.default;themed.COMPOSE=_reactThemes.COMPOSE;themed.PRIORITY=_reactThemes.PRIORITY;// Note: it should be done this way, as in some environments
|
|
2
2
|
// "process" might not exist, and process.env.NODE_CONFIG_ENV
|
|
3
3
|
// not injected by Webpack.
|
|
4
4
|
let NODE_CONFIG_ENV;try{NODE_CONFIG_ENV=process.env.NODE_CONFIG_ENV}catch{/* noop */}const env=NODE_CONFIG_ENV||process.env.NODE_ENV;const JU=exports.JU=env!=="production"?webpack.requireWeak("./jest",__dirname):null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["_reactThemes","_interopRequireWildcard","require","_config","_interopRequireDefault","isomorphy","exports","_time","webpack","_jsUtils","_globalState","_splitComponent","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","
|
|
1
|
+
{"version":3,"file":"index.js","names":["_reactThemes","_interopRequireWildcard","require","_config","_interopRequireDefault","isomorphy","exports","_time","webpack","_jsUtils","_globalState","_splitComponent","_getRequireWildcardCache","e","WeakMap","r","t","__esModule","default","has","get","n","__proto__","a","Object","defineProperty","getOwnPropertyDescriptor","u","hasOwnProperty","call","i","set","themed","themedImpl","COMPOSE","PRIORITY","NODE_CONFIG_ENV","process","env","NODE_ENV","JU","requireWeak","__dirname"],"sources":["../../../../src/shared/utils/index.ts"],"sourcesContent":["import themedImpl, {\n type Theme,\n COMPOSE,\n PRIORITY,\n ThemeProvider,\n} from '@dr.pogodin/react-themes';\n\nimport config from './config';\nimport * as isomorphy from './isomorphy';\nimport time from './time';\nimport * as webpack from './webpack';\n\nimport type * as JuT from './jest';\n\nexport {\n Barrier,\n Emitter,\n Semaphore,\n withRetries,\n} from '@dr.pogodin/js-utils';\n\nexport { getSsrContext } from './globalState';\nexport { default as splitComponent } from './splitComponent';\n\ntype ThemedT = typeof themedImpl & {\n COMPOSE: typeof COMPOSE;\n PRIORITY: typeof PRIORITY;\n};\n\nconst themed: ThemedT = themedImpl as ThemedT;\n\nthemed.COMPOSE = COMPOSE;\nthemed.PRIORITY = PRIORITY;\n\n// Note: it should be done this way, as in some environments\n// \"process\" might not exist, and process.env.NODE_CONFIG_ENV\n// not injected by Webpack.\nlet NODE_CONFIG_ENV;\ntry {\n NODE_CONFIG_ENV = process.env.NODE_CONFIG_ENV;\n} catch { /* noop */ }\n\nconst env = NODE_CONFIG_ENV || process.env.NODE_ENV;\n\nconst JU: typeof JuT | null = env !== 'production'\n ? webpack.requireWeak('./jest', __dirname) as typeof JuT | null\n : null;\n\nexport {\n type Theme,\n config,\n isomorphy,\n JU,\n themed,\n ThemeProvider,\n time,\n webpack,\n};\n"],"mappings":"8pCAAA,IAAAA,YAAA,CAAAC,uBAAA,CAAAC,OAAA,8BAOA,IAAAC,OAAA,CAAAC,sBAAA,CAAAF,OAAA,cACA,IAAAG,SAAA,CAAAJ,uBAAA,CAAAC,OAAA,iBAAyCI,OAAA,CAAAD,SAAA,CAAAA,SAAA,CACzC,IAAAE,KAAA,CAAAH,sBAAA,CAAAF,OAAA,YACA,IAAAM,OAAA,CAAAP,uBAAA,CAAAC,OAAA,eAAqCI,OAAA,CAAAE,OAAA,CAAAA,OAAA,CAIrC,IAAAC,QAAA,CAAAP,OAAA,yBAOA,IAAAQ,YAAA,CAAAR,OAAA,kBACA,IAAAS,eAAA,CAAAP,sBAAA,CAAAF,OAAA,sBAA6D,SAAAU,yBAAAC,CAAA,wBAAAC,OAAA,iBAAAC,CAAA,KAAAD,OAAA,CAAAE,CAAA,KAAAF,OAAA,QAAAF,wBAAA,SAAAA,CAAAC,CAAA,SAAAA,CAAA,CAAAG,CAAA,CAAAD,CAAA,GAAAF,CAAA,WAAAZ,wBAAAY,CAAA,CAAAE,CAAA,MAAAA,CAAA,EAAAF,CAAA,EAAAA,CAAA,CAAAI,UAAA,QAAAJ,CAAA,WAAAA,CAAA,mBAAAA,CAAA,qBAAAA,CAAA,QAAAK,OAAA,CAAAL,CAAA,MAAAG,CAAA,CAAAJ,wBAAA,CAAAG,CAAA,KAAAC,CAAA,EAAAA,CAAA,CAAAG,GAAA,CAAAN,CAAA,SAAAG,CAAA,CAAAI,GAAA,CAAAP,CAAA,MAAAQ,CAAA,EAAAC,SAAA,OAAAC,CAAA,CAAAC,MAAA,CAAAC,cAAA,EAAAD,MAAA,CAAAE,wBAAA,SAAAC,CAAA,IAAAd,CAAA,gBAAAc,CAAA,KAAAC,cAAA,CAAAC,IAAA,CAAAhB,CAAA,CAAAc,CAAA,OAAAG,CAAA,CAAAP,CAAA,CAAAC,MAAA,CAAAE,wBAAA,CAAAb,CAAA,CAAAc,CAAA,OAAAG,CAAA,GAAAA,CAAA,CAAAV,GAAA,EAAAU,CAAA,CAAAC,GAAA,EAAAP,MAAA,CAAAC,cAAA,CAAAJ,CAAA,CAAAM,CAAA,CAAAG,CAAA,EAAAT,CAAA,CAAAM,CAAA,EAAAd,CAAA,CAAAc,CAAA,SAAAN,CAAA,CAAAH,OAAA,CAAAL,CAAA,CAAAG,CAAA,EAAAA,CAAA,CAAAe,GAAA,CAAAlB,CAAA,CAAAQ,CAAA,EAAAA,CAAA,CAO7D,KAAM,CAAAW,MAAe,CAAA1B,OAAA,CAAA0B,MAAA,CAAGC,oBAAqB,CAE7CD,MAAM,CAACE,OAAO,CAAGA,oBAAO,CACxBF,MAAM,CAACG,QAAQ,CAAGA,qBAAQ,CAE1B;AACA;AACA;AACA,GAAI,CAAAC,eAAe,CACnB,GAAI,CACFA,eAAe,CAAGC,OAAO,CAACC,GAAG,CAACF,eAChC,CAAE,KAAM,CAAE,WAEV,KAAM,CAAAE,GAAG,CAAGF,eAAe,EAAIC,OAAO,CAACC,GAAG,CAACC,QAAQ,CAEnD,KAAM,CAAAC,EAAqB,CAAAlC,OAAA,CAAAkC,EAAA,CAAGF,GAAG,GAAK,YAAY,CAC9C9B,OAAO,CAACiC,WAAW,UAAWC,SAAS,CAAC,CACxC,IAAI","ignoreList":[]}
|
|
@@ -19,7 +19,9 @@
|
|
|
19
19
|
*/loadWebpackConfig(){const optionsString=this.pragmas["webpack-config-options"];const options=optionsString?JSON.parse(optionsString):{};(0,_lodash.defaults)(options,{context:this.testFolder,fs:this.global.webpackOutputFs});const factoryPath=this.pragmas["webpack-config-factory"];let factory=require(_path.default.resolve(this.rootDir,factoryPath));factory="default"in factory?factory.default:factory;this.global.webpackConfig=factory(options);const fs=this.global.webpackOutputFs;let buildInfo=`${options.context}/.build-info`;if(fs.existsSync(buildInfo)){buildInfo=fs.readFileSync(buildInfo,"utf8");this.global.buildInfo=JSON.parse(buildInfo)}}/**
|
|
20
20
|
* Executes Webpack build.
|
|
21
21
|
* @return {Promise}
|
|
22
|
-
*/async runWebpack(){this.loadWebpackConfig();const compiler=(0,_webpack.default)(this.global.webpackConfig)
|
|
22
|
+
*/async runWebpack(){this.loadWebpackConfig();const compiler=(0,_webpack.default)(this.global.webpackConfig);// TODO: The "as typeof compiler.outputFileSystem" piece below is a workaround
|
|
23
|
+
// for the Webpack regression: https://github.com/webpack/webpack/issues/18242
|
|
24
|
+
compiler.outputFileSystem=this.global.webpackOutputFs;return new Promise((done,fail)=>{compiler.run((err,stats)=>{if(err)fail(err);if(stats?.hasErrors()){// eslint-disable-next-line no-console
|
|
23
25
|
console.error(stats.toJson().errors);fail(Error("Webpack compilation failed"))}this.global.webpackStats=stats?.toJson();// Keeps reference to the raw Webpack stats object, which should be
|
|
24
26
|
// explicitly passed to the server-side renderer alongside the request,
|
|
25
27
|
// so that it can to pick up asset paths for different named chunks.
|