@nocobase/app-plugin-foundation 0.1.0-beta.0 → 0.1.0-beta.1
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/CHANGELOG.md +14 -0
- package/README.md +13 -3
- package/dist/client/api.d.ts +2 -0
- package/dist/client/api.d.ts.map +1 -1
- package/dist/client/api.js +9 -3
- package/dist/client/api.js.map +1 -1
- package/dist/client/business-modules.d.ts.map +1 -1
- package/dist/client/business-modules.js +6 -0
- package/dist/client/business-modules.js.map +1 -1
- package/dist/client/components/collections-browser.d.ts +7 -0
- package/dist/client/components/collections-browser.d.ts.map +1 -0
- package/dist/client/components/collections-browser.js +63 -0
- package/dist/client/components/collections-browser.js.map +1 -0
- package/dist/client/components/foundation-page.d.ts +2 -1
- package/dist/client/components/foundation-page.d.ts.map +1 -1
- package/dist/client/components/foundation-page.js +17 -7
- package/dist/client/components/foundation-page.js.map +1 -1
- package/dist/client/components/module-matrix.d.ts.map +1 -1
- package/dist/client/components/module-matrix.js +10 -7
- package/dist/client/components/module-matrix.js.map +1 -1
- package/dist/client/components/ui/dialog.d.ts +18 -0
- package/dist/client/components/ui/dialog.d.ts.map +1 -0
- package/dist/client/components/ui/dialog.js +37 -0
- package/dist/client/components/ui/dialog.js.map +1 -0
- package/dist/client/components/ui/input.d.ts +4 -0
- package/dist/client/components/ui/input.d.ts.map +1 -0
- package/dist/client/components/ui/input.js +8 -0
- package/dist/client/components/ui/input.js.map +1 -0
- package/dist/client/components/ui/tooltip.d.ts +8 -0
- package/dist/client/components/ui/tooltip.d.ts.map +1 -0
- package/dist/client/components/ui/tooltip.js +17 -0
- package/dist/client/components/ui/tooltip.js.map +1 -0
- package/dist/client/locales/de-DE.d.ts.map +1 -1
- package/dist/client/locales/de-DE.js +21 -2
- package/dist/client/locales/de-DE.js.map +1 -1
- package/dist/client/locales/en-US.d.ts +19 -0
- package/dist/client/locales/en-US.d.ts.map +1 -1
- package/dist/client/locales/en-US.js +21 -2
- package/dist/client/locales/en-US.js.map +1 -1
- package/dist/client/locales/es-ES.d.ts.map +1 -1
- package/dist/client/locales/es-ES.js +21 -2
- package/dist/client/locales/es-ES.js.map +1 -1
- package/dist/client/locales/fr-FR.d.ts.map +1 -1
- package/dist/client/locales/fr-FR.js +21 -2
- package/dist/client/locales/fr-FR.js.map +1 -1
- package/dist/client/locales/id-ID.d.ts.map +1 -1
- package/dist/client/locales/id-ID.js +21 -2
- package/dist/client/locales/id-ID.js.map +1 -1
- package/dist/client/locales/ja-JP.d.ts.map +1 -1
- package/dist/client/locales/ja-JP.js +21 -2
- package/dist/client/locales/ja-JP.js.map +1 -1
- package/dist/client/locales/pt-BR.d.ts.map +1 -1
- package/dist/client/locales/pt-BR.js +21 -2
- package/dist/client/locales/pt-BR.js.map +1 -1
- package/dist/client/locales/vi-VN.d.ts.map +1 -1
- package/dist/client/locales/vi-VN.js +21 -2
- package/dist/client/locales/vi-VN.js.map +1 -1
- package/dist/client/locales/zh-CN.d.ts.map +1 -1
- package/dist/client/locales/zh-CN.js +21 -2
- package/dist/client/locales/zh-CN.js.map +1 -1
- package/dist/client/locales/zh-TW.d.ts.map +1 -1
- package/dist/client/locales/zh-TW.js +21 -2
- package/dist/client/locales/zh-TW.js.map +1 -1
- package/dist/server/api-evidence.d.ts +13 -0
- package/dist/server/api-evidence.d.ts.map +1 -0
- package/dist/server/api-evidence.js +178 -0
- package/dist/server/api-evidence.js.map +1 -0
- package/dist/server/capabilities/data.d.ts +3 -1
- package/dist/server/capabilities/data.d.ts.map +1 -1
- package/dist/server/capabilities/data.js +47 -12
- package/dist/server/capabilities/data.js.map +1 -1
- package/dist/server/capabilities/intelligence.d.ts.map +1 -1
- package/dist/server/capabilities/intelligence.js +26 -18
- package/dist/server/capabilities/intelligence.js.map +1 -1
- package/dist/server/capabilities/types.d.ts +4 -1
- package/dist/server/capabilities/types.d.ts.map +1 -1
- package/dist/server/capabilities/types.js.map +1 -1
- package/dist/server/inventory.d.ts +9 -3
- package/dist/server/inventory.d.ts.map +1 -1
- package/dist/server/inventory.js +40 -14
- package/dist/server/inventory.js.map +1 -1
- package/dist/server/module-manifest.d.ts.map +1 -1
- package/dist/server/module-manifest.js +1 -0
- package/dist/server/module-manifest.js.map +1 -1
- package/dist/server/module-sources.d.ts.map +1 -1
- package/dist/server/module-sources.js +94 -147
- package/dist/server/module-sources.js.map +1 -1
- package/dist/server/read-queue.d.ts +10 -0
- package/dist/server/read-queue.d.ts.map +1 -0
- package/dist/server/read-queue.js +50 -0
- package/dist/server/read-queue.js.map +1 -0
- package/dist/server/request-evidence.d.ts +14 -0
- package/dist/server/request-evidence.d.ts.map +1 -0
- package/dist/server/request-evidence.js +141 -0
- package/dist/server/request-evidence.js.map +1 -0
- package/dist/server/routes/index.d.ts.map +1 -1
- package/dist/server/routes/index.js +28 -5
- package/dist/server/routes/index.js.map +1 -1
- package/dist/server/routes/schemas.d.ts +7 -1
- package/dist/server/routes/schemas.d.ts.map +1 -1
- package/dist/server/routes/schemas.js +22 -0
- package/dist/server/routes/schemas.js.map +1 -1
- package/dist/server/services/foundation.d.ts +8 -1
- package/dist/server/services/foundation.d.ts.map +1 -1
- package/dist/server/services/foundation.js +98 -8
- package/dist/server/services/foundation.js.map +1 -1
- package/dist/server/source-evidence.d.ts +7 -0
- package/dist/server/source-evidence.d.ts.map +1 -1
- package/dist/server/source-evidence.js +103 -1
- package/dist/server/source-evidence.js.map +1 -1
- package/dist/server/static-values.d.ts +16 -0
- package/dist/server/static-values.d.ts.map +1 -0
- package/dist/server/static-values.js +181 -0
- package/dist/server/static-values.js.map +1 -0
- package/dist/server/tokens.d.ts +7 -1
- package/dist/server/tokens.d.ts.map +1 -1
- package/dist/server/tokens.js.map +1 -1
- package/dist/shared/foundation.d.ts +13 -0
- package/dist/shared/foundation.d.ts.map +1 -1
- package/dist/shared/foundation.js.map +1 -1
- package/package.json +4 -4
- package/skills/nocobase-app-plugin-foundation/SKILL.md +13 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../server/capabilities/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,KAAK,EACV,uBAAuB,EACvB,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,WAAW,gBAAgB;IAC/B,4FAA4F;IAC5F,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;IAChD,mFAAmF;IACnF,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,iFAAiF;IACjF,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../server/capabilities/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AACrE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,KAAK,EACV,uBAAuB,EACvB,cAAc,EACd,gBAAgB,EAChB,oBAAoB,EACpB,cAAc,EACd,gBAAgB,EACjB,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,iBAAiB,CAAC;AAE7C,MAAM,WAAW,gBAAgB;IAC/B,4FAA4F;IAC5F,QAAQ,CAAC,KAAK,EAAE,KAAK,GAAG,SAAS,CAAC;IAClC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;IAChD,mFAAmF;IACnF,QAAQ,CAAC,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IAC7C,iFAAiF;IACjF,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,yFAAyF;IACzF,QAAQ,CAAC,YAAY,CAAC,EAAE,OAAO,CAAC;CACjC;AAED,uGAAuG;AACvG,MAAM,WAAW,kBAAkB;IACjC,kFAAkF;IAClF,QAAQ,CAAC,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IACzC,QAAQ,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;IAC3C,QAAQ,CAAC,OAAO,CAAC,EAAE,SAAS,gBAAgB,EAAE,CAAC;IAC/C,QAAQ,CAAC,KAAK,CAAC,EAAE,SAAS,cAAc,EAAE,CAAC;CAC5C;AAED,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,GAAG,EAAE,uBAAuB,CAAC;IACtC,+FAA+F;IAC/F,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,OAAO,CAAC,OAAO,EAAE,gBAAgB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CACjE;AAED,wBAAgB,MAAM,CACpB,GAAG,EAAE,MAAM,EACX,KAAK,EAAE,MAAM,GAAG,IAAI,EACpB,OAAO,GAAE;IACP,QAAQ,CAAC,IAAI,CAAC,EAAE,oBAAoB,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,OAAO,CAAC;CACxB,GACL,gBAAgB,CAOlB;AAED,wBAAgB,IAAI,CAClB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,cAAc,CAAC,QAAQ,CAAC,GAChC,cAAc,CAEhB;AAED,6DAA6D;AAC7D,wBAAgB,OAAO,CACrB,MAAM,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,EAC1C,IAAI,EAAE,SAAS,MAAM,EAAE,GACtB,MAAM,GAAG,IAAI,CAGf;AAED,oFAAoF;AACpF,eAAO,MAAM,WAAW,EAAE,kBAGzB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../server/capabilities/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../server/capabilities/types.ts"],"names":[],"mappings":"AA2CA,MAAM,UAAU,MAAM,CACpB,GAAW,EACX,KAAoB,EACpB,UAGI,EAAE;IAEN,OAAO;QACL,GAAG;QACH,KAAK;QACL,IAAI,EAAE,OAAO,CAAC,IAAI,IAAI,OAAO;QAC7B,QAAQ,EAAE,KAAK,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,IAAI,CAAC;KACvD,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,IAAI,CAClB,IAAY,EACZ,MAAiC;IAEjC,OAAO,MAAM,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC5D,CAAC;AAED,6DAA6D;AAC7D,MAAM,UAAU,OAAO,CACrB,MAA0C,EAC1C,IAAuB;IAEvB,IAAI,MAAM,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACjC,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,oFAAoF;AACpF,MAAM,CAAC,MAAM,WAAW,GAAuB;IAC7C,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,YAAY;CACrB,CAAC"}
|
|
@@ -1,17 +1,19 @@
|
|
|
1
1
|
import type { CollectionDefinition, DatabaseManager, RepositoryFilter, RepositoryRecord } from '@nocobase/db';
|
|
2
2
|
import type { FoundationIssue } from '../shared/foundation.js';
|
|
3
|
+
import { ReadQueue } from './read-queue.js';
|
|
3
4
|
/** One Collection as the default connection lists it: logical name, table, kind and title. */
|
|
4
5
|
export type CollectionSummary = Awaited<ReturnType<ReturnType<DatabaseManager['collections']>['list']>>['items'][number];
|
|
5
6
|
/** The Collections of the default connection, read once per overview and shared by every capability. */
|
|
6
7
|
export declare class Inventory {
|
|
7
8
|
readonly database: DatabaseManager;
|
|
8
9
|
readonly collections: readonly CollectionSummary[];
|
|
10
|
+
readonly reads: ReadQueue;
|
|
9
11
|
private readonly definitions;
|
|
10
12
|
private constructor();
|
|
11
13
|
/** Lists every Collection of the default connection. Throws when the database cannot be read at all. */
|
|
12
|
-
static read(database: DatabaseManager): Promise<Inventory>;
|
|
14
|
+
static read(database: DatabaseManager, reads?: ReadQueue, signal?: AbortSignal): Promise<Inventory>;
|
|
13
15
|
has(name: string): boolean;
|
|
14
|
-
definition(name: string): Promise<CollectionDefinition | undefined>;
|
|
16
|
+
definition(name: string, signal?: AbortSignal): Promise<CollectionDefinition | undefined>;
|
|
15
17
|
}
|
|
16
18
|
/**
|
|
17
19
|
* Reads for one capability. Every read answers `null` instead of throwing and records what it could not read, so one
|
|
@@ -19,8 +21,11 @@ export declare class Inventory {
|
|
|
19
21
|
*/
|
|
20
22
|
export declare class Probe {
|
|
21
23
|
readonly inventory: Inventory;
|
|
24
|
+
readonly signal: AbortSignal | undefined;
|
|
22
25
|
readonly issues: FoundationIssue[];
|
|
23
|
-
constructor(inventory: Inventory);
|
|
26
|
+
constructor(inventory: Inventory, signal?: AbortSignal | undefined);
|
|
27
|
+
/** Schedule only a small number of table operations, and stop dispatching when the collector expires. */
|
|
28
|
+
map<T, R>(items: readonly T[], read: (item: T) => Promise<R>): Promise<R[]>;
|
|
24
29
|
has(name: string): boolean;
|
|
25
30
|
fieldNames(name: string): Promise<readonly string[] | null>;
|
|
26
31
|
count(name: string, filter?: RepositoryFilter<RepositoryRecord>): Promise<number | null>;
|
|
@@ -39,6 +44,7 @@ export declare class Probe {
|
|
|
39
44
|
}): Promise<number | null>;
|
|
40
45
|
internalMax(table: string, column: string): Promise<unknown>;
|
|
41
46
|
private read;
|
|
47
|
+
private unreadable;
|
|
42
48
|
}
|
|
43
49
|
/** Adds counts, keeping track of whether every one of them could be read. */
|
|
44
50
|
export declare function total(values: readonly (number | null)[]): {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inventory.d.ts","sourceRoot":"","sources":["../../server/inventory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EACjB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"inventory.d.ts","sourceRoot":"","sources":["../../server/inventory.ts"],"names":[],"mappings":"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"}
|
package/dist/server/inventory.js
CHANGED
|
@@ -1,32 +1,35 @@
|
|
|
1
|
+
import { ReadQueue } from './read-queue.js';
|
|
1
2
|
/** The Collections of the default connection, read once per overview and shared by every capability. */
|
|
2
3
|
export class Inventory {
|
|
3
4
|
database;
|
|
4
5
|
collections;
|
|
6
|
+
reads;
|
|
5
7
|
definitions = new Map();
|
|
6
|
-
constructor(database, collections) {
|
|
8
|
+
constructor(database, collections, reads) {
|
|
7
9
|
this.database = database;
|
|
8
10
|
this.collections = collections;
|
|
11
|
+
this.reads = reads;
|
|
9
12
|
}
|
|
10
13
|
/** Lists every Collection of the default connection. Throws when the database cannot be read at all. */
|
|
11
|
-
static async read(database) {
|
|
14
|
+
static async read(database, reads = new ReadQueue(), signal) {
|
|
12
15
|
const collections = [];
|
|
13
16
|
let cursor;
|
|
14
17
|
do {
|
|
15
|
-
const page = await database
|
|
18
|
+
const page = await reads.run(() => database
|
|
16
19
|
.collections()
|
|
17
|
-
.list({ limit: 500, ...(cursor === undefined ? {} : { cursor }) });
|
|
20
|
+
.list({ limit: 500, ...(cursor === undefined ? {} : { cursor }) }), signal);
|
|
18
21
|
collections.push(...page.items);
|
|
19
22
|
cursor = page.nextCursor;
|
|
20
23
|
} while (cursor !== undefined);
|
|
21
|
-
return new Inventory(database, collections);
|
|
24
|
+
return new Inventory(database, collections, reads);
|
|
22
25
|
}
|
|
23
26
|
has(name) {
|
|
24
27
|
return this.collections.some((collection) => collection.name === name);
|
|
25
28
|
}
|
|
26
|
-
definition(name) {
|
|
29
|
+
definition(name, signal) {
|
|
27
30
|
let pending = this.definitions.get(name);
|
|
28
31
|
if (!pending) {
|
|
29
|
-
pending = this.database.collections().get(name);
|
|
32
|
+
pending = this.reads.run(() => this.database.collections().get(name), signal);
|
|
30
33
|
this.definitions.set(name, pending);
|
|
31
34
|
}
|
|
32
35
|
return pending;
|
|
@@ -38,18 +41,37 @@ export class Inventory {
|
|
|
38
41
|
*/
|
|
39
42
|
export class Probe {
|
|
40
43
|
inventory;
|
|
44
|
+
signal;
|
|
41
45
|
issues = [];
|
|
42
|
-
constructor(inventory) {
|
|
46
|
+
constructor(inventory, signal = undefined) {
|
|
43
47
|
this.inventory = inventory;
|
|
48
|
+
this.signal = signal;
|
|
49
|
+
}
|
|
50
|
+
/** Schedule only a small number of table operations, and stop dispatching when the collector expires. */
|
|
51
|
+
async map(items, read) {
|
|
52
|
+
const results = new Array(items.length);
|
|
53
|
+
let next = 0;
|
|
54
|
+
await Promise.all(Array.from({ length: Math.min(4, items.length) }, async () => {
|
|
55
|
+
while (next < items.length) {
|
|
56
|
+
this.signal?.throwIfAborted();
|
|
57
|
+
const index = next++;
|
|
58
|
+
results[index] = await read(items[index]);
|
|
59
|
+
}
|
|
60
|
+
}));
|
|
61
|
+
return results;
|
|
44
62
|
}
|
|
45
63
|
has(name) {
|
|
46
64
|
return this.inventory.has(name);
|
|
47
65
|
}
|
|
48
66
|
async fieldNames(name) {
|
|
49
|
-
|
|
50
|
-
const definition = await this.inventory.definition(name);
|
|
67
|
+
try {
|
|
68
|
+
const definition = await this.inventory.definition(name, this.signal);
|
|
51
69
|
return (definition?.fields ?? []).map((field) => field.name);
|
|
52
|
-
}
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
this.unreadable(name);
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
53
75
|
}
|
|
54
76
|
count(name, filter) {
|
|
55
77
|
return this.read(name, () => this.inventory.database
|
|
@@ -86,6 +108,7 @@ export class Probe {
|
|
|
86
108
|
const records = [];
|
|
87
109
|
const repository = this.inventory.database.repository(name);
|
|
88
110
|
for (let offset = 0;; offset += pageSize) {
|
|
111
|
+
this.signal?.throwIfAborted();
|
|
89
112
|
const page = await repository.findMany({
|
|
90
113
|
limit: pageSize,
|
|
91
114
|
offset,
|
|
@@ -125,15 +148,18 @@ export class Probe {
|
|
|
125
148
|
}
|
|
126
149
|
async read(source, run) {
|
|
127
150
|
try {
|
|
128
|
-
return await run();
|
|
151
|
+
return await this.inventory.reads.run(run, this.signal);
|
|
129
152
|
}
|
|
130
153
|
catch {
|
|
131
154
|
// The cause is not kept: a driver's error can quote the host, database and account it failed to reach.
|
|
132
|
-
|
|
133
|
-
this.issues.push({ code: 'SOURCE_UNREADABLE', source });
|
|
155
|
+
this.unreadable(source);
|
|
134
156
|
return null;
|
|
135
157
|
}
|
|
136
158
|
}
|
|
159
|
+
unreadable(source) {
|
|
160
|
+
if (!this.issues.some((issue) => issue.code === 'SOURCE_UNREADABLE' && issue.source === source))
|
|
161
|
+
this.issues.push({ code: 'SOURCE_UNREADABLE', source });
|
|
162
|
+
}
|
|
137
163
|
}
|
|
138
164
|
/** A grouped value as a map key: statuses and names are strings, an absent value is the empty string. */
|
|
139
165
|
function groupKey(value) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inventory.js","sourceRoot":"","sources":["../../server/inventory.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"inventory.js","sourceRoot":"","sources":["../../server/inventory.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-manifest.d.ts","sourceRoot":"","sources":["../../server/module-manifest.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAEvE,eAAO,MAAM,oBAAoB,EAAE,MAAkC,CAAC;
|
|
1
|
+
{"version":3,"file":"module-manifest.d.ts","sourceRoot":"","sources":["../../server/module-manifest.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAEvE,eAAO,MAAM,oBAAoB,EAAE,MAAkC,CAAC;AA2BtE,yGAAyG;AACzG,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,MAAM,EACf,WAAW,EAAE,MAAM,GAClB,OAAO,CAAC,uBAAuB,GAAG,SAAS,CAAC,CAmB9C;AAED,kGAAkG;AAClG,wBAAsB,mBAAmB,CACvC,OAAO,EAAE,MAAM,GACd,OAAO,CAAC;IAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CAqBlE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-manifest.js","sourceRoot":"","sources":["../../server/module-manifest.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"module-manifest.js","sourceRoot":"","sources":["../../server/module-manifest.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC5E,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB,MAAM,CAAC,MAAM,oBAAoB,GAAW,yBAAyB,CAAC;AACtE,MAAM,cAAc,GAAG,CAAC;KACrB,MAAM,CAAC;IACN,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC;IAC3B,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;IACvB,OAAO,EAAE,CAAC;SACP,MAAM,CAAC;QACN,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;QACrB,MAAM,EAAE,CAAC;aACN,KAAK,CACJ,CAAC;aACE,MAAM,CAAC;YACN,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;YACvB,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE;YACrB,SAAS,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;YAC9B,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;YAC5C,WAAW,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,QAAQ,EAAE;YAC3C,QAAQ,EAAE,CAAC,CAAC,OAAO,EAAE;SACtB,CAAC;aACD,MAAM,EAAE,CACZ;aACA,GAAG,CAAC,KAAK,CAAC;KACd,CAAC;SACD,MAAM,EAAE;CACZ,CAAC;KACD,MAAM,EAAE,CAAC;AAEZ,yGAAyG;AACzG,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,OAAe,EACf,WAAmB;IAEnB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IAChE,IAAI,CAAC;QACH,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,SAAS;YAAE,OAAO,SAAS,CAAC;QAC1D,MAAM,MAAM,GAAG,cAAc,CAAC,SAAS,CACrC,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAY,CACpD,CAAC;QACF,IACE,CAAC,MAAM,CAAC,OAAO;YACf,MAAM,CAAC,IAAI,CAAC,WAAW,KAAK,WAAW;YACvC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAC7B,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,WAAW,KAAK,WAAW,CAC7C;YAED,OAAO,SAAS,CAAC;QACnB,OAAO,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC;IAC7B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAED,kGAAkG;AAClG,MAAM,CAAC,KAAK,UAAU,mBAAmB,CACvC,OAAe;IAEf,MAAM,EAAE,oBAAoB,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;IACrE,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CACzB,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CACvC,CAAC;IACtB,MAAM,OAAO,GAAG,MAAM,oBAAoB,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,QAAQ,GAAG,cAAc,CAAC,KAAK,CAAC;QACpC,aAAa,EAAE,CAAC;QAChB,WAAW,EAAE,QAAQ,CAAC,IAAI;QAC1B,OAAO;KACR,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,oBAAoB,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,GAAG,IAAI,CAAC;IACjD,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACrD,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC;IACrE,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,GAAG,IAAI,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;QAC/C,MAAM,SAAS,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;QACrC,MAAM,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;AACvE,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module-sources.d.ts","sourceRoot":"","sources":["../../server/module-sources.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,uBAAuB,EACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"module-sources.d.ts","sourceRoot":"","sources":["../../server/module-sources.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAEV,uBAAuB,EACxB,MAAM,yBAAyB,CAAC;AACjC,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAiBvE,iHAAiH;AACjH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,SAAS,uBAAuB,EAAO,GAC/C,OAAO,CAAC,uBAAuB,CAAC,CA+FlC"}
|
|
@@ -3,6 +3,9 @@ import path from 'node:path';
|
|
|
3
3
|
import ts from 'typescript';
|
|
4
4
|
import { SourceEvidence } from './source-evidence.js';
|
|
5
5
|
import { readModuleManifest } from './module-manifest.js';
|
|
6
|
+
import { apiDependencies as analyzeApiDependencies } from './api-evidence.js';
|
|
7
|
+
import { pageRequests } from './request-evidence.js';
|
|
8
|
+
import { StaticValues } from './static-values.js';
|
|
6
9
|
const MAX_FILES = 400;
|
|
7
10
|
const MAX_BYTES = 512_000;
|
|
8
11
|
const SOURCE_SUFFIXES = ['.ts', '.tsx', '.js', '.jsx', '.mjs'];
|
|
@@ -44,17 +47,7 @@ export async function collectModuleSources(rootDir, runtime = []) {
|
|
|
44
47
|
await graph.prepare(entry);
|
|
45
48
|
const endpoints = await graph.apiDependencies();
|
|
46
49
|
for (const source of declarationFiles.sources) {
|
|
47
|
-
const declarations =
|
|
48
|
-
const visit = (node) => {
|
|
49
|
-
if (ts.isObjectLiteralExpression(node)) {
|
|
50
|
-
const routeName = property(node, 'name');
|
|
51
|
-
const loader = property(node, 'componentLoader');
|
|
52
|
-
if (routeName && ts.isStringLiteralLike(routeName) && loader)
|
|
53
|
-
declarations.push({ name: routeName.text, loader });
|
|
54
|
-
}
|
|
55
|
-
ts.forEachChild(node, visit);
|
|
56
|
-
};
|
|
57
|
-
visit(source.ast);
|
|
50
|
+
const declarations = graph.routeDeclarations(source.ast);
|
|
58
51
|
for (const declaration of declarations) {
|
|
59
52
|
if (overridden.has(`${packageName}:${declaration.name}`)) {
|
|
60
53
|
routes.push({
|
|
@@ -65,12 +58,13 @@ export async function collectModuleSources(rootDir, runtime = []) {
|
|
|
65
58
|
});
|
|
66
59
|
continue;
|
|
67
60
|
}
|
|
68
|
-
const imports =
|
|
61
|
+
const imports = graph.loaderImports(declaration.loader, declaration.bindings);
|
|
69
62
|
const providers = new Set();
|
|
70
63
|
const apiProviders = new Set();
|
|
64
|
+
const collections = new Set();
|
|
71
65
|
let routeComplete = declarationFiles.complete && imports.length > 0;
|
|
72
|
-
for (const specifier of imports) {
|
|
73
|
-
const target = await graph.local(
|
|
66
|
+
for (const { from, specifier } of imports) {
|
|
67
|
+
const target = await graph.local(from, specifier);
|
|
74
68
|
if (!target) {
|
|
75
69
|
if (!isLocal(specifier))
|
|
76
70
|
addProvider(providers, specifier);
|
|
@@ -81,13 +75,15 @@ export async function collectModuleSources(rootDir, runtime = []) {
|
|
|
81
75
|
const page = graph.evidence(target);
|
|
82
76
|
for (const provider of page.providers)
|
|
83
77
|
providers.add(provider);
|
|
84
|
-
for (const
|
|
85
|
-
for (const
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
78
|
+
for (const request of graph.requests(page.sources)) {
|
|
79
|
+
for (const endpoint of endpoints) {
|
|
80
|
+
if (request.method === endpoint.method &&
|
|
81
|
+
sameApiPath(request.path, endpoint.path)) {
|
|
82
|
+
for (const provider of endpoint.providers)
|
|
83
|
+
apiProviders.add(provider);
|
|
84
|
+
for (const collection of endpoint.collections ?? [])
|
|
85
|
+
collections.add(collection);
|
|
86
|
+
}
|
|
91
87
|
}
|
|
92
88
|
}
|
|
93
89
|
routeComplete &&= page.complete;
|
|
@@ -99,6 +95,9 @@ export async function collectModuleSources(rootDir, runtime = []) {
|
|
|
99
95
|
...(apiProviders.size
|
|
100
96
|
? { apiProviders: [...apiProviders].sort() }
|
|
101
97
|
: {}),
|
|
98
|
+
...(collections.size
|
|
99
|
+
? { collections: [...collections].sort() }
|
|
100
|
+
: {}),
|
|
102
101
|
complete: routeComplete,
|
|
103
102
|
});
|
|
104
103
|
}
|
|
@@ -169,6 +168,18 @@ class SourceGraph {
|
|
|
169
168
|
(await this.resolve(path.join(this.root, 'server/routes.js')));
|
|
170
169
|
if (server)
|
|
171
170
|
await this.walk(server, false);
|
|
171
|
+
const providerEntries = [];
|
|
172
|
+
for (const name of [
|
|
173
|
+
'server/providers/index.js',
|
|
174
|
+
'server/providers.js',
|
|
175
|
+
'server/service-provider.js',
|
|
176
|
+
]) {
|
|
177
|
+
const provider = await this.resolve(path.join(this.root, name));
|
|
178
|
+
if (provider) {
|
|
179
|
+
providerEntries.push(provider);
|
|
180
|
+
await this.walk(provider, false);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
172
183
|
const resolutions = new Map();
|
|
173
184
|
for (const source of this.files.values()) {
|
|
174
185
|
if (!source)
|
|
@@ -183,6 +194,7 @@ class SourceGraph {
|
|
|
183
194
|
}
|
|
184
195
|
}
|
|
185
196
|
this.analysis = new SourceEvidence([...this.files.values()].filter((source) => Boolean(source)), resolutions);
|
|
197
|
+
this.analysis.registerServices(providerEntries);
|
|
186
198
|
}
|
|
187
199
|
evidence(file, roots) {
|
|
188
200
|
const slice = this.analysis?.collect(file, roots);
|
|
@@ -198,8 +210,63 @@ class SourceGraph {
|
|
|
198
210
|
}),
|
|
199
211
|
};
|
|
200
212
|
}
|
|
201
|
-
requests(
|
|
202
|
-
return
|
|
213
|
+
requests(sources) {
|
|
214
|
+
return this.analysis ? pageRequests(sources, this.analysis) : [];
|
|
215
|
+
}
|
|
216
|
+
routeDeclarations(ast) {
|
|
217
|
+
if (!this.analysis)
|
|
218
|
+
return [];
|
|
219
|
+
const analysis = this.analysis;
|
|
220
|
+
const declarations = [];
|
|
221
|
+
let visits = 0;
|
|
222
|
+
const visit = (node, bindings) => {
|
|
223
|
+
if (++visits > 100_000)
|
|
224
|
+
return;
|
|
225
|
+
const literals = new StaticValues(analysis, bindings);
|
|
226
|
+
if (ts.isCallExpression(node) &&
|
|
227
|
+
ts.isPropertyAccessExpression(node.expression) &&
|
|
228
|
+
node.expression.name.text === 'map') {
|
|
229
|
+
const arrays = literals
|
|
230
|
+
.values(node.expression.expression)
|
|
231
|
+
.filter(ts.isArrayLiteralExpression);
|
|
232
|
+
const callback = node.arguments[0];
|
|
233
|
+
if (arrays.length === 1 &&
|
|
234
|
+
arrays[0].elements.length <= 32 &&
|
|
235
|
+
!arrays[0].elements.some(ts.isSpreadElement) &&
|
|
236
|
+
callback &&
|
|
237
|
+
(ts.isArrowFunction(callback) || ts.isFunctionExpression(callback)) &&
|
|
238
|
+
callback.parameters[0]) {
|
|
239
|
+
for (const element of arrays[0].elements) {
|
|
240
|
+
const context = new Map(bindings);
|
|
241
|
+
context.set(callback.parameters[0], [element]);
|
|
242
|
+
visit(callback.body, context);
|
|
243
|
+
}
|
|
244
|
+
return;
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
if (ts.isObjectLiteralExpression(node)) {
|
|
248
|
+
const name = property(node, 'name');
|
|
249
|
+
const loader = property(node, 'componentLoader');
|
|
250
|
+
if (name && loader)
|
|
251
|
+
for (const routeName of literals.strings(name))
|
|
252
|
+
declarations.push({ name: routeName, loader, bindings });
|
|
253
|
+
}
|
|
254
|
+
ts.forEachChild(node, (child) => visit(child, bindings));
|
|
255
|
+
};
|
|
256
|
+
visit(ast, new Map());
|
|
257
|
+
return declarations;
|
|
258
|
+
}
|
|
259
|
+
loaderImports(node, bindings) {
|
|
260
|
+
const literals = this.analysis && new StaticValues(this.analysis, bindings);
|
|
261
|
+
return (this.analysis?.values(node) ?? [node]).flatMap((value) => {
|
|
262
|
+
const body = ts.isArrowFunction(value) && !ts.isBlock(value.body)
|
|
263
|
+
? value.body
|
|
264
|
+
: value;
|
|
265
|
+
return (literals?.values(body) ?? [body]).flatMap((selected) => importsIn(selected).map((specifier) => ({
|
|
266
|
+
from: selected.getSourceFile().fileName,
|
|
267
|
+
specifier,
|
|
268
|
+
})));
|
|
269
|
+
});
|
|
203
270
|
}
|
|
204
271
|
async overrides() {
|
|
205
272
|
const ids = new Set();
|
|
@@ -220,68 +287,14 @@ class SourceGraph {
|
|
|
220
287
|
}
|
|
221
288
|
return ids;
|
|
222
289
|
}
|
|
223
|
-
/** Only explicit, root-mounted Hono endpoints and literal API-client requests can establish this bridge. */
|
|
224
290
|
async apiDependencies() {
|
|
225
291
|
const entry = (await this.resolve(path.join(this.root, 'server/routes/index.js'))) ??
|
|
226
292
|
(await this.resolve(path.join(this.root, 'server/routes.js')));
|
|
227
|
-
|
|
293
|
+
const source = entry && this.files.get(entry);
|
|
294
|
+
if (!source || !this.analysis)
|
|
228
295
|
return [];
|
|
229
|
-
const graph = this.evidence(
|
|
230
|
-
|
|
231
|
-
for (const source of graph.sources) {
|
|
232
|
-
if (!source.imports.includes('hono'))
|
|
233
|
-
continue;
|
|
234
|
-
const mounts = new Map();
|
|
235
|
-
const routes = [];
|
|
236
|
-
const reachableScope = (node) => {
|
|
237
|
-
for (let parent = node.parent; parent; parent = parent.parent)
|
|
238
|
-
if (ts.isFunctionLike(parent))
|
|
239
|
-
return source.nodes.has(parent);
|
|
240
|
-
return true;
|
|
241
|
-
};
|
|
242
|
-
const visit = (node) => {
|
|
243
|
-
if (ts.isCallExpression(node) &&
|
|
244
|
-
reachableScope(node) &&
|
|
245
|
-
ts.isPropertyAccessExpression(node.expression)) {
|
|
246
|
-
const first = node.arguments[0];
|
|
247
|
-
if (first && ts.isStringLiteralLike(first)) {
|
|
248
|
-
const method = node.expression.name.text;
|
|
249
|
-
const child = node.arguments[1];
|
|
250
|
-
if (method === 'route' && child && ts.isIdentifier(child))
|
|
251
|
-
mounts.set(child.text, [
|
|
252
|
-
...(mounts.get(child.text) ?? []),
|
|
253
|
-
first.text,
|
|
254
|
-
]);
|
|
255
|
-
if (['get', 'post', 'put', 'patch', 'delete'].includes(method) &&
|
|
256
|
-
first.text.startsWith('/') &&
|
|
257
|
-
ts.isIdentifier(node.expression.expression))
|
|
258
|
-
routes.push({
|
|
259
|
-
router: node.expression.expression.text,
|
|
260
|
-
path: first.text,
|
|
261
|
-
method: method.toUpperCase(),
|
|
262
|
-
handlers: node.arguments.slice(1),
|
|
263
|
-
});
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
ts.forEachChild(node, visit);
|
|
267
|
-
};
|
|
268
|
-
visit(source.ast);
|
|
269
|
-
if (!routes.length)
|
|
270
|
-
continue;
|
|
271
|
-
for (const route of routes) {
|
|
272
|
-
// Prefixes composed elsewhere, factories and dynamic routing remain unknown rather than guessed.
|
|
273
|
-
if (!(mounts.get(route.router) ?? []).includes('/'))
|
|
274
|
-
continue;
|
|
275
|
-
endpoints.push({
|
|
276
|
-
path: route.path,
|
|
277
|
-
method: route.method,
|
|
278
|
-
providers: [
|
|
279
|
-
...this.evidence(source.file, route.handlers).providers,
|
|
280
|
-
].sort(),
|
|
281
|
-
});
|
|
282
|
-
}
|
|
283
|
-
}
|
|
284
|
-
return endpoints;
|
|
296
|
+
const graph = this.evidence(source.file);
|
|
297
|
+
return analyzeApiDependencies(source.ast, graph.sources, this.analysis, (file, nodes) => [...this.evidence(file, nodes).providers].sort());
|
|
285
298
|
}
|
|
286
299
|
async local(from, specifier) {
|
|
287
300
|
if (specifier.startsWith('.'))
|
|
@@ -411,72 +424,6 @@ function staticImports(node) {
|
|
|
411
424
|
function dynamicImports(node) {
|
|
412
425
|
return importsIn(node);
|
|
413
426
|
}
|
|
414
|
-
function requestPaths(source, selected, symbol) {
|
|
415
|
-
const paths = [];
|
|
416
|
-
const clients = new Set();
|
|
417
|
-
const hooks = new Set();
|
|
418
|
-
for (const statement of source.statements) {
|
|
419
|
-
if (!ts.isImportDeclaration(statement) ||
|
|
420
|
-
!ts.isStringLiteralLike(statement.moduleSpecifier) ||
|
|
421
|
-
statement.moduleSpecifier.text !== '@nocobase/app-client')
|
|
422
|
-
continue;
|
|
423
|
-
const bindings = statement.importClause?.namedBindings;
|
|
424
|
-
if (bindings && ts.isNamedImports(bindings))
|
|
425
|
-
for (const binding of bindings.elements)
|
|
426
|
-
if ((binding.propertyName?.text ?? binding.name.text) === 'useApiClient')
|
|
427
|
-
hooks.add(symbol(binding.name));
|
|
428
|
-
}
|
|
429
|
-
const findClients = (node) => {
|
|
430
|
-
if (ts.isVariableDeclaration(node) &&
|
|
431
|
-
ts.isIdentifier(node.name) &&
|
|
432
|
-
node.initializer &&
|
|
433
|
-
ts.isCallExpression(node.initializer) &&
|
|
434
|
-
selected.has(node.initializer) &&
|
|
435
|
-
ts.isIdentifier(node.initializer.expression) &&
|
|
436
|
-
symbol(node.initializer.expression) &&
|
|
437
|
-
hooks.has(symbol(node.initializer.expression)))
|
|
438
|
-
clients.add(symbol(node.name));
|
|
439
|
-
ts.forEachChild(node, findClients);
|
|
440
|
-
};
|
|
441
|
-
findClients(source);
|
|
442
|
-
const visit = (node) => {
|
|
443
|
-
if (ts.isCallExpression(node) &&
|
|
444
|
-
selected.has(node) &&
|
|
445
|
-
ts.isPropertyAccessExpression(node.expression) &&
|
|
446
|
-
node.expression.name.text === 'request' &&
|
|
447
|
-
ts.isIdentifier(node.expression.expression) &&
|
|
448
|
-
symbol(node.expression.expression) &&
|
|
449
|
-
clients.has(symbol(node.expression.expression))) {
|
|
450
|
-
const argument = node.arguments[0];
|
|
451
|
-
const value = argument && ts.isObjectLiteralExpression(argument)
|
|
452
|
-
? property(argument, 'path')
|
|
453
|
-
: undefined;
|
|
454
|
-
const declaredMethod = argument && ts.isObjectLiteralExpression(argument)
|
|
455
|
-
? property(argument, 'method')
|
|
456
|
-
: undefined;
|
|
457
|
-
const method = declaredMethod === undefined
|
|
458
|
-
? 'GET'
|
|
459
|
-
: ts.isStringLiteralLike(declaredMethod)
|
|
460
|
-
? declaredMethod.text
|
|
461
|
-
: undefined;
|
|
462
|
-
if (!method)
|
|
463
|
-
return;
|
|
464
|
-
if (value && ts.isStringLiteralLike(value))
|
|
465
|
-
paths.push({ path: value.text, method });
|
|
466
|
-
if (value && ts.isTemplateExpression(value))
|
|
467
|
-
paths.push({
|
|
468
|
-
method,
|
|
469
|
-
path: value.head.text +
|
|
470
|
-
value.templateSpans
|
|
471
|
-
.map((span) => ':dynamic' + span.literal.text)
|
|
472
|
-
.join(''),
|
|
473
|
-
});
|
|
474
|
-
}
|
|
475
|
-
ts.forEachChild(node, visit);
|
|
476
|
-
};
|
|
477
|
-
visit(source);
|
|
478
|
-
return paths;
|
|
479
|
-
}
|
|
480
427
|
function sameApiPath(request, endpoint) {
|
|
481
428
|
const segments = (value) => value.split('?')[0].split('/').filter(Boolean);
|
|
482
429
|
const left = segments(request), right = segments(endpoint);
|