@nocobase/app-plugin-foundation 0.0.0-stage → 0.1.0-beta.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/CHANGELOG.md +32 -0
- package/README.md +86 -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 +17 -0
- package/dist/client/api.d.ts.map +1 -0
- package/dist/client/api.js +51 -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 +81 -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/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 +15 -0
- package/dist/client/components/foundation-page.d.ts.map +1 -0
- package/dist/client/components/foundation-page.js +207 -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 +56 -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/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/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 +315 -0
- package/dist/client/locales/de-DE.js.map +1 -0
- package/dist/client/locales/en-US.d.ts +317 -0
- package/dist/client/locales/en-US.d.ts.map +1 -0
- package/dist/client/locales/en-US.js +315 -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 +316 -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 +316 -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 +315 -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 +315 -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 +316 -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 +315 -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 +315 -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 +315 -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/capabilities/data.d.ts +7 -0
- package/dist/server/capabilities/data.d.ts.map +1 -0
- package/dist/server/capabilities/data.js +108 -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 +97 -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 +38 -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 +48 -0
- package/dist/server/inventory.d.ts.map +1 -0
- package/dist/server/inventory.js +158 -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 +65 -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 +535 -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/routes/index.d.ts +6 -0
- package/dist/server/routes/index.d.ts.map +1 -0
- package/dist/server/routes/index.js +54 -0
- package/dist/server/routes/index.js.map +1 -0
- package/dist/server/routes/schemas.d.ts +7 -0
- package/dist/server/routes/schemas.d.ts.map +1 -0
- package/dist/server/routes/schemas.js +138 -0
- package/dist/server/routes/schemas.js.map +1 -0
- package/dist/server/services/foundation.d.ts +37 -0
- package/dist/server/services/foundation.d.ts.map +1 -0
- package/dist/server/services/foundation.js +175 -0
- package/dist/server/services/foundation.js.map +1 -0
- package/dist/server/source-evidence.d.ts +19 -0
- package/dist/server/source-evidence.d.ts.map +1 -0
- package/dist/server/source-evidence.js +169 -0
- package/dist/server/source-evidence.js.map +1 -0
- package/dist/server/tokens.d.ts +12 -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 +142 -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 +68 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import { cachingToken } from '@nocobase/app-server/caching';
|
|
2
|
+
import { i18nToken } from '@nocobase/app-server/i18n';
|
|
3
|
+
import { jobExecutorServiceToken } from '@nocobase/app-server/jobs';
|
|
4
|
+
import { queueServiceToken } from '@nocobase/app-server/queue';
|
|
5
|
+
import { secretsServiceToken } from '@nocobase/app-server/secrets';
|
|
6
|
+
import { fact, metric, NO_DATABASE, } from './types.js';
|
|
7
|
+
export const integrations = {
|
|
8
|
+
key: 'integrations',
|
|
9
|
+
packages: ['@nocobase/app-plugin-api-keys'],
|
|
10
|
+
async collect({ probe }) {
|
|
11
|
+
if (!probe)
|
|
12
|
+
return NO_DATABASE;
|
|
13
|
+
if (!probe.has('apikey'))
|
|
14
|
+
return { status: 'unused', reason: 'notRegistered' };
|
|
15
|
+
const [enabled, used] = await Promise.all([
|
|
16
|
+
probe.count('apikey', { enabled: true }),
|
|
17
|
+
// A key someone has called the API with; holding one proves nothing about an integration.
|
|
18
|
+
probe.count('apikey', (filter) => filter.and([
|
|
19
|
+
filter.boolean('enabled').isTrue(),
|
|
20
|
+
filter.date('lastRequest').notEmpty(),
|
|
21
|
+
])),
|
|
22
|
+
]);
|
|
23
|
+
const active = (used ?? 0) > 0;
|
|
24
|
+
return {
|
|
25
|
+
status: active ? 'active' : 'unused',
|
|
26
|
+
...(active
|
|
27
|
+
? {}
|
|
28
|
+
: { reason: (enabled ?? 0) > 0 ? 'noUsedApiKey' : 'noApiKey' }),
|
|
29
|
+
facts: active ? [fact('usedApiKeys', { count: used ?? 0 })] : [],
|
|
30
|
+
metrics: [metric('usedApiKeys', used), metric('apiKeys', enabled)],
|
|
31
|
+
};
|
|
32
|
+
},
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* What the server can tell about the interface: whether the NocoBase client serves it and which languages the
|
|
36
|
+
* application offers. The page adds the pages and menu entries it registers, which only the browser knows.
|
|
37
|
+
*/
|
|
38
|
+
export const userInterface = {
|
|
39
|
+
key: 'interface',
|
|
40
|
+
packages: [
|
|
41
|
+
'@nocobase/app-client',
|
|
42
|
+
'@nocobase/i18n',
|
|
43
|
+
'@nocobase/app-plugin-i18n',
|
|
44
|
+
],
|
|
45
|
+
collect({ container, hasClient }) {
|
|
46
|
+
if (!hasClient)
|
|
47
|
+
return Promise.resolve({ status: 'unused', reason: 'noClient' });
|
|
48
|
+
const locales = container.has(i18nToken)
|
|
49
|
+
? container.resolve(i18nToken).getLocales()
|
|
50
|
+
: undefined;
|
|
51
|
+
return Promise.resolve({
|
|
52
|
+
status: 'active',
|
|
53
|
+
facts: locales === undefined
|
|
54
|
+
? []
|
|
55
|
+
: [fact('locales', { count: locales.length, names: [...locales] })],
|
|
56
|
+
metrics: locales === undefined ? [] : [metric('locales', locales.length)],
|
|
57
|
+
});
|
|
58
|
+
},
|
|
59
|
+
};
|
|
60
|
+
export const audit = {
|
|
61
|
+
key: 'audit',
|
|
62
|
+
packages: [],
|
|
63
|
+
collect() {
|
|
64
|
+
// No supported audit collector exists yet. Other providers may supply audit capabilities; do not claim their
|
|
65
|
+
// absence or use lifecycle history as a substitute for an operation audit.
|
|
66
|
+
return Promise.resolve({ status: 'unused', reason: 'noRecognizedAudit' });
|
|
67
|
+
},
|
|
68
|
+
};
|
|
69
|
+
/** The migration history the database layer keeps (`DEFAULT_MIGRATION_TABLE` in `@nocobase/db`). */
|
|
70
|
+
const MIGRATIONS_TABLE = '__nocobase_migrations';
|
|
71
|
+
const SEEDS_TABLE = '__nocobase_seeds';
|
|
72
|
+
const INFRASTRUCTURE = [
|
|
73
|
+
{ key: 'jobs', token: jobExecutorServiceToken },
|
|
74
|
+
{ key: 'queue', token: queueServiceToken },
|
|
75
|
+
{ key: 'secrets', token: secretsServiceToken },
|
|
76
|
+
{ key: 'caching', token: cachingToken },
|
|
77
|
+
];
|
|
78
|
+
export const operations = {
|
|
79
|
+
key: 'operations',
|
|
80
|
+
packages: [
|
|
81
|
+
'@nocobase/app-server',
|
|
82
|
+
'@nocobase/app-cli',
|
|
83
|
+
'@nocobase/jobs',
|
|
84
|
+
'@nocobase/queue',
|
|
85
|
+
'@nocobase/caching',
|
|
86
|
+
'@nocobase/secrets',
|
|
87
|
+
],
|
|
88
|
+
async collect({ probe, container, applicationName }) {
|
|
89
|
+
const parts = INFRASTRUCTURE.map(({ key, token }) => container.has(token)
|
|
90
|
+
? { key, status: 'active' }
|
|
91
|
+
: { key, status: 'unused', reason: 'notConfigured' });
|
|
92
|
+
if (!probe)
|
|
93
|
+
return { ...NO_DATABASE, parts };
|
|
94
|
+
const [migrations, ownMigrations, seeds, latest] = await Promise.all([
|
|
95
|
+
probe.internalCount(MIGRATIONS_TABLE),
|
|
96
|
+
applicationName === undefined
|
|
97
|
+
? Promise.resolve(null)
|
|
98
|
+
: probe.internalCount(MIGRATIONS_TABLE, {
|
|
99
|
+
column: 'package_name',
|
|
100
|
+
value: applicationName,
|
|
101
|
+
}),
|
|
102
|
+
probe.internalCount(SEEDS_TABLE),
|
|
103
|
+
probe.internalMax(MIGRATIONS_TABLE, 'executed_at'),
|
|
104
|
+
]);
|
|
105
|
+
const latestAt = toIsoTime(latest);
|
|
106
|
+
return {
|
|
107
|
+
status: 'active',
|
|
108
|
+
facts: [
|
|
109
|
+
...(migrations === null
|
|
110
|
+
? []
|
|
111
|
+
: [
|
|
112
|
+
fact('migrations', {
|
|
113
|
+
count: migrations,
|
|
114
|
+
own: ownMigrations ?? 0,
|
|
115
|
+
}),
|
|
116
|
+
]),
|
|
117
|
+
...(latestAt === undefined
|
|
118
|
+
? []
|
|
119
|
+
: [fact('latestMigration', { at: latestAt })]),
|
|
120
|
+
],
|
|
121
|
+
metrics: [
|
|
122
|
+
metric('migrations', migrations),
|
|
123
|
+
metric('applicationMigrations', ownMigrations),
|
|
124
|
+
metric('seeds', seeds),
|
|
125
|
+
],
|
|
126
|
+
parts: [{ key: 'migrations', status: 'active' }, ...parts],
|
|
127
|
+
};
|
|
128
|
+
},
|
|
129
|
+
};
|
|
130
|
+
/** The history stores times as epoch milliseconds or as a date string, depending on the dialect. */
|
|
131
|
+
function toIsoTime(value) {
|
|
132
|
+
const time = value instanceof Date
|
|
133
|
+
? value.getTime()
|
|
134
|
+
: typeof value === 'number'
|
|
135
|
+
? value
|
|
136
|
+
: typeof value === 'string'
|
|
137
|
+
? /^\d+$/.test(value)
|
|
138
|
+
? Number(value)
|
|
139
|
+
: Date.parse(value)
|
|
140
|
+
: Number.NaN;
|
|
141
|
+
return Number.isFinite(time) ? new Date(time).toISOString() : undefined;
|
|
142
|
+
}
|
|
143
|
+
//# sourceMappingURL=platform.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform.js","sourceRoot":"","sources":["../../../server/capabilities/platform.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processes.d.ts","sourceRoot":"","sources":["../../../server/capabilities/processes.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,mBAAmB,EAEzB,MAAM,YAAY,CAAC;AAEpB,eAAO,MAAM,SAAS,EAAE,mBAyFvB,CAAC"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { countOf, fact, metric, NO_DATABASE, } from './types.js';
|
|
2
|
+
export const workflows = {
|
|
3
|
+
key: 'workflows',
|
|
4
|
+
packages: ['@nocobase/lifecycle', '@nocobase/app-plugin-scheduler'],
|
|
5
|
+
async collect({ probe }) {
|
|
6
|
+
if (!probe)
|
|
7
|
+
return NO_DATABASE;
|
|
8
|
+
const findings = [];
|
|
9
|
+
const parts = [];
|
|
10
|
+
// The lifecycle store's two Collections exist once the application persists its lifecycles, which is the
|
|
11
|
+
// integration itself: a lifecycle nobody has moved yet is still in use.
|
|
12
|
+
if (probe.has('lifecycleTransitions')) {
|
|
13
|
+
const byLifecycle = await probe.groupCount('lifecycleTransitions', 'lifecycle');
|
|
14
|
+
const effects = probe.has('lifecycleEffectRuns')
|
|
15
|
+
? await probe.groupCount('lifecycleEffectRuns', 'status')
|
|
16
|
+
: new Map();
|
|
17
|
+
const transitions = byLifecycle === null
|
|
18
|
+
? null
|
|
19
|
+
: [...byLifecycle.values()].reduce((sum, count) => sum + count, 0);
|
|
20
|
+
parts.push({ key: 'lifecycles', status: 'active' });
|
|
21
|
+
findings.push({
|
|
22
|
+
status: 'active',
|
|
23
|
+
facts: [
|
|
24
|
+
byLifecycle === null || byLifecycle.size === 0
|
|
25
|
+
? fact('lifecyclesWithoutTransitions')
|
|
26
|
+
: fact('lifecycles', {
|
|
27
|
+
count: byLifecycle.size,
|
|
28
|
+
names: [...byLifecycle.keys()],
|
|
29
|
+
transitions: transitions ?? 0,
|
|
30
|
+
}),
|
|
31
|
+
],
|
|
32
|
+
metrics: [
|
|
33
|
+
metric('transitions', transitions),
|
|
34
|
+
metric('lifecycles', byLifecycle?.size ?? null),
|
|
35
|
+
metric('effectsSucceeded', countOf(effects, ['succeeded'])),
|
|
36
|
+
metric('effectsFailed', countOf(effects, ['failed', 'dead'])),
|
|
37
|
+
metric('effectsPending', countOf(effects, ['queued', 'running'])),
|
|
38
|
+
],
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
else {
|
|
42
|
+
parts.push({
|
|
43
|
+
key: 'lifecycles',
|
|
44
|
+
status: 'unused',
|
|
45
|
+
reason: 'notRegistered',
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
if (probe.has('scheduleDefinitions')) {
|
|
49
|
+
const enabled = await probe.count('scheduleDefinitions', {
|
|
50
|
+
enabled: true,
|
|
51
|
+
});
|
|
52
|
+
const occurrences = probe.has('scheduleOccurrences')
|
|
53
|
+
? await probe.count('scheduleOccurrences')
|
|
54
|
+
: null;
|
|
55
|
+
const active = (enabled ?? 0) > 0;
|
|
56
|
+
parts.push(active
|
|
57
|
+
? { key: 'schedules', status: 'active' }
|
|
58
|
+
: { key: 'schedules', status: 'unused', reason: 'noSchedules' });
|
|
59
|
+
if (active)
|
|
60
|
+
findings.push({
|
|
61
|
+
status: 'active',
|
|
62
|
+
facts: [fact('schedules', { count: enabled ?? 0 })],
|
|
63
|
+
metrics: [
|
|
64
|
+
metric('schedules', enabled),
|
|
65
|
+
metric('scheduleOccurrences', occurrences),
|
|
66
|
+
],
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
parts.push({
|
|
71
|
+
key: 'schedules',
|
|
72
|
+
status: 'unused',
|
|
73
|
+
reason: 'notRegistered',
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
if (findings.length === 0)
|
|
77
|
+
return { status: 'unused', reason: 'noWorkflows', parts };
|
|
78
|
+
return {
|
|
79
|
+
status: 'active',
|
|
80
|
+
facts: findings.flatMap((finding) => finding.facts ?? []),
|
|
81
|
+
metrics: findings.flatMap((finding) => finding.metrics ?? []),
|
|
82
|
+
parts,
|
|
83
|
+
};
|
|
84
|
+
},
|
|
85
|
+
};
|
|
86
|
+
//# sourceMappingURL=processes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"processes.js","sourceRoot":"","sources":["../../../server/capabilities/processes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { AppConfigAccessor } from '@nocobase/app-server/config';
|
|
2
|
+
import type { ServiceContainer } from '@nocobase/service-provider';
|
|
3
|
+
import type { FoundationCapabilityKey, FoundationFact, FoundationMetric, FoundationMetricUnit, FoundationPart, FoundationStatus } from '../../shared/foundation.js';
|
|
4
|
+
import type { Probe } from '../inventory.js';
|
|
5
|
+
export interface CollectorContext {
|
|
6
|
+
/** Reads of the default connection; absent when the application runs without a database. */
|
|
7
|
+
readonly probe: Probe | undefined;
|
|
8
|
+
readonly container: ServiceContainer;
|
|
9
|
+
readonly config: Pick<AppConfigAccessor, 'get'>;
|
|
10
|
+
/** The application's package name, which its own migrations are recorded under. */
|
|
11
|
+
readonly applicationName: string | undefined;
|
|
12
|
+
/** Whether the application ships a client the NocoBase client runtime serves. */
|
|
13
|
+
readonly hasClient: boolean;
|
|
14
|
+
}
|
|
15
|
+
/** What one capability's collector established. The service adds packages, completeness and issues. */
|
|
16
|
+
export interface CapabilityFindings {
|
|
17
|
+
readonly status: FoundationStatus;
|
|
18
|
+
readonly reason?: string;
|
|
19
|
+
readonly facts?: readonly FoundationFact[];
|
|
20
|
+
readonly metrics?: readonly FoundationMetric[];
|
|
21
|
+
readonly parts?: readonly FoundationPart[];
|
|
22
|
+
}
|
|
23
|
+
export interface CapabilityCollector {
|
|
24
|
+
readonly key: FoundationCapabilityKey;
|
|
25
|
+
/** The NocoBase packages that provide it; only those the application resolves are reported. */
|
|
26
|
+
readonly packages: readonly string[];
|
|
27
|
+
collect(context: CollectorContext): Promise<CapabilityFindings>;
|
|
28
|
+
}
|
|
29
|
+
export declare function metric(key: string, value: number | null, options?: {
|
|
30
|
+
readonly unit?: FoundationMetricUnit;
|
|
31
|
+
readonly complete?: boolean;
|
|
32
|
+
}): FoundationMetric;
|
|
33
|
+
export declare function fact(code: string, params?: FoundationFact['params']): FoundationFact;
|
|
34
|
+
/** Sums the counts of the given keys in a per-status map. */
|
|
35
|
+
export declare function countOf(groups: ReadonlyMap<string, number> | null, keys: readonly string[]): number | null;
|
|
36
|
+
/** A capability whose evidence lives in a database the application runs without. */
|
|
37
|
+
export declare const NO_DATABASE: CapabilityFindings;
|
|
38
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +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;CAC7B;AAED,uGAAuG;AACvG,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,MAAM,EAAE,gBAAgB,CAAC;IAClC,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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
export function metric(key, value, options = {}) {
|
|
2
|
+
return {
|
|
3
|
+
key,
|
|
4
|
+
value,
|
|
5
|
+
unit: options.unit ?? 'count',
|
|
6
|
+
complete: value !== null && (options.complete ?? true),
|
|
7
|
+
};
|
|
8
|
+
}
|
|
9
|
+
export function fact(code, params) {
|
|
10
|
+
return params === undefined ? { code } : { code, params };
|
|
11
|
+
}
|
|
12
|
+
/** Sums the counts of the given keys in a per-status map. */
|
|
13
|
+
export function countOf(groups, keys) {
|
|
14
|
+
if (groups === null)
|
|
15
|
+
return null;
|
|
16
|
+
return keys.reduce((sum, key) => sum + (groups.get(key) ?? 0), 0);
|
|
17
|
+
}
|
|
18
|
+
/** A capability whose evidence lives in a database the application runs without. */
|
|
19
|
+
export const NO_DATABASE = {
|
|
20
|
+
status: 'unused',
|
|
21
|
+
reason: 'noDatabase',
|
|
22
|
+
};
|
|
23
|
+
//# sourceMappingURL=types.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../server/capabilities/types.ts"],"names":[],"mappings":"AAwCA,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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.d.ts","sourceRoot":"","sources":["../../server/catalog.ts"],"names":[],"mappings":"AAqDA,qGAAqG;AACrG,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAMtE"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
const SYSTEM_COLLECTION_OWNERS = [
|
|
2
|
+
{
|
|
3
|
+
// Better Auth's own tables, under the names it gives them.
|
|
4
|
+
packageName: '@nocobase/app-plugin-authentication',
|
|
5
|
+
names: ['user', 'account', 'session', 'verification', 'deviceCode', 'jwks'],
|
|
6
|
+
},
|
|
7
|
+
{
|
|
8
|
+
packageName: '@nocobase/app-plugin-api-keys',
|
|
9
|
+
names: ['apikey'],
|
|
10
|
+
},
|
|
11
|
+
{
|
|
12
|
+
packageName: '@nocobase/app-plugin-users',
|
|
13
|
+
names: ['userInvitations', 'userPreferences'],
|
|
14
|
+
},
|
|
15
|
+
{
|
|
16
|
+
packageName: '@nocobase/app-plugin-authorization',
|
|
17
|
+
pattern: /^authorization[A-Z]/,
|
|
18
|
+
},
|
|
19
|
+
{ packageName: '@nocobase/app-plugin-mail', pattern: /^mail[A-Z]/ },
|
|
20
|
+
{
|
|
21
|
+
packageName: '@nocobase/app-plugin-notification',
|
|
22
|
+
pattern: /^notification[A-Z]/,
|
|
23
|
+
},
|
|
24
|
+
{ packageName: '@nocobase/app-plugin-scheduler', pattern: /^schedule[A-Z]/ },
|
|
25
|
+
{
|
|
26
|
+
// The library ships no migration: the application that runs lifecycles creates these two under these names.
|
|
27
|
+
packageName: '@nocobase/lifecycle',
|
|
28
|
+
names: ['lifecycleTransitions', 'lifecycleEffectRuns'],
|
|
29
|
+
},
|
|
30
|
+
{ packageName: '@nocobase/app-plugin-agents', pattern: /^ag[A-Z]/ },
|
|
31
|
+
{
|
|
32
|
+
packageName: '@nocobase/app-plugin-agent-sessions',
|
|
33
|
+
pattern: /^agentSession/,
|
|
34
|
+
},
|
|
35
|
+
{ packageName: '@nocobase/app-plugin-knowledge', pattern: /^kb[A-Z]/ },
|
|
36
|
+
{ packageName: '@nocobase/app-plugin-projects', pattern: /^pm[A-Z]/ },
|
|
37
|
+
{ packageName: '@nocobase/app-plugin-releases', pattern: /^rel[A-Z]/ },
|
|
38
|
+
];
|
|
39
|
+
/** The NocoBase package that keeps a Collection, or `undefined` for one of the application's own. */
|
|
40
|
+
export function systemCollectionOwner(name) {
|
|
41
|
+
return SYSTEM_COLLECTION_OWNERS.find((owner) => owner.names?.includes(name) === true ||
|
|
42
|
+
owner.pattern?.test(name) === true)?.packageName;
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=catalog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"catalog.js","sourceRoot":"","sources":["../../server/catalog.ts"],"names":[],"mappings":"AAcA,MAAM,wBAAwB,GAAqC;IACjE;QACE,2DAA2D;QAC3D,WAAW,EAAE,qCAAqC;QAClD,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,CAAC;KAC5E;IACD;QACE,WAAW,EAAE,+BAA+B;QAC5C,KAAK,EAAE,CAAC,QAAQ,CAAC;KAClB;IACD;QACE,WAAW,EAAE,4BAA4B;QACzC,KAAK,EAAE,CAAC,iBAAiB,EAAE,iBAAiB,CAAC;KAC9C;IACD;QACE,WAAW,EAAE,oCAAoC;QACjD,OAAO,EAAE,qBAAqB;KAC/B;IACD,EAAE,WAAW,EAAE,2BAA2B,EAAE,OAAO,EAAE,YAAY,EAAE;IACnE;QACE,WAAW,EAAE,mCAAmC;QAChD,OAAO,EAAE,oBAAoB;KAC9B;IACD,EAAE,WAAW,EAAE,gCAAgC,EAAE,OAAO,EAAE,gBAAgB,EAAE;IAC5E;QACE,4GAA4G;QAC5G,WAAW,EAAE,qBAAqB;QAClC,KAAK,EAAE,CAAC,sBAAsB,EAAE,qBAAqB,CAAC;KACvD;IACD,EAAE,WAAW,EAAE,6BAA6B,EAAE,OAAO,EAAE,UAAU,EAAE;IACnE;QACE,WAAW,EAAE,qCAAqC;QAClD,OAAO,EAAE,eAAe;KACzB;IACD,EAAE,WAAW,EAAE,gCAAgC,EAAE,OAAO,EAAE,UAAU,EAAE;IACtE,EAAE,WAAW,EAAE,+BAA+B,EAAE,OAAO,EAAE,UAAU,EAAE;IACrE,EAAE,WAAW,EAAE,+BAA+B,EAAE,OAAO,EAAE,WAAW,EAAE;CACvE,CAAC;AAEF,qGAAqG;AACrG,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,wBAAwB,CAAC,IAAI,CAClC,CAAC,KAAK,EAAE,EAAE,CACR,KAAK,CAAC,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI;QACpC,KAAK,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,IAAI,CACrC,EAAE,WAAW,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
export { default } from './plugin.js';
|
|
2
|
+
export { foundationServiceToken, type FoundationOverviewOptions, type FoundationService, } from './tokens.js';
|
|
3
|
+
export { DefaultFoundationService, type FoundationServiceOptions, } from './services/foundation.js';
|
|
4
|
+
export { systemCollectionOwner } from './catalog.js';
|
|
5
|
+
export type * from '../shared/foundation.js';
|
|
6
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EACL,sBAAsB,EACtB,KAAK,yBAAyB,EAC9B,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,wBAAwB,EACxB,KAAK,wBAAwB,GAC9B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC;AACrD,mBAAmB,yBAAyB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../server/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EACL,sBAAsB,GAGvB,MAAM,aAAa,CAAC;AACrB,OAAO,EACL,wBAAwB,GAEzB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,qBAAqB,EAAE,MAAM,cAAc,CAAC"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { CollectionDefinition, DatabaseManager, RepositoryFilter, RepositoryRecord } from '@nocobase/db';
|
|
2
|
+
import type { FoundationIssue } from '../shared/foundation.js';
|
|
3
|
+
/** One Collection as the default connection lists it: logical name, table, kind and title. */
|
|
4
|
+
export type CollectionSummary = Awaited<ReturnType<ReturnType<DatabaseManager['collections']>['list']>>['items'][number];
|
|
5
|
+
/** The Collections of the default connection, read once per overview and shared by every capability. */
|
|
6
|
+
export declare class Inventory {
|
|
7
|
+
readonly database: DatabaseManager;
|
|
8
|
+
readonly collections: readonly CollectionSummary[];
|
|
9
|
+
private readonly definitions;
|
|
10
|
+
private constructor();
|
|
11
|
+
/** Lists every Collection of the default connection. Throws when the database cannot be read at all. */
|
|
12
|
+
static read(database: DatabaseManager): Promise<Inventory>;
|
|
13
|
+
has(name: string): boolean;
|
|
14
|
+
definition(name: string): Promise<CollectionDefinition | undefined>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Reads for one capability. Every read answers `null` instead of throwing and records what it could not read, so one
|
|
18
|
+
* unreadable source leaves the rest of the capability standing and is never mistaken for zero.
|
|
19
|
+
*/
|
|
20
|
+
export declare class Probe {
|
|
21
|
+
readonly inventory: Inventory;
|
|
22
|
+
readonly issues: FoundationIssue[];
|
|
23
|
+
constructor(inventory: Inventory);
|
|
24
|
+
has(name: string): boolean;
|
|
25
|
+
fieldNames(name: string): Promise<readonly string[] | null>;
|
|
26
|
+
count(name: string, filter?: RepositoryFilter<RepositoryRecord>): Promise<number | null>;
|
|
27
|
+
/** Records per value of `field`, such as deliveries per status. */
|
|
28
|
+
groupCount(name: string, field: string): Promise<ReadonlyMap<string, number> | null>;
|
|
29
|
+
sum(name: string, field: string): Promise<number | null>;
|
|
30
|
+
/** Read configuration Collections in stable pages; never present a truncated prefix as a complete total. */
|
|
31
|
+
records(name: string, pageSize?: number): Promise<readonly Record<string, unknown>[] | null>;
|
|
32
|
+
/**
|
|
33
|
+
* Rows of a table the database layer keeps for itself, such as the migration history, which no Collection
|
|
34
|
+
* describes.
|
|
35
|
+
*/
|
|
36
|
+
internalCount(table: string, where?: {
|
|
37
|
+
readonly column: string;
|
|
38
|
+
readonly value: string;
|
|
39
|
+
}): Promise<number | null>;
|
|
40
|
+
internalMax(table: string, column: string): Promise<unknown>;
|
|
41
|
+
private read;
|
|
42
|
+
}
|
|
43
|
+
/** Adds counts, keeping track of whether every one of them could be read. */
|
|
44
|
+
export declare function total(values: readonly (number | null)[]): {
|
|
45
|
+
readonly value: number | null;
|
|
46
|
+
readonly complete: boolean;
|
|
47
|
+
};
|
|
48
|
+
//# sourceMappingURL=inventory.d.ts.map
|
|
@@ -0,0 +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;AAE/D,8FAA8F;AAC9F,MAAM,MAAM,iBAAiB,GAAG,OAAO,CACrC,UAAU,CAAC,UAAU,CAAC,eAAe,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAC/D,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC;AAEnB,wGAAwG;AACxG,qBAAa,SAAS;aAOF,QAAQ,EAAE,eAAe;aACzB,WAAW,EAAE,SAAS,iBAAiB,EAAE;IAP3D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAGxB;IAEJ,OAAO;IAKP,wGAAwG;WACpF,IAAI,CAAC,QAAQ,EAAE,eAAe,GAAG,OAAO,CAAC,SAAS,CAAC;IAahE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAI1B,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC;CAQ3E;AAED;;;GAGG;AACH,qBAAa,KAAK;aAGmB,SAAS,EAAE,SAAS;IAFvD,SAAgB,MAAM,EAAE,eAAe,EAAE,CAAM;gBAEZ,SAAS,EAAE,SAAS;IAEhD,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIpB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,SAAS,MAAM,EAAE,GAAG,IAAI,CAAC;IAOjE,KAAK,CACV,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,gBAAgB,CAAC,gBAAgB,CAAC,GAC1C,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAQzB,mEAAmE;IAC5D,UAAU,CACf,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GACZ,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC;IAcvC,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAW/D,4GAA4G;IACrG,OAAO,CACZ,IAAI,EAAE,MAAM,EACZ,QAAQ,SAAO,GACd,OAAO,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC;IAqBrD;;;OAGG;IACI,aAAa,CAClB,KAAK,EAAE,MAAM,EACb,KAAK,CAAC,EAAE;QAAE,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;QAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAA;KAAE,GAC1D,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC;IAYlB,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;YAWrD,IAAI;CAkBnB;AAYD,6EAA6E;AAC7E,wBAAgB,KAAK,CAAC,MAAM,EAAE,SAAS,CAAC,MAAM,GAAG,IAAI,CAAC,EAAE,GAAG;IACzD,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;CAC5B,CASA"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
/** The Collections of the default connection, read once per overview and shared by every capability. */
|
|
2
|
+
export class Inventory {
|
|
3
|
+
database;
|
|
4
|
+
collections;
|
|
5
|
+
definitions = new Map();
|
|
6
|
+
constructor(database, collections) {
|
|
7
|
+
this.database = database;
|
|
8
|
+
this.collections = collections;
|
|
9
|
+
}
|
|
10
|
+
/** Lists every Collection of the default connection. Throws when the database cannot be read at all. */
|
|
11
|
+
static async read(database) {
|
|
12
|
+
const collections = [];
|
|
13
|
+
let cursor;
|
|
14
|
+
do {
|
|
15
|
+
const page = await database
|
|
16
|
+
.collections()
|
|
17
|
+
.list({ limit: 500, ...(cursor === undefined ? {} : { cursor }) });
|
|
18
|
+
collections.push(...page.items);
|
|
19
|
+
cursor = page.nextCursor;
|
|
20
|
+
} while (cursor !== undefined);
|
|
21
|
+
return new Inventory(database, collections);
|
|
22
|
+
}
|
|
23
|
+
has(name) {
|
|
24
|
+
return this.collections.some((collection) => collection.name === name);
|
|
25
|
+
}
|
|
26
|
+
definition(name) {
|
|
27
|
+
let pending = this.definitions.get(name);
|
|
28
|
+
if (!pending) {
|
|
29
|
+
pending = this.database.collections().get(name);
|
|
30
|
+
this.definitions.set(name, pending);
|
|
31
|
+
}
|
|
32
|
+
return pending;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Reads for one capability. Every read answers `null` instead of throwing and records what it could not read, so one
|
|
37
|
+
* unreadable source leaves the rest of the capability standing and is never mistaken for zero.
|
|
38
|
+
*/
|
|
39
|
+
export class Probe {
|
|
40
|
+
inventory;
|
|
41
|
+
issues = [];
|
|
42
|
+
constructor(inventory) {
|
|
43
|
+
this.inventory = inventory;
|
|
44
|
+
}
|
|
45
|
+
has(name) {
|
|
46
|
+
return this.inventory.has(name);
|
|
47
|
+
}
|
|
48
|
+
async fieldNames(name) {
|
|
49
|
+
return this.read(name, async () => {
|
|
50
|
+
const definition = await this.inventory.definition(name);
|
|
51
|
+
return (definition?.fields ?? []).map((field) => field.name);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
count(name, filter) {
|
|
55
|
+
return this.read(name, () => this.inventory.database
|
|
56
|
+
.repository(name)
|
|
57
|
+
.count(filter === undefined ? {} : { filter }));
|
|
58
|
+
}
|
|
59
|
+
/** Records per value of `field`, such as deliveries per status. */
|
|
60
|
+
groupCount(name, field) {
|
|
61
|
+
return this.read(name, async () => {
|
|
62
|
+
const groups = await this.inventory.database
|
|
63
|
+
.repository(name)
|
|
64
|
+
.groupBy({
|
|
65
|
+
by: [field],
|
|
66
|
+
aggregate: (aggregate) => ({ count: aggregate.count() }),
|
|
67
|
+
});
|
|
68
|
+
return new Map(groups.map((group) => [groupKey(group[field]), Number(group.count)]));
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
sum(name, field) {
|
|
72
|
+
return this.read(name, async () => {
|
|
73
|
+
const result = await this.inventory.database
|
|
74
|
+
.repository(name)
|
|
75
|
+
.aggregate({
|
|
76
|
+
aggregate: (aggregate) => ({ total: aggregate.sum(field) }),
|
|
77
|
+
});
|
|
78
|
+
return Number(result.total ?? 0);
|
|
79
|
+
});
|
|
80
|
+
}
|
|
81
|
+
/** Read configuration Collections in stable pages; never present a truncated prefix as a complete total. */
|
|
82
|
+
records(name, pageSize = 1000) {
|
|
83
|
+
return this.read(name, async () => {
|
|
84
|
+
if (!Number.isSafeInteger(pageSize) || pageSize < 1)
|
|
85
|
+
throw new RangeError('Configuration page size must be a positive integer.');
|
|
86
|
+
const records = [];
|
|
87
|
+
const repository = this.inventory.database.repository(name);
|
|
88
|
+
for (let offset = 0;; offset += pageSize) {
|
|
89
|
+
const page = await repository.findMany({
|
|
90
|
+
limit: pageSize,
|
|
91
|
+
offset,
|
|
92
|
+
sort: (sort) => sort.field('id').asc(),
|
|
93
|
+
});
|
|
94
|
+
records.push(...page);
|
|
95
|
+
if (page.length < pageSize)
|
|
96
|
+
return records;
|
|
97
|
+
}
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* Rows of a table the database layer keeps for itself, such as the migration history, which no Collection
|
|
102
|
+
* describes.
|
|
103
|
+
*/
|
|
104
|
+
internalCount(table, where) {
|
|
105
|
+
return this.read(table, async () => {
|
|
106
|
+
let query = this.inventory.database
|
|
107
|
+
.query()
|
|
108
|
+
.selectFrom(table)
|
|
109
|
+
.select((expression) => [expression.fn.countAll().as('count')]);
|
|
110
|
+
if (where)
|
|
111
|
+
query = query.where(where.column, '=', where.value);
|
|
112
|
+
const row = await query.executeTakeFirst();
|
|
113
|
+
return Number(row?.count ?? 0);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
internalMax(table, column) {
|
|
117
|
+
return this.read(table, async () => {
|
|
118
|
+
const row = await this.inventory.database
|
|
119
|
+
.query()
|
|
120
|
+
.selectFrom(table)
|
|
121
|
+
.select((expression) => [expression.fn.max(column).as('latest')])
|
|
122
|
+
.executeTakeFirst();
|
|
123
|
+
return row?.latest ?? null;
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
async read(source, run) {
|
|
127
|
+
try {
|
|
128
|
+
return await run();
|
|
129
|
+
}
|
|
130
|
+
catch {
|
|
131
|
+
// The cause is not kept: a driver's error can quote the host, database and account it failed to reach.
|
|
132
|
+
if (!this.issues.some((issue) => issue.code === 'SOURCE_UNREADABLE' && issue.source === source))
|
|
133
|
+
this.issues.push({ code: 'SOURCE_UNREADABLE', source });
|
|
134
|
+
return null;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
/** A grouped value as a map key: statuses and names are strings, an absent value is the empty string. */
|
|
139
|
+
function groupKey(value) {
|
|
140
|
+
if (value === null || value === undefined)
|
|
141
|
+
return '';
|
|
142
|
+
return typeof value === 'string' ||
|
|
143
|
+
typeof value === 'number' ||
|
|
144
|
+
typeof value === 'boolean'
|
|
145
|
+
? String(value)
|
|
146
|
+
: JSON.stringify(value);
|
|
147
|
+
}
|
|
148
|
+
/** Adds counts, keeping track of whether every one of them could be read. */
|
|
149
|
+
export function total(values) {
|
|
150
|
+
const known = values.filter((value) => value !== null);
|
|
151
|
+
return {
|
|
152
|
+
value: known.length === 0 && values.length > 0
|
|
153
|
+
? null
|
|
154
|
+
: known.reduce((sum, value) => sum + value, 0),
|
|
155
|
+
complete: known.length === values.length,
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
//# sourceMappingURL=inventory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"inventory.js","sourceRoot":"","sources":["../../server/inventory.ts"],"names":[],"mappings":"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"}
|