@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,138 @@
1
+ import { z } from 'zod';
2
+ import { FOUNDATION_STATUSES, } from '../../shared/foundation.js';
3
+ export const OverviewQuery = z.object({
4
+ refresh: z.stringbool().optional().meta({
5
+ description: 'Collects again instead of answering a result collected within the last 30 seconds.',
6
+ }),
7
+ });
8
+ const FactSchema = z
9
+ .object({
10
+ code: z.string().meta({
11
+ description: 'What was established, such as `applicationCollections`; the page words it.',
12
+ }),
13
+ params: z
14
+ .record(z.string(), z.union([
15
+ z.string(),
16
+ z.number(),
17
+ z.array(z.union([
18
+ z.string(),
19
+ z.object({ key: z.string(), ns: z.string() }).meta({
20
+ description: 'A translation key in the namespace `ns`.',
21
+ }),
22
+ ])),
23
+ ]))
24
+ .optional()
25
+ .meta({ description: 'The values the wording quotes.' }),
26
+ })
27
+ .meta({ ref: 'FoundationFact' });
28
+ const MetricSchema = z
29
+ .object({
30
+ key: z.string(),
31
+ value: z.number().nullable().meta({
32
+ description: 'Null when it could not be read; never a stand-in zero.',
33
+ }),
34
+ unit: z.enum(['count', 'bytes', 'tokens']),
35
+ complete: z.boolean().meta({
36
+ description: 'False when part of what it adds up could not be read, so the value is a lower bound.',
37
+ }),
38
+ })
39
+ .meta({ ref: 'FoundationMetric' });
40
+ const StatusSchema = z.enum(FOUNDATION_STATUSES);
41
+ const CapabilitySchema = z
42
+ .object({
43
+ key: z.string(),
44
+ status: StatusSchema.nullable().meta({
45
+ description: '`active`, `needsSetup` or `unused`; null when usage is not recognized or its evidence could not be read.',
46
+ }),
47
+ title: z
48
+ .union([z.string(), z.object({ key: z.string(), ns: z.string() })])
49
+ .optional(),
50
+ description: z.string().optional(),
51
+ reason: z.string().optional().meta({
52
+ description: 'Why it needs setup or is unused, such as `noChannel`.',
53
+ }),
54
+ facts: z.array(FactSchema),
55
+ metrics: z.array(MetricSchema),
56
+ parts: z.array(z.object({
57
+ key: z.string(),
58
+ status: StatusSchema,
59
+ reason: z.string().optional(),
60
+ })),
61
+ packages: z
62
+ .array(z.object({ name: z.string(), version: z.string().nullable() }))
63
+ .meta({
64
+ description: 'The NocoBase packages that provide it, at the versions the application resolves.',
65
+ }),
66
+ completeness: z.enum(['complete', 'partial', 'failed']),
67
+ issues: z.array(z.object({
68
+ code: z.enum([
69
+ 'COLLECTOR_FAILED',
70
+ 'COLLECTOR_TIMEOUT',
71
+ 'SOURCE_UNREADABLE',
72
+ ]),
73
+ source: z.string().optional().meta({
74
+ description: 'The Collection or service that could not be read.',
75
+ }),
76
+ })),
77
+ })
78
+ .meta({ ref: 'FoundationCapability' });
79
+ export const OverviewSchema = z
80
+ .object({
81
+ capabilities: z.array(CapabilitySchema).meta({
82
+ description: 'Built-in adapter observations. The visible band uses runtime-specific availableCapabilities.',
83
+ }),
84
+ availableCapabilities: z.array(CapabilitySchema).optional(),
85
+ moduleSources: z
86
+ .object({
87
+ routes: z.array(z.object({
88
+ packageName: z.string(),
89
+ routeName: z.string(),
90
+ providers: z.array(z.string()),
91
+ apiProviders: z.array(z.string()).optional(),
92
+ complete: z.boolean(),
93
+ })),
94
+ complete: z.boolean(),
95
+ })
96
+ .optional()
97
+ .meta({
98
+ description: 'Read-only static page dependency evidence. It proves integration references, not execution or per-module runtime counts; unavailable sources remain incomplete. No filesystem paths or source code are returned.',
99
+ }),
100
+ inventory: z
101
+ .object({
102
+ entries: z.array(z.object({
103
+ name: z.string(),
104
+ displayName: z.string().optional(),
105
+ description: z.string().optional(),
106
+ version: z.string().nullable(),
107
+ installed: z.boolean(),
108
+ kind: z.enum(['core', 'plugin']),
109
+ origin: z.enum(['nocobase', 'unverified']),
110
+ categories: z.array(z.string()),
111
+ registration: z.enum(['observed', 'unknown']),
112
+ evidence: z.array(z.enum([
113
+ 'manifest',
114
+ 'databaseContribution',
115
+ 'apiContribution',
116
+ 'foundationRuntime',
117
+ 'serverRegistration',
118
+ 'clientContribution',
119
+ ])),
120
+ })),
121
+ serverRegistrationsComplete: z.boolean().optional(),
122
+ complete: z.boolean(),
123
+ unreadable: z.array(z.string()),
124
+ })
125
+ .optional()
126
+ .meta({
127
+ description: 'Installed provider manifests and observed current runtime contributions. Registration and category mapping do not prove individual package usage. Pro and custom providers without a catalog entry remain unclassified.',
128
+ }),
129
+ checkedAt: z.string().meta({
130
+ description: 'When the result was collected; a cached one keeps its time.',
131
+ }),
132
+ durationMs: z.number(),
133
+ connection: z.literal('default').meta({
134
+ description: 'The database connection the statistics read.',
135
+ }),
136
+ })
137
+ .meta({ ref: 'FoundationOverview' });
138
+ //# sourceMappingURL=schemas.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schemas.js","sourceRoot":"","sources":["../../../server/routes/schemas.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { AppConfigAccessor } from '@nocobase/app-server/config';
2
+ import type { ServiceContainer } from '@nocobase/service-provider';
3
+ import type { FoundationOverview } from '../../shared/foundation.js';
4
+ import { type CapabilityCollector } from '../capabilities/index.js';
5
+ import { type RuntimeProviderEvidence } from '../provider-inventory.js';
6
+ import type { FoundationOverviewOptions, FoundationService } from '../tokens.js';
7
+ export interface FoundationServiceOptions {
8
+ readonly container: ServiceContainer;
9
+ readonly config: Pick<AppConfigAccessor, 'get'>;
10
+ /** The application's root, where its `package.json` and `node_modules` are. */
11
+ readonly rootDir: string;
12
+ readonly hasClient: boolean;
13
+ readonly runtimeProviders?: () => readonly RuntimeProviderEvidence[];
14
+ readonly serverRegistrationsComplete?: () => boolean;
15
+ /** How long a result is answered again before it is collected anew. Defaults to 30 seconds. */
16
+ readonly cacheTtlMs?: number;
17
+ /** How long one capability may take before it is reported as timed out. Defaults to 10 seconds. */
18
+ readonly collectorTimeoutMs?: number;
19
+ readonly collectors?: readonly CapabilityCollector[];
20
+ readonly now?: () => number;
21
+ }
22
+ export declare class DefaultFoundationService implements FoundationService {
23
+ private readonly options;
24
+ private cached?;
25
+ private pending?;
26
+ private readonly packages;
27
+ private readonly cacheTtlMs;
28
+ private readonly collectorTimeoutMs;
29
+ private readonly collectors;
30
+ private readonly now;
31
+ constructor(options: FoundationServiceOptions);
32
+ overview(options?: FoundationOverviewOptions): Promise<FoundationOverview>;
33
+ private collect;
34
+ private run;
35
+ private resolvePackages;
36
+ }
37
+ //# sourceMappingURL=foundation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foundation.d.ts","sourceRoot":"","sources":["../../../server/services/foundation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,6BAA6B,CAAC;AAErE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAEnE,OAAO,KAAK,EAGV,kBAAkB,EAEnB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAEL,KAAK,mBAAmB,EAEzB,MAAM,0BAA0B,CAAC;AAIlC,OAAO,EAEL,KAAK,uBAAuB,EAC7B,MAAM,0BAA0B,CAAC;AAClC,OAAO,KAAK,EACV,yBAAyB,EACzB,iBAAiB,EAClB,MAAM,cAAc,CAAC;AAEtB,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,SAAS,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;IAChD,+EAA+E;IAC/E,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,SAAS,uBAAuB,EAAE,CAAC;IACrE,QAAQ,CAAC,2BAA2B,CAAC,EAAE,MAAM,OAAO,CAAC;IACrD,+FAA+F;IAC/F,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,mGAAmG;IACnG,QAAQ,CAAC,kBAAkB,CAAC,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,SAAS,mBAAmB,EAAE,CAAC;IACrD,QAAQ,CAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;CAC7B;AAQD,qBAAa,wBAAyB,YAAW,iBAAiB;IAY7C,OAAO,CAAC,QAAQ,CAAC,OAAO;IAX3C,OAAO,CAAC,MAAM,CAAC,CAGb;IACF,OAAO,CAAC,OAAO,CAAC,CAA8B;IAC9C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAoB;IAC7C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;IACpC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;IAC5C,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAiC;IAC5D,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAe;gBAEC,OAAO,EAAE,wBAAwB;IAQxD,QAAQ,CACnB,OAAO,GAAE,yBAA8B,GACtC,OAAO,CAAC,kBAAkB,CAAC;YAchB,OAAO;YA6FP,GAAG;YAkCH,eAAe;CAa9B"}
@@ -0,0 +1,175 @@
1
+ import { databaseManagerToken } from '@nocobase/db';
2
+ import { availableCapabilities } from '../../shared/available-capabilities.js';
3
+ import { CAPABILITY_COLLECTORS, } from '../capabilities/index.js';
4
+ import { Inventory, Probe } from '../inventory.js';
5
+ import { InstalledPackages } from '../packages.js';
6
+ import { collectModuleSources } from '../module-sources.js';
7
+ import { collectProviderInventory, } from '../provider-inventory.js';
8
+ /** Capabilities that read nothing from the database. */
9
+ const DATABASE_FREE = new Set(['interface', 'audit']);
10
+ /** How many capabilities read the database at once. */
11
+ const CONCURRENCY = 4;
12
+ export class DefaultFoundationService {
13
+ options;
14
+ cached;
15
+ pending;
16
+ packages;
17
+ cacheTtlMs;
18
+ collectorTimeoutMs;
19
+ collectors;
20
+ now;
21
+ constructor(options) {
22
+ this.options = options;
23
+ this.packages = new InstalledPackages(options.rootDir);
24
+ this.cacheTtlMs = options.cacheTtlMs ?? 30_000;
25
+ this.collectorTimeoutMs = options.collectorTimeoutMs ?? 10_000;
26
+ this.collectors = options.collectors ?? CAPABILITY_COLLECTORS;
27
+ this.now = options.now ?? Date.now;
28
+ }
29
+ async overview(options = {}) {
30
+ if (!options.refresh &&
31
+ this.cached &&
32
+ this.now() - this.cached.at < this.cacheTtlMs)
33
+ return this.cached.overview;
34
+ // Concurrent requests share one collection rather than each scanning every table.
35
+ this.pending ??= this.collect().finally(() => {
36
+ this.pending = undefined;
37
+ });
38
+ return this.pending;
39
+ }
40
+ async collect() {
41
+ const started = this.now();
42
+ const { container } = this.options;
43
+ const database = container.has(databaseManagerToken)
44
+ ? container.resolve(databaseManagerToken)
45
+ : undefined;
46
+ let inventory;
47
+ let databaseUnreadable = false;
48
+ if (database) {
49
+ try {
50
+ inventory = await Inventory.read(database);
51
+ }
52
+ catch {
53
+ databaseUnreadable = true;
54
+ }
55
+ }
56
+ const applicationName = await this.packages.applicationName();
57
+ const capabilities = await mapWithConcurrency(this.collectors, CONCURRENCY, (collector) => databaseUnreadable && !DATABASE_FREE.has(collector.key)
58
+ ? Promise.resolve(failed(collector, [
59
+ { code: 'SOURCE_UNREADABLE', source: 'database' },
60
+ ]))
61
+ : this.run(collector, {
62
+ probe: inventory ? new Probe(inventory) : undefined,
63
+ container,
64
+ config: this.options.config,
65
+ applicationName,
66
+ hasClient: this.options.hasClient,
67
+ }));
68
+ const inventoryOfProviders = await collectProviderInventory(this.options.rootDir, this.options.runtimeProviders?.(), this.options.serverRegistrationsComplete?.());
69
+ // An unclassified runtime extension may own Collections absent from our ownership catalog. Its rows must not be
70
+ // presented as an exact business-only count until ownership is known.
71
+ if (inventoryOfProviders.entries.some((entry) => entry.categories.length === 0 &&
72
+ entry.origin === 'unverified' &&
73
+ entry.registration === 'observed')) {
74
+ const index = capabilities.findIndex((entry) => entry.key === 'dataModeling');
75
+ const data = capabilities[index];
76
+ if (data && data.completeness !== 'failed')
77
+ capabilities[index] = {
78
+ ...data,
79
+ completeness: 'partial',
80
+ facts: [{ code: 'collectionOwnershipUnknown' }],
81
+ metrics: data.metrics.map((metric) => ({
82
+ ...metric,
83
+ value: metric.key === 'systemCollections' ? metric.value : null,
84
+ complete: false,
85
+ })),
86
+ issues: [
87
+ ...data.issues,
88
+ {
89
+ code: 'SOURCE_UNREADABLE',
90
+ source: 'extensionCollectionOwnership',
91
+ },
92
+ ],
93
+ };
94
+ }
95
+ const moduleSources = await collectModuleSources(this.options.rootDir, this.options.runtimeProviders?.());
96
+ const finished = this.now();
97
+ const overview = {
98
+ capabilities,
99
+ moduleSources,
100
+ inventory: inventoryOfProviders,
101
+ availableCapabilities: availableCapabilities(capabilities, inventoryOfProviders),
102
+ checkedAt: new Date(finished).toISOString(),
103
+ durationMs: finished - started,
104
+ connection: 'default',
105
+ };
106
+ this.cached = { at: finished, overview };
107
+ return overview;
108
+ }
109
+ async run(collector, context) {
110
+ let timer;
111
+ const timeout = new Promise((resolve) => {
112
+ timer = setTimeout(() => resolve('timeout'), this.collectorTimeoutMs);
113
+ });
114
+ try {
115
+ const findings = await Promise.race([
116
+ collector.collect(context),
117
+ timeout,
118
+ ]);
119
+ if (findings === 'timeout')
120
+ return failed(collector, [{ code: 'COLLECTOR_TIMEOUT' }]);
121
+ const issues = context.probe?.issues ?? [];
122
+ return {
123
+ key: collector.key,
124
+ status: findings.status,
125
+ ...(findings.reason === undefined ? {} : { reason: findings.reason }),
126
+ facts: findings.facts ?? [],
127
+ metrics: findings.metrics ?? [],
128
+ parts: findings.parts ?? [],
129
+ packages: await this.resolvePackages(collector.packages),
130
+ completeness: issues.length > 0 ? 'partial' : 'complete',
131
+ issues: [...issues],
132
+ };
133
+ }
134
+ catch {
135
+ return failed(collector, [{ code: 'COLLECTOR_FAILED' }]);
136
+ }
137
+ finally {
138
+ clearTimeout(timer);
139
+ }
140
+ }
141
+ async resolvePackages(names) {
142
+ const resolved = await Promise.all(names.map(async (name) => {
143
+ const version = await this.packages.version(name);
144
+ return version === undefined ? undefined : { name, version };
145
+ }));
146
+ return resolved.filter((entry) => entry !== undefined);
147
+ }
148
+ }
149
+ /** A capability whose evidence could not be read: it has no status rather than a guessed one. */
150
+ function failed(collector, issues) {
151
+ return {
152
+ key: collector.key,
153
+ status: null,
154
+ facts: [],
155
+ metrics: [],
156
+ parts: [],
157
+ packages: [],
158
+ completeness: 'failed',
159
+ issues,
160
+ };
161
+ }
162
+ async function mapWithConcurrency(items, limit, map) {
163
+ const results = new Array(items.length);
164
+ let next = 0;
165
+ const workers = Array.from({ length: Math.min(limit, items.length) }, async () => {
166
+ while (next < items.length) {
167
+ const index = next;
168
+ next += 1;
169
+ results[index] = await map(items[index]);
170
+ }
171
+ });
172
+ await Promise.all(workers);
173
+ return results;
174
+ }
175
+ //# sourceMappingURL=foundation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"foundation.js","sourceRoot":"","sources":["../../../server/services/foundation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import ts from 'typescript';
2
+ export interface EvidenceSource {
3
+ readonly file: string;
4
+ readonly ast: ts.SourceFile;
5
+ }
6
+ /** Package-local value reachability. The host never loads dependencies, libraries or application code. */
7
+ export declare class SourceEvidence {
8
+ private readonly resolutions;
9
+ private readonly checker;
10
+ private readonly sources;
11
+ constructor(sources: readonly EvidenceSource[], resolutions: ReadonlyMap<string, string>);
12
+ collect(file: string, roots?: readonly ts.Node[]): {
13
+ references: Set<string>;
14
+ nodes: Map<string, Set<ts.Node>>;
15
+ complete: boolean;
16
+ };
17
+ symbol(node: ts.Node): ts.Symbol | undefined;
18
+ }
19
+ //# sourceMappingURL=source-evidence.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-evidence.d.ts","sourceRoot":"","sources":["../../server/source-evidence.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,YAAY,CAAC;AAE5B,MAAM,WAAW,cAAc;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC;CAC7B;AAED,0GAA0G;AAC1G,qBAAa,cAAc;IAMvB,OAAO,CAAC,QAAQ,CAAC,WAAW;IAL9B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAiB;IACzC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA8B;gBAGpD,OAAO,EAAE,SAAS,cAAc,EAAE,EACjB,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,MAAM,CAAC;IAyBpD,OAAO,CACZ,IAAI,EAAE,MAAM,EACZ,KAAK,CAAC,EAAE,SAAS,EAAE,CAAC,IAAI,EAAE,GACzB;QACD,UAAU,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACxB,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QACjC,QAAQ,EAAE,OAAO,CAAC;KACnB;IAyIM,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,GAAG,EAAE,CAAC,MAAM,GAAG,SAAS;CAGpD"}
@@ -0,0 +1,169 @@
1
+ import ts from 'typescript';
2
+ /** Package-local value reachability. The host never loads dependencies, libraries or application code. */
3
+ export class SourceEvidence {
4
+ resolutions;
5
+ checker;
6
+ sources;
7
+ constructor(sources, resolutions) {
8
+ this.resolutions = resolutions;
9
+ this.sources = new Map(sources.map((source) => [source.file, source]));
10
+ const options = {
11
+ noLib: true,
12
+ noResolve: false,
13
+ allowJs: true,
14
+ target: ts.ScriptTarget.Latest,
15
+ module: ts.ModuleKind.ESNext,
16
+ jsx: ts.JsxEmit.Preserve,
17
+ };
18
+ const host = ts.createCompilerHost(options);
19
+ host.getSourceFile = (file) => this.sources.get(file)?.ast;
20
+ host.readFile = () => undefined;
21
+ host.fileExists = (file) => this.sources.has(file);
22
+ host.resolveModuleNames = (names, from) => names.map((name) => {
23
+ const file = resolutions.get(`${from}\0${name}`);
24
+ return file ? { resolvedFileName: file } : undefined;
25
+ });
26
+ this.checker = ts
27
+ .createProgram([...this.sources.keys()], options, host)
28
+ .getTypeChecker();
29
+ }
30
+ collect(file, roots) {
31
+ const references = new Set();
32
+ const nodes = new Map();
33
+ const visited = new Set();
34
+ const symbols = new Set();
35
+ let complete = true;
36
+ const exported = (target, name) => {
37
+ const ast = this.sources.get(target)?.ast;
38
+ const symbol = ast && this.checker.getSymbolAtLocation(ast);
39
+ const value = symbol &&
40
+ this.checker
41
+ .getExportsOfModule(symbol)
42
+ .find((item) => item.name === name);
43
+ if (!value) {
44
+ complete = false;
45
+ return;
46
+ }
47
+ follow(value);
48
+ };
49
+ const imported = (declaration, name) => {
50
+ let statement = declaration;
51
+ while (statement &&
52
+ !ts.isImportDeclaration(statement) &&
53
+ !ts.isExportDeclaration(statement))
54
+ statement = statement.parent;
55
+ if (!statement ||
56
+ !statement.moduleSpecifier ||
57
+ !ts.isStringLiteralLike(statement.moduleSpecifier))
58
+ return false;
59
+ const specifier = statement.moduleSpecifier.text;
60
+ const target = this.resolutions.get(`${statement.getSourceFile().fileName}\0${specifier}`);
61
+ if (!target) {
62
+ if (/^[.#/]/.test(specifier))
63
+ complete = false;
64
+ else
65
+ references.add(specifier);
66
+ }
67
+ else if (name)
68
+ exported(target, name);
69
+ else
70
+ complete = false;
71
+ return true;
72
+ };
73
+ const follow = (symbol) => {
74
+ if (symbols.has(symbol))
75
+ return;
76
+ symbols.add(symbol);
77
+ for (const declaration of symbol.declarations ?? []) {
78
+ if (ts.isImportSpecifier(declaration) ||
79
+ ts.isExportSpecifier(declaration)) {
80
+ if (declaration.isTypeOnly)
81
+ continue;
82
+ if (imported(declaration, declaration.propertyName?.text ?? declaration.name.text))
83
+ continue;
84
+ if (symbol.flags & ts.SymbolFlags.Alias)
85
+ follow(this.checker.getAliasedSymbol(symbol));
86
+ }
87
+ else if (ts.isImportClause(declaration)) {
88
+ if (!declaration.isTypeOnly)
89
+ imported(declaration, 'default');
90
+ }
91
+ else if (ts.isNamespaceImport(declaration)) {
92
+ imported(declaration);
93
+ }
94
+ else if (this.sources.has(declaration.getSourceFile().fileName)) {
95
+ visit(declaration);
96
+ }
97
+ }
98
+ };
99
+ const visit = (node) => {
100
+ if (visited.has(node) || ts.isTypeNode(node))
101
+ return;
102
+ visited.add(node);
103
+ const sourceFile = node.getSourceFile();
104
+ const selected = nodes.get(sourceFile.fileName) ?? new Set();
105
+ selected.add(node);
106
+ nodes.set(sourceFile.fileName, selected);
107
+ if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node))
108
+ return;
109
+ if (ts.isVariableDeclaration(node) ||
110
+ ts.isParameter(node) ||
111
+ ts.isPropertyDeclaration(node)) {
112
+ if (node.initializer)
113
+ visit(node.initializer);
114
+ return;
115
+ }
116
+ if (ts.isClassDeclaration(node) || ts.isClassExpression(node)) {
117
+ // Referring to a class does not mean all its methods are used.
118
+ for (const member of node.members)
119
+ if (ts.isConstructorDeclaration(member) ||
120
+ ts.isPropertyDeclaration(member))
121
+ visit(member);
122
+ return;
123
+ }
124
+ if (ts.isPropertyAccessExpression(node) &&
125
+ ts.isIdentifier(node.expression)) {
126
+ const receiver = this.checker.getSymbolAtLocation(node.expression);
127
+ const namespace = receiver?.declarations?.find(ts.isNamespaceImport);
128
+ if (namespace) {
129
+ imported(namespace, node.name.text);
130
+ return;
131
+ }
132
+ }
133
+ if (ts.isIdentifier(node)) {
134
+ const symbol = this.checker.getSymbolAtLocation(node);
135
+ if (symbol)
136
+ follow(symbol);
137
+ }
138
+ if (ts.isCallExpression(node) &&
139
+ node.expression.kind === ts.SyntaxKind.ImportKeyword) {
140
+ const argument = node.arguments[0];
141
+ if (argument && ts.isStringLiteralLike(argument)) {
142
+ const target = this.resolutions.get(`${sourceFile.fileName}\0${argument.text}`);
143
+ if (target)
144
+ exported(target, 'default');
145
+ else if (/^[.#/]/.test(argument.text))
146
+ complete = false;
147
+ else
148
+ references.add(argument.text);
149
+ }
150
+ else
151
+ complete = false;
152
+ }
153
+ ts.forEachChild(node, (child) => {
154
+ // A nested helper declaration is not a call. Follow it only when a value reference reaches it.
155
+ if (!ts.isFunctionDeclaration(child))
156
+ visit(child);
157
+ });
158
+ };
159
+ if (roots)
160
+ roots.forEach(visit);
161
+ else
162
+ exported(file, 'default');
163
+ return { references, nodes, complete };
164
+ }
165
+ symbol(node) {
166
+ return this.checker.getSymbolAtLocation(node);
167
+ }
168
+ }
169
+ //# sourceMappingURL=source-evidence.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"source-evidence.js","sourceRoot":"","sources":["../../server/source-evidence.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import { type ServiceToken } from '@nocobase/service-provider';
2
+ import type { FoundationOverview } from '../shared/foundation.js';
3
+ export interface FoundationOverviewOptions {
4
+ /** Collects again instead of answering a result younger than the cache lifetime. */
5
+ readonly refresh?: boolean;
6
+ }
7
+ /** What the application uses of NocoBase Core, collected by this plugin alone. Read-only. */
8
+ export interface FoundationService {
9
+ overview(options?: FoundationOverviewOptions): Promise<FoundationOverview>;
10
+ }
11
+ export declare const foundationServiceToken: ServiceToken<FoundationService>;
12
+ //# sourceMappingURL=tokens.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.d.ts","sourceRoot":"","sources":["../../server/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,KAAK,YAAY,EAClB,MAAM,4BAA4B,CAAC;AAEpC,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAElE,MAAM,WAAW,yBAAyB;IACxC,oFAAoF;IACpF,QAAQ,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,6FAA6F;AAC7F,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,OAAO,CAAC,EAAE,yBAAyB,GAAG,OAAO,CAAC,kBAAkB,CAAC,CAAC;CAC5E;AAED,eAAO,MAAM,sBAAsB,EAAE,YAAY,CAAC,iBAAiB,CAGhE,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { createServiceToken, } from '@nocobase/service-provider';
2
+ export const foundationServiceToken = createServiceToken('@nocobase/app-plugin-foundation/service');
3
+ //# sourceMappingURL=tokens.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tokens.js","sourceRoot":"","sources":["../../server/tokens.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAEnB,MAAM,4BAA4B,CAAC;AAcpC,MAAM,CAAC,MAAM,sBAAsB,GACjC,kBAAkB,CAChB,yCAAyC,CAC1C,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { FoundationCapability, FoundationOverview, FoundationProviderInventory } from './foundation.js';
2
+ /** Show recognized installed capabilities as well as current runtime capabilities; installation never proves use. */
3
+ export declare function availableCapabilities(observations: readonly FoundationCapability[], inventory: FoundationProviderInventory): readonly FoundationCapability[];
4
+ /** Client-only registrations are added to the same model without changing server usage evidence. */
5
+ export declare function withAvailableCapabilities(overview: FoundationOverview, inventory: FoundationProviderInventory): FoundationOverview;
6
+ //# sourceMappingURL=available-capabilities.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"available-capabilities.d.ts","sourceRoot":"","sources":["../../shared/available-capabilities.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,oBAAoB,EACpB,kBAAkB,EAClB,2BAA2B,EAC5B,MAAM,iBAAiB,CAAC;AASzB,qHAAqH;AACrH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,SAAS,oBAAoB,EAAE,EAC7C,SAAS,EAAE,2BAA2B,GACrC,SAAS,oBAAoB,EAAE,CA2DjC;AAED,oGAAoG;AACpG,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,kBAAkB,EAC5B,SAAS,EAAE,2BAA2B,GACrC,kBAAkB,CASpB"}