vike 0.4.223-commit-3502685 → 0.4.223-commit-32cd543

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.
@@ -87,7 +87,10 @@ async function getViteRoot(operation) {
87
87
  }
88
88
  async function getInfoFromVite(viteConfigFromOptions, operation) {
89
89
  const viteConfigFromUserViteFile = await loadViteConfigFile(viteConfigFromOptions, operation);
90
- const root = normalizeViteRoot(viteConfigFromUserViteFile?.root ?? viteConfigFromOptions?.root ?? process.cwd());
90
+ const root = normalizeViteRoot(
91
+ // `viteConfigFromOptions.root` before `viteConfigFromUserViteFile.root` replicates Vite's precedence:
92
+ // https://github.com/vitejs/vite/blob/4f5845a3182fc950eb9cd76d7161698383113b18/packages/vite/src/node/config.ts#L1001
93
+ viteConfigFromOptions?.root ?? viteConfigFromUserViteFile?.root ?? process.cwd());
91
94
  globalObject.root = root;
92
95
  let vikeVitePluginOptions;
93
96
  let viteConfigEnhanced = viteConfigFromOptions;
@@ -153,7 +156,11 @@ function getResolveConfigArgs(viteConfig = {}, operation) {
153
156
  return [inlineConfig, command, defaultMode, defaultNodeEnv, isPreview];
154
157
  }
155
158
  function normalizeViteRoot(root) {
156
- return (0, utils_js_1.toPosixPath)(path_1.default.resolve(root));
159
+ // `path.resolve(viteConfigFromUserViteFile.configFile, root)` could be more intuitive than `path.resolve(process.cwd(), root)` but we replicate Vite's behavior (`vite.config.js` should follow Vite's API), see:
160
+ // https://github.com/vitejs/vite/blob/4f5845a3182fc950eb9cd76d7161698383113b18/packages/vite/src/node/config.ts#L1063
161
+ return (0, utils_js_1.toPosixPath)(
162
+ // Equivalent to `path.resolve(process.cwd(), root)`
163
+ path_1.default.resolve(root));
157
164
  }
158
165
  const errMsg = `A Vite plugin is modifying Vite's setting ${picocolors_1.default.cyan('root')} which is forbidden`;
159
166
  async function assertViteRoot2(root, viteConfigEnhanced, operation) {
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ignorePatternsBuiltIn = void 0;
4
+ exports.ignorePatternsBuiltIn = [
5
+ '**/node_modules/**',
6
+ // Ejected Vike extensions, see https://github.com/snake-py/eject
7
+ '**/ejected/**',
8
+ // Allow:
9
+ // ```bash
10
+ // +Page.js
11
+ // +Page.telefunc.js
12
+ // ```
13
+ '**/*.telefunc.*',
14
+ // https://github.com/vikejs/vike/discussions/2222
15
+ '**/*.generated.*'
16
+ ];
@@ -14,36 +14,22 @@ const util_1 = require("util");
14
14
  const transpileAndExecuteFile_js_1 = require("./transpileAndExecuteFile.js");
15
15
  const getEnvVarObject_js_1 = require("../../../../shared/getEnvVarObject.js");
16
16
  const picocolors_1 = __importDefault(require("@brillout/picocolors"));
17
+ const picomatch_1 = __importDefault(require("picomatch"));
18
+ const ignorePatternsBuiltIn_js_1 = require("./crawlPlusFiles/ignorePatternsBuiltIn.js");
17
19
  const execA = (0, util_1.promisify)(child_process_1.exec);
18
20
  const debug = (0, utils_js_1.createDebugger)('vike:crawl');
19
21
  (0, utils_js_1.assertIsNotProductionRuntime)();
20
22
  (0, utils_js_1.assertIsSingleModuleInstance)('getVikeConfig/crawlPlusFiles.ts');
21
23
  let gitIsNotUsable = false;
22
- async function crawlPlusFiles(userRootDir, outDirAbsoluteFilesystem) {
24
+ async function crawlPlusFiles(userRootDir) {
23
25
  (0, utils_js_1.assertPosixPath)(userRootDir);
24
26
  (0, utils_js_1.assertFilePathAbsoluteFilesystem)(userRootDir);
25
- //*/
26
- const outDirRelativeFromUserRootDir = null;
27
- /*/
28
- assertPosixPath(outDirAbsoluteFilesystem)
29
- let outDirRelativeFromUserRootDir: string | null = path.posix.relative(userRootDir, outDirAbsoluteFilesystem)
30
- if (outDirRelativeFromUserRootDir.startsWith('../')) {
31
- // config.outDir is outside of config.root => it's going to be ignored anyways
32
- outDirRelativeFromUserRootDir = null
33
- }
34
- //*/
35
- (0, utils_js_1.assert)(outDirRelativeFromUserRootDir === null ||
36
- /* Not true if outDirRelativeFromUserRootDir starts with a hidden directory (i.e. a directory with a name that starts with `.`)
37
- !outDirRelativeFromUserRootDir.startsWith('.') &&
38
- */
39
- (!outDirRelativeFromUserRootDir.startsWith('./') &&
40
- //
41
- !outDirRelativeFromUserRootDir.startsWith('../')));
42
- const crawSettings = getCrawlSettings();
27
+ const userSettings = getUserSettings();
28
+ const { ignorePatterns, ignoreMatchers } = getIgnore(userSettings);
43
29
  // Crawl
44
- const filesGit = crawSettings.git !== false && (await gitLsFiles(userRootDir, outDirRelativeFromUserRootDir));
30
+ const filesGit = userSettings.git !== false && (await gitLsFiles(userRootDir, ignorePatterns, ignoreMatchers));
45
31
  const filesGitNothingFound = !filesGit || filesGit.length === 0;
46
- const filesGlob = (filesGitNothingFound || debug.isActivated) && (await tinyglobby(userRootDir, outDirRelativeFromUserRootDir));
32
+ const filesGlob = (filesGitNothingFound || debug.isActivated) && (await tinyglobby(userRootDir, ignorePatterns));
47
33
  let files = !filesGitNothingFound
48
34
  ? filesGit
49
35
  : // Fallback to tinyglobby for users that dynamically generate plus files. (Assuming that no plus file is found because of the user's .gitignore list.)
@@ -68,7 +54,7 @@ async function crawlPlusFiles(userRootDir, outDirAbsoluteFilesystem) {
68
54
  return plusFiles;
69
55
  }
70
56
  // Same as tinyglobby() but using `$ git ls-files`
71
- async function gitLsFiles(userRootDir, outDirRelativeFromUserRootDir) {
57
+ async function gitLsFiles(userRootDir, ignorePatterns, ignoreMatchers) {
72
58
  if (gitIsNotUsable)
73
59
  return null;
74
60
  // Preserve UTF-8 file paths.
@@ -76,8 +62,6 @@ async function gitLsFiles(userRootDir, outDirRelativeFromUserRootDir) {
76
62
  // https://stackoverflow.com/questions/22827239/how-to-make-git-properly-display-utf-8-encoded-pathnames-in-the-console-window/22828826#22828826
77
63
  // https://stackoverflow.com/questions/15884180/how-do-i-override-git-configuration-options-by-command-line-parameters/15884261#15884261
78
64
  const preserveUTF8 = '-c core.quotepath=off';
79
- const ignoreAsPatterns = getIgnoreAsPatterns(outDirRelativeFromUserRootDir);
80
- const ignoreAsFilterFn = getIgnoreAsFilterFn(outDirRelativeFromUserRootDir);
81
65
  const cmd = [
82
66
  'git',
83
67
  preserveUTF8,
@@ -87,7 +71,7 @@ async function gitLsFiles(userRootDir, outDirRelativeFromUserRootDir) {
87
71
  // Performance gain is non-negligible.
88
72
  // - https://github.com/vikejs/vike/pull/1688#issuecomment-2166206648
89
73
  // - When node_modules/ is untracked the performance gain could be significant?
90
- ...ignoreAsPatterns.map((pattern) => `--exclude="${pattern}"`),
74
+ ...ignorePatterns.map((pattern) => `--exclude="${pattern}"`),
91
75
  // --others --exclude-standard => list untracked files (--others) while using .gitignore (--exclude-standard)
92
76
  // --cached => list tracked files
93
77
  '--others --exclude-standard --cached'
@@ -122,7 +106,7 @@ async function gitLsFiles(userRootDir, outDirRelativeFromUserRootDir) {
122
106
  if (!path_1.default.posix.basename(filePath).startsWith('+'))
123
107
  continue;
124
108
  // We have to repeat the same exclusion logic here because the option --exclude of `$ git ls-files` only applies to untracked files. (We use --exclude only to speed up the `$ git ls-files` command.)
125
- if (!ignoreAsFilterFn(filePath))
109
+ if (ignoreMatchers.some((m) => m(filePath)))
126
110
  continue;
127
111
  // JavaScript file?
128
112
  if (!(0, utils_js_1.isScriptFile)(filePath))
@@ -135,10 +119,10 @@ async function gitLsFiles(userRootDir, outDirRelativeFromUserRootDir) {
135
119
  return files;
136
120
  }
137
121
  // Same as gitLsFiles() but using tinyglobby
138
- async function tinyglobby(userRootDir, outDirRelativeFromUserRootDir) {
122
+ async function tinyglobby(userRootDir, ignorePatterns) {
139
123
  const pattern = `**/+*.${utils_js_1.scriptFileExtensions}`;
140
124
  const options = {
141
- ignore: getIgnoreAsPatterns(outDirRelativeFromUserRootDir),
125
+ ignore: ignorePatterns,
142
126
  cwd: userRootDir,
143
127
  dot: false
144
128
  };
@@ -153,35 +137,6 @@ async function tinyglobby(userRootDir, outDirRelativeFromUserRootDir) {
153
137
  }
154
138
  return files;
155
139
  }
156
- // Same as getIgnoreAsFilterFn() but as glob pattern
157
- function getIgnoreAsPatterns(outDirRelativeFromUserRootDir) {
158
- const ignoreAsPatterns = [
159
- '**/node_modules/**',
160
- '**/ejected/**',
161
- // Allow:
162
- // ```
163
- // +Page.js
164
- // +Page.telefunc.js
165
- // ```
166
- '**/*.telefunc.*',
167
- // https://github.com/vikejs/vike/discussions/2222
168
- '**/*.generated.*'
169
- ];
170
- if (outDirRelativeFromUserRootDir) {
171
- (0, utils_js_1.assert)(!outDirRelativeFromUserRootDir.startsWith('/'));
172
- ignoreAsPatterns.push(`${outDirRelativeFromUserRootDir}/**`);
173
- }
174
- return ignoreAsPatterns;
175
- }
176
- // Same as getIgnoreAsPatterns() but for Array.filter()
177
- function getIgnoreAsFilterFn(outDirRelativeFromUserRootDir) {
178
- (0, utils_js_1.assert)(outDirRelativeFromUserRootDir === null || !outDirRelativeFromUserRootDir.startsWith('/'));
179
- return (file) => !file.includes('node_modules/') &&
180
- !file.includes('ejected/') &&
181
- !file.includes('.telefunc.') &&
182
- !file.includes('.generated.') &&
183
- (outDirRelativeFromUserRootDir === null || !file.startsWith(`${outDirRelativeFromUserRootDir}/`));
184
- }
185
140
  // Whether Git is installed and whether we can use it
186
141
  async function isGitNotUsable(userRootDir) {
187
142
  // Check Git version
@@ -236,11 +191,19 @@ async function runCmd2(cmd, cwd) {
236
191
  stderr = stderr.toString().trim();
237
192
  return { stdout, stderr };
238
193
  }
239
- function getCrawlSettings() {
240
- const crawlSettings = (0, getEnvVarObject_js_1.getEnvVarObject)('VIKE_CRAWL') ?? {};
194
+ function getUserSettings() {
195
+ const userSettings = (0, getEnvVarObject_js_1.getEnvVarObject)('VIKE_CRAWL') ?? {};
241
196
  const wrongUsage = (settingName, settingType) => `Setting ${picocolors_1.default.cyan(settingName)} in VIKE_CRAWL should be a ${picocolors_1.default.cyan(settingType)}`;
242
- (0, utils_js_1.assertUsage)((0, utils_js_1.hasProp)(crawlSettings, 'git', 'boolean') || (0, utils_js_1.hasProp)(crawlSettings, 'git', 'undefined'), wrongUsage('git', 'boolean'));
243
- return crawlSettings;
197
+ (0, utils_js_1.assertUsage)((0, utils_js_1.hasProp)(userSettings, 'git', 'boolean') || (0, utils_js_1.hasProp)(userSettings, 'git', 'undefined'), wrongUsage('git', 'boolean'));
198
+ (0, utils_js_1.assertUsage)((0, utils_js_1.hasProp)(userSettings, 'ignore', 'string[]') ||
199
+ (0, utils_js_1.hasProp)(userSettings, 'ignore', 'string') ||
200
+ (0, utils_js_1.hasProp)(userSettings, 'ignore', 'undefined'), wrongUsage('git', 'string or an array of strings'));
201
+ (0, utils_js_1.assertUsage)((0, utils_js_1.hasProp)(userSettings, 'ignoreBuiltIn', 'boolean') || (0, utils_js_1.hasProp)(userSettings, 'ignoreBuiltIn', 'undefined'), wrongUsage('ignoreBuiltIn', 'boolean'));
202
+ const settingNames = ['git', 'ignore', 'ignoreBuiltIn'];
203
+ Object.keys(userSettings).forEach((name) => {
204
+ (0, utils_js_1.assertUsage)(settingNames.includes(name), `Unknown setting ${picocolors_1.default.bold(picocolors_1.default.red(name))} in VIKE_CRAWL`);
205
+ });
206
+ return userSettings;
244
207
  }
245
208
  function isPlusFile(filePath) {
246
209
  (0, utils_js_1.assertPosixPath)(filePath);
@@ -276,3 +239,15 @@ function assertNoUnexpectedPlusSign(filePath: string, fileName: string) {
276
239
  )
277
240
  }
278
241
  */
242
+ function getIgnore(userSettings) {
243
+ const ignorePatternsSetByUser = [userSettings.ignore].flat().filter(utils_js_1.isNotNullish);
244
+ const { ignoreBuiltIn } = userSettings;
245
+ const ignorePatterns = [...(ignoreBuiltIn === false ? [] : ignorePatternsBuiltIn_js_1.ignorePatternsBuiltIn), ...ignorePatternsSetByUser];
246
+ const ignoreMatchers = ignorePatterns.map((p) => (0, picomatch_1.default)(p, {
247
+ // We must pass the same settings than tinyglobby
248
+ // https://github.com/SuperchupuDev/tinyglobby/blob/fcfb08a36c3b4d48d5488c21000c95a956d9797c/src/index.ts#L191-L194
249
+ dot: false,
250
+ nocase: false
251
+ }));
252
+ return { ignorePatterns, ignoreMatchers };
253
+ }
@@ -11,7 +11,7 @@ const resolvePointerImport_js_1 = require("./resolvePointerImport.js");
11
11
  const getFilePath_js_1 = require("../../../../shared/getFilePath.js");
12
12
  const assertExtensions_js_1 = require("./assertExtensions.js");
13
13
  async function getPlusFilesAll(userRootDir, esbuildCache) {
14
- const plusFiles = await findPlusFiles(userRootDir, null);
14
+ const plusFiles = await findPlusFiles(userRootDir);
15
15
  const configFiles = [];
16
16
  const valueFiles = [];
17
17
  plusFiles.forEach((f) => {
@@ -114,8 +114,8 @@ function getPlusFileFromConfigFile(configFile, isExtensionConfig, locationId, us
114
114
  function sortMakeDeterministic(plusFile1, plusFile2) {
115
115
  return plusFile1.filePath.filePathAbsoluteVite < plusFile2.filePath.filePathAbsoluteVite ? -1 : 1;
116
116
  }
117
- async function findPlusFiles(userRootDir, outDirRoot) {
118
- const files = await (0, crawlPlusFiles_js_1.crawlPlusFiles)(userRootDir, outDirRoot);
117
+ async function findPlusFiles(userRootDir) {
118
+ const files = await (0, crawlPlusFiles_js_1.crawlPlusFiles)(userRootDir);
119
119
  const plusFiles = files.map(({ filePathAbsoluteUserRootDir }) => (0, getFilePath_js_1.getFilePathResolved)({ filePathAbsoluteUserRootDir, userRootDir }));
120
120
  return plusFiles;
121
121
  }
@@ -2,4 +2,4 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PROJECT_VERSION = void 0;
4
4
  // Automatically updated by @brillout/release-me
5
- exports.PROJECT_VERSION = '0.4.223-commit-3502685';
5
+ exports.PROJECT_VERSION = '0.4.223-commit-32cd543';
@@ -49,7 +49,10 @@ async function getViteRoot(operation) {
49
49
  }
50
50
  async function getInfoFromVite(viteConfigFromOptions, operation) {
51
51
  const viteConfigFromUserViteFile = await loadViteConfigFile(viteConfigFromOptions, operation);
52
- const root = normalizeViteRoot(viteConfigFromUserViteFile?.root ?? viteConfigFromOptions?.root ?? process.cwd());
52
+ const root = normalizeViteRoot(
53
+ // `viteConfigFromOptions.root` before `viteConfigFromUserViteFile.root` replicates Vite's precedence:
54
+ // https://github.com/vitejs/vite/blob/4f5845a3182fc950eb9cd76d7161698383113b18/packages/vite/src/node/config.ts#L1001
55
+ viteConfigFromOptions?.root ?? viteConfigFromUserViteFile?.root ?? process.cwd());
53
56
  globalObject.root = root;
54
57
  let vikeVitePluginOptions;
55
58
  let viteConfigEnhanced = viteConfigFromOptions;
@@ -115,7 +118,11 @@ function getResolveConfigArgs(viteConfig = {}, operation) {
115
118
  return [inlineConfig, command, defaultMode, defaultNodeEnv, isPreview];
116
119
  }
117
120
  function normalizeViteRoot(root) {
118
- return toPosixPath(path.resolve(root));
121
+ // `path.resolve(viteConfigFromUserViteFile.configFile, root)` could be more intuitive than `path.resolve(process.cwd(), root)` but we replicate Vite's behavior (`vite.config.js` should follow Vite's API), see:
122
+ // https://github.com/vitejs/vite/blob/4f5845a3182fc950eb9cd76d7161698383113b18/packages/vite/src/node/config.ts#L1063
123
+ return toPosixPath(
124
+ // Equivalent to `path.resolve(process.cwd(), root)`
125
+ path.resolve(root));
119
126
  }
120
127
  const errMsg = `A Vite plugin is modifying Vite's setting ${pc.cyan('root')} which is forbidden`;
121
128
  async function assertViteRoot2(root, viteConfigEnhanced, operation) {
@@ -0,0 +1 @@
1
+ export declare const ignorePatternsBuiltIn: readonly ["**/node_modules/**", "**/ejected/**", "**/*.telefunc.*", "**/*.generated.*"];
@@ -0,0 +1,13 @@
1
+ export const ignorePatternsBuiltIn = [
2
+ '**/node_modules/**',
3
+ // Ejected Vike extensions, see https://github.com/snake-py/eject
4
+ '**/ejected/**',
5
+ // Allow:
6
+ // ```bash
7
+ // +Page.js
8
+ // +Page.telefunc.js
9
+ // ```
10
+ '**/*.telefunc.*',
11
+ // https://github.com/vikejs/vike/discussions/2222
12
+ '**/*.generated.*'
13
+ ];
@@ -1,7 +1,7 @@
1
1
  export { crawlPlusFiles };
2
2
  export { isPlusFile };
3
3
  export { getPlusFileValueConfigName };
4
- declare function crawlPlusFiles(userRootDir: string, outDirAbsoluteFilesystem: null | string): Promise<{
4
+ declare function crawlPlusFiles(userRootDir: string): Promise<{
5
5
  filePathAbsoluteUserRootDir: string;
6
6
  }[]>;
7
7
  declare function isPlusFile(filePath: string): boolean;
@@ -1,7 +1,7 @@
1
1
  export { crawlPlusFiles };
2
2
  export { isPlusFile };
3
3
  export { getPlusFileValueConfigName };
4
- import { assertPosixPath, assert, scriptFileExtensions, assertIsSingleModuleInstance, assertIsNotProductionRuntime, isVersionOrAbove, isScriptFile, scriptFileExtensionList, createDebugger, deepEqual, assertUsage, assertFilePathAbsoluteFilesystem, assertWarning, hasProp } from '../../../../utils.js';
4
+ import { assertPosixPath, assert, scriptFileExtensions, assertIsSingleModuleInstance, assertIsNotProductionRuntime, isVersionOrAbove, isScriptFile, scriptFileExtensionList, createDebugger, deepEqual, assertUsage, assertFilePathAbsoluteFilesystem, assertWarning, hasProp, isNotNullish } from '../../../../utils.js';
5
5
  import path from 'path';
6
6
  import { glob } from 'tinyglobby';
7
7
  import { exec } from 'child_process';
@@ -9,36 +9,22 @@ import { promisify } from 'util';
9
9
  import { isTemporaryBuildFile } from './transpileAndExecuteFile.js';
10
10
  import { getEnvVarObject } from '../../../../shared/getEnvVarObject.js';
11
11
  import pc from '@brillout/picocolors';
12
+ import picomatch from 'picomatch';
13
+ import { ignorePatternsBuiltIn } from './crawlPlusFiles/ignorePatternsBuiltIn.js';
12
14
  const execA = promisify(exec);
13
15
  const debug = createDebugger('vike:crawl');
14
16
  assertIsNotProductionRuntime();
15
17
  assertIsSingleModuleInstance('getVikeConfig/crawlPlusFiles.ts');
16
18
  let gitIsNotUsable = false;
17
- async function crawlPlusFiles(userRootDir, outDirAbsoluteFilesystem) {
19
+ async function crawlPlusFiles(userRootDir) {
18
20
  assertPosixPath(userRootDir);
19
21
  assertFilePathAbsoluteFilesystem(userRootDir);
20
- //*/
21
- const outDirRelativeFromUserRootDir = null;
22
- /*/
23
- assertPosixPath(outDirAbsoluteFilesystem)
24
- let outDirRelativeFromUserRootDir: string | null = path.posix.relative(userRootDir, outDirAbsoluteFilesystem)
25
- if (outDirRelativeFromUserRootDir.startsWith('../')) {
26
- // config.outDir is outside of config.root => it's going to be ignored anyways
27
- outDirRelativeFromUserRootDir = null
28
- }
29
- //*/
30
- assert(outDirRelativeFromUserRootDir === null ||
31
- /* Not true if outDirRelativeFromUserRootDir starts with a hidden directory (i.e. a directory with a name that starts with `.`)
32
- !outDirRelativeFromUserRootDir.startsWith('.') &&
33
- */
34
- (!outDirRelativeFromUserRootDir.startsWith('./') &&
35
- //
36
- !outDirRelativeFromUserRootDir.startsWith('../')));
37
- const crawSettings = getCrawlSettings();
22
+ const userSettings = getUserSettings();
23
+ const { ignorePatterns, ignoreMatchers } = getIgnore(userSettings);
38
24
  // Crawl
39
- const filesGit = crawSettings.git !== false && (await gitLsFiles(userRootDir, outDirRelativeFromUserRootDir));
25
+ const filesGit = userSettings.git !== false && (await gitLsFiles(userRootDir, ignorePatterns, ignoreMatchers));
40
26
  const filesGitNothingFound = !filesGit || filesGit.length === 0;
41
- const filesGlob = (filesGitNothingFound || debug.isActivated) && (await tinyglobby(userRootDir, outDirRelativeFromUserRootDir));
27
+ const filesGlob = (filesGitNothingFound || debug.isActivated) && (await tinyglobby(userRootDir, ignorePatterns));
42
28
  let files = !filesGitNothingFound
43
29
  ? filesGit
44
30
  : // Fallback to tinyglobby for users that dynamically generate plus files. (Assuming that no plus file is found because of the user's .gitignore list.)
@@ -63,7 +49,7 @@ async function crawlPlusFiles(userRootDir, outDirAbsoluteFilesystem) {
63
49
  return plusFiles;
64
50
  }
65
51
  // Same as tinyglobby() but using `$ git ls-files`
66
- async function gitLsFiles(userRootDir, outDirRelativeFromUserRootDir) {
52
+ async function gitLsFiles(userRootDir, ignorePatterns, ignoreMatchers) {
67
53
  if (gitIsNotUsable)
68
54
  return null;
69
55
  // Preserve UTF-8 file paths.
@@ -71,8 +57,6 @@ async function gitLsFiles(userRootDir, outDirRelativeFromUserRootDir) {
71
57
  // https://stackoverflow.com/questions/22827239/how-to-make-git-properly-display-utf-8-encoded-pathnames-in-the-console-window/22828826#22828826
72
58
  // https://stackoverflow.com/questions/15884180/how-do-i-override-git-configuration-options-by-command-line-parameters/15884261#15884261
73
59
  const preserveUTF8 = '-c core.quotepath=off';
74
- const ignoreAsPatterns = getIgnoreAsPatterns(outDirRelativeFromUserRootDir);
75
- const ignoreAsFilterFn = getIgnoreAsFilterFn(outDirRelativeFromUserRootDir);
76
60
  const cmd = [
77
61
  'git',
78
62
  preserveUTF8,
@@ -82,7 +66,7 @@ async function gitLsFiles(userRootDir, outDirRelativeFromUserRootDir) {
82
66
  // Performance gain is non-negligible.
83
67
  // - https://github.com/vikejs/vike/pull/1688#issuecomment-2166206648
84
68
  // - When node_modules/ is untracked the performance gain could be significant?
85
- ...ignoreAsPatterns.map((pattern) => `--exclude="${pattern}"`),
69
+ ...ignorePatterns.map((pattern) => `--exclude="${pattern}"`),
86
70
  // --others --exclude-standard => list untracked files (--others) while using .gitignore (--exclude-standard)
87
71
  // --cached => list tracked files
88
72
  '--others --exclude-standard --cached'
@@ -117,7 +101,7 @@ async function gitLsFiles(userRootDir, outDirRelativeFromUserRootDir) {
117
101
  if (!path.posix.basename(filePath).startsWith('+'))
118
102
  continue;
119
103
  // We have to repeat the same exclusion logic here because the option --exclude of `$ git ls-files` only applies to untracked files. (We use --exclude only to speed up the `$ git ls-files` command.)
120
- if (!ignoreAsFilterFn(filePath))
104
+ if (ignoreMatchers.some((m) => m(filePath)))
121
105
  continue;
122
106
  // JavaScript file?
123
107
  if (!isScriptFile(filePath))
@@ -130,10 +114,10 @@ async function gitLsFiles(userRootDir, outDirRelativeFromUserRootDir) {
130
114
  return files;
131
115
  }
132
116
  // Same as gitLsFiles() but using tinyglobby
133
- async function tinyglobby(userRootDir, outDirRelativeFromUserRootDir) {
117
+ async function tinyglobby(userRootDir, ignorePatterns) {
134
118
  const pattern = `**/+*.${scriptFileExtensions}`;
135
119
  const options = {
136
- ignore: getIgnoreAsPatterns(outDirRelativeFromUserRootDir),
120
+ ignore: ignorePatterns,
137
121
  cwd: userRootDir,
138
122
  dot: false
139
123
  };
@@ -148,35 +132,6 @@ async function tinyglobby(userRootDir, outDirRelativeFromUserRootDir) {
148
132
  }
149
133
  return files;
150
134
  }
151
- // Same as getIgnoreAsFilterFn() but as glob pattern
152
- function getIgnoreAsPatterns(outDirRelativeFromUserRootDir) {
153
- const ignoreAsPatterns = [
154
- '**/node_modules/**',
155
- '**/ejected/**',
156
- // Allow:
157
- // ```
158
- // +Page.js
159
- // +Page.telefunc.js
160
- // ```
161
- '**/*.telefunc.*',
162
- // https://github.com/vikejs/vike/discussions/2222
163
- '**/*.generated.*'
164
- ];
165
- if (outDirRelativeFromUserRootDir) {
166
- assert(!outDirRelativeFromUserRootDir.startsWith('/'));
167
- ignoreAsPatterns.push(`${outDirRelativeFromUserRootDir}/**`);
168
- }
169
- return ignoreAsPatterns;
170
- }
171
- // Same as getIgnoreAsPatterns() but for Array.filter()
172
- function getIgnoreAsFilterFn(outDirRelativeFromUserRootDir) {
173
- assert(outDirRelativeFromUserRootDir === null || !outDirRelativeFromUserRootDir.startsWith('/'));
174
- return (file) => !file.includes('node_modules/') &&
175
- !file.includes('ejected/') &&
176
- !file.includes('.telefunc.') &&
177
- !file.includes('.generated.') &&
178
- (outDirRelativeFromUserRootDir === null || !file.startsWith(`${outDirRelativeFromUserRootDir}/`));
179
- }
180
135
  // Whether Git is installed and whether we can use it
181
136
  async function isGitNotUsable(userRootDir) {
182
137
  // Check Git version
@@ -231,11 +186,19 @@ async function runCmd2(cmd, cwd) {
231
186
  stderr = stderr.toString().trim();
232
187
  return { stdout, stderr };
233
188
  }
234
- function getCrawlSettings() {
235
- const crawlSettings = getEnvVarObject('VIKE_CRAWL') ?? {};
189
+ function getUserSettings() {
190
+ const userSettings = getEnvVarObject('VIKE_CRAWL') ?? {};
236
191
  const wrongUsage = (settingName, settingType) => `Setting ${pc.cyan(settingName)} in VIKE_CRAWL should be a ${pc.cyan(settingType)}`;
237
- assertUsage(hasProp(crawlSettings, 'git', 'boolean') || hasProp(crawlSettings, 'git', 'undefined'), wrongUsage('git', 'boolean'));
238
- return crawlSettings;
192
+ assertUsage(hasProp(userSettings, 'git', 'boolean') || hasProp(userSettings, 'git', 'undefined'), wrongUsage('git', 'boolean'));
193
+ assertUsage(hasProp(userSettings, 'ignore', 'string[]') ||
194
+ hasProp(userSettings, 'ignore', 'string') ||
195
+ hasProp(userSettings, 'ignore', 'undefined'), wrongUsage('git', 'string or an array of strings'));
196
+ assertUsage(hasProp(userSettings, 'ignoreBuiltIn', 'boolean') || hasProp(userSettings, 'ignoreBuiltIn', 'undefined'), wrongUsage('ignoreBuiltIn', 'boolean'));
197
+ const settingNames = ['git', 'ignore', 'ignoreBuiltIn'];
198
+ Object.keys(userSettings).forEach((name) => {
199
+ assertUsage(settingNames.includes(name), `Unknown setting ${pc.bold(pc.red(name))} in VIKE_CRAWL`);
200
+ });
201
+ return userSettings;
239
202
  }
240
203
  function isPlusFile(filePath) {
241
204
  assertPosixPath(filePath);
@@ -271,3 +234,15 @@ function assertNoUnexpectedPlusSign(filePath: string, fileName: string) {
271
234
  )
272
235
  }
273
236
  */
237
+ function getIgnore(userSettings) {
238
+ const ignorePatternsSetByUser = [userSettings.ignore].flat().filter(isNotNullish);
239
+ const { ignoreBuiltIn } = userSettings;
240
+ const ignorePatterns = [...(ignoreBuiltIn === false ? [] : ignorePatternsBuiltIn), ...ignorePatternsSetByUser];
241
+ const ignoreMatchers = ignorePatterns.map((p) => picomatch(p, {
242
+ // We must pass the same settings than tinyglobby
243
+ // https://github.com/SuperchupuDev/tinyglobby/blob/fcfb08a36c3b4d48d5488c21000c95a956d9797c/src/index.ts#L191-L194
244
+ dot: false,
245
+ nocase: false
246
+ }));
247
+ return { ignorePatterns, ignoreMatchers };
248
+ }
@@ -9,7 +9,7 @@ import { resolvePointerImport } from './resolvePointerImport.js';
9
9
  import { getFilePathResolved } from '../../../../shared/getFilePath.js';
10
10
  import { assertExtensionsConventions } from './assertExtensions.js';
11
11
  async function getPlusFilesAll(userRootDir, esbuildCache) {
12
- const plusFiles = await findPlusFiles(userRootDir, null);
12
+ const plusFiles = await findPlusFiles(userRootDir);
13
13
  const configFiles = [];
14
14
  const valueFiles = [];
15
15
  plusFiles.forEach((f) => {
@@ -112,8 +112,8 @@ function getPlusFileFromConfigFile(configFile, isExtensionConfig, locationId, us
112
112
  function sortMakeDeterministic(plusFile1, plusFile2) {
113
113
  return plusFile1.filePath.filePathAbsoluteVite < plusFile2.filePath.filePathAbsoluteVite ? -1 : 1;
114
114
  }
115
- async function findPlusFiles(userRootDir, outDirRoot) {
116
- const files = await crawlPlusFiles(userRootDir, outDirRoot);
115
+ async function findPlusFiles(userRootDir) {
116
+ const files = await crawlPlusFiles(userRootDir);
117
117
  const plusFiles = files.map(({ filePathAbsoluteUserRootDir }) => getFilePathResolved({ filePathAbsoluteUserRootDir, userRootDir }));
118
118
  return plusFiles;
119
119
  }
@@ -1 +1 @@
1
- export declare const PROJECT_VERSION: "0.4.223-commit-3502685";
1
+ export declare const PROJECT_VERSION: "0.4.223-commit-32cd543";
@@ -1,2 +1,2 @@
1
1
  // Automatically updated by @brillout/release-me
2
- export const PROJECT_VERSION = '0.4.223-commit-3502685';
2
+ export const PROJECT_VERSION = '0.4.223-commit-32cd543';
@@ -1,4 +1,4 @@
1
1
  export declare const projectInfo: {
2
2
  projectName: "Vike";
3
- projectVersion: "0.4.223-commit-3502685";
3
+ projectVersion: "0.4.223-commit-32cd543";
4
4
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vike",
3
- "version": "0.4.223-commit-3502685",
3
+ "version": "0.4.223-commit-32cd543",
4
4
  "repository": "https://github.com/vikejs/vike",
5
5
  "exports": {
6
6
  "./server": {
@@ -129,6 +129,7 @@
129
129
  "es-module-lexer": "^1.0.0",
130
130
  "esbuild": "^0.19.0 || ^0.20.0 || ^0.21.0 || ^0.22.0 || ^0.23.0 || ^0.24.0",
131
131
  "json5": "^2.0.0",
132
+ "picomatch": "^4.0.2",
132
133
  "semver": "^7.0.0",
133
134
  "source-map-support": "^0.5.0",
134
135
  "tinyglobby": "^0.2.10",
@@ -246,6 +247,7 @@
246
247
  "@types/estree": "^1.0.5",
247
248
  "@types/jest": "^29.5.11",
248
249
  "@types/node": "^20.10.5",
250
+ "@types/picomatch": "^3.0.2",
249
251
  "@types/resolve": "^1.20.6",
250
252
  "@types/semver": "^7.5.8",
251
253
  "@types/source-map-support": "^0.5.10",