@strapi/strapi 5.51.1 → 5.52.0
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/dist/node/core/admin-vite-alias-modules.d.ts +3 -3
- package/dist/node/core/admin-vite-alias-modules.d.ts.map +1 -1
- package/dist/node/core/admin-vite-optimize-exclude.d.ts +31 -1
- package/dist/node/core/admin-vite-optimize-exclude.d.ts.map +1 -1
- package/dist/package.json.js +1 -1
- package/dist/package.json.mjs +1 -1
- package/dist/src/cli/commands/export/action.js +1 -1
- package/dist/src/cli/commands/export/action.js.map +1 -1
- package/dist/src/cli/commands/export/action.mjs +1 -1
- package/dist/src/cli/commands/export/action.mjs.map +1 -1
- package/dist/src/cli/commands/import/action.js +2 -2
- package/dist/src/cli/commands/import/action.js.map +1 -1
- package/dist/src/cli/commands/import/action.mjs +2 -2
- package/dist/src/cli/commands/import/action.mjs.map +1 -1
- package/dist/src/cli/commands/transfer/action.js +2 -2
- package/dist/src/cli/commands/transfer/action.js.map +1 -1
- package/dist/src/cli/commands/transfer/action.mjs +2 -2
- package/dist/src/cli/commands/transfer/action.mjs.map +1 -1
- package/dist/src/cli/commands/transfer/command.js +1 -1
- package/dist/src/cli/commands/transfer/command.js.map +1 -1
- package/dist/src/cli/commands/transfer/command.mjs +1 -1
- package/dist/src/cli/commands/transfer/command.mjs.map +1 -1
- package/dist/src/cli/utils/commander.js +3 -3
- package/dist/src/cli/utils/commander.js.map +1 -1
- package/dist/src/cli/utils/commander.mjs +3 -3
- package/dist/src/cli/utils/commander.mjs.map +1 -1
- package/dist/src/cli/utils/data-transfer.js +1 -1
- package/dist/src/cli/utils/data-transfer.js.map +1 -1
- package/dist/src/cli/utils/data-transfer.mjs +1 -1
- package/dist/src/cli/utils/data-transfer.mjs.map +1 -1
- package/dist/src/cli/utils/helpers.js +1 -1
- package/dist/src/cli/utils/helpers.js.map +1 -1
- package/dist/src/cli/utils/helpers.mjs +1 -1
- package/dist/src/cli/utils/helpers.mjs.map +1 -1
- package/dist/src/cli/utils/telemetry.js +1 -1
- package/dist/src/cli/utils/telemetry.js.map +1 -1
- package/dist/src/cli/utils/telemetry.mjs +1 -1
- package/dist/src/cli/utils/telemetry.mjs.map +1 -1
- package/dist/src/node/core/admin-vite-alias-modules.js +11 -1
- package/dist/src/node/core/admin-vite-alias-modules.js.map +1 -1
- package/dist/src/node/core/admin-vite-alias-modules.mjs +11 -1
- package/dist/src/node/core/admin-vite-alias-modules.mjs.map +1 -1
- package/dist/src/node/core/admin-vite-optimize-exclude.js +42 -2
- package/dist/src/node/core/admin-vite-optimize-exclude.js.map +1 -1
- package/dist/src/node/core/admin-vite-optimize-exclude.mjs +40 -3
- package/dist/src/node/core/admin-vite-optimize-exclude.mjs.map +1 -1
- package/dist/src/node/core/dependencies.js +1 -1
- package/dist/src/node/core/dependencies.js.map +1 -1
- package/dist/src/node/core/dependencies.mjs +1 -1
- package/dist/src/node/core/dependencies.mjs.map +1 -1
- package/dist/src/node/core/files.js +1 -1
- package/dist/src/node/core/files.js.map +1 -1
- package/dist/src/node/core/files.mjs +1 -1
- package/dist/src/node/core/files.mjs.map +1 -1
- package/dist/src/node/vite/config.js +1 -1
- package/dist/src/node/vite/config.js.map +1 -1
- package/dist/src/node/vite/config.mjs +1 -1
- package/dist/src/node/vite/config.mjs.map +1 -1
- package/package.json +24 -24
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.js","sources":["../../../../src/cli/utils/helpers.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport chalk from 'chalk';\nimport { has, isString, isArray } from 'lodash/fp';\nimport boxen from 'boxen';\nimport type { Command } from 'commander';\nimport { getInquirer } from './get-inquirer';\n\n/**\n * Helper functions for the Strapi CLI\n */\nconst bytesPerKb = 1024;\nconst sizes = ['B ', 'KB', 'MB', 'GB', 'TB', 'PB'];\n\n/**\n * Convert bytes to a human readable formatted string, for example \"1024\" becomes \"1KB\"\n */\nconst readableBytes = (bytes: number, decimals = 1, padStart = 0) => {\n if (!bytes) {\n return '0';\n }\n const i = Math.floor(Math.log(bytes) / Math.log(bytesPerKb));\n const result = `${(bytes / bytesPerKb ** i).toFixed(decimals)} ${sizes[i].padStart(2)}`;\n\n return result.padStart(padStart);\n};\n\n// Helper to floor a number to a given number of decimal places\nfunction floorToDecimal(value: number, decimals: number) {\n const factor = 10 ** decimals;\n return Math.floor(value * factor) / factor;\n}\n\n/**\n * Convert elapsed time to a human readable formatted string, for example \"1024\" becomes \"1s\"\n */\nconst readableTime = (elapsedTime: number, decimals = 1, padStart = 0): string => {\n let value: number;\n let unit: string;\n\n if (elapsedTime >= 60000) {\n value = elapsedTime / 60000;\n unit = 'm';\n } else if (elapsedTime >= 1000) {\n value = elapsedTime / 1000;\n unit = 's';\n } else {\n value = elapsedTime;\n unit = 'ms';\n }\n\n const floored = floorToDecimal(value, decimals);\n const result = `${floored.toFixed(decimals)}${unit}`;\n return result.padStart(padStart);\n};\n\n/**\n * Separates transfer progress segments (count, size, elapsed, rate, ETA) instead of nested\n * parentheses — easier to scan in a single terminal line.\n */\nconst TRANSFER_PROGRESS_FIELD_SEP = ' · ';\n\n/**\n * Stage / prep timing: plain `readableTime` (e.g. `1.2s`) when no ETA; with ETA, append\n * `, ~4.0s remaining` (`~` = approximate). Same base format for every stage; remaining is additive.\n */\nconst formatElapsedAndMaybeRemainingLabel = (\n elapsedMs: number,\n remainingMs: number | null\n): string =>\n remainingMs != null\n ? `${readableTime(elapsedMs)}, ~${readableTime(remainingMs)} remaining`\n : readableTime(elapsedMs);\n\ninterface ExitWithOptions {\n logger?: Console;\n prc?: NodeJS.Process;\n}\n\n/**\n *\n * Display message(s) to console and then call process.exit with code.\n * If code is zero, console.log and green text is used for messages, otherwise console.error and red text.\n *\n */\nconst exitWith = (code: number, message?: string | string[], options: ExitWithOptions = {}) => {\n const { logger = console, prc = process } = options;\n\n const log = (message: string) => {\n if (code === 0) {\n logger.log(chalk.green(message));\n } else {\n logger.error(chalk.red(message));\n }\n };\n\n if (isString(message)) {\n log(message);\n } else if (isArray(message)) {\n message.forEach((msg) => log(msg));\n }\n\n prc.exit(code);\n};\n\n/**\n * assert that a URL object has a protocol value\n *\n */\nconst assertUrlHasProtocol = (url: URL, protocol?: string | string[]) => {\n if (!url.protocol) {\n exitWith(1, `${url.toString()} does not have a protocol`);\n }\n\n // if just checking for the existence of a protocol, return\n if (!protocol) {\n return;\n }\n\n if (isString(protocol)) {\n if (protocol !== url.protocol) {\n exitWith(1, `${url.toString()} must have the protocol ${protocol}`);\n }\n return;\n }\n\n // assume an array\n if (!protocol.some((protocol) => url.protocol === protocol)) {\n return exitWith(\n 1,\n `${url.toString()} must have one of the following protocols: ${protocol.join(',')}`\n );\n }\n};\n\ntype ConditionCallback = (opts: Record<string, any>) => Promise<boolean>;\ntype IsMetCallback = (command: Command) => Promise<void>;\ntype IsNotMetCallback = (command: Command) => Promise<void>;\n\n/**\n * Passes commander options to conditionCallback(). If it returns true, call isMetCallback otherwise call isNotMetCallback\n */\nconst ifOptions = (\n conditionCallback: ConditionCallback,\n isMetCallback: IsMetCallback = async () => {},\n isNotMetCallback: IsNotMetCallback = async () => {}\n) => {\n return async (command: Command) => {\n const opts = command.opts();\n if (await conditionCallback(opts)) {\n await isMetCallback(command);\n } else {\n await isNotMetCallback(command);\n }\n };\n};\n\nconst assertCwdContainsStrapiProject = (name: string) => {\n const logErrorAndExit = () => {\n console.log(\n `You need to run ${chalk.yellow(\n `strapi ${name}`\n )} in a Strapi project. Make sure you are in the right directory.`\n );\n process.exit(1);\n };\n\n try {\n const pkgJSON = require(`${process.cwd()}/package.json`);\n if (\n !has('dependencies.@strapi/strapi', pkgJSON) &&\n !has('devDependencies.@strapi/strapi', pkgJSON)\n ) {\n logErrorAndExit();\n }\n } catch (err) {\n logErrorAndExit();\n }\n};\n\nconst runAction =\n (name: string, action: (...args: any[]) => Promise<void>) =>\n (...args: unknown[]) => {\n assertCwdContainsStrapiProject(name);\n\n Promise.resolve()\n .then(() => {\n return action(...args);\n })\n .catch((error) => {\n console.error(error);\n process.exit(1);\n });\n };\n\n/**\n * @description Notify users this is an experimental command and get them to approve first\n * this can be opted out by passing `yes` as a property of the args object.\n *\n * @example\n * ```ts\n * const { notifyExperimentalCommand } = require('../utils/helpers');\n *\n * const myCommand = async ({ force }) => {\n * await notifyExperimentalCommand('plugin:build', { force });\n * }\n * ```\n */\nconst notifyExperimentalCommand = async (name: string, { force }: { force?: boolean } = {}) => {\n console.log(\n boxen(\n `The ${chalk.bold(\n chalk.underline(name)\n )} command is considered experimental, use at your own risk.`,\n {\n title: 'Warning',\n padding: 1,\n margin: 1,\n align: 'center',\n borderColor: 'yellow',\n borderStyle: 'bold',\n }\n )\n );\n\n if (!force) {\n const inquirer = await getInquirer();\n const { confirmed } = await inquirer.prompt({\n type: 'confirm',\n name: 'confirmed',\n message: 'Do you want to continue?',\n });\n\n if (!confirmed) {\n process.exit(0);\n }\n }\n};\n\nexport {\n exitWith,\n assertUrlHasProtocol,\n ifOptions,\n readableBytes,\n readableTime,\n formatElapsedAndMaybeRemainingLabel,\n TRANSFER_PROGRESS_FIELD_SEP,\n runAction,\n assertCwdContainsStrapiProject,\n notifyExperimentalCommand,\n};\n"],"names":["bytesPerKb","sizes","readableBytes","bytes","decimals","padStart","i","Math","floor","log","result","toFixed","floorToDecimal","value","factor","readableTime","elapsedTime","unit","floored","TRANSFER_PROGRESS_FIELD_SEP","formatElapsedAndMaybeRemainingLabel","elapsedMs","remainingMs","exitWith","code","message","options","logger","console","prc","process","chalk","green","error","red","isString","isArray","forEach","msg","exit","assertUrlHasProtocol","url","protocol","toString","some","join","ifOptions","conditionCallback","isMetCallback","isNotMetCallback","command","opts","assertCwdContainsStrapiProject","name","logErrorAndExit","yellow","pkgJSON","require","cwd","has","err","runAction","action","args","Promise","resolve","then","catch"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"helpers.js","sources":["../../../../src/cli/utils/helpers.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport chalk from 'chalk';\nimport { has, isString, isArray } from 'lodash/fp';\nimport boxen from 'boxen';\nimport type { Command } from 'commander';\nimport { getInquirer } from './get-inquirer';\n\n/**\n * Helper functions for the Strapi CLI\n */\nconst bytesPerKb = 1024;\nconst sizes = ['B ', 'KB', 'MB', 'GB', 'TB', 'PB'];\n\n/**\n * Convert bytes to a human readable formatted string, for example \"1024\" becomes \"1KB\"\n */\nconst readableBytes = (bytes: number, decimals = 1, padStart = 0) => {\n if (!bytes) {\n return '0';\n }\n const i = Math.floor(Math.log(bytes) / Math.log(bytesPerKb));\n const result = `${(bytes / bytesPerKb ** i).toFixed(decimals)} ${sizes[i].padStart(2)}`;\n\n return result.padStart(padStart);\n};\n\n// Helper to floor a number to a given number of decimal places\nfunction floorToDecimal(value: number, decimals: number) {\n const factor = 10 ** decimals;\n return Math.floor(value * factor) / factor;\n}\n\n/**\n * Convert elapsed time to a human readable formatted string, for example \"1024\" becomes \"1s\"\n */\nconst readableTime = (elapsedTime: number, decimals = 1, padStart = 0): string => {\n let value: number;\n let unit: string;\n\n if (elapsedTime >= 60000) {\n value = elapsedTime / 60000;\n unit = 'm';\n } else if (elapsedTime >= 1000) {\n value = elapsedTime / 1000;\n unit = 's';\n } else {\n value = elapsedTime;\n unit = 'ms';\n }\n\n const floored = floorToDecimal(value, decimals);\n const result = `${floored.toFixed(decimals)}${unit}`;\n return result.padStart(padStart);\n};\n\n/**\n * Separates transfer progress segments (count, size, elapsed, rate, ETA) instead of nested\n * parentheses — easier to scan in a single terminal line.\n */\nconst TRANSFER_PROGRESS_FIELD_SEP = ' · ';\n\n/**\n * Stage / prep timing: plain `readableTime` (e.g. `1.2s`) when no ETA; with ETA, append\n * `, ~4.0s remaining` (`~` = approximate). Same base format for every stage; remaining is additive.\n */\nconst formatElapsedAndMaybeRemainingLabel = (\n elapsedMs: number,\n remainingMs: number | null\n): string =>\n remainingMs != null\n ? `${readableTime(elapsedMs)}, ~${readableTime(remainingMs)} remaining`\n : readableTime(elapsedMs);\n\ninterface ExitWithOptions {\n logger?: Console;\n prc?: NodeJS.Process;\n}\n\n/**\n *\n * Display message(s) to console and then call process.exit with code.\n * If code is zero, console.log and green text is used for messages, otherwise console.error and red text.\n *\n */\nconst exitWith = (code: number, message?: string | string[], options: ExitWithOptions = {}) => {\n const { logger = console, prc = process } = options;\n\n const log = (message: string) => {\n if (code === 0) {\n logger.log(chalk.green(message));\n } else {\n logger.error(chalk.red(message));\n }\n };\n\n if (isString(message)) {\n log(message);\n } else if (isArray(message)) {\n message.forEach((msg) => log(msg));\n }\n\n prc.exit(code);\n};\n\n/**\n * assert that a URL object has a protocol value\n *\n */\nconst assertUrlHasProtocol = (url: URL, protocol?: string | string[]) => {\n if (!url.protocol) {\n exitWith(1, `${url.toString()} does not have a protocol`);\n }\n\n // if just checking for the existence of a protocol, return\n if (!protocol) {\n return;\n }\n\n if (isString(protocol)) {\n if (protocol !== url.protocol) {\n exitWith(1, `${url.toString()} must have the protocol ${protocol}`);\n }\n return;\n }\n\n // assume an array\n if (!protocol.some((protocol) => url.protocol === protocol)) {\n return exitWith(\n 1,\n `${url.toString()} must have one of the following protocols: ${protocol.join(',')}`\n );\n }\n};\n\ntype ConditionCallback = (opts: Record<string, any>) => Promise<boolean>;\ntype IsMetCallback = (command: Command) => Promise<void>;\ntype IsNotMetCallback = (command: Command) => Promise<void>;\n\n/**\n * Passes commander options to conditionCallback(). If it returns true, call isMetCallback otherwise call isNotMetCallback\n */\nconst ifOptions = (\n conditionCallback: ConditionCallback,\n isMetCallback: IsMetCallback = async () => {},\n isNotMetCallback: IsNotMetCallback = async () => {}\n) => {\n return async (command: Command) => {\n const opts = command.opts();\n if (await conditionCallback(opts)) {\n await isMetCallback(command);\n } else {\n await isNotMetCallback(command);\n }\n };\n};\n\nconst assertCwdContainsStrapiProject = (name: string) => {\n const logErrorAndExit = () => {\n console.log(\n `You need to run ${chalk.yellow(\n `strapi ${name}`\n )} in a Strapi project. Make sure you are in the right directory.`\n );\n process.exit(1);\n };\n\n try {\n const pkgJSON = require(`${process.cwd()}/package.json`);\n if (\n !has('dependencies.@strapi/strapi', pkgJSON) &&\n !has('devDependencies.@strapi/strapi', pkgJSON)\n ) {\n logErrorAndExit();\n }\n } catch {\n logErrorAndExit();\n }\n};\n\nconst runAction =\n (name: string, action: (...args: any[]) => Promise<void>) =>\n (...args: unknown[]) => {\n assertCwdContainsStrapiProject(name);\n\n Promise.resolve()\n .then(() => {\n return action(...args);\n })\n .catch((error) => {\n console.error(error);\n process.exit(1);\n });\n };\n\n/**\n * @description Notify users this is an experimental command and get them to approve first\n * this can be opted out by passing `yes` as a property of the args object.\n *\n * @example\n * ```ts\n * const { notifyExperimentalCommand } = require('../utils/helpers');\n *\n * const myCommand = async ({ force }) => {\n * await notifyExperimentalCommand('plugin:build', { force });\n * }\n * ```\n */\nconst notifyExperimentalCommand = async (name: string, { force }: { force?: boolean } = {}) => {\n console.log(\n boxen(\n `The ${chalk.bold(\n chalk.underline(name)\n )} command is considered experimental, use at your own risk.`,\n {\n title: 'Warning',\n padding: 1,\n margin: 1,\n align: 'center',\n borderColor: 'yellow',\n borderStyle: 'bold',\n }\n )\n );\n\n if (!force) {\n const inquirer = await getInquirer();\n const { confirmed } = await inquirer.prompt({\n type: 'confirm',\n name: 'confirmed',\n message: 'Do you want to continue?',\n });\n\n if (!confirmed) {\n process.exit(0);\n }\n }\n};\n\nexport {\n exitWith,\n assertUrlHasProtocol,\n ifOptions,\n readableBytes,\n readableTime,\n formatElapsedAndMaybeRemainingLabel,\n TRANSFER_PROGRESS_FIELD_SEP,\n runAction,\n assertCwdContainsStrapiProject,\n notifyExperimentalCommand,\n};\n"],"names":["bytesPerKb","sizes","readableBytes","bytes","decimals","padStart","i","Math","floor","log","result","toFixed","floorToDecimal","value","factor","readableTime","elapsedTime","unit","floored","TRANSFER_PROGRESS_FIELD_SEP","formatElapsedAndMaybeRemainingLabel","elapsedMs","remainingMs","exitWith","code","message","options","logger","console","prc","process","chalk","green","error","red","isString","isArray","forEach","msg","exit","assertUrlHasProtocol","url","protocol","toString","some","join","ifOptions","conditionCallback","isMetCallback","isNotMetCallback","command","opts","assertCwdContainsStrapiProject","name","logErrorAndExit","yellow","pkgJSON","require","cwd","has","runAction","action","args","Promise","resolve","then","catch"],"mappings":";;;;;;;;;;AAOA;;AAEC,IACD,MAAMA,UAAAA,GAAa,IAAA;AACnB,MAAMC,KAAAA,GAAQ;AAAC,IAAA,IAAA;AAAM,IAAA,IAAA;AAAM,IAAA,IAAA;AAAM,IAAA,IAAA;AAAM,IAAA,IAAA;AAAM,IAAA;AAAK,CAAA;AAElD;;IAGA,MAAMC,gBAAgB,CAACC,KAAAA,EAAeC,WAAW,CAAC,EAAEC,WAAW,CAAC,GAAA;AAC9D,IAAA,IAAI,CAACF,KAAAA,EAAO;QACV,OAAO,GAAA;AACT,IAAA;IACA,MAAMG,CAAAA,GAAIC,IAAAA,CAAKC,KAAK,CAACD,IAAAA,CAAKE,GAAG,CAACN,KAAAA,CAAAA,GAASI,IAAAA,CAAKE,GAAG,CAACT,UAAAA,CAAAA,CAAAA;AAChD,IAAA,MAAMU,SAAS,CAAA,EAAIP,CAAAA,KAAAA,GAAQH,UAAAA,IAAcM,CAAAA,EAAGK,OAAO,CAACP,QAAAA,CAAAA,CAAU,CAAC,EAAEH,KAAK,CAACK,EAAE,CAACD,QAAQ,CAAC,CAAA,CAAA,CAAA,CAAI;IAEvF,OAAOK,MAAAA,CAAOL,QAAQ,CAACA,QAAAA,CAAAA;AACzB;AAEA;AACA,SAASO,cAAAA,CAAeC,KAAa,EAAET,QAAgB,EAAA;AACrD,IAAA,MAAMU,SAAS,EAAA,IAAMV,QAAAA;AACrB,IAAA,OAAOG,IAAAA,CAAKC,KAAK,CAACK,KAAAA,GAAQC,MAAAA,CAAAA,GAAUA,MAAAA;AACtC;AAEA;;IAGA,MAAMC,eAAe,CAACC,WAAAA,EAAqBZ,WAAW,CAAC,EAAEC,WAAW,CAAC,GAAA;IACnE,IAAIQ,KAAAA;IACJ,IAAII,IAAAA;AAEJ,IAAA,IAAID,eAAe,KAAA,EAAO;AACxBH,QAAAA,KAAAA,GAAQG,WAAAA,GAAc,KAAA;QACtBC,IAAAA,GAAO,GAAA;IACT,CAAA,MAAO,IAAID,eAAe,IAAA,EAAM;AAC9BH,QAAAA,KAAAA,GAAQG,WAAAA,GAAc,IAAA;QACtBC,IAAAA,GAAO,GAAA;IACT,CAAA,MAAO;QACLJ,KAAAA,GAAQG,WAAAA;QACRC,IAAAA,GAAO,IAAA;AACT,IAAA;IAEA,MAAMC,OAAAA,GAAUN,eAAeC,KAAAA,EAAOT,QAAAA,CAAAA;AACtC,IAAA,MAAMM,SAAS,CAAA,EAAGQ,OAAAA,CAAQP,OAAO,CAACP,YAAYa,IAAAA,CAAAA,CAAM;IACpD,OAAOP,MAAAA,CAAOL,QAAQ,CAACA,QAAAA,CAAAA;AACzB;AAEA;;;AAGC,UACKc,2BAAAA,GAA8B;AAEpC;;;AAGC,UACKC,mCAAAA,GAAsC,CAC1CC,SAAAA,EACAC,WAAAA,GAEAA,eAAe,IAAA,GACX,CAAA,EAAGP,YAAAA,CAAaM,SAAAA,CAAAA,CAAW,GAAG,EAAEN,YAAAA,CAAaO,aAAa,UAAU,CAAC,GACrEP,YAAAA,CAAaM,SAAAA;AAOnB;;;;;AAKC,UACKE,QAAAA,GAAW,CAACC,MAAcC,OAAAA,EAA6BC,OAAAA,GAA2B,EAAE,GAAA;AACxF,IAAA,MAAM,EAAEC,MAAAA,GAASC,OAAO,EAAEC,GAAAA,GAAMC,OAAO,EAAE,GAAGJ,OAAAA;AAE5C,IAAA,MAAMjB,MAAM,CAACgB,OAAAA,GAAAA;AACX,QAAA,IAAID,SAAS,CAAA,EAAG;AACdG,YAAAA,MAAAA,CAAOlB,GAAG,CAACsB,sBAAAA,CAAMC,KAAK,CAACP,OAAAA,CAAAA,CAAAA;QACzB,CAAA,MAAO;AACLE,YAAAA,MAAAA,CAAOM,KAAK,CAACF,sBAAAA,CAAMG,GAAG,CAACT,OAAAA,CAAAA,CAAAA;AACzB,QAAA;AACF,IAAA,CAAA;AAEA,IAAA,IAAIU,YAASV,OAAAA,CAAAA,EAAU;QACrBhB,GAAAA,CAAIgB,OAAAA,CAAAA;IACN,CAAA,MAAO,IAAIW,WAAQX,OAAAA,CAAAA,EAAU;AAC3BA,QAAAA,OAAAA,CAAQY,OAAO,CAAC,CAACC,GAAAA,GAAQ7B,GAAAA,CAAI6B,GAAAA,CAAAA,CAAAA;AAC/B,IAAA;AAEAT,IAAAA,GAAAA,CAAIU,IAAI,CAACf,IAAAA,CAAAA;AACX;AAEA;;;IAIA,MAAMgB,oBAAAA,GAAuB,CAACC,GAAAA,EAAUC,QAAAA,GAAAA;IACtC,IAAI,CAACD,GAAAA,CAAIC,QAAQ,EAAE;AACjBnB,QAAAA,QAAAA,CAAS,GAAG,CAAA,EAAGkB,GAAAA,CAAIE,QAAQ,EAAA,CAAG,yBAAyB,CAAC,CAAA;AAC1D,IAAA;;AAGA,IAAA,IAAI,CAACD,QAAAA,EAAU;AACb,QAAA;AACF,IAAA;AAEA,IAAA,IAAIP,YAASO,QAAAA,CAAAA,EAAW;QACtB,IAAIA,QAAAA,KAAaD,GAAAA,CAAIC,QAAQ,EAAE;AAC7BnB,YAAAA,QAAAA,CAAS,GAAG,CAAA,EAAGkB,GAAAA,CAAIE,QAAQ,EAAA,CAAG,wBAAwB,EAAED,QAAAA,CAAAA,CAAU,CAAA;AACpE,QAAA;AACA,QAAA;AACF,IAAA;;IAGA,IAAI,CAACA,SAASE,IAAI,CAAC,CAACF,QAAAA,GAAaD,GAAAA,CAAIC,QAAQ,KAAKA,QAAAA,CAAAA,EAAW;QAC3D,OAAOnB,QAAAA,CACL,CAAA,EACA,CAAA,EAAGkB,GAAAA,CAAIE,QAAQ,EAAA,CAAG,2CAA2C,EAAED,QAAAA,CAASG,IAAI,CAAC,GAAA,CAAA,CAAA,CAAM,CAAA;AAEvF,IAAA;AACF;AAMA;;IAGA,MAAMC,SAAAA,GAAY,CAChBC,iBAAAA,EACAC,aAAAA,GAA+B,WAAa,CAAC,EAC7CC,gBAAAA,GAAqC,UAAA,CAAa,CAAC,GAAA;AAEnD,IAAA,OAAO,OAAOC,OAAAA,GAAAA;QACZ,MAAMC,IAAAA,GAAOD,QAAQC,IAAI,EAAA;QACzB,IAAI,MAAMJ,kBAAkBI,IAAAA,CAAAA,EAAO;AACjC,YAAA,MAAMH,aAAAA,CAAcE,OAAAA,CAAAA;QACtB,CAAA,MAAO;AACL,YAAA,MAAMD,gBAAAA,CAAiBC,OAAAA,CAAAA;AACzB,QAAA;AACF,IAAA,CAAA;AACF;AAEA,MAAME,iCAAiC,CAACC,IAAAA,GAAAA;AACtC,IAAA,MAAMC,eAAAA,GAAkB,IAAA;AACtB1B,QAAAA,OAAAA,CAAQnB,GAAG,CACT,CAAC,gBAAgB,EAAEsB,sBAAAA,CAAMwB,MAAM,CAC7B,CAAC,OAAO,EAAEF,IAAAA,CAAAA,CAAM,CAAA,CAChB,+DAA+D,CAAC,CAAA;AAEpEvB,QAAAA,OAAAA,CAAQS,IAAI,CAAC,CAAA,CAAA;AACf,IAAA,CAAA;IAEA,IAAI;AACF,QAAA,MAAMiB,UAAUC,OAAAA,CAAQ,CAAA,EAAG3B,QAAQ4B,GAAG,EAAA,CAAG,aAAa,CAAC,CAAA;AACvD,QAAA,IACE,CAACC,MAAAA,CAAI,6BAAA,EAA+BH,YACpC,CAACG,MAAAA,CAAI,kCAAkCH,OAAAA,CAAAA,EACvC;AACAF,YAAAA,eAAAA,EAAAA;AACF,QAAA;AACF,IAAA,CAAA,CAAE,OAAM;AACNA,QAAAA,eAAAA,EAAAA;AACF,IAAA;AACF;AAEA,MAAMM,SAAAA,GACJ,CAACP,IAAAA,EAAcQ,MAAAA,GACf,CAAC,GAAGC,IAAAA,GAAAA;QACFV,8BAAAA,CAA+BC,IAAAA,CAAAA;QAE/BU,OAAAA,CAAQC,OAAO,EAAA,CACZC,IAAI,CAAC,IAAA;AACJ,YAAA,OAAOJ,MAAAA,CAAAA,GAAUC,IAAAA,CAAAA;QACnB,CAAA,CAAA,CACCI,KAAK,CAAC,CAACjC,KAAAA,GAAAA;AACNL,YAAAA,OAAAA,CAAQK,KAAK,CAACA,KAAAA,CAAAA;AACdH,YAAAA,OAAAA,CAAQS,IAAI,CAAC,CAAA,CAAA;AACf,QAAA,CAAA,CAAA;AACJ,IAAA;;;;;;;;;;;;"}
|
|
@@ -120,7 +120,7 @@ const assertCwdContainsStrapiProject = (name)=>{
|
|
|
120
120
|
if (!has('dependencies.@strapi/strapi', pkgJSON) && !has('devDependencies.@strapi/strapi', pkgJSON)) {
|
|
121
121
|
logErrorAndExit();
|
|
122
122
|
}
|
|
123
|
-
} catch
|
|
123
|
+
} catch {
|
|
124
124
|
logErrorAndExit();
|
|
125
125
|
}
|
|
126
126
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.mjs","sources":["../../../../src/cli/utils/helpers.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport chalk from 'chalk';\nimport { has, isString, isArray } from 'lodash/fp';\nimport boxen from 'boxen';\nimport type { Command } from 'commander';\nimport { getInquirer } from './get-inquirer';\n\n/**\n * Helper functions for the Strapi CLI\n */\nconst bytesPerKb = 1024;\nconst sizes = ['B ', 'KB', 'MB', 'GB', 'TB', 'PB'];\n\n/**\n * Convert bytes to a human readable formatted string, for example \"1024\" becomes \"1KB\"\n */\nconst readableBytes = (bytes: number, decimals = 1, padStart = 0) => {\n if (!bytes) {\n return '0';\n }\n const i = Math.floor(Math.log(bytes) / Math.log(bytesPerKb));\n const result = `${(bytes / bytesPerKb ** i).toFixed(decimals)} ${sizes[i].padStart(2)}`;\n\n return result.padStart(padStart);\n};\n\n// Helper to floor a number to a given number of decimal places\nfunction floorToDecimal(value: number, decimals: number) {\n const factor = 10 ** decimals;\n return Math.floor(value * factor) / factor;\n}\n\n/**\n * Convert elapsed time to a human readable formatted string, for example \"1024\" becomes \"1s\"\n */\nconst readableTime = (elapsedTime: number, decimals = 1, padStart = 0): string => {\n let value: number;\n let unit: string;\n\n if (elapsedTime >= 60000) {\n value = elapsedTime / 60000;\n unit = 'm';\n } else if (elapsedTime >= 1000) {\n value = elapsedTime / 1000;\n unit = 's';\n } else {\n value = elapsedTime;\n unit = 'ms';\n }\n\n const floored = floorToDecimal(value, decimals);\n const result = `${floored.toFixed(decimals)}${unit}`;\n return result.padStart(padStart);\n};\n\n/**\n * Separates transfer progress segments (count, size, elapsed, rate, ETA) instead of nested\n * parentheses — easier to scan in a single terminal line.\n */\nconst TRANSFER_PROGRESS_FIELD_SEP = ' · ';\n\n/**\n * Stage / prep timing: plain `readableTime` (e.g. `1.2s`) when no ETA; with ETA, append\n * `, ~4.0s remaining` (`~` = approximate). Same base format for every stage; remaining is additive.\n */\nconst formatElapsedAndMaybeRemainingLabel = (\n elapsedMs: number,\n remainingMs: number | null\n): string =>\n remainingMs != null\n ? `${readableTime(elapsedMs)}, ~${readableTime(remainingMs)} remaining`\n : readableTime(elapsedMs);\n\ninterface ExitWithOptions {\n logger?: Console;\n prc?: NodeJS.Process;\n}\n\n/**\n *\n * Display message(s) to console and then call process.exit with code.\n * If code is zero, console.log and green text is used for messages, otherwise console.error and red text.\n *\n */\nconst exitWith = (code: number, message?: string | string[], options: ExitWithOptions = {}) => {\n const { logger = console, prc = process } = options;\n\n const log = (message: string) => {\n if (code === 0) {\n logger.log(chalk.green(message));\n } else {\n logger.error(chalk.red(message));\n }\n };\n\n if (isString(message)) {\n log(message);\n } else if (isArray(message)) {\n message.forEach((msg) => log(msg));\n }\n\n prc.exit(code);\n};\n\n/**\n * assert that a URL object has a protocol value\n *\n */\nconst assertUrlHasProtocol = (url: URL, protocol?: string | string[]) => {\n if (!url.protocol) {\n exitWith(1, `${url.toString()} does not have a protocol`);\n }\n\n // if just checking for the existence of a protocol, return\n if (!protocol) {\n return;\n }\n\n if (isString(protocol)) {\n if (protocol !== url.protocol) {\n exitWith(1, `${url.toString()} must have the protocol ${protocol}`);\n }\n return;\n }\n\n // assume an array\n if (!protocol.some((protocol) => url.protocol === protocol)) {\n return exitWith(\n 1,\n `${url.toString()} must have one of the following protocols: ${protocol.join(',')}`\n );\n }\n};\n\ntype ConditionCallback = (opts: Record<string, any>) => Promise<boolean>;\ntype IsMetCallback = (command: Command) => Promise<void>;\ntype IsNotMetCallback = (command: Command) => Promise<void>;\n\n/**\n * Passes commander options to conditionCallback(). If it returns true, call isMetCallback otherwise call isNotMetCallback\n */\nconst ifOptions = (\n conditionCallback: ConditionCallback,\n isMetCallback: IsMetCallback = async () => {},\n isNotMetCallback: IsNotMetCallback = async () => {}\n) => {\n return async (command: Command) => {\n const opts = command.opts();\n if (await conditionCallback(opts)) {\n await isMetCallback(command);\n } else {\n await isNotMetCallback(command);\n }\n };\n};\n\nconst assertCwdContainsStrapiProject = (name: string) => {\n const logErrorAndExit = () => {\n console.log(\n `You need to run ${chalk.yellow(\n `strapi ${name}`\n )} in a Strapi project. Make sure you are in the right directory.`\n );\n process.exit(1);\n };\n\n try {\n const pkgJSON = require(`${process.cwd()}/package.json`);\n if (\n !has('dependencies.@strapi/strapi', pkgJSON) &&\n !has('devDependencies.@strapi/strapi', pkgJSON)\n ) {\n logErrorAndExit();\n }\n } catch (err) {\n logErrorAndExit();\n }\n};\n\nconst runAction =\n (name: string, action: (...args: any[]) => Promise<void>) =>\n (...args: unknown[]) => {\n assertCwdContainsStrapiProject(name);\n\n Promise.resolve()\n .then(() => {\n return action(...args);\n })\n .catch((error) => {\n console.error(error);\n process.exit(1);\n });\n };\n\n/**\n * @description Notify users this is an experimental command and get them to approve first\n * this can be opted out by passing `yes` as a property of the args object.\n *\n * @example\n * ```ts\n * const { notifyExperimentalCommand } = require('../utils/helpers');\n *\n * const myCommand = async ({ force }) => {\n * await notifyExperimentalCommand('plugin:build', { force });\n * }\n * ```\n */\nconst notifyExperimentalCommand = async (name: string, { force }: { force?: boolean } = {}) => {\n console.log(\n boxen(\n `The ${chalk.bold(\n chalk.underline(name)\n )} command is considered experimental, use at your own risk.`,\n {\n title: 'Warning',\n padding: 1,\n margin: 1,\n align: 'center',\n borderColor: 'yellow',\n borderStyle: 'bold',\n }\n )\n );\n\n if (!force) {\n const inquirer = await getInquirer();\n const { confirmed } = await inquirer.prompt({\n type: 'confirm',\n name: 'confirmed',\n message: 'Do you want to continue?',\n });\n\n if (!confirmed) {\n process.exit(0);\n }\n }\n};\n\nexport {\n exitWith,\n assertUrlHasProtocol,\n ifOptions,\n readableBytes,\n readableTime,\n formatElapsedAndMaybeRemainingLabel,\n TRANSFER_PROGRESS_FIELD_SEP,\n runAction,\n assertCwdContainsStrapiProject,\n notifyExperimentalCommand,\n};\n"],"names":["bytesPerKb","sizes","readableBytes","bytes","decimals","padStart","i","Math","floor","log","result","toFixed","floorToDecimal","value","factor","readableTime","elapsedTime","unit","floored","TRANSFER_PROGRESS_FIELD_SEP","formatElapsedAndMaybeRemainingLabel","elapsedMs","remainingMs","exitWith","code","message","options","logger","console","prc","process","chalk","green","error","red","isString","isArray","forEach","msg","exit","assertUrlHasProtocol","url","protocol","toString","some","join","ifOptions","conditionCallback","isMetCallback","isNotMetCallback","command","opts","assertCwdContainsStrapiProject","name","logErrorAndExit","yellow","pkgJSON","require","cwd","has","err","runAction","action","args","Promise","resolve","then","catch"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"helpers.mjs","sources":["../../../../src/cli/utils/helpers.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-var-requires */\nimport chalk from 'chalk';\nimport { has, isString, isArray } from 'lodash/fp';\nimport boxen from 'boxen';\nimport type { Command } from 'commander';\nimport { getInquirer } from './get-inquirer';\n\n/**\n * Helper functions for the Strapi CLI\n */\nconst bytesPerKb = 1024;\nconst sizes = ['B ', 'KB', 'MB', 'GB', 'TB', 'PB'];\n\n/**\n * Convert bytes to a human readable formatted string, for example \"1024\" becomes \"1KB\"\n */\nconst readableBytes = (bytes: number, decimals = 1, padStart = 0) => {\n if (!bytes) {\n return '0';\n }\n const i = Math.floor(Math.log(bytes) / Math.log(bytesPerKb));\n const result = `${(bytes / bytesPerKb ** i).toFixed(decimals)} ${sizes[i].padStart(2)}`;\n\n return result.padStart(padStart);\n};\n\n// Helper to floor a number to a given number of decimal places\nfunction floorToDecimal(value: number, decimals: number) {\n const factor = 10 ** decimals;\n return Math.floor(value * factor) / factor;\n}\n\n/**\n * Convert elapsed time to a human readable formatted string, for example \"1024\" becomes \"1s\"\n */\nconst readableTime = (elapsedTime: number, decimals = 1, padStart = 0): string => {\n let value: number;\n let unit: string;\n\n if (elapsedTime >= 60000) {\n value = elapsedTime / 60000;\n unit = 'm';\n } else if (elapsedTime >= 1000) {\n value = elapsedTime / 1000;\n unit = 's';\n } else {\n value = elapsedTime;\n unit = 'ms';\n }\n\n const floored = floorToDecimal(value, decimals);\n const result = `${floored.toFixed(decimals)}${unit}`;\n return result.padStart(padStart);\n};\n\n/**\n * Separates transfer progress segments (count, size, elapsed, rate, ETA) instead of nested\n * parentheses — easier to scan in a single terminal line.\n */\nconst TRANSFER_PROGRESS_FIELD_SEP = ' · ';\n\n/**\n * Stage / prep timing: plain `readableTime` (e.g. `1.2s`) when no ETA; with ETA, append\n * `, ~4.0s remaining` (`~` = approximate). Same base format for every stage; remaining is additive.\n */\nconst formatElapsedAndMaybeRemainingLabel = (\n elapsedMs: number,\n remainingMs: number | null\n): string =>\n remainingMs != null\n ? `${readableTime(elapsedMs)}, ~${readableTime(remainingMs)} remaining`\n : readableTime(elapsedMs);\n\ninterface ExitWithOptions {\n logger?: Console;\n prc?: NodeJS.Process;\n}\n\n/**\n *\n * Display message(s) to console and then call process.exit with code.\n * If code is zero, console.log and green text is used for messages, otherwise console.error and red text.\n *\n */\nconst exitWith = (code: number, message?: string | string[], options: ExitWithOptions = {}) => {\n const { logger = console, prc = process } = options;\n\n const log = (message: string) => {\n if (code === 0) {\n logger.log(chalk.green(message));\n } else {\n logger.error(chalk.red(message));\n }\n };\n\n if (isString(message)) {\n log(message);\n } else if (isArray(message)) {\n message.forEach((msg) => log(msg));\n }\n\n prc.exit(code);\n};\n\n/**\n * assert that a URL object has a protocol value\n *\n */\nconst assertUrlHasProtocol = (url: URL, protocol?: string | string[]) => {\n if (!url.protocol) {\n exitWith(1, `${url.toString()} does not have a protocol`);\n }\n\n // if just checking for the existence of a protocol, return\n if (!protocol) {\n return;\n }\n\n if (isString(protocol)) {\n if (protocol !== url.protocol) {\n exitWith(1, `${url.toString()} must have the protocol ${protocol}`);\n }\n return;\n }\n\n // assume an array\n if (!protocol.some((protocol) => url.protocol === protocol)) {\n return exitWith(\n 1,\n `${url.toString()} must have one of the following protocols: ${protocol.join(',')}`\n );\n }\n};\n\ntype ConditionCallback = (opts: Record<string, any>) => Promise<boolean>;\ntype IsMetCallback = (command: Command) => Promise<void>;\ntype IsNotMetCallback = (command: Command) => Promise<void>;\n\n/**\n * Passes commander options to conditionCallback(). If it returns true, call isMetCallback otherwise call isNotMetCallback\n */\nconst ifOptions = (\n conditionCallback: ConditionCallback,\n isMetCallback: IsMetCallback = async () => {},\n isNotMetCallback: IsNotMetCallback = async () => {}\n) => {\n return async (command: Command) => {\n const opts = command.opts();\n if (await conditionCallback(opts)) {\n await isMetCallback(command);\n } else {\n await isNotMetCallback(command);\n }\n };\n};\n\nconst assertCwdContainsStrapiProject = (name: string) => {\n const logErrorAndExit = () => {\n console.log(\n `You need to run ${chalk.yellow(\n `strapi ${name}`\n )} in a Strapi project. Make sure you are in the right directory.`\n );\n process.exit(1);\n };\n\n try {\n const pkgJSON = require(`${process.cwd()}/package.json`);\n if (\n !has('dependencies.@strapi/strapi', pkgJSON) &&\n !has('devDependencies.@strapi/strapi', pkgJSON)\n ) {\n logErrorAndExit();\n }\n } catch {\n logErrorAndExit();\n }\n};\n\nconst runAction =\n (name: string, action: (...args: any[]) => Promise<void>) =>\n (...args: unknown[]) => {\n assertCwdContainsStrapiProject(name);\n\n Promise.resolve()\n .then(() => {\n return action(...args);\n })\n .catch((error) => {\n console.error(error);\n process.exit(1);\n });\n };\n\n/**\n * @description Notify users this is an experimental command and get them to approve first\n * this can be opted out by passing `yes` as a property of the args object.\n *\n * @example\n * ```ts\n * const { notifyExperimentalCommand } = require('../utils/helpers');\n *\n * const myCommand = async ({ force }) => {\n * await notifyExperimentalCommand('plugin:build', { force });\n * }\n * ```\n */\nconst notifyExperimentalCommand = async (name: string, { force }: { force?: boolean } = {}) => {\n console.log(\n boxen(\n `The ${chalk.bold(\n chalk.underline(name)\n )} command is considered experimental, use at your own risk.`,\n {\n title: 'Warning',\n padding: 1,\n margin: 1,\n align: 'center',\n borderColor: 'yellow',\n borderStyle: 'bold',\n }\n )\n );\n\n if (!force) {\n const inquirer = await getInquirer();\n const { confirmed } = await inquirer.prompt({\n type: 'confirm',\n name: 'confirmed',\n message: 'Do you want to continue?',\n });\n\n if (!confirmed) {\n process.exit(0);\n }\n }\n};\n\nexport {\n exitWith,\n assertUrlHasProtocol,\n ifOptions,\n readableBytes,\n readableTime,\n formatElapsedAndMaybeRemainingLabel,\n TRANSFER_PROGRESS_FIELD_SEP,\n runAction,\n assertCwdContainsStrapiProject,\n notifyExperimentalCommand,\n};\n"],"names":["bytesPerKb","sizes","readableBytes","bytes","decimals","padStart","i","Math","floor","log","result","toFixed","floorToDecimal","value","factor","readableTime","elapsedTime","unit","floored","TRANSFER_PROGRESS_FIELD_SEP","formatElapsedAndMaybeRemainingLabel","elapsedMs","remainingMs","exitWith","code","message","options","logger","console","prc","process","chalk","green","error","red","isString","isArray","forEach","msg","exit","assertUrlHasProtocol","url","protocol","toString","some","join","ifOptions","conditionCallback","isMetCallback","isNotMetCallback","command","opts","assertCwdContainsStrapiProject","name","logErrorAndExit","yellow","pkgJSON","require","cwd","has","runAction","action","args","Promise","resolve","then","catch"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.js","sources":["../../../../src/cli/utils/telemetry.ts"],"sourcesContent":["import { generateInstallId, env } from '@strapi/utils';\n\nexport const sendEvent = async (event: string, uuid: string, installId?: any) => {\n const analyticsUrl = env('STRAPI_ANALYTICS_URL', 'https://analytics.strapi.io');\n try {\n await fetch(`${analyticsUrl}/api/v2/track`, {\n method: 'POST',\n body: JSON.stringify({\n event,\n deviceId: generateInstallId(uuid, installId),\n groupProperties: { projectId: uuid },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch
|
|
1
|
+
{"version":3,"file":"telemetry.js","sources":["../../../../src/cli/utils/telemetry.ts"],"sourcesContent":["import { generateInstallId, env } from '@strapi/utils';\n\nexport const sendEvent = async (event: string, uuid: string, installId?: any) => {\n const analyticsUrl = env('STRAPI_ANALYTICS_URL', 'https://analytics.strapi.io');\n try {\n await fetch(`${analyticsUrl}/api/v2/track`, {\n method: 'POST',\n body: JSON.stringify({\n event,\n deviceId: generateInstallId(uuid, installId),\n groupProperties: { projectId: uuid },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch {\n // ...\n }\n};\n"],"names":["sendEvent","event","uuid","installId","analyticsUrl","env","fetch","method","body","JSON","stringify","deviceId","generateInstallId","groupProperties","projectId","headers"],"mappings":";;;;AAEO,MAAMA,SAAAA,GAAY,OAAOC,KAAAA,EAAeC,IAAAA,EAAcC,SAAAA,GAAAA;IAC3D,MAAMC,YAAAA,GAAeC,UAAI,sBAAA,EAAwB,6BAAA,CAAA;IACjD,IAAI;AACF,QAAA,MAAMC,KAAAA,CAAM,CAAA,EAAGF,YAAAA,CAAa,aAAa,CAAC,EAAE;YAC1CG,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAMC,IAAAA,CAAKC,SAAS,CAAC;AACnBT,gBAAAA,KAAAA;AACAU,gBAAAA,QAAAA,EAAUC,wBAAkBV,IAAAA,EAAMC,SAAAA,CAAAA;gBAClCU,eAAAA,EAAiB;oBAAEC,SAAAA,EAAWZ;AAAK;AACrC,aAAA,CAAA;YACAa,OAAAA,EAAS;gBACP,cAAA,EAAgB,kBAAA;gBAChB,gBAAA,EAAkBd;AACpB;AACF,SAAA,CAAA;AACF,IAAA,CAAA,CAAE,OAAM;;AAER,IAAA;AACF;;;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.mjs","sources":["../../../../src/cli/utils/telemetry.ts"],"sourcesContent":["import { generateInstallId, env } from '@strapi/utils';\n\nexport const sendEvent = async (event: string, uuid: string, installId?: any) => {\n const analyticsUrl = env('STRAPI_ANALYTICS_URL', 'https://analytics.strapi.io');\n try {\n await fetch(`${analyticsUrl}/api/v2/track`, {\n method: 'POST',\n body: JSON.stringify({\n event,\n deviceId: generateInstallId(uuid, installId),\n groupProperties: { projectId: uuid },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch
|
|
1
|
+
{"version":3,"file":"telemetry.mjs","sources":["../../../../src/cli/utils/telemetry.ts"],"sourcesContent":["import { generateInstallId, env } from '@strapi/utils';\n\nexport const sendEvent = async (event: string, uuid: string, installId?: any) => {\n const analyticsUrl = env('STRAPI_ANALYTICS_URL', 'https://analytics.strapi.io');\n try {\n await fetch(`${analyticsUrl}/api/v2/track`, {\n method: 'POST',\n body: JSON.stringify({\n event,\n deviceId: generateInstallId(uuid, installId),\n groupProperties: { projectId: uuid },\n }),\n headers: {\n 'Content-Type': 'application/json',\n 'X-Strapi-Event': event,\n },\n });\n } catch {\n // ...\n }\n};\n"],"names":["sendEvent","event","uuid","installId","analyticsUrl","env","fetch","method","body","JSON","stringify","deviceId","generateInstallId","groupProperties","projectId","headers"],"mappings":";;AAEO,MAAMA,SAAAA,GAAY,OAAOC,KAAAA,EAAeC,IAAAA,EAAcC,SAAAA,GAAAA;IAC3D,MAAMC,YAAAA,GAAeC,IAAI,sBAAA,EAAwB,6BAAA,CAAA;IACjD,IAAI;AACF,QAAA,MAAMC,KAAAA,CAAM,CAAA,EAAGF,YAAAA,CAAa,aAAa,CAAC,EAAE;YAC1CG,MAAAA,EAAQ,MAAA;YACRC,IAAAA,EAAMC,IAAAA,CAAKC,SAAS,CAAC;AACnBT,gBAAAA,KAAAA;AACAU,gBAAAA,QAAAA,EAAUC,kBAAkBV,IAAAA,EAAMC,SAAAA,CAAAA;gBAClCU,eAAAA,EAAiB;oBAAEC,SAAAA,EAAWZ;AAAK;AACrC,aAAA,CAAA;YACAa,OAAAA,EAAS;gBACP,cAAA,EAAgB,kBAAA;gBAChB,gBAAA,EAAkBd;AACpB;AACF,SAAA,CAAA;AACF,IAAA,CAAA,CAAE,OAAM;;AAER,IAAA;AACF;;;;"}
|
|
@@ -18,7 +18,17 @@ var adminViteSingletonModules = require('./admin-vite-singleton-modules.js');
|
|
|
18
18
|
'@radix-ui/react-tooltip',
|
|
19
19
|
'lodash',
|
|
20
20
|
'invariant',
|
|
21
|
-
'prismjs'
|
|
21
|
+
'prismjs',
|
|
22
|
+
// react-dnd holds its DndContext in module scope, and @strapi/admin and
|
|
23
|
+
// @strapi/content-manager each declare react-dnd@16.0.1 themselves. npm hoisting collapses
|
|
24
|
+
// those onto one copy, so the DndProvider rendered by @strapi/admin's AuthenticatedLayout and
|
|
25
|
+
// the useDragLayer call in the content-manager layout share a context only by accident of
|
|
26
|
+
// hoisting. Any tree that keeps the copies separate (pnpm's strict isolation,
|
|
27
|
+
// install-strategy=nested, a plugin pinning its own react-dnd) gives them two different
|
|
28
|
+
// contexts and the Content Manager crashes on mount with
|
|
29
|
+
// "Invariant Violation: Expected drag drop context" (#22392, #22792).
|
|
30
|
+
'react-dnd',
|
|
31
|
+
'react-dnd-html5-backend'
|
|
22
32
|
];
|
|
23
33
|
/**
|
|
24
34
|
* Modules passed to Vite resolve.dedupe (and aliased): the admin alias modules plus the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-vite-alias-modules.js","sources":["../../../../src/node/core/admin-vite-alias-modules.ts"],"sourcesContent":["import { ADMIN_VITE_SINGLETON_MODULES } from './admin-vite-singleton-modules';\n\n/**\n * Modules given explicit Vite resolve aliases (and included in resolve.dedupe) for the admin bundle.\n * Single source of truth for resolution contract tests.\n *\n * @internal\n */\nexport const ADMIN_VITE_ALIAS_MODULES = [\n 'react',\n 'react-dom',\n 'react-router-dom',\n 'styled-components',\n 'react-redux',\n '@reduxjs/toolkit',\n '@strapi/design-system',\n '@radix-ui/react-tooltip',\n 'lodash',\n 'invariant',\n 'prismjs',\n] as const;\n\nexport type AdminViteAliasModule = (typeof ADMIN_VITE_ALIAS_MODULES)[number];\n\n/**\n * Modules passed to Vite resolve.dedupe (and aliased): the admin alias modules plus the\n * CodeMirror singletons, so every copy collapses onto a single runtime instance.\n */\nexport const ADMIN_VITE_DEDUPE_MODULES = [\n ...ADMIN_VITE_ALIAS_MODULES,\n ...ADMIN_VITE_SINGLETON_MODULES,\n] as const;\n\nexport { ADMIN_VITE_SINGLETON_MODULES };\n\n/**\n * Alias modules with exact versions declared in @strapi/admin dependencies (not peers).\n */\nexport const ADMIN_PINNED_ALIAS_MODULES = [\n '@reduxjs/toolkit',\n 'react-redux',\n '@strapi/design-system',\n 'lodash',\n 'invariant',\n] as const satisfies readonly AdminViteAliasModule[];\n"],"names":["ADMIN_VITE_ALIAS_MODULES","ADMIN_VITE_DEDUPE_MODULES","ADMIN_VITE_SINGLETON_MODULES"],"mappings":";;;;AAEA;;;;;UAMaA,wBAAAA,GAA2B;AACtC,IAAA,OAAA;AACA,IAAA,WAAA;AACA,IAAA,kBAAA;AACA,IAAA,mBAAA;AACA,IAAA,aAAA;AACA,IAAA,kBAAA;AACA,IAAA,uBAAA;AACA,IAAA,yBAAA;AACA,IAAA,QAAA;AACA,IAAA,WAAA;AACA,IAAA;;AAKF;;;UAIaC,yBAAAA,GAA4B;AACpCD,IAAAA,GAAAA,wBAAAA;AACAE,IAAAA,GAAAA;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"admin-vite-alias-modules.js","sources":["../../../../src/node/core/admin-vite-alias-modules.ts"],"sourcesContent":["import { ADMIN_VITE_SINGLETON_MODULES } from './admin-vite-singleton-modules';\n\n/**\n * Modules given explicit Vite resolve aliases (and included in resolve.dedupe) for the admin bundle.\n * Single source of truth for resolution contract tests.\n *\n * @internal\n */\nexport const ADMIN_VITE_ALIAS_MODULES = [\n 'react',\n 'react-dom',\n 'react-router-dom',\n 'styled-components',\n 'react-redux',\n '@reduxjs/toolkit',\n '@strapi/design-system',\n '@radix-ui/react-tooltip',\n 'lodash',\n 'invariant',\n 'prismjs',\n // react-dnd holds its DndContext in module scope, and @strapi/admin and\n // @strapi/content-manager each declare react-dnd@16.0.1 themselves. npm hoisting collapses\n // those onto one copy, so the DndProvider rendered by @strapi/admin's AuthenticatedLayout and\n // the useDragLayer call in the content-manager layout share a context only by accident of\n // hoisting. Any tree that keeps the copies separate (pnpm's strict isolation,\n // install-strategy=nested, a plugin pinning its own react-dnd) gives them two different\n // contexts and the Content Manager crashes on mount with\n // \"Invariant Violation: Expected drag drop context\" (#22392, #22792).\n 'react-dnd',\n 'react-dnd-html5-backend',\n] as const;\n\nexport type AdminViteAliasModule = (typeof ADMIN_VITE_ALIAS_MODULES)[number];\n\n/**\n * Modules passed to Vite resolve.dedupe (and aliased): the admin alias modules plus the\n * CodeMirror singletons, so every copy collapses onto a single runtime instance.\n */\nexport const ADMIN_VITE_DEDUPE_MODULES = [\n ...ADMIN_VITE_ALIAS_MODULES,\n ...ADMIN_VITE_SINGLETON_MODULES,\n] as const;\n\nexport { ADMIN_VITE_SINGLETON_MODULES };\n\n/**\n * Alias modules with exact versions declared in @strapi/admin dependencies (not peers).\n */\nexport const ADMIN_PINNED_ALIAS_MODULES = [\n '@reduxjs/toolkit',\n 'react-redux',\n '@strapi/design-system',\n 'lodash',\n 'invariant',\n 'react-dnd',\n 'react-dnd-html5-backend',\n] as const satisfies readonly AdminViteAliasModule[];\n"],"names":["ADMIN_VITE_ALIAS_MODULES","ADMIN_VITE_DEDUPE_MODULES","ADMIN_VITE_SINGLETON_MODULES"],"mappings":";;;;AAEA;;;;;UAMaA,wBAAAA,GAA2B;AACtC,IAAA,OAAA;AACA,IAAA,WAAA;AACA,IAAA,kBAAA;AACA,IAAA,mBAAA;AACA,IAAA,aAAA;AACA,IAAA,kBAAA;AACA,IAAA,uBAAA;AACA,IAAA,yBAAA;AACA,IAAA,QAAA;AACA,IAAA,WAAA;AACA,IAAA,SAAA;;;;;;;;;AASA,IAAA,WAAA;AACA,IAAA;;AAKF;;;UAIaC,yBAAAA,GAA4B;AACpCD,IAAAA,GAAAA,wBAAAA;AACAE,IAAAA,GAAAA;;;;;;;"}
|
|
@@ -16,7 +16,17 @@ import { ADMIN_VITE_SINGLETON_MODULES } from './admin-vite-singleton-modules.mjs
|
|
|
16
16
|
'@radix-ui/react-tooltip',
|
|
17
17
|
'lodash',
|
|
18
18
|
'invariant',
|
|
19
|
-
'prismjs'
|
|
19
|
+
'prismjs',
|
|
20
|
+
// react-dnd holds its DndContext in module scope, and @strapi/admin and
|
|
21
|
+
// @strapi/content-manager each declare react-dnd@16.0.1 themselves. npm hoisting collapses
|
|
22
|
+
// those onto one copy, so the DndProvider rendered by @strapi/admin's AuthenticatedLayout and
|
|
23
|
+
// the useDragLayer call in the content-manager layout share a context only by accident of
|
|
24
|
+
// hoisting. Any tree that keeps the copies separate (pnpm's strict isolation,
|
|
25
|
+
// install-strategy=nested, a plugin pinning its own react-dnd) gives them two different
|
|
26
|
+
// contexts and the Content Manager crashes on mount with
|
|
27
|
+
// "Invariant Violation: Expected drag drop context" (#22392, #22792).
|
|
28
|
+
'react-dnd',
|
|
29
|
+
'react-dnd-html5-backend'
|
|
20
30
|
];
|
|
21
31
|
/**
|
|
22
32
|
* Modules passed to Vite resolve.dedupe (and aliased): the admin alias modules plus the
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-vite-alias-modules.mjs","sources":["../../../../src/node/core/admin-vite-alias-modules.ts"],"sourcesContent":["import { ADMIN_VITE_SINGLETON_MODULES } from './admin-vite-singleton-modules';\n\n/**\n * Modules given explicit Vite resolve aliases (and included in resolve.dedupe) for the admin bundle.\n * Single source of truth for resolution contract tests.\n *\n * @internal\n */\nexport const ADMIN_VITE_ALIAS_MODULES = [\n 'react',\n 'react-dom',\n 'react-router-dom',\n 'styled-components',\n 'react-redux',\n '@reduxjs/toolkit',\n '@strapi/design-system',\n '@radix-ui/react-tooltip',\n 'lodash',\n 'invariant',\n 'prismjs',\n] as const;\n\nexport type AdminViteAliasModule = (typeof ADMIN_VITE_ALIAS_MODULES)[number];\n\n/**\n * Modules passed to Vite resolve.dedupe (and aliased): the admin alias modules plus the\n * CodeMirror singletons, so every copy collapses onto a single runtime instance.\n */\nexport const ADMIN_VITE_DEDUPE_MODULES = [\n ...ADMIN_VITE_ALIAS_MODULES,\n ...ADMIN_VITE_SINGLETON_MODULES,\n] as const;\n\nexport { ADMIN_VITE_SINGLETON_MODULES };\n\n/**\n * Alias modules with exact versions declared in @strapi/admin dependencies (not peers).\n */\nexport const ADMIN_PINNED_ALIAS_MODULES = [\n '@reduxjs/toolkit',\n 'react-redux',\n '@strapi/design-system',\n 'lodash',\n 'invariant',\n] as const satisfies readonly AdminViteAliasModule[];\n"],"names":["ADMIN_VITE_ALIAS_MODULES","ADMIN_VITE_DEDUPE_MODULES","ADMIN_VITE_SINGLETON_MODULES"],"mappings":";;AAEA;;;;;UAMaA,wBAAAA,GAA2B;AACtC,IAAA,OAAA;AACA,IAAA,WAAA;AACA,IAAA,kBAAA;AACA,IAAA,mBAAA;AACA,IAAA,aAAA;AACA,IAAA,kBAAA;AACA,IAAA,uBAAA;AACA,IAAA,yBAAA;AACA,IAAA,QAAA;AACA,IAAA,WAAA;AACA,IAAA;;AAKF;;;UAIaC,yBAAAA,GAA4B;AACpCD,IAAAA,GAAAA,wBAAAA;AACAE,IAAAA,GAAAA;;;;;"}
|
|
1
|
+
{"version":3,"file":"admin-vite-alias-modules.mjs","sources":["../../../../src/node/core/admin-vite-alias-modules.ts"],"sourcesContent":["import { ADMIN_VITE_SINGLETON_MODULES } from './admin-vite-singleton-modules';\n\n/**\n * Modules given explicit Vite resolve aliases (and included in resolve.dedupe) for the admin bundle.\n * Single source of truth for resolution contract tests.\n *\n * @internal\n */\nexport const ADMIN_VITE_ALIAS_MODULES = [\n 'react',\n 'react-dom',\n 'react-router-dom',\n 'styled-components',\n 'react-redux',\n '@reduxjs/toolkit',\n '@strapi/design-system',\n '@radix-ui/react-tooltip',\n 'lodash',\n 'invariant',\n 'prismjs',\n // react-dnd holds its DndContext in module scope, and @strapi/admin and\n // @strapi/content-manager each declare react-dnd@16.0.1 themselves. npm hoisting collapses\n // those onto one copy, so the DndProvider rendered by @strapi/admin's AuthenticatedLayout and\n // the useDragLayer call in the content-manager layout share a context only by accident of\n // hoisting. Any tree that keeps the copies separate (pnpm's strict isolation,\n // install-strategy=nested, a plugin pinning its own react-dnd) gives them two different\n // contexts and the Content Manager crashes on mount with\n // \"Invariant Violation: Expected drag drop context\" (#22392, #22792).\n 'react-dnd',\n 'react-dnd-html5-backend',\n] as const;\n\nexport type AdminViteAliasModule = (typeof ADMIN_VITE_ALIAS_MODULES)[number];\n\n/**\n * Modules passed to Vite resolve.dedupe (and aliased): the admin alias modules plus the\n * CodeMirror singletons, so every copy collapses onto a single runtime instance.\n */\nexport const ADMIN_VITE_DEDUPE_MODULES = [\n ...ADMIN_VITE_ALIAS_MODULES,\n ...ADMIN_VITE_SINGLETON_MODULES,\n] as const;\n\nexport { ADMIN_VITE_SINGLETON_MODULES };\n\n/**\n * Alias modules with exact versions declared in @strapi/admin dependencies (not peers).\n */\nexport const ADMIN_PINNED_ALIAS_MODULES = [\n '@reduxjs/toolkit',\n 'react-redux',\n '@strapi/design-system',\n 'lodash',\n 'invariant',\n 'react-dnd',\n 'react-dnd-html5-backend',\n] as const satisfies readonly AdminViteAliasModule[];\n"],"names":["ADMIN_VITE_ALIAS_MODULES","ADMIN_VITE_DEDUPE_MODULES","ADMIN_VITE_SINGLETON_MODULES"],"mappings":";;AAEA;;;;;UAMaA,wBAAAA,GAA2B;AACtC,IAAA,OAAA;AACA,IAAA,WAAA;AACA,IAAA,kBAAA;AACA,IAAA,mBAAA;AACA,IAAA,aAAA;AACA,IAAA,kBAAA;AACA,IAAA,uBAAA;AACA,IAAA,yBAAA;AACA,IAAA,QAAA;AACA,IAAA,WAAA;AACA,IAAA,SAAA;;;;;;;;;AASA,IAAA,WAAA;AACA,IAAA;;AAKF;;;UAIaC,yBAAAA,GAA4B;AACpCD,IAAAA,GAAAA,wBAAAA;AACAE,IAAAA,GAAAA;;;;;"}
|
|
@@ -31,6 +31,16 @@ const REACT_PEER_DEPENDENCIES = new Set([
|
|
|
31
31
|
...adminViteSingletonModules.ADMIN_VITE_SINGLETON_MODULES,
|
|
32
32
|
'@strapi/strapi'
|
|
33
33
|
]);
|
|
34
|
+
/**
|
|
35
|
+
* Thin shared plugin UI kits that are known to break when Vite re-optimizes their pre-built
|
|
36
|
+
* dist (original #26944 victims). Only these names — plus packages that opt in via package.json —
|
|
37
|
+
* may be auto-excluded. Broad heuristic matching alone was too aggressive for large plugins
|
|
38
|
+
* (e.g. CKEditor) and orphaned their transitive CJS/UMD deps (#27136).
|
|
39
|
+
*
|
|
40
|
+
* @internal exported for tests
|
|
41
|
+
*/ const ADMIN_VITE_OPTIMIZE_DEPS_EXCLUDE_ALLOWLIST = new Set([
|
|
42
|
+
'strapi-design-extended'
|
|
43
|
+
]);
|
|
34
44
|
const isOfficialStrapiPackage = (name)=>name.startsWith('@strapi/');
|
|
35
45
|
const getRootPackageExport = (pkg)=>{
|
|
36
46
|
const exportsField = pkg.exports;
|
|
@@ -70,8 +80,32 @@ const getRootPackageExport = (pkg)=>{
|
|
|
70
80
|
return Array.isArray(pkg.files) && pkg.files.some((file)=>file === 'dist' || file.startsWith('dist/'));
|
|
71
81
|
};
|
|
72
82
|
/**
|
|
83
|
+
* Shape check for packages that *could* be excluded (pre-built ESM + React peer + dist).
|
|
84
|
+
* Matching alone is not enough to exclude — see {@link isEligibleForOptimizeDepsExclude}.
|
|
85
|
+
*
|
|
73
86
|
* @internal exported for tests
|
|
74
87
|
*/ const shouldExcludeFromOptimizeDeps = (pkg)=>hasReactPeerDependency(pkg) && isEsmPackage(pkg) && shipsPreBuiltDist(pkg);
|
|
88
|
+
/**
|
|
89
|
+
* Packages may opt into optimizeDeps.exclude via package.json:
|
|
90
|
+
* `{ "strapi": { "admin": { "vite": { "optimizeDepsExclude": true } } } }`
|
|
91
|
+
*
|
|
92
|
+
* @internal exported for tests
|
|
93
|
+
*/ const packageOptsIntoOptimizeDepsExclude = (pkg)=>{
|
|
94
|
+
const strapi = pkg.strapi;
|
|
95
|
+
return strapi?.admin?.vite?.optimizeDepsExclude === true;
|
|
96
|
+
};
|
|
97
|
+
/**
|
|
98
|
+
* A candidate is excluded only when it matches the UI-kit shape AND is either on the
|
|
99
|
+
* known-safe allowlist or explicitly opts in. This keeps #26944 working for thin kits
|
|
100
|
+
* without auto-excluding large editor/chart plugins (#27136).
|
|
101
|
+
*
|
|
102
|
+
* @internal exported for tests
|
|
103
|
+
*/ const isEligibleForOptimizeDepsExclude = (name, pkg)=>{
|
|
104
|
+
if (!shouldExcludeFromOptimizeDeps(pkg)) {
|
|
105
|
+
return false;
|
|
106
|
+
}
|
|
107
|
+
return ADMIN_VITE_OPTIMIZE_DEPS_EXCLUDE_ALLOWLIST.has(name) || packageOptsIntoOptimizeDepsExclude(pkg);
|
|
108
|
+
};
|
|
75
109
|
/**
|
|
76
110
|
* @internal exported for tests
|
|
77
111
|
*/ const getPluginPackageName = (modulePath)=>{
|
|
@@ -119,10 +153,13 @@ const loadAppPackageJson = async (cwd)=>{
|
|
|
119
153
|
* Strapi's React/design-system pre-bundling. Skip dep optimization so they resolve through
|
|
120
154
|
* the admin resolve aliases instead of being re-bundled by Vite.
|
|
121
155
|
*
|
|
122
|
-
* Scans app and plugin dependency trees (#26944).
|
|
156
|
+
* Scans app and plugin dependency trees (#26944). Only allowlisted or opt-in packages that
|
|
157
|
+
* also match the UI-kit shape are excluded (#27136). Official @strapi/* packages and pinned
|
|
123
158
|
* singletons are never auto-excluded — @strapi/strapi matches the heuristic but must stay on
|
|
124
159
|
* the optimizeDeps.include path (#26944, #27014).
|
|
125
160
|
*
|
|
161
|
+
* Apps can still exclude additional packages via `src/admin/vite.config` optimizeDeps.exclude.
|
|
162
|
+
*
|
|
126
163
|
* @internal
|
|
127
164
|
*/ const collectAdminOptimizeDepsExclude = async (cwd, plugins)=>{
|
|
128
165
|
const candidateNames = new Set();
|
|
@@ -146,17 +183,20 @@ const loadAppPackageJson = async (cwd)=>{
|
|
|
146
183
|
continue;
|
|
147
184
|
}
|
|
148
185
|
const pkg = await dependencies.getModule(name, cwd);
|
|
149
|
-
if (pkg &&
|
|
186
|
+
if (pkg && isEligibleForOptimizeDepsExclude(name, pkg)) {
|
|
150
187
|
exclude.push(name);
|
|
151
188
|
}
|
|
152
189
|
}
|
|
153
190
|
return exclude.sort();
|
|
154
191
|
};
|
|
155
192
|
|
|
193
|
+
exports.ADMIN_VITE_OPTIMIZE_DEPS_EXCLUDE_ALLOWLIST = ADMIN_VITE_OPTIMIZE_DEPS_EXCLUDE_ALLOWLIST;
|
|
156
194
|
exports.collectAdminOptimizeDepsExclude = collectAdminOptimizeDepsExclude;
|
|
157
195
|
exports.getPluginPackageName = getPluginPackageName;
|
|
158
196
|
exports.hasReactPeerDependency = hasReactPeerDependency;
|
|
197
|
+
exports.isEligibleForOptimizeDepsExclude = isEligibleForOptimizeDepsExclude;
|
|
159
198
|
exports.isEsmPackage = isEsmPackage;
|
|
199
|
+
exports.packageOptsIntoOptimizeDepsExclude = packageOptsIntoOptimizeDepsExclude;
|
|
160
200
|
exports.shipsPreBuiltDist = shipsPreBuiltDist;
|
|
161
201
|
exports.shouldExcludeFromOptimizeDeps = shouldExcludeFromOptimizeDeps;
|
|
162
202
|
//# sourceMappingURL=admin-vite-optimize-exclude.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-vite-optimize-exclude.js","sources":["../../../../src/node/core/admin-vite-optimize-exclude.ts"],"sourcesContent":["import path from 'node:path';\nimport fs from 'node:fs/promises';\nimport readPkgUp from 'read-pkg-up';\n\nimport { ADMIN_VITE_ALIAS_MODULES, ADMIN_VITE_SINGLETON_MODULES } from './admin-vite-alias-modules';\nimport { getModule, type PackageJson } from './dependencies';\nimport type { PluginMeta } from './plugins';\n\nconst REACT_PEER_DEPENDENCIES = new Set(['react', 'react-dom']);\n\n/**\n * Packages explicitly pre-bundled or aliased for the admin singleton contract.\n * Never auto-exclude these — they must stay on the optimizeDeps.include / dedupe path.\n *\n * The admin entry host (@strapi/strapi) must never land in optimizeDeps.exclude (#26944, #27014).\n * CJS-only deps imported by @strapi/admin (e.g. invariant, lodash) belong in optimizeDeps.include\n * (see vite/config.ts — #26964, #26944, #27014).\n * The CodeMirror singletons (e.g. @uiw/react-codemirror — ESM with a React peer) match the\n * exclude heuristic but must stay pre-bundled so the admin keeps a single instance\n */\nconst PINNED_OPTIMIZE_MODULES = new Set<string>([\n ...ADMIN_VITE_ALIAS_MODULES,\n ...ADMIN_VITE_SINGLETON_MODULES,\n '@strapi/strapi',\n]);\n\nconst isOfficialStrapiPackage = (name: string): boolean => name.startsWith('@strapi/');\n\ntype PackageExportEntry =\n | string\n | {\n import?: string;\n require?: string;\n default?: string;\n };\n\nconst getRootPackageExport = (pkg: PackageJson): PackageExportEntry | undefined => {\n const exportsField = pkg.exports as Record<string, PackageExportEntry> | string | undefined;\n\n if (!exportsField || typeof exportsField === 'string') {\n return undefined;\n }\n\n return exportsField['.'];\n};\n\n/**\n * @internal exported for tests\n */\nexport const isEsmPackage = (pkg: PackageJson): boolean => {\n if (pkg.type === 'module') {\n return true;\n }\n\n const rootExport = getRootPackageExport(pkg);\n\n return (\n typeof rootExport === 'object' &&\n rootExport !== null &&\n 'import' in rootExport &&\n typeof rootExport.import === 'string'\n );\n};\n\n/**\n * @internal exported for tests\n */\nexport const hasReactPeerDependency = (pkg: PackageJson): boolean =>\n Object.keys(pkg.peerDependencies ?? {}).some((name) => REACT_PEER_DEPENDENCIES.has(name));\n\n/**\n * Targets libraries that ship a pre-built dist bundle (e.g. plugin UI kits) rather than\n * source packages like react-intl that still benefit from Vite's dep optimizer.\n *\n * @internal exported for tests\n */\nexport const shipsPreBuiltDist = (pkg: PackageJson): boolean => {\n const rootExport = getRootPackageExport(pkg);\n const exportImport =\n typeof rootExport === 'object' && rootExport !== null && 'import' in rootExport\n ? rootExport.import\n : undefined;\n\n const entryPaths = [pkg.module, pkg.main, exportImport].filter(\n (entry): entry is string => typeof entry === 'string'\n );\n\n if (\n entryPaths.some(\n (entry) =>\n entry.includes('/dist/') || entry.startsWith('./dist/') || entry.startsWith('dist/')\n )\n ) {\n return true;\n }\n\n return (\n Array.isArray(pkg.files) &&\n pkg.files.some((file) => file === 'dist' || file.startsWith('dist/'))\n );\n};\n\n/**\n * @internal exported for tests\n */\nexport const shouldExcludeFromOptimizeDeps = (pkg: PackageJson): boolean =>\n hasReactPeerDependency(pkg) && isEsmPackage(pkg) && shipsPreBuiltDist(pkg);\n\n/**\n * @internal exported for tests\n */\nexport const getPluginPackageName = (modulePath: string): string => {\n if (modulePath.startsWith('@')) {\n const [scope, name] = modulePath.split('/');\n\n return `${scope}/${name}`;\n }\n\n return modulePath.split('/')[0] ?? modulePath;\n};\n\nconst collectDependencyNames = (pkg: PackageJson): string[] => {\n const names = new Set<string>();\n\n for (const section of [pkg.dependencies, pkg.devDependencies] as const) {\n if (section) {\n for (const name of Object.keys(section)) {\n names.add(name);\n }\n }\n }\n\n return [...names];\n};\n\nconst getPluginPackageJson = async (\n plugin: PluginMeta,\n cwd: string\n): Promise<PackageJson | null> => {\n if (plugin.type === 'local' && plugin.path) {\n try {\n const content = await fs.readFile(path.join(plugin.path, 'package.json'), 'utf8');\n\n return JSON.parse(content) as PackageJson;\n } catch {\n return null;\n }\n }\n\n return getModule(getPluginPackageName(plugin.modulePath), cwd);\n};\n\nconst loadAppPackageJson = async (cwd: string): Promise<PackageJson | null> => {\n const result = await readPkgUp({ cwd });\n\n return result?.packageJson ?? null;\n};\n\n/**\n * Pre-built ESM libraries with React peers (shared plugin UI kits) are incompatible with\n * Strapi's React/design-system pre-bundling. Skip dep optimization so they resolve through\n * the admin resolve aliases instead of being re-bundled by Vite.\n *\n * Scans app and plugin dependency trees (#26944). Official @strapi/* packages and pinned\n * singletons are never auto-excluded — @strapi/strapi matches the heuristic but must stay on\n * the optimizeDeps.include path (#26944, #27014).\n *\n * @internal\n */\nexport const collectAdminOptimizeDepsExclude = async (\n cwd: string,\n plugins: PluginMeta[]\n): Promise<string[]> => {\n const candidateNames = new Set<string>();\n const appPkg = await loadAppPackageJson(cwd);\n\n if (appPkg) {\n for (const name of collectDependencyNames(appPkg)) {\n candidateNames.add(name);\n }\n }\n\n for (const plugin of plugins) {\n const pluginPkg = await getPluginPackageJson(plugin, cwd);\n\n if (pluginPkg) {\n for (const name of collectDependencyNames(pluginPkg)) {\n candidateNames.add(name);\n }\n }\n }\n\n const exclude: string[] = [];\n\n for (const name of candidateNames) {\n if (PINNED_OPTIMIZE_MODULES.has(name) || isOfficialStrapiPackage(name)) {\n continue;\n }\n\n const pkg = await getModule(name, cwd);\n\n if (pkg && shouldExcludeFromOptimizeDeps(pkg)) {\n exclude.push(name);\n }\n }\n\n return exclude.sort();\n};\n"],"names":["REACT_PEER_DEPENDENCIES","Set","PINNED_OPTIMIZE_MODULES","ADMIN_VITE_ALIAS_MODULES","ADMIN_VITE_SINGLETON_MODULES","isOfficialStrapiPackage","name","startsWith","getRootPackageExport","pkg","exportsField","exports","undefined","isEsmPackage","type","rootExport","import","hasReactPeerDependency","Object","keys","peerDependencies","some","has","shipsPreBuiltDist","exportImport","entryPaths","module","main","filter","entry","includes","Array","isArray","files","file","shouldExcludeFromOptimizeDeps","getPluginPackageName","modulePath","scope","split","collectDependencyNames","names","section","dependencies","devDependencies","add","getPluginPackageJson","plugin","cwd","path","content","fs","readFile","join","JSON","parse","getModule","loadAppPackageJson","result","readPkgUp","packageJson","collectAdminOptimizeDepsExclude","plugins","candidateNames","appPkg","pluginPkg","exclude","push","sort"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"admin-vite-optimize-exclude.js","sources":["../../../../src/node/core/admin-vite-optimize-exclude.ts"],"sourcesContent":["import path from 'node:path';\nimport fs from 'node:fs/promises';\nimport readPkgUp from 'read-pkg-up';\n\nimport { ADMIN_VITE_ALIAS_MODULES, ADMIN_VITE_SINGLETON_MODULES } from './admin-vite-alias-modules';\nimport { getModule, type PackageJson } from './dependencies';\nimport type { PluginMeta } from './plugins';\n\nconst REACT_PEER_DEPENDENCIES = new Set(['react', 'react-dom']);\n\n/**\n * Packages explicitly pre-bundled or aliased for the admin singleton contract.\n * Never auto-exclude these — they must stay on the optimizeDeps.include / dedupe path.\n *\n * The admin entry host (@strapi/strapi) must never land in optimizeDeps.exclude (#26944, #27014).\n * CJS-only deps imported by @strapi/admin (e.g. invariant, lodash) belong in optimizeDeps.include\n * (see vite/config.ts — #26964, #26944, #27014).\n * The CodeMirror singletons (e.g. @uiw/react-codemirror — ESM with a React peer) match the\n * exclude heuristic but must stay pre-bundled so the admin keeps a single instance\n */\nconst PINNED_OPTIMIZE_MODULES = new Set<string>([\n ...ADMIN_VITE_ALIAS_MODULES,\n ...ADMIN_VITE_SINGLETON_MODULES,\n '@strapi/strapi',\n]);\n\n/**\n * Thin shared plugin UI kits that are known to break when Vite re-optimizes their pre-built\n * dist (original #26944 victims). Only these names — plus packages that opt in via package.json —\n * may be auto-excluded. Broad heuristic matching alone was too aggressive for large plugins\n * (e.g. CKEditor) and orphaned their transitive CJS/UMD deps (#27136).\n *\n * @internal exported for tests\n */\nexport const ADMIN_VITE_OPTIMIZE_DEPS_EXCLUDE_ALLOWLIST = new Set<string>([\n 'strapi-design-extended',\n]);\n\nconst isOfficialStrapiPackage = (name: string): boolean => name.startsWith('@strapi/');\n\ntype PackageExportEntry =\n | string\n | {\n import?: string;\n require?: string;\n default?: string;\n };\n\nconst getRootPackageExport = (pkg: PackageJson): PackageExportEntry | undefined => {\n const exportsField = pkg.exports as Record<string, PackageExportEntry> | string | undefined;\n\n if (!exportsField || typeof exportsField === 'string') {\n return undefined;\n }\n\n return exportsField['.'];\n};\n\n/**\n * @internal exported for tests\n */\nexport const isEsmPackage = (pkg: PackageJson): boolean => {\n if (pkg.type === 'module') {\n return true;\n }\n\n const rootExport = getRootPackageExport(pkg);\n\n return (\n typeof rootExport === 'object' &&\n rootExport !== null &&\n 'import' in rootExport &&\n typeof rootExport.import === 'string'\n );\n};\n\n/**\n * @internal exported for tests\n */\nexport const hasReactPeerDependency = (pkg: PackageJson): boolean =>\n Object.keys(pkg.peerDependencies ?? {}).some((name) => REACT_PEER_DEPENDENCIES.has(name));\n\n/**\n * Targets libraries that ship a pre-built dist bundle (e.g. plugin UI kits) rather than\n * source packages like react-intl that still benefit from Vite's dep optimizer.\n *\n * @internal exported for tests\n */\nexport const shipsPreBuiltDist = (pkg: PackageJson): boolean => {\n const rootExport = getRootPackageExport(pkg);\n const exportImport =\n typeof rootExport === 'object' && rootExport !== null && 'import' in rootExport\n ? rootExport.import\n : undefined;\n\n const entryPaths = [pkg.module, pkg.main, exportImport].filter(\n (entry): entry is string => typeof entry === 'string'\n );\n\n if (\n entryPaths.some(\n (entry) =>\n entry.includes('/dist/') || entry.startsWith('./dist/') || entry.startsWith('dist/')\n )\n ) {\n return true;\n }\n\n return (\n Array.isArray(pkg.files) &&\n pkg.files.some((file) => file === 'dist' || file.startsWith('dist/'))\n );\n};\n\n/**\n * Shape check for packages that *could* be excluded (pre-built ESM + React peer + dist).\n * Matching alone is not enough to exclude — see {@link isEligibleForOptimizeDepsExclude}.\n *\n * @internal exported for tests\n */\nexport const shouldExcludeFromOptimizeDeps = (pkg: PackageJson): boolean =>\n hasReactPeerDependency(pkg) && isEsmPackage(pkg) && shipsPreBuiltDist(pkg);\n\ntype StrapiAdminViteMeta = {\n optimizeDepsExclude?: unknown;\n};\n\ntype StrapiPackageMeta = {\n admin?: {\n vite?: StrapiAdminViteMeta;\n };\n};\n\n/**\n * Packages may opt into optimizeDeps.exclude via package.json:\n * `{ \"strapi\": { \"admin\": { \"vite\": { \"optimizeDepsExclude\": true } } } }`\n *\n * @internal exported for tests\n */\nexport const packageOptsIntoOptimizeDepsExclude = (pkg: PackageJson): boolean => {\n const strapi = (pkg as PackageJson & { strapi?: StrapiPackageMeta }).strapi;\n\n return strapi?.admin?.vite?.optimizeDepsExclude === true;\n};\n\n/**\n * A candidate is excluded only when it matches the UI-kit shape AND is either on the\n * known-safe allowlist or explicitly opts in. This keeps #26944 working for thin kits\n * without auto-excluding large editor/chart plugins (#27136).\n *\n * @internal exported for tests\n */\nexport const isEligibleForOptimizeDepsExclude = (name: string, pkg: PackageJson): boolean => {\n if (!shouldExcludeFromOptimizeDeps(pkg)) {\n return false;\n }\n\n return (\n ADMIN_VITE_OPTIMIZE_DEPS_EXCLUDE_ALLOWLIST.has(name) || packageOptsIntoOptimizeDepsExclude(pkg)\n );\n};\n\n/**\n * @internal exported for tests\n */\nexport const getPluginPackageName = (modulePath: string): string => {\n if (modulePath.startsWith('@')) {\n const [scope, name] = modulePath.split('/');\n\n return `${scope}/${name}`;\n }\n\n return modulePath.split('/')[0] ?? modulePath;\n};\n\nconst collectDependencyNames = (pkg: PackageJson): string[] => {\n const names = new Set<string>();\n\n for (const section of [pkg.dependencies, pkg.devDependencies] as const) {\n if (section) {\n for (const name of Object.keys(section)) {\n names.add(name);\n }\n }\n }\n\n return [...names];\n};\n\nconst getPluginPackageJson = async (\n plugin: PluginMeta,\n cwd: string\n): Promise<PackageJson | null> => {\n if (plugin.type === 'local' && plugin.path) {\n try {\n const content = await fs.readFile(path.join(plugin.path, 'package.json'), 'utf8');\n\n return JSON.parse(content) as PackageJson;\n } catch {\n return null;\n }\n }\n\n return getModule(getPluginPackageName(plugin.modulePath), cwd);\n};\n\nconst loadAppPackageJson = async (cwd: string): Promise<PackageJson | null> => {\n const result = await readPkgUp({ cwd });\n\n return result?.packageJson ?? null;\n};\n\n/**\n * Pre-built ESM libraries with React peers (shared plugin UI kits) are incompatible with\n * Strapi's React/design-system pre-bundling. Skip dep optimization so they resolve through\n * the admin resolve aliases instead of being re-bundled by Vite.\n *\n * Scans app and plugin dependency trees (#26944). Only allowlisted or opt-in packages that\n * also match the UI-kit shape are excluded (#27136). Official @strapi/* packages and pinned\n * singletons are never auto-excluded — @strapi/strapi matches the heuristic but must stay on\n * the optimizeDeps.include path (#26944, #27014).\n *\n * Apps can still exclude additional packages via `src/admin/vite.config` optimizeDeps.exclude.\n *\n * @internal\n */\nexport const collectAdminOptimizeDepsExclude = async (\n cwd: string,\n plugins: PluginMeta[]\n): Promise<string[]> => {\n const candidateNames = new Set<string>();\n const appPkg = await loadAppPackageJson(cwd);\n\n if (appPkg) {\n for (const name of collectDependencyNames(appPkg)) {\n candidateNames.add(name);\n }\n }\n\n for (const plugin of plugins) {\n const pluginPkg = await getPluginPackageJson(plugin, cwd);\n\n if (pluginPkg) {\n for (const name of collectDependencyNames(pluginPkg)) {\n candidateNames.add(name);\n }\n }\n }\n\n const exclude: string[] = [];\n\n for (const name of candidateNames) {\n if (PINNED_OPTIMIZE_MODULES.has(name) || isOfficialStrapiPackage(name)) {\n continue;\n }\n\n const pkg = await getModule(name, cwd);\n\n if (pkg && isEligibleForOptimizeDepsExclude(name, pkg)) {\n exclude.push(name);\n }\n }\n\n return exclude.sort();\n};\n"],"names":["REACT_PEER_DEPENDENCIES","Set","PINNED_OPTIMIZE_MODULES","ADMIN_VITE_ALIAS_MODULES","ADMIN_VITE_SINGLETON_MODULES","ADMIN_VITE_OPTIMIZE_DEPS_EXCLUDE_ALLOWLIST","isOfficialStrapiPackage","name","startsWith","getRootPackageExport","pkg","exportsField","exports","undefined","isEsmPackage","type","rootExport","import","hasReactPeerDependency","Object","keys","peerDependencies","some","has","shipsPreBuiltDist","exportImport","entryPaths","module","main","filter","entry","includes","Array","isArray","files","file","shouldExcludeFromOptimizeDeps","packageOptsIntoOptimizeDepsExclude","strapi","admin","vite","optimizeDepsExclude","isEligibleForOptimizeDepsExclude","getPluginPackageName","modulePath","scope","split","collectDependencyNames","names","section","dependencies","devDependencies","add","getPluginPackageJson","plugin","cwd","path","content","fs","readFile","join","JSON","parse","getModule","loadAppPackageJson","result","readPkgUp","packageJson","collectAdminOptimizeDepsExclude","plugins","candidateNames","appPkg","pluginPkg","exclude","push","sort"],"mappings":"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"}
|
|
@@ -23,6 +23,16 @@ const REACT_PEER_DEPENDENCIES = new Set([
|
|
|
23
23
|
...ADMIN_VITE_SINGLETON_MODULES,
|
|
24
24
|
'@strapi/strapi'
|
|
25
25
|
]);
|
|
26
|
+
/**
|
|
27
|
+
* Thin shared plugin UI kits that are known to break when Vite re-optimizes their pre-built
|
|
28
|
+
* dist (original #26944 victims). Only these names — plus packages that opt in via package.json —
|
|
29
|
+
* may be auto-excluded. Broad heuristic matching alone was too aggressive for large plugins
|
|
30
|
+
* (e.g. CKEditor) and orphaned their transitive CJS/UMD deps (#27136).
|
|
31
|
+
*
|
|
32
|
+
* @internal exported for tests
|
|
33
|
+
*/ const ADMIN_VITE_OPTIMIZE_DEPS_EXCLUDE_ALLOWLIST = new Set([
|
|
34
|
+
'strapi-design-extended'
|
|
35
|
+
]);
|
|
26
36
|
const isOfficialStrapiPackage = (name)=>name.startsWith('@strapi/');
|
|
27
37
|
const getRootPackageExport = (pkg)=>{
|
|
28
38
|
const exportsField = pkg.exports;
|
|
@@ -62,8 +72,32 @@ const getRootPackageExport = (pkg)=>{
|
|
|
62
72
|
return Array.isArray(pkg.files) && pkg.files.some((file)=>file === 'dist' || file.startsWith('dist/'));
|
|
63
73
|
};
|
|
64
74
|
/**
|
|
75
|
+
* Shape check for packages that *could* be excluded (pre-built ESM + React peer + dist).
|
|
76
|
+
* Matching alone is not enough to exclude — see {@link isEligibleForOptimizeDepsExclude}.
|
|
77
|
+
*
|
|
65
78
|
* @internal exported for tests
|
|
66
79
|
*/ const shouldExcludeFromOptimizeDeps = (pkg)=>hasReactPeerDependency(pkg) && isEsmPackage(pkg) && shipsPreBuiltDist(pkg);
|
|
80
|
+
/**
|
|
81
|
+
* Packages may opt into optimizeDeps.exclude via package.json:
|
|
82
|
+
* `{ "strapi": { "admin": { "vite": { "optimizeDepsExclude": true } } } }`
|
|
83
|
+
*
|
|
84
|
+
* @internal exported for tests
|
|
85
|
+
*/ const packageOptsIntoOptimizeDepsExclude = (pkg)=>{
|
|
86
|
+
const strapi = pkg.strapi;
|
|
87
|
+
return strapi?.admin?.vite?.optimizeDepsExclude === true;
|
|
88
|
+
};
|
|
89
|
+
/**
|
|
90
|
+
* A candidate is excluded only when it matches the UI-kit shape AND is either on the
|
|
91
|
+
* known-safe allowlist or explicitly opts in. This keeps #26944 working for thin kits
|
|
92
|
+
* without auto-excluding large editor/chart plugins (#27136).
|
|
93
|
+
*
|
|
94
|
+
* @internal exported for tests
|
|
95
|
+
*/ const isEligibleForOptimizeDepsExclude = (name, pkg)=>{
|
|
96
|
+
if (!shouldExcludeFromOptimizeDeps(pkg)) {
|
|
97
|
+
return false;
|
|
98
|
+
}
|
|
99
|
+
return ADMIN_VITE_OPTIMIZE_DEPS_EXCLUDE_ALLOWLIST.has(name) || packageOptsIntoOptimizeDepsExclude(pkg);
|
|
100
|
+
};
|
|
67
101
|
/**
|
|
68
102
|
* @internal exported for tests
|
|
69
103
|
*/ const getPluginPackageName = (modulePath)=>{
|
|
@@ -111,10 +145,13 @@ const loadAppPackageJson = async (cwd)=>{
|
|
|
111
145
|
* Strapi's React/design-system pre-bundling. Skip dep optimization so they resolve through
|
|
112
146
|
* the admin resolve aliases instead of being re-bundled by Vite.
|
|
113
147
|
*
|
|
114
|
-
* Scans app and plugin dependency trees (#26944).
|
|
148
|
+
* Scans app and plugin dependency trees (#26944). Only allowlisted or opt-in packages that
|
|
149
|
+
* also match the UI-kit shape are excluded (#27136). Official @strapi/* packages and pinned
|
|
115
150
|
* singletons are never auto-excluded — @strapi/strapi matches the heuristic but must stay on
|
|
116
151
|
* the optimizeDeps.include path (#26944, #27014).
|
|
117
152
|
*
|
|
153
|
+
* Apps can still exclude additional packages via `src/admin/vite.config` optimizeDeps.exclude.
|
|
154
|
+
*
|
|
118
155
|
* @internal
|
|
119
156
|
*/ const collectAdminOptimizeDepsExclude = async (cwd, plugins)=>{
|
|
120
157
|
const candidateNames = new Set();
|
|
@@ -138,12 +175,12 @@ const loadAppPackageJson = async (cwd)=>{
|
|
|
138
175
|
continue;
|
|
139
176
|
}
|
|
140
177
|
const pkg = await getModule(name, cwd);
|
|
141
|
-
if (pkg &&
|
|
178
|
+
if (pkg && isEligibleForOptimizeDepsExclude(name, pkg)) {
|
|
142
179
|
exclude.push(name);
|
|
143
180
|
}
|
|
144
181
|
}
|
|
145
182
|
return exclude.sort();
|
|
146
183
|
};
|
|
147
184
|
|
|
148
|
-
export { collectAdminOptimizeDepsExclude, getPluginPackageName, hasReactPeerDependency, isEsmPackage, shipsPreBuiltDist, shouldExcludeFromOptimizeDeps };
|
|
185
|
+
export { ADMIN_VITE_OPTIMIZE_DEPS_EXCLUDE_ALLOWLIST, collectAdminOptimizeDepsExclude, getPluginPackageName, hasReactPeerDependency, isEligibleForOptimizeDepsExclude, isEsmPackage, packageOptsIntoOptimizeDepsExclude, shipsPreBuiltDist, shouldExcludeFromOptimizeDeps };
|
|
149
186
|
//# sourceMappingURL=admin-vite-optimize-exclude.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"admin-vite-optimize-exclude.mjs","sources":["../../../../src/node/core/admin-vite-optimize-exclude.ts"],"sourcesContent":["import path from 'node:path';\nimport fs from 'node:fs/promises';\nimport readPkgUp from 'read-pkg-up';\n\nimport { ADMIN_VITE_ALIAS_MODULES, ADMIN_VITE_SINGLETON_MODULES } from './admin-vite-alias-modules';\nimport { getModule, type PackageJson } from './dependencies';\nimport type { PluginMeta } from './plugins';\n\nconst REACT_PEER_DEPENDENCIES = new Set(['react', 'react-dom']);\n\n/**\n * Packages explicitly pre-bundled or aliased for the admin singleton contract.\n * Never auto-exclude these — they must stay on the optimizeDeps.include / dedupe path.\n *\n * The admin entry host (@strapi/strapi) must never land in optimizeDeps.exclude (#26944, #27014).\n * CJS-only deps imported by @strapi/admin (e.g. invariant, lodash) belong in optimizeDeps.include\n * (see vite/config.ts — #26964, #26944, #27014).\n * The CodeMirror singletons (e.g. @uiw/react-codemirror — ESM with a React peer) match the\n * exclude heuristic but must stay pre-bundled so the admin keeps a single instance\n */\nconst PINNED_OPTIMIZE_MODULES = new Set<string>([\n ...ADMIN_VITE_ALIAS_MODULES,\n ...ADMIN_VITE_SINGLETON_MODULES,\n '@strapi/strapi',\n]);\n\nconst isOfficialStrapiPackage = (name: string): boolean => name.startsWith('@strapi/');\n\ntype PackageExportEntry =\n | string\n | {\n import?: string;\n require?: string;\n default?: string;\n };\n\nconst getRootPackageExport = (pkg: PackageJson): PackageExportEntry | undefined => {\n const exportsField = pkg.exports as Record<string, PackageExportEntry> | string | undefined;\n\n if (!exportsField || typeof exportsField === 'string') {\n return undefined;\n }\n\n return exportsField['.'];\n};\n\n/**\n * @internal exported for tests\n */\nexport const isEsmPackage = (pkg: PackageJson): boolean => {\n if (pkg.type === 'module') {\n return true;\n }\n\n const rootExport = getRootPackageExport(pkg);\n\n return (\n typeof rootExport === 'object' &&\n rootExport !== null &&\n 'import' in rootExport &&\n typeof rootExport.import === 'string'\n );\n};\n\n/**\n * @internal exported for tests\n */\nexport const hasReactPeerDependency = (pkg: PackageJson): boolean =>\n Object.keys(pkg.peerDependencies ?? {}).some((name) => REACT_PEER_DEPENDENCIES.has(name));\n\n/**\n * Targets libraries that ship a pre-built dist bundle (e.g. plugin UI kits) rather than\n * source packages like react-intl that still benefit from Vite's dep optimizer.\n *\n * @internal exported for tests\n */\nexport const shipsPreBuiltDist = (pkg: PackageJson): boolean => {\n const rootExport = getRootPackageExport(pkg);\n const exportImport =\n typeof rootExport === 'object' && rootExport !== null && 'import' in rootExport\n ? rootExport.import\n : undefined;\n\n const entryPaths = [pkg.module, pkg.main, exportImport].filter(\n (entry): entry is string => typeof entry === 'string'\n );\n\n if (\n entryPaths.some(\n (entry) =>\n entry.includes('/dist/') || entry.startsWith('./dist/') || entry.startsWith('dist/')\n )\n ) {\n return true;\n }\n\n return (\n Array.isArray(pkg.files) &&\n pkg.files.some((file) => file === 'dist' || file.startsWith('dist/'))\n );\n};\n\n/**\n * @internal exported for tests\n */\nexport const shouldExcludeFromOptimizeDeps = (pkg: PackageJson): boolean =>\n hasReactPeerDependency(pkg) && isEsmPackage(pkg) && shipsPreBuiltDist(pkg);\n\n/**\n * @internal exported for tests\n */\nexport const getPluginPackageName = (modulePath: string): string => {\n if (modulePath.startsWith('@')) {\n const [scope, name] = modulePath.split('/');\n\n return `${scope}/${name}`;\n }\n\n return modulePath.split('/')[0] ?? modulePath;\n};\n\nconst collectDependencyNames = (pkg: PackageJson): string[] => {\n const names = new Set<string>();\n\n for (const section of [pkg.dependencies, pkg.devDependencies] as const) {\n if (section) {\n for (const name of Object.keys(section)) {\n names.add(name);\n }\n }\n }\n\n return [...names];\n};\n\nconst getPluginPackageJson = async (\n plugin: PluginMeta,\n cwd: string\n): Promise<PackageJson | null> => {\n if (plugin.type === 'local' && plugin.path) {\n try {\n const content = await fs.readFile(path.join(plugin.path, 'package.json'), 'utf8');\n\n return JSON.parse(content) as PackageJson;\n } catch {\n return null;\n }\n }\n\n return getModule(getPluginPackageName(plugin.modulePath), cwd);\n};\n\nconst loadAppPackageJson = async (cwd: string): Promise<PackageJson | null> => {\n const result = await readPkgUp({ cwd });\n\n return result?.packageJson ?? null;\n};\n\n/**\n * Pre-built ESM libraries with React peers (shared plugin UI kits) are incompatible with\n * Strapi's React/design-system pre-bundling. Skip dep optimization so they resolve through\n * the admin resolve aliases instead of being re-bundled by Vite.\n *\n * Scans app and plugin dependency trees (#26944). Official @strapi/* packages and pinned\n * singletons are never auto-excluded — @strapi/strapi matches the heuristic but must stay on\n * the optimizeDeps.include path (#26944, #27014).\n *\n * @internal\n */\nexport const collectAdminOptimizeDepsExclude = async (\n cwd: string,\n plugins: PluginMeta[]\n): Promise<string[]> => {\n const candidateNames = new Set<string>();\n const appPkg = await loadAppPackageJson(cwd);\n\n if (appPkg) {\n for (const name of collectDependencyNames(appPkg)) {\n candidateNames.add(name);\n }\n }\n\n for (const plugin of plugins) {\n const pluginPkg = await getPluginPackageJson(plugin, cwd);\n\n if (pluginPkg) {\n for (const name of collectDependencyNames(pluginPkg)) {\n candidateNames.add(name);\n }\n }\n }\n\n const exclude: string[] = [];\n\n for (const name of candidateNames) {\n if (PINNED_OPTIMIZE_MODULES.has(name) || isOfficialStrapiPackage(name)) {\n continue;\n }\n\n const pkg = await getModule(name, cwd);\n\n if (pkg && shouldExcludeFromOptimizeDeps(pkg)) {\n exclude.push(name);\n }\n }\n\n return exclude.sort();\n};\n"],"names":["REACT_PEER_DEPENDENCIES","Set","PINNED_OPTIMIZE_MODULES","ADMIN_VITE_ALIAS_MODULES","ADMIN_VITE_SINGLETON_MODULES","isOfficialStrapiPackage","name","startsWith","getRootPackageExport","pkg","exportsField","exports","undefined","isEsmPackage","type","rootExport","import","hasReactPeerDependency","Object","keys","peerDependencies","some","has","shipsPreBuiltDist","exportImport","entryPaths","module","main","filter","entry","includes","Array","isArray","files","file","shouldExcludeFromOptimizeDeps","getPluginPackageName","modulePath","scope","split","collectDependencyNames","names","section","dependencies","devDependencies","add","getPluginPackageJson","plugin","cwd","path","content","fs","readFile","join","JSON","parse","getModule","loadAppPackageJson","result","readPkgUp","packageJson","collectAdminOptimizeDepsExclude","plugins","candidateNames","appPkg","pluginPkg","exclude","push","sort"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"admin-vite-optimize-exclude.mjs","sources":["../../../../src/node/core/admin-vite-optimize-exclude.ts"],"sourcesContent":["import path from 'node:path';\nimport fs from 'node:fs/promises';\nimport readPkgUp from 'read-pkg-up';\n\nimport { ADMIN_VITE_ALIAS_MODULES, ADMIN_VITE_SINGLETON_MODULES } from './admin-vite-alias-modules';\nimport { getModule, type PackageJson } from './dependencies';\nimport type { PluginMeta } from './plugins';\n\nconst REACT_PEER_DEPENDENCIES = new Set(['react', 'react-dom']);\n\n/**\n * Packages explicitly pre-bundled or aliased for the admin singleton contract.\n * Never auto-exclude these — they must stay on the optimizeDeps.include / dedupe path.\n *\n * The admin entry host (@strapi/strapi) must never land in optimizeDeps.exclude (#26944, #27014).\n * CJS-only deps imported by @strapi/admin (e.g. invariant, lodash) belong in optimizeDeps.include\n * (see vite/config.ts — #26964, #26944, #27014).\n * The CodeMirror singletons (e.g. @uiw/react-codemirror — ESM with a React peer) match the\n * exclude heuristic but must stay pre-bundled so the admin keeps a single instance\n */\nconst PINNED_OPTIMIZE_MODULES = new Set<string>([\n ...ADMIN_VITE_ALIAS_MODULES,\n ...ADMIN_VITE_SINGLETON_MODULES,\n '@strapi/strapi',\n]);\n\n/**\n * Thin shared plugin UI kits that are known to break when Vite re-optimizes their pre-built\n * dist (original #26944 victims). Only these names — plus packages that opt in via package.json —\n * may be auto-excluded. Broad heuristic matching alone was too aggressive for large plugins\n * (e.g. CKEditor) and orphaned their transitive CJS/UMD deps (#27136).\n *\n * @internal exported for tests\n */\nexport const ADMIN_VITE_OPTIMIZE_DEPS_EXCLUDE_ALLOWLIST = new Set<string>([\n 'strapi-design-extended',\n]);\n\nconst isOfficialStrapiPackage = (name: string): boolean => name.startsWith('@strapi/');\n\ntype PackageExportEntry =\n | string\n | {\n import?: string;\n require?: string;\n default?: string;\n };\n\nconst getRootPackageExport = (pkg: PackageJson): PackageExportEntry | undefined => {\n const exportsField = pkg.exports as Record<string, PackageExportEntry> | string | undefined;\n\n if (!exportsField || typeof exportsField === 'string') {\n return undefined;\n }\n\n return exportsField['.'];\n};\n\n/**\n * @internal exported for tests\n */\nexport const isEsmPackage = (pkg: PackageJson): boolean => {\n if (pkg.type === 'module') {\n return true;\n }\n\n const rootExport = getRootPackageExport(pkg);\n\n return (\n typeof rootExport === 'object' &&\n rootExport !== null &&\n 'import' in rootExport &&\n typeof rootExport.import === 'string'\n );\n};\n\n/**\n * @internal exported for tests\n */\nexport const hasReactPeerDependency = (pkg: PackageJson): boolean =>\n Object.keys(pkg.peerDependencies ?? {}).some((name) => REACT_PEER_DEPENDENCIES.has(name));\n\n/**\n * Targets libraries that ship a pre-built dist bundle (e.g. plugin UI kits) rather than\n * source packages like react-intl that still benefit from Vite's dep optimizer.\n *\n * @internal exported for tests\n */\nexport const shipsPreBuiltDist = (pkg: PackageJson): boolean => {\n const rootExport = getRootPackageExport(pkg);\n const exportImport =\n typeof rootExport === 'object' && rootExport !== null && 'import' in rootExport\n ? rootExport.import\n : undefined;\n\n const entryPaths = [pkg.module, pkg.main, exportImport].filter(\n (entry): entry is string => typeof entry === 'string'\n );\n\n if (\n entryPaths.some(\n (entry) =>\n entry.includes('/dist/') || entry.startsWith('./dist/') || entry.startsWith('dist/')\n )\n ) {\n return true;\n }\n\n return (\n Array.isArray(pkg.files) &&\n pkg.files.some((file) => file === 'dist' || file.startsWith('dist/'))\n );\n};\n\n/**\n * Shape check for packages that *could* be excluded (pre-built ESM + React peer + dist).\n * Matching alone is not enough to exclude — see {@link isEligibleForOptimizeDepsExclude}.\n *\n * @internal exported for tests\n */\nexport const shouldExcludeFromOptimizeDeps = (pkg: PackageJson): boolean =>\n hasReactPeerDependency(pkg) && isEsmPackage(pkg) && shipsPreBuiltDist(pkg);\n\ntype StrapiAdminViteMeta = {\n optimizeDepsExclude?: unknown;\n};\n\ntype StrapiPackageMeta = {\n admin?: {\n vite?: StrapiAdminViteMeta;\n };\n};\n\n/**\n * Packages may opt into optimizeDeps.exclude via package.json:\n * `{ \"strapi\": { \"admin\": { \"vite\": { \"optimizeDepsExclude\": true } } } }`\n *\n * @internal exported for tests\n */\nexport const packageOptsIntoOptimizeDepsExclude = (pkg: PackageJson): boolean => {\n const strapi = (pkg as PackageJson & { strapi?: StrapiPackageMeta }).strapi;\n\n return strapi?.admin?.vite?.optimizeDepsExclude === true;\n};\n\n/**\n * A candidate is excluded only when it matches the UI-kit shape AND is either on the\n * known-safe allowlist or explicitly opts in. This keeps #26944 working for thin kits\n * without auto-excluding large editor/chart plugins (#27136).\n *\n * @internal exported for tests\n */\nexport const isEligibleForOptimizeDepsExclude = (name: string, pkg: PackageJson): boolean => {\n if (!shouldExcludeFromOptimizeDeps(pkg)) {\n return false;\n }\n\n return (\n ADMIN_VITE_OPTIMIZE_DEPS_EXCLUDE_ALLOWLIST.has(name) || packageOptsIntoOptimizeDepsExclude(pkg)\n );\n};\n\n/**\n * @internal exported for tests\n */\nexport const getPluginPackageName = (modulePath: string): string => {\n if (modulePath.startsWith('@')) {\n const [scope, name] = modulePath.split('/');\n\n return `${scope}/${name}`;\n }\n\n return modulePath.split('/')[0] ?? modulePath;\n};\n\nconst collectDependencyNames = (pkg: PackageJson): string[] => {\n const names = new Set<string>();\n\n for (const section of [pkg.dependencies, pkg.devDependencies] as const) {\n if (section) {\n for (const name of Object.keys(section)) {\n names.add(name);\n }\n }\n }\n\n return [...names];\n};\n\nconst getPluginPackageJson = async (\n plugin: PluginMeta,\n cwd: string\n): Promise<PackageJson | null> => {\n if (plugin.type === 'local' && plugin.path) {\n try {\n const content = await fs.readFile(path.join(plugin.path, 'package.json'), 'utf8');\n\n return JSON.parse(content) as PackageJson;\n } catch {\n return null;\n }\n }\n\n return getModule(getPluginPackageName(plugin.modulePath), cwd);\n};\n\nconst loadAppPackageJson = async (cwd: string): Promise<PackageJson | null> => {\n const result = await readPkgUp({ cwd });\n\n return result?.packageJson ?? null;\n};\n\n/**\n * Pre-built ESM libraries with React peers (shared plugin UI kits) are incompatible with\n * Strapi's React/design-system pre-bundling. Skip dep optimization so they resolve through\n * the admin resolve aliases instead of being re-bundled by Vite.\n *\n * Scans app and plugin dependency trees (#26944). Only allowlisted or opt-in packages that\n * also match the UI-kit shape are excluded (#27136). Official @strapi/* packages and pinned\n * singletons are never auto-excluded — @strapi/strapi matches the heuristic but must stay on\n * the optimizeDeps.include path (#26944, #27014).\n *\n * Apps can still exclude additional packages via `src/admin/vite.config` optimizeDeps.exclude.\n *\n * @internal\n */\nexport const collectAdminOptimizeDepsExclude = async (\n cwd: string,\n plugins: PluginMeta[]\n): Promise<string[]> => {\n const candidateNames = new Set<string>();\n const appPkg = await loadAppPackageJson(cwd);\n\n if (appPkg) {\n for (const name of collectDependencyNames(appPkg)) {\n candidateNames.add(name);\n }\n }\n\n for (const plugin of plugins) {\n const pluginPkg = await getPluginPackageJson(plugin, cwd);\n\n if (pluginPkg) {\n for (const name of collectDependencyNames(pluginPkg)) {\n candidateNames.add(name);\n }\n }\n }\n\n const exclude: string[] = [];\n\n for (const name of candidateNames) {\n if (PINNED_OPTIMIZE_MODULES.has(name) || isOfficialStrapiPackage(name)) {\n continue;\n }\n\n const pkg = await getModule(name, cwd);\n\n if (pkg && isEligibleForOptimizeDepsExclude(name, pkg)) {\n exclude.push(name);\n }\n }\n\n return exclude.sort();\n};\n"],"names":["REACT_PEER_DEPENDENCIES","Set","PINNED_OPTIMIZE_MODULES","ADMIN_VITE_ALIAS_MODULES","ADMIN_VITE_SINGLETON_MODULES","ADMIN_VITE_OPTIMIZE_DEPS_EXCLUDE_ALLOWLIST","isOfficialStrapiPackage","name","startsWith","getRootPackageExport","pkg","exportsField","exports","undefined","isEsmPackage","type","rootExport","import","hasReactPeerDependency","Object","keys","peerDependencies","some","has","shipsPreBuiltDist","exportImport","entryPaths","module","main","filter","entry","includes","Array","isArray","files","file","shouldExcludeFromOptimizeDeps","packageOptsIntoOptimizeDepsExclude","strapi","admin","vite","optimizeDepsExclude","isEligibleForOptimizeDepsExclude","getPluginPackageName","modulePath","scope","split","collectDependencyNames","names","section","dependencies","devDependencies","add","getPluginPackageJson","plugin","cwd","path","content","fs","readFile","join","JSON","parse","getModule","loadAppPackageJson","result","readPkgUp","packageJson","collectAdminOptimizeDepsExclude","plugins","candidateNames","appPkg","pluginPkg","exclude","push","sort"],"mappings":"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"}
|
|
@@ -127,7 +127,7 @@ const reportMissingAdminPeerDeps = (logger, missing)=>{
|
|
|
127
127
|
let minDeclaredVersion = null;
|
|
128
128
|
try {
|
|
129
129
|
minDeclaredVersion = semver__default.default.minVersion(dep.declaredVersion);
|
|
130
|
-
} catch
|
|
130
|
+
} catch {
|
|
131
131
|
// Intentional fall-through (variable will be left as null, throwing below)
|
|
132
132
|
}
|
|
133
133
|
if (!minDeclaredVersion) {
|