@fougere/compiler 0.10.0-alpha.0 → 0.12.0-alpha.0
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/dist/boot.d.ts +8 -3
- package/dist/boot.d.ts.map +1 -1
- package/dist/boot.js +14 -4
- package/dist/boot.js.map +1 -1
- package/dist/scan/Implemented.d.ts +14 -0
- package/dist/scan/Implemented.d.ts.map +1 -0
- package/dist/scan/Implemented.js +34 -0
- package/dist/scan/Implemented.js.map +1 -0
- package/dist/scan/TypeProgram.d.ts +21 -0
- package/dist/scan/TypeProgram.d.ts.map +1 -0
- package/dist/scan/TypeProgram.js +177 -0
- package/dist/scan/TypeProgram.js.map +1 -0
- package/dist/scan/emit.d.ts.map +1 -1
- package/dist/scan/emit.js +37 -28
- package/dist/scan/emit.js.map +1 -1
- package/dist/scan/handler-parser.d.ts +0 -3
- package/dist/scan/handler-parser.d.ts.map +1 -1
- package/dist/scan/handler-parser.js +111 -278
- package/dist/scan/handler-parser.js.map +1 -1
- package/dist/scan/refusals.d.ts +0 -7
- package/dist/scan/refusals.d.ts.map +1 -1
- package/dist/scan/refusals.js +11 -2
- package/dist/scan/refusals.js.map +1 -1
- package/dist/scan/scanner.d.ts.map +1 -1
- package/dist/scan/scanner.js +118 -82
- package/dist/scan/scanner.js.map +1 -1
- package/package.json +6 -6
- package/src/boot.ts +23 -7
- package/src/scan/Implemented.ts +41 -0
- package/src/scan/TypeProgram.ts +199 -0
- package/src/scan/emit.ts +32 -20
- package/src/scan/handler-parser.ts +122 -306
- package/src/scan/refusals.ts +13 -2
- package/src/scan/scanner.ts +158 -94
package/dist/boot.d.ts
CHANGED
|
@@ -5,9 +5,14 @@ interface BootOptions {
|
|
|
5
5
|
root?: string;
|
|
6
6
|
/** Override config (merged with fougere.config.ts). */
|
|
7
7
|
config?: Partial<FougereConfig>;
|
|
8
|
-
/**
|
|
9
|
-
createContainer
|
|
10
|
-
/**
|
|
8
|
+
/** The container to resolve through. Absent, core builds its own. */
|
|
9
|
+
createContainer?: () => Container;
|
|
10
|
+
/**
|
|
11
|
+
* Boot only these fronds, by name — absent, every one found. Not `fronds:`, which says what
|
|
12
|
+
* an app is MADE of: this narrows the same list to what one process carries.
|
|
13
|
+
*/
|
|
14
|
+
only?: string[];
|
|
15
|
+
/** @deprecated The name `only:` now carries. */
|
|
11
16
|
fronds?: string[];
|
|
12
17
|
/**
|
|
13
18
|
* Remote fronds — label → address. A declared remote wins over local
|
package/dist/boot.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boot.d.ts","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,GAAG,EAAE,KAAK,gBAAgB,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAIpJ,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,UAAU,WAAW;IACnB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAChC,
|
|
1
|
+
{"version":3,"file":"boot.d.ts","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkC,KAAK,GAAG,EAAE,KAAK,gBAAgB,EAAE,KAAK,SAAS,EAAE,KAAK,aAAa,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAIpJ,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAEpD,UAAU,WAAW;IACnB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,uDAAuD;IACvD,MAAM,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAChC,qEAAqE;IACrE,eAAe,CAAC,EAAE,MAAM,SAAS,CAAC;IAClC;;;OAGG;IACH,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,gDAAgD;IAChD,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC;IAClB;;;OAGG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,8EAA8E;IAC9E,eAAe,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,SAAS,CAAC;IAC7C,qDAAqD;IACrD,MAAM,CAAC,EAAE,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IACpC;;;OAGG;IACH,EAAE,CAAC,EAAE,CAAC,MAAM,EAAE,aAAa,KAAK;QAC9B,EAAE,CAAC,EAAE,OAAO,CAAC;QACb,cAAc,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,CAAC;QACnD,8FAA8F;QAC9F,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,GAAG,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;QAC7C,oFAAoF;QACpF,KAAK,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;KAC7B,CAAC;IACF;;;OAGG;IACH,UAAU,CAAC,EAAE,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC,EAAE,CAAC;CACjD;AAED,iDAAiD;AACjD,wBAAsB,IAAI,CAAC,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,CAmE7D"}
|
package/dist/boot.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Logger, applyConfig, createApp } from '@fougere/core';
|
|
2
|
-
import { loadConfig } from '@fougere/core/node';
|
|
2
|
+
import { loadConfig, remotesOf, statedModules } from '@fougere/core/node';
|
|
3
3
|
import { scanProject } from './scan/scanner.js';
|
|
4
4
|
/** Boot a Fougere app from fougere.config.ts. */
|
|
5
5
|
export async function boot(options) {
|
|
@@ -20,16 +20,26 @@ export async function boot(options) {
|
|
|
20
20
|
dbSetup = options.db(config);
|
|
21
21
|
log.info('database initialized');
|
|
22
22
|
}
|
|
23
|
+
// What the config names by module — imported here, because core resolves no specifier.
|
|
24
|
+
const stated = await statedModules(config.fronds);
|
|
23
25
|
log.debug('creating app (scan + container)');
|
|
24
26
|
const app = await createApp({
|
|
27
|
+
...(stated.fronds.length > 0 ? { fronds: stated.fronds } : {}),
|
|
25
28
|
// boot() lives on the Node entry, so boot() is what reads the disk. `createApp` is
|
|
26
29
|
// handed the answer and reaches for nothing.
|
|
27
|
-
scan: await scanProject(root, options.fronds, config.conventions),
|
|
30
|
+
scan: await scanProject(root, options.only ?? options.fronds, config.conventions),
|
|
28
31
|
createContainer: options.createContainer,
|
|
29
32
|
storageFactory: dbSetup?.storageFactory,
|
|
30
33
|
db: dbSetup?.db,
|
|
31
34
|
auth: config.auth,
|
|
32
|
-
remotes
|
|
35
|
+
// The tree's string leaves say the same thing `remotes:` does, and this boot read
|
|
36
|
+
// neither of them from the file until now — a project stating its topology got a
|
|
37
|
+
// process that believed every frond was local.
|
|
38
|
+
remotes: options.remotes ?? remotesOf(config),
|
|
39
|
+
// Who inherits code from whom — handed over whole, because a refusal names where an
|
|
40
|
+
// entry sits in the tree.
|
|
41
|
+
under: config.fronds,
|
|
42
|
+
narrowed: (options.only ?? options.fronds) !== undefined,
|
|
33
43
|
ports: config.ports,
|
|
34
44
|
// Read from the config for the same reason `ports` is, one line up: it is a fact the
|
|
35
45
|
// project states, not one the caller passes. Absent here, `serveRest` and
|
|
@@ -43,7 +53,7 @@ export async function boot(options) {
|
|
|
43
53
|
// Its own gesture, handed over whole. The ORDER — tables, then rows, then whatever this
|
|
44
54
|
// host takes on — is `createApp`'s, and was written out by four hosts before.
|
|
45
55
|
migrate: dbSetup?.migrate,
|
|
46
|
-
extensions: options.extensions ?? [],
|
|
56
|
+
extensions: [...stated.extensions, ...(options.extensions ?? [])],
|
|
47
57
|
onEmit: options.onEmit,
|
|
48
58
|
remoteTransport: options.remoteTransport,
|
|
49
59
|
});
|
package/dist/boot.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"boot.js","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,SAAS,EAAuF,MAAM,eAAe,CAAC;AACpJ,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"boot.js","sourceRoot":"","sources":["../src/boot.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a scanned class says it IMPLEMENTS, and whether each name is a class.
|
|
3
|
+
*
|
|
4
|
+
* A class is the interesting case: `implements` is erased, so `Object.getPrototypeOf(ctor).name`
|
|
5
|
+
* is empty and the boot binds no port. An interface is the ordinary one — and one of them,
|
|
6
|
+
* `AsyncDisposable`, is how a provider says its scope keeps it and closes it.
|
|
7
|
+
*/
|
|
8
|
+
export declare function parseImplements(filePath: string, projectRoot?: string): Promise<Implemented[]>;
|
|
9
|
+
/** One `implements` clause, and what the checker says its name is. */
|
|
10
|
+
export interface Implemented {
|
|
11
|
+
name: string;
|
|
12
|
+
isClass: boolean;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=Implemented.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Implemented.d.ts","sourceRoot":"","sources":["../../src/scan/Implemented.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,wBAAsB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAwBpG;AAED,sEAAsE;AACtE,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/** What a scanned class declares it implements. */
|
|
2
|
+
import { loadTS, checkedSourceOf, findDefaultClass } from './TypeProgram.js';
|
|
3
|
+
/**
|
|
4
|
+
* What a scanned class says it IMPLEMENTS, and whether each name is a class.
|
|
5
|
+
*
|
|
6
|
+
* A class is the interesting case: `implements` is erased, so `Object.getPrototypeOf(ctor).name`
|
|
7
|
+
* is empty and the boot binds no port. An interface is the ordinary one — and one of them,
|
|
8
|
+
* `AsyncDisposable`, is how a provider says its scope keeps it and closes it.
|
|
9
|
+
*/
|
|
10
|
+
export async function parseImplements(filePath, projectRoot) {
|
|
11
|
+
const ts = await loadTS();
|
|
12
|
+
const { source, checker } = checkedSourceOf(filePath, projectRoot);
|
|
13
|
+
const cls = findDefaultClass(source);
|
|
14
|
+
if (!cls?.heritageClauses)
|
|
15
|
+
return [];
|
|
16
|
+
const found = [];
|
|
17
|
+
for (const clause of cls.heritageClauses) {
|
|
18
|
+
if (clause.token !== ts.SyntaxKind.ImplementsKeyword)
|
|
19
|
+
continue;
|
|
20
|
+
for (const base of clause.types) {
|
|
21
|
+
if (!ts.isIdentifier(base.expression))
|
|
22
|
+
continue;
|
|
23
|
+
let symbol = checker.getSymbolAtLocation(base.expression);
|
|
24
|
+
if (symbol && symbol.flags & ts.SymbolFlags.Alias)
|
|
25
|
+
symbol = checker.getAliasedSymbol(symbol);
|
|
26
|
+
found.push({
|
|
27
|
+
name: base.expression.text,
|
|
28
|
+
isClass: symbol?.declarations?.some((one) => ts.isClassDeclaration(one)) ?? false,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
return found;
|
|
33
|
+
}
|
|
34
|
+
//# sourceMappingURL=Implemented.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Implemented.js","sourceRoot":"","sources":["../../src/scan/Implemented.ts"],"names":[],"mappings":"AAAA,mDAAmD;AACnD,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAE7E;;;;;;GAMG;AACH,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,QAAgB,EAAE,WAAoB;IAC1E,MAAM,EAAE,GAAG,MAAM,MAAM,EAAE,CAAC;IAC1B,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,eAAe,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;IACnE,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACrC,IAAI,CAAC,GAAG,EAAE,eAAe;QAAE,OAAO,EAAE,CAAC;IAErC,MAAM,KAAK,GAAkB,EAAE,CAAC;IAChC,KAAK,MAAM,MAAM,IAAI,GAAG,CAAC,eAAe,EAAE,CAAC;QACzC,IAAI,MAAM,CAAC,KAAK,KAAK,EAAE,CAAC,UAAU,CAAC,iBAAiB;YAAE,SAAS;QAE/D,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YAChC,IAAI,CAAC,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC;gBAAE,SAAS;YAEhD,IAAI,MAAM,GAAG,OAAO,CAAC,mBAAmB,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;YAC1D,IAAI,MAAM,IAAI,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK;gBAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,CAAC,MAAM,CAAC,CAAC;YAE7F,KAAK,CAAC,IAAI,CAAC;gBACT,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,IAAI;gBAC1B,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,EAAE,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK;aAClF,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/** The TypeScript program the scan reads through, and the mutable state it keeps. */
|
|
2
|
+
import type ts from '@typescript/typescript6';
|
|
3
|
+
export declare function loadTS(): Promise<typeof ts>;
|
|
4
|
+
export declare function getTS(): typeof ts;
|
|
5
|
+
export declare function resetTypePrograms(): void;
|
|
6
|
+
/** Declare every file a run will read, so one program covers it. */
|
|
7
|
+
export declare function seedTypeProgram(filePaths: readonly string[], projectRoot?: string): Promise<void>;
|
|
8
|
+
/** The program a file belongs to, built once and widened as more files are asked for. */
|
|
9
|
+
export declare function projectOf(filePath: string, projectRoot?: string): {
|
|
10
|
+
program: ts.Program;
|
|
11
|
+
absolute: string;
|
|
12
|
+
};
|
|
13
|
+
export declare function checkedSourceOf(filePath: string, projectRoot?: string): {
|
|
14
|
+
source: ts.SourceFile;
|
|
15
|
+
checker: ts.TypeChecker;
|
|
16
|
+
};
|
|
17
|
+
/** A file, opened. Five places read and parsed one, each spelling the same two calls. */
|
|
18
|
+
export declare function sourceOf(filePath: string): ts.SourceFile;
|
|
19
|
+
/** Find the default exported class in a source file. */
|
|
20
|
+
export declare function findDefaultClass(source: ts.SourceFile): ts.ClassDeclaration | undefined;
|
|
21
|
+
//# sourceMappingURL=TypeProgram.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TypeProgram.d.ts","sourceRoot":"","sources":["../../src/scan/TypeProgram.ts"],"names":[],"mappings":"AAAA,qFAAqF;AACrF,OAAO,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAM9C,wBAAsB,MAAM,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,CAGjD;AACD,wBAAgB,KAAK,IAAI,OAAO,EAAE,CAGjC;AAgBD,wBAAgB,iBAAiB,IAAI,IAAI,CAGxC;AAgFD,oEAAoE;AACpE,wBAAsB,eAAe,CAAC,SAAS,EAAE,SAAS,MAAM,EAAE,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBvG;AAED,yFAAyF;AACzF,wBAAgB,SAAS,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG;IAAE,OAAO,EAAE,EAAE,CAAC,OAAO,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAoB3G;AAED,wBAAgB,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG;IAAE,MAAM,EAAE,EAAE,CAAC,UAAU,CAAC;IAAC,OAAO,EAAE,EAAE,CAAC,WAAW,CAAA;CAAE,CAM1H;AAED,yFAAyF;AACzF,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,EAAE,CAAC,UAAU,CAGxD;AAID,wDAAwD;AACxD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,gBAAgB,GAAG,SAAS,CAwBvF"}
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
import { readFileSync, statSync } from 'node:fs';
|
|
2
|
+
import { dirname, resolve as resolvePath } from 'node:path';
|
|
3
|
+
/** Lazy-loaded TypeScript module — avoids bundling the 9MB compiler. */
|
|
4
|
+
let _ts;
|
|
5
|
+
export async function loadTS() {
|
|
6
|
+
if (!_ts)
|
|
7
|
+
_ts = (await import('@typescript/typescript6')).default;
|
|
8
|
+
return _ts;
|
|
9
|
+
}
|
|
10
|
+
export function getTS() {
|
|
11
|
+
if (!_ts)
|
|
12
|
+
throw new Error('TypeScript not loaded — call an async parse function first');
|
|
13
|
+
return _ts;
|
|
14
|
+
}
|
|
15
|
+
/** One checked program per project/configuration during a scan. */
|
|
16
|
+
const typeProjects = new Map();
|
|
17
|
+
const compilerProjects = new Map();
|
|
18
|
+
/** What survives a run. */
|
|
19
|
+
const sourceFiles = new Map();
|
|
20
|
+
const retained = new Map();
|
|
21
|
+
export function resetTypePrograms() {
|
|
22
|
+
typeProjects.clear();
|
|
23
|
+
compilerProjects.clear();
|
|
24
|
+
}
|
|
25
|
+
function keptHost(key, options) {
|
|
26
|
+
const cached = retained.get(key);
|
|
27
|
+
if (cached)
|
|
28
|
+
return cached.host;
|
|
29
|
+
const typescript = getTS();
|
|
30
|
+
const base = typescript.createCompilerHost(options);
|
|
31
|
+
const host = {
|
|
32
|
+
...base,
|
|
33
|
+
getSourceFile(fileName, languageVersion, onError, shouldCreate) {
|
|
34
|
+
const path = resolvePath(fileName);
|
|
35
|
+
const mtime = statSync(path, { throwIfNoEntry: false })?.mtimeMs ?? -1;
|
|
36
|
+
const cached = sourceFiles.get(path);
|
|
37
|
+
if (cached && cached.mtime === mtime)
|
|
38
|
+
return cached.file;
|
|
39
|
+
const file = base.getSourceFile(fileName, languageVersion, onError, shouldCreate);
|
|
40
|
+
if (file && mtime >= 0)
|
|
41
|
+
sourceFiles.set(path, { mtime, file });
|
|
42
|
+
return file;
|
|
43
|
+
},
|
|
44
|
+
};
|
|
45
|
+
retained.set(key, { host, program: undefined });
|
|
46
|
+
return host;
|
|
47
|
+
}
|
|
48
|
+
function builtProgram(key, roots, options) {
|
|
49
|
+
const typescript = getTS();
|
|
50
|
+
const host = keptHost(key, options);
|
|
51
|
+
const program = typescript.createProgram({
|
|
52
|
+
rootNames: [...roots], options, host, oldProgram: retained.get(key)?.program,
|
|
53
|
+
});
|
|
54
|
+
retained.set(key, { host, program });
|
|
55
|
+
return program;
|
|
56
|
+
}
|
|
57
|
+
function compilerProjectOf(filePath, projectRoot) {
|
|
58
|
+
const typescript = getTS();
|
|
59
|
+
const absolute = resolvePath(filePath);
|
|
60
|
+
const configPath = typescript.findConfigFile(dirname(absolute), typescript.sys.fileExists);
|
|
61
|
+
if (configPath) {
|
|
62
|
+
const key = `${configPath}:${projectRoot ?? ''}`;
|
|
63
|
+
const cached = compilerProjects.get(key);
|
|
64
|
+
if (cached)
|
|
65
|
+
return cached;
|
|
66
|
+
const read = typescript.readConfigFile(configPath, typescript.sys.readFile);
|
|
67
|
+
if (read.error)
|
|
68
|
+
throw new Error(typescript.flattenDiagnosticMessageText(read.error.messageText, '\n'));
|
|
69
|
+
const parsed = typescript.parseJsonConfigFileContent(read.config, typescript.sys, dirname(configPath));
|
|
70
|
+
const configured = {
|
|
71
|
+
key,
|
|
72
|
+
// Compiler options belong to the project; its entire include glob does not belong
|
|
73
|
+
// to this scan. Each declaration inspected below becomes a root and TypeScript
|
|
74
|
+
// follows its imports. Seeding the monorepo here made a one-file scan compile it all.
|
|
75
|
+
roots: [],
|
|
76
|
+
// Handlers may be authored or emitted as JavaScript. They still need to belong to
|
|
77
|
+
// the checked program so constructor parsing does not fail on the first cold scan.
|
|
78
|
+
options: { ...parsed.options, allowJs: true, noEmit: true },
|
|
79
|
+
};
|
|
80
|
+
compilerProjects.set(key, configured);
|
|
81
|
+
return configured;
|
|
82
|
+
}
|
|
83
|
+
const key = projectRoot ?? dirname(absolute);
|
|
84
|
+
const cached = compilerProjects.get(key);
|
|
85
|
+
if (cached)
|
|
86
|
+
return cached;
|
|
87
|
+
const configured = {
|
|
88
|
+
key,
|
|
89
|
+
roots: [],
|
|
90
|
+
options: {
|
|
91
|
+
target: typescript.ScriptTarget.ES2022,
|
|
92
|
+
module: typescript.ModuleKind.Node16,
|
|
93
|
+
moduleResolution: typescript.ModuleResolutionKind.Node16,
|
|
94
|
+
strict: true,
|
|
95
|
+
skipLibCheck: true,
|
|
96
|
+
allowJs: true,
|
|
97
|
+
noEmit: true,
|
|
98
|
+
},
|
|
99
|
+
};
|
|
100
|
+
compilerProjects.set(key, configured);
|
|
101
|
+
return configured;
|
|
102
|
+
}
|
|
103
|
+
/** Declare every file a run will read, so one program covers it. */
|
|
104
|
+
export async function seedTypeProgram(filePaths, projectRoot) {
|
|
105
|
+
const typescript = await loadTS();
|
|
106
|
+
const grouped = new Map();
|
|
107
|
+
for (const filePath of filePaths) {
|
|
108
|
+
const absolute = resolvePath(filePath);
|
|
109
|
+
const typescript = getTS();
|
|
110
|
+
const configured = compilerProjectOf(absolute, projectRoot);
|
|
111
|
+
const group = grouped.get(configured.key) ?? { options: configured.options, paths: [] };
|
|
112
|
+
group.paths.push(absolute);
|
|
113
|
+
grouped.set(configured.key, group);
|
|
114
|
+
}
|
|
115
|
+
for (const [key, { options, paths }] of grouped) {
|
|
116
|
+
const roots = new Set(typeProjects.get(key)?.roots ?? []);
|
|
117
|
+
for (const path of paths)
|
|
118
|
+
roots.add(path);
|
|
119
|
+
typeProjects.set(key, { roots, options, program: builtProgram(key, [...roots], options) });
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/** The program a file belongs to, built once and widened as more files are asked for. */
|
|
123
|
+
export function projectOf(filePath, projectRoot) {
|
|
124
|
+
const absolute = resolvePath(filePath);
|
|
125
|
+
const configured = compilerProjectOf(absolute, projectRoot);
|
|
126
|
+
let project = typeProjects.get(configured.key);
|
|
127
|
+
if (!project) {
|
|
128
|
+
// `path.resolve` is variadic, so handing it directly to `map` also passed the
|
|
129
|
+
// index and the whole roots array as path segments. A fixture without a warm scan
|
|
130
|
+
// cache exposed that first-run-only failure.
|
|
131
|
+
const roots = new Set(configured.roots.map((root) => resolvePath(root)));
|
|
132
|
+
roots.add(absolute);
|
|
133
|
+
const program = builtProgram(configured.key, [...roots], configured.options);
|
|
134
|
+
project = { roots, options: configured.options, program };
|
|
135
|
+
typeProjects.set(configured.key, project);
|
|
136
|
+
}
|
|
137
|
+
else if (!project.roots.has(absolute)) {
|
|
138
|
+
project.roots.add(absolute);
|
|
139
|
+
project.program = builtProgram(configured.key, [...project.roots], project.options);
|
|
140
|
+
}
|
|
141
|
+
return { program: project.program, absolute };
|
|
142
|
+
}
|
|
143
|
+
export function checkedSourceOf(filePath, projectRoot) {
|
|
144
|
+
const { program, absolute } = projectOf(filePath, projectRoot);
|
|
145
|
+
const source = program.getSourceFile(absolute);
|
|
146
|
+
if (!source)
|
|
147
|
+
throw new Error(`TypeScript did not include '${absolute}' in its program.`);
|
|
148
|
+
return { source, checker: program.getTypeChecker() };
|
|
149
|
+
}
|
|
150
|
+
/** A file, opened. Five places read and parsed one, each spelling the same two calls. */
|
|
151
|
+
export function sourceOf(filePath) {
|
|
152
|
+
const ts = getTS();
|
|
153
|
+
return ts.createSourceFile(filePath, readFileSync(filePath, 'utf-8'), ts.ScriptTarget.Latest, true);
|
|
154
|
+
}
|
|
155
|
+
// ── Class finding ────────────────────────────
|
|
156
|
+
/** Find the default exported class in a source file. */
|
|
157
|
+
export function findDefaultClass(source) {
|
|
158
|
+
const ts = getTS();
|
|
159
|
+
for (const stmt of source.statements) {
|
|
160
|
+
// export default class Foo { ... }
|
|
161
|
+
if (ts.isClassDeclaration(stmt) && stmt.modifiers?.some((m) => m.kind === ts.SyntaxKind.ExportKeyword) && stmt.modifiers?.some((m) => m.kind === ts.SyntaxKind.DefaultKeyword)) {
|
|
162
|
+
return stmt;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
// export default Foo (separate statement) — find the class it points to
|
|
166
|
+
for (const stmt of source.statements) {
|
|
167
|
+
if (ts.isExportAssignment(stmt) && !stmt.isExportEquals && ts.isIdentifier(stmt.expression)) {
|
|
168
|
+
const name = stmt.expression.text;
|
|
169
|
+
for (const s of source.statements) {
|
|
170
|
+
if (ts.isClassDeclaration(s) && s.name?.text === name)
|
|
171
|
+
return s;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
return undefined;
|
|
176
|
+
}
|
|
177
|
+
//# sourceMappingURL=TypeProgram.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TypeProgram.js","sourceRoot":"","sources":["../../src/scan/TypeProgram.ts"],"names":[],"mappings":"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"}
|
package/dist/scan/emit.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/scan/emit.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAOhD,MAAM,WAAW,WAAW;IAC1B,+EAA+E;IAC/E,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;
|
|
1
|
+
{"version":3,"file":"emit.d.ts","sourceRoot":"","sources":["../../src/scan/emit.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,OAAO,EAAE,KAAK,UAAU,EAAE,MAAM,eAAe,CAAC;AAOhD,MAAM,WAAW,WAAW;IAC1B,+EAA+E;IAC/E,OAAO,EAAE,MAAM,CAAC;IAChB,4EAA4E;IAC5E,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAgHD,yBAAyB;AACzB,wBAAgB,QAAQ,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,CA8BzE"}
|
package/dist/scan/emit.js
CHANGED
|
@@ -68,12 +68,15 @@ function collectorOf(c, imports) {
|
|
|
68
68
|
+ `deps: ${lit(c.deps)}, filePath: ${lit(c.filePath)} }`;
|
|
69
69
|
}
|
|
70
70
|
function providerOf(p, imports) {
|
|
71
|
+
// `kept` travels like every other member: a provider that loses it on disk is registered
|
|
72
|
+
// transient, so the same code would answer differently depending on how it was booted.
|
|
71
73
|
return `{ name: ${lit(nameOf(p))}, ctor: ${imports.aliasOf(p.ctor)}, `
|
|
72
|
-
+ `deps: ${lit(p.deps)}, filePath: ${lit(p.filePath)}
|
|
74
|
+
+ `deps: ${lit(p.deps)}, filePath: ${lit(p.filePath)}`
|
|
75
|
+
+ `${p.kept ? ', kept: true' : ''} }`;
|
|
73
76
|
}
|
|
74
77
|
function middlewareOf(m, imports) {
|
|
75
78
|
return `{ name: ${lit(m.name)}, ctor: ${imports.aliasOf(m.ctor)}, `
|
|
76
|
-
+ `
|
|
79
|
+
+ `deps: ${lit(m.deps)}, filePath: ${lit(m.filePath)} }`;
|
|
77
80
|
}
|
|
78
81
|
function seedOf(s, imports) {
|
|
79
82
|
const data = typeof s.data === 'function' ? imports.aliasOf(s.data) : lit(s.data);
|
|
@@ -101,32 +104,10 @@ function frondOf(f, imports) {
|
|
|
101
104
|
export function emitScan(result, options) {
|
|
102
105
|
const imports = new Imports(options.outFile);
|
|
103
106
|
const core = options.core ?? '@fougere/core';
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
imports.default(e.entityClass, e.filePath);
|
|
109
|
-
const name = e.entityClass.name;
|
|
110
|
-
if (name)
|
|
111
|
-
imports.byClassName.set(name, e.entityClass);
|
|
112
|
-
}
|
|
113
|
-
for (const p of f.providers)
|
|
114
|
-
imports.default(p.ctor, p.filePath);
|
|
115
|
-
for (const h of f.handlers)
|
|
116
|
-
imports.default(h.ctor, h.filePath);
|
|
117
|
-
for (const p of f.presenters)
|
|
118
|
-
imports.default(p.ctor, p.filePath);
|
|
119
|
-
for (const c of f.collectors)
|
|
120
|
-
imports.default(c.ctor, c.filePath);
|
|
121
|
-
for (const m of f.middlewares)
|
|
122
|
-
imports.default(m.ctor, m.filePath);
|
|
123
|
-
for (const s of f.seeds)
|
|
124
|
-
if (typeof s.data === 'function')
|
|
125
|
-
imports.default(s.data, s.filePath);
|
|
126
|
-
}
|
|
127
|
-
const fronds = result.fronds.map((f) => frondOf(f, imports)).join(',\n');
|
|
128
|
-
// `cause` is dropped: it is an Error, and the build that produced this already reported
|
|
129
|
-
// it. What a boot logs is the message, and that travels.
|
|
107
|
+
collectImports(result, imports);
|
|
108
|
+
const fronds = result.fronds.map((one) => frondOf(one, imports)).join(',\n');
|
|
109
|
+
// `cause` is dropped: it is an Error, and the build that produced this already reported it.
|
|
110
|
+
// What a boot logs is the message, and that travels.
|
|
130
111
|
const diagnostics = result.diagnostics.map(({ cause: _cause, ...rest }) => lit(rest));
|
|
131
112
|
// The annotation is a convenience for a file a human's tsc will read; it is never what
|
|
132
113
|
// makes the value correct. A bundler parses a `.mjs` as JavaScript and `import type`
|
|
@@ -147,4 +128,32 @@ ${fronds}
|
|
|
147
128
|
};
|
|
148
129
|
`;
|
|
149
130
|
}
|
|
131
|
+
/**
|
|
132
|
+
* Every class the descriptor names by a file, imported first: a schema slot holding one of them
|
|
133
|
+
* then finds it in the table instead of being imported a second time.
|
|
134
|
+
*/
|
|
135
|
+
function collectImports(result, imports) {
|
|
136
|
+
for (const frond of result.fronds) {
|
|
137
|
+
for (const entity of frond.entities) {
|
|
138
|
+
imports.default(entity.entityClass, entity.filePath);
|
|
139
|
+
const name = entity.entityClass.name;
|
|
140
|
+
if (name)
|
|
141
|
+
imports.byClassName.set(name, entity.entityClass);
|
|
142
|
+
}
|
|
143
|
+
for (const one of frond.providers)
|
|
144
|
+
imports.default(one.ctor, one.filePath);
|
|
145
|
+
for (const one of frond.handlers)
|
|
146
|
+
imports.default(one.ctor, one.filePath);
|
|
147
|
+
for (const one of frond.presenters)
|
|
148
|
+
imports.default(one.ctor, one.filePath);
|
|
149
|
+
for (const one of frond.collectors)
|
|
150
|
+
imports.default(one.ctor, one.filePath);
|
|
151
|
+
for (const one of frond.middlewares)
|
|
152
|
+
imports.default(one.ctor, one.filePath);
|
|
153
|
+
for (const seed of frond.seeds) {
|
|
154
|
+
if (typeof seed.data === 'function')
|
|
155
|
+
imports.default(seed.data, seed.filePath);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
150
159
|
//# sourceMappingURL=emit.js.map
|
package/dist/scan/emit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/scan/emit.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/scan/emit.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
/** Handler signature parser — extracts method signatures from handler source files. */
|
|
2
2
|
import { type Param, type Signature } from '@fougere/core/descriptor';
|
|
3
3
|
import { type ErrorCode } from '@fougere/core';
|
|
4
|
-
export declare function resetTypePrograms(): void;
|
|
5
|
-
/** Declare every file a run will read, so one program covers it. */
|
|
6
|
-
export declare function seedTypeProgram(filePaths: readonly string[], projectRoot?: string): Promise<void>;
|
|
7
4
|
/** What a handler file yielded — its methods, AND what the pass could not open. */
|
|
8
5
|
export interface HandlerParse {
|
|
9
6
|
methods: Signature[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"handler-parser.d.ts","sourceRoot":"","sources":["../../src/scan/handler-parser.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,SAAS,EAAgB,MAAM,0BAA0B,CAAC;AACpF,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;
|
|
1
|
+
{"version":3,"file":"handler-parser.d.ts","sourceRoot":"","sources":["../../src/scan/handler-parser.ts"],"names":[],"mappings":"AAAA,uFAAuF;AACvF,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,SAAS,EAAgB,MAAM,0BAA0B,CAAC;AACpF,OAAO,EAAE,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AA4b/C,mFAAmF;AACnF,MAAM,WAAW,YAAY;IAC3B,OAAO,EAAE,SAAS,EAAE,CAAC;IACrB,4EAA4E;IAC5E,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAG1G;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,QAAQ,EAAE,MAAM,EAChB,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,EACtC,WAAW,CAAC,EAAE,MAAM,GACnB,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAMnC;AAED,uEAAuE;AACvE,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,EAAE,CAAC,CAKxG;AAED;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAQrG"}
|