vike 0.4.168 → 0.4.170

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 (178) hide show
  1. package/dist/cjs/node/plugin/plugins/buildConfig.js +10 -2
  2. package/dist/cjs/node/plugin/plugins/commonConfig/assertResolveAlias.js +1 -1
  3. package/dist/cjs/node/plugin/plugins/devConfig/determineOptimizeDeps.js +19 -16
  4. package/dist/cjs/node/plugin/plugins/distFileNames.js +7 -1
  5. package/dist/cjs/node/plugin/plugins/envVars.js +1 -5
  6. package/dist/cjs/node/plugin/plugins/extractAssetsPlugin.js +1 -1
  7. package/dist/cjs/node/plugin/plugins/importUserCode/index.js +7 -7
  8. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getConfigValuesSerialized.js +14 -11
  9. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.js +7 -1
  10. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/loadFileAtConfigTime.js +11 -14
  11. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/resolvePointerImport.js +129 -0
  12. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transformFileImports.js +8 -8
  13. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.js +53 -12
  14. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +82 -106
  15. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +2 -2
  16. package/dist/cjs/node/plugin/shared/getFilePath.js +50 -49
  17. package/dist/cjs/node/plugin/utils.js +2 -2
  18. package/dist/cjs/node/prerender/runPrerender.js +6 -5
  19. package/dist/cjs/node/prerender/utils.js +2 -1
  20. package/dist/cjs/node/runtime/html/serializePageContextClientSide.js +1 -0
  21. package/dist/cjs/node/runtime/index-common.js +14 -3
  22. package/dist/cjs/node/runtime/renderPage/createHttpResponseObject/getCacheControl.js +2 -1
  23. package/dist/cjs/node/runtime/renderPage/loadUserFilesServerSide.js +25 -14
  24. package/dist/cjs/node/runtime/renderPage/log404/index.js +2 -2
  25. package/dist/cjs/node/runtime/renderPage/logErrorHint.js +1 -1
  26. package/dist/cjs/node/runtime/utils.js +2 -1
  27. package/dist/cjs/node/shared/assertV1Design.js +1 -1
  28. package/dist/cjs/node/shared/getClientEntry.js +2 -2
  29. package/dist/cjs/node/shared/prependEntriesDir.js +1 -0
  30. package/dist/cjs/node/shared/utils.js +0 -1
  31. package/dist/cjs/shared/getPageFiles/analyzeClientSide.js +3 -3
  32. package/dist/cjs/shared/getPageFiles/getExports.js +8 -15
  33. package/dist/cjs/shared/getPageFiles.js +3 -6
  34. package/dist/cjs/shared/hooks/getHook.js +7 -6
  35. package/dist/cjs/shared/page-configs/getConfigDefinedAt.js +48 -0
  36. package/dist/cjs/shared/page-configs/{helpers/getConfigValue.js → getConfigValue.js} +6 -8
  37. package/dist/cjs/shared/page-configs/helpers.js +6 -11
  38. package/dist/cjs/shared/page-configs/serialize/assertPageConfigsSerialized.js +1 -1
  39. package/dist/cjs/shared/page-configs/serialize/parseConfigValuesImported.js +2 -1
  40. package/dist/cjs/shared/page-configs/serialize/parseConfigValuesSerialized.js +11 -6
  41. package/dist/cjs/shared/page-configs/serialize/parsePageConfigs.js +4 -3
  42. package/dist/cjs/shared/page-configs/serialize/serializeConfigValue.js +3 -3
  43. package/dist/cjs/shared/route/index.js +2 -2
  44. package/dist/cjs/shared/route/loadPageRoutes.js +12 -10
  45. package/dist/cjs/shared/route/resolveRouteFunction.js +8 -9
  46. package/dist/cjs/shared/route/resolveRouteString.js +5 -16
  47. package/dist/cjs/shared/route/utils.js +0 -1
  48. package/dist/cjs/shared/utils.js +1 -0
  49. package/dist/cjs/utils/assertPathFilesystemAbsolute.js +39 -0
  50. package/dist/cjs/utils/createErrorWithCleanStackTrace.js +1 -7
  51. package/dist/cjs/utils/debug.js +2 -1
  52. package/dist/cjs/utils/findFile.js +2 -1
  53. package/dist/cjs/utils/hasProp.js +9 -5
  54. package/dist/cjs/utils/injectRollupInputs.js +2 -1
  55. package/dist/cjs/utils/isArray.js +8 -0
  56. package/dist/cjs/utils/isArrayOfStrings.js +8 -0
  57. package/dist/cjs/utils/isDev.js +12 -4
  58. package/dist/cjs/utils/isNpmPackage.js +1 -1
  59. package/dist/cjs/utils/isObjectOfStrings.js +8 -0
  60. package/dist/cjs/utils/projectInfo.js +1 -1
  61. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.d.ts +3 -1
  62. package/dist/esm/client/client-routing-runtime/getPageContextFromHooks.js +2 -1
  63. package/dist/esm/client/server-routing-runtime/getPageContext.d.ts +1 -0
  64. package/dist/esm/client/shared/getPageContextSerializedInHtml.d.ts +1 -0
  65. package/dist/esm/client/shared/getPageContextSerializedInHtml.js +1 -0
  66. package/dist/esm/client/shared/loadUserFilesClientSide.js +3 -7
  67. package/dist/esm/node/plugin/plugins/buildConfig.js +9 -1
  68. package/dist/esm/node/plugin/plugins/commonConfig/assertResolveAlias.js +2 -2
  69. package/dist/esm/node/plugin/plugins/devConfig/determineOptimizeDeps.js +20 -17
  70. package/dist/esm/node/plugin/plugins/distFileNames.js +8 -2
  71. package/dist/esm/node/plugin/plugins/envVars.js +2 -6
  72. package/dist/esm/node/plugin/plugins/extractAssetsPlugin.js +1 -1
  73. package/dist/esm/node/plugin/plugins/importUserCode/index.js +9 -9
  74. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getConfigValuesSerialized.d.ts +2 -2
  75. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getConfigValuesSerialized.js +14 -11
  76. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/configDefinitionsBuiltIn.d.ts +4 -3
  77. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/crawlPlusFiles.js +7 -1
  78. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/filesystemRouting.d.ts +2 -2
  79. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/loadFileAtConfigTime.js +12 -15
  80. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/resolvePointerImport.d.ts +12 -0
  81. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/resolvePointerImport.js +123 -0
  82. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transformFileImports.d.ts +8 -8
  83. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transformFileImports.js +7 -7
  84. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/transpileAndExecuteFile.js +54 -13
  85. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig.js +82 -106
  86. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVirtualFilePageConfigValuesAll.js +1 -1
  87. package/dist/esm/node/plugin/shared/getFilePath.d.ts +11 -5
  88. package/dist/esm/node/plugin/shared/getFilePath.js +49 -48
  89. package/dist/esm/node/plugin/utils.d.ts +2 -2
  90. package/dist/esm/node/plugin/utils.js +2 -2
  91. package/dist/esm/node/prerender/runPrerender.js +6 -5
  92. package/dist/esm/node/prerender/utils.d.ts +2 -1
  93. package/dist/esm/node/prerender/utils.js +2 -1
  94. package/dist/esm/node/runtime/html/serializePageContextClientSide.d.ts +1 -0
  95. package/dist/esm/node/runtime/html/serializePageContextClientSide.js +1 -0
  96. package/dist/esm/node/runtime/index-common.d.ts +0 -4
  97. package/dist/esm/node/runtime/index-common.js +14 -3
  98. package/dist/esm/node/runtime/renderPage/createHttpResponseObject/getCacheControl.js +2 -1
  99. package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.d.ts +4 -4
  100. package/dist/esm/node/runtime/renderPage/loadUserFilesServerSide.js +27 -16
  101. package/dist/esm/node/runtime/renderPage/log404/index.js +2 -2
  102. package/dist/esm/node/runtime/renderPage/logErrorHint.js +2 -2
  103. package/dist/esm/node/runtime/renderPage/preparePageContextForUserConsumptionServerSide.d.ts +2 -7
  104. package/dist/esm/node/runtime/renderPage/renderPageAlreadyRouted.d.ts +16 -16
  105. package/dist/esm/node/runtime/utils.d.ts +2 -1
  106. package/dist/esm/node/runtime/utils.js +2 -1
  107. package/dist/esm/node/shared/assertV1Design.js +1 -1
  108. package/dist/esm/node/shared/getClientEntry.js +1 -1
  109. package/dist/esm/node/shared/prependEntriesDir.js +1 -0
  110. package/dist/esm/node/shared/utils.d.ts +0 -1
  111. package/dist/esm/node/shared/utils.js +0 -1
  112. package/dist/esm/shared/getPageFiles/analyzeClientSide.js +1 -1
  113. package/dist/esm/shared/getPageFiles/getExports.d.ts +4 -5
  114. package/dist/esm/shared/getPageFiles/getExports.js +9 -16
  115. package/dist/esm/shared/getPageFiles.d.ts +1 -2
  116. package/dist/esm/shared/getPageFiles.js +1 -3
  117. package/dist/esm/shared/hooks/getHook.js +6 -5
  118. package/dist/esm/shared/page-configs/Config.d.ts +2 -2
  119. package/dist/esm/shared/page-configs/FilePath.d.ts +32 -22
  120. package/dist/esm/shared/page-configs/PageConfig.d.ts +27 -15
  121. package/dist/esm/shared/page-configs/getConfigDefinedAt.d.ts +11 -0
  122. package/dist/esm/shared/page-configs/getConfigDefinedAt.js +42 -0
  123. package/dist/esm/shared/page-configs/{helpers/getConfigValue.d.ts → getConfigValue.d.ts} +2 -2
  124. package/dist/esm/shared/page-configs/{helpers/getConfigValue.js → getConfigValue.js} +6 -8
  125. package/dist/esm/shared/page-configs/helpers.d.ts +3 -9
  126. package/dist/esm/shared/page-configs/helpers.js +6 -8
  127. package/dist/esm/shared/page-configs/serialize/PageConfigSerialized.d.ts +7 -4
  128. package/dist/esm/shared/page-configs/serialize/assertPageConfigsSerialized.js +2 -2
  129. package/dist/esm/shared/page-configs/serialize/parseConfigValuesImported.js +2 -1
  130. package/dist/esm/shared/page-configs/serialize/parseConfigValuesSerialized.js +12 -7
  131. package/dist/esm/shared/page-configs/serialize/parsePageConfigs.js +5 -4
  132. package/dist/esm/shared/page-configs/serialize/serializeConfigValue.js +3 -3
  133. package/dist/esm/shared/route/index.js +2 -2
  134. package/dist/esm/shared/route/loadPageRoutes.d.ts +3 -3
  135. package/dist/esm/shared/route/loadPageRoutes.js +10 -8
  136. package/dist/esm/shared/route/resolveRouteFunction.d.ts +1 -1
  137. package/dist/esm/shared/route/resolveRouteFunction.js +9 -10
  138. package/dist/esm/shared/route/resolveRouteString.d.ts +0 -2
  139. package/dist/esm/shared/route/resolveRouteString.js +5 -16
  140. package/dist/esm/shared/route/utils.d.ts +0 -1
  141. package/dist/esm/shared/route/utils.js +0 -1
  142. package/dist/esm/shared/utils.d.ts +1 -0
  143. package/dist/esm/shared/utils.js +1 -0
  144. package/dist/esm/utils/assertPathFilesystemAbsolute.d.ts +6 -0
  145. package/dist/esm/utils/assertPathFilesystemAbsolute.js +33 -0
  146. package/dist/esm/utils/createErrorWithCleanStackTrace.js +1 -7
  147. package/dist/esm/utils/debug.js +2 -1
  148. package/dist/esm/utils/findFile.js +2 -1
  149. package/dist/esm/utils/hasProp.d.ts +1 -0
  150. package/dist/esm/utils/hasProp.js +9 -5
  151. package/dist/esm/utils/injectRollupInputs.js +2 -1
  152. package/dist/esm/utils/isArray.d.ts +1 -0
  153. package/dist/esm/utils/isArray.js +4 -0
  154. package/dist/esm/utils/isArrayOfStrings.d.ts +2 -0
  155. package/dist/esm/utils/isArrayOfStrings.js +5 -0
  156. package/dist/esm/utils/isDev.d.ts +3 -0
  157. package/dist/esm/utils/isDev.js +11 -3
  158. package/dist/esm/utils/isNpmPackage.js +1 -1
  159. package/dist/esm/utils/isObjectOfStrings.d.ts +2 -0
  160. package/dist/esm/utils/isObjectOfStrings.js +5 -0
  161. package/dist/esm/utils/projectInfo.d.ts +2 -2
  162. package/dist/esm/utils/projectInfo.js +1 -1
  163. package/package.json +3 -2
  164. package/dist/cjs/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/resolveImportPath.js +0 -136
  165. package/dist/cjs/shared/page-configs/helpers/getConfigDefinedAtString.js +0 -43
  166. package/dist/cjs/utils/assertPathIsFilesystemAbsolute.js +0 -21
  167. package/dist/cjs/utils/isStringRecord.js +0 -7
  168. package/dist/cjs/utils/mergeCumulativeValues.js +0 -21
  169. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/resolveImportPath.d.ts +0 -13
  170. package/dist/esm/node/plugin/plugins/importUserCode/v1-design/getVikeConfig/resolveImportPath.js +0 -130
  171. package/dist/esm/shared/page-configs/helpers/getConfigDefinedAtString.d.ts +0 -7
  172. package/dist/esm/shared/page-configs/helpers/getConfigDefinedAtString.js +0 -37
  173. package/dist/esm/utils/assertPathIsFilesystemAbsolute.d.ts +0 -3
  174. package/dist/esm/utils/assertPathIsFilesystemAbsolute.js +0 -15
  175. package/dist/esm/utils/isStringRecord.d.ts +0 -1
  176. package/dist/esm/utils/isStringRecord.js +0 -3
  177. package/dist/esm/utils/mergeCumulativeValues.d.ts +0 -2
  178. package/dist/esm/utils/mergeCumulativeValues.js +0 -18
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.manifestTempFile = exports.analyzeClientEntries = exports.assertRollupInput = exports.buildConfig = void 0;
7
7
  const utils_js_1 = require("../utils.js");
8
8
  const getVikeConfig_js_1 = require("./importUserCode/v1-design/getVikeConfig.js");
9
- const helpers_js_1 = require("../../../shared/page-configs/helpers.js");
9
+ const getConfigValue_js_1 = require("../../../shared/page-configs/getConfigValue.js");
10
10
  const findPageFiles_js_1 = require("../shared/findPageFiles.js");
11
11
  const getConfigVike_js_1 = require("../../shared/getConfigVike.js");
12
12
  const virtualFilePageConfigValuesAll_js_1 = require("../../shared/virtual-files/virtualFilePageConfigValuesAll.js");
@@ -156,7 +156,7 @@ function analyzeClientEntries(pageConfigs, config) {
156
156
  let clientEntries = {};
157
157
  let clientEntryList = [];
158
158
  pageConfigs.forEach((pageConfig) => {
159
- const configValue = (0, helpers_js_1.getConfigValue)(pageConfig, 'clientRouting', 'boolean');
159
+ const configValue = (0, getConfigValue_js_1.getConfigValue)(pageConfig, 'clientRouting', 'boolean');
160
160
  if (configValue?.value) {
161
161
  hasClientRouting = true;
162
162
  }
@@ -232,7 +232,15 @@ function getEntryFromPageConfig(pageConfig, isForClientSide) {
232
232
  let { pageId } = pageConfig;
233
233
  const entryTarget = (0, virtualFilePageConfigValuesAll_js_1.getVirtualFileIdPageConfigValuesAll)(pageId, isForClientSide);
234
234
  let entryName = pageId;
235
+ // Avoid:
236
+ // ```
237
+ // dist/client/assets/entries/.Dp9wM6PK.js
238
+ // dist/server/entries/.mjs
239
+ // ```
240
+ if (entryName === '/')
241
+ entryName = 'root';
235
242
  entryName = (0, prependEntriesDir_js_1.prependEntriesDir)(entryName);
243
+ (0, utils_js_1.assert)(!entryName.endsWith('/'));
236
244
  return { entryName, entryTarget };
237
245
  }
238
246
  function resolve(filePath) {
@@ -80,7 +80,7 @@ function assertResolveAlias(config) {
80
80
  exports.assertResolveAlias = assertResolveAlias;
81
81
  function getAliases(config) {
82
82
  const { alias } = config.resolve;
83
- if (!Array.isArray(alias)) {
83
+ if (!(0, utils_js_1.isArray)(alias)) {
84
84
  return [alias];
85
85
  }
86
86
  else {
@@ -35,28 +35,32 @@ exports.determineOptimizeDeps = determineOptimizeDeps;
35
35
  async function getPageDeps(config, pageConfigs, isDev) {
36
36
  let entries = [];
37
37
  let include = [];
38
+ const addEntry = (e) => {
39
+ (0, utils_js_1.assert)(e);
40
+ entries.push(e);
41
+ };
42
+ const addInclude = (e) => {
43
+ (0, utils_js_1.assert)(e);
44
+ // Shouldn't be a path alias, as path aliases would need to be added to config.optimizeDeps.entries instead of config.optimizeDeps.include
45
+ (0, utils_js_1.assertIsNpmPackageImport)(e);
46
+ include.push(e);
47
+ };
38
48
  // V1 design
39
49
  {
40
50
  pageConfigs.forEach((pageConfig) => {
41
51
  (0, getConfigValueSourcesNotOverriden_js_1.getConfigValueSourcesNotOverriden)(pageConfig).forEach((configValueSource) => {
42
52
  if (!configValueSource.valueIsImportedAtRuntime)
43
53
  return;
44
- const { definedAt, configEnv } = configValueSource;
54
+ const { definedAtFilePath, configEnv } = configValueSource;
45
55
  if (!configEnv.client)
46
56
  return;
47
- if (definedAt.filePathAbsoluteUserRootDir !== null) {
48
- const { filePathAbsoluteFilesystem } = definedAt;
49
- (0, utils_js_1.assert)(filePathAbsoluteFilesystem);
50
- // Surprisingly Vite expects entries to be absolute paths
51
- entries.push(filePathAbsoluteFilesystem);
57
+ if (definedAtFilePath.filePathAbsoluteUserRootDir !== null) {
58
+ // Vite expects entries to be filesystem absolute paths (surprisingly so).
59
+ addEntry(definedAtFilePath.filePathAbsoluteFilesystem);
52
60
  }
53
61
  else {
54
- // Adding definedAt.filePathAbsoluteFilesystem doesn't work for npm packages, I guess because of Vite's config.server.fs.allow
55
- const { importPathAbsolute } = definedAt;
56
- (0, utils_js_1.assert)(importPathAbsolute); // Help TS
57
- // Shouldn't be a path alias, as path aliases would need to be added to config.optimizeDeps.entries instead of config.optimizeDeps.include
58
- (0, utils_js_1.assertIsNpmPackageImport)(importPathAbsolute);
59
- include.push(importPathAbsolute);
62
+ // Adding definedAtFilePath.filePathAbsoluteFilesystem doesn't work for npm packages, I guess because of Vite's config.server.fs.allow
63
+ addInclude(definedAtFilePath.importPathAbsolute);
60
64
  }
61
65
  });
62
66
  });
@@ -68,8 +72,7 @@ async function getPageDeps(config, pageConfigs, isDev) {
68
72
  pageFiles.forEach((filePathAbsoluteUserRootDir) => {
69
73
  const entry = (0, getFilePath_js_1.getFilePathResolved)({ filePathAbsoluteUserRootDir, userRootDir });
70
74
  const { filePathAbsoluteFilesystem } = entry;
71
- (0, utils_js_1.assert)(filePathAbsoluteFilesystem);
72
- entries.push(filePathAbsoluteFilesystem);
75
+ addEntry(filePathAbsoluteFilesystem);
73
76
  });
74
77
  }
75
78
  entries = (0, utils_js_1.unique)(entries);
@@ -86,7 +89,7 @@ function getVirtualFiles(config, pageConfigs) {
86
89
  return entriesVirtualFiles;
87
90
  }
88
91
  function normalizeEntries(entries) {
89
- if (Array.isArray(entries))
92
+ if ((0, utils_js_1.isArray)(entries))
90
93
  return entries;
91
94
  if (typeof entries === 'string')
92
95
  return [entries];
@@ -95,7 +98,7 @@ function normalizeEntries(entries) {
95
98
  (0, utils_js_1.assert)(false);
96
99
  }
97
100
  function normalizeInclude(include) {
98
- if (Array.isArray(include))
101
+ if ((0, utils_js_1.isArray)(include))
99
102
  return include;
100
103
  if (include === undefined)
101
104
  return [];
@@ -116,6 +116,12 @@ function clean(name, removePathSep, fixGlob) {
116
116
  }
117
117
  name = removeLeadingUnderscoreInFilename(name);
118
118
  name = removeUnderscoreDoublets(name);
119
+ // Avoid:
120
+ // ```
121
+ // dist/client/assets/entries/.Dp9wM6PK.js
122
+ // dist/server/entries/.mjs
123
+ // ```
124
+ (0, utils_js_1.assert)(!name.endsWith('/'));
119
125
  return name;
120
126
  }
121
127
  function fixExtractAssetsQuery(name) {
@@ -165,7 +171,7 @@ function getRollupOutputs(config) {
165
171
  (_a = config.build).rollupOptions ?? (_a.rollupOptions = {});
166
172
  (_b = config.build.rollupOptions).output ?? (_b.output = {});
167
173
  const { output } = config.build.rollupOptions;
168
- if (!Array.isArray(output)) {
174
+ if (!(0, utils_js_1.isArray)(output)) {
169
175
  return [output];
170
176
  }
171
177
  return output;
@@ -30,11 +30,7 @@ function envVarsPlugin() {
30
30
  Object.entries(envsAll)
31
31
  .filter(([key]) => {
32
32
  // Already handled by Vite
33
- const envPrefix = !config.envPrefix
34
- ? []
35
- : Array.isArray(config.envPrefix)
36
- ? config.envPrefix
37
- : [config.envPrefix];
33
+ const envPrefix = !config.envPrefix ? [] : (0, utils_js_1.isArray)(config.envPrefix) ? config.envPrefix : [config.envPrefix];
38
34
  return !envPrefix.some((prefix) => key.startsWith(prefix));
39
35
  })
40
36
  .forEach(([envName, envVal]) => {
@@ -189,7 +189,7 @@ function analyzeImport(importStatement) {
189
189
  if (rawRE.test(moduleName)) {
190
190
  return { moduleName, skip: true };
191
191
  }
192
- /* We should not do this because of aliased imports
192
+ /* We shouldn't do this because of aliased imports
193
193
  if (!moduleName.startsWith('.')) {
194
194
  return { moduleName, skip: true }
195
195
  }
@@ -18,9 +18,11 @@ const getFilePath_js_1 = require("../../shared/getFilePath.js");
18
18
  function importUserCode() {
19
19
  let config;
20
20
  let configVike;
21
+ let isDev_;
21
22
  return {
22
23
  name: 'vike:importUserCode',
23
- config() {
24
+ config(_, env) {
25
+ isDev_ = (0, utils_js_1.isDev3)(env);
24
26
  return {
25
27
  experimental: {
26
28
  // TODO/v1-release: remove
@@ -48,7 +50,7 @@ function importUserCode() {
48
50
  }
49
51
  },
50
52
  async load(id, options) {
51
- const isDev = (0, utils_js_1.isDev1)();
53
+ const isDev = isDev_ !== null ? isDev_ : (0, utils_js_1.isDev1)();
52
54
  if (!(0, utils_js_1.isVirtualFileId)(id))
53
55
  return undefined;
54
56
  id = (0, utils_js_1.getVirtualFileId)(id);
@@ -62,7 +64,8 @@ function importUserCode() {
62
64
  }
63
65
  },
64
66
  configureServer(server) {
65
- (0, utils_js_1.isDev1_onConfigureServer)();
67
+ if (isDev_ === null)
68
+ (0, utils_js_1.isDev1_onConfigureServer)();
66
69
  handleFileAddRemove(server, config);
67
70
  }
68
71
  };
@@ -125,10 +128,7 @@ function isVikeConfigModule(filePathAbsoluteFilesystem) {
125
128
  }
126
129
  function reloadConfig(filePath, config, op) {
127
130
  {
128
- const { filePathToShowToUserResolved } = (0, getFilePath_js_1.getFilePathResolved)({
129
- filePathAbsoluteFilesystem: filePath,
130
- userRootDir: config.root
131
- });
131
+ const filePathToShowToUserResolved = (0, getFilePath_js_1.getModuleFilePath)(filePath, config);
132
132
  const msg = `${op} ${picocolors_1.default.dim(filePathToShowToUserResolved)}`;
133
133
  (0, loggerNotProd_js_1.logConfigInfo)(msg, 'info');
134
134
  }
@@ -13,7 +13,7 @@ const getConfigValueSourcesNotOverriden_js_1 = require("../../../shared/getConfi
13
13
  function getConfigValuesSerialized(pageConfig, isEnvMatch) {
14
14
  const lines = [];
15
15
  Object.entries(pageConfig.configValuesComputed).forEach(([configName, configValuesComputed]) => {
16
- const { value, configEnv } = configValuesComputed;
16
+ const { configEnv } = configValuesComputed;
17
17
  if (!isEnvMatch(configEnv))
18
18
  return;
19
19
  // configValeSources has higher precedence
@@ -21,9 +21,11 @@ function getConfigValuesSerialized(pageConfig, isEnvMatch) {
21
21
  return;
22
22
  const configValue = pageConfig.configValues[configName];
23
23
  (0, utils_js_1.assert)(configValue);
24
- const { definedAt } = configValue;
25
- const valueSerialized = getConfigValueSerialized(value, configName, definedAt);
26
- (0, serializeConfigValue_js_1.serializeConfigValue)(lines, configName, { definedAt, valueSerialized });
24
+ const { value, ...common } = configValue;
25
+ (0, utils_js_1.assert)(value === configValuesComputed.value);
26
+ const valueSerialized = getConfigValueSerialized(value, configName, configValue.definedAtData);
27
+ const configValueSerialized = { valueSerialized, ...common };
28
+ (0, serializeConfigValue_js_1.serializeConfigValue)(lines, configName, configValueSerialized);
27
29
  });
28
30
  (0, getConfigValueSourcesNotOverriden_js_1.getConfigValueSourcesNotOverriden)(pageConfig).forEach((configValueSource) => {
29
31
  const { configName, configEnv } = configValueSource;
@@ -33,20 +35,21 @@ function getConfigValuesSerialized(pageConfig, isEnvMatch) {
33
35
  if (!isEnvMatch(configEnv, configValueSource)) {
34
36
  return;
35
37
  }
36
- const { value, definedAt } = configValue;
37
- const valueSerialized = getConfigValueSerialized(value, configName, definedAt);
38
- (0, serializeConfigValue_js_1.serializeConfigValue)(lines, configName, { definedAt, valueSerialized });
38
+ const { value, ...common } = configValue;
39
+ const valueSerialized = getConfigValueSerialized(value, configName, configValue.definedAtData);
40
+ const configValueSerialized = { valueSerialized, ...common };
41
+ (0, serializeConfigValue_js_1.serializeConfigValue)(lines, configName, configValueSerialized);
39
42
  });
40
43
  const code = lines.join('\n');
41
44
  return code;
42
45
  }
43
46
  exports.getConfigValuesSerialized = getConfigValuesSerialized;
44
- function assertConfigValueIsSerializable(value, configName, definedAt) {
47
+ function assertConfigValueIsSerializable(value, configName, definedAtData) {
45
48
  // Contains asserts
46
- getConfigValueSerialized(value, configName, definedAt);
49
+ getConfigValueSerialized(value, configName, definedAtData);
47
50
  }
48
51
  exports.assertConfigValueIsSerializable = assertConfigValueIsSerializable;
49
- function getConfigValueSerialized(value, configName, definedAt) {
52
+ function getConfigValueSerialized(value, configName, definedAtData) {
50
53
  const valueName = `config${(0, utils_js_1.getPropAccessNotation)(configName)}`;
51
54
  let configValueSerialized;
52
55
  try {
@@ -64,7 +67,7 @@ function getConfigValueSerialized(value, configName, definedAt) {
64
67
  serializationErrMsg = 'see serialization error printed above'
65
68
  }
66
69
  */
67
- const configValueFilePathToShowToUser = (0, helpers_js_1.getConfigValueFilePathToShowToUser)({ definedAt });
70
+ const configValueFilePathToShowToUser = (0, helpers_js_1.getConfigValueFilePathToShowToUser)(definedAtData);
68
71
  (0, utils_js_1.assert)(configValueFilePathToShowToUser);
69
72
  (0, utils_js_1.assertUsage)(false, `${picocolors_1.default.cyan(configName)} defined by ${configValueFilePathToShowToUser} must be defined over a so-called "pointer import", see https://vike.dev/config#pointer-imports`);
70
73
  }
@@ -23,7 +23,13 @@ async function crawlPlusFiles(userRootDir, outDirAbsoluteFilesystem, isDev) {
23
23
  // config.outDir is outside of config.root => it's going to be ignored anyways
24
24
  outDirRelativeFromUserRootDir = null;
25
25
  }
26
- (0, utils_js_1.assert)(outDirRelativeFromUserRootDir === null || !outDirRelativeFromUserRootDir.startsWith('.'));
26
+ (0, utils_js_1.assert)(outDirRelativeFromUserRootDir === null ||
27
+ /* Not true if outDirRelativeFromUserRootDir starts with a hidden directory (i.e. a directory with a name that starts with `.`)
28
+ !outDirRelativeFromUserRootDir.startsWith('.') &&
29
+ */
30
+ (!outDirRelativeFromUserRootDir.startsWith('./') &&
31
+ //
32
+ !outDirRelativeFromUserRootDir.startsWith('../')));
27
33
  const timeBefore = new Date().getTime();
28
34
  let files = [];
29
35
  const res = await gitLsFiles(userRootDir, outDirRelativeFromUserRootDir);
@@ -11,8 +11,7 @@ const assertPlusFileExport_js_1 = require("../../../../../../shared/page-configs
11
11
  const picocolors_1 = __importDefault(require("@brillout/picocolors"));
12
12
  const transformFileImports_js_1 = require("./transformFileImports.js");
13
13
  const getConfigFileExport_js_1 = require("../getConfigFileExport.js");
14
- const resolveImportPath_js_1 = require("./resolveImportPath.js");
15
- const getFilePath_js_1 = require("../../../../shared/getFilePath.js");
14
+ const resolvePointerImport_js_1 = require("./resolvePointerImport.js");
16
15
  (0, utils_js_1.assertIsNotProductionRuntime)();
17
16
  // Load fake import
18
17
  async function loadImportedFile(import_, userRootDir, importedFilesLoaded) {
@@ -62,13 +61,11 @@ function assertNoInfiniteLoop(visited, filePathAbsoluteFilesystem) {
62
61
  (0, utils_js_1.assertUsage)(idx === -1, `Infinite extends loop ${[...loop, filePathAbsoluteFilesystem].join('>')}`);
63
62
  }
64
63
  async function loadExtendsConfigs(configFileExports, configFilePath, userRootDir, visited) {
65
- const extendsImportData = getExtendsImportData(configFileExports, configFilePath);
64
+ const extendsPointerImportData = getExtendsPointerImportData(configFileExports, configFilePath);
66
65
  const extendsConfigFiles = [];
67
- extendsImportData.map((importData) => {
68
- const { importPath: importPathAbsolute } = importData;
69
- const filePathAbsoluteFilesystem = (0, resolveImportPath_js_1.resolveImportPath)(importData, configFilePath);
70
- (0, resolveImportPath_js_1.assertImportPath)(filePathAbsoluteFilesystem, importData, configFilePath);
71
- const filePath = (0, getFilePath_js_1.getFilePathResolved)({ filePathAbsoluteFilesystem, userRootDir, importPathAbsolute });
66
+ extendsPointerImportData.map((pointerImportData) => {
67
+ const filePath = (0, resolvePointerImport_js_1.resolvePointerImport)(pointerImportData, configFilePath, userRootDir);
68
+ (0, utils_js_1.assert)(filePath.filePathAbsoluteFilesystem);
72
69
  extendsConfigFiles.push(filePath);
73
70
  });
74
71
  const extendsConfigs = [];
@@ -80,7 +77,7 @@ async function loadExtendsConfigs(configFileExports, configFilePath, userRootDir
80
77
  const extendsFilePaths = extendsConfigFiles.map((f) => f.filePathAbsoluteFilesystem);
81
78
  return { extendsConfigs, extendsFilePaths };
82
79
  }
83
- function getExtendsImportData(configFileExports, configFilePath) {
80
+ function getExtendsPointerImportData(configFileExports, configFilePath) {
84
81
  const { filePathToShowToUser } = configFilePath;
85
82
  const configFileExport = (0, getConfigFileExport_js_1.getConfigFileExport)(configFileExports, filePathToShowToUser);
86
83
  const wrongUsage = `${filePathToShowToUser} sets the config ${picocolors_1.default.cyan('extends')} to an invalid value, see https://vike.dev/extends`;
@@ -97,10 +94,10 @@ function getExtendsImportData(configFileExports, configFilePath) {
97
94
  else {
98
95
  (0, utils_js_1.assertUsage)(false, wrongUsage);
99
96
  }
100
- const extendsImportData = extendList.map((importDataSerialized) => {
101
- const importData = (0, transformFileImports_js_1.parseImportData)(importDataSerialized);
102
- (0, utils_js_1.assertUsage)(importData, wrongUsage);
103
- return importData;
97
+ const extendsPointerImportData = extendList.map((importString) => {
98
+ const pointerImportData = (0, transformFileImports_js_1.parsePointerImportData)(importString);
99
+ (0, utils_js_1.assertUsage)(pointerImportData, wrongUsage);
100
+ return pointerImportData;
104
101
  });
105
- return extendsImportData;
102
+ return extendsPointerImportData;
106
103
  }
@@ -0,0 +1,129 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.clearFilesEnvMap = exports.resolvePointerImport = exports.resolvePointerImportOfConfig = void 0;
7
+ const picocolors_1 = __importDefault(require("@brillout/picocolors"));
8
+ const utils_js_1 = require("../../../../utils.js");
9
+ const transformFileImports_js_1 = require("./transformFileImports.js");
10
+ const path_1 = __importDefault(require("path"));
11
+ const getFilePath_js_1 = require("../../../../shared/getFilePath.js");
12
+ const filesEnvMap = new Map();
13
+ function resolvePointerImportOfConfig(configValue, importerFilePath, userRootDir, configEnv, configName) {
14
+ if (typeof configValue !== 'string')
15
+ return null;
16
+ const pointerImportData = (0, transformFileImports_js_1.parsePointerImportData)(configValue);
17
+ if (!pointerImportData)
18
+ return null;
19
+ const { importPath, exportName } = pointerImportData;
20
+ const filePath = resolvePointerImport(pointerImportData, importerFilePath, userRootDir);
21
+ const fileExportPathToShowToUser = exportName === 'default' || exportName === configName ? [] : [exportName];
22
+ assertFileEnv(filePath.filePathAbsoluteFilesystem, importPath, configEnv, configName);
23
+ return {
24
+ ...filePath,
25
+ fileExportName: exportName,
26
+ fileExportPathToShowToUser
27
+ };
28
+ }
29
+ exports.resolvePointerImportOfConfig = resolvePointerImportOfConfig;
30
+ function resolvePointerImport(pointerImportData, importerFilePath, userRootDir) {
31
+ const { importPath } = pointerImportData;
32
+ const filePathAbsoluteFilesystem = resolveImportPathWithNode(pointerImportData, importerFilePath);
33
+ let filePath;
34
+ // - importPath is one of the following. (See `transpileAndExecuteFile()`.)
35
+ // - A relative import path
36
+ // - A filesystem absolute path
37
+ // - An npm package import
38
+ // - importPath cannot be a path alias (since esbuild resolves path aliases, see transpileAndExecuteFile.ts)
39
+ (0, utils_js_1.assertPosixPath)(importPath);
40
+ if (importPath.startsWith('.') || (0, utils_js_1.isPathFilesystemAbsolute)(importPath)) {
41
+ if (importPath.startsWith('.')) {
42
+ (0, utils_js_1.assert)(importPath.startsWith('./') || importPath.startsWith('../'));
43
+ }
44
+ assertImportPath(filePathAbsoluteFilesystem, pointerImportData, importerFilePath);
45
+ const filePathAbsoluteUserRootDir = (0, getFilePath_js_1.getFilePathAbsoluteUserRootDir)({ filePathAbsoluteFilesystem, userRootDir });
46
+ // This assert() is guarenteed, see assertUsage() in the onResolve() esbuild hook in transpileAndExecuteFile.ts
47
+ (0, utils_js_1.assert)(filePathAbsoluteUserRootDir);
48
+ // Imports are included in virtual files, thus the relative path of imports need to resolved.
49
+ // ```
50
+ // [vite] Internal server error: Failed to resolve import "./onPageTransitionHooks" from "virtual:vike:pageConfigValuesAll:client:/pages/index". Does the file exist?
51
+ // ```
52
+ filePath = (0, getFilePath_js_1.getFilePathResolved)({ filePathAbsoluteUserRootDir, userRootDir });
53
+ }
54
+ else {
55
+ const importPathAbsolute = importPath;
56
+ // importPath cannot be a path alias (since esbuild resolves path aliases, see transpileAndExecuteFile.ts)
57
+ (0, utils_js_1.assertIsNpmPackageImport)(importPathAbsolute);
58
+ if (filePathAbsoluteFilesystem) {
59
+ filePath = (0, getFilePath_js_1.getFilePathResolved)({
60
+ userRootDir,
61
+ filePathAbsoluteFilesystem,
62
+ importPathAbsolute
63
+ });
64
+ }
65
+ else {
66
+ filePath = (0, getFilePath_js_1.getFilePathUnresolved)({
67
+ importPathAbsolute
68
+ });
69
+ }
70
+ }
71
+ return filePath;
72
+ }
73
+ exports.resolvePointerImport = resolvePointerImport;
74
+ function resolveImportPathWithNode(pointerImportData, importerFilePath) {
75
+ const importerFilePathAbsolute = importerFilePath.filePathAbsoluteFilesystem;
76
+ (0, utils_js_1.assertPosixPath)(importerFilePathAbsolute);
77
+ const cwd = path_1.default.posix.dirname(importerFilePathAbsolute);
78
+ // We can't use import.meta.resolve() as of Junary 2023 (and probably for a lot longer)
79
+ // https://stackoverflow.com/questions/54977743/do-require-resolve-for-es-modules#comment137174954_62272600:~:text=But%20the%20argument%20parent%20(aka%20cwd)%20still%20requires%20a%20flag
80
+ // filePathAbsoluteFilesystem is expected to be null when pointerImportData.importPath is a Vite path alias
81
+ const filePathAbsoluteFilesystem = (0, utils_js_1.requireResolve)(pointerImportData.importPath, cwd);
82
+ return filePathAbsoluteFilesystem;
83
+ }
84
+ function assertImportPath(filePathAbsoluteFilesystem, pointerImportData, importerFilePath) {
85
+ const { importPath: importPath, importStringWasGenerated, importString } = pointerImportData;
86
+ const { filePathToShowToUser } = importerFilePath;
87
+ if (!filePathAbsoluteFilesystem) {
88
+ const importPathString = picocolors_1.default.cyan(`'${importPath}'`);
89
+ const errIntro = importStringWasGenerated
90
+ ? `The import path ${importPathString} in ${filePathToShowToUser}`
91
+ : `The import ${picocolors_1.default.cyan(importString)} defined in ${filePathToShowToUser}`;
92
+ const errIntro2 = `${errIntro} couldn't be resolved: does ${importPathString}`;
93
+ if (importPath.startsWith('.')) {
94
+ (0, utils_js_1.assert)(importPath.startsWith('./') || importPath.startsWith('../'));
95
+ (0, utils_js_1.assertUsage)(false, `${errIntro2} point to an existing file?`);
96
+ }
97
+ else {
98
+ (0, utils_js_1.assertUsage)(false, `${errIntro2} exist?`);
99
+ }
100
+ }
101
+ }
102
+ function assertFileEnv(filePathAbsoluteFilesystem, importPath, configEnv, configName) {
103
+ let key;
104
+ if (filePathAbsoluteFilesystem) {
105
+ key = filePathAbsoluteFilesystem;
106
+ }
107
+ else {
108
+ (0, utils_js_1.assertIsNpmPackageImport)(importPath);
109
+ key = importPath;
110
+ }
111
+ (0, utils_js_1.assertPosixPath)(key);
112
+ if (!filesEnvMap.has(key)) {
113
+ filesEnvMap.set(key, []);
114
+ }
115
+ const fileEnv = filesEnvMap.get(key);
116
+ fileEnv.push({ configEnv, configName });
117
+ const configDifferentEnv = fileEnv.filter((c) => !(0, utils_js_1.deepEqual)(c.configEnv, configEnv))[0];
118
+ if (configDifferentEnv) {
119
+ (0, utils_js_1.assertUsage)(false, [
120
+ `${key} defines the value of configs living in different environments:`,
121
+ ...[configDifferentEnv, { configName, configEnv }].map((c) => ` - config ${picocolors_1.default.cyan(c.configName)} which value lives in environment ${picocolors_1.default.cyan(JSON.stringify(c.configEnv))}`),
122
+ 'Defining config values in the same file is allowed only if they live in the same environment, see https://vike.dev/config#pointer-imports'
123
+ ].join('\n'));
124
+ }
125
+ }
126
+ function clearFilesEnvMap() {
127
+ filesEnvMap.clear();
128
+ }
129
+ exports.clearFilesEnvMap = clearFilesEnvMap;
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
3
3
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
4
  };
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.isImportData = exports.parseImportData = exports.transformFileImports = void 0;
6
+ exports.isPointerImportData = exports.parsePointerImportData = exports.transformFileImports = void 0;
7
7
  // Playground: https://github.com/brillout/acorn-playground
8
8
  // Notes about `with { type: 'pointer' }`
9
9
  // - It works well with TypeScript: it doesn't complain upon `with { type: 'unknown-to-typescript' }` and go-to-definition & types are preserved: https://www.typescriptlang.org/docs/handbook/release-notes/typescript-5-3.html#import-attributes
@@ -93,7 +93,7 @@ skipWarnings) {
93
93
  }
94
94
  return importLocalName;
95
95
  })();
96
- const importString = serializeImportData({ importPath, exportName, importStringWasGenerated: true });
96
+ const importString = serializePointerImportData({ importPath, exportName, importStringWasGenerated: true });
97
97
  replacement += `const ${importLocalName} = '${importString}';`;
98
98
  });
99
99
  spliceOperations.push({
@@ -122,17 +122,17 @@ function getImports(code) {
122
122
  const import_ = 'import';
123
123
  const SEP = ':';
124
124
  const zeroWidthSpace = '\u200b';
125
- function serializeImportData({ importPath, exportName, importStringWasGenerated }) {
125
+ function serializePointerImportData({ importPath, exportName, importStringWasGenerated }) {
126
126
  const tag = importStringWasGenerated ? zeroWidthSpace : '';
127
127
  // `import:${importPath}:${importPath}`
128
128
  return `${tag}${import_}${SEP}${importPath}${SEP}${exportName}`;
129
129
  }
130
- function isImportData(str) {
130
+ function isPointerImportData(str) {
131
131
  return str.startsWith(import_ + SEP) || str.startsWith(zeroWidthSpace + import_ + SEP);
132
132
  }
133
- exports.isImportData = isImportData;
134
- function parseImportData(importString) {
135
- if (!isImportData(importString)) {
133
+ exports.isPointerImportData = isPointerImportData;
134
+ function parsePointerImportData(importString) {
135
+ if (!isPointerImportData(importString)) {
136
136
  return null;
137
137
  }
138
138
  let importStringWasGenerated = false;
@@ -152,7 +152,7 @@ function parseImportData(importString) {
152
152
  const importPath = parts.slice(0, -1).join(SEP);
153
153
  return { importPath, exportName, importStringWasGenerated, importString };
154
154
  }
155
- exports.parseImportData = parseImportData;
155
+ exports.parsePointerImportData = parsePointerImportData;
156
156
  function spliceMany(str, operations) {
157
157
  let strMod = '';
158
158
  let endPrev;
@@ -13,6 +13,7 @@ const utils_js_1 = require("../../../../utils.js");
13
13
  const transformFileImports_js_1 = require("./transformFileImports.js");
14
14
  const getVikeConfig_js_1 = require("../getVikeConfig.js");
15
15
  require("source-map-support/register.js");
16
+ const getFilePath_js_1 = require("../../../../shared/getFilePath.js");
16
17
  (0, utils_js_1.assertIsNotProductionRuntime)();
17
18
  const debug = (0, utils_js_1.createDebugger)('vike:pointer-imports');
18
19
  async function transpileAndExecuteFile(filePath, userRootDir, isConfigFile) {
@@ -114,13 +115,21 @@ async function transpileWithEsbuild(filePath, userRootDir, transformImports) {
114
115
  return resolved;
115
116
  }
116
117
  (0, utils_js_1.assert)(resolved.path);
117
- resolved.path = (0, utils_js_1.toPosixPath)(resolved.path);
118
+ const importPathResolved = (0, utils_js_1.toPosixPath)(resolved.path);
119
+ const importPathOriginal = args.path;
120
+ // Esbuild resolves path aliases.
121
+ // - Enabling us to use:
122
+ // ```js
123
+ // isNpmPackageImport(str, { cannotBePathAlias: true })
124
+ // assertIsNpmPackageImport()
125
+ // ```
126
+ (0, utils_js_1.assertPathFilesystemAbsolute)(importPathResolved);
118
127
  // vike-{react,vue,solid} follow the convention that their config export resolves to a file named +config.js
119
128
  // - This is temporary, see comment below.
120
- const isVikeExtensionConfigImport = resolved.path.endsWith('+config.js');
129
+ const isVikeExtensionConfigImport = importPathResolved.endsWith('+config.js');
121
130
  const isPointerImport = transformImports === 'all' ||
122
131
  // .jsx, .vue, .svg, ... => obviously not config code
123
- !(0, utils_js_1.isJavaScriptFile)(resolved.path) ||
132
+ !(0, utils_js_1.isJavaScriptFile)(importPathResolved) ||
124
133
  // Import of a Vike extension config => make it a pointer import because we want to show nice error messages (that can display whether a configas been set by the user or by a Vike extension).
125
134
  // - We should have Node.js directly load vike-{react,vue,solid} while enforcing Vike extensions to set 'name' in their +config.js file.
126
135
  // - vike@0.4.162 already started soft-requiring Vike extensions to set the name config
@@ -129,21 +138,53 @@ async function transpileWithEsbuild(filePath, userRootDir, transformImports) {
129
138
  // - For example if esbuild cannot resolve a path alias while Vite can.
130
139
  // - When tsconfig.js#compilerOptions.paths is set, then esbuild is able to resolve the path alias.
131
140
  resolved.errors.length > 0;
132
- pointerImports[resolved.path] = isPointerImport;
133
- (0, utils_js_1.assertPosixPath)(resolved.path);
141
+ (0, utils_js_1.assertPosixPath)(importPathResolved);
142
+ const isNodeModules = importPathResolved.includes('/node_modules/');
134
143
  const isExternal = isPointerImport ||
135
144
  // Performance: npm package imports that aren't pointer imports can be externalized. For example, if Vike eventually adds support for setting Vite configs in the vike.config.js file, then the user may import a Vite plugin in his vike.config.js file. (We could as well let esbuild always transpile /node_modules/ code but it would be useless and would unnecessarily slow down transpilation.)
136
- resolved.path.includes('/node_modules/');
145
+ isNodeModules;
146
+ const filePathAbsoluteUserRootDir = (0, getFilePath_js_1.getFilePathAbsoluteUserRootDir)({
147
+ filePathAbsoluteFilesystem: importPathResolved,
148
+ userRootDir
149
+ });
150
+ let importPathTranspiled;
151
+ (0, utils_js_1.assertPosixPath)(importPathOriginal);
152
+ if (importPathOriginal.startsWith('./') || importPathOriginal.startsWith('../')) {
153
+ // - We need this assertUsage() because we didn't find a way (yet?) to use filesystem absolute import paths in virtual files.
154
+ // - Alternatively, we can again try one of the following for generating the imports of virtual files. (Last time we tried none of it worked.)
155
+ // - ~~~js
156
+ // assert(filePathAbsoluteFilesystem.startsWith('/'))
157
+ // filePath = `/@fs${filePathAbsoluteFilesystem}`
158
+ // ~~~
159
+ // - ~~~js
160
+ // assert(filePathAbsoluteUserRootDir.startsWith('../'))
161
+ // filePathAbsoluteUserRootDir = '/' + filePathAbsoluteUserRootDir
162
+ // ~~~
163
+ (0, utils_js_1.assertUsage)(filePathAbsoluteUserRootDir, `Import ${picocolors_1.default.cyan(importPathOriginal)} resolves to ${importPathResolved} outside of ${userRootDir} which is forbidden: make sure your relative import paths resolve inside ${userRootDir}, or import from an npm package.`);
164
+ importPathTranspiled = importPathResolved;
165
+ }
166
+ else {
167
+ // importPathOriginal is either:
168
+ // - Npm package import
169
+ // - Path alias
170
+ if (filePathAbsoluteUserRootDir && !isNodeModules) {
171
+ // importPathOriginal is most likely (always?) a path alias.
172
+ importPathTranspiled = importPathResolved;
173
+ }
174
+ else {
175
+ // importPathOriginal is an npm package import. (Assuming path aliases always resolve inside `userRootDir`.)
176
+ (0, utils_js_1.assertIsNpmPackageImport)(importPathOriginal);
177
+ importPathTranspiled = importPathOriginal;
178
+ }
179
+ }
137
180
  if (debug.isActivated)
138
- debug('onResolved()', { args, resolved, isPointerImport, isExternal });
139
- // We need esbuild to resolve path aliases so that we can use:
140
- // isNpmPackageImport(str, { cannotBePathAlias: true })
141
- // assertIsNpmPackageImport()
142
- (0, utils_js_1.assertPathIsFilesystemAbsolute)(resolved.path);
181
+ debug('onResolved()', { args, resolved, importPathTranspiled, isPointerImport, isExternal });
182
+ pointerImports[importPathTranspiled] = isPointerImport;
143
183
  if (isExternal) {
144
- return { external: true, path: resolved.path };
184
+ return { external: true, path: importPathTranspiled };
145
185
  }
146
186
  else {
187
+ resolved.path = importPathTranspiled;
147
188
  return resolved;
148
189
  }
149
190
  });