vike 0.4.249-commit-775a43e → 0.4.249-commit-55681da
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/bin.js +3 -0
- package/dist/node/vite/plugins/pluginVirtualFiles.js +1 -1
- package/dist/node/vite/shared/resolveVikeConfigInternal/assertExtensions.d.ts +1 -1
- package/dist/node/vite/shared/resolveVikeConfigInternal/{crawlPlusFiles.d.ts → crawlPlusFilePaths.d.ts} +2 -2
- package/dist/node/vite/shared/resolveVikeConfigInternal/{crawlPlusFiles.js → crawlPlusFilePaths.js} +4 -4
- package/dist/node/vite/shared/resolveVikeConfigInternal/{getPlusFilesAll.d.ts → getPlusFilesByLocationId.d.ts} +7 -5
- package/dist/node/vite/shared/resolveVikeConfigInternal/{getPlusFilesAll.js → getPlusFilesByLocationId.js} +39 -53
- package/dist/node/vite/shared/resolveVikeConfigInternal/loadFileAtConfigTime.d.ts +1 -1
- package/dist/node/vite/shared/resolveVikeConfigInternal.d.ts +1 -1
- package/dist/node/vite/shared/resolveVikeConfigInternal.js +41 -41
- package/dist/server/runtime/renderPageServer/html/stream.js +12 -13
- package/dist/types/PageConfig.d.ts +1 -1
- package/dist/utils/PROJECT_VERSION.d.ts +1 -1
- package/dist/utils/PROJECT_VERSION.js +1 -1
- package/package.json +3 -3
- package/node/cli/bin.js +0 -3
- /package/dist/node/vite/shared/resolveVikeConfigInternal/{crawlPlusFiles → crawlPlusFilePaths}/ignorePatternsBuiltIn.d.ts +0 -0
- /package/dist/node/vite/shared/resolveVikeConfigInternal/{crawlPlusFiles → crawlPlusFilePaths}/ignorePatternsBuiltIn.js +0 -0
package/bin.js
ADDED
|
@@ -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/
|
|
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 './
|
|
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 {
|
|
1
|
+
export { crawlPlusFilePaths };
|
|
2
2
|
export { isPlusFile };
|
|
3
3
|
export { getPlusFileValueConfigName };
|
|
4
|
-
declare function
|
|
4
|
+
declare function crawlPlusFilePaths(userRootDir: string): Promise<{
|
|
5
5
|
filePathAbsoluteUserRootDir: string;
|
|
6
6
|
}[]>;
|
|
7
7
|
declare function isPlusFile(filePath: string): boolean;
|
package/dist/node/vite/shared/resolveVikeConfigInternal/{crawlPlusFiles.js → crawlPlusFilePaths.js}
RENAMED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export {
|
|
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 './
|
|
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/
|
|
17
|
+
const globalObject = getGlobalObject('getVikeConfig/crawlPlusFilePaths.ts', {
|
|
18
18
|
gitIsNotUsable: false,
|
|
19
19
|
});
|
|
20
|
-
async function
|
|
20
|
+
async function crawlPlusFilePaths(userRootDir) {
|
|
21
21
|
assertPosixPath(userRootDir);
|
|
22
22
|
assertFilePathAbsoluteFilesystem(userRootDir);
|
|
23
23
|
const userSettings = getUserSettings();
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export {
|
|
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
|
|
10
|
+
type PlusFileCommon = {
|
|
11
11
|
locationId: LocationId;
|
|
12
12
|
filePath: FilePathResolved;
|
|
13
13
|
};
|
|
14
|
-
|
|
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
|
-
|
|
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
|
|
39
|
+
declare function getPlusFilesByLocationId(userRootDir: string, esbuildCache: EsbuildCache): Promise<PlusFilesByLocationId>;
|
|
@@ -1,61 +1,51 @@
|
|
|
1
|
-
export {
|
|
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 {
|
|
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
|
|
12
|
-
const
|
|
13
|
-
const
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
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
|
-
|
|
34
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
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
|
-
|
|
44
|
+
plusFilesByLocationId[locationId].push(plusFile);
|
|
55
45
|
});
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
|
|
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
|
-
|
|
72
|
-
|
|
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(
|
|
70
|
+
Object.entries(plusFilesByLocationId).forEach(([_locationId, plusFiles]) => {
|
|
81
71
|
plusFiles.sort(sortMakeDeterministic);
|
|
82
72
|
});
|
|
83
|
-
assertPlusFiles(
|
|
84
|
-
return
|
|
73
|
+
assertPlusFiles(plusFilesByLocationId);
|
|
74
|
+
return plusFilesByLocationId;
|
|
85
75
|
}
|
|
86
|
-
function assertPlusFiles(
|
|
87
|
-
const plusFiles = Object.values(
|
|
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 './
|
|
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/
|
|
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 {
|
|
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
|
|
173
|
-
const configDefinitionsResolved = await resolveConfigDefinitions(
|
|
174
|
-
const { pageConfigGlobal, pageConfigs } = getPageConfigsBuildTime(configDefinitionsResolved,
|
|
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(
|
|
201
|
-
const
|
|
200
|
+
async function resolveConfigDefinitions(plusFilesByLocationId, userRootDir, esbuildCache) {
|
|
201
|
+
const plusFilesByLocationIdOrdered = Object.values(plusFilesByLocationId)
|
|
202
202
|
.flat()
|
|
203
|
-
.sort((plusFile1, plusFile2) => sortAfterInheritanceOrderGlobal(plusFile1, plusFile2,
|
|
203
|
+
.sort((plusFile1, plusFile2) => sortAfterInheritanceOrderGlobal(plusFile1, plusFile2, plusFilesByLocationId, null));
|
|
204
204
|
const configDefinitionsGlobal = getConfigDefinitions(
|
|
205
|
-
// We use `
|
|
206
|
-
|
|
207
|
-
await loadCustomConfigBuildTimeFiles(
|
|
208
|
-
const configDefinitionsAll = getConfigDefinitions(Object.values(
|
|
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(
|
|
214
|
-
const plusFilesRelevant = objectEntries(
|
|
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 `
|
|
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,
|
|
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 `
|
|
263
|
-
Object.values(
|
|
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,
|
|
268
|
+
applyEffects(pageConfigGlobal.configValueSources, configDefinitionsResolved.configDefinitionsGlobal, plusFilesByLocationId);
|
|
269
269
|
sortConfigValueSources(pageConfigGlobal.configValueSources, null);
|
|
270
|
-
assertPageConfigGlobal(pageConfigGlobal,
|
|
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,
|
|
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,
|
|
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,
|
|
302
|
+
function assertPageConfigGlobal(pageConfigGlobal, plusFilesByLocationId) {
|
|
303
303
|
Object.entries(pageConfigGlobal.configValueSources).forEach(([configName, sources]) => {
|
|
304
|
-
assertGlobalConfigLocation(configName, sources,
|
|
304
|
+
assertGlobalConfigLocation(configName, sources, plusFilesByLocationId, pageConfigGlobal.configDefinitions);
|
|
305
305
|
});
|
|
306
306
|
}
|
|
307
|
-
function assertGlobalConfigLocation(configName, sources,
|
|
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(
|
|
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,
|
|
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,
|
|
506
|
-
if (
|
|
507
|
-
const ret = makeFirst((plusFile) => isGlobalLocation(plusFile.locationId,
|
|
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
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
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,
|
|
857
|
-
const isValueGlobalTarget = resolveIsGlobalValue(configDef.global, configValueSource,
|
|
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,
|
|
1090
|
-
const locationIdsPage = objectEntries(
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
558
|
-
|
|
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/
|
|
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-
|
|
1
|
+
export declare const PROJECT_VERSION: "0.4.249-commit-55681da";
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
// Automatically updated by @brillout/release-me
|
|
2
|
-
export const PROJECT_VERSION = '0.4.249-commit-
|
|
2
|
+
export const PROJECT_VERSION = '0.4.249-commit-55681da';
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vike",
|
|
3
|
-
"version": "0.4.249-commit-
|
|
3
|
+
"version": "0.4.249-commit-55681da",
|
|
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": "./
|
|
224
|
+
"vike": "./bin.js"
|
|
225
225
|
},
|
|
226
226
|
"files": [
|
|
227
|
-
"./
|
|
227
|
+
"./bin.js",
|
|
228
228
|
"./dist/",
|
|
229
229
|
"./abort.js",
|
|
230
230
|
"./api.js",
|
package/node/cli/bin.js
DELETED
|
File without changes
|