@strapi/strapi 5.37.1 → 5.38.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.
Files changed (151) hide show
  1. package/dist/admin.js.map +1 -1
  2. package/dist/admin.mjs.map +1 -1
  3. package/dist/cli.js.map +1 -1
  4. package/dist/cli.mjs.map +1 -1
  5. package/dist/node/core/linked-packages.d.ts +15 -0
  6. package/dist/node/core/linked-packages.d.ts.map +1 -0
  7. package/dist/node/core/resolve-module.d.ts +8 -0
  8. package/dist/node/core/resolve-module.d.ts.map +1 -0
  9. package/dist/node/vite/config.d.ts.map +1 -1
  10. package/dist/node/webpack/config.d.ts.map +1 -1
  11. package/dist/package.json.js +1 -1
  12. package/dist/package.json.mjs +1 -1
  13. package/dist/src/cli/commands/admin/create-user.js.map +1 -1
  14. package/dist/src/cli/commands/admin/create-user.mjs.map +1 -1
  15. package/dist/src/cli/commands/admin/reset-user-password.js.map +1 -1
  16. package/dist/src/cli/commands/admin/reset-user-password.mjs.map +1 -1
  17. package/dist/src/cli/commands/build.js.map +1 -1
  18. package/dist/src/cli/commands/build.mjs.map +1 -1
  19. package/dist/src/cli/commands/components/list.js.map +1 -1
  20. package/dist/src/cli/commands/components/list.mjs.map +1 -1
  21. package/dist/src/cli/commands/configuration/dump.js.map +1 -1
  22. package/dist/src/cli/commands/configuration/dump.mjs.map +1 -1
  23. package/dist/src/cli/commands/configuration/restore.js.map +1 -1
  24. package/dist/src/cli/commands/configuration/restore.mjs.map +1 -1
  25. package/dist/src/cli/commands/console.js.map +1 -1
  26. package/dist/src/cli/commands/console.mjs.map +1 -1
  27. package/dist/src/cli/commands/content-types/list.js.map +1 -1
  28. package/dist/src/cli/commands/content-types/list.mjs.map +1 -1
  29. package/dist/src/cli/commands/controllers/list.js.map +1 -1
  30. package/dist/src/cli/commands/controllers/list.mjs.map +1 -1
  31. package/dist/src/cli/commands/develop.js.map +1 -1
  32. package/dist/src/cli/commands/develop.mjs.map +1 -1
  33. package/dist/src/cli/commands/export/action.js +19 -19
  34. package/dist/src/cli/commands/export/action.js.map +1 -1
  35. package/dist/src/cli/commands/export/action.mjs +1 -1
  36. package/dist/src/cli/commands/export/action.mjs.map +1 -1
  37. package/dist/src/cli/commands/export/command.js.map +1 -1
  38. package/dist/src/cli/commands/export/command.mjs.map +1 -1
  39. package/dist/src/cli/commands/generate.js.map +1 -1
  40. package/dist/src/cli/commands/generate.mjs.map +1 -1
  41. package/dist/src/cli/commands/hooks/list.js.map +1 -1
  42. package/dist/src/cli/commands/hooks/list.mjs.map +1 -1
  43. package/dist/src/cli/commands/import/action.js +19 -19
  44. package/dist/src/cli/commands/import/action.js.map +1 -1
  45. package/dist/src/cli/commands/import/action.mjs +1 -1
  46. package/dist/src/cli/commands/import/action.mjs.map +1 -1
  47. package/dist/src/cli/commands/import/command.js.map +1 -1
  48. package/dist/src/cli/commands/import/command.mjs.map +1 -1
  49. package/dist/src/cli/commands/index.js.map +1 -1
  50. package/dist/src/cli/commands/index.mjs.map +1 -1
  51. package/dist/src/cli/commands/middlewares/list.js.map +1 -1
  52. package/dist/src/cli/commands/middlewares/list.mjs.map +1 -1
  53. package/dist/src/cli/commands/openapi/generate.js.map +1 -1
  54. package/dist/src/cli/commands/openapi/generate.mjs.map +1 -1
  55. package/dist/src/cli/commands/openapi/index.js.map +1 -1
  56. package/dist/src/cli/commands/openapi/index.mjs.map +1 -1
  57. package/dist/src/cli/commands/policies/list.js.map +1 -1
  58. package/dist/src/cli/commands/policies/list.mjs.map +1 -1
  59. package/dist/src/cli/commands/report.js.map +1 -1
  60. package/dist/src/cli/commands/report.mjs.map +1 -1
  61. package/dist/src/cli/commands/routes/list.js.map +1 -1
  62. package/dist/src/cli/commands/routes/list.mjs.map +1 -1
  63. package/dist/src/cli/commands/services/list.js.map +1 -1
  64. package/dist/src/cli/commands/services/list.mjs.map +1 -1
  65. package/dist/src/cli/commands/start.js.map +1 -1
  66. package/dist/src/cli/commands/start.mjs.map +1 -1
  67. package/dist/src/cli/commands/telemetry/disable.js.map +1 -1
  68. package/dist/src/cli/commands/telemetry/disable.mjs.map +1 -1
  69. package/dist/src/cli/commands/telemetry/enable.js.map +1 -1
  70. package/dist/src/cli/commands/telemetry/enable.mjs.map +1 -1
  71. package/dist/src/cli/commands/templates/generate.js.map +1 -1
  72. package/dist/src/cli/commands/templates/generate.mjs.map +1 -1
  73. package/dist/src/cli/commands/transfer/action.js +20 -20
  74. package/dist/src/cli/commands/transfer/action.js.map +1 -1
  75. package/dist/src/cli/commands/transfer/action.mjs.map +1 -1
  76. package/dist/src/cli/commands/transfer/command.js.map +1 -1
  77. package/dist/src/cli/commands/transfer/command.mjs.map +1 -1
  78. package/dist/src/cli/commands/ts/generate-types.js.map +1 -1
  79. package/dist/src/cli/commands/ts/generate-types.mjs.map +1 -1
  80. package/dist/src/cli/commands/version.js.map +1 -1
  81. package/dist/src/cli/commands/version.mjs.map +1 -1
  82. package/dist/src/cli/utils/commander.js.map +1 -1
  83. package/dist/src/cli/utils/commander.mjs.map +1 -1
  84. package/dist/src/cli/utils/data-transfer.js.map +1 -1
  85. package/dist/src/cli/utils/data-transfer.mjs +1 -1
  86. package/dist/src/cli/utils/data-transfer.mjs.map +1 -1
  87. package/dist/src/cli/utils/helpers.js.map +1 -1
  88. package/dist/src/cli/utils/helpers.mjs.map +1 -1
  89. package/dist/src/cli/utils/logger.js.map +1 -1
  90. package/dist/src/cli/utils/logger.mjs.map +1 -1
  91. package/dist/src/cli/utils/telemetry.js.map +1 -1
  92. package/dist/src/cli/utils/telemetry.mjs.map +1 -1
  93. package/dist/src/cli/utils/tsconfig.js.map +1 -1
  94. package/dist/src/cli/utils/tsconfig.mjs.map +1 -1
  95. package/dist/src/node/build.js.map +1 -1
  96. package/dist/src/node/build.mjs.map +1 -1
  97. package/dist/src/node/core/admin-customisations.js.map +1 -1
  98. package/dist/src/node/core/admin-customisations.mjs.map +1 -1
  99. package/dist/src/node/core/aliases.js.map +1 -1
  100. package/dist/src/node/core/aliases.mjs.map +1 -1
  101. package/dist/src/node/core/config.js.map +1 -1
  102. package/dist/src/node/core/config.mjs.map +1 -1
  103. package/dist/src/node/core/dependencies.js.map +1 -1
  104. package/dist/src/node/core/dependencies.mjs.map +1 -1
  105. package/dist/src/node/core/env.js.map +1 -1
  106. package/dist/src/node/core/env.mjs.map +1 -1
  107. package/dist/src/node/core/errors.js.map +1 -1
  108. package/dist/src/node/core/errors.mjs.map +1 -1
  109. package/dist/src/node/core/files.js.map +1 -1
  110. package/dist/src/node/core/files.mjs.map +1 -1
  111. package/dist/src/node/core/linked-packages.js +34 -0
  112. package/dist/src/node/core/linked-packages.js.map +1 -0
  113. package/dist/src/node/core/linked-packages.mjs +30 -0
  114. package/dist/src/node/core/linked-packages.mjs.map +1 -0
  115. package/dist/src/node/core/managers.js.map +1 -1
  116. package/dist/src/node/core/managers.mjs.map +1 -1
  117. package/dist/src/node/core/monorepo.js.map +1 -1
  118. package/dist/src/node/core/monorepo.mjs.map +1 -1
  119. package/dist/src/node/core/plugins.js.map +1 -1
  120. package/dist/src/node/core/plugins.mjs.map +1 -1
  121. package/dist/src/node/core/resolve-module.js +20 -0
  122. package/dist/src/node/core/resolve-module.js.map +1 -0
  123. package/dist/src/node/core/resolve-module.mjs +18 -0
  124. package/dist/src/node/core/resolve-module.mjs.map +1 -0
  125. package/dist/src/node/core/timer.js.map +1 -1
  126. package/dist/src/node/core/timer.mjs.map +1 -1
  127. package/dist/src/node/create-build-context.js.map +1 -1
  128. package/dist/src/node/create-build-context.mjs.map +1 -1
  129. package/dist/src/node/develop.js.map +1 -1
  130. package/dist/src/node/develop.mjs.map +1 -1
  131. package/dist/src/node/staticFiles.js.map +1 -1
  132. package/dist/src/node/staticFiles.mjs.map +1 -1
  133. package/dist/src/node/vite/build.js.map +1 -1
  134. package/dist/src/node/vite/build.mjs.map +1 -1
  135. package/dist/src/node/vite/config.js +27 -3
  136. package/dist/src/node/vite/config.js.map +1 -1
  137. package/dist/src/node/vite/config.mjs +27 -3
  138. package/dist/src/node/vite/config.mjs.map +1 -1
  139. package/dist/src/node/vite/plugins.js.map +1 -1
  140. package/dist/src/node/vite/plugins.mjs.map +1 -1
  141. package/dist/src/node/vite/watch.js.map +1 -1
  142. package/dist/src/node/vite/watch.mjs.map +1 -1
  143. package/dist/src/node/webpack/build.js.map +1 -1
  144. package/dist/src/node/webpack/build.mjs.map +1 -1
  145. package/dist/src/node/webpack/config.js +16 -18
  146. package/dist/src/node/webpack/config.js.map +1 -1
  147. package/dist/src/node/webpack/config.mjs +10 -12
  148. package/dist/src/node/webpack/config.mjs.map +1 -1
  149. package/dist/src/node/webpack/watch.js.map +1 -1
  150. package/dist/src/node/webpack/watch.mjs.map +1 -1
  151. package/package.json +22 -22
@@ -1,6 +1,8 @@
1
1
  import browserslistToEsbuild from 'browserslist-to-esbuild';
2
2
  import react from '@vitejs/plugin-react-swc';
3
3
  import { getUserConfig } from '../core/config.mjs';
4
+ import { getModulePath } from '../core/resolve-module.mjs';
5
+ import { isDesignSystemLinked } from '../core/linked-packages.mjs';
4
6
  import { loadStrapiMonorepo } from '../core/monorepo.mjs';
5
7
  import { getMonorepoAliases } from '../core/aliases.mjs';
6
8
  import { buildFilesPlugin } from './plugins.mjs';
@@ -8,6 +10,7 @@ import { buildFilesPlugin } from './plugins.mjs';
8
10
  const resolveBaseConfig = async (ctx)=>{
9
11
  const target = browserslistToEsbuild(ctx.target);
10
12
  const isMonorepoExampleApp = ctx.strapi.internal_config?.uuid === 'getstarted';
13
+ const designSystemLinked = isDesignSystemLinked();
11
14
  return {
12
15
  root: ctx.cwd,
13
16
  base: ctx.basePath,
@@ -24,6 +27,13 @@ const resolveBaseConfig = async (ctx)=>{
24
27
  },
25
28
  envPrefix: 'STRAPI_ADMIN_',
26
29
  optimizeDeps: {
30
+ // When design-system is linked (portal:, file:, yarn link), exclude from pre-bundling
31
+ // so changes are reflected without clearing node_modules/.strapi/vite cache
32
+ ...designSystemLinked && {
33
+ exclude: [
34
+ '@strapi/design-system'
35
+ ]
36
+ },
27
37
  include: [
28
38
  // pre-bundle React dependencies to avoid React duplicates,
29
39
  // even if React dependencies are not direct dependencies
@@ -36,8 +46,14 @@ const resolveBaseConfig = async (ctx)=>{
36
46
  // Pre-bundle design-system so plugin custom field chunks (dynamic imports) resolve
37
47
  // to the same instance as the main app. Otherwise TooltipProvider/DesignSystemProvider
38
48
  // context from the root is not seen by components in plugin chunks.
39
- '@strapi/design-system',
49
+ // Omit when linked so local changes are picked up (see exclude above)
50
+ ...!designSystemLinked ? [
51
+ '@strapi/design-system'
52
+ ] : [],
40
53
  '@radix-ui/react-tooltip',
54
+ // Pre-bundle lodash: design-system uses named imports (e.g. assignWith) but lodash
55
+ // is CommonJS-only; pre-bundling converts it to ESM for the browser
56
+ 'lodash',
41
57
  /**
42
58
  * Pre-bundle other dependencies that would otherwise cause a page reload when imported.
43
59
  * See "performance" section: https://vite.dev/guide/dep-pre-bundling.html#the-why
@@ -107,8 +123,16 @@ const resolveBaseConfig = async (ctx)=>{
107
123
  'react-router-dom',
108
124
  'styled-components',
109
125
  '@strapi/design-system',
110
- '@radix-ui/react-tooltip'
111
- ]
126
+ '@radix-ui/react-tooltip',
127
+ 'lodash'
128
+ ],
129
+ // Explicit aliases ensure resolution under pnpm's strict dependency isolation,
130
+ // where packages imported by plugins may not be resolvable from plugin chunks
131
+ alias: {
132
+ '@strapi/design-system': getModulePath('@strapi/design-system'),
133
+ '@radix-ui/react-tooltip': getModulePath('@radix-ui/react-tooltip'),
134
+ lodash: getModulePath('lodash')
135
+ }
112
136
  },
113
137
  plugins: [
114
138
  react(),
@@ -1 +1 @@
1
- {"version":3,"file":"config.mjs","sources":["../../../../src/node/vite/config.ts"],"sourcesContent":["import type { InlineConfig, UserConfig } from 'vite';\nimport browserslistToEsbuild from 'browserslist-to-esbuild';\nimport react from '@vitejs/plugin-react-swc';\n\nimport { getUserConfig } from '../core/config';\nimport { loadStrapiMonorepo } from '../core/monorepo';\nimport { getMonorepoAliases } from '../core/aliases';\nimport type { BuildContext } from '../create-build-context';\nimport { buildFilesPlugin } from './plugins';\n\nconst resolveBaseConfig = async (ctx: BuildContext): Promise<InlineConfig> => {\n const target = browserslistToEsbuild(ctx.target);\n const isMonorepoExampleApp = (ctx.strapi as any).internal_config?.uuid === 'getstarted';\n\n return {\n root: ctx.cwd,\n base: ctx.basePath,\n build: {\n emptyOutDir: false, // Rely on CLI to do this\n outDir: ctx.distDir,\n target,\n },\n cacheDir: 'node_modules/.strapi/vite',\n configFile: false,\n define: {\n process: {},\n 'process.env': JSON.stringify(ctx.env),\n },\n envPrefix: 'STRAPI_ADMIN_',\n optimizeDeps: {\n include: [\n // pre-bundle React dependencies to avoid React duplicates,\n // even if React dependencies are not direct dependencies\n // https://react.dev/warnings/invalid-hook-call-warning#duplicate-react\n 'react',\n `react/jsx-runtime`,\n 'react-dom/client',\n 'styled-components',\n 'react-router-dom',\n // Pre-bundle design-system so plugin custom field chunks (dynamic imports) resolve\n // to the same instance as the main app. Otherwise TooltipProvider/DesignSystemProvider\n // context from the root is not seen by components in plugin chunks.\n '@strapi/design-system',\n '@radix-ui/react-tooltip',\n /**\n * Pre-bundle other dependencies that would otherwise cause a page reload when imported.\n * See \"performance\" section: https://vite.dev/guide/dep-pre-bundling.html#the-why\n * Only include dependencies for our internal example apps, otherwise it will break\n * real user apps that may not have those dependencies.\n */\n ...(isMonorepoExampleApp\n ? [\n '@dnd-kit/core',\n '@dnd-kit/sortable',\n '@dnd-kit/utilities',\n '@dnd-kit/modifiers',\n '@radix-ui/react-toolbar',\n 'codemirror5',\n 'codemirror5/addon/display/placeholder',\n 'date-fns-tz',\n 'date-fns/format',\n 'date-fns/formatISO',\n 'highlight.js',\n 'lodash/capitalize',\n 'lodash/fp',\n 'lodash/groupBy',\n 'lodash/has',\n 'lodash/isNil',\n 'lodash/locale',\n 'lodash/map',\n 'lodash/mapValues',\n 'lodash/pull',\n 'lodash/size',\n 'lodash/sortBy',\n 'lodash/tail',\n 'lodash/toLower',\n 'lodash/toNumber',\n 'lodash/toString',\n 'lodash/truncate',\n 'lodash/uniq',\n 'lodash/upperFirst',\n 'markdown-it',\n 'markdown-it-abbr',\n 'markdown-it-container',\n 'markdown-it-deflist',\n 'markdown-it-emoji',\n 'markdown-it-footnote',\n 'markdown-it-ins',\n 'markdown-it-mark',\n 'markdown-it-sub',\n 'markdown-it-sup',\n 'prismjs/components/*.js',\n 'react-colorful',\n 'react-dnd-html5-backend',\n 'react-window',\n 'sanitize-html',\n 'semver',\n 'semver/functions/lt',\n 'semver/functions/valid',\n 'slate',\n 'slate-history',\n 'slate-react',\n 'motion',\n ]\n : []),\n ],\n },\n resolve: {\n // https://react.dev/warnings/invalid-hook-call-warning#duplicate-react\n // Include design-system so plugin chunks use the same instance and inherit root context\n dedupe: [\n 'react',\n 'react-dom',\n 'react-router-dom',\n 'styled-components',\n '@strapi/design-system',\n '@radix-ui/react-tooltip',\n ],\n },\n plugins: [react(), buildFilesPlugin(ctx)],\n };\n};\n\nconst resolveProductionConfig = async (ctx: BuildContext): Promise<InlineConfig> => {\n const {\n options: { minify, sourcemaps },\n } = ctx;\n\n const baseConfig = await resolveBaseConfig(ctx);\n\n return {\n ...baseConfig,\n logLevel: 'silent',\n mode: 'production',\n build: {\n ...baseConfig.build,\n assetsDir: '',\n minify,\n sourcemap: sourcemaps,\n rollupOptions: {\n input: {\n strapi: ctx.entry,\n },\n },\n },\n };\n};\n\nconst resolveDevelopmentConfig = async (ctx: BuildContext): Promise<InlineConfig> => {\n const monorepo = await loadStrapiMonorepo(ctx.cwd);\n const baseConfig = await resolveBaseConfig(ctx);\n\n return {\n ...baseConfig,\n mode: 'development',\n resolve: {\n ...baseConfig.resolve,\n alias: {\n ...baseConfig.resolve?.alias,\n ...getMonorepoAliases({ monorepo }),\n },\n },\n server: {\n cors: false,\n middlewareMode: true,\n open: ctx.options.open,\n hmr: {\n overlay: false,\n server: ctx.options.hmrServer,\n clientPort: ctx.options.hmrClientPort,\n },\n },\n appType: 'custom',\n };\n};\n\nconst USER_CONFIGS = ['vite.config.js', 'vite.config.mjs', 'vite.config.ts'];\n\ntype UserViteConfig = (config: UserConfig) => UserConfig;\n\nconst mergeConfigWithUserConfig = async (config: InlineConfig, ctx: BuildContext) => {\n const userConfig = await getUserConfig<UserViteConfig>(USER_CONFIGS, ctx);\n\n if (userConfig) {\n return userConfig(config);\n }\n\n return config;\n};\n\nexport { mergeConfigWithUserConfig, resolveProductionConfig, resolveDevelopmentConfig };\n"],"names":["resolveBaseConfig","ctx","target","browserslistToEsbuild","isMonorepoExampleApp","strapi","internal_config","uuid","root","cwd","base","basePath","build","emptyOutDir","outDir","distDir","cacheDir","configFile","define","process","JSON","stringify","env","envPrefix","optimizeDeps","include","resolve","dedupe","plugins","react","buildFilesPlugin","resolveProductionConfig","options","minify","sourcemaps","baseConfig","logLevel","mode","assetsDir","sourcemap","rollupOptions","input","entry","resolveDevelopmentConfig","monorepo","loadStrapiMonorepo","alias","getMonorepoAliases","server","cors","middlewareMode","open","hmr","overlay","hmrServer","clientPort","hmrClientPort","appType","USER_CONFIGS","mergeConfigWithUserConfig","config","userConfig","getUserConfig"],"mappings":"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"}
1
+ {"version":3,"file":"config.mjs","sources":["../../../../src/node/vite/config.ts"],"sourcesContent":["import type { InlineConfig, UserConfig } from 'vite';\nimport browserslistToEsbuild from 'browserslist-to-esbuild';\nimport react from '@vitejs/plugin-react-swc';\n\nimport { getUserConfig } from '../core/config';\nimport { getModulePath } from '../core/resolve-module';\nimport { isDesignSystemLinked } from '../core/linked-packages';\nimport { loadStrapiMonorepo } from '../core/monorepo';\nimport { getMonorepoAliases } from '../core/aliases';\nimport type { BuildContext } from '../create-build-context';\nimport { buildFilesPlugin } from './plugins';\n\nconst resolveBaseConfig = async (ctx: BuildContext): Promise<InlineConfig> => {\n const target = browserslistToEsbuild(ctx.target);\n const isMonorepoExampleApp = (ctx.strapi as any).internal_config?.uuid === 'getstarted';\n const designSystemLinked = isDesignSystemLinked();\n\n return {\n root: ctx.cwd,\n base: ctx.basePath,\n build: {\n emptyOutDir: false, // Rely on CLI to do this\n outDir: ctx.distDir,\n target,\n },\n cacheDir: 'node_modules/.strapi/vite',\n configFile: false,\n define: {\n process: {},\n 'process.env': JSON.stringify(ctx.env),\n },\n envPrefix: 'STRAPI_ADMIN_',\n optimizeDeps: {\n // When design-system is linked (portal:, file:, yarn link), exclude from pre-bundling\n // so changes are reflected without clearing node_modules/.strapi/vite cache\n ...(designSystemLinked && { exclude: ['@strapi/design-system'] }),\n include: [\n // pre-bundle React dependencies to avoid React duplicates,\n // even if React dependencies are not direct dependencies\n // https://react.dev/warnings/invalid-hook-call-warning#duplicate-react\n 'react',\n `react/jsx-runtime`,\n 'react-dom/client',\n 'styled-components',\n 'react-router-dom',\n // Pre-bundle design-system so plugin custom field chunks (dynamic imports) resolve\n // to the same instance as the main app. Otherwise TooltipProvider/DesignSystemProvider\n // context from the root is not seen by components in plugin chunks.\n // Omit when linked so local changes are picked up (see exclude above)\n ...(!designSystemLinked ? ['@strapi/design-system'] : []),\n '@radix-ui/react-tooltip',\n // Pre-bundle lodash: design-system uses named imports (e.g. assignWith) but lodash\n // is CommonJS-only; pre-bundling converts it to ESM for the browser\n 'lodash',\n /**\n * Pre-bundle other dependencies that would otherwise cause a page reload when imported.\n * See \"performance\" section: https://vite.dev/guide/dep-pre-bundling.html#the-why\n * Only include dependencies for our internal example apps, otherwise it will break\n * real user apps that may not have those dependencies.\n */\n ...(isMonorepoExampleApp\n ? [\n '@dnd-kit/core',\n '@dnd-kit/sortable',\n '@dnd-kit/utilities',\n '@dnd-kit/modifiers',\n '@radix-ui/react-toolbar',\n 'codemirror5',\n 'codemirror5/addon/display/placeholder',\n 'date-fns-tz',\n 'date-fns/format',\n 'date-fns/formatISO',\n 'highlight.js',\n 'lodash/capitalize',\n 'lodash/fp',\n 'lodash/groupBy',\n 'lodash/has',\n 'lodash/isNil',\n 'lodash/locale',\n 'lodash/map',\n 'lodash/mapValues',\n 'lodash/pull',\n 'lodash/size',\n 'lodash/sortBy',\n 'lodash/tail',\n 'lodash/toLower',\n 'lodash/toNumber',\n 'lodash/toString',\n 'lodash/truncate',\n 'lodash/uniq',\n 'lodash/upperFirst',\n 'markdown-it',\n 'markdown-it-abbr',\n 'markdown-it-container',\n 'markdown-it-deflist',\n 'markdown-it-emoji',\n 'markdown-it-footnote',\n 'markdown-it-ins',\n 'markdown-it-mark',\n 'markdown-it-sub',\n 'markdown-it-sup',\n 'prismjs/components/*.js',\n 'react-colorful',\n 'react-dnd-html5-backend',\n 'react-window',\n 'sanitize-html',\n 'semver',\n 'semver/functions/lt',\n 'semver/functions/valid',\n 'slate',\n 'slate-history',\n 'slate-react',\n 'motion',\n ]\n : []),\n ],\n },\n resolve: {\n // https://react.dev/warnings/invalid-hook-call-warning#duplicate-react\n // Include design-system so plugin chunks use the same instance and inherit root context\n dedupe: [\n 'react',\n 'react-dom',\n 'react-router-dom',\n 'styled-components',\n '@strapi/design-system',\n '@radix-ui/react-tooltip',\n 'lodash',\n ],\n // Explicit aliases ensure resolution under pnpm's strict dependency isolation,\n // where packages imported by plugins may not be resolvable from plugin chunks\n alias: {\n '@strapi/design-system': getModulePath('@strapi/design-system'),\n '@radix-ui/react-tooltip': getModulePath('@radix-ui/react-tooltip'),\n lodash: getModulePath('lodash'),\n },\n },\n plugins: [react(), buildFilesPlugin(ctx)],\n };\n};\n\nconst resolveProductionConfig = async (ctx: BuildContext): Promise<InlineConfig> => {\n const {\n options: { minify, sourcemaps },\n } = ctx;\n\n const baseConfig = await resolveBaseConfig(ctx);\n\n return {\n ...baseConfig,\n logLevel: 'silent',\n mode: 'production',\n build: {\n ...baseConfig.build,\n assetsDir: '',\n minify,\n sourcemap: sourcemaps,\n rollupOptions: {\n input: {\n strapi: ctx.entry,\n },\n },\n },\n };\n};\n\nconst resolveDevelopmentConfig = async (ctx: BuildContext): Promise<InlineConfig> => {\n const monorepo = await loadStrapiMonorepo(ctx.cwd);\n const baseConfig = await resolveBaseConfig(ctx);\n\n return {\n ...baseConfig,\n mode: 'development',\n resolve: {\n ...baseConfig.resolve,\n alias: {\n ...baseConfig.resolve?.alias,\n ...getMonorepoAliases({ monorepo }),\n },\n },\n server: {\n cors: false,\n middlewareMode: true,\n open: ctx.options.open,\n hmr: {\n overlay: false,\n server: ctx.options.hmrServer,\n clientPort: ctx.options.hmrClientPort,\n },\n },\n appType: 'custom',\n };\n};\n\nconst USER_CONFIGS = ['vite.config.js', 'vite.config.mjs', 'vite.config.ts'];\n\ntype UserViteConfig = (config: UserConfig) => UserConfig;\n\nconst mergeConfigWithUserConfig = async (config: InlineConfig, ctx: BuildContext) => {\n const userConfig = await getUserConfig<UserViteConfig>(USER_CONFIGS, ctx);\n\n if (userConfig) {\n return userConfig(config);\n }\n\n return config;\n};\n\nexport { mergeConfigWithUserConfig, resolveProductionConfig, resolveDevelopmentConfig };\n"],"names":["resolveBaseConfig","ctx","target","browserslistToEsbuild","isMonorepoExampleApp","strapi","internal_config","uuid","designSystemLinked","isDesignSystemLinked","root","cwd","base","basePath","build","emptyOutDir","outDir","distDir","cacheDir","configFile","define","process","JSON","stringify","env","envPrefix","optimizeDeps","exclude","include","resolve","dedupe","alias","getModulePath","lodash","plugins","react","buildFilesPlugin","resolveProductionConfig","options","minify","sourcemaps","baseConfig","logLevel","mode","assetsDir","sourcemap","rollupOptions","input","entry","resolveDevelopmentConfig","monorepo","loadStrapiMonorepo","getMonorepoAliases","server","cors","middlewareMode","open","hmr","overlay","hmrServer","clientPort","hmrClientPort","appType","USER_CONFIGS","mergeConfigWithUserConfig","config","userConfig","getUserConfig"],"mappings":";;;;;;;;;AAYA,MAAMA,oBAAoB,OAAOC,GAAAA,GAAAA;IAC/B,MAAMC,MAAAA,GAASC,qBAAAA,CAAsBF,GAAAA,CAAIC,MAAM,CAAA;AAC/C,IAAA,MAAME,uBAAuB,GAACH,CAAII,MAAM,CAASC,eAAe,EAAEC,IAAAA,KAAS,YAAA;AAC3E,IAAA,MAAMC,kBAAAA,GAAqBC,oBAAAA,EAAAA;IAE3B,OAAO;AACLC,QAAAA,IAAAA,EAAMT,IAAIU,GAAG;AACbC,QAAAA,IAAAA,EAAMX,IAAIY,QAAQ;QAClBC,KAAAA,EAAO;YACLC,WAAAA,EAAa,KAAA;AACbC,YAAAA,MAAAA,EAAQf,IAAIgB,OAAO;AACnBf,YAAAA;AACF,SAAA;QACAgB,QAAAA,EAAU,2BAAA;QACVC,UAAAA,EAAY,KAAA;QACZC,MAAAA,EAAQ;AACNC,YAAAA,OAAAA,EAAS,EAAC;AACV,YAAA,aAAA,EAAeC,IAAAA,CAAKC,SAAS,CAACtB,GAAAA,CAAIuB,GAAG;AACvC,SAAA;QACAC,SAAAA,EAAW,eAAA;QACXC,YAAAA,EAAc;;;AAGZ,YAAA,GAAIlB,kBAAAA,IAAsB;gBAAEmB,OAAAA,EAAS;AAAC,oBAAA;AAAwB;aAAE;YAChEC,OAAAA,EAAS;;;;AAIP,gBAAA,OAAA;AACA,gBAAA,CAAC,iBAAiB,CAAC;AACnB,gBAAA,kBAAA;AACA,gBAAA,mBAAA;AACA,gBAAA,kBAAA;;;;;AAKI,gBAAA,GAAA,CAACpB,kBAAAA,GAAqB;AAAC,oBAAA;AAAwB,iBAAA,GAAG,EAAE;AACxD,gBAAA,yBAAA;;;AAGA,gBAAA,QAAA;AACA;;;;;AAKC,YAAA,GACGJ,oBAAAA,GACA;AACE,oBAAA,eAAA;AACA,oBAAA,mBAAA;AACA,oBAAA,oBAAA;AACA,oBAAA,oBAAA;AACA,oBAAA,yBAAA;AACA,oBAAA,aAAA;AACA,oBAAA,uCAAA;AACA,oBAAA,aAAA;AACA,oBAAA,iBAAA;AACA,oBAAA,oBAAA;AACA,oBAAA,cAAA;AACA,oBAAA,mBAAA;AACA,oBAAA,WAAA;AACA,oBAAA,gBAAA;AACA,oBAAA,YAAA;AACA,oBAAA,cAAA;AACA,oBAAA,eAAA;AACA,oBAAA,YAAA;AACA,oBAAA,kBAAA;AACA,oBAAA,aAAA;AACA,oBAAA,aAAA;AACA,oBAAA,eAAA;AACA,oBAAA,aAAA;AACA,oBAAA,gBAAA;AACA,oBAAA,iBAAA;AACA,oBAAA,iBAAA;AACA,oBAAA,iBAAA;AACA,oBAAA,aAAA;AACA,oBAAA,mBAAA;AACA,oBAAA,aAAA;AACA,oBAAA,kBAAA;AACA,oBAAA,uBAAA;AACA,oBAAA,qBAAA;AACA,oBAAA,mBAAA;AACA,oBAAA,sBAAA;AACA,oBAAA,iBAAA;AACA,oBAAA,kBAAA;AACA,oBAAA,iBAAA;AACA,oBAAA,iBAAA;AACA,oBAAA,yBAAA;AACA,oBAAA,gBAAA;AACA,oBAAA,yBAAA;AACA,oBAAA,cAAA;AACA,oBAAA,eAAA;AACA,oBAAA,QAAA;AACA,oBAAA,qBAAA;AACA,oBAAA,wBAAA;AACA,oBAAA,OAAA;AACA,oBAAA,eAAA;AACA,oBAAA,aAAA;AACA,oBAAA;AACD,iBAAA,GACD;AACL;AACH,SAAA;QACAyB,OAAAA,EAAS;;;YAGPC,MAAAA,EAAQ;AACN,gBAAA,OAAA;AACA,gBAAA,WAAA;AACA,gBAAA,kBAAA;AACA,gBAAA,mBAAA;AACA,gBAAA,uBAAA;AACA,gBAAA,yBAAA;AACA,gBAAA;AACD,aAAA;;;YAGDC,KAAAA,EAAO;AACL,gBAAA,uBAAA,EAAyBC,aAAAA,CAAc,uBAAA,CAAA;AACvC,gBAAA,yBAAA,EAA2BA,aAAAA,CAAc,yBAAA,CAAA;AACzCC,gBAAAA,MAAAA,EAAQD,aAAAA,CAAc,QAAA;AACxB;AACF,SAAA;QACAE,OAAAA,EAAS;AAACC,YAAAA,KAAAA,EAAAA;YAASC,gBAAAA,CAAiBnC,GAAAA;AAAK;AAC3C,KAAA;AACF,CAAA;AAEA,MAAMoC,0BAA0B,OAAOpC,GAAAA,GAAAA;IACrC,MAAM,EACJqC,SAAS,EAAEC,MAAM,EAAEC,UAAU,EAAE,EAChC,GAAGvC,GAAAA;IAEJ,MAAMwC,UAAAA,GAAa,MAAMzC,iBAAAA,CAAkBC,GAAAA,CAAAA;IAE3C,OAAO;AACL,QAAA,GAAGwC,UAAU;QACbC,QAAAA,EAAU,QAAA;QACVC,IAAAA,EAAM,YAAA;QACN7B,KAAAA,EAAO;AACL,YAAA,GAAG2B,WAAW3B,KAAK;YACnB8B,SAAAA,EAAW,EAAA;AACXL,YAAAA,MAAAA;YACAM,SAAAA,EAAWL,UAAAA;YACXM,aAAAA,EAAe;gBACbC,KAAAA,EAAO;AACL1C,oBAAAA,MAAAA,EAAQJ,IAAI+C;AACd;AACF;AACF;AACF,KAAA;AACF;AAEA,MAAMC,2BAA2B,OAAOhD,GAAAA,GAAAA;AACtC,IAAA,MAAMiD,QAAAA,GAAW,MAAMC,kBAAAA,CAAmBlD,GAAAA,CAAIU,GAAG,CAAA;IACjD,MAAM8B,UAAAA,GAAa,MAAMzC,iBAAAA,CAAkBC,GAAAA,CAAAA;IAE3C,OAAO;AACL,QAAA,GAAGwC,UAAU;QACbE,IAAAA,EAAM,aAAA;QACNd,OAAAA,EAAS;AACP,YAAA,GAAGY,WAAWZ,OAAO;YACrBE,KAAAA,EAAO;gBACL,GAAGU,UAAAA,CAAWZ,OAAO,EAAEE,KAAK;AAC5B,gBAAA,GAAGqB,kBAAAA,CAAmB;AAAEF,oBAAAA;iBAAS;AACnC;AACF,SAAA;QACAG,MAAAA,EAAQ;YACNC,IAAAA,EAAM,KAAA;YACNC,cAAAA,EAAgB,IAAA;YAChBC,IAAAA,EAAMvD,GAAAA,CAAIqC,OAAO,CAACkB,IAAI;YACtBC,GAAAA,EAAK;gBACHC,OAAAA,EAAS,KAAA;gBACTL,MAAAA,EAAQpD,GAAAA,CAAIqC,OAAO,CAACqB,SAAS;gBAC7BC,UAAAA,EAAY3D,GAAAA,CAAIqC,OAAO,CAACuB;AAC1B;AACF,SAAA;QACAC,OAAAA,EAAS;AACX,KAAA;AACF;AAEA,MAAMC,YAAAA,GAAe;AAAC,IAAA,gBAAA;AAAkB,IAAA,iBAAA;AAAmB,IAAA;AAAiB,CAAA;AAI5E,MAAMC,yBAAAA,GAA4B,OAAOC,MAAAA,EAAsBhE,GAAAA,GAAAA;IAC7D,MAAMiE,UAAAA,GAAa,MAAMC,aAAAA,CAA8BJ,YAAAA,EAAc9D,GAAAA,CAAAA;AAErE,IAAA,IAAIiE,UAAAA,EAAY;AACd,QAAA,OAAOA,UAAAA,CAAWD,MAAAA,CAAAA;AACpB,IAAA;IAEA,OAAOA,MAAAA;AACT;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.js","sources":["../../../../src/node/vite/plugins.ts"],"sourcesContent":["import type { Plugin } from 'vite';\n\nimport { getDocumentHTML } from '../staticFiles';\nimport type { BuildContext } from '../create-build-context';\n\nconst buildFilesPlugin = (ctx: BuildContext): Plugin => {\n const CHUNK_ID = '.strapi/client/app.js';\n\n return {\n name: 'strapi/server/build-files',\n apply: 'build',\n buildStart() {\n this.emitFile({\n type: 'chunk',\n id: CHUNK_ID,\n name: 'strapi',\n });\n },\n async generateBundle(_options, outputBundle) {\n const bundle = outputBundle;\n const entryFile = Object.values(bundle).find(\n (file) =>\n file.type === 'chunk' && file.name === 'strapi' && file.facadeModuleId?.endsWith(CHUNK_ID)\n );\n\n if (!entryFile) {\n throw new Error(`Failed to find entry file in bundle (${CHUNK_ID})`);\n }\n\n if (entryFile.type !== 'chunk') {\n throw new Error('Entry file is not a chunk');\n }\n\n const entryFileName = entryFile.fileName;\n const entryPath = [ctx.basePath.replace(/\\/+$/, ''), entryFileName].join('/');\n\n this.emitFile({\n type: 'asset',\n fileName: 'index.html',\n source: getDocumentHTML({\n logger: ctx.logger,\n props: {\n entryPath,\n },\n }),\n });\n },\n };\n};\n\nexport { buildFilesPlugin };\n"],"names":["buildFilesPlugin","ctx","CHUNK_ID","name","apply","buildStart","emitFile","type","id","generateBundle","_options","outputBundle","bundle","entryFile","Object","values","find","file","facadeModuleId","endsWith","Error","entryFileName","fileName","entryPath","basePath","replace","join","source","getDocumentHTML","logger","props"],"mappings":";;;;AAKA,MAAMA,mBAAmB,CAACC,GAAAA,GAAAA;AACxB,IAAA,MAAMC,QAAW,GAAA,uBAAA;IAEjB,OAAO;QACLC,IAAM,EAAA,2BAAA;QACNC,KAAO,EAAA,OAAA;AACPC,QAAAA,UAAAA,CAAAA,GAAAA;YACE,IAAI,CAACC,QAAQ,CAAC;gBACZC,IAAM,EAAA,OAAA;gBACNC,EAAIN,EAAAA,QAAAA;gBACJC,IAAM,EAAA;AACR,aAAA,CAAA;AACF,SAAA;QACA,MAAMM,cAAAA,CAAAA,CAAeC,QAAQ,EAAEC,YAAY,EAAA;AACzC,YAAA,MAAMC,MAASD,GAAAA,YAAAA;YACf,MAAME,SAAAA,GAAYC,OAAOC,MAAM,CAACH,QAAQI,IAAI,CAC1C,CAACC,IACCA,GAAAA,IAAAA,CAAKV,IAAI,KAAK,OAAA,IAAWU,KAAKd,IAAI,KAAK,YAAYc,IAAKC,CAAAA,cAAc,EAAEC,QAASjB,CAAAA,QAAAA,CAAAA,CAAAA;AAGrF,YAAA,IAAI,CAACW,SAAW,EAAA;AACd,gBAAA,MAAM,IAAIO,KAAM,CAAA,CAAC,qCAAqC,EAAElB,QAAAA,CAAS,CAAC,CAAC,CAAA;AACrE;YAEA,IAAIW,SAAAA,CAAUN,IAAI,KAAK,OAAS,EAAA;AAC9B,gBAAA,MAAM,IAAIa,KAAM,CAAA,2BAAA,CAAA;AAClB;YAEA,MAAMC,aAAAA,GAAgBR,UAAUS,QAAQ;AACxC,YAAA,MAAMC,SAAY,GAAA;AAACtB,gBAAAA,GAAAA,CAAIuB,QAAQ,CAACC,OAAO,CAAC,MAAQ,EAAA,EAAA,CAAA;AAAKJ,gBAAAA;AAAc,aAAA,CAACK,IAAI,CAAC,GAAA,CAAA;YAEzE,IAAI,CAACpB,QAAQ,CAAC;gBACZC,IAAM,EAAA,OAAA;gBACNe,QAAU,EAAA,YAAA;AACVK,gBAAAA,MAAAA,EAAQC,2BAAgB,CAAA;AACtBC,oBAAAA,MAAAA,EAAQ5B,IAAI4B,MAAM;oBAClBC,KAAO,EAAA;AACLP,wBAAAA;AACF;AACF,iBAAA;AACF,aAAA,CAAA;AACF;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"plugins.js","sources":["../../../../src/node/vite/plugins.ts"],"sourcesContent":["import type { Plugin } from 'vite';\n\nimport { getDocumentHTML } from '../staticFiles';\nimport type { BuildContext } from '../create-build-context';\n\nconst buildFilesPlugin = (ctx: BuildContext): Plugin => {\n const CHUNK_ID = '.strapi/client/app.js';\n\n return {\n name: 'strapi/server/build-files',\n apply: 'build',\n buildStart() {\n this.emitFile({\n type: 'chunk',\n id: CHUNK_ID,\n name: 'strapi',\n });\n },\n async generateBundle(_options, outputBundle) {\n const bundle = outputBundle;\n const entryFile = Object.values(bundle).find(\n (file) =>\n file.type === 'chunk' && file.name === 'strapi' && file.facadeModuleId?.endsWith(CHUNK_ID)\n );\n\n if (!entryFile) {\n throw new Error(`Failed to find entry file in bundle (${CHUNK_ID})`);\n }\n\n if (entryFile.type !== 'chunk') {\n throw new Error('Entry file is not a chunk');\n }\n\n const entryFileName = entryFile.fileName;\n const entryPath = [ctx.basePath.replace(/\\/+$/, ''), entryFileName].join('/');\n\n this.emitFile({\n type: 'asset',\n fileName: 'index.html',\n source: getDocumentHTML({\n logger: ctx.logger,\n props: {\n entryPath,\n },\n }),\n });\n },\n };\n};\n\nexport { buildFilesPlugin };\n"],"names":["buildFilesPlugin","ctx","CHUNK_ID","name","apply","buildStart","emitFile","type","id","generateBundle","_options","outputBundle","bundle","entryFile","Object","values","find","file","facadeModuleId","endsWith","Error","entryFileName","fileName","entryPath","basePath","replace","join","source","getDocumentHTML","logger","props"],"mappings":";;;;AAKA,MAAMA,mBAAmB,CAACC,GAAAA,GAAAA;AACxB,IAAA,MAAMC,QAAAA,GAAW,uBAAA;IAEjB,OAAO;QACLC,IAAAA,EAAM,2BAAA;QACNC,KAAAA,EAAO,OAAA;AACPC,QAAAA,UAAAA,CAAAA,GAAAA;YACE,IAAI,CAACC,QAAQ,CAAC;gBACZC,IAAAA,EAAM,OAAA;gBACNC,EAAAA,EAAIN,QAAAA;gBACJC,IAAAA,EAAM;AACR,aAAA,CAAA;AACF,QAAA,CAAA;QACA,MAAMM,cAAAA,CAAAA,CAAeC,QAAQ,EAAEC,YAAY,EAAA;AACzC,YAAA,MAAMC,MAAAA,GAASD,YAAAA;YACf,MAAME,SAAAA,GAAYC,OAAOC,MAAM,CAACH,QAAQI,IAAI,CAC1C,CAACC,IAAAA,GACCA,IAAAA,CAAKV,IAAI,KAAK,OAAA,IAAWU,KAAKd,IAAI,KAAK,YAAYc,IAAAA,CAAKC,cAAc,EAAEC,QAAAA,CAASjB,QAAAA,CAAAA,CAAAA;AAGrF,YAAA,IAAI,CAACW,SAAAA,EAAW;AACd,gBAAA,MAAM,IAAIO,KAAAA,CAAM,CAAC,qCAAqC,EAAElB,QAAAA,CAAS,CAAC,CAAC,CAAA;AACrE,YAAA;YAEA,IAAIW,SAAAA,CAAUN,IAAI,KAAK,OAAA,EAAS;AAC9B,gBAAA,MAAM,IAAIa,KAAAA,CAAM,2BAAA,CAAA;AAClB,YAAA;YAEA,MAAMC,aAAAA,GAAgBR,UAAUS,QAAQ;AACxC,YAAA,MAAMC,SAAAA,GAAY;AAACtB,gBAAAA,GAAAA,CAAIuB,QAAQ,CAACC,OAAO,CAAC,MAAA,EAAQ,EAAA,CAAA;AAAKJ,gBAAAA;AAAc,aAAA,CAACK,IAAI,CAAC,GAAA,CAAA;YAEzE,IAAI,CAACpB,QAAQ,CAAC;gBACZC,IAAAA,EAAM,OAAA;gBACNe,QAAAA,EAAU,YAAA;AACVK,gBAAAA,MAAAA,EAAQC,2BAAAA,CAAgB;AACtBC,oBAAAA,MAAAA,EAAQ5B,IAAI4B,MAAM;oBAClBC,KAAAA,EAAO;AACLP,wBAAAA;AACF;AACF,iBAAA;AACF,aAAA,CAAA;AACF,QAAA;AACF,KAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"plugins.mjs","sources":["../../../../src/node/vite/plugins.ts"],"sourcesContent":["import type { Plugin } from 'vite';\n\nimport { getDocumentHTML } from '../staticFiles';\nimport type { BuildContext } from '../create-build-context';\n\nconst buildFilesPlugin = (ctx: BuildContext): Plugin => {\n const CHUNK_ID = '.strapi/client/app.js';\n\n return {\n name: 'strapi/server/build-files',\n apply: 'build',\n buildStart() {\n this.emitFile({\n type: 'chunk',\n id: CHUNK_ID,\n name: 'strapi',\n });\n },\n async generateBundle(_options, outputBundle) {\n const bundle = outputBundle;\n const entryFile = Object.values(bundle).find(\n (file) =>\n file.type === 'chunk' && file.name === 'strapi' && file.facadeModuleId?.endsWith(CHUNK_ID)\n );\n\n if (!entryFile) {\n throw new Error(`Failed to find entry file in bundle (${CHUNK_ID})`);\n }\n\n if (entryFile.type !== 'chunk') {\n throw new Error('Entry file is not a chunk');\n }\n\n const entryFileName = entryFile.fileName;\n const entryPath = [ctx.basePath.replace(/\\/+$/, ''), entryFileName].join('/');\n\n this.emitFile({\n type: 'asset',\n fileName: 'index.html',\n source: getDocumentHTML({\n logger: ctx.logger,\n props: {\n entryPath,\n },\n }),\n });\n },\n };\n};\n\nexport { buildFilesPlugin };\n"],"names":["buildFilesPlugin","ctx","CHUNK_ID","name","apply","buildStart","emitFile","type","id","generateBundle","_options","outputBundle","bundle","entryFile","Object","values","find","file","facadeModuleId","endsWith","Error","entryFileName","fileName","entryPath","basePath","replace","join","source","getDocumentHTML","logger","props"],"mappings":";;AAKA,MAAMA,mBAAmB,CAACC,GAAAA,GAAAA;AACxB,IAAA,MAAMC,QAAW,GAAA,uBAAA;IAEjB,OAAO;QACLC,IAAM,EAAA,2BAAA;QACNC,KAAO,EAAA,OAAA;AACPC,QAAAA,UAAAA,CAAAA,GAAAA;YACE,IAAI,CAACC,QAAQ,CAAC;gBACZC,IAAM,EAAA,OAAA;gBACNC,EAAIN,EAAAA,QAAAA;gBACJC,IAAM,EAAA;AACR,aAAA,CAAA;AACF,SAAA;QACA,MAAMM,cAAAA,CAAAA,CAAeC,QAAQ,EAAEC,YAAY,EAAA;AACzC,YAAA,MAAMC,MAASD,GAAAA,YAAAA;YACf,MAAME,SAAAA,GAAYC,OAAOC,MAAM,CAACH,QAAQI,IAAI,CAC1C,CAACC,IACCA,GAAAA,IAAAA,CAAKV,IAAI,KAAK,OAAA,IAAWU,KAAKd,IAAI,KAAK,YAAYc,IAAKC,CAAAA,cAAc,EAAEC,QAASjB,CAAAA,QAAAA,CAAAA,CAAAA;AAGrF,YAAA,IAAI,CAACW,SAAW,EAAA;AACd,gBAAA,MAAM,IAAIO,KAAM,CAAA,CAAC,qCAAqC,EAAElB,QAAAA,CAAS,CAAC,CAAC,CAAA;AACrE;YAEA,IAAIW,SAAAA,CAAUN,IAAI,KAAK,OAAS,EAAA;AAC9B,gBAAA,MAAM,IAAIa,KAAM,CAAA,2BAAA,CAAA;AAClB;YAEA,MAAMC,aAAAA,GAAgBR,UAAUS,QAAQ;AACxC,YAAA,MAAMC,SAAY,GAAA;AAACtB,gBAAAA,GAAAA,CAAIuB,QAAQ,CAACC,OAAO,CAAC,MAAQ,EAAA,EAAA,CAAA;AAAKJ,gBAAAA;AAAc,aAAA,CAACK,IAAI,CAAC,GAAA,CAAA;YAEzE,IAAI,CAACpB,QAAQ,CAAC;gBACZC,IAAM,EAAA,OAAA;gBACNe,QAAU,EAAA,YAAA;AACVK,gBAAAA,MAAAA,EAAQC,eAAgB,CAAA;AACtBC,oBAAAA,MAAAA,EAAQ5B,IAAI4B,MAAM;oBAClBC,KAAO,EAAA;AACLP,wBAAAA;AACF;AACF,iBAAA;AACF,aAAA,CAAA;AACF;AACF,KAAA;AACF;;;;"}
1
+ {"version":3,"file":"plugins.mjs","sources":["../../../../src/node/vite/plugins.ts"],"sourcesContent":["import type { Plugin } from 'vite';\n\nimport { getDocumentHTML } from '../staticFiles';\nimport type { BuildContext } from '../create-build-context';\n\nconst buildFilesPlugin = (ctx: BuildContext): Plugin => {\n const CHUNK_ID = '.strapi/client/app.js';\n\n return {\n name: 'strapi/server/build-files',\n apply: 'build',\n buildStart() {\n this.emitFile({\n type: 'chunk',\n id: CHUNK_ID,\n name: 'strapi',\n });\n },\n async generateBundle(_options, outputBundle) {\n const bundle = outputBundle;\n const entryFile = Object.values(bundle).find(\n (file) =>\n file.type === 'chunk' && file.name === 'strapi' && file.facadeModuleId?.endsWith(CHUNK_ID)\n );\n\n if (!entryFile) {\n throw new Error(`Failed to find entry file in bundle (${CHUNK_ID})`);\n }\n\n if (entryFile.type !== 'chunk') {\n throw new Error('Entry file is not a chunk');\n }\n\n const entryFileName = entryFile.fileName;\n const entryPath = [ctx.basePath.replace(/\\/+$/, ''), entryFileName].join('/');\n\n this.emitFile({\n type: 'asset',\n fileName: 'index.html',\n source: getDocumentHTML({\n logger: ctx.logger,\n props: {\n entryPath,\n },\n }),\n });\n },\n };\n};\n\nexport { buildFilesPlugin };\n"],"names":["buildFilesPlugin","ctx","CHUNK_ID","name","apply","buildStart","emitFile","type","id","generateBundle","_options","outputBundle","bundle","entryFile","Object","values","find","file","facadeModuleId","endsWith","Error","entryFileName","fileName","entryPath","basePath","replace","join","source","getDocumentHTML","logger","props"],"mappings":";;AAKA,MAAMA,mBAAmB,CAACC,GAAAA,GAAAA;AACxB,IAAA,MAAMC,QAAAA,GAAW,uBAAA;IAEjB,OAAO;QACLC,IAAAA,EAAM,2BAAA;QACNC,KAAAA,EAAO,OAAA;AACPC,QAAAA,UAAAA,CAAAA,GAAAA;YACE,IAAI,CAACC,QAAQ,CAAC;gBACZC,IAAAA,EAAM,OAAA;gBACNC,EAAAA,EAAIN,QAAAA;gBACJC,IAAAA,EAAM;AACR,aAAA,CAAA;AACF,QAAA,CAAA;QACA,MAAMM,cAAAA,CAAAA,CAAeC,QAAQ,EAAEC,YAAY,EAAA;AACzC,YAAA,MAAMC,MAAAA,GAASD,YAAAA;YACf,MAAME,SAAAA,GAAYC,OAAOC,MAAM,CAACH,QAAQI,IAAI,CAC1C,CAACC,IAAAA,GACCA,IAAAA,CAAKV,IAAI,KAAK,OAAA,IAAWU,KAAKd,IAAI,KAAK,YAAYc,IAAAA,CAAKC,cAAc,EAAEC,QAAAA,CAASjB,QAAAA,CAAAA,CAAAA;AAGrF,YAAA,IAAI,CAACW,SAAAA,EAAW;AACd,gBAAA,MAAM,IAAIO,KAAAA,CAAM,CAAC,qCAAqC,EAAElB,QAAAA,CAAS,CAAC,CAAC,CAAA;AACrE,YAAA;YAEA,IAAIW,SAAAA,CAAUN,IAAI,KAAK,OAAA,EAAS;AAC9B,gBAAA,MAAM,IAAIa,KAAAA,CAAM,2BAAA,CAAA;AAClB,YAAA;YAEA,MAAMC,aAAAA,GAAgBR,UAAUS,QAAQ;AACxC,YAAA,MAAMC,SAAAA,GAAY;AAACtB,gBAAAA,GAAAA,CAAIuB,QAAQ,CAACC,OAAO,CAAC,MAAA,EAAQ,EAAA,CAAA;AAAKJ,gBAAAA;AAAc,aAAA,CAACK,IAAI,CAAC,GAAA,CAAA;YAEzE,IAAI,CAACpB,QAAQ,CAAC;gBACZC,IAAAA,EAAM,OAAA;gBACNe,QAAAA,EAAU,YAAA;AACVK,gBAAAA,MAAAA,EAAQC,eAAAA,CAAgB;AACtBC,oBAAAA,MAAAA,EAAQ5B,IAAI4B,MAAM;oBAClBC,KAAAA,EAAO;AACLP,wBAAAA;AACF;AACF,iBAAA;AACF,aAAA,CAAA;AACF,QAAA;AACF,KAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"watch.js","sources":["../../../../src/node/vite/watch.ts"],"sourcesContent":["import path from 'node:path';\nimport http from 'node:http';\nimport fs from 'node:fs/promises';\nimport { Server } from 'node:net';\nimport type { Core } from '@strapi/types';\n\nimport { mergeConfigWithUserConfig, resolveDevelopmentConfig } from './config';\n\nimport type { BuildContext } from '../create-build-context';\n\ninterface ViteWatcher {\n close(): Promise<void>;\n}\n\nconst HMR_DEFAULT_PORT = 5173;\nconst MAX_PORT_ATTEMPTS = 30;\n\nconst findAvailablePort = (\n startingPort: number,\n attemptsLeft = MAX_PORT_ATTEMPTS\n): Promise<number> => {\n return new Promise((resolve, reject) => {\n if (attemptsLeft <= 0) {\n reject(new Error(`No available ports found after ${MAX_PORT_ATTEMPTS} attempts.`));\n return;\n }\n\n const server = new Server();\n server.listen(startingPort, () => {\n const { port } = server.address() as { port: number };\n server.close(() => resolve(port));\n });\n\n server.on('error', (err: any) => {\n if (err.code === 'EADDRINUSE') {\n resolve(findAvailablePort(startingPort + 1, attemptsLeft - 1));\n } else {\n reject(err);\n }\n });\n });\n};\n\nconst createHMRServer = () => {\n return http.createServer(\n // http server request handler. keeps the same with\n // https://github.com/websockets/ws/blob/45e17acea791d865df6b255a55182e9c42e5877a/lib/websocket-server.js#L88-L96\n (_, res) => {\n const body = http.STATUS_CODES[426]; // Upgrade Required\n\n res.writeHead(426, {\n 'Content-Length': body?.length ?? 0,\n 'Content-Type': 'text/plain',\n });\n\n res.end(body);\n }\n );\n};\n\nconst watch = async (ctx: BuildContext): Promise<ViteWatcher> => {\n const hmrServer = createHMRServer();\n\n // Allowing Vite to find an available port doesn't work, so we'll find an available port manually\n // and use that. There is therefore a very slight race condition if you start up two servers at the same time\n // one might fail, or it might start up but listen on the wrong port.\n const availablePort = await findAvailablePort(HMR_DEFAULT_PORT);\n ctx.options.hmrServer = hmrServer;\n ctx.options.hmrClientPort = availablePort;\n\n const config = await resolveDevelopmentConfig(ctx);\n\n const finalConfig = await mergeConfigWithUserConfig(config, ctx);\n\n const hmrConfig = config.server?.hmr;\n\n // If the server used for Vite hmr is the one we've created (<> no user override)\n if (typeof hmrConfig === 'object' && hmrConfig.server === hmrServer) {\n // Only restart the hmr server when Strapi's server is listening\n strapi.server.httpServer.on('listening', async () => {\n hmrServer.listen(availablePort);\n });\n }\n\n ctx.logger.debug('Vite config', finalConfig);\n\n const { createServer } = await import('vite');\n\n const vite = await createServer(finalConfig);\n\n const viteMiddlewares: Core.MiddlewareHandler = (koaCtx, next) => {\n return new Promise((resolve, reject) => {\n const prefix = ctx.basePath.replace(ctx.adminPath, '').replace(/\\/+$/, '');\n\n const originalPath = koaCtx.path;\n if (!koaCtx.path.startsWith(prefix)) {\n koaCtx.path = `${prefix}${koaCtx.path}`;\n }\n\n // Set cache-control headers to prevent caching issues during development restarts\n koaCtx.set('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate');\n koaCtx.set('Pragma', 'no-cache');\n koaCtx.set('Expires', '0');\n koaCtx.set('Surrogate-Control', 'no-store');\n\n vite.middlewares(koaCtx.req, koaCtx.res, (err: unknown) => {\n if (err) {\n reject(err);\n } else {\n if (!koaCtx.res.headersSent) {\n koaCtx.path = originalPath;\n }\n\n resolve(next());\n }\n });\n });\n };\n\n const serveAdmin: Core.MiddlewareHandler = async (koaCtx, next) => {\n await next();\n\n if (koaCtx.method !== 'HEAD' && koaCtx.method !== 'GET') {\n return;\n }\n\n if (koaCtx.body != null || koaCtx.status !== 404) {\n return;\n }\n\n const url = koaCtx.originalUrl;\n\n try {\n let template = await fs.readFile(\n path.relative(ctx.cwd, '.strapi/client/index.html'),\n 'utf-8'\n );\n template = await vite.transformIndexHtml(url, template);\n\n koaCtx.type = 'html';\n koaCtx.body = template;\n } catch (error) {\n ctx.logger.error('Failed to serve admin panel in development mode:', error);\n // Don't fallback to other handlers in development mode to prevent MIME type conflicts\n koaCtx.status = 500;\n koaCtx.body = 'Admin panel temporarily unavailable during server restart';\n }\n };\n\n const adminRoute = `${ctx.adminPath}/:path*`;\n\n // Remove any existing admin routes to prevent conflicts during restart\n const existingRoutes = ctx.strapi.server.router.stack.filter(\n (layer) => layer.path === adminRoute\n );\n existingRoutes.forEach((route) => {\n const index = ctx.strapi.server.router.stack.indexOf(route);\n if (index > -1) {\n ctx.strapi.server.router.stack.splice(index, 1);\n }\n });\n\n ctx.strapi.server.router.get(adminRoute, serveAdmin);\n ctx.strapi.server.router.use(adminRoute, viteMiddlewares);\n\n return {\n async close() {\n await vite.close();\n\n if (hmrServer.listening) {\n // Manually close the hmr server\n // /!\\ This operation MUST be done after calling .close() on the vite\n // instance to avoid flaky behaviors with attached clients\n await new Promise<void>((resolve, reject) => {\n hmrServer.close((err) => (err ? reject(err) : resolve()));\n });\n }\n },\n };\n};\n\nexport { watch };\nexport type { ViteWatcher };\n"],"names":["HMR_DEFAULT_PORT","MAX_PORT_ATTEMPTS","findAvailablePort","startingPort","attemptsLeft","Promise","resolve","reject","Error","server","Server","listen","port","address","close","on","err","code","createHMRServer","http","createServer","_","res","body","STATUS_CODES","writeHead","length","end","watch","ctx","hmrServer","availablePort","options","hmrClientPort","config","resolveDevelopmentConfig","finalConfig","mergeConfigWithUserConfig","hmrConfig","hmr","strapi","httpServer","logger","debug","vite","viteMiddlewares","koaCtx","next","prefix","basePath","replace","adminPath","originalPath","path","startsWith","set","middlewares","req","headersSent","serveAdmin","method","status","url","originalUrl","template","fs","readFile","relative","cwd","transformIndexHtml","type","error","adminRoute","existingRoutes","router","stack","filter","layer","forEach","route","index","indexOf","splice","get","use","listening"],"mappings":"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"}
1
+ {"version":3,"file":"watch.js","sources":["../../../../src/node/vite/watch.ts"],"sourcesContent":["import path from 'node:path';\nimport http from 'node:http';\nimport fs from 'node:fs/promises';\nimport { Server } from 'node:net';\nimport type { Core } from '@strapi/types';\n\nimport { mergeConfigWithUserConfig, resolveDevelopmentConfig } from './config';\n\nimport type { BuildContext } from '../create-build-context';\n\ninterface ViteWatcher {\n close(): Promise<void>;\n}\n\nconst HMR_DEFAULT_PORT = 5173;\nconst MAX_PORT_ATTEMPTS = 30;\n\nconst findAvailablePort = (\n startingPort: number,\n attemptsLeft = MAX_PORT_ATTEMPTS\n): Promise<number> => {\n return new Promise((resolve, reject) => {\n if (attemptsLeft <= 0) {\n reject(new Error(`No available ports found after ${MAX_PORT_ATTEMPTS} attempts.`));\n return;\n }\n\n const server = new Server();\n server.listen(startingPort, () => {\n const { port } = server.address() as { port: number };\n server.close(() => resolve(port));\n });\n\n server.on('error', (err: any) => {\n if (err.code === 'EADDRINUSE') {\n resolve(findAvailablePort(startingPort + 1, attemptsLeft - 1));\n } else {\n reject(err);\n }\n });\n });\n};\n\nconst createHMRServer = () => {\n return http.createServer(\n // http server request handler. keeps the same with\n // https://github.com/websockets/ws/blob/45e17acea791d865df6b255a55182e9c42e5877a/lib/websocket-server.js#L88-L96\n (_, res) => {\n const body = http.STATUS_CODES[426]; // Upgrade Required\n\n res.writeHead(426, {\n 'Content-Length': body?.length ?? 0,\n 'Content-Type': 'text/plain',\n });\n\n res.end(body);\n }\n );\n};\n\nconst watch = async (ctx: BuildContext): Promise<ViteWatcher> => {\n const hmrServer = createHMRServer();\n\n // Allowing Vite to find an available port doesn't work, so we'll find an available port manually\n // and use that. There is therefore a very slight race condition if you start up two servers at the same time\n // one might fail, or it might start up but listen on the wrong port.\n const availablePort = await findAvailablePort(HMR_DEFAULT_PORT);\n ctx.options.hmrServer = hmrServer;\n ctx.options.hmrClientPort = availablePort;\n\n const config = await resolveDevelopmentConfig(ctx);\n\n const finalConfig = await mergeConfigWithUserConfig(config, ctx);\n\n const hmrConfig = config.server?.hmr;\n\n // If the server used for Vite hmr is the one we've created (<> no user override)\n if (typeof hmrConfig === 'object' && hmrConfig.server === hmrServer) {\n // Only restart the hmr server when Strapi's server is listening\n strapi.server.httpServer.on('listening', async () => {\n hmrServer.listen(availablePort);\n });\n }\n\n ctx.logger.debug('Vite config', finalConfig);\n\n const { createServer } = await import('vite');\n\n const vite = await createServer(finalConfig);\n\n const viteMiddlewares: Core.MiddlewareHandler = (koaCtx, next) => {\n return new Promise((resolve, reject) => {\n const prefix = ctx.basePath.replace(ctx.adminPath, '').replace(/\\/+$/, '');\n\n const originalPath = koaCtx.path;\n if (!koaCtx.path.startsWith(prefix)) {\n koaCtx.path = `${prefix}${koaCtx.path}`;\n }\n\n // Set cache-control headers to prevent caching issues during development restarts\n koaCtx.set('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate');\n koaCtx.set('Pragma', 'no-cache');\n koaCtx.set('Expires', '0');\n koaCtx.set('Surrogate-Control', 'no-store');\n\n vite.middlewares(koaCtx.req, koaCtx.res, (err: unknown) => {\n if (err) {\n reject(err);\n } else {\n if (!koaCtx.res.headersSent) {\n koaCtx.path = originalPath;\n }\n\n resolve(next());\n }\n });\n });\n };\n\n const serveAdmin: Core.MiddlewareHandler = async (koaCtx, next) => {\n await next();\n\n if (koaCtx.method !== 'HEAD' && koaCtx.method !== 'GET') {\n return;\n }\n\n if (koaCtx.body != null || koaCtx.status !== 404) {\n return;\n }\n\n const url = koaCtx.originalUrl;\n\n try {\n let template = await fs.readFile(\n path.relative(ctx.cwd, '.strapi/client/index.html'),\n 'utf-8'\n );\n template = await vite.transformIndexHtml(url, template);\n\n koaCtx.type = 'html';\n koaCtx.body = template;\n } catch (error) {\n ctx.logger.error('Failed to serve admin panel in development mode:', error);\n // Don't fallback to other handlers in development mode to prevent MIME type conflicts\n koaCtx.status = 500;\n koaCtx.body = 'Admin panel temporarily unavailable during server restart';\n }\n };\n\n const adminRoute = `${ctx.adminPath}/:path*`;\n\n // Remove any existing admin routes to prevent conflicts during restart\n const existingRoutes = ctx.strapi.server.router.stack.filter(\n (layer) => layer.path === adminRoute\n );\n existingRoutes.forEach((route) => {\n const index = ctx.strapi.server.router.stack.indexOf(route);\n if (index > -1) {\n ctx.strapi.server.router.stack.splice(index, 1);\n }\n });\n\n ctx.strapi.server.router.get(adminRoute, serveAdmin);\n ctx.strapi.server.router.use(adminRoute, viteMiddlewares);\n\n return {\n async close() {\n await vite.close();\n\n if (hmrServer.listening) {\n // Manually close the hmr server\n // /!\\ This operation MUST be done after calling .close() on the vite\n // instance to avoid flaky behaviors with attached clients\n await new Promise<void>((resolve, reject) => {\n hmrServer.close((err) => (err ? reject(err) : resolve()));\n });\n }\n },\n };\n};\n\nexport { watch };\nexport type { ViteWatcher };\n"],"names":["HMR_DEFAULT_PORT","MAX_PORT_ATTEMPTS","findAvailablePort","startingPort","attemptsLeft","Promise","resolve","reject","Error","server","Server","listen","port","address","close","on","err","code","createHMRServer","http","createServer","_","res","body","STATUS_CODES","writeHead","length","end","watch","ctx","hmrServer","availablePort","options","hmrClientPort","config","resolveDevelopmentConfig","finalConfig","mergeConfigWithUserConfig","hmrConfig","hmr","strapi","httpServer","logger","debug","vite","viteMiddlewares","koaCtx","next","prefix","basePath","replace","adminPath","originalPath","path","startsWith","set","middlewares","req","headersSent","serveAdmin","method","status","url","originalUrl","template","fs","readFile","relative","cwd","transformIndexHtml","type","error","adminRoute","existingRoutes","router","stack","filter","layer","forEach","route","index","indexOf","splice","get","use","listening"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"watch.mjs","sources":["../../../../src/node/vite/watch.ts"],"sourcesContent":["import path from 'node:path';\nimport http from 'node:http';\nimport fs from 'node:fs/promises';\nimport { Server } from 'node:net';\nimport type { Core } from '@strapi/types';\n\nimport { mergeConfigWithUserConfig, resolveDevelopmentConfig } from './config';\n\nimport type { BuildContext } from '../create-build-context';\n\ninterface ViteWatcher {\n close(): Promise<void>;\n}\n\nconst HMR_DEFAULT_PORT = 5173;\nconst MAX_PORT_ATTEMPTS = 30;\n\nconst findAvailablePort = (\n startingPort: number,\n attemptsLeft = MAX_PORT_ATTEMPTS\n): Promise<number> => {\n return new Promise((resolve, reject) => {\n if (attemptsLeft <= 0) {\n reject(new Error(`No available ports found after ${MAX_PORT_ATTEMPTS} attempts.`));\n return;\n }\n\n const server = new Server();\n server.listen(startingPort, () => {\n const { port } = server.address() as { port: number };\n server.close(() => resolve(port));\n });\n\n server.on('error', (err: any) => {\n if (err.code === 'EADDRINUSE') {\n resolve(findAvailablePort(startingPort + 1, attemptsLeft - 1));\n } else {\n reject(err);\n }\n });\n });\n};\n\nconst createHMRServer = () => {\n return http.createServer(\n // http server request handler. keeps the same with\n // https://github.com/websockets/ws/blob/45e17acea791d865df6b255a55182e9c42e5877a/lib/websocket-server.js#L88-L96\n (_, res) => {\n const body = http.STATUS_CODES[426]; // Upgrade Required\n\n res.writeHead(426, {\n 'Content-Length': body?.length ?? 0,\n 'Content-Type': 'text/plain',\n });\n\n res.end(body);\n }\n );\n};\n\nconst watch = async (ctx: BuildContext): Promise<ViteWatcher> => {\n const hmrServer = createHMRServer();\n\n // Allowing Vite to find an available port doesn't work, so we'll find an available port manually\n // and use that. There is therefore a very slight race condition if you start up two servers at the same time\n // one might fail, or it might start up but listen on the wrong port.\n const availablePort = await findAvailablePort(HMR_DEFAULT_PORT);\n ctx.options.hmrServer = hmrServer;\n ctx.options.hmrClientPort = availablePort;\n\n const config = await resolveDevelopmentConfig(ctx);\n\n const finalConfig = await mergeConfigWithUserConfig(config, ctx);\n\n const hmrConfig = config.server?.hmr;\n\n // If the server used for Vite hmr is the one we've created (<> no user override)\n if (typeof hmrConfig === 'object' && hmrConfig.server === hmrServer) {\n // Only restart the hmr server when Strapi's server is listening\n strapi.server.httpServer.on('listening', async () => {\n hmrServer.listen(availablePort);\n });\n }\n\n ctx.logger.debug('Vite config', finalConfig);\n\n const { createServer } = await import('vite');\n\n const vite = await createServer(finalConfig);\n\n const viteMiddlewares: Core.MiddlewareHandler = (koaCtx, next) => {\n return new Promise((resolve, reject) => {\n const prefix = ctx.basePath.replace(ctx.adminPath, '').replace(/\\/+$/, '');\n\n const originalPath = koaCtx.path;\n if (!koaCtx.path.startsWith(prefix)) {\n koaCtx.path = `${prefix}${koaCtx.path}`;\n }\n\n // Set cache-control headers to prevent caching issues during development restarts\n koaCtx.set('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate');\n koaCtx.set('Pragma', 'no-cache');\n koaCtx.set('Expires', '0');\n koaCtx.set('Surrogate-Control', 'no-store');\n\n vite.middlewares(koaCtx.req, koaCtx.res, (err: unknown) => {\n if (err) {\n reject(err);\n } else {\n if (!koaCtx.res.headersSent) {\n koaCtx.path = originalPath;\n }\n\n resolve(next());\n }\n });\n });\n };\n\n const serveAdmin: Core.MiddlewareHandler = async (koaCtx, next) => {\n await next();\n\n if (koaCtx.method !== 'HEAD' && koaCtx.method !== 'GET') {\n return;\n }\n\n if (koaCtx.body != null || koaCtx.status !== 404) {\n return;\n }\n\n const url = koaCtx.originalUrl;\n\n try {\n let template = await fs.readFile(\n path.relative(ctx.cwd, '.strapi/client/index.html'),\n 'utf-8'\n );\n template = await vite.transformIndexHtml(url, template);\n\n koaCtx.type = 'html';\n koaCtx.body = template;\n } catch (error) {\n ctx.logger.error('Failed to serve admin panel in development mode:', error);\n // Don't fallback to other handlers in development mode to prevent MIME type conflicts\n koaCtx.status = 500;\n koaCtx.body = 'Admin panel temporarily unavailable during server restart';\n }\n };\n\n const adminRoute = `${ctx.adminPath}/:path*`;\n\n // Remove any existing admin routes to prevent conflicts during restart\n const existingRoutes = ctx.strapi.server.router.stack.filter(\n (layer) => layer.path === adminRoute\n );\n existingRoutes.forEach((route) => {\n const index = ctx.strapi.server.router.stack.indexOf(route);\n if (index > -1) {\n ctx.strapi.server.router.stack.splice(index, 1);\n }\n });\n\n ctx.strapi.server.router.get(adminRoute, serveAdmin);\n ctx.strapi.server.router.use(adminRoute, viteMiddlewares);\n\n return {\n async close() {\n await vite.close();\n\n if (hmrServer.listening) {\n // Manually close the hmr server\n // /!\\ This operation MUST be done after calling .close() on the vite\n // instance to avoid flaky behaviors with attached clients\n await new Promise<void>((resolve, reject) => {\n hmrServer.close((err) => (err ? reject(err) : resolve()));\n });\n }\n },\n };\n};\n\nexport { watch };\nexport type { ViteWatcher };\n"],"names":["HMR_DEFAULT_PORT","MAX_PORT_ATTEMPTS","findAvailablePort","startingPort","attemptsLeft","Promise","resolve","reject","Error","server","Server","listen","port","address","close","on","err","code","createHMRServer","http","createServer","_","res","body","STATUS_CODES","writeHead","length","end","watch","ctx","hmrServer","availablePort","options","hmrClientPort","config","resolveDevelopmentConfig","finalConfig","mergeConfigWithUserConfig","hmrConfig","hmr","strapi","httpServer","logger","debug","vite","viteMiddlewares","koaCtx","next","prefix","basePath","replace","adminPath","originalPath","path","startsWith","set","middlewares","req","headersSent","serveAdmin","method","status","url","originalUrl","template","fs","readFile","relative","cwd","transformIndexHtml","type","error","adminRoute","existingRoutes","router","stack","filter","layer","forEach","route","index","indexOf","splice","get","use","listening"],"mappings":"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"}
1
+ {"version":3,"file":"watch.mjs","sources":["../../../../src/node/vite/watch.ts"],"sourcesContent":["import path from 'node:path';\nimport http from 'node:http';\nimport fs from 'node:fs/promises';\nimport { Server } from 'node:net';\nimport type { Core } from '@strapi/types';\n\nimport { mergeConfigWithUserConfig, resolveDevelopmentConfig } from './config';\n\nimport type { BuildContext } from '../create-build-context';\n\ninterface ViteWatcher {\n close(): Promise<void>;\n}\n\nconst HMR_DEFAULT_PORT = 5173;\nconst MAX_PORT_ATTEMPTS = 30;\n\nconst findAvailablePort = (\n startingPort: number,\n attemptsLeft = MAX_PORT_ATTEMPTS\n): Promise<number> => {\n return new Promise((resolve, reject) => {\n if (attemptsLeft <= 0) {\n reject(new Error(`No available ports found after ${MAX_PORT_ATTEMPTS} attempts.`));\n return;\n }\n\n const server = new Server();\n server.listen(startingPort, () => {\n const { port } = server.address() as { port: number };\n server.close(() => resolve(port));\n });\n\n server.on('error', (err: any) => {\n if (err.code === 'EADDRINUSE') {\n resolve(findAvailablePort(startingPort + 1, attemptsLeft - 1));\n } else {\n reject(err);\n }\n });\n });\n};\n\nconst createHMRServer = () => {\n return http.createServer(\n // http server request handler. keeps the same with\n // https://github.com/websockets/ws/blob/45e17acea791d865df6b255a55182e9c42e5877a/lib/websocket-server.js#L88-L96\n (_, res) => {\n const body = http.STATUS_CODES[426]; // Upgrade Required\n\n res.writeHead(426, {\n 'Content-Length': body?.length ?? 0,\n 'Content-Type': 'text/plain',\n });\n\n res.end(body);\n }\n );\n};\n\nconst watch = async (ctx: BuildContext): Promise<ViteWatcher> => {\n const hmrServer = createHMRServer();\n\n // Allowing Vite to find an available port doesn't work, so we'll find an available port manually\n // and use that. There is therefore a very slight race condition if you start up two servers at the same time\n // one might fail, or it might start up but listen on the wrong port.\n const availablePort = await findAvailablePort(HMR_DEFAULT_PORT);\n ctx.options.hmrServer = hmrServer;\n ctx.options.hmrClientPort = availablePort;\n\n const config = await resolveDevelopmentConfig(ctx);\n\n const finalConfig = await mergeConfigWithUserConfig(config, ctx);\n\n const hmrConfig = config.server?.hmr;\n\n // If the server used for Vite hmr is the one we've created (<> no user override)\n if (typeof hmrConfig === 'object' && hmrConfig.server === hmrServer) {\n // Only restart the hmr server when Strapi's server is listening\n strapi.server.httpServer.on('listening', async () => {\n hmrServer.listen(availablePort);\n });\n }\n\n ctx.logger.debug('Vite config', finalConfig);\n\n const { createServer } = await import('vite');\n\n const vite = await createServer(finalConfig);\n\n const viteMiddlewares: Core.MiddlewareHandler = (koaCtx, next) => {\n return new Promise((resolve, reject) => {\n const prefix = ctx.basePath.replace(ctx.adminPath, '').replace(/\\/+$/, '');\n\n const originalPath = koaCtx.path;\n if (!koaCtx.path.startsWith(prefix)) {\n koaCtx.path = `${prefix}${koaCtx.path}`;\n }\n\n // Set cache-control headers to prevent caching issues during development restarts\n koaCtx.set('Cache-Control', 'no-store, no-cache, must-revalidate, proxy-revalidate');\n koaCtx.set('Pragma', 'no-cache');\n koaCtx.set('Expires', '0');\n koaCtx.set('Surrogate-Control', 'no-store');\n\n vite.middlewares(koaCtx.req, koaCtx.res, (err: unknown) => {\n if (err) {\n reject(err);\n } else {\n if (!koaCtx.res.headersSent) {\n koaCtx.path = originalPath;\n }\n\n resolve(next());\n }\n });\n });\n };\n\n const serveAdmin: Core.MiddlewareHandler = async (koaCtx, next) => {\n await next();\n\n if (koaCtx.method !== 'HEAD' && koaCtx.method !== 'GET') {\n return;\n }\n\n if (koaCtx.body != null || koaCtx.status !== 404) {\n return;\n }\n\n const url = koaCtx.originalUrl;\n\n try {\n let template = await fs.readFile(\n path.relative(ctx.cwd, '.strapi/client/index.html'),\n 'utf-8'\n );\n template = await vite.transformIndexHtml(url, template);\n\n koaCtx.type = 'html';\n koaCtx.body = template;\n } catch (error) {\n ctx.logger.error('Failed to serve admin panel in development mode:', error);\n // Don't fallback to other handlers in development mode to prevent MIME type conflicts\n koaCtx.status = 500;\n koaCtx.body = 'Admin panel temporarily unavailable during server restart';\n }\n };\n\n const adminRoute = `${ctx.adminPath}/:path*`;\n\n // Remove any existing admin routes to prevent conflicts during restart\n const existingRoutes = ctx.strapi.server.router.stack.filter(\n (layer) => layer.path === adminRoute\n );\n existingRoutes.forEach((route) => {\n const index = ctx.strapi.server.router.stack.indexOf(route);\n if (index > -1) {\n ctx.strapi.server.router.stack.splice(index, 1);\n }\n });\n\n ctx.strapi.server.router.get(adminRoute, serveAdmin);\n ctx.strapi.server.router.use(adminRoute, viteMiddlewares);\n\n return {\n async close() {\n await vite.close();\n\n if (hmrServer.listening) {\n // Manually close the hmr server\n // /!\\ This operation MUST be done after calling .close() on the vite\n // instance to avoid flaky behaviors with attached clients\n await new Promise<void>((resolve, reject) => {\n hmrServer.close((err) => (err ? reject(err) : resolve()));\n });\n }\n },\n };\n};\n\nexport { watch };\nexport type { ViteWatcher };\n"],"names":["HMR_DEFAULT_PORT","MAX_PORT_ATTEMPTS","findAvailablePort","startingPort","attemptsLeft","Promise","resolve","reject","Error","server","Server","listen","port","address","close","on","err","code","createHMRServer","http","createServer","_","res","body","STATUS_CODES","writeHead","length","end","watch","ctx","hmrServer","availablePort","options","hmrClientPort","config","resolveDevelopmentConfig","finalConfig","mergeConfigWithUserConfig","hmrConfig","hmr","strapi","httpServer","logger","debug","vite","viteMiddlewares","koaCtx","next","prefix","basePath","replace","adminPath","originalPath","path","startsWith","set","middlewares","req","headersSent","serveAdmin","method","status","url","originalUrl","template","fs","readFile","relative","cwd","transformIndexHtml","type","error","adminRoute","existingRoutes","router","stack","filter","layer","forEach","route","index","indexOf","splice","get","use","listening"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"build.js","sources":["../../../../src/node/webpack/build.ts"],"sourcesContent":["import webpack from 'webpack';\n\nimport { mergeConfigWithUserConfig, resolveProductionConfig } from './config';\nimport { isError } from '../core/errors';\n\nimport type { BuildContext } from '../create-build-context';\n\nconst build = async (ctx: BuildContext) => {\n const config = await resolveProductionConfig(ctx);\n const finalConfig = await mergeConfigWithUserConfig(config, ctx);\n\n ctx.logger.debug('Webpack config', finalConfig);\n\n return new Promise((resolve, reject) => {\n webpack(finalConfig, (err, stats) => {\n if (stats) {\n if (stats.hasErrors()) {\n ctx.logger.error(\n stats.toString({\n chunks: false,\n colors: true,\n })\n );\n\n reject();\n } else if (ctx.options.stats) {\n ctx.logger.info(\n stats.toString({\n chunks: false,\n colors: true,\n })\n );\n }\n\n resolve(true);\n }\n\n if (err && isError(err)) {\n ctx.logger.error(err.message);\n reject();\n }\n });\n });\n};\n\nexport { build };\n"],"names":["build","ctx","config","resolveProductionConfig","finalConfig","mergeConfigWithUserConfig","logger","debug","Promise","resolve","reject","webpack","err","stats","hasErrors","error","toString","chunks","colors","options","info","isError","message"],"mappings":";;;;;;AAOA,MAAMA,QAAQ,OAAOC,GAAAA,GAAAA;IACnB,MAAMC,QAAAA,GAAS,MAAMC,8BAAwBF,CAAAA,GAAAA,CAAAA;IAC7C,MAAMG,WAAAA,GAAc,MAAMC,gCAAAA,CAA0BH,QAAQD,EAAAA,GAAAA,CAAAA;AAE5DA,IAAAA,GAAAA,CAAIK,MAAM,CAACC,KAAK,CAAC,gBAAkBH,EAAAA,WAAAA,CAAAA;IAEnC,OAAO,IAAII,OAAQ,CAAA,CAACC,OAASC,EAAAA,MAAAA,GAAAA;QAC3BC,OAAQP,CAAAA,WAAAA,EAAa,CAACQ,GAAKC,EAAAA,KAAAA,GAAAA;AACzB,YAAA,IAAIA,KAAO,EAAA;gBACT,IAAIA,KAAAA,CAAMC,SAAS,EAAI,EAAA;AACrBb,oBAAAA,GAAAA,CAAIK,MAAM,CAACS,KAAK,CACdF,KAAAA,CAAMG,QAAQ,CAAC;wBACbC,MAAQ,EAAA,KAAA;wBACRC,MAAQ,EAAA;AACV,qBAAA,CAAA,CAAA;AAGFR,oBAAAA,MAAAA,EAAAA;AACF,iBAAA,MAAO,IAAIT,GAAAA,CAAIkB,OAAO,CAACN,KAAK,EAAE;AAC5BZ,oBAAAA,GAAAA,CAAIK,MAAM,CAACc,IAAI,CACbP,KAAAA,CAAMG,QAAQ,CAAC;wBACbC,MAAQ,EAAA,KAAA;wBACRC,MAAQ,EAAA;AACV,qBAAA,CAAA,CAAA;AAEJ;gBAEAT,OAAQ,CAAA,IAAA,CAAA;AACV;YAEA,IAAIG,GAAAA,IAAOS,eAAQT,GAAM,CAAA,EAAA;AACvBX,gBAAAA,GAAAA,CAAIK,MAAM,CAACS,KAAK,CAACH,IAAIU,OAAO,CAAA;AAC5BZ,gBAAAA,MAAAA,EAAAA;AACF;AACF,SAAA,CAAA;AACF,KAAA,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"build.js","sources":["../../../../src/node/webpack/build.ts"],"sourcesContent":["import webpack from 'webpack';\n\nimport { mergeConfigWithUserConfig, resolveProductionConfig } from './config';\nimport { isError } from '../core/errors';\n\nimport type { BuildContext } from '../create-build-context';\n\nconst build = async (ctx: BuildContext) => {\n const config = await resolveProductionConfig(ctx);\n const finalConfig = await mergeConfigWithUserConfig(config, ctx);\n\n ctx.logger.debug('Webpack config', finalConfig);\n\n return new Promise((resolve, reject) => {\n webpack(finalConfig, (err, stats) => {\n if (stats) {\n if (stats.hasErrors()) {\n ctx.logger.error(\n stats.toString({\n chunks: false,\n colors: true,\n })\n );\n\n reject();\n } else if (ctx.options.stats) {\n ctx.logger.info(\n stats.toString({\n chunks: false,\n colors: true,\n })\n );\n }\n\n resolve(true);\n }\n\n if (err && isError(err)) {\n ctx.logger.error(err.message);\n reject();\n }\n });\n });\n};\n\nexport { build };\n"],"names":["build","ctx","config","resolveProductionConfig","finalConfig","mergeConfigWithUserConfig","logger","debug","Promise","resolve","reject","webpack","err","stats","hasErrors","error","toString","chunks","colors","options","info","isError","message"],"mappings":";;;;;;AAOA,MAAMA,QAAQ,OAAOC,GAAAA,GAAAA;IACnB,MAAMC,QAAAA,GAAS,MAAMC,8BAAAA,CAAwBF,GAAAA,CAAAA;IAC7C,MAAMG,WAAAA,GAAc,MAAMC,gCAAAA,CAA0BH,QAAAA,EAAQD,GAAAA,CAAAA;AAE5DA,IAAAA,GAAAA,CAAIK,MAAM,CAACC,KAAK,CAAC,gBAAA,EAAkBH,WAAAA,CAAAA;IAEnC,OAAO,IAAII,OAAAA,CAAQ,CAACC,OAAAA,EAASC,MAAAA,GAAAA;QAC3BC,OAAAA,CAAQP,WAAAA,EAAa,CAACQ,GAAAA,EAAKC,KAAAA,GAAAA;AACzB,YAAA,IAAIA,KAAAA,EAAO;gBACT,IAAIA,KAAAA,CAAMC,SAAS,EAAA,EAAI;AACrBb,oBAAAA,GAAAA,CAAIK,MAAM,CAACS,KAAK,CACdF,KAAAA,CAAMG,QAAQ,CAAC;wBACbC,MAAAA,EAAQ,KAAA;wBACRC,MAAAA,EAAQ;AACV,qBAAA,CAAA,CAAA;AAGFR,oBAAAA,MAAAA,EAAAA;AACF,gBAAA,CAAA,MAAO,IAAIT,GAAAA,CAAIkB,OAAO,CAACN,KAAK,EAAE;AAC5BZ,oBAAAA,GAAAA,CAAIK,MAAM,CAACc,IAAI,CACbP,KAAAA,CAAMG,QAAQ,CAAC;wBACbC,MAAAA,EAAQ,KAAA;wBACRC,MAAAA,EAAQ;AACV,qBAAA,CAAA,CAAA;AAEJ,gBAAA;gBAEAT,OAAAA,CAAQ,IAAA,CAAA;AACV,YAAA;YAEA,IAAIG,GAAAA,IAAOS,eAAQT,GAAAA,CAAAA,EAAM;AACvBX,gBAAAA,GAAAA,CAAIK,MAAM,CAACS,KAAK,CAACH,IAAIU,OAAO,CAAA;AAC5BZ,gBAAAA,MAAAA,EAAAA;AACF,YAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA,CAAA,CAAA;AACF;;;;"}
@@ -1 +1 @@
1
- {"version":3,"file":"build.mjs","sources":["../../../../src/node/webpack/build.ts"],"sourcesContent":["import webpack from 'webpack';\n\nimport { mergeConfigWithUserConfig, resolveProductionConfig } from './config';\nimport { isError } from '../core/errors';\n\nimport type { BuildContext } from '../create-build-context';\n\nconst build = async (ctx: BuildContext) => {\n const config = await resolveProductionConfig(ctx);\n const finalConfig = await mergeConfigWithUserConfig(config, ctx);\n\n ctx.logger.debug('Webpack config', finalConfig);\n\n return new Promise((resolve, reject) => {\n webpack(finalConfig, (err, stats) => {\n if (stats) {\n if (stats.hasErrors()) {\n ctx.logger.error(\n stats.toString({\n chunks: false,\n colors: true,\n })\n );\n\n reject();\n } else if (ctx.options.stats) {\n ctx.logger.info(\n stats.toString({\n chunks: false,\n colors: true,\n })\n );\n }\n\n resolve(true);\n }\n\n if (err && isError(err)) {\n ctx.logger.error(err.message);\n reject();\n }\n });\n });\n};\n\nexport { build };\n"],"names":["build","ctx","config","resolveProductionConfig","finalConfig","mergeConfigWithUserConfig","logger","debug","Promise","resolve","reject","webpack","err","stats","hasErrors","error","toString","chunks","colors","options","info","isError","message"],"mappings":";;;;AAOA,MAAMA,QAAQ,OAAOC,GAAAA,GAAAA;IACnB,MAAMC,MAAAA,GAAS,MAAMC,uBAAwBF,CAAAA,GAAAA,CAAAA;IAC7C,MAAMG,WAAAA,GAAc,MAAMC,yBAAAA,CAA0BH,MAAQD,EAAAA,GAAAA,CAAAA;AAE5DA,IAAAA,GAAAA,CAAIK,MAAM,CAACC,KAAK,CAAC,gBAAkBH,EAAAA,WAAAA,CAAAA;IAEnC,OAAO,IAAII,OAAQ,CAAA,CAACC,OAASC,EAAAA,MAAAA,GAAAA;QAC3BC,OAAQP,CAAAA,WAAAA,EAAa,CAACQ,GAAKC,EAAAA,KAAAA,GAAAA;AACzB,YAAA,IAAIA,KAAO,EAAA;gBACT,IAAIA,KAAAA,CAAMC,SAAS,EAAI,EAAA;AACrBb,oBAAAA,GAAAA,CAAIK,MAAM,CAACS,KAAK,CACdF,KAAAA,CAAMG,QAAQ,CAAC;wBACbC,MAAQ,EAAA,KAAA;wBACRC,MAAQ,EAAA;AACV,qBAAA,CAAA,CAAA;AAGFR,oBAAAA,MAAAA,EAAAA;AACF,iBAAA,MAAO,IAAIT,GAAAA,CAAIkB,OAAO,CAACN,KAAK,EAAE;AAC5BZ,oBAAAA,GAAAA,CAAIK,MAAM,CAACc,IAAI,CACbP,KAAAA,CAAMG,QAAQ,CAAC;wBACbC,MAAQ,EAAA,KAAA;wBACRC,MAAQ,EAAA;AACV,qBAAA,CAAA,CAAA;AAEJ;gBAEAT,OAAQ,CAAA,IAAA,CAAA;AACV;YAEA,IAAIG,GAAAA,IAAOS,QAAQT,GAAM,CAAA,EAAA;AACvBX,gBAAAA,GAAAA,CAAIK,MAAM,CAACS,KAAK,CAACH,IAAIU,OAAO,CAAA;AAC5BZ,gBAAAA,MAAAA,EAAAA;AACF;AACF,SAAA,CAAA;AACF,KAAA,CAAA;AACF;;;;"}
1
+ {"version":3,"file":"build.mjs","sources":["../../../../src/node/webpack/build.ts"],"sourcesContent":["import webpack from 'webpack';\n\nimport { mergeConfigWithUserConfig, resolveProductionConfig } from './config';\nimport { isError } from '../core/errors';\n\nimport type { BuildContext } from '../create-build-context';\n\nconst build = async (ctx: BuildContext) => {\n const config = await resolveProductionConfig(ctx);\n const finalConfig = await mergeConfigWithUserConfig(config, ctx);\n\n ctx.logger.debug('Webpack config', finalConfig);\n\n return new Promise((resolve, reject) => {\n webpack(finalConfig, (err, stats) => {\n if (stats) {\n if (stats.hasErrors()) {\n ctx.logger.error(\n stats.toString({\n chunks: false,\n colors: true,\n })\n );\n\n reject();\n } else if (ctx.options.stats) {\n ctx.logger.info(\n stats.toString({\n chunks: false,\n colors: true,\n })\n );\n }\n\n resolve(true);\n }\n\n if (err && isError(err)) {\n ctx.logger.error(err.message);\n reject();\n }\n });\n });\n};\n\nexport { build };\n"],"names":["build","ctx","config","resolveProductionConfig","finalConfig","mergeConfigWithUserConfig","logger","debug","Promise","resolve","reject","webpack","err","stats","hasErrors","error","toString","chunks","colors","options","info","isError","message"],"mappings":";;;;AAOA,MAAMA,QAAQ,OAAOC,GAAAA,GAAAA;IACnB,MAAMC,MAAAA,GAAS,MAAMC,uBAAAA,CAAwBF,GAAAA,CAAAA;IAC7C,MAAMG,WAAAA,GAAc,MAAMC,yBAAAA,CAA0BH,MAAAA,EAAQD,GAAAA,CAAAA;AAE5DA,IAAAA,GAAAA,CAAIK,MAAM,CAACC,KAAK,CAAC,gBAAA,EAAkBH,WAAAA,CAAAA;IAEnC,OAAO,IAAII,OAAAA,CAAQ,CAACC,OAAAA,EAASC,MAAAA,GAAAA;QAC3BC,OAAAA,CAAQP,WAAAA,EAAa,CAACQ,GAAAA,EAAKC,KAAAA,GAAAA;AACzB,YAAA,IAAIA,KAAAA,EAAO;gBACT,IAAIA,KAAAA,CAAMC,SAAS,EAAA,EAAI;AACrBb,oBAAAA,GAAAA,CAAIK,MAAM,CAACS,KAAK,CACdF,KAAAA,CAAMG,QAAQ,CAAC;wBACbC,MAAAA,EAAQ,KAAA;wBACRC,MAAAA,EAAQ;AACV,qBAAA,CAAA,CAAA;AAGFR,oBAAAA,MAAAA,EAAAA;AACF,gBAAA,CAAA,MAAO,IAAIT,GAAAA,CAAIkB,OAAO,CAACN,KAAK,EAAE;AAC5BZ,oBAAAA,GAAAA,CAAIK,MAAM,CAACc,IAAI,CACbP,KAAAA,CAAMG,QAAQ,CAAC;wBACbC,MAAAA,EAAQ,KAAA;wBACRC,MAAAA,EAAQ;AACV,qBAAA,CAAA,CAAA;AAEJ,gBAAA;gBAEAT,OAAAA,CAAQ,IAAA,CAAA;AACV,YAAA;YAEA,IAAIG,GAAAA,IAAOS,QAAQT,GAAAA,CAAAA,EAAM;AACvBX,gBAAAA,GAAAA,CAAIK,MAAM,CAACS,KAAK,CAACH,IAAIU,OAAO,CAAA;AAC5BZ,gBAAAA,MAAAA,EAAAA;AACF,YAAA;AACF,QAAA,CAAA,CAAA;AACF,IAAA,CAAA,CAAA;AACF;;;;"}
@@ -8,12 +8,13 @@ var HtmlWebpackPlugin = require('html-webpack-plugin');
8
8
  var MiniCssExtractPlugin = require('mini-css-extract-plugin');
9
9
  var crypto = require('node:crypto');
10
10
  var path = require('node:path');
11
- var readPkgUp = require('read-pkg-up');
12
11
  var webpack = require('webpack');
13
12
  var webpackBundleAnalyzer = require('webpack-bundle-analyzer');
14
13
  var monorepo = require('../core/monorepo.js');
15
14
  var config = require('../core/config.js');
15
+ var linkedPackages = require('../core/linked-packages.js');
16
16
  var aliases = require('../core/aliases.js');
17
+ var resolveModule = require('../core/resolve-module.js');
17
18
 
18
19
  const resolveBaseConfig = async (ctx)=>{
19
20
  const target = browserslistToEsbuild(ctx.target);
@@ -28,13 +29,13 @@ const resolveBaseConfig = async (ctx)=>{
28
29
  },
29
30
  resolve: {
30
31
  alias: {
31
- react: getModulePath('react'),
32
- 'react-dom': getModulePath('react-dom'),
33
- 'styled-components': getModulePath('styled-components'),
34
- 'react-router-dom': getModulePath('react-router-dom'),
32
+ react: resolveModule.getModulePath('react'),
33
+ 'react-dom': resolveModule.getModulePath('react-dom'),
34
+ 'styled-components': resolveModule.getModulePath('styled-components'),
35
+ 'react-router-dom': resolveModule.getModulePath('react-router-dom'),
35
36
  // Force single instance so plugin custom field chunks inherit root DesignSystemProvider context
36
- '@strapi/design-system': getModulePath('@strapi/design-system'),
37
- '@radix-ui/react-tooltip': getModulePath('@radix-ui/react-tooltip')
37
+ '@strapi/design-system': resolveModule.getModulePath('@strapi/design-system'),
38
+ '@radix-ui/react-tooltip': resolveModule.getModulePath('@radix-ui/react-tooltip')
38
39
  },
39
40
  extensions: [
40
41
  '.js',
@@ -134,6 +135,7 @@ const resolveBaseConfig = async (ctx)=>{
134
135
  const resolveDevelopmentConfig = async (ctx)=>{
135
136
  const baseConfig = await resolveBaseConfig(ctx);
136
137
  const monorepo$1 = await monorepo.loadStrapiMonorepo(ctx.cwd);
138
+ const linkedDesignSystemPath = linkedPackages.getLinkedDesignSystemPath();
137
139
  return {
138
140
  ...baseConfig,
139
141
  cache: {
@@ -142,7 +144,13 @@ const resolveDevelopmentConfig = async (ctx)=>{
142
144
  buildDependencies: {
143
145
  config: [
144
146
  __filename
145
- ]
147
+ ],
148
+ // When design-system is linked, invalidate cache when it changes
149
+ ...linkedDesignSystemPath && {
150
+ designSystem: [
151
+ path.join(linkedDesignSystemPath, 'dist')
152
+ ]
153
+ }
146
154
  },
147
155
  version: crypto.createHash('md5').update(Object.entries(baseConfig.resolve.alias ?? {}).join()).digest('hex')
148
156
  },
@@ -235,16 +243,6 @@ const mergeConfigWithUserConfig = async (config$1, ctx)=>{
235
243
  }
236
244
  return config$1;
237
245
  };
238
- /**
239
- * @internal This function is used to resolve the path of a module.
240
- * It mimics what vite does internally already.
241
- */ const getModulePath = (mod)=>{
242
- const modulePath = require.resolve(mod);
243
- const pkg = readPkgUp.sync({
244
- cwd: path.dirname(modulePath)
245
- });
246
- return pkg ? path.dirname(pkg.path) : modulePath;
247
- };
248
246
 
249
247
  exports.mergeConfigWithUserConfig = mergeConfigWithUserConfig;
250
248
  exports.resolveDevelopmentConfig = resolveDevelopmentConfig;
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sources":["../../../../src/node/webpack/config.ts"],"sourcesContent":["import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin';\nimport browserslistToEsbuild from 'browserslist-to-esbuild';\nimport { EsbuildPlugin } from 'esbuild-loader';\nimport ForkTsCheckerPlugin from 'fork-ts-checker-webpack-plugin';\nimport HtmlWebpackPlugin from 'html-webpack-plugin';\nimport MiniCssExtractPlugin from 'mini-css-extract-plugin';\nimport crypto from 'node:crypto';\nimport path from 'node:path';\nimport readPkgUp from 'read-pkg-up';\nimport {\n Configuration,\n DefinePlugin,\n HotModuleReplacementPlugin,\n WebpackPluginInstance,\n} from 'webpack';\nimport { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';\n\nimport { loadStrapiMonorepo } from '../core/monorepo';\nimport type { BuildContext } from '../create-build-context';\nimport { getUserConfig } from '../core/config';\nimport { getMonorepoAliases } from '../core/aliases';\n\nconst resolveBaseConfig = async (ctx: BuildContext) => {\n const target = browserslistToEsbuild(ctx.target);\n\n return {\n experiments: {\n topLevelAwait: true,\n },\n entry: {\n main: [`./${ctx.entry}`],\n },\n resolve: {\n alias: {\n react: getModulePath('react'),\n 'react-dom': getModulePath('react-dom'),\n 'styled-components': getModulePath('styled-components'),\n 'react-router-dom': getModulePath('react-router-dom'),\n // Force single instance so plugin custom field chunks inherit root DesignSystemProvider context\n '@strapi/design-system': getModulePath('@strapi/design-system'),\n '@radix-ui/react-tooltip': getModulePath('@radix-ui/react-tooltip'),\n },\n extensions: ['.js', '.jsx', '.react.js', '.ts', '.tsx'],\n },\n module: {\n rules: [\n {\n test: /\\.(ts|tsx)$/,\n loader: require.resolve('esbuild-loader'),\n options: {\n loader: 'tsx',\n target,\n jsx: 'automatic',\n },\n },\n {\n test: /\\.(js|jsx|mjs)$/,\n use: {\n loader: require.resolve('esbuild-loader'),\n options: {\n loader: 'jsx',\n target,\n jsx: 'automatic',\n },\n },\n },\n {\n test: /\\.m?js/,\n resolve: {\n fullySpecified: false,\n },\n },\n {\n test: /\\.css$/i,\n use: [require.resolve('style-loader'), require.resolve('css-loader')],\n },\n {\n test: /\\.(svg|eot|otf|ttf|woff|woff2)$/,\n type: 'asset/resource',\n },\n {\n test: [/\\.bmp$/, /\\.gif$/, /\\.jpe?g$/, /\\.png$/, /\\.ico$/],\n type: 'asset',\n parser: {\n dataUrlCondition: {\n maxSize: 1000,\n },\n },\n },\n {\n test: /\\.(mp4|webm)$/,\n type: 'asset',\n parser: {\n dataUrlCondition: {\n maxSize: 10000,\n },\n },\n },\n ],\n },\n plugins: [\n new HtmlWebpackPlugin({\n inject: true,\n template: path.resolve(ctx.runtimeDir, 'index.html'),\n }),\n new DefinePlugin(\n Object.entries(ctx.env).reduce<Record<string, string>>((acc, [key, value]) => {\n acc[`process.env.${key}`] = JSON.stringify(value);\n return acc;\n }, {})\n ),\n ctx.tsconfig &&\n new ForkTsCheckerPlugin({\n typescript: {\n configFile: ctx.tsconfig.path,\n configOverwrite: {\n compilerOptions: {\n sourceMap: ctx.options.sourcemaps,\n },\n },\n },\n }),\n ].filter(Boolean),\n };\n};\n\nconst resolveDevelopmentConfig = async (ctx: BuildContext): Promise<Configuration> => {\n const baseConfig = await resolveBaseConfig(ctx);\n const monorepo = await loadStrapiMonorepo(ctx.cwd);\n\n return {\n ...baseConfig,\n cache: {\n type: 'filesystem',\n // version cache when there are changes to aliases\n buildDependencies: {\n config: [__filename],\n },\n version: crypto\n .createHash('md5')\n .update(Object.entries(baseConfig.resolve.alias ?? {}).join())\n .digest('hex'),\n },\n resolve: {\n ...baseConfig.resolve,\n alias: {\n ...baseConfig.resolve.alias,\n ...getMonorepoAliases({ monorepo }),\n },\n },\n entry: {\n ...baseConfig.entry,\n main: [\n `${require.resolve('webpack-hot-middleware/client')}?path=/__webpack_hmr`,\n ...baseConfig.entry.main,\n ],\n },\n stats: 'errors-warnings',\n mode: 'development',\n devtool: 'inline-source-map',\n output: {\n filename: '[name].js',\n path: ctx.distPath,\n publicPath: ctx.basePath,\n },\n infrastructureLogging: {\n level: 'error',\n },\n plugins: [\n ...baseConfig.plugins,\n new HotModuleReplacementPlugin(),\n new ReactRefreshWebpackPlugin(),\n ],\n };\n};\n\nconst resolveProductionConfig = async (ctx: BuildContext): Promise<Configuration> => {\n const target = browserslistToEsbuild(ctx.target);\n\n const baseConfig = await resolveBaseConfig(ctx);\n\n return {\n ...baseConfig,\n stats: 'errors-only',\n mode: 'production',\n bail: true,\n devtool: ctx.options.sourcemaps ? 'source-map' : false,\n output: {\n path: ctx.distPath,\n publicPath: ctx.basePath,\n // Utilize long-term caching by adding content hashes (not compilation hashes)\n // to compiled assets for production\n filename: '[name].[contenthash:8].js',\n chunkFilename: '[name].[contenthash:8].chunk.js',\n },\n optimization: {\n minimize: ctx.options.minify,\n minimizer: [\n new EsbuildPlugin({\n target,\n css: true, // Apply minification to CSS assets\n }),\n ],\n moduleIds: 'deterministic',\n runtimeChunk: true,\n },\n plugins: [\n ...baseConfig.plugins,\n new MiniCssExtractPlugin({\n filename: '[name].[chunkhash].css',\n chunkFilename: '[name].[chunkhash].chunkhash.css',\n ignoreOrder: true,\n }),\n ctx.options.stats && (new BundleAnalyzerPlugin() as unknown as WebpackPluginInstance), // TODO: find out if this is an actual issue or just a ts bug\n ].filter(Boolean),\n };\n};\n\nconst USER_CONFIGS = ['webpack.config.js', 'webpack.config.mjs', 'webpack.config.ts'];\n\ntype UserWebpackConfig = (config: Configuration, webpack: unknown) => Configuration;\n\nconst mergeConfigWithUserConfig = async (config: Configuration, ctx: BuildContext) => {\n const userConfig = await getUserConfig<UserWebpackConfig>(USER_CONFIGS, ctx);\n\n if (userConfig) {\n if (typeof userConfig === 'function') {\n const webpack = await import('webpack');\n return userConfig(config, webpack);\n }\n\n ctx.logger.warn(\n `You've exported something other than a function from ${path.join(\n ctx.appDir,\n 'src',\n 'admin',\n 'webpack.config'\n )}, this will ignored.`\n );\n }\n\n return config;\n};\n\n/**\n * @internal This function is used to resolve the path of a module.\n * It mimics what vite does internally already.\n */\nconst getModulePath = (mod: string) => {\n const modulePath = require.resolve(mod);\n const pkg = readPkgUp.sync({ cwd: path.dirname(modulePath) });\n return pkg ? path.dirname(pkg.path) : modulePath;\n};\n\nexport { mergeConfigWithUserConfig, resolveDevelopmentConfig, resolveProductionConfig };\n"],"names":["resolveBaseConfig","ctx","target","browserslistToEsbuild","experiments","topLevelAwait","entry","main","resolve","alias","react","getModulePath","extensions","module","rules","test","loader","require","options","jsx","use","fullySpecified","type","parser","dataUrlCondition","maxSize","plugins","HtmlWebpackPlugin","inject","template","path","runtimeDir","DefinePlugin","Object","entries","env","reduce","acc","key","value","JSON","stringify","tsconfig","ForkTsCheckerPlugin","typescript","configFile","configOverwrite","compilerOptions","sourceMap","sourcemaps","filter","Boolean","resolveDevelopmentConfig","baseConfig","monorepo","loadStrapiMonorepo","cwd","cache","buildDependencies","config","__filename","version","crypto","createHash","update","join","digest","getMonorepoAliases","stats","mode","devtool","output","filename","distPath","publicPath","basePath","infrastructureLogging","level","HotModuleReplacementPlugin","ReactRefreshWebpackPlugin","resolveProductionConfig","bail","chunkFilename","optimization","minimize","minify","minimizer","EsbuildPlugin","css","moduleIds","runtimeChunk","MiniCssExtractPlugin","ignoreOrder","BundleAnalyzerPlugin","USER_CONFIGS","mergeConfigWithUserConfig","userConfig","getUserConfig","webpack","logger","warn","appDir","mod","modulePath","pkg","readPkgUp","sync","dirname"],"mappings":"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"}
1
+ {"version":3,"file":"config.js","sources":["../../../../src/node/webpack/config.ts"],"sourcesContent":["import ReactRefreshWebpackPlugin from '@pmmmwh/react-refresh-webpack-plugin';\nimport browserslistToEsbuild from 'browserslist-to-esbuild';\nimport { EsbuildPlugin } from 'esbuild-loader';\nimport ForkTsCheckerPlugin from 'fork-ts-checker-webpack-plugin';\nimport HtmlWebpackPlugin from 'html-webpack-plugin';\nimport MiniCssExtractPlugin from 'mini-css-extract-plugin';\nimport crypto from 'node:crypto';\nimport path from 'node:path';\nimport {\n Configuration,\n DefinePlugin,\n HotModuleReplacementPlugin,\n WebpackPluginInstance,\n} from 'webpack';\nimport { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';\n\nimport { loadStrapiMonorepo } from '../core/monorepo';\nimport type { BuildContext } from '../create-build-context';\nimport { getUserConfig } from '../core/config';\nimport { getLinkedDesignSystemPath } from '../core/linked-packages';\nimport { getMonorepoAliases } from '../core/aliases';\nimport { getModulePath } from '../core/resolve-module';\n\nconst resolveBaseConfig = async (ctx: BuildContext) => {\n const target = browserslistToEsbuild(ctx.target);\n\n return {\n experiments: {\n topLevelAwait: true,\n },\n entry: {\n main: [`./${ctx.entry}`],\n },\n resolve: {\n alias: {\n react: getModulePath('react'),\n 'react-dom': getModulePath('react-dom'),\n 'styled-components': getModulePath('styled-components'),\n 'react-router-dom': getModulePath('react-router-dom'),\n // Force single instance so plugin custom field chunks inherit root DesignSystemProvider context\n '@strapi/design-system': getModulePath('@strapi/design-system'),\n '@radix-ui/react-tooltip': getModulePath('@radix-ui/react-tooltip'),\n },\n extensions: ['.js', '.jsx', '.react.js', '.ts', '.tsx'],\n },\n module: {\n rules: [\n {\n test: /\\.(ts|tsx)$/,\n loader: require.resolve('esbuild-loader'),\n options: {\n loader: 'tsx',\n target,\n jsx: 'automatic',\n },\n },\n {\n test: /\\.(js|jsx|mjs)$/,\n use: {\n loader: require.resolve('esbuild-loader'),\n options: {\n loader: 'jsx',\n target,\n jsx: 'automatic',\n },\n },\n },\n {\n test: /\\.m?js/,\n resolve: {\n fullySpecified: false,\n },\n },\n {\n test: /\\.css$/i,\n use: [require.resolve('style-loader'), require.resolve('css-loader')],\n },\n {\n test: /\\.(svg|eot|otf|ttf|woff|woff2)$/,\n type: 'asset/resource',\n },\n {\n test: [/\\.bmp$/, /\\.gif$/, /\\.jpe?g$/, /\\.png$/, /\\.ico$/],\n type: 'asset',\n parser: {\n dataUrlCondition: {\n maxSize: 1000,\n },\n },\n },\n {\n test: /\\.(mp4|webm)$/,\n type: 'asset',\n parser: {\n dataUrlCondition: {\n maxSize: 10000,\n },\n },\n },\n ],\n },\n plugins: [\n new HtmlWebpackPlugin({\n inject: true,\n template: path.resolve(ctx.runtimeDir, 'index.html'),\n }),\n new DefinePlugin(\n Object.entries(ctx.env).reduce<Record<string, string>>((acc, [key, value]) => {\n acc[`process.env.${key}`] = JSON.stringify(value);\n return acc;\n }, {})\n ),\n ctx.tsconfig &&\n new ForkTsCheckerPlugin({\n typescript: {\n configFile: ctx.tsconfig.path,\n configOverwrite: {\n compilerOptions: {\n sourceMap: ctx.options.sourcemaps,\n },\n },\n },\n }),\n ].filter(Boolean),\n };\n};\n\nconst resolveDevelopmentConfig = async (ctx: BuildContext): Promise<Configuration> => {\n const baseConfig = await resolveBaseConfig(ctx);\n const monorepo = await loadStrapiMonorepo(ctx.cwd);\n const linkedDesignSystemPath = getLinkedDesignSystemPath();\n\n return {\n ...baseConfig,\n cache: {\n type: 'filesystem',\n // version cache when there are changes to aliases\n buildDependencies: {\n config: [__filename],\n // When design-system is linked, invalidate cache when it changes\n ...(linkedDesignSystemPath && {\n designSystem: [path.join(linkedDesignSystemPath, 'dist')],\n }),\n },\n version: crypto\n .createHash('md5')\n .update(Object.entries(baseConfig.resolve.alias ?? {}).join())\n .digest('hex'),\n },\n resolve: {\n ...baseConfig.resolve,\n alias: {\n ...baseConfig.resolve.alias,\n ...getMonorepoAliases({ monorepo }),\n },\n },\n entry: {\n ...baseConfig.entry,\n main: [\n `${require.resolve('webpack-hot-middleware/client')}?path=/__webpack_hmr`,\n ...baseConfig.entry.main,\n ],\n },\n stats: 'errors-warnings',\n mode: 'development',\n devtool: 'inline-source-map',\n output: {\n filename: '[name].js',\n path: ctx.distPath,\n publicPath: ctx.basePath,\n },\n infrastructureLogging: {\n level: 'error',\n },\n plugins: [\n ...baseConfig.plugins,\n new HotModuleReplacementPlugin(),\n new ReactRefreshWebpackPlugin(),\n ],\n };\n};\n\nconst resolveProductionConfig = async (ctx: BuildContext): Promise<Configuration> => {\n const target = browserslistToEsbuild(ctx.target);\n\n const baseConfig = await resolveBaseConfig(ctx);\n\n return {\n ...baseConfig,\n stats: 'errors-only',\n mode: 'production',\n bail: true,\n devtool: ctx.options.sourcemaps ? 'source-map' : false,\n output: {\n path: ctx.distPath,\n publicPath: ctx.basePath,\n // Utilize long-term caching by adding content hashes (not compilation hashes)\n // to compiled assets for production\n filename: '[name].[contenthash:8].js',\n chunkFilename: '[name].[contenthash:8].chunk.js',\n },\n optimization: {\n minimize: ctx.options.minify,\n minimizer: [\n new EsbuildPlugin({\n target,\n css: true, // Apply minification to CSS assets\n }),\n ],\n moduleIds: 'deterministic',\n runtimeChunk: true,\n },\n plugins: [\n ...baseConfig.plugins,\n new MiniCssExtractPlugin({\n filename: '[name].[chunkhash].css',\n chunkFilename: '[name].[chunkhash].chunkhash.css',\n ignoreOrder: true,\n }),\n ctx.options.stats && (new BundleAnalyzerPlugin() as unknown as WebpackPluginInstance), // TODO: find out if this is an actual issue or just a ts bug\n ].filter(Boolean),\n };\n};\n\nconst USER_CONFIGS = ['webpack.config.js', 'webpack.config.mjs', 'webpack.config.ts'];\n\ntype UserWebpackConfig = (config: Configuration, webpack: unknown) => Configuration;\n\nconst mergeConfigWithUserConfig = async (config: Configuration, ctx: BuildContext) => {\n const userConfig = await getUserConfig<UserWebpackConfig>(USER_CONFIGS, ctx);\n\n if (userConfig) {\n if (typeof userConfig === 'function') {\n const webpack = await import('webpack');\n return userConfig(config, webpack);\n }\n\n ctx.logger.warn(\n `You've exported something other than a function from ${path.join(\n ctx.appDir,\n 'src',\n 'admin',\n 'webpack.config'\n )}, this will ignored.`\n );\n }\n\n return config;\n};\n\nexport { mergeConfigWithUserConfig, resolveDevelopmentConfig, resolveProductionConfig };\n"],"names":["resolveBaseConfig","ctx","target","browserslistToEsbuild","experiments","topLevelAwait","entry","main","resolve","alias","react","getModulePath","extensions","module","rules","test","loader","require","options","jsx","use","fullySpecified","type","parser","dataUrlCondition","maxSize","plugins","HtmlWebpackPlugin","inject","template","path","runtimeDir","DefinePlugin","Object","entries","env","reduce","acc","key","value","JSON","stringify","tsconfig","ForkTsCheckerPlugin","typescript","configFile","configOverwrite","compilerOptions","sourceMap","sourcemaps","filter","Boolean","resolveDevelopmentConfig","baseConfig","monorepo","loadStrapiMonorepo","cwd","linkedDesignSystemPath","getLinkedDesignSystemPath","cache","buildDependencies","config","__filename","designSystem","join","version","crypto","createHash","update","digest","getMonorepoAliases","stats","mode","devtool","output","filename","distPath","publicPath","basePath","infrastructureLogging","level","HotModuleReplacementPlugin","ReactRefreshWebpackPlugin","resolveProductionConfig","bail","chunkFilename","optimization","minimize","minify","minimizer","EsbuildPlugin","css","moduleIds","runtimeChunk","MiniCssExtractPlugin","ignoreOrder","BundleAnalyzerPlugin","USER_CONFIGS","mergeConfigWithUserConfig","userConfig","getUserConfig","webpack","logger","warn","appDir"],"mappings":"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"}
@@ -6,12 +6,13 @@ import HtmlWebpackPlugin from 'html-webpack-plugin';
6
6
  import MiniCssExtractPlugin from 'mini-css-extract-plugin';
7
7
  import crypto from 'node:crypto';
8
8
  import path from 'node:path';
9
- import readPkgUp from 'read-pkg-up';
10
9
  import { HotModuleReplacementPlugin, DefinePlugin } from 'webpack';
11
10
  import { BundleAnalyzerPlugin } from 'webpack-bundle-analyzer';
12
11
  import { loadStrapiMonorepo } from '../core/monorepo.mjs';
13
12
  import { getUserConfig } from '../core/config.mjs';
13
+ import { getLinkedDesignSystemPath } from '../core/linked-packages.mjs';
14
14
  import { getMonorepoAliases } from '../core/aliases.mjs';
15
+ import { getModulePath } from '../core/resolve-module.mjs';
15
16
 
16
17
  const resolveBaseConfig = async (ctx)=>{
17
18
  const target = browserslistToEsbuild(ctx.target);
@@ -132,6 +133,7 @@ const resolveBaseConfig = async (ctx)=>{
132
133
  const resolveDevelopmentConfig = async (ctx)=>{
133
134
  const baseConfig = await resolveBaseConfig(ctx);
134
135
  const monorepo = await loadStrapiMonorepo(ctx.cwd);
136
+ const linkedDesignSystemPath = getLinkedDesignSystemPath();
135
137
  return {
136
138
  ...baseConfig,
137
139
  cache: {
@@ -140,7 +142,13 @@ const resolveDevelopmentConfig = async (ctx)=>{
140
142
  buildDependencies: {
141
143
  config: [
142
144
  __filename
143
- ]
145
+ ],
146
+ // When design-system is linked, invalidate cache when it changes
147
+ ...linkedDesignSystemPath && {
148
+ designSystem: [
149
+ path.join(linkedDesignSystemPath, 'dist')
150
+ ]
151
+ }
144
152
  },
145
153
  version: crypto.createHash('md5').update(Object.entries(baseConfig.resolve.alias ?? {}).join()).digest('hex')
146
154
  },
@@ -233,16 +241,6 @@ const mergeConfigWithUserConfig = async (config, ctx)=>{
233
241
  }
234
242
  return config;
235
243
  };
236
- /**
237
- * @internal This function is used to resolve the path of a module.
238
- * It mimics what vite does internally already.
239
- */ const getModulePath = (mod)=>{
240
- const modulePath = require.resolve(mod);
241
- const pkg = readPkgUp.sync({
242
- cwd: path.dirname(modulePath)
243
- });
244
- return pkg ? path.dirname(pkg.path) : modulePath;
245
- };
246
244
 
247
245
  export { mergeConfigWithUserConfig, resolveDevelopmentConfig, resolveProductionConfig };
248
246
  //# sourceMappingURL=config.mjs.map