@cratis/scene.components 3.4.0 → 3.6.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/README.md +87 -3
- package/bindings/ArcBoundComponents.tsx +40 -0
- package/bindings/BoundConstructor.ts +5 -5
- package/bindings/bindingRegistry.ts +52 -4
- package/bindings/for_bindingRegistry/when_registering_query_identities.ts +81 -0
- package/bindings/for_requireArcProxy/NativeProxies.ts +28 -0
- package/bindings/for_requireArcProxy/when_mounting_bound_adapters.tsx +73 -0
- package/bindings/for_requireArcProxy/when_previewing_without_arc.tsx +37 -0
- package/bindings/for_requireArcProxy/when_validating_a_proxy.ts +44 -0
- package/bindings/requireArcProxy.ts +24 -0
- package/cratisComponents.ts +4 -1
- package/cratisComponentsPackage.ts +3 -1
- package/data/SceneDataTable.tsx +1 -1
- package/data/SceneObservableDataTable.tsx +1 -1
- package/data/SceneSingleResult.tsx +29 -0
- package/data/SingleResultRuntime.tsx +103 -0
- package/data/SingleResultStatus.tsx +13 -0
- package/data/for_SceneDataTable/when_forwarding_query_arguments.tsx +23 -2
- package/data/for_SceneSingleResult/when_executing_a_native_query.tsx +290 -0
- package/data/for_SceneSingleResult/when_gating_the_lazy_runtime.tsx +60 -0
- package/data/index.ts +1 -0
- package/dialogs/SceneCommandDialog.tsx +1 -1
- package/dialogs/SceneStepperCommandDialog.tsx +1 -1
- package/dist/cjs/bindings/ArcBoundComponents.js +55 -0
- package/dist/cjs/bindings/ArcBoundComponents.js.map +1 -0
- package/dist/cjs/bindings/bindingRegistry.js +52 -4
- package/dist/cjs/bindings/bindingRegistry.js.map +1 -1
- package/dist/cjs/bindings/requireArcProxy.js +25 -0
- package/dist/cjs/bindings/requireArcProxy.js.map +1 -0
- package/dist/cjs/cratisComponents.js +4 -0
- package/dist/cjs/cratisComponents.js.map +1 -1
- package/dist/cjs/cratisComponentsPackage.js +3 -1
- package/dist/cjs/cratisComponentsPackage.js.map +1 -1
- package/dist/cjs/data/SceneDataTable.js +1 -1
- package/dist/cjs/data/SceneDataTable.js.map +1 -1
- package/dist/cjs/data/SceneObservableDataTable.js +1 -1
- package/dist/cjs/data/SceneObservableDataTable.js.map +1 -1
- package/dist/cjs/data/SceneSingleResult.js +41 -0
- package/dist/cjs/data/SceneSingleResult.js.map +1 -0
- package/dist/cjs/data/SingleResultRuntime.js +137 -0
- package/dist/cjs/data/SingleResultRuntime.js.map +1 -0
- package/dist/cjs/data/SingleResultStatus.js +23 -0
- package/dist/cjs/data/SingleResultStatus.js.map +1 -0
- package/dist/cjs/dialogs/SceneCommandDialog.js +1 -1
- package/dist/cjs/dialogs/SceneCommandDialog.js.map +1 -1
- package/dist/cjs/dialogs/SceneStepperCommandDialog.js +1 -1
- package/dist/cjs/dialogs/SceneStepperCommandDialog.js.map +1 -1
- package/dist/cjs/forms/SceneQueryInputForm.js +141 -0
- package/dist/cjs/forms/SceneQueryInputForm.js.map +1 -0
- package/dist/cjs/forms/fields/SceneRadioButtonField.js +4 -1
- package/dist/cjs/forms/fields/SceneRadioButtonField.js.map +1 -1
- package/dist/cjs/forms/queryInputs.js +50 -0
- package/dist/cjs/forms/queryInputs.js.map +1 -0
- package/dist/cjs/index.js +8 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/cjs/pages/SceneDataPage.js +1 -1
- package/dist/cjs/pages/SceneDataPage.js.map +1 -1
- package/dist/esm/bindings/ArcBoundComponents.d.ts +18 -0
- package/dist/esm/bindings/ArcBoundComponents.d.ts.map +1 -0
- package/dist/esm/bindings/ArcBoundComponents.js +49 -0
- package/dist/esm/bindings/ArcBoundComponents.js.map +1 -0
- package/dist/esm/bindings/bindingRegistry.d.ts +4 -0
- package/dist/esm/bindings/bindingRegistry.d.ts.map +1 -1
- package/dist/esm/bindings/bindingRegistry.js +49 -5
- package/dist/esm/bindings/bindingRegistry.js.map +1 -1
- package/dist/esm/bindings/for_bindingRegistry/when_registering_query_identities.d.ts +2 -0
- package/dist/esm/bindings/for_bindingRegistry/when_registering_query_identities.d.ts.map +1 -0
- package/dist/esm/bindings/for_bindingRegistry/when_registering_query_identities.js +73 -0
- package/dist/esm/bindings/for_bindingRegistry/when_registering_query_identities.js.map +1 -0
- package/dist/esm/bindings/for_requireArcProxy/NativeProxies.d.ts +25 -0
- package/dist/esm/bindings/for_requireArcProxy/NativeProxies.d.ts.map +1 -0
- package/dist/esm/bindings/for_requireArcProxy/NativeProxies.js +23 -0
- package/dist/esm/bindings/for_requireArcProxy/NativeProxies.js.map +1 -0
- package/dist/esm/bindings/for_requireArcProxy/when_mounting_bound_adapters.d.ts +2 -0
- package/dist/esm/bindings/for_requireArcProxy/when_mounting_bound_adapters.d.ts.map +1 -0
- package/dist/esm/bindings/for_requireArcProxy/when_mounting_bound_adapters.js +56 -0
- package/dist/esm/bindings/for_requireArcProxy/when_mounting_bound_adapters.js.map +1 -0
- package/dist/esm/bindings/for_requireArcProxy/when_previewing_without_arc.d.ts +2 -0
- package/dist/esm/bindings/for_requireArcProxy/when_previewing_without_arc.d.ts.map +1 -0
- package/dist/esm/bindings/for_requireArcProxy/when_previewing_without_arc.js +32 -0
- package/dist/esm/bindings/for_requireArcProxy/when_previewing_without_arc.js.map +1 -0
- package/dist/esm/bindings/for_requireArcProxy/when_validating_a_proxy.d.ts +2 -0
- package/dist/esm/bindings/for_requireArcProxy/when_validating_a_proxy.d.ts.map +1 -0
- package/dist/esm/bindings/for_requireArcProxy/when_validating_a_proxy.js +45 -0
- package/dist/esm/bindings/for_requireArcProxy/when_validating_a_proxy.js.map +1 -0
- package/dist/esm/bindings/requireArcProxy.d.ts +5 -0
- package/dist/esm/bindings/requireArcProxy.d.ts.map +1 -0
- package/dist/esm/bindings/requireArcProxy.js +23 -0
- package/dist/esm/bindings/requireArcProxy.js.map +1 -0
- package/dist/esm/cratisComponents.d.ts.map +1 -1
- package/dist/esm/cratisComponents.js +4 -0
- package/dist/esm/cratisComponents.js.map +1 -1
- package/dist/esm/cratisComponentsPackage.d.ts.map +1 -1
- package/dist/esm/cratisComponentsPackage.js +3 -1
- package/dist/esm/cratisComponentsPackage.js.map +1 -1
- package/dist/esm/data/SceneDataTable.js +1 -1
- package/dist/esm/data/SceneDataTable.js.map +1 -1
- package/dist/esm/data/SceneObservableDataTable.js +1 -1
- package/dist/esm/data/SceneObservableDataTable.js.map +1 -1
- package/dist/esm/data/SceneSingleResult.d.ts +3 -0
- package/dist/esm/data/SceneSingleResult.d.ts.map +1 -0
- package/dist/esm/data/SceneSingleResult.js +39 -0
- package/dist/esm/data/SceneSingleResult.js.map +1 -0
- package/dist/esm/data/SingleResultRuntime.d.ts +10 -0
- package/dist/esm/data/SingleResultRuntime.d.ts.map +1 -0
- package/dist/esm/data/SingleResultRuntime.js +133 -0
- package/dist/esm/data/SingleResultRuntime.js.map +1 -0
- package/dist/esm/data/SingleResultStatus.d.ts +7 -0
- package/dist/esm/data/SingleResultStatus.d.ts.map +1 -0
- package/dist/esm/data/SingleResultStatus.js +21 -0
- package/dist/esm/data/SingleResultStatus.js.map +1 -0
- package/dist/esm/data/for_SceneDataTable/when_forwarding_query_arguments.js +21 -4
- package/dist/esm/data/for_SceneDataTable/when_forwarding_query_arguments.js.map +1 -1
- package/dist/esm/data/for_SceneSingleResult/when_executing_a_native_query.d.ts +2 -0
- package/dist/esm/data/for_SceneSingleResult/when_executing_a_native_query.d.ts.map +1 -0
- package/dist/esm/data/for_SceneSingleResult/when_executing_a_native_query.js +255 -0
- package/dist/esm/data/for_SceneSingleResult/when_executing_a_native_query.js.map +1 -0
- package/dist/esm/data/for_SceneSingleResult/when_gating_the_lazy_runtime.d.ts +2 -0
- package/dist/esm/data/for_SceneSingleResult/when_gating_the_lazy_runtime.d.ts.map +1 -0
- package/dist/esm/data/for_SceneSingleResult/when_gating_the_lazy_runtime.js +54 -0
- package/dist/esm/data/for_SceneSingleResult/when_gating_the_lazy_runtime.js.map +1 -0
- package/dist/esm/data/index.d.ts +1 -0
- package/dist/esm/data/index.d.ts.map +1 -1
- package/dist/esm/data/index.js +1 -0
- package/dist/esm/data/index.js.map +1 -1
- package/dist/esm/dialogs/SceneCommandDialog.js +1 -1
- package/dist/esm/dialogs/SceneCommandDialog.js.map +1 -1
- package/dist/esm/dialogs/SceneStepperCommandDialog.js +1 -1
- package/dist/esm/dialogs/SceneStepperCommandDialog.js.map +1 -1
- package/dist/esm/for_cratisComponentsPackage/when_describing_query_input_form.d.ts +2 -0
- package/dist/esm/for_cratisComponentsPackage/when_describing_query_input_form.d.ts.map +1 -0
- package/dist/esm/for_cratisComponentsPackage/when_describing_query_input_form.js +14 -0
- package/dist/esm/for_cratisComponentsPackage/when_describing_query_input_form.js.map +1 -0
- package/dist/esm/for_cratisComponentsPackage/when_describing_single_result.d.ts +2 -0
- package/dist/esm/for_cratisComponentsPackage/when_describing_single_result.d.ts.map +1 -0
- package/dist/esm/for_cratisComponentsPackage/when_describing_single_result.js +16 -0
- package/dist/esm/for_cratisComponentsPackage/when_describing_single_result.js.map +1 -0
- package/dist/esm/forms/SceneQueryInputForm.d.ts +3 -0
- package/dist/esm/forms/SceneQueryInputForm.d.ts.map +1 -0
- package/dist/esm/forms/SceneQueryInputForm.js +139 -0
- package/dist/esm/forms/SceneQueryInputForm.js.map +1 -0
- package/dist/esm/forms/fields/SceneRadioButtonField.d.ts.map +1 -1
- package/dist/esm/forms/fields/SceneRadioButtonField.js +4 -1
- package/dist/esm/forms/fields/SceneRadioButtonField.js.map +1 -1
- package/dist/esm/forms/fields/for_SceneRadioButtonField/when_mapping_the_group_name.d.ts +2 -0
- package/dist/esm/forms/fields/for_SceneRadioButtonField/when_mapping_the_group_name.d.ts.map +1 -0
- package/dist/esm/forms/fields/for_SceneRadioButtonField/when_mapping_the_group_name.js +38 -0
- package/dist/esm/forms/fields/for_SceneRadioButtonField/when_mapping_the_group_name.js.map +1 -0
- package/dist/esm/forms/fields/for_resolveFieldBinding/when_resolving_a_field_binding.js +4 -0
- package/dist/esm/forms/fields/for_resolveFieldBinding/when_resolving_a_field_binding.js.map +1 -1
- package/dist/esm/forms/for_SceneQueryInputForm/ProjectLookup.d.ts +26 -0
- package/dist/esm/forms/for_SceneQueryInputForm/ProjectLookup.d.ts.map +1 -0
- package/dist/esm/forms/for_SceneQueryInputForm/ProjectLookup.js +44 -0
- package/dist/esm/forms/for_SceneQueryInputForm/ProjectLookup.js.map +1 -0
- package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_generated_guid_parameters.d.ts +2 -0
- package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_generated_guid_parameters.d.ts.map +1 -0
- package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_generated_guid_parameters.js +175 -0
- package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_generated_guid_parameters.js.map +1 -0
- package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_native_queries.d.ts +2 -0
- package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_native_queries.d.ts.map +1 -0
- package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_native_queries.js +413 -0
- package/dist/esm/forms/for_SceneQueryInputForm/when_submitting_native_queries.js.map +1 -0
- package/dist/esm/forms/index.d.ts +2 -0
- package/dist/esm/forms/index.d.ts.map +1 -1
- package/dist/esm/forms/index.js +1 -0
- package/dist/esm/forms/index.js.map +1 -1
- package/dist/esm/forms/queryInputs.d.ts +10 -0
- package/dist/esm/forms/queryInputs.d.ts.map +1 -0
- package/dist/esm/forms/queryInputs.js +47 -0
- package/dist/esm/forms/queryInputs.js.map +1 -0
- package/dist/esm/index.js +3 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/pages/SceneDataPage.js +1 -1
- package/dist/esm/pages/SceneDataPage.js.map +1 -1
- package/dist/esm/tsconfig.tsbuildinfo +1 -1
- package/for_cratisComponentsPackage/when_describing_query_input_form.ts +17 -0
- package/for_cratisComponentsPackage/when_describing_single_result.ts +20 -0
- package/forms/SceneQueryInputForm.tsx +79 -0
- package/forms/fields/SceneRadioButtonField.tsx +4 -1
- package/forms/fields/for_SceneRadioButtonField/when_mapping_the_group_name.tsx +45 -0
- package/forms/fields/for_resolveFieldBinding/when_resolving_a_field_binding.ts +6 -0
- package/forms/for_SceneQueryInputForm/ProjectLookup.ts +54 -0
- package/forms/for_SceneQueryInputForm/when_submitting_generated_guid_parameters.tsx +188 -0
- package/forms/for_SceneQueryInputForm/when_submitting_native_queries.tsx +423 -0
- package/forms/index.ts +2 -0
- package/forms/queryInputs.ts +50 -0
- package/package.json +23 -7
- package/pages/SceneDataPage.tsx +1 -1
|
@@ -2,6 +2,40 @@
|
|
|
2
2
|
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
3
|
const queries = new Map();
|
|
4
4
|
const commands = new Map();
|
|
5
|
+
// Opt-in identities are separate from the legacy last-registration-wins namespace.
|
|
6
|
+
const queryIdentities = new Map();
|
|
7
|
+
const queryBindingListeners = new Set();
|
|
8
|
+
function notifyQueryBindings() {
|
|
9
|
+
for (const listener of queryBindingListeners)listener();
|
|
10
|
+
}
|
|
11
|
+
/** Subscribe to exact-binding changes. Existing adapters retain their render-time lookup contract. */ function subscribeQueryBindings(listener) {
|
|
12
|
+
queryBindingListeners.add(listener);
|
|
13
|
+
return ()=>{
|
|
14
|
+
queryBindingListeners.delete(listener);
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Registers one source identity for an exact query name. The same identity replaces on hot reload;
|
|
19
|
+
* different identities remain distinct candidates, even when their constructors happen to match.
|
|
20
|
+
* Legacy resolution also accepts a unique identity when no legacy registration exists.
|
|
21
|
+
*/ function registerQueryIdentity(name, identity, queryClass) {
|
|
22
|
+
const candidates = queryIdentities.get(name) ?? new Map();
|
|
23
|
+
candidates.set(identity, queryClass);
|
|
24
|
+
queryIdentities.set(name, candidates);
|
|
25
|
+
notifyQueryBindings();
|
|
26
|
+
}
|
|
27
|
+
/** Removes a source identity when a generated module is removed or renamed. */ function unregisterQueryIdentity(name, identity) {
|
|
28
|
+
const candidates = queryIdentities.get(name);
|
|
29
|
+
candidates?.delete(identity);
|
|
30
|
+
if (candidates?.size === 0) queryIdentities.delete(name);
|
|
31
|
+
notifyQueryBindings();
|
|
32
|
+
}
|
|
33
|
+
/** Exact binding: a legacy registration counts as one candidate alongside opt-in identities. */ function resolveExactQuery(name) {
|
|
34
|
+
const legacy = queries.get(name);
|
|
35
|
+
const candidates = queryIdentities.get(name);
|
|
36
|
+
if ((legacy ? 1 : 0) + (candidates?.size ?? 0) > 1) return 'ambiguous';
|
|
37
|
+
return legacy ?? candidates?.values().next().value;
|
|
38
|
+
}
|
|
5
39
|
/**
|
|
6
40
|
* Registers an Arc query proxy under the name screens refer to it by.
|
|
7
41
|
*
|
|
@@ -19,6 +53,7 @@ const commands = new Map();
|
|
|
19
53
|
* the previous run.
|
|
20
54
|
*/ function registerQuery(name, queryClass) {
|
|
21
55
|
queries.set(name, queryClass);
|
|
56
|
+
notifyQueryBindings();
|
|
22
57
|
}
|
|
23
58
|
/**
|
|
24
59
|
* Registers several query proxies at once, keyed by the name screens refer to each by.
|
|
@@ -32,13 +67,17 @@ const commands = new Map();
|
|
|
32
67
|
}
|
|
33
68
|
}
|
|
34
69
|
/**
|
|
35
|
-
*
|
|
70
|
+
* Legacy registrations are authoritative. Otherwise resolve a unique source identity, or `undefined`
|
|
71
|
+
* when absent or ambiguous (existing adapters display their unresolved-binding placeholder).
|
|
36
72
|
*
|
|
37
73
|
* `undefined` rather than a throw: design-time preview in Studio normally has nothing registered at all,
|
|
38
74
|
* and a screen still has to render so its layout can be worked on. Every adapter turns `undefined` into
|
|
39
75
|
* a visible placeholder naming the binding it wanted.
|
|
40
76
|
*/ function resolveQuery(name) {
|
|
41
|
-
|
|
77
|
+
const legacy = queries.get(name);
|
|
78
|
+
if (legacy) return legacy;
|
|
79
|
+
const candidates = queryIdentities.get(name);
|
|
80
|
+
return candidates?.size === 1 ? candidates.values().next().value : undefined;
|
|
42
81
|
}
|
|
43
82
|
/**
|
|
44
83
|
* Registers an Arc command proxy under the name screens refer to it by. The command half of
|
|
@@ -59,14 +98,17 @@ const commands = new Map();
|
|
|
59
98
|
return commands.get(name);
|
|
60
99
|
}
|
|
61
100
|
/**
|
|
62
|
-
*
|
|
101
|
+
* The sorted union of legacy and identity query names, including ambiguous names.
|
|
63
102
|
*
|
|
64
103
|
* A design-time tool uses this to offer the names a screen can actually bind to, and a diagnostics
|
|
65
104
|
* surface uses it to explain a placeholder - "this screen wants `AllInvoices`, and here is what is
|
|
66
105
|
* registered" is a far more useful message than the placeholder alone.
|
|
67
106
|
*/ function registeredQueryNames() {
|
|
68
107
|
return [
|
|
69
|
-
...
|
|
108
|
+
...new Set([
|
|
109
|
+
...queries.keys(),
|
|
110
|
+
...queryIdentities.keys()
|
|
111
|
+
])
|
|
70
112
|
].sort();
|
|
71
113
|
}
|
|
72
114
|
/**
|
|
@@ -85,7 +127,9 @@ const commands = new Map();
|
|
|
85
127
|
*/ function clearBindings() {
|
|
86
128
|
queries.clear();
|
|
87
129
|
commands.clear();
|
|
130
|
+
queryIdentities.clear();
|
|
131
|
+
notifyQueryBindings();
|
|
88
132
|
}
|
|
89
133
|
|
|
90
|
-
export { clearBindings, registerCommand, registerCommands, registerQueries, registerQuery, registeredCommandNames, registeredQueryNames, resolveCommand, resolveQuery };
|
|
134
|
+
export { clearBindings, registerCommand, registerCommands, registerQueries, registerQuery, registerQueryIdentity, registeredCommandNames, registeredQueryNames, resolveCommand, resolveExactQuery, resolveQuery, subscribeQueryBindings, unregisterQueryIdentity };
|
|
91
135
|
//# sourceMappingURL=bindingRegistry.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"bindingRegistry.js","sources":["../../../bindings/bindingRegistry.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { BoundConstructor } from './BoundConstructor';\n\nconst queries = new Map<string, BoundConstructor>();\nconst commands = new Map<string, BoundConstructor>();\n\n/**\n * Registers an Arc query proxy under the name screens refer to it by.\n *\n * This is the seam that makes the Arc-bound half of `@cratis/components` usable from Scene at all. A\n * screen says `data Invoices via query AllInvoices`, and by the time that reaches a renderer it is an\n * `ExternalComponent` whose `properties` bag holds the *string* `'AllInvoices'` - a property bag carries\n * plain values and named slots, and there is no way to put a TypeScript class into one. `DataTableForQuery`\n * needs the class. The name is the only thing that survives the trip, so the name is what the lookup has\n * to be keyed on, and a host that owns the generated proxies is the only party that can supply the class\n * behind it.\n *\n * A host - Stage's generated application, or Studio's preview when it is wired to a real backend -\n * registers every proxy a screen can name, once, during startup. Registering the same name twice\n * replaces the earlier registration, so a host can re-register on hot reload without having to unwind\n * the previous run.\n */\nexport function registerQuery(name: string, queryClass: BoundConstructor): void {\n queries.set(name, queryClass);\n}\n\n/**\n * Registers several query proxies at once, keyed by the name screens refer to each by.\n *\n * Stage generates a module that exports every proxy it produced; handing that module's exports straight\n * to this is the whole of a generated host's registration step, and it stays correct as proxies are\n * added and removed without anyone editing a list.\n */\nexport function registerQueries(bindings: Record<string, BoundConstructor>): void {\n for (const [name, queryClass] of Object.entries(bindings)) {\n registerQuery(name, queryClass);\n }\n}\n\n/**\n * The query proxy registered under a name, or `undefined` when nothing is registered under it.\n *\n * `undefined` rather than a throw: design-time preview in Studio normally has nothing registered at all,\n * and a screen still has to render so its layout can be worked on. Every adapter turns `undefined` into\n * a visible placeholder naming the binding it wanted.\n */\nexport function resolveQuery(name: string): BoundConstructor | undefined {\n return queries.get(name);\n}\n\n/**\n * Registers an Arc command proxy under the name screens refer to it by. The command half of\n * {@link registerQuery}, with the same contract.\n */\nexport function registerCommand(name: string, commandClass: BoundConstructor): void {\n commands.set(name, commandClass);\n}\n\n/**\n * Registers several command proxies at once, keyed by the name screens refer to each by.\n */\nexport function registerCommands(bindings: Record<string, BoundConstructor>): void {\n for (const [name, commandClass] of Object.entries(bindings)) {\n registerCommand(name, commandClass);\n }\n}\n\n/**\n * The command proxy registered under a name, or `undefined` when nothing is registered under it.\n */\nexport function resolveCommand(name: string): BoundConstructor | undefined {\n return commands.get(name);\n}\n\n/**\n * Every registered query name, sorted.\n *\n * A design-time tool uses this to offer the names a screen can actually bind to, and a diagnostics\n * surface uses it to explain a placeholder - \"this screen wants `AllInvoices`, and here is what is\n * registered\" is a far more useful message than the placeholder alone.\n */\nexport function registeredQueryNames(): string[] {\n return [...queries.keys()].sort();\n}\n\n/**\n * Every registered command name, sorted.\n */\nexport function registeredCommandNames(): string[] {\n return [...commands.keys()].sort();\n}\n\n/**\n * Forgets every registered query and command.\n *\n * The registry is module-level state, which is right for a host that registers once at startup but wrong\n * for anything that switches between applications - Studio previewing a different project, or a spec\n * that must not inherit what the previous one registered. Both need a way back to empty.\n */\nexport function clearBindings(): void {\n queries.clear();\n commands.clear();\n}\n"],"names":["queries","Map","commands","registerQuery","name","queryClass","set","registerQueries","bindings","Object","entries","resolveQuery","get","registerCommand","commandClass","registerCommands","resolveCommand","registeredQueryNames","keys","sort","registeredCommandNames","clearBindings","clear"],"mappings":"AAAA;AACA;AAIA,MAAMA,UAAU,IAAIC,GAAAA,EAAAA;AACpB,MAAMC,WAAW,IAAID,GAAAA,EAAAA;AAErB;;;;;;;;;;;;;;;AAeC,IACM,SAASE,aAAAA,CAAcC,IAAY,EAAEC,UAA4B,EAAA;IACpEL,OAAAA,CAAQM,GAAG,CAACF,IAAAA,EAAMC,UAAAA,CAAAA;AACtB;AAEA;;;;;;IAOO,SAASE,eAAAA,CAAgBC,QAA0C,EAAA;IACtE,KAAK,MAAM,CAACJ,IAAAA,EAAMC,UAAAA,CAAW,IAAII,MAAAA,CAAOC,OAAO,CAACF,QAAAA,CAAAA,CAAW;AACvDL,QAAAA,aAAAA,CAAcC,IAAAA,EAAMC,UAAAA,CAAAA;AACxB,IAAA;AACJ;AAEA;;;;;;IAOO,SAASM,YAAAA,CAAaP,IAAY,EAAA;IACrC,OAAOJ,OAAAA,CAAQY,GAAG,CAACR,IAAAA,CAAAA;AACvB;AAEA;;;AAGC,IACM,SAASS,eAAAA,CAAgBT,IAAY,EAAEU,YAA8B,EAAA;IACxEZ,QAAAA,CAASI,GAAG,CAACF,IAAAA,EAAMU,YAAAA,CAAAA;AACvB;AAEA;;IAGO,SAASC,gBAAAA,CAAiBP,QAA0C,EAAA;IACvE,KAAK,MAAM,CAACJ,IAAAA,EAAMU,YAAAA,CAAa,IAAIL,MAAAA,CAAOC,OAAO,CAACF,QAAAA,CAAAA,CAAW;AACzDK,QAAAA,eAAAA,CAAgBT,IAAAA,EAAMU,YAAAA,CAAAA;AAC1B,IAAA;AACJ;AAEA;;IAGO,SAASE,cAAAA,CAAeZ,IAAY,EAAA;IACvC,OAAOF,QAAAA,CAASU,GAAG,CAACR,IAAAA,CAAAA;AACxB;AAEA;;;;;;AAMC,IACM,SAASa,oBAAAA,GAAAA;IACZ,OAAO;AAAIjB,QAAAA,GAAAA,OAAAA,CAAQkB,IAAI;AAAG,KAAA,CAACC,IAAI,EAAA;AACnC;AAEA;;AAEC,IACM,SAASC,sBAAAA,GAAAA;IACZ,OAAO;AAAIlB,QAAAA,GAAAA,QAAAA,CAASgB,IAAI;AAAG,KAAA,CAACC,IAAI,EAAA;AACpC;AAEA;;;;;;AAMC,IACM,SAASE,aAAAA,GAAAA;AACZrB,IAAAA,OAAAA,CAAQsB,KAAK,EAAA;AACbpB,IAAAA,QAAAA,CAASoB,KAAK,EAAA;AAClB;;"}
|
|
1
|
+
{"version":3,"file":"bindingRegistry.js","sources":["../../../bindings/bindingRegistry.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { BoundConstructor } from './BoundConstructor';\n\nconst queries = new Map<string, BoundConstructor>();\nconst commands = new Map<string, BoundConstructor>();\n// Opt-in identities are separate from the legacy last-registration-wins namespace.\nconst queryIdentities = new Map<string, Map<string, BoundConstructor>>();\nconst queryBindingListeners = new Set<() => void>();\n\nfunction notifyQueryBindings(): void {\n for (const listener of queryBindingListeners) listener();\n}\n\n/** Subscribe to exact-binding changes. Existing adapters retain their render-time lookup contract. */\nexport function subscribeQueryBindings(listener: () => void): () => void {\n queryBindingListeners.add(listener);\n return () => { queryBindingListeners.delete(listener); };\n}\n\n/**\n * Registers one source identity for an exact query name. The same identity replaces on hot reload;\n * different identities remain distinct candidates, even when their constructors happen to match.\n * Legacy resolution also accepts a unique identity when no legacy registration exists.\n */\nexport function registerQueryIdentity(name: string, identity: string, queryClass: BoundConstructor): void {\n const candidates = queryIdentities.get(name) ?? new Map<string, BoundConstructor>();\n candidates.set(identity, queryClass);\n queryIdentities.set(name, candidates);\n notifyQueryBindings();\n}\n\n/** Removes a source identity when a generated module is removed or renamed. */\nexport function unregisterQueryIdentity(name: string, identity: string): void {\n const candidates = queryIdentities.get(name);\n candidates?.delete(identity);\n if (candidates?.size === 0) queryIdentities.delete(name);\n notifyQueryBindings();\n}\n\n/** Exact binding: a legacy registration counts as one candidate alongside opt-in identities. */\nexport function resolveExactQuery(name: string): BoundConstructor | 'ambiguous' | undefined {\n const legacy = queries.get(name);\n const candidates = queryIdentities.get(name);\n if ((legacy ? 1 : 0) + (candidates?.size ?? 0) > 1) return 'ambiguous';\n return legacy ?? candidates?.values().next().value;\n}\n\n/**\n * Registers an Arc query proxy under the name screens refer to it by.\n *\n * This is the seam that makes the Arc-bound half of `@cratis/components` usable from Scene at all. A\n * screen says `data Invoices via query AllInvoices`, and by the time that reaches a renderer it is an\n * `ExternalComponent` whose `properties` bag holds the *string* `'AllInvoices'` - a property bag carries\n * plain values and named slots, and there is no way to put a TypeScript class into one. `DataTableForQuery`\n * needs the class. The name is the only thing that survives the trip, so the name is what the lookup has\n * to be keyed on, and a host that owns the generated proxies is the only party that can supply the class\n * behind it.\n *\n * A host - Stage's generated application, or Studio's preview when it is wired to a real backend -\n * registers every proxy a screen can name, once, during startup. Registering the same name twice\n * replaces the earlier registration, so a host can re-register on hot reload without having to unwind\n * the previous run.\n */\nexport function registerQuery(name: string, queryClass: BoundConstructor): void {\n queries.set(name, queryClass);\n notifyQueryBindings();\n}\n\n/**\n * Registers several query proxies at once, keyed by the name screens refer to each by.\n *\n * Stage generates a module that exports every proxy it produced; handing that module's exports straight\n * to this is the whole of a generated host's registration step, and it stays correct as proxies are\n * added and removed without anyone editing a list.\n */\nexport function registerQueries(bindings: Record<string, BoundConstructor>): void {\n for (const [name, queryClass] of Object.entries(bindings)) {\n registerQuery(name, queryClass);\n }\n}\n\n/**\n * Legacy registrations are authoritative. Otherwise resolve a unique source identity, or `undefined`\n * when absent or ambiguous (existing adapters display their unresolved-binding placeholder).\n *\n * `undefined` rather than a throw: design-time preview in Studio normally has nothing registered at all,\n * and a screen still has to render so its layout can be worked on. Every adapter turns `undefined` into\n * a visible placeholder naming the binding it wanted.\n */\nexport function resolveQuery(name: string): BoundConstructor | undefined {\n const legacy = queries.get(name);\n if (legacy) return legacy;\n const candidates = queryIdentities.get(name);\n return candidates?.size === 1 ? candidates.values().next().value : undefined;\n}\n\n/**\n * Registers an Arc command proxy under the name screens refer to it by. The command half of\n * {@link registerQuery}, with the same contract.\n */\nexport function registerCommand(name: string, commandClass: BoundConstructor): void {\n commands.set(name, commandClass);\n}\n\n/**\n * Registers several command proxies at once, keyed by the name screens refer to each by.\n */\nexport function registerCommands(bindings: Record<string, BoundConstructor>): void {\n for (const [name, commandClass] of Object.entries(bindings)) {\n registerCommand(name, commandClass);\n }\n}\n\n/**\n * The command proxy registered under a name, or `undefined` when nothing is registered under it.\n */\nexport function resolveCommand(name: string): BoundConstructor | undefined {\n return commands.get(name);\n}\n\n/**\n * The sorted union of legacy and identity query names, including ambiguous names.\n *\n * A design-time tool uses this to offer the names a screen can actually bind to, and a diagnostics\n * surface uses it to explain a placeholder - \"this screen wants `AllInvoices`, and here is what is\n * registered\" is a far more useful message than the placeholder alone.\n */\nexport function registeredQueryNames(): string[] {\n return [...new Set([...queries.keys(), ...queryIdentities.keys()])].sort();\n}\n\n/**\n * Every registered command name, sorted.\n */\nexport function registeredCommandNames(): string[] {\n return [...commands.keys()].sort();\n}\n\n/**\n * Forgets every registered query and command.\n *\n * The registry is module-level state, which is right for a host that registers once at startup but wrong\n * for anything that switches between applications - Studio previewing a different project, or a spec\n * that must not inherit what the previous one registered. Both need a way back to empty.\n */\nexport function clearBindings(): void {\n queries.clear();\n commands.clear();\n queryIdentities.clear();\n notifyQueryBindings();\n}\n"],"names":["queries","Map","commands","queryIdentities","queryBindingListeners","Set","notifyQueryBindings","listener","subscribeQueryBindings","add","delete","registerQueryIdentity","name","identity","queryClass","candidates","get","set","unregisterQueryIdentity","size","resolveExactQuery","legacy","values","next","value","registerQuery","registerQueries","bindings","Object","entries","resolveQuery","undefined","registerCommand","commandClass","registerCommands","resolveCommand","registeredQueryNames","keys","sort","registeredCommandNames","clearBindings","clear"],"mappings":"AAAA;AACA;AAIA,MAAMA,UAAU,IAAIC,GAAAA,EAAAA;AACpB,MAAMC,WAAW,IAAID,GAAAA,EAAAA;AACrB;AACA,MAAME,kBAAkB,IAAIF,GAAAA,EAAAA;AAC5B,MAAMG,wBAAwB,IAAIC,GAAAA,EAAAA;AAElC,SAASC,mBAAAA,GAAAA;IACL,KAAK,MAAMC,YAAYH,qBAAAA,CAAuBG,QAAAA,EAAAA;AAClD;AAEA,uGACO,SAASC,sBAAAA,CAAuBD,QAAoB,EAAA;AACvDH,IAAAA,qBAAAA,CAAsBK,GAAG,CAACF,QAAAA,CAAAA;IAC1B,OAAO,IAAA;AAAQH,QAAAA,qBAAAA,CAAsBM,MAAM,CAACH,QAAAA,CAAAA;AAAW,IAAA,CAAA;AAC3D;AAEA;;;;AAIC,IACM,SAASI,qBAAAA,CAAsBC,IAAY,EAAEC,QAAgB,EAAEC,UAA4B,EAAA;AAC9F,IAAA,MAAMC,UAAAA,GAAaZ,eAAAA,CAAgBa,GAAG,CAACJ,SAAS,IAAIX,GAAAA,EAAAA;IACpDc,UAAAA,CAAWE,GAAG,CAACJ,QAAAA,EAAUC,UAAAA,CAAAA;IACzBX,eAAAA,CAAgBc,GAAG,CAACL,IAAAA,EAAMG,UAAAA,CAAAA;AAC1BT,IAAAA,mBAAAA,EAAAA;AACJ;AAEA,gFACO,SAASY,uBAAAA,CAAwBN,IAAY,EAAEC,QAAgB,EAAA;IAClE,MAAME,UAAAA,GAAaZ,eAAAA,CAAgBa,GAAG,CAACJ,IAAAA,CAAAA;AACvCG,IAAAA,UAAAA,EAAYL,MAAAA,CAAOG,QAAAA,CAAAA;AACnB,IAAA,IAAIE,UAAAA,EAAYI,IAAAA,KAAS,CAAA,EAAGhB,eAAAA,CAAgBO,MAAM,CAACE,IAAAA,CAAAA;AACnDN,IAAAA,mBAAAA,EAAAA;AACJ;AAEA,iGACO,SAASc,iBAAAA,CAAkBR,IAAY,EAAA;IAC1C,MAAMS,MAAAA,GAASrB,OAAAA,CAAQgB,GAAG,CAACJ,IAAAA,CAAAA;IAC3B,MAAMG,UAAAA,GAAaZ,eAAAA,CAAgBa,GAAG,CAACJ,IAAAA,CAAAA;AACvC,IAAA,IAAI,CAACS,MAAAA,GAAS,CAAA,GAAI,CAAA,KAAMN,UAAAA,EAAYI,IAAAA,IAAQ,CAAA,CAAA,GAAK,CAAA,EAAG,OAAO,WAAA;IAC3D,OAAOE,MAAAA,IAAUN,UAAAA,EAAYO,MAAAA,EAAAA,CAASC,IAAAA,EAAAA,CAAOC,KAAAA;AACjD;AAEA;;;;;;;;;;;;;;;AAeC,IACM,SAASC,aAAAA,CAAcb,IAAY,EAAEE,UAA4B,EAAA;IACpEd,OAAAA,CAAQiB,GAAG,CAACL,IAAAA,EAAME,UAAAA,CAAAA;AAClBR,IAAAA,mBAAAA,EAAAA;AACJ;AAEA;;;;;;IAOO,SAASoB,eAAAA,CAAgBC,QAA0C,EAAA;IACtE,KAAK,MAAM,CAACf,IAAAA,EAAME,UAAAA,CAAW,IAAIc,MAAAA,CAAOC,OAAO,CAACF,QAAAA,CAAAA,CAAW;AACvDF,QAAAA,aAAAA,CAAcb,IAAAA,EAAME,UAAAA,CAAAA;AACxB,IAAA;AACJ;AAEA;;;;;;;IAQO,SAASgB,YAAAA,CAAalB,IAAY,EAAA;IACrC,MAAMS,MAAAA,GAASrB,OAAAA,CAAQgB,GAAG,CAACJ,IAAAA,CAAAA;AAC3B,IAAA,IAAIS,QAAQ,OAAOA,MAAAA;IACnB,MAAMN,UAAAA,GAAaZ,eAAAA,CAAgBa,GAAG,CAACJ,IAAAA,CAAAA;IACvC,OAAOG,UAAAA,EAAYI,SAAS,CAAA,GAAIJ,UAAAA,CAAWO,MAAM,EAAA,CAAGC,IAAI,EAAA,CAAGC,KAAK,GAAGO,SAAAA;AACvE;AAEA;;;AAGC,IACM,SAASC,eAAAA,CAAgBpB,IAAY,EAAEqB,YAA8B,EAAA;IACxE/B,QAAAA,CAASe,GAAG,CAACL,IAAAA,EAAMqB,YAAAA,CAAAA;AACvB;AAEA;;IAGO,SAASC,gBAAAA,CAAiBP,QAA0C,EAAA;IACvE,KAAK,MAAM,CAACf,IAAAA,EAAMqB,YAAAA,CAAa,IAAIL,MAAAA,CAAOC,OAAO,CAACF,QAAAA,CAAAA,CAAW;AACzDK,QAAAA,eAAAA,CAAgBpB,IAAAA,EAAMqB,YAAAA,CAAAA;AAC1B,IAAA;AACJ;AAEA;;IAGO,SAASE,cAAAA,CAAevB,IAAY,EAAA;IACvC,OAAOV,QAAAA,CAASc,GAAG,CAACJ,IAAAA,CAAAA;AACxB;AAEA;;;;;;AAMC,IACM,SAASwB,oBAAAA,GAAAA;IACZ,OAAO;AAAI,QAAA,GAAA,IAAI/B,GAAAA,CAAI;AAAIL,YAAAA,GAAAA,OAAAA,CAAQqC,IAAI,EAAA;AAAOlC,YAAAA,GAAAA,eAAAA,CAAgBkC,IAAI;AAAG,SAAA;AAAE,KAAA,CAACC,IAAI,EAAA;AAC5E;AAEA;;AAEC,IACM,SAASC,sBAAAA,GAAAA;IACZ,OAAO;AAAIrC,QAAAA,GAAAA,QAAAA,CAASmC,IAAI;AAAG,KAAA,CAACC,IAAI,EAAA;AACpC;AAEA;;;;;;AAMC,IACM,SAASE,aAAAA,GAAAA;AACZxC,IAAAA,OAAAA,CAAQyC,KAAK,EAAA;AACbvC,IAAAA,QAAAA,CAASuC,KAAK,EAAA;AACdtC,IAAAA,eAAAA,CAAgBsC,KAAK,EAAA;AACrBnC,IAAAA,mBAAAA,EAAAA;AACJ;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"when_registering_query_identities.d.ts","sourceRoot":"","sources":["../../../../bindings/for_bindingRegistry/when_registering_query_identities.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
import { expect } from 'vitest';
|
|
2
|
+
import { clearBindings, registerQuery, registerQueryIdentity, registeredQueryNames, resolveExactQuery, resolveQuery, unregisterQueryIdentity } from '../bindingRegistry';
|
|
3
|
+
class First {
|
|
4
|
+
}
|
|
5
|
+
class Replacement {
|
|
6
|
+
}
|
|
7
|
+
describe('when opting into collision-aware query identities', () => {
|
|
8
|
+
beforeEach(() => clearBindings());
|
|
9
|
+
afterEach(() => clearBindings());
|
|
10
|
+
it('replaces the same source identity on hot reload', () => {
|
|
11
|
+
registerQueryIdentity('Lookup', 'source/Lookup', First);
|
|
12
|
+
registerQueryIdentity('Lookup', 'source/Lookup', Replacement);
|
|
13
|
+
expect(resolveExactQuery('Lookup')).toBe(Replacement);
|
|
14
|
+
expect(resolveQuery('Lookup')).toBe(Replacement);
|
|
15
|
+
expect(registeredQueryNames()).toEqual(['Lookup']);
|
|
16
|
+
});
|
|
17
|
+
it('counts different source identities even for the same constructor', () => {
|
|
18
|
+
registerQueryIdentity('Lookup', 'one/Lookup', First);
|
|
19
|
+
registerQueryIdentity('Lookup', 'two/Lookup', First);
|
|
20
|
+
expect(resolveExactQuery('Lookup')).toBe('ambiguous');
|
|
21
|
+
expect(resolveQuery('Lookup')).toBeUndefined();
|
|
22
|
+
expect(registeredQueryNames()).toEqual(['Lookup']);
|
|
23
|
+
unregisterQueryIdentity('Lookup', 'one/Lookup');
|
|
24
|
+
expect(resolveExactQuery('Lookup')).toBe(First);
|
|
25
|
+
expect(resolveQuery('Lookup')).toBe(First);
|
|
26
|
+
unregisterQueryIdentity('Lookup', 'two/Lookup');
|
|
27
|
+
expect(resolveExactQuery('Lookup')).toBeUndefined();
|
|
28
|
+
expect(resolveQuery('Lookup')).toBeUndefined();
|
|
29
|
+
expect(registeredQueryNames()).toEqual([]);
|
|
30
|
+
});
|
|
31
|
+
it('keeps legacy replacement authoritative while exact resolution counts mixed candidates', () => {
|
|
32
|
+
registerQuery('Lookup', First);
|
|
33
|
+
registerQuery('Lookup', Replacement);
|
|
34
|
+
expect(resolveQuery('Lookup')).toBe(Replacement);
|
|
35
|
+
expect(resolveExactQuery('Lookup')).toBe(Replacement);
|
|
36
|
+
registerQueryIdentity('Lookup', 'source/Lookup', First);
|
|
37
|
+
expect(resolveQuery('Lookup')).toBe(Replacement);
|
|
38
|
+
expect(resolveExactQuery('Lookup')).toBe('ambiguous');
|
|
39
|
+
});
|
|
40
|
+
it('bridges a unique identity to legacy consumers with exact case-sensitive names and clears both maps', () => {
|
|
41
|
+
registerQueryIdentity('Lookup', 'source/Lookup', First);
|
|
42
|
+
expect(resolveQuery('Lookup')).toBe(First);
|
|
43
|
+
expect(resolveQuery('lookup')).toBeUndefined();
|
|
44
|
+
expect(resolveExactQuery('lookup')).toBeUndefined();
|
|
45
|
+
clearBindings();
|
|
46
|
+
expect(resolveQuery('Lookup')).toBeUndefined();
|
|
47
|
+
expect(resolveExactQuery('Lookup')).toBeUndefined();
|
|
48
|
+
expect(registeredQueryNames()).toEqual([]);
|
|
49
|
+
});
|
|
50
|
+
it('lists the sorted union without duplicates, retaining legacy names after identity removal', () => {
|
|
51
|
+
registerQueryIdentity('Zed', 'source/Zed', First);
|
|
52
|
+
registerQueryIdentity('Lookup', 'source/Lookup', First);
|
|
53
|
+
registerQuery('Lookup', Replacement);
|
|
54
|
+
registerQuery('Alpha', First);
|
|
55
|
+
expect(registeredQueryNames()).toEqual(['Alpha', 'Lookup', 'Zed']);
|
|
56
|
+
unregisterQueryIdentity('Lookup', 'source/Lookup');
|
|
57
|
+
unregisterQueryIdentity('Zed', 'source/Zed');
|
|
58
|
+
unregisterQueryIdentity('Missing', 'source/Missing');
|
|
59
|
+
expect(registeredQueryNames()).toEqual(['Alpha', 'Lookup']);
|
|
60
|
+
expect(resolveQuery('Lookup')).toBe(Replacement);
|
|
61
|
+
expect(resolveExactQuery('Lookup')).toBe(Replacement);
|
|
62
|
+
});
|
|
63
|
+
it('gives an existing legacy registration precedence even over multiple identities and later replacements', () => {
|
|
64
|
+
registerQueryIdentity('Lookup', 'one/Lookup', First);
|
|
65
|
+
registerQueryIdentity('Lookup', 'two/Lookup', First);
|
|
66
|
+
registerQuery('Lookup', First);
|
|
67
|
+
registerQuery('Lookup', Replacement);
|
|
68
|
+
registerQueryIdentity('Lookup', 'one/Lookup', Replacement);
|
|
69
|
+
expect(resolveQuery('Lookup')).toBe(Replacement);
|
|
70
|
+
expect(resolveExactQuery('Lookup')).toBe('ambiguous');
|
|
71
|
+
});
|
|
72
|
+
});
|
|
73
|
+
//# sourceMappingURL=when_registering_query_identities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"when_registering_query_identities.js","sourceRoot":"","sources":["../../../../bindings/for_bindingRegistry/when_registering_query_identities.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,aAAa,EAAE,qBAAqB,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,oBAAoB,CAAC;AAEzK,MAAM,KAAK;CAAG;AACd,MAAM,WAAW;CAAG;AAEpB,QAAQ,CAAC,mDAAmD,EAAE,GAAG,EAAE;IAC/D,UAAU,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;IAClC,SAAS,CAAC,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC,CAAC;IAEjC,EAAE,CAAC,iDAAiD,EAAE,GAAG,EAAE;QACvD,qBAAqB,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;QACxD,qBAAqB,CAAC,QAAQ,EAAE,eAAe,EAAE,WAAW,CAAC,CAAC;QAC9D,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;IACvD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kEAAkE,EAAE,GAAG,EAAE;QACxE,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;QACrD,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;QACrD,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtD,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAC/C,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC;QACnD,uBAAuB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAChD,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,uBAAuB,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC;QAChD,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACpD,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAC/C,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uFAAuF,EAAE,GAAG,EAAE;QAC7F,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC/B,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACrC,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACtD,qBAAqB,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;QACxD,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oGAAoG,EAAE,GAAG,EAAE;QAC1G,qBAAqB,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;QACxD,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3C,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAC/C,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACpD,aAAa,EAAE,CAAC;QAChB,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QAC/C,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;QACpD,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,0FAA0F,EAAE,GAAG,EAAE;QAChG,qBAAqB,CAAC,KAAK,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;QAClD,qBAAqB,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;QACxD,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACrC,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9B,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QACnE,uBAAuB,CAAC,QAAQ,EAAE,eAAe,CAAC,CAAC;QACnD,uBAAuB,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAC7C,uBAAuB,CAAC,SAAS,EAAE,gBAAgB,CAAC,CAAC;QACrD,MAAM,CAAC,oBAAoB,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC5D,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uGAAuG,EAAE,GAAG,EAAE;QAC7G,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;QACrD,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,KAAK,CAAC,CAAC;QACrD,aAAa,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QAC/B,aAAa,CAAC,QAAQ,EAAE,WAAW,CAAC,CAAC;QACrC,qBAAqB,CAAC,QAAQ,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;QAC3D,MAAM,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACjD,MAAM,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAC1D,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { QueryFor, ObservableQueryFor } from '@cratis/arc/queries';
|
|
2
|
+
import { Command } from '@cratis/arc/commands';
|
|
3
|
+
export declare class Snapshot extends QueryFor<object[], {
|
|
4
|
+
projectId: string;
|
|
5
|
+
}> {
|
|
6
|
+
readonly route = "/projects";
|
|
7
|
+
readonly parameterDescriptors: never[];
|
|
8
|
+
readonly requiredRequestParameters: string[];
|
|
9
|
+
defaultValue: never[];
|
|
10
|
+
constructor();
|
|
11
|
+
}
|
|
12
|
+
export declare class Live extends ObservableQueryFor<object[], object> {
|
|
13
|
+
readonly route = "/projects";
|
|
14
|
+
readonly parameterDescriptors: never[];
|
|
15
|
+
readonly requiredRequestParameters: never[];
|
|
16
|
+
readonly defaultValue: never[];
|
|
17
|
+
constructor();
|
|
18
|
+
}
|
|
19
|
+
export declare class Save extends Command {
|
|
20
|
+
readonly route = "/save";
|
|
21
|
+
readonly propertyDescriptors: never[];
|
|
22
|
+
readonly requestParameters: never[];
|
|
23
|
+
constructor();
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=NativeProxies.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NativeProxies.d.ts","sourceRoot":"","sources":["../../../../bindings/for_requireArcProxy/NativeProxies.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,qBAAa,QAAS,SAAQ,QAAQ,CAAC,MAAM,EAAE,EAAE;IAAE,SAAS,EAAE,MAAM,CAAA;CAAE,CAAC;IACnE,QAAQ,CAAC,KAAK,eAAe;IAC7B,QAAQ,CAAC,oBAAoB,UAAM;IACnC,QAAQ,CAAC,yBAAyB,WAAiB;IACnD,YAAY,UAAM;IAClB,cAA4F;CAC/F;AAED,qBAAa,IAAK,SAAQ,kBAAkB,CAAC,MAAM,EAAE,EAAE,MAAM,CAAC;IAC1D,QAAQ,CAAC,KAAK,eAAe;IAC7B,QAAQ,CAAC,oBAAoB,UAAM;IACnC,QAAQ,CAAC,yBAAyB,UAAM;IACxC,QAAQ,CAAC,YAAY,UAAM;IAC3B,cAA4F;CAC/F;AAED,qBAAa,IAAK,SAAQ,OAAO;IAC7B,QAAQ,CAAC,KAAK,WAAW;IACzB,QAAQ,CAAC,mBAAmB,UAAM;IAClC,QAAQ,CAAC,iBAAiB,UAAM;IAChC,cAA6F;CAChG"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { QueryFor, ObservableQueryFor } from '@cratis/arc/queries';
|
|
2
|
+
import { Command } from '@cratis/arc/commands';
|
|
3
|
+
export class Snapshot extends QueryFor {
|
|
4
|
+
route = '/projects';
|
|
5
|
+
parameterDescriptors = [];
|
|
6
|
+
requiredRequestParameters = ['projectId'];
|
|
7
|
+
defaultValue = [];
|
|
8
|
+
constructor() { super(Object, true); throw new Error('Must not construct during binding'); }
|
|
9
|
+
}
|
|
10
|
+
export class Live extends ObservableQueryFor {
|
|
11
|
+
route = '/projects';
|
|
12
|
+
parameterDescriptors = [];
|
|
13
|
+
requiredRequestParameters = [];
|
|
14
|
+
defaultValue = [];
|
|
15
|
+
constructor() { super(Object, true); throw new Error('Must not construct during binding'); }
|
|
16
|
+
}
|
|
17
|
+
export class Save extends Command {
|
|
18
|
+
route = '/save';
|
|
19
|
+
propertyDescriptors = [];
|
|
20
|
+
requestParameters = [];
|
|
21
|
+
constructor() { super(Object, false); throw new Error('Must not construct during binding'); }
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=NativeProxies.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"NativeProxies.js","sourceRoot":"","sources":["../../../../bindings/for_requireArcProxy/NativeProxies.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAE/C,MAAM,OAAO,QAAS,SAAQ,QAAyC;IAC1D,KAAK,GAAG,WAAW,CAAC;IACpB,oBAAoB,GAAG,EAAE,CAAC;IAC1B,yBAAyB,GAAG,CAAC,WAAW,CAAC,CAAC;IACnD,YAAY,GAAG,EAAE,CAAC;IAClB,gBAAgB,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC,CAAC;CAC/F;AAED,MAAM,OAAO,IAAK,SAAQ,kBAAoC;IACjD,KAAK,GAAG,WAAW,CAAC;IACpB,oBAAoB,GAAG,EAAE,CAAC;IAC1B,yBAAyB,GAAG,EAAE,CAAC;IAC/B,YAAY,GAAG,EAAE,CAAC;IAC3B,gBAAgB,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC,CAAC;CAC/F;AAED,MAAM,OAAO,IAAK,SAAQ,OAAO;IACpB,KAAK,GAAG,OAAO,CAAC;IAChB,mBAAmB,GAAG,EAAE,CAAC;IACzB,iBAAiB,GAAG,EAAE,CAAC;IAChC,gBAAgB,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC,CAAC,CAAC;CAChG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"when_mounting_bound_adapters.d.ts","sourceRoot":"","sources":["../../../../bindings/for_requireArcProxy/when_mounting_bound_adapters.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { act, cleanup, render, screen } from '@testing-library/react';
|
|
3
|
+
import { expect, vi } from 'vitest';
|
|
4
|
+
import { externalComponent } from '../../given';
|
|
5
|
+
describe('when mounting bound adapters', () => {
|
|
6
|
+
const received = vi.fn();
|
|
7
|
+
let bindings;
|
|
8
|
+
let proxies;
|
|
9
|
+
let adapters;
|
|
10
|
+
let Boundary;
|
|
11
|
+
beforeEach(async () => {
|
|
12
|
+
vi.resetModules();
|
|
13
|
+
received.mockClear();
|
|
14
|
+
const component = (props) => { received(props); return _jsx("span", { children: "Mounted native adapter" }); };
|
|
15
|
+
vi.doMock('@cratis/components/DataTables', () => ({ DataTableForQuery: component, DataTableForObservableQuery: component }));
|
|
16
|
+
vi.doMock('@cratis/components/DataPage', () => ({ DataPage: component }));
|
|
17
|
+
vi.doMock('@cratis/components/CommandDialog', () => ({ CommandDialog: component, StepperCommandDialog: component }));
|
|
18
|
+
bindings = await import('../bindingRegistry');
|
|
19
|
+
bindings.clearBindings();
|
|
20
|
+
proxies = await import('./NativeProxies');
|
|
21
|
+
adapters = await import('../ArcBoundComponents');
|
|
22
|
+
({ ArcRuntimeBoundary: Boundary } = await import('../ArcRuntimeBoundary'));
|
|
23
|
+
vi.spyOn(console, 'error').mockImplementation(() => undefined);
|
|
24
|
+
});
|
|
25
|
+
afterEach(() => {
|
|
26
|
+
cleanup();
|
|
27
|
+
bindings.clearBindings();
|
|
28
|
+
vi.restoreAllMocks();
|
|
29
|
+
vi.doUnmock('@cratis/components/DataTables');
|
|
30
|
+
vi.doUnmock('@cratis/components/DataPage');
|
|
31
|
+
vi.doUnmock('@cratis/components/CommandDialog');
|
|
32
|
+
vi.resetModules();
|
|
33
|
+
});
|
|
34
|
+
it('should pass both supported page kinds and both command dialog constructors unchanged', () => {
|
|
35
|
+
const { BoundDataPage, BoundObservableDataTable, BoundCommandDialog, BoundStepperCommandDialog } = adapters;
|
|
36
|
+
render(_jsxs(_Fragment, { children: [_jsx(BoundDataPage, { query: proxies.Snapshot, title: '', emptyMessage: '', children: undefined }), _jsx(BoundDataPage, { query: proxies.Live, title: '', emptyMessage: '', children: undefined }), _jsx(BoundObservableDataTable, { query: proxies.Live, emptyMessage: '' }), _jsx(BoundCommandDialog, { command: proxies.Save, title: '', visible: true }), _jsx(BoundStepperCommandDialog, { command: proxies.Save, title: '', visible: true })] }));
|
|
37
|
+
expect(received.mock.calls.map(([props]) => props.query ?? props.command)).toEqual([proxies.Snapshot, proxies.Live, proxies.Live, proxies.Save, proxies.Save]);
|
|
38
|
+
});
|
|
39
|
+
it('should visibly reject a wrong-kind registered query without selecting another query', async () => {
|
|
40
|
+
bindings.registerQuery('wrong', proxies.Save);
|
|
41
|
+
bindings.registerQuery('valid', proxies.Snapshot);
|
|
42
|
+
const { SceneDataTable } = await import('../../data/SceneDataTable');
|
|
43
|
+
await act(async () => {
|
|
44
|
+
render(_jsx(SceneDataTable, { element: externalComponent('Cratis.Components:dataTable', { query: 'wrong' }), slots: {} }));
|
|
45
|
+
});
|
|
46
|
+
expect(screen.getByRole('alert')).toBeTruthy();
|
|
47
|
+
expect(received).not.toHaveBeenCalled();
|
|
48
|
+
});
|
|
49
|
+
it('should visibly reject snapshot bindings in observable tables and query bindings in dialogs', () => {
|
|
50
|
+
const { BoundObservableDataTable, BoundCommandDialog, BoundStepperCommandDialog, BoundDataPage } = adapters;
|
|
51
|
+
render(_jsxs(_Fragment, { children: [_jsx(Boundary, { children: _jsx(BoundObservableDataTable, { query: proxies.Snapshot, emptyMessage: '' }) }), _jsx(Boundary, { children: _jsx(BoundCommandDialog, { command: proxies.Snapshot, title: '', visible: true }) }), _jsx(Boundary, { children: _jsx(BoundStepperCommandDialog, { command: proxies.Live, title: '', visible: true }) }), _jsx(Boundary, { children: _jsx(BoundDataPage, { query: proxies.Save, title: '', emptyMessage: '', children: undefined }) })] }));
|
|
52
|
+
expect(screen.getAllByRole('alert')).toHaveLength(4);
|
|
53
|
+
expect(received).not.toHaveBeenCalled();
|
|
54
|
+
});
|
|
55
|
+
});
|
|
56
|
+
//# sourceMappingURL=when_mounting_bound_adapters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"when_mounting_bound_adapters.js","sourceRoot":"","sources":["../../../../bindings/for_requireArcProxy/when_mounting_bound_adapters.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"when_previewing_without_arc.d.ts","sourceRoot":"","sources":["../../../../bindings/for_requireArcProxy/when_previewing_without_arc.tsx"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Fragment as _Fragment, jsx as _jsx } from "react/jsx-runtime";
|
|
2
|
+
import { act, cleanup, render, screen } from '@testing-library/react';
|
|
3
|
+
import { expect, vi } from 'vitest';
|
|
4
|
+
import { externalComponent } from '../../given';
|
|
5
|
+
describe('when previewing bound adapters without Arc', () => {
|
|
6
|
+
const loaded = vi.fn();
|
|
7
|
+
afterEach(() => {
|
|
8
|
+
cleanup();
|
|
9
|
+
vi.doUnmock('../ArcBoundComponents');
|
|
10
|
+
vi.resetModules();
|
|
11
|
+
});
|
|
12
|
+
it('should show missing bindings without importing the Arc runtime module', async () => {
|
|
13
|
+
vi.resetModules();
|
|
14
|
+
vi.doMock('../ArcBoundComponents', () => {
|
|
15
|
+
loaded();
|
|
16
|
+
throw new Error('Arc is unavailable in preview');
|
|
17
|
+
});
|
|
18
|
+
const { clearBindings } = await import('../bindingRegistry');
|
|
19
|
+
clearBindings();
|
|
20
|
+
const { SceneDataTable } = await import('../../data/SceneDataTable');
|
|
21
|
+
const { SceneObservableDataTable } = await import('../../data/SceneObservableDataTable');
|
|
22
|
+
const { SceneDataPage } = await import('../../pages/SceneDataPage');
|
|
23
|
+
const { SceneCommandDialog } = await import('../../dialogs/SceneCommandDialog');
|
|
24
|
+
const { SceneStepperCommandDialog } = await import('../../dialogs/SceneStepperCommandDialog');
|
|
25
|
+
await act(async () => {
|
|
26
|
+
render(_jsx(_Fragment, { children: [SceneDataTable, SceneObservableDataTable, SceneDataPage, SceneCommandDialog, SceneStepperCommandDialog].map((Adapter, index) => _jsx(Adapter, { element: externalComponent('Cratis.Components:preview', { query: 'missing', command: 'missing' }), slots: {} }, index)) }));
|
|
27
|
+
});
|
|
28
|
+
expect(screen.getAllByText(/Unresolved .* binding 'missing'/)).toHaveLength(5);
|
|
29
|
+
expect(loaded).not.toHaveBeenCalled();
|
|
30
|
+
});
|
|
31
|
+
});
|
|
32
|
+
//# sourceMappingURL=when_previewing_without_arc.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"when_previewing_without_arc.js","sourceRoot":"","sources":["../../../../bindings/for_requireArcProxy/when_previewing_without_arc.tsx"],"names":[],"mappings":";AAGA,OAAO,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AACpC,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAEhD,QAAQ,CAAC,4CAA4C,EAAE,GAAG,EAAE;IACxD,MAAM,MAAM,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC;IAEvB,SAAS,CAAC,GAAG,EAAE;QACX,OAAO,EAAE,CAAC;QACV,EAAE,CAAC,QAAQ,CAAC,uBAAuB,CAAC,CAAC;QACrC,EAAE,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,uEAAuE,EAAE,KAAK,IAAI,EAAE;QACnF,EAAE,CAAC,YAAY,EAAE,CAAC;QAClB,EAAE,CAAC,MAAM,CAAC,uBAAuB,EAAE,GAAG,EAAE;YACpC,MAAM,EAAE,CAAC;YACT,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAC;QACrD,CAAC,CAAC,CAAC;QACH,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QAC7D,aAAa,EAAE,CAAC;QAChB,MAAM,EAAE,cAAc,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QACrE,MAAM,EAAE,wBAAwB,EAAE,GAAG,MAAM,MAAM,CAAC,qCAAqC,CAAC,CAAC;QACzF,MAAM,EAAE,aAAa,EAAE,GAAG,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAAC;QACpE,MAAM,EAAE,kBAAkB,EAAE,GAAG,MAAM,MAAM,CAAC,kCAAkC,CAAC,CAAC;QAChF,MAAM,EAAE,yBAAyB,EAAE,GAAG,MAAM,MAAM,CAAC,yCAAyC,CAAC,CAAC;QAC9F,MAAM,GAAG,CAAC,KAAK,IAAI,EAAE;YACjB,MAAM,CAAC,4BAAG,CAAC,cAAc,EAAE,wBAAwB,EAAE,aAAa,EAAE,kBAAkB,EAAE,yBAAyB,CAAC,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CACtI,KAAC,OAAO,IAAa,OAAO,EAAE,iBAAiB,CAAC,2BAA2B,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,KAAK,EAAE,EAAE,IAAnH,KAAK,CAAkH,CAAC,GAAI,CAAC,CAAC;QACpJ,CAAC,CAAC,CAAC;QACH,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,iCAAiC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC/E,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;IAC1C,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"when_validating_a_proxy.d.ts","sourceRoot":"","sources":["../../../../bindings/for_requireArcProxy/when_validating_a_proxy.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { expect } from 'vitest';
|
|
2
|
+
import { QueryFor, ObservableQueryFor } from '@cratis/arc/queries';
|
|
3
|
+
import { Command } from '@cratis/arc/commands';
|
|
4
|
+
import { requireArcProxy } from '../requireArcProxy';
|
|
5
|
+
import { registerQuery, resolveQuery, clearBindings } from '../bindingRegistry';
|
|
6
|
+
import { Snapshot, Live, Save } from './NativeProxies';
|
|
7
|
+
describe('when validating a proxy at the lazy Arc boundary', () => {
|
|
8
|
+
afterEach(clearBindings);
|
|
9
|
+
it('should preserve native constructors without constructing them and satisfy public component props', () => {
|
|
10
|
+
const query = requireArcProxy(Snapshot, QueryFor, 'query');
|
|
11
|
+
const observable = requireArcProxy(Live, ObservableQueryFor, 'observable query');
|
|
12
|
+
const command = requireArcProxy(Save, Command, 'command');
|
|
13
|
+
expect(query).toBe(Snapshot);
|
|
14
|
+
expect(observable).toBe(Live);
|
|
15
|
+
expect(command).toBe(Save);
|
|
16
|
+
});
|
|
17
|
+
it('should reject wrong kinds rather than perform an observable query as a snapshot', () => {
|
|
18
|
+
expect(() => requireArcProxy(Live, QueryFor, 'query')).toThrow('Invalid query binding');
|
|
19
|
+
expect(() => requireArcProxy(Snapshot, ObservableQueryFor, 'observable query')).toThrow('Invalid observable query binding');
|
|
20
|
+
expect(() => requireArcProxy(Snapshot, Command, 'command')).toThrow('Invalid command binding');
|
|
21
|
+
expect(() => requireArcProxy(Save, QueryFor, 'query')).toThrow('Invalid query binding');
|
|
22
|
+
});
|
|
23
|
+
it('should preserve arbitrary constructor registration but reject it at an Arc adapter', () => {
|
|
24
|
+
class Arbitrary {
|
|
25
|
+
input;
|
|
26
|
+
constructor(input) {
|
|
27
|
+
this.input = input;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
registerQuery('arbitrary', Arbitrary);
|
|
31
|
+
expect(resolveQuery('arbitrary')).toBe(Arbitrary);
|
|
32
|
+
expect(() => requireArcProxy(Arbitrary, QueryFor, 'query')).toThrow('Invalid query binding');
|
|
33
|
+
});
|
|
34
|
+
it('should reject a native subclass requiring constructor arguments without invoking it', () => {
|
|
35
|
+
class NeedsArguments extends Snapshot {
|
|
36
|
+
input;
|
|
37
|
+
constructor(input) {
|
|
38
|
+
super();
|
|
39
|
+
this.input = input;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
expect(() => requireArcProxy(NeedsArguments, QueryFor, 'query')).toThrow('zero-argument Arc');
|
|
43
|
+
});
|
|
44
|
+
});
|
|
45
|
+
//# sourceMappingURL=when_validating_a_proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"when_validating_a_proxy.js","sourceRoot":"","sources":["../../../../bindings/for_requireArcProxy/when_validating_a_proxy.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,QAAQ,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACnE,OAAO,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAI/C,OAAO,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AAEvD,QAAQ,CAAC,kDAAkD,EAAE,GAAG,EAAE;IAC9D,SAAS,CAAC,aAAa,CAAC,CAAC;IAEzB,EAAE,CAAC,kGAAkG,EAAE,GAAG,EAAE;QACxG,MAAM,KAAK,GAAsD,eAAe,CAAC,QAAQ,EAAE,QAAwB,EAAE,OAAO,CAAC,CAAC;QAC9H,MAAM,UAAU,GAAgE,eAAe,CAAC,IAAI,EAAE,kBAAkC,EAAE,kBAAkB,CAAC,CAAC;QAC9J,MAAM,OAAO,GAAoD,eAAe,CAAC,IAAI,EAAE,OAAuB,EAAE,SAAS,CAAC,CAAC;QAC3H,MAAM,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC7B,MAAM,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9B,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC/B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iFAAiF,EAAE,GAAG,EAAE;QACvF,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,QAAwB,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;QACxG,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,QAAQ,EAAE,kBAAkC,EAAE,kBAAkB,CAAC,CAAC,CAAC,OAAO,CAAC,kCAAkC,CAAC,CAAC;QAC5I,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,QAAQ,EAAE,OAAuB,EAAE,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAC/G,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,IAAI,EAAE,QAAwB,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IAC5G,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,oFAAoF,EAAE,GAAG,EAAE;QAC1F,MAAM,SAAS;YAAwB,KAAK;YAA1B,YAAqB,KAAa;6BAAb,KAAK;YAAW,CAAC;SAAE;QAC1D,aAAa,CAAC,WAAW,EAAE,SAAS,CAAC,CAAC;QACtC,MAAM,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,SAAS,EAAE,QAAwB,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;IACjH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qFAAqF,EAAE,GAAG,EAAE;QAC3F,MAAM,cAAe,SAAQ,QAAQ;YAAwB,KAAK;YAA1B,YAAqB,KAAa;gBAAI,KAAK,EAAE,CAAC;6BAAzB,KAAK;YAAqB,CAAC;SAAE;QAC1F,MAAM,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,cAAc,EAAE,QAAwB,EAAE,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC,CAAC;IAClH,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requireArcProxy.d.ts","sourceRoot":"","sources":["../../../bindings/requireArcProxy.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAc3D,wBAAgB,eAAe,CAAC,CAAC,SAAS,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,IAAI,EAAE;IAAE,SAAS,EAAE,CAAC,CAAA;CAAE,EAAE,IAAI,EAAE,MAAM,GAAG,UAAU,CAAC,CAM7H"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
// Copyright (c) Cratis. All rights reserved.
|
|
2
|
+
// Licensed under the MIT license. See LICENSE file in the project root for full license information.
|
|
3
|
+
/**
|
|
4
|
+
* Bridge for the generated, zero-argument Arc proxies consumed by Components. The registry remains
|
|
5
|
+
* open to arbitrary constructors; only mounting an Arc adapter requires this narrower contract.
|
|
6
|
+
* Check inheritance without constructing a proxy (constructors can have side effects).
|
|
7
|
+
*
|
|
8
|
+
* This is not structural interface validation: the host still owns the generated subclass's data,
|
|
9
|
+
* argument and implementation correctness. Prototype identity deliberately rejects duck-typed proxies
|
|
10
|
+
* and proxies from a second Arc installation. The arity check enforces the generated convention,
|
|
11
|
+
* not general JavaScript constructor safety (defaults/rest parameters can hide requirements).
|
|
12
|
+
* The single assertion bridges the registry under that host-owned generated-proxy contract; it is
|
|
13
|
+
* not a proof of arbitrary subclass behavior or of erased row/argument types.
|
|
14
|
+
*/ function requireArcProxy(target, base, kind) {
|
|
15
|
+
const prototype = target.prototype;
|
|
16
|
+
if (target.length !== 0 || typeof prototype !== 'object' || prototype === null || !Object.prototype.isPrototypeOf.call(base.prototype, prototype)) {
|
|
17
|
+
throw new Error(`Invalid ${kind} binding '${target.name}': expected a zero-argument Arc ${kind} proxy`);
|
|
18
|
+
}
|
|
19
|
+
return target;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export { requireArcProxy };
|
|
23
|
+
//# sourceMappingURL=requireArcProxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"requireArcProxy.js","sources":["../../../bindings/requireArcProxy.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport type { BoundConstructor } from './BoundConstructor';\n\n/**\n * Bridge for the generated, zero-argument Arc proxies consumed by Components. The registry remains\n * open to arbitrary constructors; only mounting an Arc adapter requires this narrower contract.\n * Check inheritance without constructing a proxy (constructors can have side effects).\n *\n * This is not structural interface validation: the host still owns the generated subclass's data,\n * argument and implementation correctness. Prototype identity deliberately rejects duck-typed proxies\n * and proxies from a second Arc installation. The arity check enforces the generated convention,\n * not general JavaScript constructor safety (defaults/rest parameters can hide requirements).\n * The single assertion bridges the registry under that host-owned generated-proxy contract; it is\n * not a proof of arbitrary subclass behavior or of erased row/argument types.\n */\nexport function requireArcProxy<T extends object>(target: BoundConstructor, base: { prototype: T }, kind: string): new () => T {\n const prototype: unknown = target.prototype;\n if (target.length !== 0 || typeof prototype !== 'object' || prototype === null || !Object.prototype.isPrototypeOf.call(base.prototype, prototype)) {\n throw new Error(`Invalid ${kind} binding '${target.name}': expected a zero-argument Arc ${kind} proxy`);\n }\n return target as new () => T;\n}\n"],"names":["requireArcProxy","target","base","kind","prototype","length","Object","isPrototypeOf","call","Error","name"],"mappings":"AAAA;AACA;AAIA;;;;;;;;;;;AAWC,IACM,SAASA,eAAAA,CAAkCC,MAAwB,EAAEC,IAAsB,EAAEC,IAAY,EAAA;IAC5G,MAAMC,SAAAA,GAAqBH,OAAOG,SAAS;IAC3C,IAAIH,MAAAA,CAAOI,MAAM,KAAK,CAAA,IAAK,OAAOD,SAAAA,KAAc,QAAA,IAAYA,cAAc,IAAA,IAAQ,CAACE,OAAOF,SAAS,CAACG,aAAa,CAACC,IAAI,CAACN,IAAAA,CAAKE,SAAS,EAAEA,SAAAA,CAAAA,EAAY;AAC/I,QAAA,MAAM,IAAIK,KAAAA,CAAM,CAAC,QAAQ,EAAEN,IAAAA,CAAK,UAAU,EAAEF,MAAAA,CAAOS,IAAI,CAAC,gCAAgC,EAAEP,IAAAA,CAAK,MAAM,CAAC,CAAA;AAC1G,IAAA;IACA,OAAOF,MAAAA;AACX;;"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cratisComponents.d.ts","sourceRoot":"","sources":["../../cratisComponents.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAwB,MAAM,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"cratisComponents.d.ts","sourceRoot":"","sources":["../../cratisComponents.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,iBAAiB,EAAwB,MAAM,qBAAqB,CAAC;AA4B9E,eAAO,MAAM,2BAA2B,sBAAsB,CAAC;AAgB/D,eAAO,MAAM,gBAAgB,EAAE,iBA8C9B,CAAC"}
|
|
@@ -2,9 +2,11 @@ import { componentRegistryKey } from '@cratis/scene.react';
|
|
|
2
2
|
import { ScenePage } from './pages/ScenePage.js';
|
|
3
3
|
import { SceneDataPage } from './pages/SceneDataPage.js';
|
|
4
4
|
import { SceneFormElement } from './pages/SceneFormElement.js';
|
|
5
|
+
import { SceneSingleResult } from './data/SceneSingleResult.js';
|
|
5
6
|
import { SceneDataTable } from './data/SceneDataTable.js';
|
|
6
7
|
import { SceneObservableDataTable } from './data/SceneObservableDataTable.js';
|
|
7
8
|
import { SceneCommandForm } from './forms/SceneCommandForm.js';
|
|
9
|
+
import { SceneQueryInputForm } from './forms/SceneQueryInputForm.js';
|
|
8
10
|
import 'react/jsx-runtime';
|
|
9
11
|
import './bindings/resolveElementBinding.js';
|
|
10
12
|
import 'react';
|
|
@@ -63,9 +65,11 @@ import { SceneToolbarSeparator } from './toolbar/SceneToolbarSeparator.js';
|
|
|
63
65
|
[componentRegistryKey(cratisComponentsPackageName, 'page')]: ScenePage,
|
|
64
66
|
[componentRegistryKey(cratisComponentsPackageName, 'dataPage')]: SceneDataPage,
|
|
65
67
|
[componentRegistryKey(cratisComponentsPackageName, 'formElement')]: SceneFormElement,
|
|
68
|
+
[componentRegistryKey(cratisComponentsPackageName, 'singleResult')]: SceneSingleResult,
|
|
66
69
|
[componentRegistryKey(cratisComponentsPackageName, 'dataTable')]: SceneDataTable,
|
|
67
70
|
[componentRegistryKey(cratisComponentsPackageName, 'table')]: SceneDataTable,
|
|
68
71
|
[componentRegistryKey(cratisComponentsPackageName, 'observableDataTable')]: SceneObservableDataTable,
|
|
72
|
+
[componentRegistryKey(cratisComponentsPackageName, 'queryInputForm')]: SceneQueryInputForm,
|
|
69
73
|
[componentRegistryKey(cratisComponentsPackageName, 'commandForm')]: SceneCommandForm,
|
|
70
74
|
[componentRegistryKey(cratisComponentsPackageName, 'inputTextField')]: SceneInputTextField,
|
|
71
75
|
[componentRegistryKey(cratisComponentsPackageName, 'numberField')]: SceneNumberField,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cratisComponents.js","sources":["../../cratisComponents.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ComponentRegistry, componentRegistryKey } from '@cratis/scene.react';\nimport { SceneDataPage, SceneFormElement, ScenePage } from './pages';\nimport { SceneDataTable, SceneObservableDataTable } from './data';\nimport {\n SceneCalendarField,\n SceneCheckboxField,\n SceneChipsField,\n SceneColorPickerField,\n SceneCommandForm,\n SceneDropdownField,\n SceneInputTextField,\n SceneMultiSelectField,\n SceneNumberField,\n SceneRadioButtonField,\n SceneRadioGroupField,\n SceneSliderField,\n SceneTextAreaField,\n} from './forms';\nimport { SceneBusyIndicatorDialog, SceneCommandDialog, SceneConfirmationDialog, SceneDialog, SceneStepperCommandDialog } from './dialogs';\nimport { SceneDropdown, SceneErrorBoundary, SceneIcon, SceneTooltip } from './common';\nimport { SceneFilterPanel, SceneObjectContentEditor, SceneObjectNavigationalBar, SceneSchemaEditor, SceneTimeMachine } from './editors';\nimport { SceneToolbar, SceneToolbarButton, SceneToolbarGroup, SceneToolbarSeparator } from './toolbar';\n\n/**\n * The package name every component here is registered under, and the one a screen writes when it\n * qualifies a name explicitly (`Cratis.Components.table`).\n */\nexport const cratisComponentsPackageName = 'Cratis.Components';\n\n/**\n * The `Cratis.Components` package's component registry - the abstract names a screen can resolve to a\n * real `@cratis/components` component.\n *\n * Names are `lowerCamelCase` and deliberately *abstract*: a screen names `dataTable`, not\n * `DataTableForQuery`, so the same screen resolves against whichever package a profile ranks highest.\n * Two of them - `table` and `dialog` - are names `core` and `PrimeReact` also declare, and that overlap\n * is the point: a profile listing `core`, `PrimeReact`, `Cratis.Components` in that order resolves both\n * here and records the others as shadowed, which is override priority doing exactly what it exists for.\n *\n * `table` and `dataTable` are the same component under two names. `dataTable` says what it is; `table`\n * is what a screen written against the base vocabulary already says, and both should land on the\n * query-aware implementation.\n */\nexport const cratisComponents: ComponentRegistry = {\n [componentRegistryKey(cratisComponentsPackageName, 'page')]: ScenePage,\n [componentRegistryKey(cratisComponentsPackageName, 'dataPage')]: SceneDataPage,\n [componentRegistryKey(cratisComponentsPackageName, 'formElement')]: SceneFormElement,\n\n [componentRegistryKey(cratisComponentsPackageName, 'dataTable')]: SceneDataTable,\n [componentRegistryKey(cratisComponentsPackageName, 'table')]: SceneDataTable,\n [componentRegistryKey(cratisComponentsPackageName, 'observableDataTable')]: SceneObservableDataTable,\n\n [componentRegistryKey(cratisComponentsPackageName, 'commandForm')]: SceneCommandForm,\n [componentRegistryKey(cratisComponentsPackageName, 'inputTextField')]: SceneInputTextField,\n [componentRegistryKey(cratisComponentsPackageName, 'numberField')]: SceneNumberField,\n [componentRegistryKey(cratisComponentsPackageName, 'checkboxField')]: SceneCheckboxField,\n [componentRegistryKey(cratisComponentsPackageName, 'textAreaField')]: SceneTextAreaField,\n [componentRegistryKey(cratisComponentsPackageName, 'dropdownField')]: SceneDropdownField,\n [componentRegistryKey(cratisComponentsPackageName, 'sliderField')]: SceneSliderField,\n [componentRegistryKey(cratisComponentsPackageName, 'calendarField')]: SceneCalendarField,\n [componentRegistryKey(cratisComponentsPackageName, 'colorPickerField')]: SceneColorPickerField,\n [componentRegistryKey(cratisComponentsPackageName, 'multiSelectField')]: SceneMultiSelectField,\n [componentRegistryKey(cratisComponentsPackageName, 'chipsField')]: SceneChipsField,\n [componentRegistryKey(cratisComponentsPackageName, 'radioButtonField')]: SceneRadioButtonField,\n [componentRegistryKey(cratisComponentsPackageName, 'radioGroupField')]: SceneRadioGroupField,\n\n [componentRegistryKey(cratisComponentsPackageName, 'dialog')]: SceneDialog,\n [componentRegistryKey(cratisComponentsPackageName, 'confirmationDialog')]: SceneConfirmationDialog,\n [componentRegistryKey(cratisComponentsPackageName, 'busyIndicatorDialog')]: SceneBusyIndicatorDialog,\n [componentRegistryKey(cratisComponentsPackageName, 'commandDialog')]: SceneCommandDialog,\n [componentRegistryKey(cratisComponentsPackageName, 'stepperCommandDialog')]: SceneStepperCommandDialog,\n\n [componentRegistryKey(cratisComponentsPackageName, 'icon')]: SceneIcon,\n [componentRegistryKey(cratisComponentsPackageName, 'tooltip')]: SceneTooltip,\n [componentRegistryKey(cratisComponentsPackageName, 'dropdown')]: SceneDropdown,\n [componentRegistryKey(cratisComponentsPackageName, 'errorBoundary')]: SceneErrorBoundary,\n\n [componentRegistryKey(cratisComponentsPackageName, 'objectContentEditor')]: SceneObjectContentEditor,\n [componentRegistryKey(cratisComponentsPackageName, 'objectNavigationalBar')]: SceneObjectNavigationalBar,\n [componentRegistryKey(cratisComponentsPackageName, 'schemaEditor')]: SceneSchemaEditor,\n [componentRegistryKey(cratisComponentsPackageName, 'timeMachine')]: SceneTimeMachine,\n [componentRegistryKey(cratisComponentsPackageName, 'filterPanel')]: SceneFilterPanel,\n\n [componentRegistryKey(cratisComponentsPackageName, 'toolbar')]: SceneToolbar,\n [componentRegistryKey(cratisComponentsPackageName, 'toolbarButton')]: SceneToolbarButton,\n [componentRegistryKey(cratisComponentsPackageName, 'toolbarGroup')]: SceneToolbarGroup,\n [componentRegistryKey(cratisComponentsPackageName, 'toolbarSeparator')]: SceneToolbarSeparator,\n};\n"],"names":["cratisComponentsPackageName","cratisComponents","componentRegistryKey","ScenePage","SceneDataPage","SceneFormElement","SceneDataTable","SceneObservableDataTable","SceneCommandForm","SceneInputTextField","SceneNumberField","SceneCheckboxField","SceneTextAreaField","SceneDropdownField","SceneSliderField","SceneCalendarField","SceneColorPickerField","SceneMultiSelectField","SceneChipsField","SceneRadioButtonField","SceneRadioGroupField","SceneDialog","SceneConfirmationDialog","SceneBusyIndicatorDialog","SceneCommandDialog","SceneStepperCommandDialog","SceneIcon","SceneTooltip","SceneDropdown","SceneErrorBoundary","SceneObjectContentEditor","SceneObjectNavigationalBar","SceneSchemaEditor","SceneTimeMachine","SceneFilterPanel","SceneToolbar","SceneToolbarButton","SceneToolbarGroup","SceneToolbarSeparator"],"mappings":"
|
|
1
|
+
{"version":3,"file":"cratisComponents.js","sources":["../../cratisComponents.ts"],"sourcesContent":["// Copyright (c) Cratis. All rights reserved.\n// Licensed under the MIT license. See LICENSE file in the project root for full license information.\n\nimport { ComponentRegistry, componentRegistryKey } from '@cratis/scene.react';\nimport { SceneDataPage, SceneFormElement, ScenePage } from './pages';\nimport { SceneDataTable, SceneObservableDataTable, SceneSingleResult } from './data';\nimport {\n SceneCalendarField,\n SceneCheckboxField,\n SceneChipsField,\n SceneColorPickerField,\n SceneCommandForm,\n SceneQueryInputForm,\n SceneDropdownField,\n SceneInputTextField,\n SceneMultiSelectField,\n SceneNumberField,\n SceneRadioButtonField,\n SceneRadioGroupField,\n SceneSliderField,\n SceneTextAreaField,\n} from './forms';\nimport { SceneBusyIndicatorDialog, SceneCommandDialog, SceneConfirmationDialog, SceneDialog, SceneStepperCommandDialog } from './dialogs';\nimport { SceneDropdown, SceneErrorBoundary, SceneIcon, SceneTooltip } from './common';\nimport { SceneFilterPanel, SceneObjectContentEditor, SceneObjectNavigationalBar, SceneSchemaEditor, SceneTimeMachine } from './editors';\nimport { SceneToolbar, SceneToolbarButton, SceneToolbarGroup, SceneToolbarSeparator } from './toolbar';\n\n/**\n * The package name every component here is registered under, and the one a screen writes when it\n * qualifies a name explicitly (`Cratis.Components.table`).\n */\nexport const cratisComponentsPackageName = 'Cratis.Components';\n\n/**\n * The `Cratis.Components` package's component registry - the abstract names a screen can resolve to a\n * real `@cratis/components` component.\n *\n * Names are `lowerCamelCase` and deliberately *abstract*: a screen names `dataTable`, not\n * `DataTableForQuery`, so the same screen resolves against whichever package a profile ranks highest.\n * Two of them - `table` and `dialog` - are names `core` and `PrimeReact` also declare, and that overlap\n * is the point: a profile listing `core`, `PrimeReact`, `Cratis.Components` in that order resolves both\n * here and records the others as shadowed, which is override priority doing exactly what it exists for.\n *\n * `table` and `dataTable` are the same component under two names. `dataTable` says what it is; `table`\n * is what a screen written against the base vocabulary already says, and both should land on the\n * query-aware implementation.\n */\nexport const cratisComponents: ComponentRegistry = {\n [componentRegistryKey(cratisComponentsPackageName, 'page')]: ScenePage,\n [componentRegistryKey(cratisComponentsPackageName, 'dataPage')]: SceneDataPage,\n [componentRegistryKey(cratisComponentsPackageName, 'formElement')]: SceneFormElement,\n\n [componentRegistryKey(cratisComponentsPackageName, 'singleResult')]: SceneSingleResult,\n [componentRegistryKey(cratisComponentsPackageName, 'dataTable')]: SceneDataTable,\n [componentRegistryKey(cratisComponentsPackageName, 'table')]: SceneDataTable,\n [componentRegistryKey(cratisComponentsPackageName, 'observableDataTable')]: SceneObservableDataTable,\n\n [componentRegistryKey(cratisComponentsPackageName, 'queryInputForm')]: SceneQueryInputForm,\n [componentRegistryKey(cratisComponentsPackageName, 'commandForm')]: SceneCommandForm,\n [componentRegistryKey(cratisComponentsPackageName, 'inputTextField')]: SceneInputTextField,\n [componentRegistryKey(cratisComponentsPackageName, 'numberField')]: SceneNumberField,\n [componentRegistryKey(cratisComponentsPackageName, 'checkboxField')]: SceneCheckboxField,\n [componentRegistryKey(cratisComponentsPackageName, 'textAreaField')]: SceneTextAreaField,\n [componentRegistryKey(cratisComponentsPackageName, 'dropdownField')]: SceneDropdownField,\n [componentRegistryKey(cratisComponentsPackageName, 'sliderField')]: SceneSliderField,\n [componentRegistryKey(cratisComponentsPackageName, 'calendarField')]: SceneCalendarField,\n [componentRegistryKey(cratisComponentsPackageName, 'colorPickerField')]: SceneColorPickerField,\n [componentRegistryKey(cratisComponentsPackageName, 'multiSelectField')]: SceneMultiSelectField,\n [componentRegistryKey(cratisComponentsPackageName, 'chipsField')]: SceneChipsField,\n [componentRegistryKey(cratisComponentsPackageName, 'radioButtonField')]: SceneRadioButtonField,\n [componentRegistryKey(cratisComponentsPackageName, 'radioGroupField')]: SceneRadioGroupField,\n\n [componentRegistryKey(cratisComponentsPackageName, 'dialog')]: SceneDialog,\n [componentRegistryKey(cratisComponentsPackageName, 'confirmationDialog')]: SceneConfirmationDialog,\n [componentRegistryKey(cratisComponentsPackageName, 'busyIndicatorDialog')]: SceneBusyIndicatorDialog,\n [componentRegistryKey(cratisComponentsPackageName, 'commandDialog')]: SceneCommandDialog,\n [componentRegistryKey(cratisComponentsPackageName, 'stepperCommandDialog')]: SceneStepperCommandDialog,\n\n [componentRegistryKey(cratisComponentsPackageName, 'icon')]: SceneIcon,\n [componentRegistryKey(cratisComponentsPackageName, 'tooltip')]: SceneTooltip,\n [componentRegistryKey(cratisComponentsPackageName, 'dropdown')]: SceneDropdown,\n [componentRegistryKey(cratisComponentsPackageName, 'errorBoundary')]: SceneErrorBoundary,\n\n [componentRegistryKey(cratisComponentsPackageName, 'objectContentEditor')]: SceneObjectContentEditor,\n [componentRegistryKey(cratisComponentsPackageName, 'objectNavigationalBar')]: SceneObjectNavigationalBar,\n [componentRegistryKey(cratisComponentsPackageName, 'schemaEditor')]: SceneSchemaEditor,\n [componentRegistryKey(cratisComponentsPackageName, 'timeMachine')]: SceneTimeMachine,\n [componentRegistryKey(cratisComponentsPackageName, 'filterPanel')]: SceneFilterPanel,\n\n [componentRegistryKey(cratisComponentsPackageName, 'toolbar')]: SceneToolbar,\n [componentRegistryKey(cratisComponentsPackageName, 'toolbarButton')]: SceneToolbarButton,\n [componentRegistryKey(cratisComponentsPackageName, 'toolbarGroup')]: SceneToolbarGroup,\n [componentRegistryKey(cratisComponentsPackageName, 'toolbarSeparator')]: SceneToolbarSeparator,\n};\n"],"names":["cratisComponentsPackageName","cratisComponents","componentRegistryKey","ScenePage","SceneDataPage","SceneFormElement","SceneSingleResult","SceneDataTable","SceneObservableDataTable","SceneQueryInputForm","SceneCommandForm","SceneInputTextField","SceneNumberField","SceneCheckboxField","SceneTextAreaField","SceneDropdownField","SceneSliderField","SceneCalendarField","SceneColorPickerField","SceneMultiSelectField","SceneChipsField","SceneRadioButtonField","SceneRadioGroupField","SceneDialog","SceneConfirmationDialog","SceneBusyIndicatorDialog","SceneCommandDialog","SceneStepperCommandDialog","SceneIcon","SceneTooltip","SceneDropdown","SceneErrorBoundary","SceneObjectContentEditor","SceneObjectNavigationalBar","SceneSchemaEditor","SceneTimeMachine","SceneFilterPanel","SceneToolbar","SceneToolbarButton","SceneToolbarGroup","SceneToolbarSeparator"],"mappings":"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"}
|