@ttsc/unplugin 0.28.5 → 0.28.6
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/README.md +15 -11
- package/lib/api.js +10 -0
- package/lib/api.js.map +1 -1
- package/lib/api.mjs +3 -2
- package/lib/api.mjs.map +1 -1
- package/lib/bun-register.d.cts +10 -7
- package/lib/bun-register.d.mts +10 -7
- package/lib/bun-register.d.ts +10 -7
- package/lib/bun-register.js +90 -24
- package/lib/bun-register.js.map +1 -1
- package/lib/bun-register.mjs +90 -24
- package/lib/bun-register.mjs.map +1 -1
- package/lib/bun.d.cts +10 -8
- package/lib/bun.d.mts +10 -8
- package/lib/bun.d.ts +10 -8
- package/lib/bun.js +19 -17
- package/lib/bun.js.map +1 -1
- package/lib/bun.mjs +20 -18
- package/lib/bun.mjs.map +1 -1
- package/lib/core/index.d.cts +10 -8
- package/lib/core/index.d.mts +10 -8
- package/lib/core/index.d.ts +10 -8
- package/lib/core/index.js +88 -16
- package/lib/core/index.js.map +1 -1
- package/lib/core/index.mjs +81 -18
- package/lib/core/index.mjs.map +1 -1
- package/lib/core/projectDiscovery.d.cts +55 -0
- package/lib/core/projectDiscovery.d.mts +55 -0
- package/lib/core/projectDiscovery.d.ts +55 -0
- package/lib/core/projectDiscovery.js +187 -0
- package/lib/core/projectDiscovery.js.map +1 -0
- package/lib/core/projectDiscovery.mjs +182 -0
- package/lib/core/projectDiscovery.mjs.map +1 -0
- package/lib/core/sourceExtensions.d.cts +10 -0
- package/lib/core/sourceExtensions.d.mts +10 -0
- package/lib/core/sourceExtensions.d.ts +10 -0
- package/lib/core/sourceExtensions.js +38 -0
- package/lib/core/sourceExtensions.js.map +1 -0
- package/lib/core/sourceExtensions.mjs +32 -0
- package/lib/core/sourceExtensions.mjs.map +1 -0
- package/lib/core/transform.d.cts +96 -16
- package/lib/core/transform.d.mts +96 -16
- package/lib/core/transform.d.ts +96 -16
- package/lib/core/transform.js +1295 -309
- package/lib/core/transform.js.map +1 -1
- package/lib/core/transform.mjs +1290 -310
- package/lib/core/transform.mjs.map +1 -1
- package/lib/core/tsconfigPaths.d.cts +55 -3
- package/lib/core/tsconfigPaths.d.mts +55 -3
- package/lib/core/tsconfigPaths.d.ts +55 -3
- package/lib/core/tsconfigPaths.js +260 -46
- package/lib/core/tsconfigPaths.js.map +1 -1
- package/lib/core/tsconfigPaths.mjs +255 -47
- package/lib/core/tsconfigPaths.mjs.map +1 -1
- package/lib/core/viteServe.d.cts +18 -21
- package/lib/core/viteServe.d.mts +18 -21
- package/lib/core/viteServe.d.ts +18 -21
- package/lib/core/viteServe.js +88 -47
- package/lib/core/viteServe.js.map +1 -1
- package/lib/core/viteServe.mjs +89 -49
- package/lib/core/viteServe.mjs.map +1 -1
- package/lib/next.d.cts +7 -0
- package/lib/next.d.mts +7 -0
- package/lib/next.d.ts +7 -0
- package/lib/next.js +186 -54
- package/lib/next.js.map +1 -1
- package/lib/next.mjs +186 -55
- package/lib/next.mjs.map +1 -1
- package/lib/turbopack.d.cts +6 -4
- package/lib/turbopack.d.mts +6 -4
- package/lib/turbopack.d.ts +6 -4
- package/lib/turbopack.js +11 -10
- package/lib/turbopack.js.map +1 -1
- package/lib/turbopack.mjs +11 -10
- package/lib/turbopack.mjs.map +1 -1
- package/package.json +7 -4
- package/src/bun-register.ts +112 -25
- package/src/bun.ts +60 -50
- package/src/core/index.ts +114 -19
- package/src/core/projectDiscovery.ts +256 -0
- package/src/core/sourceExtensions.ts +47 -0
- package/src/core/transform.ts +1671 -361
- package/src/core/tsconfigPaths.ts +406 -46
- package/src/core/viteServe.ts +125 -74
- package/src/next.ts +230 -54
- package/src/turbopack.ts +11 -10
package/lib/core/index.mjs
CHANGED
|
@@ -2,22 +2,24 @@ import fs from 'node:fs';
|
|
|
2
2
|
import path from 'node:path';
|
|
3
3
|
import { createUnplugin } from 'unplugin';
|
|
4
4
|
import { resolveOptions } from './options.mjs';
|
|
5
|
+
import { typescriptTransformSourcePattern } from './sourceExtensions.mjs';
|
|
5
6
|
import { createTtscTransformCache, stripQuery, transformTtsc, beginTtscTransformBuild, resetTtscTransformCache, isDeclarationFile } from './transform.mjs';
|
|
6
|
-
export { collectExternalInputHashes, collectProjectInputHashes, isProjectWalkPath } from './transform.mjs';
|
|
7
|
+
export { captureWatchInputBaseline, captureWatchInputFileBaseline, collectExternalInputHashes, collectProjectInputHashSnapshot, collectProjectInputHashes, isProjectWalkPath, isWatchInputKeyBaseline, watchInputEvidenceMatchesBaseline } from './transform.mjs';
|
|
7
8
|
import { createViteServeMissingInputWatch } from './viteServe.mjs';
|
|
8
|
-
export { mergeMembershipPolicyOverlay, readProjectMembershipPolicy } from './tsconfigPaths.mjs';
|
|
9
|
+
export { mergeMembershipPolicyOverlay, readProjectMembershipPolicy, readTsconfigSourceSnapshot } from './tsconfigPaths.mjs';
|
|
10
|
+
export { discoverNearestProjectTsconfig, findNearestProjectTsconfig, findProjectTsconfigs } from './projectDiscovery.mjs';
|
|
9
11
|
|
|
10
12
|
const name = "ttsc-unplugin";
|
|
11
13
|
/**
|
|
12
|
-
* Matches the TypeScript source extensions the ttsc transform handles:
|
|
13
|
-
* `.tsx`, `.mts`, `.cts
|
|
14
|
-
*
|
|
14
|
+
* Matches the exact TypeScript source extensions the ttsc transform handles:
|
|
15
|
+
* `.ts`, `.tsx`, `.mts`, and `.cts`. JavaScript and invented extension forms
|
|
16
|
+
* such as `.mtsx` are deliberately excluded.
|
|
15
17
|
*
|
|
16
18
|
* Shared with the Bun adapter (`bun.ts`) and the standalone Turbopack loader
|
|
17
19
|
* (`turbopack.ts`) through {@link isTransformTarget}, so the filter is defined
|
|
18
20
|
* once and every adapter answers the same way.
|
|
19
21
|
*/
|
|
20
|
-
const sourceFilePattern =
|
|
22
|
+
const sourceFilePattern = typescriptTransformSourcePattern;
|
|
21
23
|
/** Matches any path segment that is a `node_modules` directory (cross-platform). */
|
|
22
24
|
const nodeModulesPattern = /(?:^|[/\\])node_modules(?:[/\\]|$)/;
|
|
23
25
|
/**
|
|
@@ -57,6 +59,13 @@ const unpluginFactory = (rawOptions = {}) => {
|
|
|
57
59
|
// old containers cannot dispose a replacement's freshly initialized cache.
|
|
58
60
|
let viteBuildOwners = new WeakSet();
|
|
59
61
|
let viteBuildLifecycles = 0;
|
|
62
|
+
// esbuild schedules one-shot onDispose callbacks after it settles the build
|
|
63
|
+
// Promise. Acquire ownership only at onStart: plugin setup runs before build
|
|
64
|
+
// option validation, and a validation failure has no onDispose callback with
|
|
65
|
+
// which to release a setup-time owner. Once a build has actually started, the
|
|
66
|
+
// count keeps an older delayed callback from disposing its active generation.
|
|
67
|
+
const esbuildOwners = new WeakSet();
|
|
68
|
+
let esbuildLifecycles = 0;
|
|
60
69
|
return {
|
|
61
70
|
name,
|
|
62
71
|
enforce: "pre",
|
|
@@ -111,13 +120,14 @@ const unpluginFactory = (rawOptions = {}) => {
|
|
|
111
120
|
// project per edit (samchon/ttsc#1301). The watching build hands its
|
|
112
121
|
// teardown to `closeWatcher` below instead.
|
|
113
122
|
buildEnd() {
|
|
114
|
-
missingInputs.dispose();
|
|
115
123
|
if (viteBuildOwners.delete(this)) {
|
|
116
124
|
viteBuildLifecycles -= 1;
|
|
117
125
|
}
|
|
118
|
-
if (viteBuildLifecycles === 0
|
|
119
|
-
(
|
|
120
|
-
|
|
126
|
+
if (viteBuildLifecycles === 0) {
|
|
127
|
+
missingInputs.dispose();
|
|
128
|
+
if (viteCommand === "serve" || !viteBuildWatching) {
|
|
129
|
+
resetTtscTransformCache(transformCache);
|
|
130
|
+
}
|
|
121
131
|
}
|
|
122
132
|
},
|
|
123
133
|
// The watching build's real teardown, and the only hook in a
|
|
@@ -137,6 +147,7 @@ const unpluginFactory = (rawOptions = {}) => {
|
|
|
137
147
|
closeWatcher() {
|
|
138
148
|
viteBuildOwners = new WeakSet();
|
|
139
149
|
viteBuildLifecycles = 0;
|
|
150
|
+
missingInputs.dispose();
|
|
140
151
|
resetTtscTransformCache(transformCache);
|
|
141
152
|
},
|
|
142
153
|
},
|
|
@@ -174,6 +185,38 @@ const unpluginFactory = (rawOptions = {}) => {
|
|
|
174
185
|
resetTtscTransformCache(transformCache);
|
|
175
186
|
},
|
|
176
187
|
},
|
|
188
|
+
// These hosts map a top-level buildEnd to a per-compilation hook, so use
|
|
189
|
+
// their true compiler or context teardown instead. The custom callbacks
|
|
190
|
+
// are installed by unplugin alongside its ordinary transform wiring.
|
|
191
|
+
webpack(compiler) {
|
|
192
|
+
compiler.hooks.shutdown.tap(name, () => {
|
|
193
|
+
resetTtscTransformCache(transformCache);
|
|
194
|
+
});
|
|
195
|
+
},
|
|
196
|
+
rspack(compiler) {
|
|
197
|
+
compiler.hooks.shutdown.tap(name, () => {
|
|
198
|
+
resetTtscTransformCache(transformCache);
|
|
199
|
+
});
|
|
200
|
+
},
|
|
201
|
+
esbuild: {
|
|
202
|
+
setup(build) {
|
|
203
|
+
build.onStart(() => {
|
|
204
|
+
if (!esbuildOwners.has(build)) {
|
|
205
|
+
esbuildOwners.add(build);
|
|
206
|
+
esbuildLifecycles += 1;
|
|
207
|
+
}
|
|
208
|
+
});
|
|
209
|
+
build.onDispose(() => {
|
|
210
|
+
if (!esbuildOwners.delete(build)) {
|
|
211
|
+
return;
|
|
212
|
+
}
|
|
213
|
+
esbuildLifecycles -= 1;
|
|
214
|
+
if (esbuildLifecycles === 0) {
|
|
215
|
+
resetTtscTransformCache(transformCache);
|
|
216
|
+
}
|
|
217
|
+
});
|
|
218
|
+
},
|
|
219
|
+
},
|
|
177
220
|
buildStart() {
|
|
178
221
|
if (viteCommand !== undefined && !viteBuildOwners.has(this)) {
|
|
179
222
|
viteBuildOwners.add(this);
|
|
@@ -220,19 +263,39 @@ const unpluginFactory = (rawOptions = {}) => {
|
|
|
220
263
|
// invalidate this module in watch mode and persistent caches;
|
|
221
264
|
// bundlers erase type-only imports from their own module graph and
|
|
222
265
|
// would otherwise serve stale generated code. Under Vite serve a
|
|
223
|
-
//
|
|
224
|
-
// resolves added imports and 500s on
|
|
225
|
-
//
|
|
226
|
-
//
|
|
227
|
-
//
|
|
266
|
+
// resolver input that is not proven to be a file must not enter
|
|
267
|
+
// `addWatchFile`: import-analysis resolves added imports and 500s on
|
|
268
|
+
// missing paths and directories, so those are watched against their
|
|
269
|
+
// compiler predicates instead and invalidate this module when the
|
|
270
|
+
// observation changes.
|
|
228
271
|
addWatchFile: (watched, evidence) => {
|
|
229
272
|
if (viteCommand === "serve" && missingInputs.serving()) {
|
|
273
|
+
const observation = evidence?.state?.codec === "predicates"
|
|
274
|
+
? evidence.state.observation
|
|
275
|
+
: undefined;
|
|
276
|
+
const unsafePredicate = observation !== undefined &&
|
|
277
|
+
observation.fileExists !== true &&
|
|
278
|
+
observation.stat !== "file" &&
|
|
279
|
+
observation.readFile?.ok !== true
|
|
280
|
+
? observation
|
|
281
|
+
: undefined;
|
|
282
|
+
if (unsafePredicate !== undefined) {
|
|
283
|
+
missingInputs.watch(watched, path.resolve(file), unsafePredicate);
|
|
284
|
+
return;
|
|
285
|
+
}
|
|
230
286
|
// Trust the generation's recorded existence when it supplied one:
|
|
231
287
|
// every cache hit revalidates it, and probing each input again
|
|
232
288
|
// costs one `existsSync` per input per delivered module.
|
|
233
|
-
const
|
|
234
|
-
|
|
235
|
-
|
|
289
|
+
const unavailable = evidence?.unavailable ??
|
|
290
|
+
(evidence === undefined
|
|
291
|
+
? !fs.existsSync(watched)
|
|
292
|
+
? "missing"
|
|
293
|
+
: undefined
|
|
294
|
+
: evidence.missing
|
|
295
|
+
? "missing"
|
|
296
|
+
: undefined);
|
|
297
|
+
if (unavailable !== undefined) {
|
|
298
|
+
missingInputs.watch(watched, path.resolve(file), unavailable === "not-file" ? "file" : "exists");
|
|
236
299
|
return;
|
|
237
300
|
}
|
|
238
301
|
}
|
package/lib/core/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":["../../src/core/index.ts"],"sourcesContent":[null],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":["../../src/core/index.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
/** Filesystem facts required to discover an implicit TypeScript project. */
|
|
3
|
+
export interface TtscProjectDiscoveryFilesystem {
|
|
4
|
+
/** Override path parsing when the observed filesystem is not the host. */
|
|
5
|
+
platform?: NodeJS.Platform;
|
|
6
|
+
/** Read metadata while following links, like an ordinary config-file open. */
|
|
7
|
+
stat(location: string): Pick<fs.Stats, "isFile"> & Partial<Pick<fs.Stats, "isDirectory">>;
|
|
8
|
+
}
|
|
9
|
+
/** Directory enumeration required to discover every implicit child project. */
|
|
10
|
+
export interface TtscProjectTreeDiscoveryFilesystem extends TtscProjectDiscoveryFilesystem {
|
|
11
|
+
/** Enumerate one lexical directory and identify child directory links. */
|
|
12
|
+
readdir(location: string): readonly (Pick<fs.Dirent, "isDirectory" | "name"> & Partial<Pick<fs.Dirent, "isSymbolicLink">>)[];
|
|
13
|
+
/** Resolve physical directory identity for cycle-safe linked traversal. */
|
|
14
|
+
realpath?(location: string): string;
|
|
15
|
+
}
|
|
16
|
+
/** One exact file predicate consulted by nearest-project discovery. */
|
|
17
|
+
export interface TtscProjectTsconfigCandidate {
|
|
18
|
+
readonly file: string;
|
|
19
|
+
readonly fileExists: boolean;
|
|
20
|
+
}
|
|
21
|
+
/** The selected config and the predicates that selected it. */
|
|
22
|
+
export interface TtscProjectTsconfigDiscovery {
|
|
23
|
+
readonly candidates: readonly TtscProjectTsconfigCandidate[];
|
|
24
|
+
readonly file: string | undefined;
|
|
25
|
+
}
|
|
26
|
+
/** Directories deliberately outside the shared lexical project walk. */
|
|
27
|
+
export declare function isIgnoredProjectDirectory(name: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Find the nearest ancestor `tsconfig.json` that is proven to be a file.
|
|
30
|
+
*
|
|
31
|
+
* A directory, broken link, permission failure, or any other unprovable
|
|
32
|
+
* candidate cannot terminate the walk. `stat` deliberately follows links, so a
|
|
33
|
+
* link to a regular file retains its lexical config spelling.
|
|
34
|
+
*/
|
|
35
|
+
export declare function findNearestProjectTsconfig(startDirectory: string, filesystem?: TtscProjectDiscoveryFilesystem): string | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Find the nearest config and retain the exact predicate observations used to
|
|
38
|
+
* select it. A cache host must not rediscover these candidates later: a file
|
|
39
|
+
* can disappear only for selection and return before that second observation.
|
|
40
|
+
*/
|
|
41
|
+
export declare function discoverNearestProjectTsconfig(startDirectory: string, filesystem?: TtscProjectDiscoveryFilesystem): TtscProjectTsconfigDiscovery;
|
|
42
|
+
/**
|
|
43
|
+
* Find every regular `tsconfig.json` below one project root.
|
|
44
|
+
*
|
|
45
|
+
* The traversal retains lexical project spellings while following child
|
|
46
|
+
* directory links and junctions. A physical ancestor set cuts cycles without
|
|
47
|
+
* collapsing two independent aliases of the same project. An incomplete
|
|
48
|
+
* traversal is reported rather than returned as a complete project map, so a
|
|
49
|
+
* cache-key caller can refuse reuse.
|
|
50
|
+
*/
|
|
51
|
+
export declare function findProjectTsconfigs(root: string, filesystem?: TtscProjectTreeDiscoveryFilesystem): {
|
|
52
|
+
candidates: string[];
|
|
53
|
+
complete: boolean;
|
|
54
|
+
files: string[];
|
|
55
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
/** Filesystem facts required to discover an implicit TypeScript project. */
|
|
3
|
+
export interface TtscProjectDiscoveryFilesystem {
|
|
4
|
+
/** Override path parsing when the observed filesystem is not the host. */
|
|
5
|
+
platform?: NodeJS.Platform;
|
|
6
|
+
/** Read metadata while following links, like an ordinary config-file open. */
|
|
7
|
+
stat(location: string): Pick<fs.Stats, "isFile"> & Partial<Pick<fs.Stats, "isDirectory">>;
|
|
8
|
+
}
|
|
9
|
+
/** Directory enumeration required to discover every implicit child project. */
|
|
10
|
+
export interface TtscProjectTreeDiscoveryFilesystem extends TtscProjectDiscoveryFilesystem {
|
|
11
|
+
/** Enumerate one lexical directory and identify child directory links. */
|
|
12
|
+
readdir(location: string): readonly (Pick<fs.Dirent, "isDirectory" | "name"> & Partial<Pick<fs.Dirent, "isSymbolicLink">>)[];
|
|
13
|
+
/** Resolve physical directory identity for cycle-safe linked traversal. */
|
|
14
|
+
realpath?(location: string): string;
|
|
15
|
+
}
|
|
16
|
+
/** One exact file predicate consulted by nearest-project discovery. */
|
|
17
|
+
export interface TtscProjectTsconfigCandidate {
|
|
18
|
+
readonly file: string;
|
|
19
|
+
readonly fileExists: boolean;
|
|
20
|
+
}
|
|
21
|
+
/** The selected config and the predicates that selected it. */
|
|
22
|
+
export interface TtscProjectTsconfigDiscovery {
|
|
23
|
+
readonly candidates: readonly TtscProjectTsconfigCandidate[];
|
|
24
|
+
readonly file: string | undefined;
|
|
25
|
+
}
|
|
26
|
+
/** Directories deliberately outside the shared lexical project walk. */
|
|
27
|
+
export declare function isIgnoredProjectDirectory(name: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Find the nearest ancestor `tsconfig.json` that is proven to be a file.
|
|
30
|
+
*
|
|
31
|
+
* A directory, broken link, permission failure, or any other unprovable
|
|
32
|
+
* candidate cannot terminate the walk. `stat` deliberately follows links, so a
|
|
33
|
+
* link to a regular file retains its lexical config spelling.
|
|
34
|
+
*/
|
|
35
|
+
export declare function findNearestProjectTsconfig(startDirectory: string, filesystem?: TtscProjectDiscoveryFilesystem): string | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Find the nearest config and retain the exact predicate observations used to
|
|
38
|
+
* select it. A cache host must not rediscover these candidates later: a file
|
|
39
|
+
* can disappear only for selection and return before that second observation.
|
|
40
|
+
*/
|
|
41
|
+
export declare function discoverNearestProjectTsconfig(startDirectory: string, filesystem?: TtscProjectDiscoveryFilesystem): TtscProjectTsconfigDiscovery;
|
|
42
|
+
/**
|
|
43
|
+
* Find every regular `tsconfig.json` below one project root.
|
|
44
|
+
*
|
|
45
|
+
* The traversal retains lexical project spellings while following child
|
|
46
|
+
* directory links and junctions. A physical ancestor set cuts cycles without
|
|
47
|
+
* collapsing two independent aliases of the same project. An incomplete
|
|
48
|
+
* traversal is reported rather than returned as a complete project map, so a
|
|
49
|
+
* cache-key caller can refuse reuse.
|
|
50
|
+
*/
|
|
51
|
+
export declare function findProjectTsconfigs(root: string, filesystem?: TtscProjectTreeDiscoveryFilesystem): {
|
|
52
|
+
candidates: string[];
|
|
53
|
+
complete: boolean;
|
|
54
|
+
files: string[];
|
|
55
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import fs from "node:fs";
|
|
2
|
+
/** Filesystem facts required to discover an implicit TypeScript project. */
|
|
3
|
+
export interface TtscProjectDiscoveryFilesystem {
|
|
4
|
+
/** Override path parsing when the observed filesystem is not the host. */
|
|
5
|
+
platform?: NodeJS.Platform;
|
|
6
|
+
/** Read metadata while following links, like an ordinary config-file open. */
|
|
7
|
+
stat(location: string): Pick<fs.Stats, "isFile"> & Partial<Pick<fs.Stats, "isDirectory">>;
|
|
8
|
+
}
|
|
9
|
+
/** Directory enumeration required to discover every implicit child project. */
|
|
10
|
+
export interface TtscProjectTreeDiscoveryFilesystem extends TtscProjectDiscoveryFilesystem {
|
|
11
|
+
/** Enumerate one lexical directory and identify child directory links. */
|
|
12
|
+
readdir(location: string): readonly (Pick<fs.Dirent, "isDirectory" | "name"> & Partial<Pick<fs.Dirent, "isSymbolicLink">>)[];
|
|
13
|
+
/** Resolve physical directory identity for cycle-safe linked traversal. */
|
|
14
|
+
realpath?(location: string): string;
|
|
15
|
+
}
|
|
16
|
+
/** One exact file predicate consulted by nearest-project discovery. */
|
|
17
|
+
export interface TtscProjectTsconfigCandidate {
|
|
18
|
+
readonly file: string;
|
|
19
|
+
readonly fileExists: boolean;
|
|
20
|
+
}
|
|
21
|
+
/** The selected config and the predicates that selected it. */
|
|
22
|
+
export interface TtscProjectTsconfigDiscovery {
|
|
23
|
+
readonly candidates: readonly TtscProjectTsconfigCandidate[];
|
|
24
|
+
readonly file: string | undefined;
|
|
25
|
+
}
|
|
26
|
+
/** Directories deliberately outside the shared lexical project walk. */
|
|
27
|
+
export declare function isIgnoredProjectDirectory(name: string): boolean;
|
|
28
|
+
/**
|
|
29
|
+
* Find the nearest ancestor `tsconfig.json` that is proven to be a file.
|
|
30
|
+
*
|
|
31
|
+
* A directory, broken link, permission failure, or any other unprovable
|
|
32
|
+
* candidate cannot terminate the walk. `stat` deliberately follows links, so a
|
|
33
|
+
* link to a regular file retains its lexical config spelling.
|
|
34
|
+
*/
|
|
35
|
+
export declare function findNearestProjectTsconfig(startDirectory: string, filesystem?: TtscProjectDiscoveryFilesystem): string | undefined;
|
|
36
|
+
/**
|
|
37
|
+
* Find the nearest config and retain the exact predicate observations used to
|
|
38
|
+
* select it. A cache host must not rediscover these candidates later: a file
|
|
39
|
+
* can disappear only for selection and return before that second observation.
|
|
40
|
+
*/
|
|
41
|
+
export declare function discoverNearestProjectTsconfig(startDirectory: string, filesystem?: TtscProjectDiscoveryFilesystem): TtscProjectTsconfigDiscovery;
|
|
42
|
+
/**
|
|
43
|
+
* Find every regular `tsconfig.json` below one project root.
|
|
44
|
+
*
|
|
45
|
+
* The traversal retains lexical project spellings while following child
|
|
46
|
+
* directory links and junctions. A physical ancestor set cuts cycles without
|
|
47
|
+
* collapsing two independent aliases of the same project. An incomplete
|
|
48
|
+
* traversal is reported rather than returned as a complete project map, so a
|
|
49
|
+
* cache-key caller can refuse reuse.
|
|
50
|
+
*/
|
|
51
|
+
export declare function findProjectTsconfigs(root: string, filesystem?: TtscProjectTreeDiscoveryFilesystem): {
|
|
52
|
+
candidates: string[];
|
|
53
|
+
complete: boolean;
|
|
54
|
+
files: string[];
|
|
55
|
+
};
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var fs = require('node:fs');
|
|
4
|
+
var path = require('node:path');
|
|
5
|
+
|
|
6
|
+
const HOST_PROJECT_DISCOVERY_FILESYSTEM = Object.freeze({
|
|
7
|
+
stat: fs.statSync,
|
|
8
|
+
});
|
|
9
|
+
const HOST_PROJECT_TREE_DISCOVERY_FILESYSTEM = Object.freeze({
|
|
10
|
+
readdir: (location) => fs.readdirSync(location, { withFileTypes: true }),
|
|
11
|
+
realpath: fs.realpathSync.native,
|
|
12
|
+
stat: fs.statSync,
|
|
13
|
+
});
|
|
14
|
+
/** Directories deliberately outside the shared lexical project walk. */
|
|
15
|
+
function isIgnoredProjectDirectory(name) {
|
|
16
|
+
// The residue of what used to be a fifteen-name list, kept to the VCS store,
|
|
17
|
+
// the package manager's tree, and ttsc's own plugin cache. Everything else
|
|
18
|
+
// is decided by the resolved project policy rather than a directory-name
|
|
19
|
+
// guess (samchon/ttsc#1307).
|
|
20
|
+
return name === ".git" || name === ".ttsc" || name === "node_modules";
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Find the nearest ancestor `tsconfig.json` that is proven to be a file.
|
|
24
|
+
*
|
|
25
|
+
* A directory, broken link, permission failure, or any other unprovable
|
|
26
|
+
* candidate cannot terminate the walk. `stat` deliberately follows links, so a
|
|
27
|
+
* link to a regular file retains its lexical config spelling.
|
|
28
|
+
*/
|
|
29
|
+
function findNearestProjectTsconfig(startDirectory, filesystem = HOST_PROJECT_DISCOVERY_FILESYSTEM) {
|
|
30
|
+
return findNearestProjectTsconfigImpl(startDirectory, filesystem);
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Find the nearest config and retain the exact predicate observations used to
|
|
34
|
+
* select it. A cache host must not rediscover these candidates later: a file
|
|
35
|
+
* can disappear only for selection and return before that second observation.
|
|
36
|
+
*/
|
|
37
|
+
function discoverNearestProjectTsconfig(startDirectory, filesystem = HOST_PROJECT_DISCOVERY_FILESYSTEM) {
|
|
38
|
+
const candidates = [];
|
|
39
|
+
return {
|
|
40
|
+
candidates,
|
|
41
|
+
file: findNearestProjectTsconfigImpl(startDirectory, filesystem, candidates),
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/** Shared walk with optional observation retention for cache hosts. */
|
|
45
|
+
function findNearestProjectTsconfigImpl(startDirectory, filesystem, candidates) {
|
|
46
|
+
const paths = filesystem.platform === undefined
|
|
47
|
+
? path
|
|
48
|
+
: filesystem.platform === "win32"
|
|
49
|
+
? path.win32
|
|
50
|
+
: path.posix;
|
|
51
|
+
let current = paths.resolve(startDirectory);
|
|
52
|
+
while (true) {
|
|
53
|
+
const candidate = paths.join(current, "tsconfig.json");
|
|
54
|
+
let fileExists = false;
|
|
55
|
+
try {
|
|
56
|
+
fileExists = filesystem.stat(candidate).isFile();
|
|
57
|
+
}
|
|
58
|
+
catch {
|
|
59
|
+
// An implicit candidate is selectable only when its file kind is proven.
|
|
60
|
+
}
|
|
61
|
+
candidates?.push({ file: candidate, fileExists });
|
|
62
|
+
if (fileExists) {
|
|
63
|
+
return candidate;
|
|
64
|
+
}
|
|
65
|
+
const parent = paths.dirname(current);
|
|
66
|
+
if (parent === current) {
|
|
67
|
+
return undefined;
|
|
68
|
+
}
|
|
69
|
+
current = parent;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Find every regular `tsconfig.json` below one project root.
|
|
74
|
+
*
|
|
75
|
+
* The traversal retains lexical project spellings while following child
|
|
76
|
+
* directory links and junctions. A physical ancestor set cuts cycles without
|
|
77
|
+
* collapsing two independent aliases of the same project. An incomplete
|
|
78
|
+
* traversal is reported rather than returned as a complete project map, so a
|
|
79
|
+
* cache-key caller can refuse reuse.
|
|
80
|
+
*/
|
|
81
|
+
function findProjectTsconfigs(root, filesystem = HOST_PROJECT_TREE_DISCOVERY_FILESYSTEM) {
|
|
82
|
+
const paths = filesystem.platform === undefined
|
|
83
|
+
? path
|
|
84
|
+
: filesystem.platform === "win32"
|
|
85
|
+
? path.win32
|
|
86
|
+
: path.posix;
|
|
87
|
+
const rootDirectory = paths.resolve(root);
|
|
88
|
+
const rootIdentity = projectDirectoryIdentity(rootDirectory, filesystem, paths);
|
|
89
|
+
const pending = [
|
|
90
|
+
{
|
|
91
|
+
ancestors: new Set([
|
|
92
|
+
rootIdentity ??
|
|
93
|
+
canonicalProjectPath(rootDirectory, filesystem.platform),
|
|
94
|
+
]),
|
|
95
|
+
directory: rootDirectory,
|
|
96
|
+
physicalAncestorsComplete: filesystem.realpath === undefined || rootIdentity !== undefined,
|
|
97
|
+
},
|
|
98
|
+
];
|
|
99
|
+
const candidates = [];
|
|
100
|
+
const files = [];
|
|
101
|
+
let complete = filesystem.realpath === undefined || rootIdentity !== undefined;
|
|
102
|
+
while (pending.length !== 0) {
|
|
103
|
+
const current = pending.pop();
|
|
104
|
+
const directory = current.directory;
|
|
105
|
+
let entries;
|
|
106
|
+
try {
|
|
107
|
+
entries = filesystem.readdir(directory);
|
|
108
|
+
}
|
|
109
|
+
catch {
|
|
110
|
+
complete = false;
|
|
111
|
+
continue;
|
|
112
|
+
}
|
|
113
|
+
for (const entry of entries) {
|
|
114
|
+
if (isIgnoredProjectDirectory(entry.name))
|
|
115
|
+
continue;
|
|
116
|
+
const child = paths.join(directory, entry.name);
|
|
117
|
+
const linked = entry.isSymbolicLink?.() === true;
|
|
118
|
+
let directoryEntry = entry.isDirectory();
|
|
119
|
+
if (!directoryEntry && linked) {
|
|
120
|
+
try {
|
|
121
|
+
directoryEntry = filesystem.stat(child).isDirectory?.() === true;
|
|
122
|
+
}
|
|
123
|
+
catch (error) {
|
|
124
|
+
const code = error.code;
|
|
125
|
+
if (code !== "ENOENT" && code !== "ENOTDIR")
|
|
126
|
+
complete = false;
|
|
127
|
+
continue;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
if (!directoryEntry)
|
|
131
|
+
continue;
|
|
132
|
+
const identity = projectDirectoryIdentity(child, filesystem, paths);
|
|
133
|
+
const physicalAncestorsComplete = current.physicalAncestorsComplete &&
|
|
134
|
+
(filesystem.realpath === undefined || identity !== undefined);
|
|
135
|
+
if (filesystem.realpath !== undefined && identity === undefined) {
|
|
136
|
+
complete = false;
|
|
137
|
+
}
|
|
138
|
+
if (linked && (identity === undefined || !physicalAncestorsComplete)) {
|
|
139
|
+
complete = false;
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const stableIdentity = identity ?? canonicalProjectPath(child, filesystem.platform);
|
|
143
|
+
if (current.ancestors.has(stableIdentity))
|
|
144
|
+
continue;
|
|
145
|
+
pending.push({
|
|
146
|
+
ancestors: new Set([...current.ancestors, stableIdentity]),
|
|
147
|
+
directory: child,
|
|
148
|
+
physicalAncestorsComplete,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
const candidate = paths.join(directory, "tsconfig.json");
|
|
152
|
+
candidates.push(candidate);
|
|
153
|
+
try {
|
|
154
|
+
if (filesystem.stat(candidate).isFile()) {
|
|
155
|
+
files.push(candidate);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
const code = error.code;
|
|
160
|
+
if (code !== "ENOENT" && code !== "ENOTDIR") {
|
|
161
|
+
complete = false;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
candidates.sort();
|
|
166
|
+
files.sort();
|
|
167
|
+
return { candidates, complete, files };
|
|
168
|
+
}
|
|
169
|
+
function projectDirectoryIdentity(directory, filesystem, paths) {
|
|
170
|
+
if (filesystem.realpath === undefined)
|
|
171
|
+
return undefined;
|
|
172
|
+
try {
|
|
173
|
+
return canonicalProjectPath(paths.resolve(filesystem.realpath(directory)), filesystem.platform);
|
|
174
|
+
}
|
|
175
|
+
catch {
|
|
176
|
+
return undefined;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
function canonicalProjectPath(location, platform) {
|
|
180
|
+
return platform === "win32" ? location.toLowerCase() : location;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
exports.discoverNearestProjectTsconfig = discoverNearestProjectTsconfig;
|
|
184
|
+
exports.findNearestProjectTsconfig = findNearestProjectTsconfig;
|
|
185
|
+
exports.findProjectTsconfigs = findProjectTsconfigs;
|
|
186
|
+
exports.isIgnoredProjectDirectory = isIgnoredProjectDirectory;
|
|
187
|
+
//# sourceMappingURL=projectDiscovery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"projectDiscovery.js","sources":["../../src/core/projectDiscovery.ts"],"sourcesContent":[null],"names":[],"mappings":"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"}
|