vike 0.4.266 → 0.4.267-commit-7884d91

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 (159) hide show
  1. package/dist/client/runtime-client-routing/createPageContextClient.d.ts +4 -0
  2. package/dist/client/runtime-client-routing/getGlobalContextClientInternal.d.ts +4 -0
  3. package/dist/client/runtime-client-routing/getPageContextFromHooks.d.ts +22 -2
  4. package/dist/client/runtime-client-routing/getPageContextFromHooks.js +4 -5
  5. package/dist/client/runtime-client-routing/history.d.ts +19 -19
  6. package/dist/client/runtime-client-routing/history.js +89 -83
  7. package/dist/client/runtime-client-routing/renderPageClient.d.ts +472 -9
  8. package/dist/client/runtime-client-routing/renderPageClient.js +12 -11
  9. package/dist/client/runtime-client-routing/setScrollPosition.js +6 -5
  10. package/dist/client/runtime-client-routing/streamedValues.d.ts +5 -0
  11. package/dist/client/runtime-client-routing/streamedValues.js +23 -0
  12. package/dist/client/runtime-server-routing/createPageContextClient.d.ts +4 -0
  13. package/dist/client/runtime-server-routing/entry.js +1 -1
  14. package/dist/client/runtime-server-routing/getGlobalContextClientInternal.d.ts +4 -0
  15. package/dist/client/shared/getGlobalContextClientInternalShared.d.ts +4 -0
  16. package/dist/client/shared/getJsonSerializedInHtml.d.ts +2 -2
  17. package/dist/client/shared/getJsonSerializedInHtml.js +9 -6
  18. package/dist/client/shared/streamedValues/asyncIterable.d.ts +4 -0
  19. package/dist/client/shared/streamedValues/asyncIterable.js +26 -0
  20. package/dist/client/shared/streamedValues/lines.d.ts +11 -0
  21. package/dist/client/shared/streamedValues/lines.js +19 -0
  22. package/dist/client/shared/streamedValues/promise.d.ts +4 -0
  23. package/dist/client/shared/streamedValues/promise.js +19 -0
  24. package/dist/client/shared/streamedValues/readableStream.d.ts +4 -0
  25. package/dist/client/shared/streamedValues/readableStream.js +44 -0
  26. package/dist/client/shared/streamedValues/registry.d.ts +21 -0
  27. package/dist/client/shared/streamedValues/registry.js +40 -0
  28. package/dist/client/shared/streamedValues.d.ts +7 -0
  29. package/dist/client/shared/streamedValues.js +82 -0
  30. package/dist/node/api/resolveViteConfigUser.js +2 -2
  31. package/dist/node/prerender/runPrerender.d.ts +12 -4
  32. package/dist/node/prerender/runPrerender.js +71 -15
  33. package/dist/node/vite/assertEnvVite.js +2 -2
  34. package/dist/node/vite/index.js +2 -0
  35. package/dist/node/vite/plugins/build/handleAssetsManifest.js +8 -3
  36. package/dist/node/vite/plugins/build/pluginBuildApp.js +25 -26
  37. package/dist/node/vite/plugins/build/pluginBuildConfig.d.ts +2 -2
  38. package/dist/node/vite/plugins/build/pluginBuildConfig.js +24 -16
  39. package/dist/node/vite/plugins/build/pluginDistFileNames.js +70 -50
  40. package/dist/node/vite/plugins/build/pluginEnvironmentEntries.d.ts +6 -0
  41. package/dist/node/vite/plugins/build/pluginEnvironmentEntries.js +71 -0
  42. package/dist/node/vite/plugins/build/pluginSuppressRollupWarning.js +19 -17
  43. package/dist/node/vite/plugins/pluginCommon.js +9 -6
  44. package/dist/node/vite/plugins/pluginDev/logSkillHint.js +6 -4
  45. package/dist/node/vite/plugins/pluginDev/optimizeDeps.js +1 -1
  46. package/dist/node/vite/plugins/pluginReplaceConstantsGlobalThis.js +6 -4
  47. package/dist/node/vite/plugins/pluginUniversalDeploy.js +3 -2
  48. package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFileGlobalEntry.d.ts +2 -1
  49. package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFileGlobalEntry.js +29 -12
  50. package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFileGlobalEntryWithOldDesign.js +3 -2
  51. package/dist/node/vite/plugins/pluginVirtualFiles/generateVirtualFilePageEntry.js +7 -7
  52. package/dist/node/vite/plugins/pluginVirtualFiles/getConfigValueSourcesRelevant.d.ts +7 -5
  53. package/dist/node/vite/plugins/pluginVirtualFiles/getConfigValueSourcesRelevant.js +4 -10
  54. package/dist/node/vite/plugins/pluginVirtualFiles.js +20 -0
  55. package/dist/node/vite/shared/addSsrMiddleware.js +13 -1
  56. package/dist/node/vite/shared/getAssetsDir.d.ts +3 -2
  57. package/dist/node/vite/shared/getAssetsDir.js +3 -3
  58. package/dist/node/vite/shared/isViteCli.d.ts +3 -3
  59. package/dist/node/vite/shared/isViteCli.js +80 -84
  60. package/dist/node/vite/shared/isViteServerSide.js +2 -7
  61. package/dist/node/vite/shared/resolveVikeConfigInternal/getPlusFiles.d.ts +2 -2
  62. package/dist/node/vite/shared/resolveVikeConfigInternal/getPlusFiles.js +3 -3
  63. package/dist/node/vite/shared/resolveVikeConfigInternal/loadFileAtConfigTime.d.ts +4 -4
  64. package/dist/node/vite/shared/resolveVikeConfigInternal/loadFileAtConfigTime.js +9 -9
  65. package/dist/node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.d.ts +1 -1
  66. package/dist/node/vite/shared/resolveVikeConfigInternal/metaBuiltIn.js +12 -6
  67. package/dist/node/vite/shared/resolveVikeConfigInternal/pointerImports.d.ts +3 -1
  68. package/dist/node/vite/shared/resolveVikeConfigInternal/pointerImports.js +18 -46
  69. package/dist/node/vite/shared/resolveVikeConfigInternal/transpileAndExecuteFile.d.ts +3 -3
  70. package/dist/node/vite/shared/resolveVikeConfigInternal/transpileAndExecuteFile.js +333 -212
  71. package/dist/node/vite/shared/resolveVikeConfigInternal.d.ts +4 -1
  72. package/dist/node/vite/shared/resolveVikeConfigInternal.js +97 -26
  73. package/dist/server/runtime/globalContext.d.ts +20 -0
  74. package/dist/server/runtime/renderPageServer/analyzePage.js +3 -3
  75. package/dist/server/runtime/renderPageServer/createHttpResponse.d.ts +20 -7
  76. package/dist/server/runtime/renderPageServer/createHttpResponse.js +34 -15
  77. package/dist/server/runtime/renderPageServer/createPageContextServer.d.ts +4 -0
  78. package/dist/server/runtime/renderPageServer/csp.d.ts +2 -1
  79. package/dist/server/runtime/renderPageServer/csp.js +2 -1
  80. package/dist/server/runtime/renderPageServer/execHookOnError.js +1 -1
  81. package/dist/server/runtime/renderPageServer/execHookOnRenderHtml.d.ts +9 -0
  82. package/dist/server/runtime/renderPageServer/execHookOnRenderHtml.js +17 -5
  83. package/dist/server/runtime/renderPageServer/getHttpResponseBody.d.ts +2 -2
  84. package/dist/server/runtime/renderPageServer/getHttpResponseBody.js +17 -2
  85. package/dist/server/runtime/renderPageServer/getPageContextJson.d.ts +8 -0
  86. package/dist/server/runtime/renderPageServer/getPageContextJson.js +47 -0
  87. package/dist/server/runtime/renderPageServer/handleErrorWithoutErrorPage.d.ts +2 -0
  88. package/dist/server/runtime/renderPageServer/handleErrorWithoutErrorPage.js +1 -1
  89. package/dist/server/runtime/renderPageServer/headersResponse.d.ts +11 -2
  90. package/dist/server/runtime/renderPageServer/headersResponse.js +22 -2
  91. package/dist/server/runtime/renderPageServer/html/injectAssets/getHtmlTags.js +5 -4
  92. package/dist/server/runtime/renderPageServer/html/injectAssets.d.ts +3 -2
  93. package/dist/server/runtime/renderPageServer/html/injectAssets.js +7 -1
  94. package/dist/server/runtime/renderPageServer/html/renderHtml.js +4 -2
  95. package/dist/server/runtime/renderPageServer/html/serializeContext.d.ts +5 -1
  96. package/dist/server/runtime/renderPageServer/html/serializeContext.js +12 -9
  97. package/dist/server/runtime/renderPageServer/html/stream.d.ts +13 -6
  98. package/dist/server/runtime/renderPageServer/html/stream.js +121 -31
  99. package/dist/server/runtime/renderPageServer/html/streamedValuesHtml.d.ts +30 -0
  100. package/dist/server/runtime/renderPageServer/html/streamedValuesHtml.js +92 -0
  101. package/dist/server/runtime/renderPageServer/loadPageConfigsLazyServerSide.d.ts +4 -0
  102. package/dist/server/runtime/renderPageServer/loadPageConfigsLazyServerSide.js +5 -1
  103. package/dist/server/runtime/renderPageServer/loadPageContextEnvironments.d.ts +15 -0
  104. package/dist/server/runtime/renderPageServer/loadPageContextEnvironments.js +61 -0
  105. package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.d.ts +314 -1
  106. package/dist/server/runtime/renderPageServer/renderPageServerAfterRoute.js +21 -12
  107. package/dist/server/runtime/renderPageServer/streamedValues/asyncIterable.d.ts +4 -0
  108. package/dist/server/runtime/renderPageServer/streamedValues/asyncIterable.js +12 -0
  109. package/dist/server/runtime/renderPageServer/streamedValues/lines.d.ts +10 -0
  110. package/dist/server/runtime/renderPageServer/streamedValues/lines.js +49 -0
  111. package/dist/server/runtime/renderPageServer/streamedValues/promise.d.ts +4 -0
  112. package/dist/server/runtime/renderPageServer/streamedValues/promise.js +14 -0
  113. package/dist/server/runtime/renderPageServer/streamedValues/pump.d.ts +10 -0
  114. package/dist/server/runtime/renderPageServer/streamedValues/pump.js +67 -0
  115. package/dist/server/runtime/renderPageServer/streamedValues/readableStream.d.ts +4 -0
  116. package/dist/server/runtime/renderPageServer/streamedValues/readableStream.js +12 -0
  117. package/dist/server/runtime/renderPageServer/streamedValues/registry.d.ts +28 -0
  118. package/dist/server/runtime/renderPageServer/streamedValues/registry.js +33 -0
  119. package/dist/server/runtime/renderPageServer.d.ts +4 -0
  120. package/dist/server/runtime/renderPageServer.js +17 -8
  121. package/dist/shared-server-client/createGlobalContextShared.d.ts +8 -0
  122. package/dist/shared-server-client/createGlobalContextShared.js +2 -1
  123. package/dist/shared-server-client/getPageContextPublicShared.js +0 -2
  124. package/dist/shared-server-client/getPageFiles/parseVirtualFileExportsGlobalEntry.d.ts +8 -0
  125. package/dist/shared-server-client/getPageFiles/parseVirtualFileExportsGlobalEntry.js +17 -7
  126. package/dist/shared-server-client/hooks/execHook.d.ts +1 -1
  127. package/dist/shared-server-client/hooks/execHook.js +2 -2
  128. package/dist/shared-server-client/route/abort.d.ts +1 -1
  129. package/dist/shared-server-client/route/abort.js +4 -2
  130. package/dist/shared-server-client/streamedValues.d.ts +22 -0
  131. package/dist/shared-server-client/streamedValues.js +24 -0
  132. package/dist/shared-server-node/vike-environments.d.ts +4 -0
  133. package/dist/shared-server-node/vike-environments.js +10 -0
  134. package/dist/shared-server-node/virtualFileId.d.ts +7 -5
  135. package/dist/shared-server-node/virtualFileId.js +42 -42
  136. package/dist/types/Config.d.ts +9 -1
  137. package/dist/types/PageConfig.d.ts +13 -5
  138. package/dist/types/PageContext.d.ts +18 -1
  139. package/dist/utils/PROJECT_VERSION.d.ts +1 -1
  140. package/dist/utils/PROJECT_VERSION.js +1 -1
  141. package/dist/utils/assertNodeVersion.d.ts +2 -0
  142. package/dist/utils/assertNodeVersion.js +4 -1
  143. package/dist/utils/assertViteVersion.d.ts +1 -3
  144. package/dist/utils/assertViteVersion.js +6 -9
  145. package/dist/utils/debug.d.ts +1 -1
  146. package/dist/utils/debug.js +1 -1
  147. package/dist/utils/deepEqual.d.ts +2 -1
  148. package/dist/utils/deepEqual.js +21 -6
  149. package/dist/utils/getContentTypeFromUrl.d.ts +2 -0
  150. package/dist/utils/getContentTypeFromUrl.js +39 -0
  151. package/dist/utils/injectRollupInputs.d.ts +2 -2
  152. package/dist/utils/injectRollupInputs.js +2 -2
  153. package/dist/utils/isDev.js +2 -7
  154. package/dist/utils/parseUrl-extras.js +4 -0
  155. package/dist/utils/requireResolve.d.ts +0 -6
  156. package/dist/utils/requireResolve.js +0 -8
  157. package/package.json +9 -10
  158. package/dist/shared-server-client/addIs404ToPageProps.d.ts +0 -2
  159. package/dist/shared-server-client/addIs404ToPageProps.js +0 -17
@@ -3,15 +3,17 @@ export { getConfigValueSourceRelevantAnyEnv };
3
3
  export { isRuntimeEnvMatch };
4
4
  export { isConfigSourceValueNull };
5
5
  export type { RuntimeEnv };
6
+ export type { RuntimeEnvRuntime };
6
7
  import type { ConfigEnv, ConfigValueSource, PageConfigBuildTime, PageConfigGlobalBuildTime } from '../../../../types/PageConfig.js';
7
8
  import '../../assertEnvVite.js';
8
- type RuntimeEnv = {
9
- isForClientSide: boolean;
10
- isClientRouting: boolean;
11
- isDev?: boolean;
12
- } | {
9
+ type RuntimeEnv = RuntimeEnvRuntime | {
13
10
  isForConfig: true;
14
11
  };
12
+ type RuntimeEnvRuntime = {
13
+ environmentName: string;
14
+ isClientRouting?: boolean;
15
+ isDev: boolean;
16
+ };
15
17
  type PageConfigPartial = Pick<PageConfigBuildTime | PageConfigGlobalBuildTime, 'configValueSources' | 'configDefinitions'>;
16
18
  declare function getConfigValueSourcesRelevant(configName: string, runtimeEnv: RuntimeEnv, pageConfig: PageConfigPartial): ConfigValueSource[];
17
19
  declare function getConfigValueSourceRelevantAnyEnv(configName: string, pageConfig: PageConfigPartial): null | ConfigValueSource;
@@ -47,16 +47,10 @@ function isRuntimeEnvMatch(configEnv, runtimeEnv) {
47
47
  if ('isForConfig' in runtimeEnv)
48
48
  return !!configEnv.config;
49
49
  // Runtime
50
- if (!runtimeEnv.isForClientSide) {
51
- if (!configEnv.server)
52
- return false;
53
- }
54
- else {
55
- if (!configEnv.client)
56
- return false;
57
- if (configEnv.client === 'if-client-routing' && !runtimeEnv.isClientRouting)
58
- return false;
59
- }
50
+ if (!configEnv[runtimeEnv.environmentName])
51
+ return false;
52
+ if (runtimeEnv.environmentName === 'client' && configEnv.clientRoutingOnly && !runtimeEnv.isClientRouting)
53
+ return false;
60
54
  // Production/development
61
55
  if (configEnv.production !== undefined) {
62
56
  assert(typeof configEnv.production === 'boolean');
@@ -2,6 +2,7 @@ export { pluginVirtualFiles };
2
2
  import { normalizePath } from 'vite';
3
3
  import { generateVirtualFilePageEntry } from './pluginVirtualFiles/generateVirtualFilePageEntry.js';
4
4
  import { generateVirtualFileGlobalEntryWithOldDesign } from './pluginVirtualFiles/generateVirtualFileGlobalEntryWithOldDesign.js';
5
+ import { generateVirtualFileGlobalEntry } from './pluginVirtualFiles/generateVirtualFileGlobalEntry.js';
5
6
  import { escapeRegex } from '../../../utils/escapeRegex.js';
6
7
  import { isScriptFile } from '../../../utils/isScriptFile.js';
7
8
  import { addVirtualFileIdPrefix, isVirtualFileId, removeVirtualFileIdPrefix, virtualFileIdPrefix1, virtualFileIdPrefix2, } from '../../../utils/virtualFileId.js';
@@ -9,6 +10,8 @@ import { assert } from '../../../utils/assert.js';
9
10
  import { assertPosixPath } from '../../../utils/path.js';
10
11
  import { parseVirtualFileId } from '../../../shared-server-node/virtualFileId.js';
11
12
  import { reloadVikeConfig, isV1Design, getVikeConfigInternalOptional } from '../shared/resolveVikeConfigInternal.js';
13
+ import { isEnvironmentBuiltIn } from '../../../shared-server-node/vike-environments.js';
14
+ import { isRunnableDevEnvironment } from '../../../utils/isRunnableDevEnvironment.js';
12
15
  import pc from '@brillout/picocolors';
13
16
  import { logConfigInfo } from '../shared/loggerDev.js';
14
17
  import { getFilePathToShowToUserModule } from '../shared/getFilePath.js';
@@ -73,6 +76,9 @@ function pluginVirtualFiles() {
73
76
  return code;
74
77
  }
75
78
  if (idParsed.type === 'global-entry') {
79
+ if (!isEnvironmentBuiltIn(idParsed.environmentName)) {
80
+ return generateVirtualFileGlobalEntry({ environmentName: idParsed.environmentName, isDev }, id);
81
+ }
76
82
  const code = await generateVirtualFileGlobalEntryWithOldDesign(id, options, config, this.environment, isDev);
77
83
  return code;
78
84
  }
@@ -179,6 +185,20 @@ function invalidateVikeVirtualFiles(server) {
179
185
  vikeVirtualFiles.forEach((mod) => {
180
186
  server.moduleGraph.invalidateModule(mod);
181
187
  });
188
+ // - `server.moduleGraph` only covers the `client` and `ssr` environments, while additional environments (e.g. `rsc`) also load Vike's virtual files
189
+ Object.values(server.environments).forEach((environment) => {
190
+ environment.moduleGraph.idToModuleMap.forEach((mod, id) => {
191
+ if (parseVirtualFileId(id))
192
+ environment.moduleGraph.invalidateModule(mod);
193
+ });
194
+ if (!isRunnableDevEnvironment(environment))
195
+ return;
196
+ const { evaluatedModules } = environment.runner;
197
+ evaluatedModules.idToModuleMap.forEach((mod, id) => {
198
+ if (parseVirtualFileId(id))
199
+ evaluatedModules.invalidateModule(mod);
200
+ });
201
+ });
182
202
  }
183
203
  function getVikeVirtualFiles(server) {
184
204
  const vikeVirtualFiles = Array.from(server.moduleGraph.urlToModuleMap.keys())
@@ -50,8 +50,20 @@ function addSsrMiddleware(middlewares, config, isPreview, isPrerenderingEnabled)
50
50
  res.setHeader(name, value);
51
51
  }
52
52
  const { httpResponse } = pageContext;
53
- httpResponse.headers.forEach(([name, value]) => res.setHeader(name, value));
53
+ setHeadersWithMultipleCookies(res, httpResponse.headers);
54
54
  res.statusCode = httpResponse.statusCode;
55
55
  httpResponse.pipe(res);
56
56
  });
57
57
  }
58
+ // A response can have several Set-Cookie headers: res.setHeader() would only keep the last one
59
+ function setHeadersWithMultipleCookies(res, headers) {
60
+ const cookies = [];
61
+ headers.forEach(([name, value]) => {
62
+ if (name.toLowerCase() === 'set-cookie')
63
+ cookies.push(value);
64
+ else
65
+ res.setHeader(name, value);
66
+ });
67
+ if (cookies.length > 0)
68
+ res.setHeader('set-cookie', cookies);
69
+ }
@@ -1,4 +1,5 @@
1
1
  export { getAssetsDir };
2
- import type { ResolvedConfig } from 'vite';
3
2
  import '../assertEnvVite.js';
4
- declare function getAssetsDir(config: ResolvedConfig): string;
3
+ declare function getAssetsDir(build: {
4
+ assetsDir: string;
5
+ }): string;
@@ -1,9 +1,9 @@
1
1
  export { getAssetsDir };
2
2
  import { assertUsage } from '../../../utils/assert.js';
3
3
  import '../assertEnvVite.js';
4
- function getAssetsDir(config) {
5
- let { assetsDir } = config.build;
6
- assertUsage(assetsDir, `${assetsDir} cannot be an empty string`);
4
+ function getAssetsDir(build) {
5
+ let { assetsDir } = build;
6
+ assertUsage(assetsDir, "Vite's build.assetsDir cannot be an empty string");
7
7
  assetsDir = assetsDir.split(/\/|\\/).filter(Boolean).join('/');
8
8
  return assetsDir;
9
9
  }
@@ -1,6 +1,6 @@
1
1
  export { isViteCli };
2
2
  export { getViteCliArgs };
3
- export { getViteBuildCliArgs };
3
+ export { getViteCliArgsMinimal };
4
4
  export { getViteCliCommand };
5
5
  import '../assertEnvVite.js';
6
6
  declare function isViteCli(): boolean;
@@ -12,8 +12,8 @@ type ConfigFromCli = {
12
12
  };
13
13
  type ViteCommand = 'dev' | 'build' | 'optimize' | 'preview';
14
14
  declare function getViteCliCommand(): ViteCommand | null;
15
- declare function getViteBuildCliArgs(): null | ConfigFromCli;
16
- declare function getViteCliArgs(): null | {
15
+ declare function getViteCliArgsMinimal(): null | {
17
16
  root: string | undefined;
18
17
  configFile: string | undefined;
19
18
  };
19
+ declare function getViteCliArgs(): null | ConfigFromCli;
@@ -1,7 +1,8 @@
1
1
  export { isViteCli };
2
2
  export { getViteCliArgs };
3
- export { getViteBuildCliArgs };
3
+ export { getViteCliArgsMinimal };
4
4
  export { getViteCliCommand };
5
+ // Copied from Vite's CLI
5
6
  import { assert } from '../../../utils/assert.js';
6
7
  import { isObject } from '../../../utils/isObject.js';
7
8
  import { isToolCli } from '../../../utils/isToolCli.js';
@@ -11,48 +12,23 @@ const desc = 'vike:vite-cli-simulation';
11
12
  function isViteCli() {
12
13
  return isToolCli('vite');
13
14
  }
14
- function getViteCliCommand() {
15
- if (!isViteCli())
16
- return null;
17
- let command;
18
- const setCommand = (cmd) => {
19
- assert(command === undefined);
20
- command = cmd;
15
+ function parseViteCli() {
16
+ let viteCli;
17
+ const onCommand = (command) => (root, options) => {
18
+ assert(viteCli === undefined);
19
+ assert(root === undefined || typeof root === 'string');
20
+ assert(isObject(options));
21
+ // Same as Vite: duplicated options => the last value wins
22
+ for (const [key, value] of Object.entries(options)) {
23
+ if (Array.isArray(value))
24
+ options[key] = value[value.length - 1];
25
+ }
26
+ assert(options.config === undefined || typeof options.config === 'string');
27
+ viteCli = { command, root, options };
21
28
  };
22
- // Copied & adapted from Vite
23
- // https://github.com/vitejs/vite/blob/d3e7eeefa91e1992f47694d16fe4dbe708c4d80e/packages/vite/src/node/cli.ts#L186-L188
24
- const cli = cac(desc);
25
- // dev
26
- cli
27
- .command('[root]', desc)
28
- .alias('serve')
29
- .alias('dev')
30
- .action(() => {
31
- setCommand('dev');
32
- });
33
- // build
34
- cli.command('build [root]', desc).action(() => {
35
- setCommand('build');
36
- });
37
- // optimize
38
- cli.command('optimize [root]', desc).action(() => {
39
- setCommand('optimize');
40
- });
41
- // preview
42
- cli.command('preview [root]', desc).action(() => {
43
- setCommand('preview');
44
- });
45
- cli.parse();
46
- assert(command);
47
- return command;
48
- }
49
- function getViteBuildCliArgs() {
50
- if (!isViteCli())
51
- return null;
52
- // Copied & adapted from Vite
29
+ // We need to declare all Vite's options, otherwise cac consumes the next argument as the value of boolean options (e.g. `vite build --emptyOutDir some-root`).
53
30
  const cli = cac(desc);
54
31
  // Common configs
55
- // https://github.com/vitejs/vite/blob/d3e7eeefa91e1992f47694d16fe4dbe708c4d80e/packages/vite/src/node/cli.ts#L169-L182
56
32
  cli
57
33
  .option('-c, --config <file>', desc)
58
34
  .option('--base <path>', desc)
@@ -62,8 +38,22 @@ function getViteBuildCliArgs() {
62
38
  .option('-d, --debug [feat]', desc)
63
39
  .option('-f, --filter <filter>', desc)
64
40
  .option('-m, --mode <mode>', desc);
65
- // Build configs
66
- // https://github.com/vitejs/vite/blob/d3e7eeefa91e1992f47694d16fe4dbe708c4d80e/packages/vite/src/node/cli.ts#L286-L322
41
+ // dev
42
+ cli
43
+ .command('[root]', desc)
44
+ .alias('serve')
45
+ .alias('dev')
46
+ .option('--host [host]', desc)
47
+ .option('--port <port>', desc)
48
+ .option('--open [path]', desc)
49
+ .option('--cors', desc)
50
+ .option('--strictPort', desc)
51
+ .option('--force', desc)
52
+ .option('--experimentalBundle', desc)
53
+ // Options that this copy doesn't declare (e.g. added by newer Vite versions) are still validated by Vite's own CLI, which throws `Unknown option` for options Vite doesn't know
54
+ .allowUnknownOptions()
55
+ .action(onCommand('dev'));
56
+ // build
67
57
  cli
68
58
  .command('build [root]', desc)
69
59
  .option('--target <target>', desc)
@@ -71,35 +61,61 @@ function getViteBuildCliArgs() {
71
61
  .option('--assetsDir <dir>', desc)
72
62
  .option('--assetsInlineLimit <number>', desc)
73
63
  .option('--ssr [entry]', desc)
74
- .option('--sourcemap', desc)
64
+ .option('--sourcemap [output]', desc)
75
65
  .option('--minify [minifier]', desc)
76
66
  .option('--manifest [name]', desc)
77
67
  .option('--ssrManifest [name]', desc)
78
68
  .option('--emptyOutDir', desc)
79
69
  .option('-w, --watch', desc)
80
70
  .option('--app', desc)
81
- .action((root, options) => {
82
- assert(isObject(options));
83
- assert(root === undefined || typeof root === 'string');
84
- assert(options.config === undefined || typeof options.config === 'string');
85
- // https://github.com/vitejs/vite/blob/d3e7eeefa91e1992f47694d16fe4dbe708c4d80e/packages/vite/src/node/cli.ts#L331-L346
86
- const buildOptions = cleanGlobalCLIOptions(cleanBuilderCLIOptions(options));
87
- configFromCli = {
88
- root,
89
- base: options.base,
90
- mode: options.mode,
91
- configFile: options.config,
92
- configLoader: options.configLoader,
93
- logLevel: options.logLevel,
94
- clearScreen: options.clearScreen,
95
- build: buildOptions,
96
- ...(options.app ? { builder: {} } : {}),
97
- };
98
- });
99
- let configFromCli = null;
71
+ .allowUnknownOptions()
72
+ .action(onCommand('build'));
73
+ // optimize
74
+ cli.command('optimize [root]', desc).option('--force', desc).allowUnknownOptions().action(onCommand('optimize'));
75
+ // preview
76
+ cli
77
+ .command('preview [root]', desc)
78
+ .option('--host [host]', desc)
79
+ .option('--port <port>', desc)
80
+ .option('--strictPort', desc)
81
+ .option('--open [path]', desc)
82
+ .option('--outDir <dir>', desc)
83
+ .allowUnknownOptions()
84
+ .action(onCommand('preview'));
100
85
  cli.parse();
101
- return configFromCli;
102
- // https://github.com/vitejs/vite/blob/d3e7eeefa91e1992f47694d16fe4dbe708c4d80e/packages/vite/src/node/cli.ts#L99
86
+ assert(viteCli);
87
+ return viteCli;
88
+ }
89
+ function getViteCliCommand() {
90
+ if (!isViteCli())
91
+ return null;
92
+ return parseViteCli().command;
93
+ }
94
+ function getViteCliArgsMinimal() {
95
+ if (!isViteCli())
96
+ return null;
97
+ const { root, options } = parseViteCli();
98
+ return { root, configFile: options.config };
99
+ }
100
+ function getViteCliArgs() {
101
+ if (!isViteCli())
102
+ return null;
103
+ const { command, root, options } = parseViteCli();
104
+ if (command !== 'build')
105
+ return null;
106
+ // Like Vite: all options except the global ones go to `build`
107
+ const buildOptions = cleanGlobalCLIOptions(cleanBuilderCLIOptions(options));
108
+ return {
109
+ root,
110
+ base: options.base,
111
+ mode: options.mode,
112
+ configFile: options.config,
113
+ configLoader: options.configLoader,
114
+ logLevel: options.logLevel,
115
+ clearScreen: options.clearScreen,
116
+ build: buildOptions,
117
+ ...(options.app ? { builder: {} } : {}),
118
+ };
103
119
  function cleanGlobalCLIOptions(options) {
104
120
  const ret = { ...options };
105
121
  delete ret['--'];
@@ -129,29 +145,9 @@ function getViteBuildCliArgs() {
129
145
  }
130
146
  return ret;
131
147
  }
132
- // https://github.com/vitejs/vite/blob/d3e7eeefa91e1992f47694d16fe4dbe708c4d80e/packages/vite/src/node/cli.ts#L141
133
148
  function cleanBuilderCLIOptions(options) {
134
149
  const ret = { ...options };
135
150
  delete ret.app;
136
151
  return ret;
137
152
  }
138
153
  }
139
- function getViteCliArgs() {
140
- if (!isViteCli())
141
- return null;
142
- const cli = cac(desc);
143
- cli.option('-c, --config <file>', desc);
144
- let result = null;
145
- const setResult = (root, options) => {
146
- assert(root === undefined || typeof root === 'string');
147
- assert(isObject(options));
148
- assert(options.config === undefined || typeof options.config === 'string');
149
- result = { root, configFile: options.config };
150
- };
151
- cli.command('[root]', desc).alias('serve').alias('dev').action(setResult);
152
- cli.command('build [root]', desc).action(setResult);
153
- cli.command('optimize [root]', desc).action(setResult);
154
- cli.command('preview [root]', desc).action(setResult);
155
- cli.parse();
156
- return result;
157
- }
@@ -4,8 +4,7 @@ export { isViteServerSide_onlySsrEnv };
4
4
  export { isViteServerSide_extraSafe };
5
5
  export { isViteServerSide_applyToEnvironment };
6
6
  export { isViteServerSide_configEnvironment };
7
- import { viteVersionMin } from '../../../utils/assertViteVersion.js';
8
- import { assert, assertUsage } from '../../../utils/assert.js';
7
+ import { assert } from '../../../utils/assert.js';
9
8
  import '../assertEnvVite.js';
10
9
  function isViteServerSide_impl(configGlobal, viteEnv) {
11
10
  assert(!('consumer' in configGlobal)); // make sure configGlobal isn't viteEnv.config
@@ -60,11 +59,7 @@ function isViteServerSide_extraSafe(config, viteEnv, options) {
60
59
  optionsSsr: options?.ssr ?? null,
61
60
  };
62
61
  assert(options, debug);
63
- /* TO-DO/eventually: use internal assert() instead of assertUsage() once we can use this.meta.viteVersion — see utils/assertViteVersion.ts
64
- assert(typeof options.ssr === 'boolean', debug)
65
- /*/
66
- assertUsage(typeof options.ssr === 'boolean', `You're using an old Vite version — update Vite to ${viteVersionMin} or above.`);
67
- //*/
62
+ assert(typeof options.ssr === 'boolean', debug);
68
63
  assert(options.ssr === isServerSide, debug);
69
64
  return isServerSide;
70
65
  }
@@ -4,7 +4,7 @@ export type { PlusFileValue };
4
4
  export type { PlusFile };
5
5
  export type { PlusFilesByLocationId };
6
6
  import { type LocationId } from './filesystemRouting.js';
7
- import { type EsbuildCache } from './transpileAndExecuteFile.js';
7
+ import { type VikeTranspileCache } from './transpileAndExecuteFile.js';
8
8
  import { type ConfigFile, PointerImportLoaded } from './loadFileAtConfigTime.js';
9
9
  import type { FilePathResolved } from '../../../../types/FilePath.js';
10
10
  import '../../assertEnvVite.js';
@@ -40,5 +40,5 @@ type PlusFileValue = PlusFileCommon & {
40
40
  isExtensionConfig?: undefined;
41
41
  };
42
42
  type PlusFilesByLocationId = Record<LocationId, PlusFile[]>;
43
- declare function getPlusFiles(userRootDir: string, esbuildCache: EsbuildCache): Promise<PlusFilesByLocationId>;
43
+ declare function getPlusFiles(userRootDir: string, vikeTranspileCache: VikeTranspileCache): Promise<PlusFilesByLocationId>;
44
44
  declare function getPlusFileFromConfigFile(configFile: ConfigFile, isExtensionConfig: boolean, locationId: LocationId, userRootDir: string): PlusFileConfig;
@@ -10,7 +10,7 @@ import { resolvePointerImport } from './resolvePointerImport.js';
10
10
  import { getFilePathResolved } from '../getFilePath.js';
11
11
  import { assertExtensionsConventions, assertExtensionsRequire } from './assertExtensions.js';
12
12
  import '../../assertEnvVite.js';
13
- async function getPlusFiles(userRootDir, esbuildCache) {
13
+ async function getPlusFiles(userRootDir, vikeTranspileCache) {
14
14
  const plusFilePaths = (await crawlPlusFiles(userRootDir)).map(({ filePathAbsoluteUserRootDir }) => getFilePathResolved({ filePathAbsoluteUserRootDir, userRootDir }));
15
15
  const plusFilesByLocationId = {};
16
16
  await Promise.all(plusFilePaths.map(async (filePath) => {
@@ -18,7 +18,7 @@ async function getPlusFiles(userRootDir, esbuildCache) {
18
18
  // +config.js files
19
19
  const { filePathAbsoluteUserRootDir } = filePath;
20
20
  assert(filePathAbsoluteUserRootDir);
21
- const { configFile, extendsConfigs } = await loadConfigFile(filePath, userRootDir, [], false, esbuildCache);
21
+ const { configFile, extendsConfigs } = await loadConfigFile(filePath, userRootDir, [], false, vikeTranspileCache);
22
22
  assert(filePath.filePathAbsoluteUserRootDir);
23
23
  const locationId = getLocationId(filePathAbsoluteUserRootDir);
24
24
  const plusFile = getPlusFileFromConfigFile(configFile, false, locationId, userRootDir);
@@ -65,7 +65,7 @@ async function getPlusFiles(userRootDir, esbuildCache) {
65
65
  // We don't have access to the custom config definitions defined by the user yet.
66
66
  // - If `configDef` is `undefined` => we load the file +{configName}.js later.
67
67
  // - We already need to load +meta.js here (to get the custom config definitions defined by the user)
68
- await loadValueFile(plusFile, metaBuiltIn, userRootDir, esbuildCache);
68
+ await loadValueFile(plusFile, metaBuiltIn, userRootDir, vikeTranspileCache);
69
69
  }
70
70
  }));
71
71
  // Make lists element order deterministic
@@ -4,7 +4,7 @@ export { loadConfigFile };
4
4
  export type { ConfigFile };
5
5
  export type { PointerImportLoaded };
6
6
  import type { FilePathResolved } from '../../../../types/FilePath.js';
7
- import { type EsbuildCache } from './transpileAndExecuteFile.js';
7
+ import { type VikeTranspileCache } from './transpileAndExecuteFile.js';
8
8
  import type { PlusFileValue } from './getPlusFiles.js';
9
9
  import { PointerImport } from './resolvePointerImport.js';
10
10
  import type { ConfigDefinitionsInternal } from './metaBuiltIn.js';
@@ -14,15 +14,15 @@ type ConfigFile = {
14
14
  filePath: FilePathResolved;
15
15
  extendsFilePaths: string[];
16
16
  };
17
- declare function loadPointerImport(pointerImport: PointerImportLoaded, userRootDir: string, configName: string, configDefinitions: ConfigDefinitionsInternal, esbuildCache: EsbuildCache): Promise<unknown>;
17
+ declare function loadPointerImport(pointerImport: PointerImportLoaded, userRootDir: string, configName: string, configDefinitions: ConfigDefinitionsInternal, vikeTranspileCache: VikeTranspileCache): Promise<unknown>;
18
18
  type PointerImportLoaded = PointerImport & ({
19
19
  fileExportValueLoaded: true;
20
20
  fileExportValue: unknown;
21
21
  } | {
22
22
  fileExportValueLoaded: false;
23
23
  });
24
- declare function loadValueFile(interfaceValueFile: PlusFileValue, configDefinitions: ConfigDefinitionsInternal, userRootDir: string, esbuildCache: EsbuildCache): Promise<void>;
25
- declare function loadConfigFile(configFilePath: FilePathResolved, userRootDir: string, visited: string[], isExtensionConfig: boolean, esbuildCache: EsbuildCache): Promise<{
24
+ declare function loadValueFile(interfaceValueFile: PlusFileValue, configDefinitions: ConfigDefinitionsInternal, userRootDir: string, vikeTranspileCache: VikeTranspileCache): Promise<void>;
25
+ declare function loadConfigFile(configFilePath: FilePathResolved, userRootDir: string, visited: string[], isExtensionConfig: boolean, vikeTranspileCache: VikeTranspileCache): Promise<{
26
26
  configFile: ConfigFile;
27
27
  extendsConfigs: ConfigFile[];
28
28
  }>;
@@ -17,7 +17,7 @@ import { getConfigDefinedAt } from '../../../../shared-server-client/page-config
17
17
  import '../../assertEnvVite.js';
18
18
  assertIsNotProductionRuntime();
19
19
  // Load pointer import
20
- async function loadPointerImport(pointerImport, userRootDir, configName, configDefinitions, esbuildCache) {
20
+ async function loadPointerImport(pointerImport, userRootDir, configName, configDefinitions, vikeTranspileCache) {
21
21
  // The value of `extends` was already loaded and already used: we don't need the value of `extends` anymore
22
22
  if (configName === 'extends')
23
23
  return;
@@ -27,14 +27,14 @@ async function loadPointerImport(pointerImport, userRootDir, configName, configD
27
27
  return;
28
28
  const configDefinedAt = getConfigDefinedAt('Config', configName, pointerImport.fileExportPath);
29
29
  assertUsage(pointerImport.fileExportPath.filePathAbsoluteFilesystem, `${configDefinedAt} cannot be defined over an aliased import`);
30
- const { fileExports } = await transpileAndExecuteFile(pointerImport.fileExportPath, userRootDir, false, esbuildCache);
30
+ const { fileExports } = await transpileAndExecuteFile(pointerImport.fileExportPath, userRootDir, false, vikeTranspileCache);
31
31
  const fileExportValue = fileExports[pointerImport.fileExportPath.fileExportName];
32
32
  pointerImport.fileExportValueLoaded = true;
33
33
  assert(pointerImport.fileExportValueLoaded);
34
34
  pointerImport.fileExportValue = fileExportValue;
35
35
  }
36
36
  // Load +{configName}.js
37
- async function loadValueFile(interfaceValueFile, configDefinitions, userRootDir, esbuildCache) {
37
+ async function loadValueFile(interfaceValueFile, configDefinitions, userRootDir, vikeTranspileCache) {
38
38
  const { configName } = interfaceValueFile;
39
39
  const configDef = getConfigDefinitionOptional(configDefinitions, configName);
40
40
  // Only load value files with `env.config===true`
@@ -43,7 +43,7 @@ async function loadValueFile(interfaceValueFile, configDefinitions, userRootDir,
43
43
  interfaceValueFile.isNotLoaded = false;
44
44
  assert(!interfaceValueFile.isNotLoaded);
45
45
  interfaceValueFile.fileExportsByConfigName = {};
46
- const { fileExports } = await transpileAndExecuteFile(interfaceValueFile.filePath, userRootDir, false, esbuildCache);
46
+ const { fileExports } = await transpileAndExecuteFile(interfaceValueFile.filePath, userRootDir, false, vikeTranspileCache);
47
47
  const { filePathToShowToUser } = interfaceValueFile.filePath;
48
48
  assertPlusFileExport(fileExports, filePathToShowToUser, configName);
49
49
  Object.entries(fileExports).forEach(([exportName, configValue]) => {
@@ -52,11 +52,11 @@ async function loadValueFile(interfaceValueFile, configDefinitions, userRootDir,
52
52
  });
53
53
  }
54
54
  // Load +config.js, including all its extends pointer imports
55
- async function loadConfigFile(configFilePath, userRootDir, visited, isExtensionConfig, esbuildCache) {
55
+ async function loadConfigFile(configFilePath, userRootDir, visited, isExtensionConfig, vikeTranspileCache) {
56
56
  const { filePathAbsoluteFilesystem } = configFilePath;
57
57
  assertNoInfiniteLoop(visited, filePathAbsoluteFilesystem);
58
- const { fileExports } = await transpileAndExecuteFile(configFilePath, userRootDir, isExtensionConfig, esbuildCache);
59
- const { extendsConfigs, extendsFilePaths } = await loadExtendsConfigs(fileExports, configFilePath, userRootDir, [...visited, filePathAbsoluteFilesystem], esbuildCache);
58
+ const { fileExports } = await transpileAndExecuteFile(configFilePath, userRootDir, isExtensionConfig, vikeTranspileCache);
59
+ const { extendsConfigs, extendsFilePaths } = await loadExtendsConfigs(fileExports, configFilePath, userRootDir, [...visited, filePathAbsoluteFilesystem], vikeTranspileCache);
60
60
  const configFile = {
61
61
  fileExports,
62
62
  filePath: configFilePath,
@@ -72,7 +72,7 @@ function assertNoInfiniteLoop(visited, filePathAbsoluteFilesystem) {
72
72
  assert(loop[0] === filePathAbsoluteFilesystem);
73
73
  assertUsage(idx === -1, `Infinite extends loop ${[...loop, filePathAbsoluteFilesystem].join('>')}`);
74
74
  }
75
- async function loadExtendsConfigs(configFileExports, configFilePath, userRootDir, visited, esbuildCache) {
75
+ async function loadExtendsConfigs(configFileExports, configFilePath, userRootDir, visited, vikeTranspileCache) {
76
76
  const { extendsPointerImportData, extendsConfigs } = getExtendsPointerImportData(configFileExports, configFilePath);
77
77
  const extendsConfigFiles = [];
78
78
  extendsPointerImportData.map((pointerImportData) => {
@@ -80,7 +80,7 @@ async function loadExtendsConfigs(configFileExports, configFilePath, userRootDir
80
80
  assert(filePath.filePathAbsoluteFilesystem);
81
81
  extendsConfigFiles.push(filePath);
82
82
  });
83
- const results = await Promise.all(extendsConfigFiles.map(async (configFilePath) => await loadConfigFile(configFilePath, userRootDir, visited, true, esbuildCache)));
83
+ const results = await Promise.all(extendsConfigFiles.map(async (configFilePath) => await loadConfigFile(configFilePath, userRootDir, visited, true, vikeTranspileCache)));
84
84
  results.forEach((result) => {
85
85
  extendsConfigs.push(result.configFile);
86
86
  extendsConfigs.push(...result.extendsConfigs);
@@ -57,7 +57,7 @@ type ConfigDefinition = {
57
57
  /** Whether changes to the configuration should trigger a Vite restart. */
58
58
  vite?: boolean;
59
59
  /** @experimental */
60
- _computed?: (pageConfig: PageConfigBuildTimeBeforeComputed) => unknown;
60
+ _computed?: (pageConfig: PageConfigBuildTimeBeforeComputed, isDev: boolean) => unknown;
61
61
  /** @experimental */
62
62
  _valueIsFilePath?: true;
63
63
  /** @experimental */
@@ -53,14 +53,15 @@ const metaBuiltIn = {
53
53
  route: {
54
54
  env: {
55
55
  server: true,
56
- client: 'if-client-routing',
56
+ client: true,
57
+ clientRoutingOnly: true,
57
58
  // For vite-plugin-vercel
58
59
  config: true,
59
60
  },
60
61
  eager: true,
61
62
  },
62
63
  guard: {
63
- env: { server: true, client: 'if-client-routing' },
64
+ env: { server: true, client: true, clientRoutingOnly: true },
64
65
  },
65
66
  data: {
66
67
  env: { server: true },
@@ -70,7 +71,7 @@ const metaBuiltIn = {
70
71
  cumulative: true,
71
72
  },
72
73
  iKnowThePerformanceRisksOfAsyncRouteFunctions: {
73
- env: { server: true, client: 'if-client-routing' },
74
+ env: { server: true, client: true, clientRoutingOnly: true },
74
75
  eager: true,
75
76
  },
76
77
  filesystemRoutingRoot: {
@@ -114,12 +115,13 @@ const metaBuiltIn = {
114
115
  hasServerOnlyHook: {
115
116
  env: { client: true },
116
117
  eager: true,
117
- _computed: (pageConfig) => {
118
+ _computed: (pageConfig, isDev) => {
118
119
  const sources = ['data', 'onBeforeRender', 'onCreatePageContext', 'guard']
119
120
  .map((hookName) => getConfigValueSourcesRelevant(hookName, {
120
- isForClientSide: false,
121
+ environmentName: 'server',
121
122
  // TO-DO/eventually/remove-server-router: let's eventually remove support for Server Routing
122
123
  isClientRouting: true,
124
+ isDev,
123
125
  }, pageConfig))
124
126
  .flat(1)
125
127
  // Server-only
@@ -244,12 +246,16 @@ const metaBuiltIn = {
244
246
  env: { server: true },
245
247
  global: true,
246
248
  },
249
+ precompress: {
250
+ env: { config: true },
251
+ global: true,
252
+ },
247
253
  cli: {
248
254
  env: { config: true },
249
255
  global: true,
250
256
  },
251
257
  onBeforeRoute: {
252
- env: { server: true, client: 'if-client-routing' },
258
+ env: { server: true, client: true, clientRoutingOnly: true },
253
259
  eager: true,
254
260
  global: true,
255
261
  },
@@ -1,9 +1,11 @@
1
1
  export { transformPointerImports };
2
2
  export { parsePointerImportData };
3
3
  export { assertPointerImportPath };
4
+ export { pointerImportAttributeSuffix };
4
5
  export type { PointerImportData };
5
6
  import '../../assertEnvVite.js';
6
- declare function transformPointerImports(code: string, filePathToShowToUser2: string, pointerImports: Record<string, boolean> | 'all', skipWarnings?: true): string | null;
7
+ declare const pointerImportAttributeSuffix = "?vike:pointer";
8
+ declare function transformPointerImports(code: string, pointerImports: Record<string, boolean> | 'all'): string | null;
7
9
  /**
8
10
  * Data Structure for [pointer imports](https://vike.dev/config#pointer-imports):
9
11
  * `import { someExport as someImport } from './some-file'`