@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.
Files changed (220) hide show
  1. package/CHANGELOG.md +32 -0
  2. package/README.md +86 -2
  3. package/dist/cli/index.d.ts +4 -0
  4. package/dist/cli/index.d.ts.map +1 -0
  5. package/dist/cli/index.js +16 -0
  6. package/dist/cli/index.js.map +1 -0
  7. package/dist/cli/module-manifest.d.ts +9 -0
  8. package/dist/cli/module-manifest.d.ts.map +1 -0
  9. package/dist/cli/module-manifest.js +12 -0
  10. package/dist/cli/module-manifest.js.map +1 -0
  11. package/dist/client/api.d.ts +17 -0
  12. package/dist/client/api.d.ts.map +1 -0
  13. package/dist/client/api.js +51 -0
  14. package/dist/client/api.js.map +1 -0
  15. package/dist/client/business-modules.d.ts +5 -0
  16. package/dist/client/business-modules.d.ts.map +1 -0
  17. package/dist/client/business-modules.js +81 -0
  18. package/dist/client/business-modules.js.map +1 -0
  19. package/dist/client/components/capability-icons.d.ts +4 -0
  20. package/dist/client/components/capability-icons.d.ts.map +1 -0
  21. package/dist/client/components/capability-icons.js +17 -0
  22. package/dist/client/components/capability-icons.js.map +1 -0
  23. package/dist/client/components/format.d.ts +7 -0
  24. package/dist/client/components/format.d.ts.map +1 -0
  25. package/dist/client/components/format.js +42 -0
  26. package/dist/client/components/format.js.map +1 -0
  27. package/dist/client/components/foundation-page.d.ts +15 -0
  28. package/dist/client/components/foundation-page.d.ts.map +1 -0
  29. package/dist/client/components/foundation-page.js +207 -0
  30. package/dist/client/components/foundation-page.js.map +1 -0
  31. package/dist/client/components/foundation-translation.d.ts +12 -0
  32. package/dist/client/components/foundation-translation.d.ts.map +1 -0
  33. package/dist/client/components/foundation-translation.js +19 -0
  34. package/dist/client/components/foundation-translation.js.map +1 -0
  35. package/dist/client/components/module-matrix.d.ts +9 -0
  36. package/dist/client/components/module-matrix.d.ts.map +1 -0
  37. package/dist/client/components/module-matrix.js +56 -0
  38. package/dist/client/components/module-matrix.js.map +1 -0
  39. package/dist/client/components/ui/button.d.ts +8 -0
  40. package/dist/client/components/ui/button.d.ts.map +1 -0
  41. package/dist/client/components/ui/button.js +35 -0
  42. package/dist/client/components/ui/button.js.map +1 -0
  43. package/dist/client/components/ui/collapsible.d.ts +7 -0
  44. package/dist/client/components/ui/collapsible.d.ts.map +1 -0
  45. package/dist/client/components/ui/collapsible.js +13 -0
  46. package/dist/client/components/ui/collapsible.js.map +1 -0
  47. package/dist/client/components/ui/table.d.ts +11 -0
  48. package/dist/client/components/ui/table.d.ts.map +1 -0
  49. package/dist/client/components/ui/table.js +28 -0
  50. package/dist/client/components/ui/table.js.map +1 -0
  51. package/dist/client/index.d.ts +6 -0
  52. package/dist/client/index.d.ts.map +1 -0
  53. package/dist/client/index.js +7 -0
  54. package/dist/client/index.js.map +1 -0
  55. package/dist/client/locales/de-DE.d.ts +4 -0
  56. package/dist/client/locales/de-DE.d.ts.map +1 -0
  57. package/dist/client/locales/de-DE.js +315 -0
  58. package/dist/client/locales/de-DE.js.map +1 -0
  59. package/dist/client/locales/en-US.d.ts +317 -0
  60. package/dist/client/locales/en-US.d.ts.map +1 -0
  61. package/dist/client/locales/en-US.js +315 -0
  62. package/dist/client/locales/en-US.js.map +1 -0
  63. package/dist/client/locales/es-ES.d.ts +4 -0
  64. package/dist/client/locales/es-ES.d.ts.map +1 -0
  65. package/dist/client/locales/es-ES.js +316 -0
  66. package/dist/client/locales/es-ES.js.map +1 -0
  67. package/dist/client/locales/fr-FR.d.ts +4 -0
  68. package/dist/client/locales/fr-FR.d.ts.map +1 -0
  69. package/dist/client/locales/fr-FR.js +316 -0
  70. package/dist/client/locales/fr-FR.js.map +1 -0
  71. package/dist/client/locales/id-ID.d.ts +4 -0
  72. package/dist/client/locales/id-ID.d.ts.map +1 -0
  73. package/dist/client/locales/id-ID.js +315 -0
  74. package/dist/client/locales/id-ID.js.map +1 -0
  75. package/dist/client/locales/index.d.ts +4 -0
  76. package/dist/client/locales/index.d.ts.map +1 -0
  77. package/dist/client/locales/index.js +14 -0
  78. package/dist/client/locales/index.js.map +1 -0
  79. package/dist/client/locales/ja-JP.d.ts +4 -0
  80. package/dist/client/locales/ja-JP.d.ts.map +1 -0
  81. package/dist/client/locales/ja-JP.js +315 -0
  82. package/dist/client/locales/ja-JP.js.map +1 -0
  83. package/dist/client/locales/pt-BR.d.ts +4 -0
  84. package/dist/client/locales/pt-BR.d.ts.map +1 -0
  85. package/dist/client/locales/pt-BR.js +316 -0
  86. package/dist/client/locales/pt-BR.js.map +1 -0
  87. package/dist/client/locales/vi-VN.d.ts +4 -0
  88. package/dist/client/locales/vi-VN.d.ts.map +1 -0
  89. package/dist/client/locales/vi-VN.js +315 -0
  90. package/dist/client/locales/vi-VN.js.map +1 -0
  91. package/dist/client/locales/zh-CN.d.ts +4 -0
  92. package/dist/client/locales/zh-CN.d.ts.map +1 -0
  93. package/dist/client/locales/zh-CN.js +315 -0
  94. package/dist/client/locales/zh-CN.js.map +1 -0
  95. package/dist/client/locales/zh-TW.d.ts +4 -0
  96. package/dist/client/locales/zh-TW.d.ts.map +1 -0
  97. package/dist/client/locales/zh-TW.js +315 -0
  98. package/dist/client/locales/zh-TW.js.map +1 -0
  99. package/dist/client/navigation.d.ts +8 -0
  100. package/dist/client/navigation.d.ts.map +1 -0
  101. package/dist/client/navigation.js +21 -0
  102. package/dist/client/navigation.js.map +1 -0
  103. package/dist/client/plugin.d.ts +11 -0
  104. package/dist/client/plugin.d.ts.map +1 -0
  105. package/dist/client/plugin.js +10 -0
  106. package/dist/client/plugin.js.map +1 -0
  107. package/dist/client/provider-inventory.d.ts +6 -0
  108. package/dist/client/provider-inventory.d.ts.map +1 -0
  109. package/dist/client/provider-inventory.js +49 -0
  110. package/dist/client/provider-inventory.js.map +1 -0
  111. package/dist/client/routes.d.ts +18 -0
  112. package/dist/client/routes.d.ts.map +1 -0
  113. package/dist/client/routes.js +41 -0
  114. package/dist/client/routes.js.map +1 -0
  115. package/dist/package.d.ts +2 -0
  116. package/dist/package.d.ts.map +1 -0
  117. package/dist/package.js +2 -0
  118. package/dist/package.js.map +1 -0
  119. package/dist/server/capabilities/data.d.ts +7 -0
  120. package/dist/server/capabilities/data.d.ts.map +1 -0
  121. package/dist/server/capabilities/data.js +108 -0
  122. package/dist/server/capabilities/data.js.map +1 -0
  123. package/dist/server/capabilities/index.d.ts +5 -0
  124. package/dist/server/capabilities/index.d.ts.map +1 -0
  125. package/dist/server/capabilities/index.js +24 -0
  126. package/dist/server/capabilities/index.js.map +1 -0
  127. package/dist/server/capabilities/intelligence.d.ts +4 -0
  128. package/dist/server/capabilities/intelligence.d.ts.map +1 -0
  129. package/dist/server/capabilities/intelligence.js +97 -0
  130. package/dist/server/capabilities/intelligence.js.map +1 -0
  131. package/dist/server/capabilities/messaging.d.ts +4 -0
  132. package/dist/server/capabilities/messaging.d.ts.map +1 -0
  133. package/dist/server/capabilities/messaging.js +108 -0
  134. package/dist/server/capabilities/messaging.js.map +1 -0
  135. package/dist/server/capabilities/people.d.ts +4 -0
  136. package/dist/server/capabilities/people.d.ts.map +1 -0
  137. package/dist/server/capabilities/people.js +151 -0
  138. package/dist/server/capabilities/people.js.map +1 -0
  139. package/dist/server/capabilities/platform.d.ts +10 -0
  140. package/dist/server/capabilities/platform.d.ts.map +1 -0
  141. package/dist/server/capabilities/platform.js +143 -0
  142. package/dist/server/capabilities/platform.js.map +1 -0
  143. package/dist/server/capabilities/processes.d.ts +3 -0
  144. package/dist/server/capabilities/processes.d.ts.map +1 -0
  145. package/dist/server/capabilities/processes.js +86 -0
  146. package/dist/server/capabilities/processes.js.map +1 -0
  147. package/dist/server/capabilities/types.d.ts +38 -0
  148. package/dist/server/capabilities/types.d.ts.map +1 -0
  149. package/dist/server/capabilities/types.js +23 -0
  150. package/dist/server/capabilities/types.js.map +1 -0
  151. package/dist/server/catalog.d.ts +3 -0
  152. package/dist/server/catalog.d.ts.map +1 -0
  153. package/dist/server/catalog.js +44 -0
  154. package/dist/server/catalog.js.map +1 -0
  155. package/dist/server/index.d.ts +6 -0
  156. package/dist/server/index.d.ts.map +1 -0
  157. package/dist/server/index.js +5 -0
  158. package/dist/server/index.js.map +1 -0
  159. package/dist/server/inventory.d.ts +48 -0
  160. package/dist/server/inventory.d.ts.map +1 -0
  161. package/dist/server/inventory.js +158 -0
  162. package/dist/server/inventory.js.map +1 -0
  163. package/dist/server/module-manifest.d.ts +10 -0
  164. package/dist/server/module-manifest.d.ts.map +1 -0
  165. package/dist/server/module-manifest.js +65 -0
  166. package/dist/server/module-manifest.js.map +1 -0
  167. package/dist/server/module-sources.d.ts +5 -0
  168. package/dist/server/module-sources.d.ts.map +1 -0
  169. package/dist/server/module-sources.js +535 -0
  170. package/dist/server/module-sources.js.map +1 -0
  171. package/dist/server/packages.d.ts +18 -0
  172. package/dist/server/packages.d.ts.map +1 -0
  173. package/dist/server/packages.js +62 -0
  174. package/dist/server/packages.js.map +1 -0
  175. package/dist/server/plugin.d.ts +4 -0
  176. package/dist/server/plugin.d.ts.map +1 -0
  177. package/dist/server/plugin.js +12 -0
  178. package/dist/server/plugin.js.map +1 -0
  179. package/dist/server/provider-inventory.d.ts +13 -0
  180. package/dist/server/provider-inventory.d.ts.map +1 -0
  181. package/dist/server/provider-inventory.js +180 -0
  182. package/dist/server/provider-inventory.js.map +1 -0
  183. package/dist/server/providers/foundation.d.ts +7 -0
  184. package/dist/server/providers/foundation.d.ts.map +1 -0
  185. package/dist/server/providers/foundation.js +24 -0
  186. package/dist/server/providers/foundation.js.map +1 -0
  187. package/dist/server/providers/index.d.ts +4 -0
  188. package/dist/server/providers/index.d.ts.map +1 -0
  189. package/dist/server/providers/index.js +6 -0
  190. package/dist/server/providers/index.js.map +1 -0
  191. package/dist/server/routes/index.d.ts +6 -0
  192. package/dist/server/routes/index.d.ts.map +1 -0
  193. package/dist/server/routes/index.js +54 -0
  194. package/dist/server/routes/index.js.map +1 -0
  195. package/dist/server/routes/schemas.d.ts +7 -0
  196. package/dist/server/routes/schemas.d.ts.map +1 -0
  197. package/dist/server/routes/schemas.js +138 -0
  198. package/dist/server/routes/schemas.js.map +1 -0
  199. package/dist/server/services/foundation.d.ts +37 -0
  200. package/dist/server/services/foundation.d.ts.map +1 -0
  201. package/dist/server/services/foundation.js +175 -0
  202. package/dist/server/services/foundation.js.map +1 -0
  203. package/dist/server/source-evidence.d.ts +19 -0
  204. package/dist/server/source-evidence.d.ts.map +1 -0
  205. package/dist/server/source-evidence.js +169 -0
  206. package/dist/server/source-evidence.js.map +1 -0
  207. package/dist/server/tokens.d.ts +12 -0
  208. package/dist/server/tokens.d.ts.map +1 -0
  209. package/dist/server/tokens.js +3 -0
  210. package/dist/server/tokens.js.map +1 -0
  211. package/dist/shared/available-capabilities.d.ts +6 -0
  212. package/dist/shared/available-capabilities.d.ts.map +1 -0
  213. package/dist/shared/available-capabilities.js +66 -0
  214. package/dist/shared/available-capabilities.js.map +1 -0
  215. package/dist/shared/foundation.d.ts +142 -0
  216. package/dist/shared/foundation.d.ts.map +1 -0
  217. package/dist/shared/foundation.js +39 -0
  218. package/dist/shared/foundation.js.map +1 -0
  219. package/package.json +106 -3
  220. 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,3 @@
1
+ import { type CapabilityCollector } from './types.js';
2
+ export declare const workflows: CapabilityCollector;
3
+ //# sourceMappingURL=processes.d.ts.map
@@ -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,3 @@
1
+ /** The NocoBase package that keeps a Collection, or `undefined` for one of the application's own. */
2
+ export declare function systemCollectionOwner(name: string): string | undefined;
3
+ //# sourceMappingURL=catalog.d.ts.map
@@ -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,5 @@
1
+ export { default } from './plugin.js';
2
+ export { foundationServiceToken, } from './tokens.js';
3
+ export { DefaultFoundationService, } from './services/foundation.js';
4
+ export { systemCollectionOwner } from './catalog.js';
5
+ //# sourceMappingURL=index.js.map
@@ -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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"}