@fabricorg/platform 0.10.0 → 0.11.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 +15 -0
- package/README.md +8 -1
- package/dist/actions/index.cjs +11 -11
- package/dist/actions/index.d.cts +2 -0
- package/dist/actions/index.d.ts +2 -0
- package/dist/actions/index.js +1 -1
- package/dist/chunk-3JQI3OFC.js +347 -0
- package/dist/chunk-3JQI3OFC.js.map +1 -0
- package/dist/chunk-3S6UTP4X.js +110 -0
- package/dist/chunk-3S6UTP4X.js.map +1 -0
- package/dist/{chunk-Q3WYIWCN.cjs → chunk-7WASIL46.js} +58 -5
- package/dist/chunk-7WASIL46.js.map +1 -0
- package/dist/{chunk-BWNPGRRV.cjs → chunk-HLRIXNVG.cjs} +2 -2
- package/dist/chunk-HLRIXNVG.cjs.map +1 -0
- package/dist/{chunk-4SMPJPJ6.js → chunk-JM55UQWK.js} +2 -2
- package/dist/chunk-JM55UQWK.js.map +1 -0
- package/dist/{chunk-N72WJ4AU.js → chunk-NFP5DJBT.js} +65 -6
- package/dist/chunk-NFP5DJBT.js.map +1 -0
- package/dist/{chunk-JSTGOT6P.js → chunk-O7IHZ53Y.cjs} +66 -3
- package/dist/chunk-O7IHZ53Y.cjs.map +1 -0
- package/dist/chunk-ODP3DO6P.cjs +355 -0
- package/dist/chunk-ODP3DO6P.cjs.map +1 -0
- package/dist/{chunk-54EQTOH6.cjs → chunk-RYCHDNHZ.cjs} +69 -8
- package/dist/chunk-RYCHDNHZ.cjs.map +1 -0
- package/dist/chunk-XCL2HBMB.cjs +116 -0
- package/dist/chunk-XCL2HBMB.cjs.map +1 -0
- package/dist/index.cjs +67 -31
- package/dist/index.d.cts +4 -4
- package/dist/index.d.ts +4 -4
- package/dist/index.js +5 -5
- package/dist/manifest/index.cjs +17 -8
- package/dist/manifest/index.d.cts +39 -3
- package/dist/manifest/index.d.ts +39 -3
- package/dist/manifest/index.js +5 -4
- package/dist/modules/index.cjs +11 -10
- package/dist/modules/index.d.cts +49 -1
- package/dist/modules/index.d.ts +49 -1
- package/dist/modules/index.js +4 -3
- package/dist/objects/index.cjs +9 -5
- package/dist/objects/index.d.cts +45 -1
- package/dist/objects/index.d.ts +45 -1
- package/dist/objects/index.js +1 -1
- package/dist/projections/index.cjs +26 -2
- package/dist/projections/index.d.cts +38 -2
- package/dist/projections/index.d.ts +38 -2
- package/dist/projections/index.js +1 -1
- package/package.json +1 -1
- package/dist/chunk-35DD3H55.js +0 -187
- package/dist/chunk-35DD3H55.js.map +0 -1
- package/dist/chunk-4SMPJPJ6.js.map +0 -1
- package/dist/chunk-54EQTOH6.cjs.map +0 -1
- package/dist/chunk-BWNPGRRV.cjs.map +0 -1
- package/dist/chunk-I35B576X.js +0 -30
- package/dist/chunk-I35B576X.js.map +0 -1
- package/dist/chunk-JSTGOT6P.js.map +0 -1
- package/dist/chunk-N72WJ4AU.js.map +0 -1
- package/dist/chunk-Q3WYIWCN.cjs.map +0 -1
- package/dist/chunk-QETQGAXJ.cjs +0 -35
- package/dist/chunk-QETQGAXJ.cjs.map +0 -1
- package/dist/chunk-SSYKDXR4.cjs +0 -195
- package/dist/chunk-SSYKDXR4.cjs.map +0 -1
package/dist/chunk-SSYKDXR4.cjs
DELETED
|
@@ -1,195 +0,0 @@
|
|
|
1
|
-
'use strict';
|
|
2
|
-
|
|
3
|
-
var chunkQETQGAXJ_cjs = require('./chunk-QETQGAXJ.cjs');
|
|
4
|
-
var chunkNJL3US7H_cjs = require('./chunk-NJL3US7H.cjs');
|
|
5
|
-
var chunkUV252FLT_cjs = require('./chunk-UV252FLT.cjs');
|
|
6
|
-
var chunkBWNPGRRV_cjs = require('./chunk-BWNPGRRV.cjs');
|
|
7
|
-
var chunkEO4VSB2O_cjs = require('./chunk-EO4VSB2O.cjs');
|
|
8
|
-
var chunkJAXDEK5Z_cjs = require('./chunk-JAXDEK5Z.cjs');
|
|
9
|
-
|
|
10
|
-
// modules/index.ts
|
|
11
|
-
var registeredModuleNamespaces = /* @__PURE__ */ new Set();
|
|
12
|
-
function getModuleDependencyNamespace(dependency) {
|
|
13
|
-
return typeof dependency === "string" ? dependency : dependency.namespace;
|
|
14
|
-
}
|
|
15
|
-
function getObjectTypeName(objectType) {
|
|
16
|
-
return typeof objectType === "string" ? objectType : objectType.type;
|
|
17
|
-
}
|
|
18
|
-
function getEventTypeName(eventType) {
|
|
19
|
-
return typeof eventType === "string" ? eventType : eventType.eventType;
|
|
20
|
-
}
|
|
21
|
-
function validateModuleNamespace(namespace) {
|
|
22
|
-
if (!namespace) {
|
|
23
|
-
throw new Error("Module namespace cannot be empty");
|
|
24
|
-
}
|
|
25
|
-
if (!/^[a-z][a-z0-9-]*$/.test(namespace)) {
|
|
26
|
-
throw new Error(
|
|
27
|
-
`Invalid module namespace: "${namespace}". Must be lowercase letters, numbers, and hyphens only.`
|
|
28
|
-
);
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
function createModuleRegistry(modules = []) {
|
|
32
|
-
const registered = /* @__PURE__ */ new Map();
|
|
33
|
-
for (const module of modules) {
|
|
34
|
-
validateModuleNamespace(module.namespace);
|
|
35
|
-
if (registered.has(module.namespace)) {
|
|
36
|
-
throw new Error(`Duplicate FabricModule namespace "${module.namespace}".`);
|
|
37
|
-
}
|
|
38
|
-
registered.set(module.namespace, module);
|
|
39
|
-
}
|
|
40
|
-
return { modules: registered };
|
|
41
|
-
}
|
|
42
|
-
function validateIdentifierList(values, label, namespace) {
|
|
43
|
-
for (const value of values ?? []) {
|
|
44
|
-
if (!value) {
|
|
45
|
-
throw new Error(`Module "${namespace}" has an empty ${label} entry.`);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
function validateManifest(module, context = {}) {
|
|
50
|
-
validateModuleNamespace(module.namespace);
|
|
51
|
-
const dependencies = (module.dependencies ?? []).map(getModuleDependencyNamespace);
|
|
52
|
-
const objectTypes = (module.objectTypes ?? []).map(getObjectTypeName);
|
|
53
|
-
const eventTypes = (module.eventTypes ?? []).map(getEventTypeName);
|
|
54
|
-
for (const dependency of dependencies) {
|
|
55
|
-
validateModuleNamespace(dependency);
|
|
56
|
-
if (dependency === module.namespace) {
|
|
57
|
-
throw new Error(`Module "${module.namespace}" cannot depend on itself.`);
|
|
58
|
-
}
|
|
59
|
-
if (context.availableNamespaces && !context.availableNamespaces.has(dependency)) {
|
|
60
|
-
throw new Error(`Module "${module.namespace}" depends on missing module "${dependency}".`);
|
|
61
|
-
}
|
|
62
|
-
}
|
|
63
|
-
validateIdentifierList(objectTypes, "objectTypes", module.namespace);
|
|
64
|
-
validateIdentifierList(module.subjectTypes, "subjectTypes", module.namespace);
|
|
65
|
-
validateIdentifierList(eventTypes, "eventTypes", module.namespace);
|
|
66
|
-
for (const objectType of objectTypes) {
|
|
67
|
-
if (!/^[A-Z][a-zA-Z0-9]*$/.test(objectType)) {
|
|
68
|
-
throw new Error(
|
|
69
|
-
`Invalid object type: "${objectType}". Object types must be PascalCase alphanumeric.`
|
|
70
|
-
);
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
for (const action of module.actions ?? []) {
|
|
74
|
-
if (!/^[a-z][a-z0-9-]*\.[a-z][a-z0-9_]*$/.test(action.actionId)) {
|
|
75
|
-
throw new Error(`Invalid action ID: ${action.actionId}`);
|
|
76
|
-
}
|
|
77
|
-
if (action.namespace !== module.namespace) {
|
|
78
|
-
throw new Error(
|
|
79
|
-
`Action "${action.actionId}" declares namespace "${action.namespace}" but is registered by module "${module.namespace}".`
|
|
80
|
-
);
|
|
81
|
-
}
|
|
82
|
-
if (!action.actionId.startsWith(`${module.namespace}.`)) {
|
|
83
|
-
throw new Error(
|
|
84
|
-
`Action "${action.actionId}" must start with module namespace "${module.namespace}."`
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
if (action.mutatesDomain && action.emitsEvents.length === 0) {
|
|
88
|
-
throw new Error(
|
|
89
|
-
`Action "${action.actionId}" mutates domain but emits no events. Every mutating action must emit at least one AssetEvent.`
|
|
90
|
-
);
|
|
91
|
-
}
|
|
92
|
-
}
|
|
93
|
-
for (const descriptor of module.displayRenderers ?? []) {
|
|
94
|
-
const isPlannedEventType = context.plannedEventTypes?.has(descriptor.eventType) ?? false;
|
|
95
|
-
const isModuleEventType = eventTypes.includes(descriptor.eventType);
|
|
96
|
-
if (!chunkJAXDEK5Z_cjs.isValidEventType(descriptor.eventType) && !isModuleEventType && !isPlannedEventType) {
|
|
97
|
-
throw new Error(
|
|
98
|
-
`Display renderer registered for unknown event type "${descriptor.eventType}". Register the event type before adding a display renderer.`
|
|
99
|
-
);
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
function sortModulesByDependency(modules, registeredNamespaces = registeredModuleNamespaces) {
|
|
104
|
-
const modulesByNamespace = /* @__PURE__ */ new Map();
|
|
105
|
-
for (const module of modules) {
|
|
106
|
-
validateModuleNamespace(module.namespace);
|
|
107
|
-
if (modulesByNamespace.has(module.namespace)) {
|
|
108
|
-
throw new Error(`Duplicate Fabric module namespace "${module.namespace}".`);
|
|
109
|
-
}
|
|
110
|
-
modulesByNamespace.set(module.namespace, module);
|
|
111
|
-
}
|
|
112
|
-
const sorted = [];
|
|
113
|
-
const visiting = /* @__PURE__ */ new Set();
|
|
114
|
-
const visited = /* @__PURE__ */ new Set();
|
|
115
|
-
function visit(module, path) {
|
|
116
|
-
if (visited.has(module.namespace)) {
|
|
117
|
-
return;
|
|
118
|
-
}
|
|
119
|
-
if (visiting.has(module.namespace)) {
|
|
120
|
-
throw new Error(
|
|
121
|
-
`Cyclic Fabric module dependency detected: ${[...path, module.namespace].join(" -> ")}`
|
|
122
|
-
);
|
|
123
|
-
}
|
|
124
|
-
visiting.add(module.namespace);
|
|
125
|
-
for (const dependency of (module.dependencies ?? []).map(getModuleDependencyNamespace)) {
|
|
126
|
-
const dependencyModule = modulesByNamespace.get(dependency);
|
|
127
|
-
if (!dependencyModule) {
|
|
128
|
-
if (registeredNamespaces.has(dependency)) {
|
|
129
|
-
continue;
|
|
130
|
-
}
|
|
131
|
-
throw new Error(`Module "${module.namespace}" depends on missing module "${dependency}".`);
|
|
132
|
-
}
|
|
133
|
-
visit(dependencyModule, [...path, module.namespace]);
|
|
134
|
-
}
|
|
135
|
-
visiting.delete(module.namespace);
|
|
136
|
-
visited.add(module.namespace);
|
|
137
|
-
sorted.push(module);
|
|
138
|
-
}
|
|
139
|
-
for (const module of modules) {
|
|
140
|
-
visit(module, []);
|
|
141
|
-
}
|
|
142
|
-
return sorted;
|
|
143
|
-
}
|
|
144
|
-
function registerFabricModule(module) {
|
|
145
|
-
validateManifest(module, { availableNamespaces: registeredModuleNamespaces });
|
|
146
|
-
for (const objectType of module.objectTypes ?? []) {
|
|
147
|
-
chunkQETQGAXJ_cjs.registerObjectType(getObjectTypeName(objectType));
|
|
148
|
-
}
|
|
149
|
-
for (const subjectType of module.subjectTypes ?? []) {
|
|
150
|
-
chunkJAXDEK5Z_cjs.registerSubjectType(subjectType);
|
|
151
|
-
}
|
|
152
|
-
for (const eventType of module.eventTypes ?? []) {
|
|
153
|
-
chunkJAXDEK5Z_cjs.registerEventType(getEventTypeName(eventType));
|
|
154
|
-
}
|
|
155
|
-
for (const policy of module.policies ?? []) {
|
|
156
|
-
chunkNJL3US7H_cjs.registerPolicyIfMissing(policy);
|
|
157
|
-
}
|
|
158
|
-
for (const machine of module.stateMachines ?? []) {
|
|
159
|
-
chunkUV252FLT_cjs.registerStateMachineIfMissing(machine);
|
|
160
|
-
}
|
|
161
|
-
for (const action of module.actions ?? []) {
|
|
162
|
-
chunkBWNPGRRV_cjs.registerActionIfMissing(action);
|
|
163
|
-
}
|
|
164
|
-
for (const descriptor of module.displayRenderers ?? []) {
|
|
165
|
-
chunkEO4VSB2O_cjs.registerDisplayRenderer(descriptor.eventType, descriptor.renderer);
|
|
166
|
-
}
|
|
167
|
-
registeredModuleNamespaces.add(module.namespace);
|
|
168
|
-
}
|
|
169
|
-
function registerFabricModules(modules) {
|
|
170
|
-
const availableNamespaces = /* @__PURE__ */ new Set([
|
|
171
|
-
...registeredModuleNamespaces,
|
|
172
|
-
...modules.map((module) => module.namespace)
|
|
173
|
-
]);
|
|
174
|
-
const plannedEventTypes = new Set(
|
|
175
|
-
modules.flatMap((module) => (module.eventTypes ?? []).map(getEventTypeName))
|
|
176
|
-
);
|
|
177
|
-
for (const module of modules) {
|
|
178
|
-
validateManifest(module, { availableNamespaces, plannedEventTypes });
|
|
179
|
-
}
|
|
180
|
-
const sortedModules = sortModulesByDependency(modules);
|
|
181
|
-
for (const module of sortedModules) {
|
|
182
|
-
registerFabricModule(module);
|
|
183
|
-
}
|
|
184
|
-
return sortedModules;
|
|
185
|
-
}
|
|
186
|
-
|
|
187
|
-
exports.createModuleRegistry = createModuleRegistry;
|
|
188
|
-
exports.getEventTypeName = getEventTypeName;
|
|
189
|
-
exports.getModuleDependencyNamespace = getModuleDependencyNamespace;
|
|
190
|
-
exports.getObjectTypeName = getObjectTypeName;
|
|
191
|
-
exports.registerFabricModule = registerFabricModule;
|
|
192
|
-
exports.registerFabricModules = registerFabricModules;
|
|
193
|
-
exports.validateModuleNamespace = validateModuleNamespace;
|
|
194
|
-
//# sourceMappingURL=chunk-SSYKDXR4.cjs.map
|
|
195
|
-
//# sourceMappingURL=chunk-SSYKDXR4.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../modules/index.ts"],"names":["isValidEventType","registerObjectType","registerSubjectType","registerEventType","registerPolicyIfMissing","registerStateMachineIfMissing","registerActionIfMissing","registerDisplayRenderer"],"mappings":"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","file":"chunk-SSYKDXR4.cjs","sourcesContent":["import { registerActionIfMissing, type ActionDefinition } from \"../actions\";\nimport { registerDisplayRenderer, type DisplayRenderer } from \"../displays\";\nimport { isValidEventType, registerEventType, registerSubjectType } from \"../events\";\nimport { registerObjectType } from \"../objects\";\nimport { registerPolicyIfMissing, type PolicyEvaluator } from \"../policies\";\nimport { registerStateMachineIfMissing, type StateMachineDefinition } from \"../state-machines\";\n\nexport interface ModuleDependency {\n\tnamespace: string;\n\tversion?: string;\n\toptional?: boolean;\n}\n\nexport type ModuleDependencyInput = string | ModuleDependency;\n\nexport interface IdPrefixRegistration {\n\tprefix: string;\n\tname: string;\n\tmodule: string;\n}\n\nexport interface EventTypeRegistration {\n\teventType: string;\n\tschemaVersion: number;\n\tdescription?: string;\n}\n\nexport type EventTypeRegistrationInput = string | EventTypeRegistration;\n\nexport interface ObjectTypeRegistration {\n\ttype: string;\n\tdisplayName?: string;\n\tidPrefix?: string;\n\tisCoreModuleType?: boolean;\n}\n\nexport type ObjectTypeRegistrationInput = string | ObjectTypeRegistration;\n\nexport interface ModuleDisplayRendererRegistration {\n\teventType: string;\n\trenderer: DisplayRenderer;\n}\n\nexport interface PolicyRegistration {\n\tid: string;\n\tversion?: string;\n\tdescription?: string;\n}\n\nexport interface StateMachineRegistration {\n\tentityType: string;\n\tstates: string[];\n}\n\nexport interface FabricModule<TDb = unknown> {\n\tnamespace: string;\n\tversion?: string;\n\tdisplayName?: string;\n\tdescription?: string;\n\tdependencies?: ModuleDependencyInput[];\n\tobjectTypes?: ObjectTypeRegistrationInput[];\n\tsubjectTypes?: string[];\n\tidPrefixes?: IdPrefixRegistration[];\n\teventTypes?: EventTypeRegistrationInput[];\n\tactions?: ActionDefinition<TDb>[];\n\tpolicies?: unknown[];\n\tstateMachines?: unknown[];\n\tdisplayRenderers?: ModuleDisplayRendererRegistration[];\n\tadapterDefinitions?: unknown[];\n\tpermissions?: unknown[];\n\troles?: unknown[];\n\tredactionRules?: unknown[];\n\tdataClassifications?: unknown[];\n\tretentionRules?: unknown[];\n\tevidenceRenderers?: unknown[];\n}\n\nexport interface ModuleRegistry<TDb = unknown> {\n\tmodules: ReadonlyMap<string, FabricModule<TDb>>;\n}\n\ninterface ModuleValidationContext {\n\tavailableNamespaces?: Set<string>;\n\tplannedEventTypes?: Set<string>;\n}\n\nconst registeredModuleNamespaces = new Set<string>();\n\nexport function getModuleDependencyNamespace(dependency: ModuleDependencyInput): string {\n\treturn typeof dependency === \"string\" ? dependency : dependency.namespace;\n}\n\nexport function getObjectTypeName(objectType: ObjectTypeRegistrationInput): string {\n\treturn typeof objectType === \"string\" ? objectType : objectType.type;\n}\n\nexport function getEventTypeName(eventType: EventTypeRegistrationInput): string {\n\treturn typeof eventType === \"string\" ? eventType : eventType.eventType;\n}\n\nexport function validateModuleNamespace(namespace: string): void {\n\tif (!namespace) {\n\t\tthrow new Error(\"Module namespace cannot be empty\");\n\t}\n\tif (!/^[a-z][a-z0-9-]*$/.test(namespace)) {\n\t\tthrow new Error(\n\t\t\t`Invalid module namespace: \"${namespace}\". Must be lowercase letters, numbers, and hyphens only.`,\n\t\t);\n\t}\n}\n\nexport function createModuleRegistry<TDb = unknown>(\n\tmodules: FabricModule<TDb>[] = [],\n): ModuleRegistry<TDb> {\n\tconst registered = new Map<string, FabricModule<TDb>>();\n\tfor (const module of modules) {\n\t\tvalidateModuleNamespace(module.namespace);\n\t\tif (registered.has(module.namespace)) {\n\t\t\tthrow new Error(`Duplicate FabricModule namespace \"${module.namespace}\".`);\n\t\t}\n\t\tregistered.set(module.namespace, module);\n\t}\n\treturn { modules: registered };\n}\n\nfunction validateIdentifierList(\n\tvalues: string[] | undefined,\n\tlabel: string,\n\tnamespace: string,\n): void {\n\tfor (const value of values ?? []) {\n\t\tif (!value) {\n\t\t\tthrow new Error(`Module \"${namespace}\" has an empty ${label} entry.`);\n\t\t}\n\t}\n}\n\nfunction validateManifest(module: FabricModule<unknown>, context: ModuleValidationContext = {}): void {\n\tvalidateModuleNamespace(module.namespace);\n\n\tconst dependencies = (module.dependencies ?? []).map(getModuleDependencyNamespace);\n\tconst objectTypes = (module.objectTypes ?? []).map(getObjectTypeName);\n\tconst eventTypes = (module.eventTypes ?? []).map(getEventTypeName);\n\n\tfor (const dependency of dependencies) {\n\t\tvalidateModuleNamespace(dependency);\n\t\tif (dependency === module.namespace) {\n\t\t\tthrow new Error(`Module \"${module.namespace}\" cannot depend on itself.`);\n\t\t}\n\t\tif (context.availableNamespaces && !context.availableNamespaces.has(dependency)) {\n\t\t\tthrow new Error(`Module \"${module.namespace}\" depends on missing module \"${dependency}\".`);\n\t\t}\n\t}\n\n\tvalidateIdentifierList(objectTypes, \"objectTypes\", module.namespace);\n\tvalidateIdentifierList(module.subjectTypes, \"subjectTypes\", module.namespace);\n\tvalidateIdentifierList(eventTypes, \"eventTypes\", module.namespace);\n\n\tfor (const objectType of objectTypes) {\n\t\tif (!/^[A-Z][a-zA-Z0-9]*$/.test(objectType)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Invalid object type: \"${objectType}\". Object types must be PascalCase alphanumeric.`,\n\t\t\t);\n\t\t}\n\t}\n\n\tfor (const action of module.actions ?? []) {\n\t\tif (!/^[a-z][a-z0-9-]*\\.[a-z][a-z0-9_]*$/.test(action.actionId)) {\n\t\t\tthrow new Error(`Invalid action ID: ${action.actionId}`);\n\t\t}\n\n\t\tif (action.namespace !== module.namespace) {\n\t\t\tthrow new Error(\n\t\t\t\t`Action \"${action.actionId}\" declares namespace \"${action.namespace}\" ` +\n\t\t\t\t\t`but is registered by module \"${module.namespace}\".`,\n\t\t\t);\n\t\t}\n\n\t\tif (!action.actionId.startsWith(`${module.namespace}.`)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Action \"${action.actionId}\" must start with module namespace \"${module.namespace}.\"`,\n\t\t\t);\n\t\t}\n\n\t\tif (action.mutatesDomain && action.emitsEvents.length === 0) {\n\t\t\tthrow new Error(\n\t\t\t\t`Action \"${action.actionId}\" mutates domain but emits no events. ` +\n\t\t\t\t\t`Every mutating action must emit at least one AssetEvent.`,\n\t\t\t);\n\t\t}\n\t}\n\n\tfor (const descriptor of module.displayRenderers ?? []) {\n\t\tconst isPlannedEventType = context.plannedEventTypes?.has(descriptor.eventType) ?? false;\n\t\tconst isModuleEventType = eventTypes.includes(descriptor.eventType);\n\t\tif (!isValidEventType(descriptor.eventType) && !isModuleEventType && !isPlannedEventType) {\n\t\t\tthrow new Error(\n\t\t\t\t`Display renderer registered for unknown event type \"${descriptor.eventType}\". ` +\n\t\t\t\t\t`Register the event type before adding a display renderer.`,\n\t\t\t);\n\t\t}\n\t}\n}\n\nfunction sortModulesByDependency(\n\tmodules: FabricModule<unknown>[],\n\tregisteredNamespaces = registeredModuleNamespaces,\n): FabricModule<unknown>[] {\n\tconst modulesByNamespace = new Map<string, FabricModule<unknown>>();\n\n\tfor (const module of modules) {\n\t\tvalidateModuleNamespace(module.namespace);\n\t\tif (modulesByNamespace.has(module.namespace)) {\n\t\t\tthrow new Error(`Duplicate Fabric module namespace \"${module.namespace}\".`);\n\t\t}\n\t\tmodulesByNamespace.set(module.namespace, module);\n\t}\n\n\tconst sorted: FabricModule<unknown>[] = [];\n\tconst visiting = new Set<string>();\n\tconst visited = new Set<string>();\n\n\tfunction visit(module: FabricModule<unknown>, path: string[]): void {\n\t\tif (visited.has(module.namespace)) {\n\t\t\treturn;\n\t\t}\n\t\tif (visiting.has(module.namespace)) {\n\t\t\tthrow new Error(\n\t\t\t\t`Cyclic Fabric module dependency detected: ${[...path, module.namespace].join(\" -> \")}`,\n\t\t\t);\n\t\t}\n\n\t\tvisiting.add(module.namespace);\n\t\tfor (const dependency of (module.dependencies ?? []).map(getModuleDependencyNamespace)) {\n\t\t\tconst dependencyModule = modulesByNamespace.get(dependency);\n\t\t\tif (!dependencyModule) {\n\t\t\t\tif (registeredNamespaces.has(dependency)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tthrow new Error(`Module \"${module.namespace}\" depends on missing module \"${dependency}\".`);\n\t\t\t}\n\t\t\tvisit(dependencyModule, [...path, module.namespace]);\n\t\t}\n\t\tvisiting.delete(module.namespace);\n\t\tvisited.add(module.namespace);\n\t\tsorted.push(module);\n\t}\n\n\tfor (const module of modules) {\n\t\tvisit(module, []);\n\t}\n\n\treturn sorted;\n}\n\nexport function registerFabricModule(module: FabricModule<unknown>): void {\n\tvalidateManifest(module, { availableNamespaces: registeredModuleNamespaces });\n\n\tfor (const objectType of module.objectTypes ?? []) {\n\t\tregisterObjectType(getObjectTypeName(objectType));\n\t}\n\n\tfor (const subjectType of module.subjectTypes ?? []) {\n\t\tregisterSubjectType(subjectType);\n\t}\n\n\tfor (const eventType of module.eventTypes ?? []) {\n\t\tregisterEventType(getEventTypeName(eventType));\n\t}\n\n\tfor (const policy of module.policies ?? []) {\n\t\tregisterPolicyIfMissing(policy as PolicyEvaluator);\n\t}\n\n\tfor (const machine of module.stateMachines ?? []) {\n\t\tregisterStateMachineIfMissing(machine as StateMachineDefinition);\n\t}\n\n\tfor (const action of module.actions ?? []) {\n\t\tregisterActionIfMissing(action);\n\t}\n\n\tfor (const descriptor of module.displayRenderers ?? []) {\n\t\tregisterDisplayRenderer(descriptor.eventType, descriptor.renderer as DisplayRenderer);\n\t}\n\n\tregisteredModuleNamespaces.add(module.namespace);\n}\n\nexport function registerFabricModules(modules: FabricModule<unknown>[]): FabricModule<unknown>[] {\n\tconst availableNamespaces = new Set([\n\t\t...registeredModuleNamespaces,\n\t\t...modules.map((module) => module.namespace),\n\t]);\n\tconst plannedEventTypes = new Set(\n\t\tmodules.flatMap((module) => (module.eventTypes ?? []).map(getEventTypeName)),\n\t);\n\n\tfor (const module of modules) {\n\t\tvalidateManifest(module, { availableNamespaces, plannedEventTypes });\n\t}\n\n\tconst sortedModules = sortModulesByDependency(modules);\n\tfor (const module of sortedModules) {\n\t\tregisterFabricModule(module);\n\t}\n\n\treturn sortedModules;\n}\n"]}
|