@nocobase/app-plugin-foundation 0.0.0-stage → 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 +46 -0
- package/README.md +96 -2
- package/dist/cli/index.d.ts +4 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +16 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/module-manifest.d.ts +9 -0
- package/dist/cli/module-manifest.d.ts.map +1 -0
- package/dist/cli/module-manifest.js +12 -0
- package/dist/cli/module-manifest.js.map +1 -0
- package/dist/client/api.d.ts +19 -0
- package/dist/client/api.d.ts.map +1 -0
- package/dist/client/api.js +57 -0
- package/dist/client/api.js.map +1 -0
- package/dist/client/business-modules.d.ts +5 -0
- package/dist/client/business-modules.d.ts.map +1 -0
- package/dist/client/business-modules.js +87 -0
- package/dist/client/business-modules.js.map +1 -0
- package/dist/client/components/capability-icons.d.ts +4 -0
- package/dist/client/components/capability-icons.d.ts.map +1 -0
- package/dist/client/components/capability-icons.js +17 -0
- package/dist/client/components/capability-icons.js.map +1 -0
- 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/format.d.ts +7 -0
- package/dist/client/components/format.d.ts.map +1 -0
- package/dist/client/components/format.js +42 -0
- package/dist/client/components/format.js.map +1 -0
- package/dist/client/components/foundation-page.d.ts +16 -0
- package/dist/client/components/foundation-page.d.ts.map +1 -0
- package/dist/client/components/foundation-page.js +217 -0
- package/dist/client/components/foundation-page.js.map +1 -0
- package/dist/client/components/foundation-translation.d.ts +12 -0
- package/dist/client/components/foundation-translation.d.ts.map +1 -0
- package/dist/client/components/foundation-translation.js +19 -0
- package/dist/client/components/foundation-translation.js.map +1 -0
- package/dist/client/components/module-matrix.d.ts +9 -0
- package/dist/client/components/module-matrix.d.ts.map +1 -0
- package/dist/client/components/module-matrix.js +59 -0
- package/dist/client/components/module-matrix.js.map +1 -0
- package/dist/client/components/ui/button.d.ts +8 -0
- package/dist/client/components/ui/button.d.ts.map +1 -0
- package/dist/client/components/ui/button.js +35 -0
- package/dist/client/components/ui/button.js.map +1 -0
- package/dist/client/components/ui/collapsible.d.ts +7 -0
- package/dist/client/components/ui/collapsible.d.ts.map +1 -0
- package/dist/client/components/ui/collapsible.js +13 -0
- package/dist/client/components/ui/collapsible.js.map +1 -0
- 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/table.d.ts +11 -0
- package/dist/client/components/ui/table.d.ts.map +1 -0
- package/dist/client/components/ui/table.js +28 -0
- package/dist/client/components/ui/table.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/index.d.ts +6 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +7 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/locales/de-DE.d.ts +4 -0
- package/dist/client/locales/de-DE.d.ts.map +1 -0
- package/dist/client/locales/de-DE.js +334 -0
- package/dist/client/locales/de-DE.js.map +1 -0
- package/dist/client/locales/en-US.d.ts +336 -0
- package/dist/client/locales/en-US.d.ts.map +1 -0
- package/dist/client/locales/en-US.js +334 -0
- package/dist/client/locales/en-US.js.map +1 -0
- package/dist/client/locales/es-ES.d.ts +4 -0
- package/dist/client/locales/es-ES.d.ts.map +1 -0
- package/dist/client/locales/es-ES.js +335 -0
- package/dist/client/locales/es-ES.js.map +1 -0
- package/dist/client/locales/fr-FR.d.ts +4 -0
- package/dist/client/locales/fr-FR.d.ts.map +1 -0
- package/dist/client/locales/fr-FR.js +335 -0
- package/dist/client/locales/fr-FR.js.map +1 -0
- package/dist/client/locales/id-ID.d.ts +4 -0
- package/dist/client/locales/id-ID.d.ts.map +1 -0
- package/dist/client/locales/id-ID.js +334 -0
- package/dist/client/locales/id-ID.js.map +1 -0
- package/dist/client/locales/index.d.ts +4 -0
- package/dist/client/locales/index.d.ts.map +1 -0
- package/dist/client/locales/index.js +14 -0
- package/dist/client/locales/index.js.map +1 -0
- package/dist/client/locales/ja-JP.d.ts +4 -0
- package/dist/client/locales/ja-JP.d.ts.map +1 -0
- package/dist/client/locales/ja-JP.js +334 -0
- package/dist/client/locales/ja-JP.js.map +1 -0
- package/dist/client/locales/pt-BR.d.ts +4 -0
- package/dist/client/locales/pt-BR.d.ts.map +1 -0
- package/dist/client/locales/pt-BR.js +335 -0
- package/dist/client/locales/pt-BR.js.map +1 -0
- package/dist/client/locales/vi-VN.d.ts +4 -0
- package/dist/client/locales/vi-VN.d.ts.map +1 -0
- package/dist/client/locales/vi-VN.js +334 -0
- package/dist/client/locales/vi-VN.js.map +1 -0
- package/dist/client/locales/zh-CN.d.ts +4 -0
- package/dist/client/locales/zh-CN.d.ts.map +1 -0
- package/dist/client/locales/zh-CN.js +334 -0
- package/dist/client/locales/zh-CN.js.map +1 -0
- package/dist/client/locales/zh-TW.d.ts +4 -0
- package/dist/client/locales/zh-TW.d.ts.map +1 -0
- package/dist/client/locales/zh-TW.js +334 -0
- package/dist/client/locales/zh-TW.js.map +1 -0
- package/dist/client/navigation.d.ts +8 -0
- package/dist/client/navigation.d.ts.map +1 -0
- package/dist/client/navigation.js +21 -0
- package/dist/client/navigation.js.map +1 -0
- package/dist/client/plugin.d.ts +11 -0
- package/dist/client/plugin.d.ts.map +1 -0
- package/dist/client/plugin.js +10 -0
- package/dist/client/plugin.js.map +1 -0
- package/dist/client/provider-inventory.d.ts +6 -0
- package/dist/client/provider-inventory.d.ts.map +1 -0
- package/dist/client/provider-inventory.js +49 -0
- package/dist/client/provider-inventory.js.map +1 -0
- package/dist/client/routes.d.ts +18 -0
- package/dist/client/routes.d.ts.map +1 -0
- package/dist/client/routes.js +41 -0
- package/dist/client/routes.js.map +1 -0
- package/dist/package.d.ts +2 -0
- package/dist/package.d.ts.map +1 -0
- package/dist/package.js +2 -0
- package/dist/package.js.map +1 -0
- 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 +9 -0
- package/dist/server/capabilities/data.d.ts.map +1 -0
- package/dist/server/capabilities/data.js +143 -0
- package/dist/server/capabilities/data.js.map +1 -0
- package/dist/server/capabilities/index.d.ts +5 -0
- package/dist/server/capabilities/index.d.ts.map +1 -0
- package/dist/server/capabilities/index.js +24 -0
- package/dist/server/capabilities/index.js.map +1 -0
- package/dist/server/capabilities/intelligence.d.ts +4 -0
- package/dist/server/capabilities/intelligence.d.ts.map +1 -0
- package/dist/server/capabilities/intelligence.js +105 -0
- package/dist/server/capabilities/intelligence.js.map +1 -0
- package/dist/server/capabilities/messaging.d.ts +4 -0
- package/dist/server/capabilities/messaging.d.ts.map +1 -0
- package/dist/server/capabilities/messaging.js +108 -0
- package/dist/server/capabilities/messaging.js.map +1 -0
- package/dist/server/capabilities/people.d.ts +4 -0
- package/dist/server/capabilities/people.d.ts.map +1 -0
- package/dist/server/capabilities/people.js +151 -0
- package/dist/server/capabilities/people.js.map +1 -0
- package/dist/server/capabilities/platform.d.ts +10 -0
- package/dist/server/capabilities/platform.d.ts.map +1 -0
- package/dist/server/capabilities/platform.js +143 -0
- package/dist/server/capabilities/platform.js.map +1 -0
- package/dist/server/capabilities/processes.d.ts +3 -0
- package/dist/server/capabilities/processes.d.ts.map +1 -0
- package/dist/server/capabilities/processes.js +86 -0
- package/dist/server/capabilities/processes.js.map +1 -0
- package/dist/server/capabilities/types.d.ts +41 -0
- package/dist/server/capabilities/types.d.ts.map +1 -0
- package/dist/server/capabilities/types.js +23 -0
- package/dist/server/capabilities/types.js.map +1 -0
- package/dist/server/catalog.d.ts +3 -0
- package/dist/server/catalog.d.ts.map +1 -0
- package/dist/server/catalog.js +44 -0
- package/dist/server/catalog.js.map +1 -0
- package/dist/server/index.d.ts +6 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +5 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/inventory.d.ts +54 -0
- package/dist/server/inventory.d.ts.map +1 -0
- package/dist/server/inventory.js +184 -0
- package/dist/server/inventory.js.map +1 -0
- package/dist/server/module-manifest.d.ts +10 -0
- package/dist/server/module-manifest.d.ts.map +1 -0
- package/dist/server/module-manifest.js +66 -0
- package/dist/server/module-manifest.js.map +1 -0
- package/dist/server/module-sources.d.ts +5 -0
- package/dist/server/module-sources.d.ts.map +1 -0
- package/dist/server/module-sources.js +482 -0
- package/dist/server/module-sources.js.map +1 -0
- package/dist/server/packages.d.ts +18 -0
- package/dist/server/packages.d.ts.map +1 -0
- package/dist/server/packages.js +62 -0
- package/dist/server/packages.js.map +1 -0
- package/dist/server/plugin.d.ts +4 -0
- package/dist/server/plugin.d.ts.map +1 -0
- package/dist/server/plugin.js +12 -0
- package/dist/server/plugin.js.map +1 -0
- package/dist/server/provider-inventory.d.ts +13 -0
- package/dist/server/provider-inventory.d.ts.map +1 -0
- package/dist/server/provider-inventory.js +180 -0
- package/dist/server/provider-inventory.js.map +1 -0
- package/dist/server/providers/foundation.d.ts +7 -0
- package/dist/server/providers/foundation.d.ts.map +1 -0
- package/dist/server/providers/foundation.js +24 -0
- package/dist/server/providers/foundation.js.map +1 -0
- package/dist/server/providers/index.d.ts +4 -0
- package/dist/server/providers/index.d.ts.map +1 -0
- package/dist/server/providers/index.js +6 -0
- package/dist/server/providers/index.js.map +1 -0
- 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 +6 -0
- package/dist/server/routes/index.d.ts.map +1 -0
- package/dist/server/routes/index.js +77 -0
- package/dist/server/routes/index.js.map +1 -0
- package/dist/server/routes/schemas.d.ts +13 -0
- package/dist/server/routes/schemas.d.ts.map +1 -0
- package/dist/server/routes/schemas.js +160 -0
- package/dist/server/routes/schemas.js.map +1 -0
- package/dist/server/services/foundation.d.ts +44 -0
- package/dist/server/services/foundation.d.ts.map +1 -0
- package/dist/server/services/foundation.js +265 -0
- package/dist/server/services/foundation.js.map +1 -0
- package/dist/server/source-evidence.d.ts +26 -0
- package/dist/server/source-evidence.d.ts.map +1 -0
- package/dist/server/source-evidence.js +271 -0
- package/dist/server/source-evidence.js.map +1 -0
- 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 +18 -0
- package/dist/server/tokens.d.ts.map +1 -0
- package/dist/server/tokens.js +3 -0
- package/dist/server/tokens.js.map +1 -0
- package/dist/shared/available-capabilities.d.ts +6 -0
- package/dist/shared/available-capabilities.d.ts.map +1 -0
- package/dist/shared/available-capabilities.js +66 -0
- package/dist/shared/available-capabilities.js.map +1 -0
- package/dist/shared/foundation.d.ts +155 -0
- package/dist/shared/foundation.d.ts.map +1 -0
- package/dist/shared/foundation.js +39 -0
- package/dist/shared/foundation.js.map +1 -0
- package/package.json +106 -3
- package/skills/nocobase-app-plugin-foundation/SKILL.md +78 -0
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import type { CollectionDefinition, DatabaseManager, RepositoryFilter, RepositoryRecord } from '@nocobase/db';
|
|
2
|
+
import type { FoundationIssue } from '../shared/foundation.js';
|
|
3
|
+
import { ReadQueue } from './read-queue.js';
|
|
4
|
+
/** One Collection as the default connection lists it: logical name, table, kind and title. */
|
|
5
|
+
export type CollectionSummary = Awaited<ReturnType<ReturnType<DatabaseManager['collections']>['list']>>['items'][number];
|
|
6
|
+
/** The Collections of the default connection, read once per overview and shared by every capability. */
|
|
7
|
+
export declare class Inventory {
|
|
8
|
+
readonly database: DatabaseManager;
|
|
9
|
+
readonly collections: readonly CollectionSummary[];
|
|
10
|
+
readonly reads: ReadQueue;
|
|
11
|
+
private readonly definitions;
|
|
12
|
+
private constructor();
|
|
13
|
+
/** Lists every Collection of the default connection. Throws when the database cannot be read at all. */
|
|
14
|
+
static read(database: DatabaseManager, reads?: ReadQueue, signal?: AbortSignal): Promise<Inventory>;
|
|
15
|
+
has(name: string): boolean;
|
|
16
|
+
definition(name: string, signal?: AbortSignal): Promise<CollectionDefinition | undefined>;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Reads for one capability. Every read answers `null` instead of throwing and records what it could not read, so one
|
|
20
|
+
* unreadable source leaves the rest of the capability standing and is never mistaken for zero.
|
|
21
|
+
*/
|
|
22
|
+
export declare class Probe {
|
|
23
|
+
readonly inventory: Inventory;
|
|
24
|
+
readonly signal: AbortSignal | undefined;
|
|
25
|
+
readonly issues: FoundationIssue[];
|
|
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[]>;
|
|
29
|
+
has(name: string): boolean;
|
|
30
|
+
fieldNames(name: string): Promise<readonly string[] | null>;
|
|
31
|
+
count(name: string, filter?: RepositoryFilter<RepositoryRecord>): Promise<number | null>;
|
|
32
|
+
/** Records per value of `field`, such as deliveries per status. */
|
|
33
|
+
groupCount(name: string, field: string): Promise<ReadonlyMap<string, number> | null>;
|
|
34
|
+
sum(name: string, field: string): Promise<number | null>;
|
|
35
|
+
/** Read configuration Collections in stable pages; never present a truncated prefix as a complete total. */
|
|
36
|
+
records(name: string, pageSize?: number): Promise<readonly Record<string, unknown>[] | null>;
|
|
37
|
+
/**
|
|
38
|
+
* Rows of a table the database layer keeps for itself, such as the migration history, which no Collection
|
|
39
|
+
* describes.
|
|
40
|
+
*/
|
|
41
|
+
internalCount(table: string, where?: {
|
|
42
|
+
readonly column: string;
|
|
43
|
+
readonly value: string;
|
|
44
|
+
}): Promise<number | null>;
|
|
45
|
+
internalMax(table: string, column: string): Promise<unknown>;
|
|
46
|
+
private read;
|
|
47
|
+
private unreadable;
|
|
48
|
+
}
|
|
49
|
+
/** Adds counts, keeping track of whether every one of them could be read. */
|
|
50
|
+
export declare function total(values: readonly (number | null)[]): {
|
|
51
|
+
readonly value: number | null;
|
|
52
|
+
readonly complete: boolean;
|
|
53
|
+
};
|
|
54
|
+
//# sourceMappingURL=inventory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inventory.d.ts","sourceRoot":"","sources":["../../server/inventory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,184 @@
|
|
|
1
|
+
import { ReadQueue } from './read-queue.js';
|
|
2
|
+
/** The Collections of the default connection, read once per overview and shared by every capability. */
|
|
3
|
+
export class Inventory {
|
|
4
|
+
database;
|
|
5
|
+
collections;
|
|
6
|
+
reads;
|
|
7
|
+
definitions = new Map();
|
|
8
|
+
constructor(database, collections, reads) {
|
|
9
|
+
this.database = database;
|
|
10
|
+
this.collections = collections;
|
|
11
|
+
this.reads = reads;
|
|
12
|
+
}
|
|
13
|
+
/** Lists every Collection of the default connection. Throws when the database cannot be read at all. */
|
|
14
|
+
static async read(database, reads = new ReadQueue(), signal) {
|
|
15
|
+
const collections = [];
|
|
16
|
+
let cursor;
|
|
17
|
+
do {
|
|
18
|
+
const page = await reads.run(() => database
|
|
19
|
+
.collections()
|
|
20
|
+
.list({ limit: 500, ...(cursor === undefined ? {} : { cursor }) }), signal);
|
|
21
|
+
collections.push(...page.items);
|
|
22
|
+
cursor = page.nextCursor;
|
|
23
|
+
} while (cursor !== undefined);
|
|
24
|
+
return new Inventory(database, collections, reads);
|
|
25
|
+
}
|
|
26
|
+
has(name) {
|
|
27
|
+
return this.collections.some((collection) => collection.name === name);
|
|
28
|
+
}
|
|
29
|
+
definition(name, signal) {
|
|
30
|
+
let pending = this.definitions.get(name);
|
|
31
|
+
if (!pending) {
|
|
32
|
+
pending = this.reads.run(() => this.database.collections().get(name), signal);
|
|
33
|
+
this.definitions.set(name, pending);
|
|
34
|
+
}
|
|
35
|
+
return pending;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
/**
|
|
39
|
+
* Reads for one capability. Every read answers `null` instead of throwing and records what it could not read, so one
|
|
40
|
+
* unreadable source leaves the rest of the capability standing and is never mistaken for zero.
|
|
41
|
+
*/
|
|
42
|
+
export class Probe {
|
|
43
|
+
inventory;
|
|
44
|
+
signal;
|
|
45
|
+
issues = [];
|
|
46
|
+
constructor(inventory, signal = undefined) {
|
|
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;
|
|
62
|
+
}
|
|
63
|
+
has(name) {
|
|
64
|
+
return this.inventory.has(name);
|
|
65
|
+
}
|
|
66
|
+
async fieldNames(name) {
|
|
67
|
+
try {
|
|
68
|
+
const definition = await this.inventory.definition(name, this.signal);
|
|
69
|
+
return (definition?.fields ?? []).map((field) => field.name);
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
this.unreadable(name);
|
|
73
|
+
return null;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
count(name, filter) {
|
|
77
|
+
return this.read(name, () => this.inventory.database
|
|
78
|
+
.repository(name)
|
|
79
|
+
.count(filter === undefined ? {} : { filter }));
|
|
80
|
+
}
|
|
81
|
+
/** Records per value of `field`, such as deliveries per status. */
|
|
82
|
+
groupCount(name, field) {
|
|
83
|
+
return this.read(name, async () => {
|
|
84
|
+
const groups = await this.inventory.database
|
|
85
|
+
.repository(name)
|
|
86
|
+
.groupBy({
|
|
87
|
+
by: [field],
|
|
88
|
+
aggregate: (aggregate) => ({ count: aggregate.count() }),
|
|
89
|
+
});
|
|
90
|
+
return new Map(groups.map((group) => [groupKey(group[field]), Number(group.count)]));
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
sum(name, field) {
|
|
94
|
+
return this.read(name, async () => {
|
|
95
|
+
const result = await this.inventory.database
|
|
96
|
+
.repository(name)
|
|
97
|
+
.aggregate({
|
|
98
|
+
aggregate: (aggregate) => ({ total: aggregate.sum(field) }),
|
|
99
|
+
});
|
|
100
|
+
return Number(result.total ?? 0);
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/** Read configuration Collections in stable pages; never present a truncated prefix as a complete total. */
|
|
104
|
+
records(name, pageSize = 1000) {
|
|
105
|
+
return this.read(name, async () => {
|
|
106
|
+
if (!Number.isSafeInteger(pageSize) || pageSize < 1)
|
|
107
|
+
throw new RangeError('Configuration page size must be a positive integer.');
|
|
108
|
+
const records = [];
|
|
109
|
+
const repository = this.inventory.database.repository(name);
|
|
110
|
+
for (let offset = 0;; offset += pageSize) {
|
|
111
|
+
this.signal?.throwIfAborted();
|
|
112
|
+
const page = await repository.findMany({
|
|
113
|
+
limit: pageSize,
|
|
114
|
+
offset,
|
|
115
|
+
sort: (sort) => sort.field('id').asc(),
|
|
116
|
+
});
|
|
117
|
+
records.push(...page);
|
|
118
|
+
if (page.length < pageSize)
|
|
119
|
+
return records;
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* Rows of a table the database layer keeps for itself, such as the migration history, which no Collection
|
|
125
|
+
* describes.
|
|
126
|
+
*/
|
|
127
|
+
internalCount(table, where) {
|
|
128
|
+
return this.read(table, async () => {
|
|
129
|
+
let query = this.inventory.database
|
|
130
|
+
.query()
|
|
131
|
+
.selectFrom(table)
|
|
132
|
+
.select((expression) => [expression.fn.countAll().as('count')]);
|
|
133
|
+
if (where)
|
|
134
|
+
query = query.where(where.column, '=', where.value);
|
|
135
|
+
const row = await query.executeTakeFirst();
|
|
136
|
+
return Number(row?.count ?? 0);
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
internalMax(table, column) {
|
|
140
|
+
return this.read(table, async () => {
|
|
141
|
+
const row = await this.inventory.database
|
|
142
|
+
.query()
|
|
143
|
+
.selectFrom(table)
|
|
144
|
+
.select((expression) => [expression.fn.max(column).as('latest')])
|
|
145
|
+
.executeTakeFirst();
|
|
146
|
+
return row?.latest ?? null;
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
async read(source, run) {
|
|
150
|
+
try {
|
|
151
|
+
return await this.inventory.reads.run(run, this.signal);
|
|
152
|
+
}
|
|
153
|
+
catch {
|
|
154
|
+
// The cause is not kept: a driver's error can quote the host, database and account it failed to reach.
|
|
155
|
+
this.unreadable(source);
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
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
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/** A grouped value as a map key: statuses and names are strings, an absent value is the empty string. */
|
|
165
|
+
function groupKey(value) {
|
|
166
|
+
if (value === null || value === undefined)
|
|
167
|
+
return '';
|
|
168
|
+
return typeof value === 'string' ||
|
|
169
|
+
typeof value === 'number' ||
|
|
170
|
+
typeof value === 'boolean'
|
|
171
|
+
? String(value)
|
|
172
|
+
: JSON.stringify(value);
|
|
173
|
+
}
|
|
174
|
+
/** Adds counts, keeping track of whether every one of them could be read. */
|
|
175
|
+
export function total(values) {
|
|
176
|
+
const known = values.filter((value) => value !== null);
|
|
177
|
+
return {
|
|
178
|
+
value: known.length === 0 && values.length > 0
|
|
179
|
+
? null
|
|
180
|
+
: known.reduce((sum, value) => sum + value, 0),
|
|
181
|
+
complete: known.length === values.length,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
//# sourceMappingURL=inventory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inventory.js","sourceRoot":"","sources":["../../server/inventory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { FoundationModuleSources } from '../shared/foundation.js';
|
|
2
|
+
export declare const MODULE_MANIFEST_FILE: string;
|
|
3
|
+
/** Deployment metadata contains association evidence only, never source text or filesystem locations. */
|
|
4
|
+
export declare function readModuleManifest(rootDir: string, packageName: string): Promise<FoundationModuleSources | undefined>;
|
|
5
|
+
/** Repeat builds converge on the same bytes; replace the artifact only after a complete write. */
|
|
6
|
+
export declare function writeModuleManifest(rootDir: string): Promise<{
|
|
7
|
+
readonly routes: number;
|
|
8
|
+
readonly complete: boolean;
|
|
9
|
+
}>;
|
|
10
|
+
//# sourceMappingURL=module-manifest.d.ts.map
|
|
@@ -0,0 +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;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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { mkdir, readFile, rename, stat, writeFile } from 'node:fs/promises';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
export const MODULE_MANIFEST_FILE = 'foundation-modules.json';
|
|
5
|
+
const manifestSchema = z
|
|
6
|
+
.object({
|
|
7
|
+
schemaVersion: z.literal(1),
|
|
8
|
+
packageName: z.string(),
|
|
9
|
+
sources: z
|
|
10
|
+
.object({
|
|
11
|
+
complete: z.boolean(),
|
|
12
|
+
routes: z
|
|
13
|
+
.array(z
|
|
14
|
+
.object({
|
|
15
|
+
packageName: z.string(),
|
|
16
|
+
routeName: z.string(),
|
|
17
|
+
providers: z.array(z.string()),
|
|
18
|
+
apiProviders: z.array(z.string()).optional(),
|
|
19
|
+
collections: z.array(z.string()).optional(),
|
|
20
|
+
complete: z.boolean(),
|
|
21
|
+
})
|
|
22
|
+
.strict())
|
|
23
|
+
.max(10000),
|
|
24
|
+
})
|
|
25
|
+
.strict(),
|
|
26
|
+
})
|
|
27
|
+
.strict();
|
|
28
|
+
/** Deployment metadata contains association evidence only, never source text or filesystem locations. */
|
|
29
|
+
export async function readModuleManifest(rootDir, packageName) {
|
|
30
|
+
const file = path.join(rootDir, 'server', MODULE_MANIFEST_FILE);
|
|
31
|
+
try {
|
|
32
|
+
if ((await stat(file)).size > 5_000_000)
|
|
33
|
+
return undefined;
|
|
34
|
+
const parsed = manifestSchema.safeParse(JSON.parse(await readFile(file, 'utf8')));
|
|
35
|
+
if (!parsed.success ||
|
|
36
|
+
parsed.data.packageName !== packageName ||
|
|
37
|
+
parsed.data.sources.routes.some((route) => route.packageName !== packageName))
|
|
38
|
+
return undefined;
|
|
39
|
+
return parsed.data.sources;
|
|
40
|
+
}
|
|
41
|
+
catch {
|
|
42
|
+
return undefined;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
/** Repeat builds converge on the same bytes; replace the artifact only after a complete write. */
|
|
46
|
+
export async function writeModuleManifest(rootDir) {
|
|
47
|
+
const { collectModuleSources } = await import('./module-sources.js');
|
|
48
|
+
const manifest = JSON.parse(await readFile(path.join(rootDir, 'package.json'), 'utf8'));
|
|
49
|
+
const sources = await collectModuleSources(rootDir);
|
|
50
|
+
const document = manifestSchema.parse({
|
|
51
|
+
schemaVersion: 1,
|
|
52
|
+
packageName: manifest.name,
|
|
53
|
+
sources,
|
|
54
|
+
});
|
|
55
|
+
const file = path.join(rootDir, 'dist', 'server', MODULE_MANIFEST_FILE);
|
|
56
|
+
const contents = JSON.stringify(document) + '\n';
|
|
57
|
+
await mkdir(path.dirname(file), { recursive: true });
|
|
58
|
+
const previous = await readFile(file, 'utf8').catch(() => undefined);
|
|
59
|
+
if (previous !== contents) {
|
|
60
|
+
const temporary = `${file}.${process.pid}.tmp`;
|
|
61
|
+
await writeFile(temporary, contents);
|
|
62
|
+
await rename(temporary, file);
|
|
63
|
+
}
|
|
64
|
+
return { routes: sources.routes.length, complete: sources.complete };
|
|
65
|
+
}
|
|
66
|
+
//# sourceMappingURL=module-manifest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"module-manifest.js","sourceRoot":"","sources":["../../server/module-manifest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type { FoundationModuleSources } from '../shared/foundation.js';
|
|
2
|
+
import type { RuntimeProviderEvidence } from './provider-inventory.js';
|
|
3
|
+
/** Reads static declarations and value imports only. Never imports an application module or invokes a loader. */
|
|
4
|
+
export declare function collectModuleSources(rootDir: string, runtime?: readonly RuntimeProviderEvidence[]): Promise<FoundationModuleSources>;
|
|
5
|
+
//# sourceMappingURL=module-sources.d.ts.map
|
|
@@ -0,0 +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;AAiBvE,iHAAiH;AACjH,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,MAAM,EACf,OAAO,GAAE,SAAS,uBAAuB,EAAO,GAC/C,OAAO,CAAC,uBAAuB,CAAC,CA+FlC"}
|