vike 0.4.249-commit-775a43e → 0.4.249-commit-f416149

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 (22) hide show
  1. package/bin.js +3 -0
  2. package/dist/client/runtime-client-routing/history.d.ts +1 -1
  3. package/dist/client/runtime-client-routing/history.js +4 -11
  4. package/dist/client/runtime-client-routing/utils.d.ts +0 -1
  5. package/dist/client/runtime-client-routing/utils.js +0 -1
  6. package/dist/node/vite/plugins/pluginVirtualFiles.js +1 -1
  7. package/dist/node/vite/shared/resolveVikeConfigInternal/assertExtensions.d.ts +1 -1
  8. package/dist/node/vite/shared/resolveVikeConfigInternal/{crawlPlusFiles.d.ts → crawlPlusFilePaths.d.ts} +2 -2
  9. package/dist/node/vite/shared/resolveVikeConfigInternal/{crawlPlusFiles.js → crawlPlusFilePaths.js} +4 -4
  10. package/dist/node/vite/shared/resolveVikeConfigInternal/{getPlusFilesAll.d.ts → getPlusFilesByLocationId.d.ts} +7 -5
  11. package/dist/node/vite/shared/resolveVikeConfigInternal/{getPlusFilesAll.js → getPlusFilesByLocationId.js} +39 -53
  12. package/dist/node/vite/shared/resolveVikeConfigInternal/loadFileAtConfigTime.d.ts +1 -1
  13. package/dist/node/vite/shared/resolveVikeConfigInternal.d.ts +1 -1
  14. package/dist/node/vite/shared/resolveVikeConfigInternal.js +41 -41
  15. package/dist/server/runtime/renderPageServer/html/stream.js +12 -13
  16. package/dist/types/PageConfig.d.ts +1 -1
  17. package/dist/utils/PROJECT_VERSION.d.ts +1 -1
  18. package/dist/utils/PROJECT_VERSION.js +1 -1
  19. package/package.json +3 -3
  20. package/node/cli/bin.js +0 -3
  21. /package/dist/node/vite/shared/resolveVikeConfigInternal/{crawlPlusFiles → crawlPlusFilePaths}/ignorePatternsBuiltIn.d.ts +0 -0
  22. /package/dist/node/vite/shared/resolveVikeConfigInternal/{crawlPlusFiles → crawlPlusFilePaths}/ignorePatternsBuiltIn.js +0 -0
package/bin.js ADDED
@@ -0,0 +1,3 @@
1
+ #!/usr/bin/env node
2
+
3
+ import './dist/node/cli/entry.js'
@@ -18,7 +18,7 @@ type ScrollPosition = {
18
18
  };
19
19
  declare function saveScrollPosition(): void;
20
20
  declare function pushHistoryState(url: string, overwriteLastHistoryEntry: boolean): void;
21
- declare function replaceHistoryStateOriginal(state: unknown, url: Parameters<typeof window.history.replaceState>[2]): void;
21
+ declare function replaceHistoryStateOriginal(state: unknown, url?: Parameters<typeof window.history.replaceState>[2]): void;
22
22
  type HistoryInfo = {
23
23
  url: `/${string}`;
24
24
  state: StateEnhanced;
@@ -4,7 +4,7 @@ export { onPopStateBegin };
4
4
  export { saveScrollPosition };
5
5
  export { initHistory };
6
6
  import { getCurrentUrl } from '../shared/getCurrentUrl.js';
7
- import { assert, assertUsage, getGlobalObject, isObject, deepEqual, redirectHard } from './utils.js';
7
+ import { assert, assertUsage, getGlobalObject, isObject, redirectHard } from './utils.js';
8
8
  const globalObject = getGlobalObject('history.ts', {
9
9
  monkeyPatched: false,
10
10
  previous: undefined,
@@ -102,26 +102,19 @@ function monkeyPatchHistoryAPI() {
102
102
  triggeredBy: 'user',
103
103
  },
104
104
  };
105
- assertIsEnhanced(state);
106
105
  funcOriginal(state, ...rest);
107
- // TO-DO/eventually remove excessive assertions to save client-side KBs
108
- assert(isEqual(state, window.history.state));
106
+ assertIsEnhanced(window.history.state);
109
107
  globalObject.previous = getHistoryInfo();
110
108
  // Workaround https://github.com/vikejs/vike/issues/2504#issuecomment-3149764736
111
109
  queueMicrotask(() => {
112
- if (isEqual(state, window.history.state))
110
+ if (isEnhanced(window.history.state))
113
111
  return;
114
112
  Object.assign(state, window.history.state);
115
- assertIsEnhanced(state);
116
- replaceHistoryStateOriginal(state, rest[1]);
117
- assert(isEqual(state, window.history.state));
113
+ replaceHistoryStateOriginal(state);
118
114
  });
119
115
  };
120
116
  });
121
117
  }
122
- function isEqual(state1, state2) {
123
- return deepEqual(state1?.vike, state2?.vike);
124
- }
125
118
  function isEnhanced(state) {
126
119
  if (state?.vike) {
127
120
  /* We don't use the assert() below to save client-side KBs.
@@ -21,5 +21,4 @@ export * from '../../utils/PROJECT_VERSION.js';
21
21
  export * from '../../utils/genPromise.js';
22
22
  export * from '../../utils/catchInfiniteLoop.js';
23
23
  export * from '../../utils/changeEnumerable.js';
24
- export * from '../../utils/deepEqual.js';
25
24
  export * from '../../utils/cast.js';
@@ -25,5 +25,4 @@ export * from '../../utils/PROJECT_VERSION.js';
25
25
  export * from '../../utils/genPromise.js';
26
26
  export * from '../../utils/catchInfiniteLoop.js';
27
27
  export * from '../../utils/changeEnumerable.js';
28
- export * from '../../utils/deepEqual.js';
29
28
  export * from '../../utils/cast.js';
@@ -9,7 +9,7 @@ import pc from '@brillout/picocolors';
9
9
  import { logConfigInfo } from '../shared/loggerDev.js';
10
10
  import { getFilePathToShowToUserModule } from '../shared/getFilePath.js';
11
11
  import { updateUserFiles } from '../../../server/runtime/globalContext.js';
12
- import { isPlusFile } from '../shared/resolveVikeConfigInternal/crawlPlusFiles.js';
12
+ import { isPlusFile } from '../shared/resolveVikeConfigInternal/crawlPlusFilePaths.js';
13
13
  import { isTemporaryBuildFile } from '../shared/resolveVikeConfigInternal/transpileAndExecuteFile.js';
14
14
  import { debugFileChange, getVikeConfigError } from '../../../shared-server-node/getVikeConfigError.js';
15
15
  const filterRolldown = {
@@ -1,5 +1,5 @@
1
1
  export { assertExtensionsConventions };
2
2
  export { assertExtensionsRequire };
3
- import type { PlusFile } from './getPlusFilesAll.js';
3
+ import type { PlusFile } from './getPlusFilesByLocationId.js';
4
4
  declare function assertExtensionsConventions(plusFile: PlusFile): void;
5
5
  declare function assertExtensionsRequire(plusFiles: PlusFile[]): void;
@@ -1,7 +1,7 @@
1
- export { crawlPlusFiles };
1
+ export { crawlPlusFilePaths };
2
2
  export { isPlusFile };
3
3
  export { getPlusFileValueConfigName };
4
- declare function crawlPlusFiles(userRootDir: string): Promise<{
4
+ declare function crawlPlusFilePaths(userRootDir: string): Promise<{
5
5
  filePathAbsoluteUserRootDir: string;
6
6
  }[]>;
7
7
  declare function isPlusFile(filePath: string): boolean;
@@ -1,4 +1,4 @@
1
- export { crawlPlusFiles };
1
+ export { crawlPlusFilePaths };
2
2
  export { isPlusFile };
3
3
  export { getPlusFileValueConfigName };
4
4
  import { assertPosixPath, assert, scriptFileExtensionPattern, assertIsNotProductionRuntime, isVersionMatch, isScriptFile, scriptFileExtensionList, createDebug, deepEqual, assertUsage, assertFilePathAbsoluteFilesystem, assertWarning, hasProp, isNotNullish, getGlobalObject, } from '../../utils.js';
@@ -10,14 +10,14 @@ import { isTemporaryBuildFile } from './transpileAndExecuteFile.js';
10
10
  import { getEnvVarObject } from '../getEnvVarObject.js';
11
11
  import pc from '@brillout/picocolors';
12
12
  import picomatch from 'picomatch';
13
- import { ignorePatternsBuiltIn } from './crawlPlusFiles/ignorePatternsBuiltIn.js';
13
+ import { ignorePatternsBuiltIn } from './crawlPlusFilePaths/ignorePatternsBuiltIn.js';
14
14
  const execA = promisify(exec);
15
15
  const debug = createDebug('vike:crawl');
16
16
  assertIsNotProductionRuntime();
17
- const globalObject = getGlobalObject('getVikeConfig/crawlPlusFiles.ts', {
17
+ const globalObject = getGlobalObject('getVikeConfig/crawlPlusFilePaths.ts', {
18
18
  gitIsNotUsable: false,
19
19
  });
20
- async function crawlPlusFiles(userRootDir) {
20
+ async function crawlPlusFilePaths(userRootDir) {
21
21
  assertPosixPath(userRootDir);
22
22
  assertFilePathAbsoluteFilesystem(userRootDir);
23
23
  const userSettings = getUserSettings();
@@ -1,4 +1,4 @@
1
- export { getPlusFilesAll };
1
+ export { getPlusFilesByLocationId };
2
2
  export type { PlusFileValue };
3
3
  export type { PlusFile };
4
4
  export type { PlusFilesByLocationId };
@@ -7,11 +7,12 @@ import { type EsbuildCache } from './transpileAndExecuteFile.js';
7
7
  import { PointerImportLoaded } from './loadFileAtConfigTime.js';
8
8
  import type { FilePathResolved } from '../../../../types/FilePath.js';
9
9
  type PlusFile = PlusFileConfig | PlusFileValue;
10
- type PlusFileCommons = {
10
+ type PlusFileCommon = {
11
11
  locationId: LocationId;
12
12
  filePath: FilePathResolved;
13
13
  };
14
- type PlusFileConfig = PlusFileCommons & {
14
+ /** +config.js */
15
+ type PlusFileConfig = PlusFileCommon & {
15
16
  isConfigFile: true;
16
17
  fileExportsByConfigName: Record<string, // configName
17
18
  unknown>;
@@ -21,7 +22,8 @@ type PlusFileConfig = PlusFileCommons & {
21
22
  extendsFilePaths: string[];
22
23
  isNotLoaded?: undefined;
23
24
  };
24
- type PlusFileValue = PlusFileCommons & {
25
+ /** +{configName}.js */
26
+ type PlusFileValue = PlusFileCommon & {
25
27
  isConfigFile: false;
26
28
  configName: string;
27
29
  } & ({
@@ -34,4 +36,4 @@ type PlusFileValue = PlusFileCommons & {
34
36
  isExtensionConfig?: undefined;
35
37
  };
36
38
  type PlusFilesByLocationId = Record<LocationId, PlusFile[]>;
37
- declare function getPlusFilesAll(userRootDir: string, esbuildCache: EsbuildCache): Promise<PlusFilesByLocationId>;
39
+ declare function getPlusFilesByLocationId(userRootDir: string, esbuildCache: EsbuildCache): Promise<PlusFilesByLocationId>;
@@ -1,61 +1,51 @@
1
- export { getPlusFilesAll };
1
+ export { getPlusFilesByLocationId };
2
2
  import { assert } from '../../utils.js';
3
3
  import { configDefinitionsBuiltIn } from './configDefinitionsBuiltIn.js';
4
4
  import { getLocationId } from './filesystemRouting.js';
5
- import { crawlPlusFiles, getPlusFileValueConfigName } from './crawlPlusFiles.js';
5
+ import { crawlPlusFilePaths, getPlusFileValueConfigName } from './crawlPlusFilePaths.js';
6
6
  import { getConfigFileExport } from './getConfigFileExport.js';
7
7
  import { loadConfigFile, loadValueFile } from './loadFileAtConfigTime.js';
8
8
  import { resolvePointerImport } from './resolvePointerImport.js';
9
9
  import { getFilePathResolved } from '../getFilePath.js';
10
10
  import { assertExtensionsConventions, assertExtensionsRequire } from './assertExtensions.js';
11
- async function getPlusFilesAll(userRootDir, esbuildCache) {
12
- const plusFiles = await findPlusFiles(userRootDir);
13
- const configFiles = [];
14
- const valueFiles = [];
15
- plusFiles.forEach((f) => {
16
- if (getPlusFileValueConfigName(f.filePathAbsoluteFilesystem) === 'config') {
17
- configFiles.push(f);
18
- }
19
- else {
20
- valueFiles.push(f);
21
- }
22
- });
23
- let plusFilesAll = {};
24
- await Promise.all([
25
- // Config files
26
- ...configFiles.map(async (filePath) => {
11
+ async function getPlusFilesByLocationId(userRootDir, esbuildCache) {
12
+ const plusFilePaths = (await crawlPlusFilePaths(userRootDir)).map(({ filePathAbsoluteUserRootDir }) => getFilePathResolved({ filePathAbsoluteUserRootDir, userRootDir }));
13
+ const plusFilesByLocationId = {};
14
+ await Promise.all(plusFilePaths.map(async (filePath) => {
15
+ if (getPlusFileValueConfigName(filePath.filePathAbsoluteFilesystem) === 'config') {
16
+ // +config.js files
27
17
  const { filePathAbsoluteUserRootDir } = filePath;
28
18
  assert(filePathAbsoluteUserRootDir);
29
19
  const { configFile, extendsConfigs } = await loadConfigFile(filePath, userRootDir, [], false, esbuildCache);
30
20
  assert(filePath.filePathAbsoluteUserRootDir);
31
21
  const locationId = getLocationId(filePathAbsoluteUserRootDir);
32
22
  const plusFile = getPlusFileFromConfigFile(configFile, false, locationId, userRootDir);
33
- plusFilesAll[locationId] = plusFilesAll[locationId] ?? [];
34
- plusFilesAll[locationId].push(plusFile);
23
+ plusFilesByLocationId[locationId] = plusFilesByLocationId[locationId] ?? [];
24
+ plusFilesByLocationId[locationId].push(plusFile);
35
25
  extendsConfigs.forEach((extendsConfig) => {
36
26
  /* We purposely use the same locationId because the Vike extension's config should only apply to where it's being extended from, for example:
37
- ```js
38
- // /pages/admin/+config.js
39
-
40
- import vikeVue from 'vike-vue/config'
41
- // Should only apply to /pages/admin/**
42
- export default { extends: [vikeVue] }
43
- ```
44
- ```js
45
- // /pages/marketing/+config.js
46
-
47
- import vikeReact from 'vike-react/config'
48
- // Should only apply to /pages/marketing/**
49
- export default { extends: [vikeReact] }
50
- ```
51
- */
27
+ ```js
28
+ // /pages/admin/+config.js
29
+
30
+ import vikeVue from 'vike-vue/config'
31
+ // Should only apply to /pages/admin/**
32
+ export default { extends: [vikeVue] }
33
+ ```
34
+ ```js
35
+ // /pages/marketing/+config.js
36
+
37
+ import vikeReact from 'vike-react/config'
38
+ // Should only apply to /pages/marketing/**
39
+ export default { extends: [vikeReact] }
40
+ ```
41
+ */
52
42
  const plusFile = getPlusFileFromConfigFile(extendsConfig, true, locationId, userRootDir);
53
43
  assertExtensionsConventions(plusFile);
54
- plusFilesAll[locationId].push(plusFile);
44
+ plusFilesByLocationId[locationId].push(plusFile);
55
45
  });
56
- }),
57
- // Value files
58
- ...valueFiles.map(async (filePath) => {
46
+ }
47
+ else {
48
+ // +{configName}.js files
59
49
  const { filePathAbsoluteUserRootDir } = filePath;
60
50
  assert(filePathAbsoluteUserRootDir);
61
51
  const configName = getPlusFileValueConfigName(filePathAbsoluteUserRootDir);
@@ -68,23 +58,23 @@ async function getPlusFilesAll(userRootDir, esbuildCache) {
68
58
  isNotLoaded: true,
69
59
  configName,
70
60
  };
71
- plusFilesAll[locationId] = plusFilesAll[locationId] ?? [];
72
- plusFilesAll[locationId].push(plusFile);
61
+ plusFilesByLocationId[locationId] = plusFilesByLocationId[locationId] ?? [];
62
+ plusFilesByLocationId[locationId].push(plusFile);
73
63
  // We don't have access to the custom config definitions defined by the user yet.
74
64
  // - If `configDef` is `undefined` => we load the file +{configName}.js later.
75
65
  // - We already need to load +meta.js here (to get the custom config definitions defined by the user)
76
66
  await loadValueFile(plusFile, configDefinitionsBuiltIn, userRootDir, esbuildCache);
77
- }),
78
- ]);
67
+ }
68
+ }));
79
69
  // Make lists element order deterministic
80
- Object.entries(plusFilesAll).forEach(([_locationId, plusFiles]) => {
70
+ Object.entries(plusFilesByLocationId).forEach(([_locationId, plusFiles]) => {
81
71
  plusFiles.sort(sortMakeDeterministic);
82
72
  });
83
- assertPlusFiles(plusFilesAll);
84
- return plusFilesAll;
73
+ assertPlusFiles(plusFilesByLocationId);
74
+ return plusFilesByLocationId;
85
75
  }
86
- function assertPlusFiles(plusFilesAll) {
87
- const plusFiles = Object.values(plusFilesAll).flat();
76
+ function assertPlusFiles(plusFilesByLocationId) {
77
+ const plusFiles = Object.values(plusFilesByLocationId).flat();
88
78
  // The earlier we call it the better, so that +require can be used by Vike extensions to depend on new Vike features
89
79
  assertExtensionsRequire(plusFiles);
90
80
  }
@@ -118,10 +108,6 @@ function getPlusFileFromConfigFile(configFile, isExtensionConfig, locationId, us
118
108
  }
119
109
  // Make order deterministic (no other purpose)
120
110
  function sortMakeDeterministic(plusFile1, plusFile2) {
111
+ // Sort by file path
121
112
  return plusFile1.filePath.filePathAbsoluteVite < plusFile2.filePath.filePathAbsoluteVite ? -1 : 1;
122
113
  }
123
- async function findPlusFiles(userRootDir) {
124
- const files = await crawlPlusFiles(userRootDir);
125
- const plusFiles = files.map(({ filePathAbsoluteUserRootDir }) => getFilePathResolved({ filePathAbsoluteUserRootDir, userRootDir }));
126
- return plusFiles;
127
- }
@@ -5,7 +5,7 @@ export type { ConfigFile };
5
5
  export type { PointerImportLoaded };
6
6
  import type { FilePathResolved } from '../../../../types/FilePath.js';
7
7
  import { type EsbuildCache } from './transpileAndExecuteFile.js';
8
- import type { PlusFileValue } from './getPlusFilesAll.js';
8
+ import type { PlusFileValue } from './getPlusFilesByLocationId.js';
9
9
  import { PointerImport } from './resolvePointerImport.js';
10
10
  import type { ConfigDefinitionsInternal } from './configDefinitionsBuiltIn.js';
11
11
  type ConfigFile = {
@@ -14,7 +14,7 @@ export type { PageConfigBuildTimeBeforeComputed };
14
14
  import type { PageConfigGlobalBuildTime, PageConfigBuildTime } from '../../../types/PageConfig.js';
15
15
  import { type ConfigDefinitionsInternal, type ConfigDefinitionInternal } from './resolveVikeConfigInternal/configDefinitionsBuiltIn.js';
16
16
  import { type GlobalConfigPublic } from '../../../shared-server-client/page-configs/resolveVikeConfigPublic.js';
17
- import { type PlusFile } from './resolveVikeConfigInternal/getPlusFilesAll.js';
17
+ import { type PlusFile } from './resolveVikeConfigInternal/getPlusFilesByLocationId.js';
18
18
  import type { PrerenderContextPublic } from '../../prerender/runPrerender.js';
19
19
  import type { ResolvedConfig, UserConfig } from 'vite';
20
20
  import { type DangerouslyUseInternals } from '../../../shared-server-client/getProxyForPublicUsage.js';
@@ -25,7 +25,7 @@ import { getFilePathResolved } from './getFilePath.js';
25
25
  import { getConfigValueBuildTime } from '../../../shared-server-client/page-configs/getConfigValueBuildTime.js';
26
26
  import { resolveGlobalConfigPublic, } from '../../../shared-server-client/page-configs/resolveVikeConfigPublic.js';
27
27
  import { getConfigValuesBase, isJsonValue, } from '../../../shared-server-client/page-configs/serialize/serializeConfigValues.js';
28
- import { getPlusFilesAll, } from './resolveVikeConfigInternal/getPlusFilesAll.js';
28
+ import { getPlusFilesByLocationId, } from './resolveVikeConfigInternal/getPlusFilesByLocationId.js';
29
29
  import { getEnvVarObject } from './getEnvVarObject.js';
30
30
  import { getVikeApiOperation } from '../../../shared-server-node/api-context.js';
31
31
  import { getCliOptions } from '../../cli/context.js';
@@ -169,9 +169,9 @@ async function resolveVikeConfigInternal_withErrorHandling(userRootDir, isDev, v
169
169
  }
170
170
  }
171
171
  async function resolveVikeConfigInternal(userRootDir, vikeVitePluginOptions, esbuildCache) {
172
- const plusFilesAll = await getPlusFilesAll(userRootDir, esbuildCache);
173
- const configDefinitionsResolved = await resolveConfigDefinitions(plusFilesAll, userRootDir, esbuildCache);
174
- const { pageConfigGlobal, pageConfigs } = getPageConfigsBuildTime(configDefinitionsResolved, plusFilesAll, userRootDir);
172
+ const plusFilesByLocationId = await getPlusFilesByLocationId(userRootDir, esbuildCache);
173
+ const configDefinitionsResolved = await resolveConfigDefinitions(plusFilesByLocationId, userRootDir, esbuildCache);
174
+ const { pageConfigGlobal, pageConfigs } = getPageConfigsBuildTime(configDefinitionsResolved, plusFilesByLocationId, userRootDir);
175
175
  if (!globalObject.isV1Design_)
176
176
  globalObject.isV1Design_ = pageConfigs.length > 0;
177
177
  // Backwards compatibility for vike(options) in vite.config.js
@@ -197,21 +197,21 @@ function resolveGlobalConfig(pageConfigGlobal, pageConfigs) {
197
197
  const globalConfigPublic = resolveGlobalConfigPublic(pageConfigs, pageConfigGlobal, getConfigValues);
198
198
  return globalConfigPublic;
199
199
  }
200
- async function resolveConfigDefinitions(plusFilesAll, userRootDir, esbuildCache) {
201
- const plusFilesAllOrdered = Object.values(plusFilesAll)
200
+ async function resolveConfigDefinitions(plusFilesByLocationId, userRootDir, esbuildCache) {
201
+ const plusFilesByLocationIdOrdered = Object.values(plusFilesByLocationId)
202
202
  .flat()
203
- .sort((plusFile1, plusFile2) => sortAfterInheritanceOrderGlobal(plusFile1, plusFile2, plusFilesAll, null));
203
+ .sort((plusFile1, plusFile2) => sortAfterInheritanceOrderGlobal(plusFile1, plusFile2, plusFilesByLocationId, null));
204
204
  const configDefinitionsGlobal = getConfigDefinitions(
205
- // We use `plusFilesAll` in order to allow local Vike extensions to create global configs, and to set the value of global configs such as `+vite` (enabling Vike extensions to add Vite plugins).
206
- plusFilesAllOrdered, (configDef) => !!configDef.global);
207
- await loadCustomConfigBuildTimeFiles(plusFilesAll, configDefinitionsGlobal, userRootDir, esbuildCache);
208
- const configDefinitionsAll = getConfigDefinitions(Object.values(plusFilesAll).flat());
205
+ // We use `plusFilesByLocationId` in order to allow local Vike extensions to create global configs, and to set the value of global configs such as `+vite` (enabling Vike extensions to add Vite plugins).
206
+ plusFilesByLocationIdOrdered, (configDef) => !!configDef.global);
207
+ await loadCustomConfigBuildTimeFiles(plusFilesByLocationId, configDefinitionsGlobal, userRootDir, esbuildCache);
208
+ const configDefinitionsAll = getConfigDefinitions(Object.values(plusFilesByLocationId).flat());
209
209
  const configNamesKnownAll = Object.keys(configDefinitionsAll);
210
210
  const configNamesKnownGlobal = Object.keys(configDefinitionsGlobal);
211
211
  assert(configNamesKnownGlobal.every((configName) => configNamesKnownAll.includes(configName)));
212
212
  const configDefinitionsLocal = {};
213
- await Promise.all(objectEntries(plusFilesAll).map(async ([locationIdPage, plusFiles]) => {
214
- const plusFilesRelevant = objectEntries(plusFilesAll)
213
+ await Promise.all(objectEntries(plusFilesByLocationId).map(async ([locationIdPage, plusFiles]) => {
214
+ const plusFilesRelevant = objectEntries(plusFilesByLocationId)
215
215
  .filter(([locationId]) => isInherited(locationId, locationIdPage))
216
216
  .map(([, plusFiles]) => plusFiles)
217
217
  .flat()
@@ -238,7 +238,7 @@ async function resolveConfigDefinitions(plusFilesAll, userRootDir, esbuildCache)
238
238
  return configDefinitionsResolved;
239
239
  }
240
240
  // Load value files (with `env.config===true`) of *custom* configs.
241
- // - The value files of *built-in* configs are already loaded at `getPlusFilesAll()`.
241
+ // - The value files of *built-in* configs are already loaded at `getPlusFilesByLocationId()`.
242
242
  async function loadCustomConfigBuildTimeFiles(plusFiles, configDefinitions, userRootDir, esbuildCache) {
243
243
  const plusFileList = Object.values(plusFiles).flat(1);
244
244
  await Promise.all(plusFileList.map(async (plusFile) => {
@@ -252,22 +252,22 @@ async function loadCustomConfigBuildTimeFiles(plusFiles, configDefinitions, user
252
252
  }
253
253
  }));
254
254
  }
255
- function getPageConfigsBuildTime(configDefinitionsResolved, plusFilesAll, userRootDir) {
255
+ function getPageConfigsBuildTime(configDefinitionsResolved, plusFilesByLocationId, userRootDir) {
256
256
  const pageConfigGlobal = {
257
257
  configDefinitions: configDefinitionsResolved.configDefinitionsGlobal,
258
258
  configValueSources: {},
259
259
  };
260
260
  objectEntries(configDefinitionsResolved.configDefinitionsGlobal).forEach(([configName, configDef]) => {
261
261
  const sources = resolveConfigValueSources(configName, configDef,
262
- // We use `plusFilesAll` in order to allow local Vike extensions to create global configs, and to set the value of global configs such as `+vite` (enabling Vike extensions to add Vite plugins).
263
- Object.values(plusFilesAll).flat(), userRootDir, true, plusFilesAll);
262
+ // We use `plusFilesByLocationId` in order to allow local Vike extensions to create global configs, and to set the value of global configs such as `+vite` (enabling Vike extensions to add Vite plugins).
263
+ Object.values(plusFilesByLocationId).flat(), userRootDir, true, plusFilesByLocationId);
264
264
  if (sources.length === 0)
265
265
  return;
266
266
  pageConfigGlobal.configValueSources[configName] = sources;
267
267
  });
268
- applyEffects(pageConfigGlobal.configValueSources, configDefinitionsResolved.configDefinitionsGlobal, plusFilesAll);
268
+ applyEffects(pageConfigGlobal.configValueSources, configDefinitionsResolved.configDefinitionsGlobal, plusFilesByLocationId);
269
269
  sortConfigValueSources(pageConfigGlobal.configValueSources, null);
270
- assertPageConfigGlobal(pageConfigGlobal, plusFilesAll);
270
+ assertPageConfigGlobal(pageConfigGlobal, plusFilesByLocationId);
271
271
  const pageConfigs = objectEntries(configDefinitionsResolved.configDefinitionsLocal)
272
272
  .filter(([_locationId, { plusFiles }]) => isDefiningPage(plusFiles))
273
273
  .map(([locationId, { configDefinitions, plusFilesRelevant }]) => {
@@ -276,13 +276,13 @@ function getPageConfigsBuildTime(configDefinitionsResolved, plusFilesAll, userRo
276
276
  objectEntries(configDefinitionsLocal)
277
277
  .filter(([_configName, configDef]) => configDef.global !== true)
278
278
  .forEach(([configName, configDef]) => {
279
- const sources = resolveConfigValueSources(configName, configDef, plusFilesRelevant, userRootDir, false, plusFilesAll);
279
+ const sources = resolveConfigValueSources(configName, configDef, plusFilesRelevant, userRootDir, false, plusFilesByLocationId);
280
280
  if (sources.length === 0)
281
281
  return;
282
282
  configValueSources[configName] = sources;
283
283
  });
284
284
  const pageConfigRoute = determineRouteFilesystem(locationId, configValueSources);
285
- applyEffects(configValueSources, configDefinitionsLocal, plusFilesAll);
285
+ applyEffects(configValueSources, configDefinitionsLocal, plusFilesByLocationId);
286
286
  sortConfigValueSources(configValueSources, locationId);
287
287
  const pageConfig = {
288
288
  pageId: locationId,
@@ -299,15 +299,15 @@ function getPageConfigsBuildTime(configDefinitionsResolved, plusFilesAll, userRo
299
299
  assertPageConfigs(pageConfigs);
300
300
  return { pageConfigs, pageConfigGlobal };
301
301
  }
302
- function assertPageConfigGlobal(pageConfigGlobal, plusFilesAll) {
302
+ function assertPageConfigGlobal(pageConfigGlobal, plusFilesByLocationId) {
303
303
  Object.entries(pageConfigGlobal.configValueSources).forEach(([configName, sources]) => {
304
- assertGlobalConfigLocation(configName, sources, plusFilesAll, pageConfigGlobal.configDefinitions);
304
+ assertGlobalConfigLocation(configName, sources, plusFilesByLocationId, pageConfigGlobal.configDefinitions);
305
305
  });
306
306
  }
307
- function assertGlobalConfigLocation(configName, sources, plusFilesAll, configDefinitionsGlobal) {
307
+ function assertGlobalConfigLocation(configName, sources, plusFilesByLocationId, configDefinitionsGlobal) {
308
308
  // Determine existing global +config.js files
309
309
  const configFilePathsGlobal = [];
310
- const plusFilesGlobal = Object.values(objectFromEntries(objectEntries(plusFilesAll).filter(([locationId]) => isGlobalLocation(locationId, plusFilesAll)))).flat();
310
+ const plusFilesGlobal = Object.values(objectFromEntries(objectEntries(plusFilesByLocationId).filter(([locationId]) => isGlobalLocation(locationId, plusFilesByLocationId)))).flat();
311
311
  plusFilesGlobal
312
312
  .filter((i) => i.isConfigFile)
313
313
  .forEach((plusFile) => {
@@ -326,7 +326,7 @@ function assertGlobalConfigLocation(configName, sources, plusFilesAll, configDef
326
326
  if (!filePathAbsoluteUserRootDir)
327
327
  return;
328
328
  assert(!plusFile.isExtensionConfig);
329
- if (!isGlobalLocation(source.locationId, plusFilesAll)) {
329
+ if (!isGlobalLocation(source.locationId, plusFilesByLocationId)) {
330
330
  const configDef = configDefinitionsGlobal[configName];
331
331
  assert(configDef);
332
332
  const isConditionallyGlobal = isCallable(configDef.global);
@@ -502,9 +502,9 @@ function sortAfterInheritanceOrderPage(plusFile1, plusFile2, locationIdPage, con
502
502
  }
503
503
  return 0;
504
504
  }
505
- function sortAfterInheritanceOrderGlobal(plusFile1, plusFile2, plusFilesAll, configName) {
506
- if (plusFilesAll) {
507
- const ret = makeFirst((plusFile) => isGlobalLocation(plusFile.locationId, plusFilesAll))(plusFile1, plusFile2);
505
+ function sortAfterInheritanceOrderGlobal(plusFile1, plusFile2, plusFilesByLocationId, configName) {
506
+ if (plusFilesByLocationId) {
507
+ const ret = makeFirst((plusFile) => isGlobalLocation(plusFile.locationId, plusFilesByLocationId))(plusFile1, plusFile2);
508
508
  if (ret !== 0)
509
509
  return ret;
510
510
  }
@@ -552,10 +552,10 @@ function sortPlusFilesSameLocationId(plusFile1, plusFile2, configName) {
552
552
  return ret;
553
553
  }
554
554
  // Config set by +{configName}.js (highest precedence)
555
- // No need to make it deterministic: the overall order is already deterministic, see sortMakeDeterministic() at getPlusFilesAll()
555
+ // No need to make it deterministic: the overall order is already deterministic, see sortMakeDeterministic() at getPlusFilesByLocationId()
556
556
  return 0;
557
557
  }
558
- function resolveConfigValueSources(configName, configDef, plusFilesRelevant, userRootDir, isGlobal, plusFilesAll) {
558
+ function resolveConfigValueSources(configName, configDef, plusFilesRelevant, userRootDir, isGlobal, plusFilesByLocationId) {
559
559
  let sources = plusFilesRelevant
560
560
  .filter((plusFile) => isDefiningConfig(plusFile, configName))
561
561
  .flatMap((plusFile) => getConfigValueSources(configName, plusFile, configDef, userRootDir));
@@ -570,7 +570,7 @@ function resolveConfigValueSources(configName, configDef, plusFilesRelevant, use
570
570
  sources = sources.filter((source) => {
571
571
  assert(source.configEnv.config);
572
572
  assert(source.valueIsLoaded);
573
- const valueIsGlobal = resolveIsGlobalValue(configDef.global, source, plusFilesAll);
573
+ const valueIsGlobal = resolveIsGlobalValue(configDef.global, source, plusFilesByLocationId);
574
574
  return isGlobal ? valueIsGlobal : !valueIsGlobal;
575
575
  });
576
576
  }
@@ -696,12 +696,12 @@ function isDefiningPage(plusFiles) {
696
696
  function isDefiningPageConfig(configName) {
697
697
  return ['Page', 'route'].includes(configName);
698
698
  }
699
- function resolveIsGlobalValue(configDefGlobal, source, plusFilesAll) {
699
+ function resolveIsGlobalValue(configDefGlobal, source, plusFilesByLocationId) {
700
700
  assert(source.valueIsLoaded);
701
701
  let isGlobal;
702
702
  if (isCallable(configDefGlobal))
703
703
  isGlobal = configDefGlobal(source.value, {
704
- isGlobalLocation: isGlobalLocation(source.locationId, plusFilesAll),
704
+ isGlobalLocation: isGlobalLocation(source.locationId, plusFilesByLocationId),
705
705
  });
706
706
  else
707
707
  isGlobal = configDefGlobal ?? false;
@@ -804,7 +804,7 @@ function assertMetaUsage(metaVal, metaConfigDefinedAt) {
804
804
  });
805
805
  }
806
806
  // Test: https://github.com/vikejs/vike/blob/871a111a77d637bbd156b07be5ae728c3d595501/test/playground/pages/config-meta/effect/e2e-test.ts
807
- function applyEffects(configValueSources, configDefinitions, plusFilesAll) {
807
+ function applyEffects(configValueSources, configDefinitions, plusFilesByLocationId) {
808
808
  objectEntries(configDefinitions).forEach(([configNameEffect, configDefEffect]) => {
809
809
  const sourceEffect = configValueSources[configNameEffect]?.[0];
810
810
  if (!sourceEffect)
@@ -814,7 +814,7 @@ function applyEffects(configValueSources, configDefinitions, plusFilesAll) {
814
814
  return;
815
815
  const configModFromEffect = effect;
816
816
  // Apply config value changes first to create sources, then meta.env changes to modify their env
817
- applyEffectConfVal(configModFromEffect, sourceEffect, configValueSources, configNameEffect, configDefEffect, configDefinitions, plusFilesAll);
817
+ applyEffectConfVal(configModFromEffect, sourceEffect, configValueSources, configNameEffect, configDefEffect, configDefinitions, plusFilesByLocationId);
818
818
  applyEffectMetaEnv(configModFromEffect, configValueSources, configDefEffect);
819
819
  });
820
820
  }
@@ -835,7 +835,7 @@ function runEffect(configName, configDef, source) {
835
835
  return null;
836
836
  return configModFromEffect;
837
837
  }
838
- function applyEffectConfVal(configModFromEffect, sourceEffect, configValueSources, configNameEffect, configDefEffect, configDefinitions, plusFilesAll) {
838
+ function applyEffectConfVal(configModFromEffect, sourceEffect, configValueSources, configNameEffect, configDefEffect, configDefinitions, plusFilesByLocationId) {
839
839
  objectEntries(configModFromEffect).forEach(([configNameTarget, configValue]) => {
840
840
  if (configNameTarget === 'meta')
841
841
  return;
@@ -853,8 +853,8 @@ function applyEffectConfVal(configModFromEffect, sourceEffect, configValueSource
853
853
  value: configValue,
854
854
  };
855
855
  assert(sourceEffect.valueIsLoaded);
856
- const isValueGlobalSource = resolveIsGlobalValue(configDefEffect.global, sourceEffect, plusFilesAll);
857
- const isValueGlobalTarget = resolveIsGlobalValue(configDef.global, configValueSource, plusFilesAll);
856
+ const isValueGlobalSource = resolveIsGlobalValue(configDefEffect.global, sourceEffect, plusFilesByLocationId);
857
+ const isValueGlobalTarget = resolveIsGlobalValue(configDef.global, configValueSource, plusFilesByLocationId);
858
858
  const isGlobalHumanReadable = (isGlobal) => `${isGlobal ? 'non-' : ''}global`;
859
859
  // The error message make it sound like it's an inherent limitation, it actually isn't (both ways can make senses).
860
860
  assertUsage(isValueGlobalSource === isValueGlobalTarget, `The configuration ${pc.cyan(configNameEffect)} is set to ${pc.cyan(JSON.stringify(sourceEffect.value))} which is considered ${isGlobalHumanReadable(isValueGlobalSource)}. However, it has a meta.effect that sets the configuration ${pc.cyan(configNameTarget)} to ${pc.cyan(JSON.stringify(configValue))} which is considered ${isGlobalHumanReadable(isValueGlobalTarget)}. This is contradictory: make sure the values are either both non-global or both global.`);
@@ -1086,8 +1086,8 @@ function resolveConfigEnv(configEnv, filePath) {
1086
1086
  return configEnvResolved;
1087
1087
  }
1088
1088
  /** Whether configs defined in `locationId` apply to every page */
1089
- function isGlobalLocation(locationId, plusFilesAll) {
1090
- const locationIdsPage = objectEntries(plusFilesAll)
1089
+ function isGlobalLocation(locationId, plusFilesByLocationId) {
1090
+ const locationIdsPage = objectEntries(plusFilesByLocationId)
1091
1091
  .filter(([_locationId, plusFiles]) => isDefiningPage(plusFiles))
1092
1092
  .map(([locationId]) => locationId);
1093
1093
  return locationIdsPage.every((locId) => isInherited(locationId, locId));
@@ -242,7 +242,7 @@ async function processStream(streamOriginal, { injectStringAtBegin, injectString
242
242
  writeStream(injectedChunk); // Adds injectedChunk to buffer
243
243
  flushStream(); // Sets shouldFlushStream to true
244
244
  }
245
- // We call onStreamEvent() also when the stream ends in order to properly handle the situation when the stream didn't emit any data
245
+ // We call onStreamDataOrEnd() also when the stream ends in order to properly handle the situation when the stream didn't emit any data
246
246
  const onStreamDataOrEnd = (cb) => {
247
247
  assert(streamOriginalEnded === false);
248
248
  streamOriginalHasStartedEmitting = true;
@@ -277,26 +277,23 @@ async function processStream(streamOriginal, { injectStringAtBegin, injectString
277
277
  }
278
278
  });
279
279
  },
280
- async onEnd(
281
- /* Should we use this `isCancel`? Maybe we can skip `injectStringAtEnd()`?
282
- isCancel,
283
- //*/
284
- ) {
280
+ async onEnd(isCancel) {
285
281
  try {
286
282
  assert(!onEndWasCalled);
287
283
  onEndWasCalled = true;
288
284
  debug('stream end');
289
- // We call onStreamEvent() also here in case the stream didn't emit any data
285
+ // We call onStreamDataOrEnd() also here in case the stream didn't emit any data
290
286
  onStreamDataOrEnd(() => {
291
287
  streamOriginalEnded = true;
292
288
  });
293
- if (injectStringAtEnd) {
289
+ if (injectStringAtEnd && !isCancel) {
294
290
  const injectedChunk = await injectStringAtEnd();
295
291
  writeStream(injectedChunk);
296
292
  }
297
293
  await promiseReadyToWrite; // E.g. if the user calls the pipe wrapper after the original writable has ended
298
294
  assert(isReady());
299
- flushBuffer();
295
+ if (!isCancel)
296
+ flushBuffer();
300
297
  streamClosed = true;
301
298
  debug('stream ended');
302
299
  }
@@ -526,7 +523,8 @@ async function createStreamWrapper({ streamOriginal, onError, onData, onEnd, onF
526
523
  return;
527
524
  await onEnd(isCancel);
528
525
  isClosed = true;
529
- controllerProxy.close();
526
+ if (!isCancel)
527
+ controllerProxy.close();
530
528
  };
531
529
  let controllerProxy;
532
530
  assertReadableStreamConstructor();
@@ -546,6 +544,7 @@ async function createStreamWrapper({ streamOriginal, onError, onData, onEnd, onF
546
544
  });
547
545
  },
548
546
  async cancel(...args) {
547
+ debug('stream cancelled');
549
548
  isCancel = true;
550
549
  await readableOriginal.cancel(...args);
551
550
  // If readableOriginal has implemented readableOriginal.cancel() then the onEnd() callback and therefore closeStream() may already have been called at this point
@@ -553,9 +552,9 @@ async function createStreamWrapper({ streamOriginal, onError, onData, onEnd, onF
553
552
  },
554
553
  });
555
554
  const writeChunk = (chunk) => {
556
- if (
557
- // If readableOriginal doesn't implement readableOriginal.cancel() then it may still emit data after we close the stream. We therefore need to check whether the steam is closed.
558
- !isClosed) {
555
+ if (!isCancel &&
556
+ // If readableOriginal doesn't implement readableOriginal.cancel() then it may still emit data after we close the stream. We therefore need to check whether the steam is closed.
557
+ !isClosed) {
559
558
  controllerProxy.enqueue(encodeForWebStream(chunk));
560
559
  debugWithChunk('data written (Web Readable)', chunk);
561
560
  }
@@ -25,7 +25,7 @@ import type { ConfigValueSerialized } from '../shared-server-client/page-configs
25
25
  import type { LocationId } from '../node/vite/shared/resolveVikeConfigInternal/filesystemRouting.js';
26
26
  import type { FilePath } from './FilePath.js';
27
27
  import type { ConfigDefinitionsInternal } from '../node/vite/shared/resolveVikeConfigInternal/configDefinitionsBuiltIn.js';
28
- import type { PlusFile } from '../node/vite/shared/resolveVikeConfigInternal/getPlusFilesAll.js';
28
+ import type { PlusFile } from '../node/vite/shared/resolveVikeConfigInternal/getPlusFilesByLocationId.js';
29
29
  import type { ApiOperation } from '../node/api/types.js';
30
30
  type PageConfigCommon = {
31
31
  pageId: string;
@@ -1 +1 @@
1
- export declare const PROJECT_VERSION: "0.4.249-commit-775a43e";
1
+ export declare const PROJECT_VERSION: "0.4.249-commit-f416149";
@@ -1,2 +1,2 @@
1
1
  // Automatically updated by @brillout/release-me
2
- export const PROJECT_VERSION = '0.4.249-commit-775a43e';
2
+ export const PROJECT_VERSION = '0.4.249-commit-f416149';
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vike",
3
- "version": "0.4.249-commit-775a43e",
3
+ "version": "0.4.249-commit-f416149",
4
4
  "repository": "https://github.com/vikejs/vike",
5
5
  "exports": {
6
6
  "./server": {
@@ -221,10 +221,10 @@
221
221
  "types": "./dist/server/runtime/index.d.ts",
222
222
  "type": "module",
223
223
  "bin": {
224
- "vike": "./node/cli/bin.js"
224
+ "vike": "./bin.js"
225
225
  },
226
226
  "files": [
227
- "./node/cli/bin.js",
227
+ "./bin.js",
228
228
  "./dist/",
229
229
  "./abort.js",
230
230
  "./api.js",
package/node/cli/bin.js DELETED
@@ -1,3 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- import '../../dist/node/cli/entry.js'