@flanksource/clicky-ui 0.3.40 → 0.3.41
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 +24 -0
- package/dist/ai.cjs +10 -0
- package/dist/ai.cjs.map +1 -1
- package/dist/ai.js +10 -0
- package/dist/ai.js.map +1 -1
- package/dist/components/AccordionList.cjs +5 -1
- package/dist/components/AccordionList.cjs.map +1 -1
- package/dist/components/AccordionList.d.ts +3 -1
- package/dist/components/AccordionList.d.ts.map +1 -1
- package/dist/components/AccordionList.js +5 -1
- package/dist/components/AccordionList.js.map +1 -1
- package/dist/components/JsonSchemaForm.cjs +9 -4
- package/dist/components/JsonSchemaForm.cjs.map +1 -1
- package/dist/components/JsonSchemaForm.d.ts +1 -1
- package/dist/components/JsonSchemaForm.d.ts.map +1 -1
- package/dist/components/JsonSchemaForm.js +8 -3
- package/dist/components/JsonSchemaForm.js.map +1 -1
- package/dist/components/json-schema-form-accordion-array.cjs +3 -1
- package/dist/components/json-schema-form-accordion-array.cjs.map +1 -1
- package/dist/components/json-schema-form-accordion-array.d.ts +4 -1
- package/dist/components/json-schema-form-accordion-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-accordion-array.js +3 -1
- package/dist/components/json-schema-form-accordion-array.js.map +1 -1
- package/dist/components/json-schema-form-array-view.cjs +63 -0
- package/dist/components/json-schema-form-array-view.cjs.map +1 -0
- package/dist/components/json-schema-form-array-view.d.ts +21 -0
- package/dist/components/json-schema-form-array-view.d.ts.map +1 -0
- package/dist/components/json-schema-form-array-view.js +63 -0
- package/dist/components/json-schema-form-array-view.js.map +1 -0
- package/dist/components/json-schema-form-array.cjs +3 -7
- package/dist/components/json-schema-form-array.cjs.map +1 -1
- package/dist/components/json-schema-form-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-array.js +3 -7
- package/dist/components/json-schema-form-array.js.map +1 -1
- package/dist/components/json-schema-form-conditionals.cjs +67 -0
- package/dist/components/json-schema-form-conditionals.cjs.map +1 -0
- package/dist/components/json-schema-form-conditionals.d.ts +9 -0
- package/dist/components/json-schema-form-conditionals.d.ts.map +1 -0
- package/dist/components/json-schema-form-conditionals.js +67 -0
- package/dist/components/json-schema-form-conditionals.js.map +1 -0
- package/dist/components/json-schema-form-defaults.cjs +68 -0
- package/dist/components/json-schema-form-defaults.cjs.map +1 -0
- package/dist/components/json-schema-form-defaults.d.ts +4 -0
- package/dist/components/json-schema-form-defaults.d.ts.map +1 -0
- package/dist/components/json-schema-form-defaults.js +68 -0
- package/dist/components/json-schema-form-defaults.js.map +1 -0
- package/dist/components/json-schema-form-errors.cjs +49 -31
- package/dist/components/json-schema-form-errors.cjs.map +1 -1
- package/dist/components/json-schema-form-errors.d.ts +4 -2
- package/dist/components/json-schema-form-errors.d.ts.map +1 -1
- package/dist/components/json-schema-form-errors.js +51 -33
- package/dist/components/json-schema-form-errors.js.map +1 -1
- package/dist/components/json-schema-form-filter.cjs +2 -1
- package/dist/components/json-schema-form-filter.cjs.map +1 -1
- package/dist/components/json-schema-form-filter.js +2 -1
- package/dist/components/json-schema-form-filter.js.map +1 -1
- package/dist/components/json-schema-form-item-summary.cjs +6 -2
- package/dist/components/json-schema-form-item-summary.cjs.map +1 -1
- package/dist/components/json-schema-form-item-summary.d.ts.map +1 -1
- package/dist/components/json-schema-form-item-summary.js +6 -2
- package/dist/components/json-schema-form-item-summary.js.map +1 -1
- package/dist/components/json-schema-form-layout.cjs +28 -19
- package/dist/components/json-schema-form-layout.cjs.map +1 -1
- package/dist/components/json-schema-form-layout.d.ts +8 -6
- package/dist/components/json-schema-form-layout.d.ts.map +1 -1
- package/dist/components/json-schema-form-layout.js +29 -20
- package/dist/components/json-schema-form-layout.js.map +1 -1
- package/dist/components/json-schema-form-listener-paths.cjs +52 -0
- package/dist/components/json-schema-form-listener-paths.cjs.map +1 -0
- package/dist/components/json-schema-form-listener-paths.d.ts +10 -0
- package/dist/components/json-schema-form-listener-paths.d.ts.map +1 -0
- package/dist/components/json-schema-form-listener-paths.js +52 -0
- package/dist/components/json-schema-form-listener-paths.js.map +1 -0
- package/dist/components/json-schema-form-listener-types.d.ts +22 -0
- package/dist/components/json-schema-form-listener-types.d.ts.map +1 -0
- package/dist/components/json-schema-form-listeners.cjs +250 -0
- package/dist/components/json-schema-form-listeners.cjs.map +1 -0
- package/dist/components/json-schema-form-listeners.d.ts +13 -0
- package/dist/components/json-schema-form-listeners.d.ts.map +1 -0
- package/dist/components/json-schema-form-listeners.js +250 -0
- package/dist/components/json-schema-form-listeners.js.map +1 -0
- package/dist/components/json-schema-form-object-array-view.cjs +62 -0
- package/dist/components/json-schema-form-object-array-view.cjs.map +1 -0
- package/dist/components/json-schema-form-object-array-view.d.ts +14 -0
- package/dist/components/json-schema-form-object-array-view.d.ts.map +1 -0
- package/dist/components/json-schema-form-object-array-view.js +62 -0
- package/dist/components/json-schema-form-object-array-view.js.map +1 -0
- package/dist/components/json-schema-form-object.cjs +3 -0
- package/dist/components/json-schema-form-object.cjs.map +1 -1
- package/dist/components/json-schema-form-object.d.ts.map +1 -1
- package/dist/components/json-schema-form-object.js +3 -0
- package/dist/components/json-schema-form-object.js.map +1 -1
- package/dist/components/json-schema-form-render.cjs +17 -9
- package/dist/components/json-schema-form-render.cjs.map +1 -1
- package/dist/components/json-schema-form-render.d.ts.map +1 -1
- package/dist/components/json-schema-form-render.js +19 -11
- package/dist/components/json-schema-form-render.js.map +1 -1
- package/dist/components/json-schema-form-resolve.cjs +6 -99
- package/dist/components/json-schema-form-resolve.cjs.map +1 -1
- package/dist/components/json-schema-form-resolve.d.ts +1 -8
- package/dist/components/json-schema-form-resolve.d.ts.map +1 -1
- package/dist/components/json-schema-form-resolve.js +5 -98
- package/dist/components/json-schema-form-resolve.js.map +1 -1
- package/dist/components/json-schema-form-runtime-types.d.ts +15 -0
- package/dist/components/json-schema-form-runtime-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-table-array.cjs +67 -16
- package/dist/components/json-schema-form-table-array.cjs.map +1 -1
- package/dist/components/json-schema-form-table-array.d.ts +4 -1
- package/dist/components/json-schema-form-table-array.d.ts.map +1 -1
- package/dist/components/json-schema-form-table-array.js +70 -19
- package/dist/components/json-schema-form-table-array.js.map +1 -1
- package/dist/components/json-schema-form-types.d.ts +16 -0
- package/dist/components/json-schema-form-types.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.cjs +7 -1
- package/dist/components/json-schema-form-utils.cjs.map +1 -1
- package/dist/components/json-schema-form-utils.d.ts +2 -1
- package/dist/components/json-schema-form-utils.d.ts.map +1 -1
- package/dist/components/json-schema-form-utils.js +7 -1
- package/dist/components/json-schema-form-utils.js.map +1 -1
- package/dist/components.cjs +3 -2
- package/dist/components.cjs.map +1 -1
- package/dist/components.d.ts +3 -2
- package/dist/components.d.ts.map +1 -1
- package/dist/components.js +2 -1
- package/dist/components.js.map +1 -1
- package/dist/data/DataTable.cjs +9 -3
- package/dist/data/DataTable.cjs.map +1 -1
- package/dist/data/DataTable.d.ts +6 -0
- package/dist/data/DataTable.d.ts.map +1 -1
- package/dist/data/DataTable.js +9 -3
- package/dist/data/DataTable.js.map +1 -1
- package/dist/data/FixtureEditor/FixtureEditor.cjs +43 -24
- package/dist/data/FixtureEditor/FixtureEditor.cjs.map +1 -1
- package/dist/data/FixtureEditor/FixtureEditor.d.ts.map +1 -1
- package/dist/data/FixtureEditor/FixtureEditor.js +43 -24
- package/dist/data/FixtureEditor/FixtureEditor.js.map +1 -1
- package/dist/data/Tree.cjs +10 -2
- package/dist/data/Tree.cjs.map +1 -1
- package/dist/data/Tree.d.ts +6 -1
- package/dist/data/Tree.d.ts.map +1 -1
- package/dist/data/Tree.js +10 -2
- package/dist/data/Tree.js.map +1 -1
- package/dist/data/ai/SessionInspector.cjs +143 -167
- package/dist/data/ai/SessionInspector.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.collection-types.d.ts +5 -0
- package/dist/data/ai/SessionInspector.collection-types.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.collection.cjs +18 -5
- package/dist/data/ai/SessionInspector.collection.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.collection.d.ts +2 -0
- package/dist/data/ai/SessionInspector.collection.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.collection.fixtures.d.ts +6 -0
- package/dist/data/ai/SessionInspector.collection.fixtures.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.collection.js +18 -5
- package/dist/data/ai/SessionInspector.collection.js.map +1 -1
- package/dist/data/ai/SessionInspector.d.ts +24 -2
- package/dist/data/ai/SessionInspector.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy-state.cjs +105 -7
- package/dist/data/ai/SessionInspector.hierarchy-state.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy-state.d.ts +12 -1
- package/dist/data/ai/SessionInspector.hierarchy-state.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy-state.js +107 -9
- package/dist/data/ai/SessionInspector.hierarchy-state.js.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.cjs +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.js +1 -1
- package/dist/data/ai/SessionInspector.hierarchy.js.map +1 -1
- package/dist/data/ai/SessionInspector.js +144 -168
- package/dist/data/ai/SessionInspector.js.map +1 -1
- package/dist/data/ai/SessionInspector.legacy.cjs +116 -0
- package/dist/data/ai/SessionInspector.legacy.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.legacy.d.ts +19 -0
- package/dist/data/ai/SessionInspector.legacy.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.legacy.js +116 -0
- package/dist/data/ai/SessionInspector.legacy.js.map +1 -0
- package/dist/data/ai/SessionInspector.panels.cjs +3 -0
- package/dist/data/ai/SessionInspector.panels.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.panels.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.panels.js +3 -0
- package/dist/data/ai/SessionInspector.panels.js.map +1 -1
- package/dist/data/ai/SessionInspector.plan.cjs +29 -12
- package/dist/data/ai/SessionInspector.plan.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.plan.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.plan.js +30 -13
- package/dist/data/ai/SessionInspector.plan.js.map +1 -1
- package/dist/data/ai/SessionInspector.remote-view.cjs +44 -0
- package/dist/data/ai/SessionInspector.remote-view.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.remote-view.d.ts +11 -0
- package/dist/data/ai/SessionInspector.remote-view.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.remote-view.js +44 -0
- package/dist/data/ai/SessionInspector.remote-view.js.map +1 -0
- package/dist/data/ai/SessionInspector.remote.cjs +275 -0
- package/dist/data/ai/SessionInspector.remote.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.remote.d.ts +57 -0
- package/dist/data/ai/SessionInspector.remote.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.remote.js +275 -0
- package/dist/data/ai/SessionInspector.remote.js.map +1 -0
- package/dist/data/ai/SessionInspector.summary.cjs +0 -156
- package/dist/data/ai/SessionInspector.summary.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.summary.d.ts +0 -3
- package/dist/data/ai/SessionInspector.summary.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.summary.js +2 -158
- package/dist/data/ai/SessionInspector.summary.js.map +1 -1
- package/dist/data/ai/SessionInspector.tab-state.cjs +15 -0
- package/dist/data/ai/SessionInspector.tab-state.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.tab-state.d.ts +3 -0
- package/dist/data/ai/SessionInspector.tab-state.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.tab-state.js +15 -0
- package/dist/data/ai/SessionInspector.tab-state.js.map +1 -0
- package/dist/data/ai/SessionInspector.tabs.model.cjs +31 -18
- package/dist/data/ai/SessionInspector.tabs.model.cjs.map +1 -1
- package/dist/data/ai/SessionInspector.tabs.model.d.ts +3 -1
- package/dist/data/ai/SessionInspector.tabs.model.d.ts.map +1 -1
- package/dist/data/ai/SessionInspector.tabs.model.js +32 -19
- package/dist/data/ai/SessionInspector.tabs.model.js.map +1 -1
- package/dist/data/ai/SessionInspector.verification.cjs +53 -0
- package/dist/data/ai/SessionInspector.verification.cjs.map +1 -0
- package/dist/data/ai/SessionInspector.verification.d.ts +7 -0
- package/dist/data/ai/SessionInspector.verification.d.ts.map +1 -0
- package/dist/data/ai/SessionInspector.verification.js +53 -0
- package/dist/data/ai/SessionInspector.verification.js.map +1 -0
- package/dist/data/ai/SessionViewer.model.cjs +7 -1
- package/dist/data/ai/SessionViewer.model.cjs.map +1 -1
- package/dist/data/ai/SessionViewer.model.d.ts +21 -3
- package/dist/data/ai/SessionViewer.model.d.ts.map +1 -1
- package/dist/data/ai/SessionViewer.model.js +7 -1
- package/dist/data/ai/SessionViewer.model.js.map +1 -1
- package/dist/data/ai/SessionViewer.unified.d.ts +13 -0
- package/dist/data/ai/SessionViewer.unified.d.ts.map +1 -1
- package/dist/data/ai/index.d.ts +3 -1
- package/dist/data/ai/index.d.ts.map +1 -1
- package/dist/data/version-info.cjs +3 -3
- package/dist/data/version-info.js +3 -3
- package/dist/devtools/useDebugStream.cjs +5 -1
- package/dist/devtools/useDebugStream.cjs.map +1 -1
- package/dist/devtools/useDebugStream.d.ts.map +1 -1
- package/dist/devtools/useDebugStream.js +6 -2
- package/dist/devtools/useDebugStream.js.map +1 -1
- package/dist/hooks/event-source-provider.cjs +9 -0
- package/dist/hooks/event-source-provider.cjs.map +1 -0
- package/dist/hooks/event-source-provider.d.ts +15 -0
- package/dist/hooks/event-source-provider.d.ts.map +1 -0
- package/dist/hooks/event-source-provider.js +9 -0
- package/dist/hooks/event-source-provider.js.map +1 -0
- package/dist/hooks/event-source.cjs +11 -0
- package/dist/hooks/event-source.cjs.map +1 -0
- package/dist/hooks/event-source.d.ts +22 -0
- package/dist/hooks/event-source.d.ts.map +1 -0
- package/dist/hooks/event-source.js +11 -0
- package/dist/hooks/event-source.js.map +1 -0
- package/dist/hooks/use-log-tail.cjs +5 -1
- package/dist/hooks/use-log-tail.cjs.map +1 -1
- package/dist/hooks/use-log-tail.d.ts.map +1 -1
- package/dist/hooks/use-log-tail.js +5 -1
- package/dist/hooks/use-log-tail.js.map +1 -1
- package/dist/hooks/use-prompts.cjs +5 -1
- package/dist/hooks/use-prompts.cjs.map +1 -1
- package/dist/hooks/use-prompts.d.ts.map +1 -1
- package/dist/hooks/use-prompts.js +6 -2
- package/dist/hooks/use-prompts.js.map +1 -1
- package/dist/hooks/use-task-run.cjs +9 -2
- package/dist/hooks/use-task-run.cjs.map +1 -1
- package/dist/hooks/use-task-run.d.ts.map +1 -1
- package/dist/hooks/use-task-run.js +10 -3
- package/dist/hooks/use-task-run.js.map +1 -1
- package/dist/hooks.cjs +4 -0
- package/dist/hooks.cjs.map +1 -1
- package/dist/hooks.d.ts +2 -0
- package/dist/hooks.d.ts.map +1 -1
- package/dist/hooks.js +4 -0
- package/dist/hooks.js.map +1 -1
- package/dist/icons/programmingCatalog.cjs +34 -34
- package/dist/icons/programmingCatalog.cjs.map +1 -1
- package/dist/icons/programmingCatalog.js +34 -34
- package/dist/icons/programmingCatalog.js.map +1 -1
- package/dist/index.cjs +9 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.js +8 -1
- package/dist/index.js.map +1 -1
- package/dist/monaco/MonacoEditor.cjs +4 -1
- package/dist/monaco/MonacoEditor.cjs.map +1 -1
- package/dist/monaco/MonacoEditor.d.ts +1 -1
- package/dist/monaco/MonacoEditor.d.ts.map +1 -1
- package/dist/monaco/MonacoEditor.js +4 -1
- package/dist/monaco/MonacoEditor.js.map +1 -1
- package/dist/monaco/types.d.ts +2 -1
- package/dist/monaco/types.d.ts.map +1 -1
- package/dist/overlay/CommandPalette.cjs +14 -4
- package/dist/overlay/CommandPalette.cjs.map +1 -1
- package/dist/overlay/CommandPalette.d.ts +5 -1
- package/dist/overlay/CommandPalette.d.ts.map +1 -1
- package/dist/overlay/CommandPalette.js +14 -4
- package/dist/overlay/CommandPalette.js.map +1 -1
- package/dist/overlay/CommandPaletteList.cjs +5 -0
- package/dist/overlay/CommandPaletteList.cjs.map +1 -1
- package/dist/overlay/CommandPaletteList.d.ts +4 -2
- package/dist/overlay/CommandPaletteList.d.ts.map +1 -1
- package/dist/overlay/CommandPaletteList.js +5 -0
- package/dist/overlay/CommandPaletteList.js.map +1 -1
- package/dist/overlay/DropdownMenu.cjs +1 -0
- package/dist/overlay/DropdownMenu.cjs.map +1 -1
- package/dist/overlay/DropdownMenu.js +1 -0
- package/dist/overlay/DropdownMenu.js.map +1 -1
- package/dist/rpc/OperationCatalog.cjs +29 -26
- package/dist/rpc/OperationCatalog.cjs.map +1 -1
- package/dist/rpc/OperationCatalog.d.ts +9 -1
- package/dist/rpc/OperationCatalog.d.ts.map +1 -1
- package/dist/rpc/OperationCatalog.js +29 -26
- package/dist/rpc/OperationCatalog.js.map +1 -1
- package/dist/rpc/OperationEntityContextPicker.cjs +62 -256
- package/dist/rpc/OperationEntityContextPicker.cjs.map +1 -1
- package/dist/rpc/OperationEntityContextPicker.d.ts.map +1 -1
- package/dist/rpc/OperationEntityContextPicker.js +64 -258
- package/dist/rpc/OperationEntityContextPicker.js.map +1 -1
- package/dist/rpc/OperationEntityPicker.cjs +185 -0
- package/dist/rpc/OperationEntityPicker.cjs.map +1 -0
- package/dist/rpc/OperationEntityPicker.d.ts +51 -0
- package/dist/rpc/OperationEntityPicker.d.ts.map +1 -0
- package/dist/rpc/OperationEntityPicker.js +185 -0
- package/dist/rpc/OperationEntityPicker.js.map +1 -0
- package/dist/rpc/OperationEntityPicker.model.cjs +39 -0
- package/dist/rpc/OperationEntityPicker.model.cjs.map +1 -0
- package/dist/rpc/OperationEntityPicker.model.d.ts +27 -0
- package/dist/rpc/OperationEntityPicker.model.d.ts.map +1 -0
- package/dist/rpc/OperationEntityPicker.model.js +39 -0
- package/dist/rpc/OperationEntityPicker.model.js.map +1 -0
- package/dist/rpc/operationCatalogRowSelection.cjs +85 -0
- package/dist/rpc/operationCatalogRowSelection.cjs.map +1 -0
- package/dist/rpc/operationCatalogRowSelection.d.ts +57 -0
- package/dist/rpc/operationCatalogRowSelection.d.ts.map +1 -0
- package/dist/rpc/operationCatalogRowSelection.js +85 -0
- package/dist/rpc/operationCatalogRowSelection.js.map +1 -0
- package/dist/rpc/operationEntityPicker.fixtures.d.ts +13 -0
- package/dist/rpc/operationEntityPicker.fixtures.d.ts.map +1 -0
- package/dist/rpc.cjs +2 -0
- package/dist/rpc.cjs.map +1 -1
- package/dist/rpc.d.ts +2 -0
- package/dist/rpc.d.ts.map +1 -1
- package/dist/rpc.js +2 -0
- package/dist/rpc.js.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +4 -1
- package/schemas/json-schema-form.schema.json +566 -0
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
import { isPlainObject } from "../lib/collections.js";
|
|
2
|
+
import { effectiveProperties } from "./json-schema-form-conditionals.js";
|
|
3
|
+
import { schemaRendersAsObject, isOpenStringMap } from "./json-schema-form-resolve.js";
|
|
4
|
+
function applySchemaDefaults(schema, value) {
|
|
5
|
+
return applyObjectDefaults(schema, value, /* @__PURE__ */ new Set());
|
|
6
|
+
}
|
|
7
|
+
function applyObjectDefaults(schema, value, ancestors) {
|
|
8
|
+
var _a;
|
|
9
|
+
if (ancestors.has(schema)) return value;
|
|
10
|
+
const nextAncestors = new Set(ancestors).add(schema);
|
|
11
|
+
let next = value;
|
|
12
|
+
const maxPasses = Math.min(
|
|
13
|
+
100,
|
|
14
|
+
Object.keys(schema.properties ?? {}).length + (((_a = schema.allOf) == null ? void 0 : _a.length) ?? 0) + 2
|
|
15
|
+
);
|
|
16
|
+
for (let pass = 0; pass < maxPasses; pass += 1) {
|
|
17
|
+
const { properties } = effectiveProperties(schema, next);
|
|
18
|
+
let passChanged = false;
|
|
19
|
+
let passValue = next;
|
|
20
|
+
for (const [key, propertySchema] of Object.entries(properties)) {
|
|
21
|
+
const existing = passValue[key];
|
|
22
|
+
let fieldValue = existing;
|
|
23
|
+
let fieldChanged = false;
|
|
24
|
+
if (existing === void 0 && propertySchema.default !== void 0) {
|
|
25
|
+
fieldValue = cloneSchemaDefault(propertySchema.default);
|
|
26
|
+
fieldChanged = true;
|
|
27
|
+
}
|
|
28
|
+
const structuredObject = schemaRendersAsObject(propertySchema);
|
|
29
|
+
if (structuredObject && !isOpenStringMap(propertySchema)) {
|
|
30
|
+
const objectValue = isPlainObject(fieldValue) ? fieldValue : {};
|
|
31
|
+
const defaultedObject = applyObjectDefaults(
|
|
32
|
+
propertySchema,
|
|
33
|
+
objectValue,
|
|
34
|
+
nextAncestors
|
|
35
|
+
);
|
|
36
|
+
if (defaultedObject !== objectValue) {
|
|
37
|
+
fieldValue = defaultedObject;
|
|
38
|
+
fieldChanged = true;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
if (fieldChanged) {
|
|
42
|
+
if (!passChanged) passValue = { ...next };
|
|
43
|
+
passValue[key] = fieldValue;
|
|
44
|
+
passChanged = true;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (!passChanged) break;
|
|
48
|
+
next = passValue;
|
|
49
|
+
}
|
|
50
|
+
return next;
|
|
51
|
+
}
|
|
52
|
+
function cloneSchemaDefault(value) {
|
|
53
|
+
if (Array.isArray(value)) return value.map(cloneSchemaDefault);
|
|
54
|
+
if (isPlainObject(value)) {
|
|
55
|
+
return Object.fromEntries(
|
|
56
|
+
Object.entries(value).map(([key, entry]) => [
|
|
57
|
+
key,
|
|
58
|
+
cloneSchemaDefault(entry)
|
|
59
|
+
])
|
|
60
|
+
);
|
|
61
|
+
}
|
|
62
|
+
return value;
|
|
63
|
+
}
|
|
64
|
+
export {
|
|
65
|
+
applySchemaDefaults,
|
|
66
|
+
cloneSchemaDefault
|
|
67
|
+
};
|
|
68
|
+
//# sourceMappingURL=json-schema-form-defaults.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"json-schema-form-defaults.js","sources":["../../src/components/json-schema-form-defaults.ts"],"sourcesContent":["import { isPlainObject } from \"../lib/collections\";\nimport type { JsonSchemaObject } from \"./json-schema-form-types\";\nimport { effectiveProperties } from \"./json-schema-form-conditionals\";\nimport { isOpenStringMap, schemaRendersAsObject } from \"./json-schema-form-resolve\";\n\n// applySchemaDefaults fills missing values from JSON Schema `default` keywords.\n// It walks fixed object properties recursively and re-evaluates `if`/`then`\n// branches after each pass, so a defaulted discriminator can activate defaults\n// in its selected branch. Existing values, including null and empty strings, are\n// never replaced. The original value is returned when no defaults apply.\nexport function applySchemaDefaults(\n schema: JsonSchemaObject,\n value: Record<string, unknown>,\n): Record<string, unknown> {\n return applyObjectDefaults(schema, value, new Set());\n}\n\nfunction applyObjectDefaults(\n schema: JsonSchemaObject,\n value: Record<string, unknown>,\n ancestors: Set<JsonSchemaObject>,\n): Record<string, unknown> {\n // Recursive schemas may point back to an ancestor after refs are hydrated.\n if (ancestors.has(schema)) return value;\n const nextAncestors = new Set(ancestors).add(schema);\n let next = value;\n\n // A default can select another conditional branch, so allow enough passes for\n // a chain of discriminator defaults while keeping malformed schemas bounded.\n const maxPasses = Math.min(\n 100,\n Object.keys(schema.properties ?? {}).length +\n (schema.allOf?.length ?? 0) +\n 2,\n );\n for (let pass = 0; pass < maxPasses; pass += 1) {\n const { properties } = effectiveProperties(schema, next);\n let passChanged = false;\n let passValue = next;\n\n for (const [key, propertySchema] of Object.entries(properties)) {\n const existing = passValue[key];\n let fieldValue = existing;\n let fieldChanged = false;\n\n if (existing === undefined && propertySchema.default !== undefined) {\n fieldValue = cloneSchemaDefault(propertySchema.default);\n fieldChanged = true;\n }\n\n const structuredObject = schemaRendersAsObject(propertySchema);\n if (structuredObject && !isOpenStringMap(propertySchema)) {\n const objectValue = isPlainObject(fieldValue)\n ? (fieldValue as Record<string, unknown>)\n : {};\n const defaultedObject = applyObjectDefaults(\n propertySchema as JsonSchemaObject,\n objectValue,\n nextAncestors,\n );\n if (defaultedObject !== objectValue) {\n fieldValue = defaultedObject;\n fieldChanged = true;\n }\n }\n\n if (fieldChanged) {\n if (!passChanged) passValue = { ...next };\n passValue[key] = fieldValue;\n passChanged = true;\n }\n }\n\n if (!passChanged) break;\n next = passValue;\n }\n return next;\n}\n\nexport function cloneSchemaDefault(value: unknown): unknown {\n if (Array.isArray(value)) return value.map(cloneSchemaDefault);\n if (isPlainObject(value)) {\n return Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, entry]) => [\n key,\n cloneSchemaDefault(entry),\n ]),\n );\n }\n return value;\n}\n"],"names":[],"mappings":";;;AAUO,SAAS,oBACd,QACA,OACyB;AACzB,SAAO,oBAAoB,QAAQ,OAAO,oBAAI,KAAK;AACrD;AAEA,SAAS,oBACP,QACA,OACA,WACyB;;AAEzB,MAAI,UAAU,IAAI,MAAM,EAAG,QAAO;AAClC,QAAM,gBAAgB,IAAI,IAAI,SAAS,EAAE,IAAI,MAAM;AACnD,MAAI,OAAO;AAIX,QAAM,YAAY,KAAK;AAAA,IACrB;AAAA,IACA,OAAO,KAAK,OAAO,cAAc,CAAA,CAAE,EAAE,YAClC,YAAO,UAAP,mBAAc,WAAU,KACzB;AAAA,EAAA;AAEJ,WAAS,OAAO,GAAG,OAAO,WAAW,QAAQ,GAAG;AAC9C,UAAM,EAAE,WAAA,IAAe,oBAAoB,QAAQ,IAAI;AACvD,QAAI,cAAc;AAClB,QAAI,YAAY;AAEhB,eAAW,CAAC,KAAK,cAAc,KAAK,OAAO,QAAQ,UAAU,GAAG;AAC9D,YAAM,WAAW,UAAU,GAAG;AAC9B,UAAI,aAAa;AACjB,UAAI,eAAe;AAEnB,UAAI,aAAa,UAAa,eAAe,YAAY,QAAW;AAClE,qBAAa,mBAAmB,eAAe,OAAO;AACtD,uBAAe;AAAA,MACjB;AAEA,YAAM,mBAAmB,sBAAsB,cAAc;AAC7D,UAAI,oBAAoB,CAAC,gBAAgB,cAAc,GAAG;AACxD,cAAM,cAAc,cAAc,UAAU,IACvC,aACD,CAAA;AACJ,cAAM,kBAAkB;AAAA,UACtB;AAAA,UACA;AAAA,UACA;AAAA,QAAA;AAEF,YAAI,oBAAoB,aAAa;AACnC,uBAAa;AACb,yBAAe;AAAA,QACjB;AAAA,MACF;AAEA,UAAI,cAAc;AAChB,YAAI,CAAC,YAAa,aAAY,EAAE,GAAG,KAAA;AACnC,kBAAU,GAAG,IAAI;AACjB,sBAAc;AAAA,MAChB;AAAA,IACF;AAEA,QAAI,CAAC,YAAa;AAClB,WAAO;AAAA,EACT;AACA,SAAO;AACT;AAEO,SAAS,mBAAmB,OAAyB;AAC1D,MAAI,MAAM,QAAQ,KAAK,EAAG,QAAO,MAAM,IAAI,kBAAkB;AAC7D,MAAI,cAAc,KAAK,GAAG;AACxB,WAAO,OAAO;AAAA,MACZ,OAAO,QAAQ,KAAgC,EAAE,IAAI,CAAC,CAAC,KAAK,KAAK,MAAM;AAAA,QACrE;AAAA,QACA,mBAAmB,KAAK;AAAA,MAAA,CACzB;AAAA,IAAA;AAAA,EAEL;AACA,SAAO;AACT;"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const jsonSchemaFormResolve = require("./json-schema-form-resolve.cjs");
|
|
4
|
+
const jsonSchemaFormListeners = require("./json-schema-form-listeners.cjs");
|
|
5
|
+
const jsonSchemaFormArrayView = require("./json-schema-form-array-view.cjs");
|
|
4
6
|
const collections = require("../lib/collections.cjs");
|
|
5
7
|
const jsonSchemaFormUtils = require("./json-schema-form-utils.cjs");
|
|
6
8
|
const jsonSchemaFormFilter = require("./json-schema-form-filter.cjs");
|
|
@@ -21,30 +23,38 @@ function unmatchedFormErrors({
|
|
|
21
23
|
value,
|
|
22
24
|
errors,
|
|
23
25
|
hiddenKeys,
|
|
26
|
+
viewOnly,
|
|
24
27
|
hideReadOnlyFields,
|
|
25
28
|
hideEmpty,
|
|
26
29
|
fieldFilter,
|
|
27
30
|
pre,
|
|
28
31
|
rootValue = value,
|
|
29
|
-
instancePath = ""
|
|
32
|
+
instancePath = "",
|
|
33
|
+
expressionEvaluator
|
|
30
34
|
}) {
|
|
31
35
|
const rendered = /* @__PURE__ */ new Set();
|
|
32
36
|
collectObjectPaths(schema, value, instancePath, rendered, {
|
|
33
37
|
hiddenKeys: new Set(hiddenKeys ?? []),
|
|
38
|
+
viewOnly,
|
|
34
39
|
hideReadOnlyFields,
|
|
35
40
|
hideEmpty,
|
|
36
41
|
pre,
|
|
37
42
|
rootValue,
|
|
38
43
|
root: true,
|
|
39
|
-
...fieldFilter ? { fieldFilter } : {}
|
|
44
|
+
...fieldFilter ? { fieldFilter } : {},
|
|
45
|
+
...expressionEvaluator ? { expressionEvaluator } : {}
|
|
40
46
|
});
|
|
41
47
|
return errors.filter((error) => !rendered.has(error.instancePath));
|
|
42
48
|
}
|
|
43
49
|
function collectObjectPaths(schema, value, basePath, paths, options) {
|
|
44
|
-
const { properties, required } =
|
|
50
|
+
const { properties, required } = jsonSchemaFormListeners.applyListenerState(schema, value, {
|
|
51
|
+
root: options.rootValue,
|
|
52
|
+
...options.expressionEvaluator ? { evaluate: options.expressionEvaluator } : {}
|
|
53
|
+
});
|
|
45
54
|
const discriminator = options.root && typeof schema["x-discriminator"] === "string" ? schema["x-discriminator"] : void 0;
|
|
46
55
|
const pickerPhase = discriminator != null && (value[discriminator] == null || value[discriminator] === "");
|
|
47
56
|
for (const [key, prop] of Object.entries(properties)) {
|
|
57
|
+
if (prop["x-hidden"]) continue;
|
|
48
58
|
if (options.root && options.hiddenKeys.has(key)) continue;
|
|
49
59
|
if (options.root && options.fieldFilter && !jsonSchemaFormFilter.matchesFieldFilter({ key, prop, filter: options.fieldFilter, value: value[key] })) {
|
|
50
60
|
continue;
|
|
@@ -67,12 +77,19 @@ function collectObjectPaths(schema, value, basePath, paths, options) {
|
|
|
67
77
|
options.pre
|
|
68
78
|
);
|
|
69
79
|
if (!field || options.hideReadOnlyFields && field.readOnly) continue;
|
|
80
|
+
if (omitsWriteOnly(field, options)) continue;
|
|
70
81
|
if (options.hideEmpty && jsonSchemaFormUtils.isEmptyValue(field.value)) continue;
|
|
71
82
|
const path = appendInstancePath(basePath, key);
|
|
72
83
|
paths.add(path);
|
|
73
|
-
collectControlPaths(field, path, paths, { ...options, root: false });
|
|
84
|
+
collectControlPaths(field, path, paths, { ...options, root: false, viewOnly: subtreeIsView(field, options) });
|
|
74
85
|
}
|
|
75
86
|
}
|
|
87
|
+
function omitsWriteOnly(field, options) {
|
|
88
|
+
return field.writeOnly === true && (options.viewOnly || field.readOnly === true);
|
|
89
|
+
}
|
|
90
|
+
function subtreeIsView(field, options) {
|
|
91
|
+
return options.viewOnly || field.readOnly === true;
|
|
92
|
+
}
|
|
76
93
|
function applyPreExtensions(initial, prop, value, rootValue, extensions) {
|
|
77
94
|
let field = initial;
|
|
78
95
|
for (const extension of extensions) {
|
|
@@ -111,7 +128,14 @@ function collectArrayPaths(field, instancePath, paths, options) {
|
|
|
111
128
|
return;
|
|
112
129
|
}
|
|
113
130
|
const itemSchema = field.itemSchema ?? { type: "string" };
|
|
114
|
-
const table = field.
|
|
131
|
+
const table = field.arrayDisplay !== "stacked" && jsonSchemaFormUtils.hasObjectItemProperties(itemSchema) && jsonSchemaFormArrayView.defaultArrayView(field, {
|
|
132
|
+
hideReadOnlyFields: options.hideReadOnlyFields,
|
|
133
|
+
valueCells: subtreeIsView(field, options),
|
|
134
|
+
// Only picks stack vs inline — both item lists — so any mode will do.
|
|
135
|
+
layoutMode: "stacked",
|
|
136
|
+
rootValue: options.rootValue,
|
|
137
|
+
...options.expressionEvaluator ? { evaluate: options.expressionEvaluator } : {}
|
|
138
|
+
}) === "grid";
|
|
115
139
|
for (const [index, item] of (Array.isArray(field.value) ? field.value : []).entries()) {
|
|
116
140
|
const itemPath = appendInstancePath(instancePath, index);
|
|
117
141
|
if (table) {
|
|
@@ -124,20 +148,17 @@ function collectArrayPaths(field, instancePath, paths, options) {
|
|
|
124
148
|
);
|
|
125
149
|
continue;
|
|
126
150
|
}
|
|
151
|
+
const itemField = jsonSchemaFormResolve.resolveControl({
|
|
152
|
+
key: `${field.key}[${index}]`,
|
|
153
|
+
prop: itemSchema,
|
|
154
|
+
required: false,
|
|
155
|
+
value: item,
|
|
156
|
+
onChange: () => {
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
if (omitsWriteOnly(itemField, options)) continue;
|
|
127
160
|
paths.add(itemPath);
|
|
128
|
-
collectControlPaths(
|
|
129
|
-
jsonSchemaFormResolve.resolveControl({
|
|
130
|
-
key: `${field.key}[${index}]`,
|
|
131
|
-
prop: itemSchema,
|
|
132
|
-
required: false,
|
|
133
|
-
value: item,
|
|
134
|
-
onChange: () => {
|
|
135
|
-
}
|
|
136
|
-
}),
|
|
137
|
-
itemPath,
|
|
138
|
-
paths,
|
|
139
|
-
options
|
|
140
|
-
);
|
|
161
|
+
collectControlPaths(itemField, itemPath, paths, { ...options, viewOnly: subtreeIsView(itemField, options) });
|
|
141
162
|
}
|
|
142
163
|
}
|
|
143
164
|
function hasEnumItems(field) {
|
|
@@ -155,20 +176,17 @@ function collectMapPaths(field, instancePath, paths, options) {
|
|
|
155
176
|
for (const key of keys) {
|
|
156
177
|
const schema = known[key] ?? mapValueSchema(field, key);
|
|
157
178
|
const path = appendInstancePath(instancePath, key);
|
|
179
|
+
const valueField = jsonSchemaFormResolve.resolveControl({
|
|
180
|
+
key,
|
|
181
|
+
prop: schema,
|
|
182
|
+
required: false,
|
|
183
|
+
value: value[key],
|
|
184
|
+
onChange: () => {
|
|
185
|
+
}
|
|
186
|
+
});
|
|
187
|
+
if (omitsWriteOnly(valueField, options)) continue;
|
|
158
188
|
paths.add(path);
|
|
159
|
-
collectControlPaths(
|
|
160
|
-
jsonSchemaFormResolve.resolveControl({
|
|
161
|
-
key,
|
|
162
|
-
prop: schema,
|
|
163
|
-
required: false,
|
|
164
|
-
value: value[key],
|
|
165
|
-
onChange: () => {
|
|
166
|
-
}
|
|
167
|
-
}),
|
|
168
|
-
path,
|
|
169
|
-
paths,
|
|
170
|
-
options
|
|
171
|
-
);
|
|
189
|
+
collectControlPaths(valueField, path, paths, { ...options, viewOnly: subtreeIsView(valueField, options) });
|
|
172
190
|
}
|
|
173
191
|
}
|
|
174
192
|
function mapValueSchema(field, key) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-schema-form-errors.cjs","sources":["../../src/components/json-schema-form-errors.ts"],"sourcesContent":["import {\n effectiveProperties,\n resolveControl,\n scalarItemsType,\n} from \"./json-schema-form-resolve\";\nimport { isPlainObject } from \"../lib/collections\";\nimport { isEmptyValue } from \"./json-schema-form-utils\";\nimport { matchesFieldFilter } from \"./json-schema-form-filter\";\nimport type { JsonSchemaFormError } from \"./json-schema-form-error-types\";\nimport type {\n FieldControl,\n JsonSchemaObject,\n JsonSchemaProperty,\n PreExtension,\n} from \"./json-schema-form-types\";\n\nexport function appendInstancePath(\n base: string,\n token: string | number\n): string {\n const escaped = String(token).replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\");\n return `${base}/${escaped}`;\n}\n\n// How many errors sit at or below a subtree. A collapsed container (an\n// accordion row) renders none of the controls that would show them, so it\n// reports the count on its own header instead.\nexport function errorCountUnderInstancePath(\n errors: JsonSchemaFormError[],\n instancePath: string\n): number {\n return errors.filter(\n (error) =>\n error.instancePath === instancePath ||\n error.instancePath.startsWith(`${instancePath}/`)\n ).length;\n}\n\nexport function errorsAtInstancePath(\n errors: JsonSchemaFormError[],\n instancePath: string\n): JsonSchemaFormError[] {\n return errors.filter((error) => error.instancePath === instancePath);\n}\n\nexport function unmatchedFormErrors({\n schema,\n value,\n errors,\n hiddenKeys,\n hideReadOnlyFields,\n hideEmpty,\n fieldFilter,\n pre,\n rootValue = value,\n instancePath = \"\",\n}: {\n schema: JsonSchemaObject;\n value: Record<string, unknown>;\n errors: JsonSchemaFormError[];\n hiddenKeys?: string[];\n hideReadOnlyFields: boolean;\n hideEmpty: boolean;\n fieldFilter?: string;\n pre: PreExtension[];\n rootValue?: Record<string, unknown>;\n instancePath?: string;\n}): JsonSchemaFormError[] {\n const rendered = new Set<string>();\n collectObjectPaths(schema, value, instancePath, rendered, {\n hiddenKeys: new Set(hiddenKeys ?? []),\n hideReadOnlyFields,\n hideEmpty,\n pre,\n rootValue,\n root: true,\n ...(fieldFilter ? { fieldFilter } : {}),\n });\n return errors.filter((error) => !rendered.has(error.instancePath));\n}\n\ninterface CollectOptions {\n hiddenKeys: Set<string>;\n hideReadOnlyFields: boolean;\n hideEmpty: boolean;\n fieldFilter?: string;\n pre: PreExtension[];\n rootValue: Record<string, unknown>;\n root: boolean;\n}\n\nfunction collectObjectPaths(\n schema: JsonSchemaObject,\n value: Record<string, unknown>,\n basePath: string,\n paths: Set<string>,\n options: CollectOptions\n) {\n const { properties, required } = effectiveProperties(schema, value);\n const discriminator =\n options.root && typeof schema[\"x-discriminator\"] === \"string\"\n ? schema[\"x-discriminator\"]\n : undefined;\n const pickerPhase =\n discriminator != null &&\n (value[discriminator] == null || value[discriminator] === \"\");\n\n for (const [key, prop] of Object.entries(properties)) {\n if (options.root && options.hiddenKeys.has(key)) continue;\n if (\n options.root &&\n options.fieldFilter &&\n !matchesFieldFilter({ key, prop, filter: options.fieldFilter, value: value[key] })\n ) {\n continue;\n }\n if (\n discriminator &&\n (pickerPhase ? key !== discriminator : key === discriminator)\n ) {\n continue;\n }\n\n const field = applyPreExtensions(\n resolveControl({\n key,\n prop,\n required: required.includes(key),\n value: value[key],\n onChange: () => {},\n }),\n prop,\n value[key],\n options.rootValue,\n options.pre\n );\n if (!field || (options.hideReadOnlyFields && field.readOnly)) continue;\n // A field the form drops is not a place an error can be shown, so its error\n // has to surface as unmatched rather than vanish with the field.\n if (options.hideEmpty && isEmptyValue(field.value)) continue;\n\n const path = appendInstancePath(basePath, key);\n paths.add(path);\n collectControlPaths(field, path, paths, { ...options, root: false });\n }\n}\n\nfunction applyPreExtensions(\n initial: FieldControl,\n prop: JsonSchemaProperty,\n value: unknown,\n rootValue: Record<string, unknown>,\n extensions: PreExtension[]\n): FieldControl | null {\n let field: FieldControl | null = initial;\n for (const extension of extensions) {\n if (!field) return null;\n field = extension(field, {\n key: field.key,\n prop,\n value,\n rootValue,\n });\n }\n return field;\n}\n\nfunction collectControlPaths(\n field: FieldControl,\n instancePath: string,\n paths: Set<string>,\n options: CollectOptions\n) {\n if (field.kind === \"object\") {\n collectObjectPaths(\n field.schema as JsonSchemaObject,\n isPlainObject(field.value) ? field.value : {},\n instancePath,\n paths,\n options\n );\n return;\n }\n if (field.kind === \"array\") {\n collectArrayPaths(field, instancePath, paths, options);\n return;\n }\n if (field.kind === \"string-map\") {\n collectMapPaths(field, instancePath, paths, options);\n }\n}\n\nfunction collectArrayPaths(\n field: FieldControl,\n instancePath: string,\n paths: Set<string>,\n options: CollectOptions\n) {\n // Mirrors ArrayControl's branch order: a flat list of values (pills, choices\n // or scalars) is ONE control, with no per-item field to hang a message on, so\n // its item paths stay unmatched and the error surfaces in the form summary\n // instead of pointing at nothing.\n if (field.arrayDisplay === \"filter-pills\") return;\n if (\n field.arrayDisplay !== \"stacked\" &&\n (hasEnumItems(field) || scalarItemsType(field.itemSchema))\n ) {\n return;\n }\n\n const itemSchema = field.itemSchema ?? { type: \"string\" };\n const table =\n field.layout === \"table\" &&\n itemSchema.properties != null &&\n Object.keys(itemSchema.properties).length > 0;\n for (const [index, item] of (Array.isArray(field.value)\n ? field.value\n : []\n ).entries()) {\n const itemPath = appendInstancePath(instancePath, index);\n if (table) {\n collectObjectPaths(\n itemSchema as JsonSchemaObject,\n isPlainObject(item) ? item : {},\n itemPath,\n paths,\n options\n );\n continue;\n }\n paths.add(itemPath);\n collectControlPaths(\n resolveControl({\n key: `${field.key}[${index}]`,\n prop: itemSchema,\n required: false,\n value: item,\n onChange: () => {},\n }),\n itemPath,\n paths,\n options\n );\n }\n}\n\n// Mirrors ArrayControl's tags branch: resolved options win over the raw item\n// enum, since a pre-extension may have supplied them.\nfunction hasEnumItems(field: FieldControl): boolean {\n if (field.options && field.options.length > 0) return true;\n return Array.isArray(field.itemSchema?.enum) && field.itemSchema.enum.length > 0;\n}\n\nfunction collectMapPaths(\n field: FieldControl,\n instancePath: string,\n paths: Set<string>,\n options: CollectOptions\n) {\n const value = isPlainObject(field.value) ? field.value : {};\n const known = field.knownProperties ?? {};\n const keys = [\n ...Object.keys(known),\n ...Object.keys(value).filter((key) => !(key in known)),\n ];\n for (const key of keys) {\n const schema = known[key] ?? mapValueSchema(field, key);\n const path = appendInstancePath(instancePath, key);\n paths.add(path);\n collectControlPaths(\n resolveControl({\n key,\n prop: schema,\n required: false,\n value: value[key],\n onChange: () => {},\n }),\n path,\n paths,\n options\n );\n }\n}\n\nfunction mapValueSchema(field: FieldControl, key: string): JsonSchemaProperty {\n for (const entry of field.valuePatternSchemas ?? []) {\n try {\n if (new RegExp(entry.pattern).test(key)) return entry.schema;\n } catch {\n continue;\n }\n }\n return field.valueSchema ?? { type: \"string\" };\n}\n"],"names":["effectiveProperties","matchesFieldFilter","resolveControl","isEmptyValue","isPlainObject","scalarItemsType"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"json-schema-form-errors.cjs","sources":["../../src/components/json-schema-form-errors.ts"],"sourcesContent":["import {\n resolveControl,\n scalarItemsType,\n} from \"./json-schema-form-resolve\";\nimport { applyListenerState } from \"./json-schema-form-listeners\";\nimport { defaultArrayView } from \"./json-schema-form-array-view\";\nimport { isPlainObject } from \"../lib/collections\";\nimport { hasObjectItemProperties, isEmptyValue } from \"./json-schema-form-utils\";\nimport { matchesFieldFilter } from \"./json-schema-form-filter\";\nimport type { JsonSchemaFormError } from \"./json-schema-form-error-types\";\nimport type {\n ExpressionEvaluator,\n FieldControl,\n JsonSchemaObject,\n JsonSchemaProperty,\n PreExtension,\n} from \"./json-schema-form-types\";\n\nexport function appendInstancePath(\n base: string,\n token: string | number\n): string {\n const escaped = String(token).replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\");\n return `${base}/${escaped}`;\n}\n\n// How many errors sit at or below a subtree. A collapsed container (an\n// accordion row) renders none of the controls that would show them, so it\n// reports the count on its own header instead.\nexport function errorCountUnderInstancePath(\n errors: JsonSchemaFormError[],\n instancePath: string\n): number {\n return errors.filter(\n (error) =>\n error.instancePath === instancePath ||\n error.instancePath.startsWith(`${instancePath}/`)\n ).length;\n}\n\nexport function errorsAtInstancePath(\n errors: JsonSchemaFormError[],\n instancePath: string\n): JsonSchemaFormError[] {\n return errors.filter((error) => error.instancePath === instancePath);\n}\n\nexport function unmatchedFormErrors({\n schema,\n value,\n errors,\n hiddenKeys,\n viewOnly,\n hideReadOnlyFields,\n hideEmpty,\n fieldFilter,\n pre,\n rootValue = value,\n instancePath = \"\",\n expressionEvaluator,\n}: {\n schema: JsonSchemaObject;\n value: Record<string, unknown>;\n errors: JsonSchemaFormError[];\n hiddenKeys?: string[];\n // The form-level `readOnly` prop: a read-only form is a view, which omits\n // writeOnly fields, so their errors cannot be shown on them.\n viewOnly: boolean;\n hideReadOnlyFields: boolean;\n hideEmpty: boolean;\n fieldFilter?: string;\n pre: PreExtension[];\n rootValue?: Record<string, unknown>;\n instancePath?: string;\n expressionEvaluator?: ExpressionEvaluator;\n}): JsonSchemaFormError[] {\n const rendered = new Set<string>();\n collectObjectPaths(schema, value, instancePath, rendered, {\n hiddenKeys: new Set(hiddenKeys ?? []),\n viewOnly,\n hideReadOnlyFields,\n hideEmpty,\n pre,\n rootValue,\n root: true,\n ...(fieldFilter ? { fieldFilter } : {}),\n ...(expressionEvaluator ? { expressionEvaluator } : {}),\n });\n return errors.filter((error) => !rendered.has(error.instancePath));\n}\n\ninterface CollectOptions {\n hiddenKeys: Set<string>;\n // Mirrors RenderContext.viewOnly: the form is read-only, or an ancestor\n // field is readOnly.\n viewOnly: boolean;\n hideReadOnlyFields: boolean;\n hideEmpty: boolean;\n fieldFilter?: string;\n pre: PreExtension[];\n rootValue: Record<string, unknown>;\n root: boolean;\n expressionEvaluator?: ExpressionEvaluator;\n}\n\nfunction collectObjectPaths(\n schema: JsonSchemaObject,\n value: Record<string, unknown>,\n basePath: string,\n paths: Set<string>,\n options: CollectOptions\n) {\n const { properties, required } = applyListenerState(schema, value, {\n root: options.rootValue,\n ...(options.expressionEvaluator ? { evaluate: options.expressionEvaluator } : {}),\n });\n const discriminator =\n options.root && typeof schema[\"x-discriminator\"] === \"string\"\n ? schema[\"x-discriminator\"]\n : undefined;\n const pickerPhase =\n discriminator != null &&\n (value[discriminator] == null || value[discriminator] === \"\");\n\n for (const [key, prop] of Object.entries(properties)) {\n // Mirrors buildField: a hidden field renders nothing to hang an error on.\n if (prop[\"x-hidden\"]) continue;\n if (options.root && options.hiddenKeys.has(key)) continue;\n if (\n options.root &&\n options.fieldFilter &&\n !matchesFieldFilter({ key, prop, filter: options.fieldFilter, value: value[key] })\n ) {\n continue;\n }\n if (\n discriminator &&\n (pickerPhase ? key !== discriminator : key === discriminator)\n ) {\n continue;\n }\n\n const field = applyPreExtensions(\n resolveControl({\n key,\n prop,\n required: required.includes(key),\n value: value[key],\n onChange: () => {},\n }),\n prop,\n value[key],\n options.rootValue,\n options.pre\n );\n if (!field || (options.hideReadOnlyFields && field.readOnly)) continue;\n // A field the form drops is not a place an error can be shown, so its error\n // has to surface as unmatched rather than vanish with the field.\n if (omitsWriteOnly(field, options)) continue;\n if (options.hideEmpty && isEmptyValue(field.value)) continue;\n\n const path = appendInstancePath(basePath, key);\n paths.add(path);\n collectControlPaths(field, path, paths, { ...options, root: false, viewOnly: subtreeIsView(field, options) });\n }\n}\n\n// Mirrors buildField: a writeOnly value is never shown in a view, nor by a\n// field that is itself readOnly.\nfunction omitsWriteOnly(field: FieldControl, options: CollectOptions): boolean {\n return field.writeOnly === true && (options.viewOnly || field.readOnly === true);\n}\n\n// Mirrors buildField: a readOnly field's subtree is a view.\nfunction subtreeIsView(field: FieldControl, options: CollectOptions): boolean {\n return options.viewOnly || field.readOnly === true;\n}\n\nfunction applyPreExtensions(\n initial: FieldControl,\n prop: JsonSchemaProperty,\n value: unknown,\n rootValue: Record<string, unknown>,\n extensions: PreExtension[]\n): FieldControl | null {\n let field: FieldControl | null = initial;\n for (const extension of extensions) {\n if (!field) return null;\n field = extension(field, {\n key: field.key,\n prop,\n value,\n rootValue,\n });\n }\n return field;\n}\n\nfunction collectControlPaths(\n field: FieldControl,\n instancePath: string,\n paths: Set<string>,\n options: CollectOptions\n) {\n if (field.kind === \"object\") {\n collectObjectPaths(\n field.schema as JsonSchemaObject,\n isPlainObject(field.value) ? field.value : {},\n instancePath,\n paths,\n options\n );\n return;\n }\n if (field.kind === \"array\") {\n collectArrayPaths(field, instancePath, paths, options);\n return;\n }\n if (field.kind === \"string-map\") {\n collectMapPaths(field, instancePath, paths, options);\n }\n}\n\nfunction collectArrayPaths(\n field: FieldControl,\n instancePath: string,\n paths: Set<string>,\n options: CollectOptions\n) {\n // Mirrors ArrayControl's branch order: a flat list of values (pills, choices\n // or scalars) is ONE control, with no per-item field to hang a message on, so\n // its item paths stay unmatched and the error surfaces in the form summary\n // instead of pointing at nothing.\n if (field.arrayDisplay === \"filter-pills\") return;\n if (\n field.arrayDisplay !== \"stacked\" &&\n (hasEnumItems(field) || scalarItemsType(field.itemSchema))\n ) {\n return;\n }\n\n const itemSchema = field.itemSchema ?? { type: \"string\" };\n // A grid has no row header to hang an item-level message on. The view is\n // the one the array opens in; a later switch through its view menu is\n // local UI state this pure walk cannot see.\n const table =\n field.arrayDisplay !== \"stacked\" &&\n hasObjectItemProperties(itemSchema) &&\n defaultArrayView(field, {\n hideReadOnlyFields: options.hideReadOnlyFields,\n valueCells: subtreeIsView(field, options),\n // Only picks stack vs inline — both item lists — so any mode will do.\n layoutMode: \"stacked\",\n rootValue: options.rootValue,\n ...(options.expressionEvaluator ? { evaluate: options.expressionEvaluator } : {}),\n }) === \"grid\";\n for (const [index, item] of (Array.isArray(field.value)\n ? field.value\n : []\n ).entries()) {\n const itemPath = appendInstancePath(instancePath, index);\n if (table) {\n collectObjectPaths(\n itemSchema as JsonSchemaObject,\n isPlainObject(item) ? item : {},\n itemPath,\n paths,\n options\n );\n continue;\n }\n const itemField = resolveControl({\n key: `${field.key}[${index}]`,\n prop: itemSchema,\n required: false,\n value: item,\n onChange: () => {},\n });\n if (omitsWriteOnly(itemField, options)) continue;\n paths.add(itemPath);\n collectControlPaths(itemField, itemPath, paths, { ...options, viewOnly: subtreeIsView(itemField, options) });\n }\n}\n\n// Mirrors ArrayControl's tags branch: resolved options win over the raw item\n// enum, since a pre-extension may have supplied them.\nfunction hasEnumItems(field: FieldControl): boolean {\n if (field.options && field.options.length > 0) return true;\n return Array.isArray(field.itemSchema?.enum) && field.itemSchema.enum.length > 0;\n}\n\nfunction collectMapPaths(\n field: FieldControl,\n instancePath: string,\n paths: Set<string>,\n options: CollectOptions\n) {\n const value = isPlainObject(field.value) ? field.value : {};\n const known = field.knownProperties ?? {};\n const keys = [\n ...Object.keys(known),\n ...Object.keys(value).filter((key) => !(key in known)),\n ];\n for (const key of keys) {\n const schema = known[key] ?? mapValueSchema(field, key);\n const path = appendInstancePath(instancePath, key);\n const valueField = resolveControl({\n key,\n prop: schema,\n required: false,\n value: value[key],\n onChange: () => {},\n });\n if (omitsWriteOnly(valueField, options)) continue;\n paths.add(path);\n collectControlPaths(valueField, path, paths, { ...options, viewOnly: subtreeIsView(valueField, options) });\n }\n}\n\nfunction mapValueSchema(field: FieldControl, key: string): JsonSchemaProperty {\n for (const entry of field.valuePatternSchemas ?? []) {\n try {\n if (new RegExp(entry.pattern).test(key)) return entry.schema;\n } catch {\n continue;\n }\n }\n return field.valueSchema ?? { type: \"string\" };\n}\n"],"names":["applyListenerState","matchesFieldFilter","resolveControl","isEmptyValue","isPlainObject","scalarItemsType","hasObjectItemProperties","defaultArrayView"],"mappings":"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"}
|
|
@@ -1,18 +1,20 @@
|
|
|
1
1
|
import { JsonSchemaFormError } from './json-schema-form-error-types.js';
|
|
2
|
-
import { JsonSchemaObject, PreExtension } from './json-schema-form-types.js';
|
|
2
|
+
import { ExpressionEvaluator, JsonSchemaObject, PreExtension } from './json-schema-form-types.js';
|
|
3
3
|
export declare function appendInstancePath(base: string, token: string | number): string;
|
|
4
4
|
export declare function errorCountUnderInstancePath(errors: JsonSchemaFormError[], instancePath: string): number;
|
|
5
5
|
export declare function errorsAtInstancePath(errors: JsonSchemaFormError[], instancePath: string): JsonSchemaFormError[];
|
|
6
|
-
export declare function unmatchedFormErrors({ schema, value, errors, hiddenKeys, hideReadOnlyFields, hideEmpty, fieldFilter, pre, rootValue, instancePath, }: {
|
|
6
|
+
export declare function unmatchedFormErrors({ schema, value, errors, hiddenKeys, viewOnly, hideReadOnlyFields, hideEmpty, fieldFilter, pre, rootValue, instancePath, expressionEvaluator, }: {
|
|
7
7
|
schema: JsonSchemaObject;
|
|
8
8
|
value: Record<string, unknown>;
|
|
9
9
|
errors: JsonSchemaFormError[];
|
|
10
10
|
hiddenKeys?: string[];
|
|
11
|
+
viewOnly: boolean;
|
|
11
12
|
hideReadOnlyFields: boolean;
|
|
12
13
|
hideEmpty: boolean;
|
|
13
14
|
fieldFilter?: string;
|
|
14
15
|
pre: PreExtension[];
|
|
15
16
|
rootValue?: Record<string, unknown>;
|
|
16
17
|
instancePath?: string;
|
|
18
|
+
expressionEvaluator?: ExpressionEvaluator;
|
|
17
19
|
}): JsonSchemaFormError[];
|
|
18
20
|
//# sourceMappingURL=json-schema-form-errors.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-schema-form-errors.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-errors.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"json-schema-form-errors.d.ts","sourceRoot":"","sources":["../../src/components/json-schema-form-errors.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC1E,OAAO,KAAK,EACV,mBAAmB,EAEnB,gBAAgB,EAEhB,YAAY,EACb,MAAM,0BAA0B,CAAC;AAElC,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,MAAM,GAAG,MAAM,GACrB,MAAM,CAGR;AAKD,wBAAgB,2BAA2B,CACzC,MAAM,EAAE,mBAAmB,EAAE,EAC7B,YAAY,EAAE,MAAM,GACnB,MAAM,CAMR;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,mBAAmB,EAAE,EAC7B,YAAY,EAAE,MAAM,GACnB,mBAAmB,EAAE,CAEvB;AAED,wBAAgB,mBAAmB,CAAC,EAClC,MAAM,EACN,KAAK,EACL,MAAM,EACN,UAAU,EACV,QAAQ,EACR,kBAAkB,EAClB,SAAS,EACT,WAAW,EACX,GAAG,EACH,SAAiB,EACjB,YAAiB,EACjB,mBAAmB,GACpB,EAAE;IACD,MAAM,EAAE,gBAAgB,CAAC;IACzB,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,MAAM,EAAE,mBAAmB,EAAE,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,EAAE,CAAC;IAGtB,QAAQ,EAAE,OAAO,CAAC;IAClB,kBAAkB,EAAE,OAAO,CAAC;IAC5B,SAAS,EAAE,OAAO,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,GAAG,EAAE,YAAY,EAAE,CAAC;IACpB,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,mBAAmB,CAAC,EAAE,mBAAmB,CAAC;CAC3C,GAAG,mBAAmB,EAAE,CAcxB"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { resolveControl, scalarItemsType } from "./json-schema-form-resolve.js";
|
|
2
|
+
import { applyListenerState } from "./json-schema-form-listeners.js";
|
|
3
|
+
import { defaultArrayView } from "./json-schema-form-array-view.js";
|
|
2
4
|
import { isPlainObject } from "../lib/collections.js";
|
|
3
|
-
import { isEmptyValue } from "./json-schema-form-utils.js";
|
|
5
|
+
import { isEmptyValue, hasObjectItemProperties } from "./json-schema-form-utils.js";
|
|
4
6
|
import { matchesFieldFilter } from "./json-schema-form-filter.js";
|
|
5
7
|
function appendInstancePath(base, token) {
|
|
6
8
|
const escaped = String(token).replaceAll("~", "~0").replaceAll("/", "~1");
|
|
@@ -19,30 +21,38 @@ function unmatchedFormErrors({
|
|
|
19
21
|
value,
|
|
20
22
|
errors,
|
|
21
23
|
hiddenKeys,
|
|
24
|
+
viewOnly,
|
|
22
25
|
hideReadOnlyFields,
|
|
23
26
|
hideEmpty,
|
|
24
27
|
fieldFilter,
|
|
25
28
|
pre,
|
|
26
29
|
rootValue = value,
|
|
27
|
-
instancePath = ""
|
|
30
|
+
instancePath = "",
|
|
31
|
+
expressionEvaluator
|
|
28
32
|
}) {
|
|
29
33
|
const rendered = /* @__PURE__ */ new Set();
|
|
30
34
|
collectObjectPaths(schema, value, instancePath, rendered, {
|
|
31
35
|
hiddenKeys: new Set(hiddenKeys ?? []),
|
|
36
|
+
viewOnly,
|
|
32
37
|
hideReadOnlyFields,
|
|
33
38
|
hideEmpty,
|
|
34
39
|
pre,
|
|
35
40
|
rootValue,
|
|
36
41
|
root: true,
|
|
37
|
-
...fieldFilter ? { fieldFilter } : {}
|
|
42
|
+
...fieldFilter ? { fieldFilter } : {},
|
|
43
|
+
...expressionEvaluator ? { expressionEvaluator } : {}
|
|
38
44
|
});
|
|
39
45
|
return errors.filter((error) => !rendered.has(error.instancePath));
|
|
40
46
|
}
|
|
41
47
|
function collectObjectPaths(schema, value, basePath, paths, options) {
|
|
42
|
-
const { properties, required } =
|
|
48
|
+
const { properties, required } = applyListenerState(schema, value, {
|
|
49
|
+
root: options.rootValue,
|
|
50
|
+
...options.expressionEvaluator ? { evaluate: options.expressionEvaluator } : {}
|
|
51
|
+
});
|
|
43
52
|
const discriminator = options.root && typeof schema["x-discriminator"] === "string" ? schema["x-discriminator"] : void 0;
|
|
44
53
|
const pickerPhase = discriminator != null && (value[discriminator] == null || value[discriminator] === "");
|
|
45
54
|
for (const [key, prop] of Object.entries(properties)) {
|
|
55
|
+
if (prop["x-hidden"]) continue;
|
|
46
56
|
if (options.root && options.hiddenKeys.has(key)) continue;
|
|
47
57
|
if (options.root && options.fieldFilter && !matchesFieldFilter({ key, prop, filter: options.fieldFilter, value: value[key] })) {
|
|
48
58
|
continue;
|
|
@@ -65,12 +75,19 @@ function collectObjectPaths(schema, value, basePath, paths, options) {
|
|
|
65
75
|
options.pre
|
|
66
76
|
);
|
|
67
77
|
if (!field || options.hideReadOnlyFields && field.readOnly) continue;
|
|
78
|
+
if (omitsWriteOnly(field, options)) continue;
|
|
68
79
|
if (options.hideEmpty && isEmptyValue(field.value)) continue;
|
|
69
80
|
const path = appendInstancePath(basePath, key);
|
|
70
81
|
paths.add(path);
|
|
71
|
-
collectControlPaths(field, path, paths, { ...options, root: false });
|
|
82
|
+
collectControlPaths(field, path, paths, { ...options, root: false, viewOnly: subtreeIsView(field, options) });
|
|
72
83
|
}
|
|
73
84
|
}
|
|
85
|
+
function omitsWriteOnly(field, options) {
|
|
86
|
+
return field.writeOnly === true && (options.viewOnly || field.readOnly === true);
|
|
87
|
+
}
|
|
88
|
+
function subtreeIsView(field, options) {
|
|
89
|
+
return options.viewOnly || field.readOnly === true;
|
|
90
|
+
}
|
|
74
91
|
function applyPreExtensions(initial, prop, value, rootValue, extensions) {
|
|
75
92
|
let field = initial;
|
|
76
93
|
for (const extension of extensions) {
|
|
@@ -109,7 +126,14 @@ function collectArrayPaths(field, instancePath, paths, options) {
|
|
|
109
126
|
return;
|
|
110
127
|
}
|
|
111
128
|
const itemSchema = field.itemSchema ?? { type: "string" };
|
|
112
|
-
const table = field.
|
|
129
|
+
const table = field.arrayDisplay !== "stacked" && hasObjectItemProperties(itemSchema) && defaultArrayView(field, {
|
|
130
|
+
hideReadOnlyFields: options.hideReadOnlyFields,
|
|
131
|
+
valueCells: subtreeIsView(field, options),
|
|
132
|
+
// Only picks stack vs inline — both item lists — so any mode will do.
|
|
133
|
+
layoutMode: "stacked",
|
|
134
|
+
rootValue: options.rootValue,
|
|
135
|
+
...options.expressionEvaluator ? { evaluate: options.expressionEvaluator } : {}
|
|
136
|
+
}) === "grid";
|
|
113
137
|
for (const [index, item] of (Array.isArray(field.value) ? field.value : []).entries()) {
|
|
114
138
|
const itemPath = appendInstancePath(instancePath, index);
|
|
115
139
|
if (table) {
|
|
@@ -122,20 +146,17 @@ function collectArrayPaths(field, instancePath, paths, options) {
|
|
|
122
146
|
);
|
|
123
147
|
continue;
|
|
124
148
|
}
|
|
149
|
+
const itemField = resolveControl({
|
|
150
|
+
key: `${field.key}[${index}]`,
|
|
151
|
+
prop: itemSchema,
|
|
152
|
+
required: false,
|
|
153
|
+
value: item,
|
|
154
|
+
onChange: () => {
|
|
155
|
+
}
|
|
156
|
+
});
|
|
157
|
+
if (omitsWriteOnly(itemField, options)) continue;
|
|
125
158
|
paths.add(itemPath);
|
|
126
|
-
collectControlPaths(
|
|
127
|
-
resolveControl({
|
|
128
|
-
key: `${field.key}[${index}]`,
|
|
129
|
-
prop: itemSchema,
|
|
130
|
-
required: false,
|
|
131
|
-
value: item,
|
|
132
|
-
onChange: () => {
|
|
133
|
-
}
|
|
134
|
-
}),
|
|
135
|
-
itemPath,
|
|
136
|
-
paths,
|
|
137
|
-
options
|
|
138
|
-
);
|
|
159
|
+
collectControlPaths(itemField, itemPath, paths, { ...options, viewOnly: subtreeIsView(itemField, options) });
|
|
139
160
|
}
|
|
140
161
|
}
|
|
141
162
|
function hasEnumItems(field) {
|
|
@@ -153,20 +174,17 @@ function collectMapPaths(field, instancePath, paths, options) {
|
|
|
153
174
|
for (const key of keys) {
|
|
154
175
|
const schema = known[key] ?? mapValueSchema(field, key);
|
|
155
176
|
const path = appendInstancePath(instancePath, key);
|
|
177
|
+
const valueField = resolveControl({
|
|
178
|
+
key,
|
|
179
|
+
prop: schema,
|
|
180
|
+
required: false,
|
|
181
|
+
value: value[key],
|
|
182
|
+
onChange: () => {
|
|
183
|
+
}
|
|
184
|
+
});
|
|
185
|
+
if (omitsWriteOnly(valueField, options)) continue;
|
|
156
186
|
paths.add(path);
|
|
157
|
-
collectControlPaths(
|
|
158
|
-
resolveControl({
|
|
159
|
-
key,
|
|
160
|
-
prop: schema,
|
|
161
|
-
required: false,
|
|
162
|
-
value: value[key],
|
|
163
|
-
onChange: () => {
|
|
164
|
-
}
|
|
165
|
-
}),
|
|
166
|
-
path,
|
|
167
|
-
paths,
|
|
168
|
-
options
|
|
169
|
-
);
|
|
187
|
+
collectControlPaths(valueField, path, paths, { ...options, viewOnly: subtreeIsView(valueField, options) });
|
|
170
188
|
}
|
|
171
189
|
}
|
|
172
190
|
function mapValueSchema(field, key) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-schema-form-errors.js","sources":["../../src/components/json-schema-form-errors.ts"],"sourcesContent":["import {\n effectiveProperties,\n resolveControl,\n scalarItemsType,\n} from \"./json-schema-form-resolve\";\nimport { isPlainObject } from \"../lib/collections\";\nimport { isEmptyValue } from \"./json-schema-form-utils\";\nimport { matchesFieldFilter } from \"./json-schema-form-filter\";\nimport type { JsonSchemaFormError } from \"./json-schema-form-error-types\";\nimport type {\n FieldControl,\n JsonSchemaObject,\n JsonSchemaProperty,\n PreExtension,\n} from \"./json-schema-form-types\";\n\nexport function appendInstancePath(\n base: string,\n token: string | number\n): string {\n const escaped = String(token).replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\");\n return `${base}/${escaped}`;\n}\n\n// How many errors sit at or below a subtree. A collapsed container (an\n// accordion row) renders none of the controls that would show them, so it\n// reports the count on its own header instead.\nexport function errorCountUnderInstancePath(\n errors: JsonSchemaFormError[],\n instancePath: string\n): number {\n return errors.filter(\n (error) =>\n error.instancePath === instancePath ||\n error.instancePath.startsWith(`${instancePath}/`)\n ).length;\n}\n\nexport function errorsAtInstancePath(\n errors: JsonSchemaFormError[],\n instancePath: string\n): JsonSchemaFormError[] {\n return errors.filter((error) => error.instancePath === instancePath);\n}\n\nexport function unmatchedFormErrors({\n schema,\n value,\n errors,\n hiddenKeys,\n hideReadOnlyFields,\n hideEmpty,\n fieldFilter,\n pre,\n rootValue = value,\n instancePath = \"\",\n}: {\n schema: JsonSchemaObject;\n value: Record<string, unknown>;\n errors: JsonSchemaFormError[];\n hiddenKeys?: string[];\n hideReadOnlyFields: boolean;\n hideEmpty: boolean;\n fieldFilter?: string;\n pre: PreExtension[];\n rootValue?: Record<string, unknown>;\n instancePath?: string;\n}): JsonSchemaFormError[] {\n const rendered = new Set<string>();\n collectObjectPaths(schema, value, instancePath, rendered, {\n hiddenKeys: new Set(hiddenKeys ?? []),\n hideReadOnlyFields,\n hideEmpty,\n pre,\n rootValue,\n root: true,\n ...(fieldFilter ? { fieldFilter } : {}),\n });\n return errors.filter((error) => !rendered.has(error.instancePath));\n}\n\ninterface CollectOptions {\n hiddenKeys: Set<string>;\n hideReadOnlyFields: boolean;\n hideEmpty: boolean;\n fieldFilter?: string;\n pre: PreExtension[];\n rootValue: Record<string, unknown>;\n root: boolean;\n}\n\nfunction collectObjectPaths(\n schema: JsonSchemaObject,\n value: Record<string, unknown>,\n basePath: string,\n paths: Set<string>,\n options: CollectOptions\n) {\n const { properties, required } = effectiveProperties(schema, value);\n const discriminator =\n options.root && typeof schema[\"x-discriminator\"] === \"string\"\n ? schema[\"x-discriminator\"]\n : undefined;\n const pickerPhase =\n discriminator != null &&\n (value[discriminator] == null || value[discriminator] === \"\");\n\n for (const [key, prop] of Object.entries(properties)) {\n if (options.root && options.hiddenKeys.has(key)) continue;\n if (\n options.root &&\n options.fieldFilter &&\n !matchesFieldFilter({ key, prop, filter: options.fieldFilter, value: value[key] })\n ) {\n continue;\n }\n if (\n discriminator &&\n (pickerPhase ? key !== discriminator : key === discriminator)\n ) {\n continue;\n }\n\n const field = applyPreExtensions(\n resolveControl({\n key,\n prop,\n required: required.includes(key),\n value: value[key],\n onChange: () => {},\n }),\n prop,\n value[key],\n options.rootValue,\n options.pre\n );\n if (!field || (options.hideReadOnlyFields && field.readOnly)) continue;\n // A field the form drops is not a place an error can be shown, so its error\n // has to surface as unmatched rather than vanish with the field.\n if (options.hideEmpty && isEmptyValue(field.value)) continue;\n\n const path = appendInstancePath(basePath, key);\n paths.add(path);\n collectControlPaths(field, path, paths, { ...options, root: false });\n }\n}\n\nfunction applyPreExtensions(\n initial: FieldControl,\n prop: JsonSchemaProperty,\n value: unknown,\n rootValue: Record<string, unknown>,\n extensions: PreExtension[]\n): FieldControl | null {\n let field: FieldControl | null = initial;\n for (const extension of extensions) {\n if (!field) return null;\n field = extension(field, {\n key: field.key,\n prop,\n value,\n rootValue,\n });\n }\n return field;\n}\n\nfunction collectControlPaths(\n field: FieldControl,\n instancePath: string,\n paths: Set<string>,\n options: CollectOptions\n) {\n if (field.kind === \"object\") {\n collectObjectPaths(\n field.schema as JsonSchemaObject,\n isPlainObject(field.value) ? field.value : {},\n instancePath,\n paths,\n options\n );\n return;\n }\n if (field.kind === \"array\") {\n collectArrayPaths(field, instancePath, paths, options);\n return;\n }\n if (field.kind === \"string-map\") {\n collectMapPaths(field, instancePath, paths, options);\n }\n}\n\nfunction collectArrayPaths(\n field: FieldControl,\n instancePath: string,\n paths: Set<string>,\n options: CollectOptions\n) {\n // Mirrors ArrayControl's branch order: a flat list of values (pills, choices\n // or scalars) is ONE control, with no per-item field to hang a message on, so\n // its item paths stay unmatched and the error surfaces in the form summary\n // instead of pointing at nothing.\n if (field.arrayDisplay === \"filter-pills\") return;\n if (\n field.arrayDisplay !== \"stacked\" &&\n (hasEnumItems(field) || scalarItemsType(field.itemSchema))\n ) {\n return;\n }\n\n const itemSchema = field.itemSchema ?? { type: \"string\" };\n const table =\n field.layout === \"table\" &&\n itemSchema.properties != null &&\n Object.keys(itemSchema.properties).length > 0;\n for (const [index, item] of (Array.isArray(field.value)\n ? field.value\n : []\n ).entries()) {\n const itemPath = appendInstancePath(instancePath, index);\n if (table) {\n collectObjectPaths(\n itemSchema as JsonSchemaObject,\n isPlainObject(item) ? item : {},\n itemPath,\n paths,\n options\n );\n continue;\n }\n paths.add(itemPath);\n collectControlPaths(\n resolveControl({\n key: `${field.key}[${index}]`,\n prop: itemSchema,\n required: false,\n value: item,\n onChange: () => {},\n }),\n itemPath,\n paths,\n options\n );\n }\n}\n\n// Mirrors ArrayControl's tags branch: resolved options win over the raw item\n// enum, since a pre-extension may have supplied them.\nfunction hasEnumItems(field: FieldControl): boolean {\n if (field.options && field.options.length > 0) return true;\n return Array.isArray(field.itemSchema?.enum) && field.itemSchema.enum.length > 0;\n}\n\nfunction collectMapPaths(\n field: FieldControl,\n instancePath: string,\n paths: Set<string>,\n options: CollectOptions\n) {\n const value = isPlainObject(field.value) ? field.value : {};\n const known = field.knownProperties ?? {};\n const keys = [\n ...Object.keys(known),\n ...Object.keys(value).filter((key) => !(key in known)),\n ];\n for (const key of keys) {\n const schema = known[key] ?? mapValueSchema(field, key);\n const path = appendInstancePath(instancePath, key);\n paths.add(path);\n collectControlPaths(\n resolveControl({\n key,\n prop: schema,\n required: false,\n value: value[key],\n onChange: () => {},\n }),\n path,\n paths,\n options\n );\n }\n}\n\nfunction mapValueSchema(field: FieldControl, key: string): JsonSchemaProperty {\n for (const entry of field.valuePatternSchemas ?? []) {\n try {\n if (new RegExp(entry.pattern).test(key)) return entry.schema;\n } catch {\n continue;\n }\n }\n return field.valueSchema ?? { type: \"string\" };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"json-schema-form-errors.js","sources":["../../src/components/json-schema-form-errors.ts"],"sourcesContent":["import {\n resolveControl,\n scalarItemsType,\n} from \"./json-schema-form-resolve\";\nimport { applyListenerState } from \"./json-schema-form-listeners\";\nimport { defaultArrayView } from \"./json-schema-form-array-view\";\nimport { isPlainObject } from \"../lib/collections\";\nimport { hasObjectItemProperties, isEmptyValue } from \"./json-schema-form-utils\";\nimport { matchesFieldFilter } from \"./json-schema-form-filter\";\nimport type { JsonSchemaFormError } from \"./json-schema-form-error-types\";\nimport type {\n ExpressionEvaluator,\n FieldControl,\n JsonSchemaObject,\n JsonSchemaProperty,\n PreExtension,\n} from \"./json-schema-form-types\";\n\nexport function appendInstancePath(\n base: string,\n token: string | number\n): string {\n const escaped = String(token).replaceAll(\"~\", \"~0\").replaceAll(\"/\", \"~1\");\n return `${base}/${escaped}`;\n}\n\n// How many errors sit at or below a subtree. A collapsed container (an\n// accordion row) renders none of the controls that would show them, so it\n// reports the count on its own header instead.\nexport function errorCountUnderInstancePath(\n errors: JsonSchemaFormError[],\n instancePath: string\n): number {\n return errors.filter(\n (error) =>\n error.instancePath === instancePath ||\n error.instancePath.startsWith(`${instancePath}/`)\n ).length;\n}\n\nexport function errorsAtInstancePath(\n errors: JsonSchemaFormError[],\n instancePath: string\n): JsonSchemaFormError[] {\n return errors.filter((error) => error.instancePath === instancePath);\n}\n\nexport function unmatchedFormErrors({\n schema,\n value,\n errors,\n hiddenKeys,\n viewOnly,\n hideReadOnlyFields,\n hideEmpty,\n fieldFilter,\n pre,\n rootValue = value,\n instancePath = \"\",\n expressionEvaluator,\n}: {\n schema: JsonSchemaObject;\n value: Record<string, unknown>;\n errors: JsonSchemaFormError[];\n hiddenKeys?: string[];\n // The form-level `readOnly` prop: a read-only form is a view, which omits\n // writeOnly fields, so their errors cannot be shown on them.\n viewOnly: boolean;\n hideReadOnlyFields: boolean;\n hideEmpty: boolean;\n fieldFilter?: string;\n pre: PreExtension[];\n rootValue?: Record<string, unknown>;\n instancePath?: string;\n expressionEvaluator?: ExpressionEvaluator;\n}): JsonSchemaFormError[] {\n const rendered = new Set<string>();\n collectObjectPaths(schema, value, instancePath, rendered, {\n hiddenKeys: new Set(hiddenKeys ?? []),\n viewOnly,\n hideReadOnlyFields,\n hideEmpty,\n pre,\n rootValue,\n root: true,\n ...(fieldFilter ? { fieldFilter } : {}),\n ...(expressionEvaluator ? { expressionEvaluator } : {}),\n });\n return errors.filter((error) => !rendered.has(error.instancePath));\n}\n\ninterface CollectOptions {\n hiddenKeys: Set<string>;\n // Mirrors RenderContext.viewOnly: the form is read-only, or an ancestor\n // field is readOnly.\n viewOnly: boolean;\n hideReadOnlyFields: boolean;\n hideEmpty: boolean;\n fieldFilter?: string;\n pre: PreExtension[];\n rootValue: Record<string, unknown>;\n root: boolean;\n expressionEvaluator?: ExpressionEvaluator;\n}\n\nfunction collectObjectPaths(\n schema: JsonSchemaObject,\n value: Record<string, unknown>,\n basePath: string,\n paths: Set<string>,\n options: CollectOptions\n) {\n const { properties, required } = applyListenerState(schema, value, {\n root: options.rootValue,\n ...(options.expressionEvaluator ? { evaluate: options.expressionEvaluator } : {}),\n });\n const discriminator =\n options.root && typeof schema[\"x-discriminator\"] === \"string\"\n ? schema[\"x-discriminator\"]\n : undefined;\n const pickerPhase =\n discriminator != null &&\n (value[discriminator] == null || value[discriminator] === \"\");\n\n for (const [key, prop] of Object.entries(properties)) {\n // Mirrors buildField: a hidden field renders nothing to hang an error on.\n if (prop[\"x-hidden\"]) continue;\n if (options.root && options.hiddenKeys.has(key)) continue;\n if (\n options.root &&\n options.fieldFilter &&\n !matchesFieldFilter({ key, prop, filter: options.fieldFilter, value: value[key] })\n ) {\n continue;\n }\n if (\n discriminator &&\n (pickerPhase ? key !== discriminator : key === discriminator)\n ) {\n continue;\n }\n\n const field = applyPreExtensions(\n resolveControl({\n key,\n prop,\n required: required.includes(key),\n value: value[key],\n onChange: () => {},\n }),\n prop,\n value[key],\n options.rootValue,\n options.pre\n );\n if (!field || (options.hideReadOnlyFields && field.readOnly)) continue;\n // A field the form drops is not a place an error can be shown, so its error\n // has to surface as unmatched rather than vanish with the field.\n if (omitsWriteOnly(field, options)) continue;\n if (options.hideEmpty && isEmptyValue(field.value)) continue;\n\n const path = appendInstancePath(basePath, key);\n paths.add(path);\n collectControlPaths(field, path, paths, { ...options, root: false, viewOnly: subtreeIsView(field, options) });\n }\n}\n\n// Mirrors buildField: a writeOnly value is never shown in a view, nor by a\n// field that is itself readOnly.\nfunction omitsWriteOnly(field: FieldControl, options: CollectOptions): boolean {\n return field.writeOnly === true && (options.viewOnly || field.readOnly === true);\n}\n\n// Mirrors buildField: a readOnly field's subtree is a view.\nfunction subtreeIsView(field: FieldControl, options: CollectOptions): boolean {\n return options.viewOnly || field.readOnly === true;\n}\n\nfunction applyPreExtensions(\n initial: FieldControl,\n prop: JsonSchemaProperty,\n value: unknown,\n rootValue: Record<string, unknown>,\n extensions: PreExtension[]\n): FieldControl | null {\n let field: FieldControl | null = initial;\n for (const extension of extensions) {\n if (!field) return null;\n field = extension(field, {\n key: field.key,\n prop,\n value,\n rootValue,\n });\n }\n return field;\n}\n\nfunction collectControlPaths(\n field: FieldControl,\n instancePath: string,\n paths: Set<string>,\n options: CollectOptions\n) {\n if (field.kind === \"object\") {\n collectObjectPaths(\n field.schema as JsonSchemaObject,\n isPlainObject(field.value) ? field.value : {},\n instancePath,\n paths,\n options\n );\n return;\n }\n if (field.kind === \"array\") {\n collectArrayPaths(field, instancePath, paths, options);\n return;\n }\n if (field.kind === \"string-map\") {\n collectMapPaths(field, instancePath, paths, options);\n }\n}\n\nfunction collectArrayPaths(\n field: FieldControl,\n instancePath: string,\n paths: Set<string>,\n options: CollectOptions\n) {\n // Mirrors ArrayControl's branch order: a flat list of values (pills, choices\n // or scalars) is ONE control, with no per-item field to hang a message on, so\n // its item paths stay unmatched and the error surfaces in the form summary\n // instead of pointing at nothing.\n if (field.arrayDisplay === \"filter-pills\") return;\n if (\n field.arrayDisplay !== \"stacked\" &&\n (hasEnumItems(field) || scalarItemsType(field.itemSchema))\n ) {\n return;\n }\n\n const itemSchema = field.itemSchema ?? { type: \"string\" };\n // A grid has no row header to hang an item-level message on. The view is\n // the one the array opens in; a later switch through its view menu is\n // local UI state this pure walk cannot see.\n const table =\n field.arrayDisplay !== \"stacked\" &&\n hasObjectItemProperties(itemSchema) &&\n defaultArrayView(field, {\n hideReadOnlyFields: options.hideReadOnlyFields,\n valueCells: subtreeIsView(field, options),\n // Only picks stack vs inline — both item lists — so any mode will do.\n layoutMode: \"stacked\",\n rootValue: options.rootValue,\n ...(options.expressionEvaluator ? { evaluate: options.expressionEvaluator } : {}),\n }) === \"grid\";\n for (const [index, item] of (Array.isArray(field.value)\n ? field.value\n : []\n ).entries()) {\n const itemPath = appendInstancePath(instancePath, index);\n if (table) {\n collectObjectPaths(\n itemSchema as JsonSchemaObject,\n isPlainObject(item) ? item : {},\n itemPath,\n paths,\n options\n );\n continue;\n }\n const itemField = resolveControl({\n key: `${field.key}[${index}]`,\n prop: itemSchema,\n required: false,\n value: item,\n onChange: () => {},\n });\n if (omitsWriteOnly(itemField, options)) continue;\n paths.add(itemPath);\n collectControlPaths(itemField, itemPath, paths, { ...options, viewOnly: subtreeIsView(itemField, options) });\n }\n}\n\n// Mirrors ArrayControl's tags branch: resolved options win over the raw item\n// enum, since a pre-extension may have supplied them.\nfunction hasEnumItems(field: FieldControl): boolean {\n if (field.options && field.options.length > 0) return true;\n return Array.isArray(field.itemSchema?.enum) && field.itemSchema.enum.length > 0;\n}\n\nfunction collectMapPaths(\n field: FieldControl,\n instancePath: string,\n paths: Set<string>,\n options: CollectOptions\n) {\n const value = isPlainObject(field.value) ? field.value : {};\n const known = field.knownProperties ?? {};\n const keys = [\n ...Object.keys(known),\n ...Object.keys(value).filter((key) => !(key in known)),\n ];\n for (const key of keys) {\n const schema = known[key] ?? mapValueSchema(field, key);\n const path = appendInstancePath(instancePath, key);\n const valueField = resolveControl({\n key,\n prop: schema,\n required: false,\n value: value[key],\n onChange: () => {},\n });\n if (omitsWriteOnly(valueField, options)) continue;\n paths.add(path);\n collectControlPaths(valueField, path, paths, { ...options, viewOnly: subtreeIsView(valueField, options) });\n }\n}\n\nfunction mapValueSchema(field: FieldControl, key: string): JsonSchemaProperty {\n for (const entry of field.valuePatternSchemas ?? []) {\n try {\n if (new RegExp(entry.pattern).test(key)) return entry.schema;\n } catch {\n continue;\n }\n }\n return field.valueSchema ?? { type: \"string\" };\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
3
3
|
const collections = require("../lib/collections.cjs");
|
|
4
4
|
const jsonSchemaFormResolve = require("./json-schema-form-resolve.cjs");
|
|
5
|
+
const jsonSchemaFormConditionals = require("./json-schema-form-conditionals.cjs");
|
|
5
6
|
function matchesFieldFilter({
|
|
6
7
|
key,
|
|
7
8
|
prop,
|
|
@@ -24,7 +25,7 @@ function matchesFieldFilter({
|
|
|
24
25
|
);
|
|
25
26
|
}
|
|
26
27
|
if (collections.isPlainObject(value)) {
|
|
27
|
-
const { properties } =
|
|
28
|
+
const { properties } = jsonSchemaFormConditionals.effectiveProperties(prop, value);
|
|
28
29
|
const openMap = jsonSchemaFormResolve.isOpenStringMap(prop) || jsonSchemaFormResolve.schemaRendersAsObject(prop) && !prop.properties && Object.keys(properties).length === 0;
|
|
29
30
|
const keys = /* @__PURE__ */ new Set([...Object.keys(properties), ...Object.keys(value)]);
|
|
30
31
|
return [...keys].some((childKey) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-schema-form-filter.cjs","sources":["../../src/components/json-schema-form-filter.ts"],"sourcesContent":["import { isPlainObject } from \"../lib/collections\";\nimport {\n
|
|
1
|
+
{"version":3,"file":"json-schema-form-filter.cjs","sources":["../../src/components/json-schema-form-filter.ts"],"sourcesContent":["import { isPlainObject } from \"../lib/collections\";\nimport {\n isOpenStringMap,\n schemaRendersAsObject,\n} from \"./json-schema-form-resolve\";\nimport { effectiveProperties } from \"./json-schema-form-conditionals\";\nimport type {\n JsonSchemaObject,\n JsonSchemaProperty,\n} from \"./json-schema-form-types\";\n\nexport function matchesFieldFilter({\n key,\n prop,\n filter,\n value,\n}: {\n key: string;\n prop: JsonSchemaProperty;\n filter: string;\n value?: unknown;\n}): boolean {\n const query = filter.trim().toLowerCase();\n if (\n !query ||\n key.toLowerCase().includes(query) ||\n prop.title?.toLowerCase().includes(query)\n )\n return true;\n if (prop.format === \"password\") return false;\n if (Array.isArray(value)) {\n return value.some((item) =>\n matchesFieldFilter({\n key: \"\",\n prop: prop.items ?? {},\n filter,\n value: item,\n }),\n );\n }\n if (isPlainObject(value)) {\n const { properties } = effectiveProperties(prop as JsonSchemaObject, value);\n const openMap =\n isOpenStringMap(prop) ||\n (schemaRendersAsObject(prop) &&\n !prop.properties &&\n Object.keys(properties).length === 0);\n const keys = new Set([...Object.keys(properties), ...Object.keys(value)]);\n return [...keys].some((childKey) => {\n const child =\n properties[childKey] ??\n Object.entries(prop.patternProperties ?? {}).find(([pattern]) =>\n new RegExp(pattern).test(childKey),\n )?.[1] ??\n (isPlainObject(prop.additionalProperties)\n ? prop.additionalProperties\n : openMap\n ? { type: \"string\" }\n : undefined);\n return (\n child !== undefined &&\n matchesFieldFilter({\n key: childKey,\n prop: child,\n filter,\n value: value[childKey],\n })\n );\n });\n }\n if (value === null || value === undefined) return false;\n const text = String(value).toLowerCase();\n const label = prop[\"x-enum-labels\"]?.[String(value)];\n return text.includes(query) || Boolean(label?.toLowerCase().includes(query));\n}\n"],"names":["isPlainObject","effectiveProperties","isOpenStringMap","schemaRendersAsObject","_a"],"mappings":";;;;;AAWO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKY;;AACV,QAAM,QAAQ,OAAO,KAAA,EAAO,YAAA;AAC5B,MACE,CAAC,SACD,IAAI,YAAA,EAAc,SAAS,KAAK,OAChC,UAAK,UAAL,mBAAY,cAAc,SAAS;AAEnC,WAAO;AACT,MAAI,KAAK,WAAW,WAAY,QAAO;AACvC,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM;AAAA,MAAK,CAAC,SACjB,mBAAmB;AAAA,QACjB,KAAK;AAAA,QACL,MAAM,KAAK,SAAS,CAAA;AAAA,QACpB;AAAA,QACA,OAAO;AAAA,MAAA,CACR;AAAA,IAAA;AAAA,EAEL;AACA,MAAIA,YAAAA,cAAc,KAAK,GAAG;AACxB,UAAM,EAAE,WAAA,IAAeC,+CAAoB,MAA0B,KAAK;AAC1E,UAAM,UACJC,sBAAAA,gBAAgB,IAAI,KACnBC,sBAAAA,sBAAsB,IAAI,KACzB,CAAC,KAAK,cACN,OAAO,KAAK,UAAU,EAAE,WAAW;AACvC,UAAM,OAAO,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,UAAU,GAAG,GAAG,OAAO,KAAK,KAAK,CAAC,CAAC;AACxE,WAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,aAAa;;AAClC,YAAM,QACJ,WAAW,QAAQ,OACnBC,MAAA,OAAO,QAAQ,KAAK,qBAAqB,CAAA,CAAE,EAAE;AAAA,QAAK,CAAC,CAAC,OAAO,MACzD,IAAI,OAAO,OAAO,EAAE,KAAK,QAAQ;AAAA,MAAA,MADnC,gBAAAA,IAEI,QACHJ,YAAAA,cAAc,KAAK,oBAAoB,IACpC,KAAK,uBACL,UACE,EAAE,MAAM,aACR;AACR,aACE,UAAU,UACV,mBAAmB;AAAA,QACjB,KAAK;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA,OAAO,MAAM,QAAQ;AAAA,MAAA,CACtB;AAAA,IAEL,CAAC;AAAA,EACH;AACA,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,QAAM,OAAO,OAAO,KAAK,EAAE,YAAA;AAC3B,QAAM,SAAQ,UAAK,eAAe,MAApB,mBAAwB,OAAO,KAAK;AAClD,SAAO,KAAK,SAAS,KAAK,KAAK,QAAQ,+BAAO,cAAc,SAAS,MAAM;AAC7E;;"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { isPlainObject } from "../lib/collections.js";
|
|
2
|
-
import {
|
|
2
|
+
import { isOpenStringMap, schemaRendersAsObject } from "./json-schema-form-resolve.js";
|
|
3
|
+
import { effectiveProperties } from "./json-schema-form-conditionals.js";
|
|
3
4
|
function matchesFieldFilter({
|
|
4
5
|
key,
|
|
5
6
|
prop,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"json-schema-form-filter.js","sources":["../../src/components/json-schema-form-filter.ts"],"sourcesContent":["import { isPlainObject } from \"../lib/collections\";\nimport {\n
|
|
1
|
+
{"version":3,"file":"json-schema-form-filter.js","sources":["../../src/components/json-schema-form-filter.ts"],"sourcesContent":["import { isPlainObject } from \"../lib/collections\";\nimport {\n isOpenStringMap,\n schemaRendersAsObject,\n} from \"./json-schema-form-resolve\";\nimport { effectiveProperties } from \"./json-schema-form-conditionals\";\nimport type {\n JsonSchemaObject,\n JsonSchemaProperty,\n} from \"./json-schema-form-types\";\n\nexport function matchesFieldFilter({\n key,\n prop,\n filter,\n value,\n}: {\n key: string;\n prop: JsonSchemaProperty;\n filter: string;\n value?: unknown;\n}): boolean {\n const query = filter.trim().toLowerCase();\n if (\n !query ||\n key.toLowerCase().includes(query) ||\n prop.title?.toLowerCase().includes(query)\n )\n return true;\n if (prop.format === \"password\") return false;\n if (Array.isArray(value)) {\n return value.some((item) =>\n matchesFieldFilter({\n key: \"\",\n prop: prop.items ?? {},\n filter,\n value: item,\n }),\n );\n }\n if (isPlainObject(value)) {\n const { properties } = effectiveProperties(prop as JsonSchemaObject, value);\n const openMap =\n isOpenStringMap(prop) ||\n (schemaRendersAsObject(prop) &&\n !prop.properties &&\n Object.keys(properties).length === 0);\n const keys = new Set([...Object.keys(properties), ...Object.keys(value)]);\n return [...keys].some((childKey) => {\n const child =\n properties[childKey] ??\n Object.entries(prop.patternProperties ?? {}).find(([pattern]) =>\n new RegExp(pattern).test(childKey),\n )?.[1] ??\n (isPlainObject(prop.additionalProperties)\n ? prop.additionalProperties\n : openMap\n ? { type: \"string\" }\n : undefined);\n return (\n child !== undefined &&\n matchesFieldFilter({\n key: childKey,\n prop: child,\n filter,\n value: value[childKey],\n })\n );\n });\n }\n if (value === null || value === undefined) return false;\n const text = String(value).toLowerCase();\n const label = prop[\"x-enum-labels\"]?.[String(value)];\n return text.includes(query) || Boolean(label?.toLowerCase().includes(query));\n}\n"],"names":["_a"],"mappings":";;;AAWO,SAAS,mBAAmB;AAAA,EACjC;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,GAKY;;AACV,QAAM,QAAQ,OAAO,KAAA,EAAO,YAAA;AAC5B,MACE,CAAC,SACD,IAAI,YAAA,EAAc,SAAS,KAAK,OAChC,UAAK,UAAL,mBAAY,cAAc,SAAS;AAEnC,WAAO;AACT,MAAI,KAAK,WAAW,WAAY,QAAO;AACvC,MAAI,MAAM,QAAQ,KAAK,GAAG;AACxB,WAAO,MAAM;AAAA,MAAK,CAAC,SACjB,mBAAmB;AAAA,QACjB,KAAK;AAAA,QACL,MAAM,KAAK,SAAS,CAAA;AAAA,QACpB;AAAA,QACA,OAAO;AAAA,MAAA,CACR;AAAA,IAAA;AAAA,EAEL;AACA,MAAI,cAAc,KAAK,GAAG;AACxB,UAAM,EAAE,WAAA,IAAe,oBAAoB,MAA0B,KAAK;AAC1E,UAAM,UACJ,gBAAgB,IAAI,KACnB,sBAAsB,IAAI,KACzB,CAAC,KAAK,cACN,OAAO,KAAK,UAAU,EAAE,WAAW;AACvC,UAAM,OAAO,oBAAI,IAAI,CAAC,GAAG,OAAO,KAAK,UAAU,GAAG,GAAG,OAAO,KAAK,KAAK,CAAC,CAAC;AACxE,WAAO,CAAC,GAAG,IAAI,EAAE,KAAK,CAAC,aAAa;;AAClC,YAAM,QACJ,WAAW,QAAQ,OACnBA,MAAA,OAAO,QAAQ,KAAK,qBAAqB,CAAA,CAAE,EAAE;AAAA,QAAK,CAAC,CAAC,OAAO,MACzD,IAAI,OAAO,OAAO,EAAE,KAAK,QAAQ;AAAA,MAAA,MADnC,gBAAAA,IAEI,QACH,cAAc,KAAK,oBAAoB,IACpC,KAAK,uBACL,UACE,EAAE,MAAM,aACR;AACR,aACE,UAAU,UACV,mBAAmB;AAAA,QACjB,KAAK;AAAA,QACL,MAAM;AAAA,QACN;AAAA,QACA,OAAO,MAAM,QAAQ;AAAA,MAAA,CACtB;AAAA,IAEL,CAAC;AAAA,EACH;AACA,MAAI,UAAU,QAAQ,UAAU,OAAW,QAAO;AAClD,QAAM,OAAO,OAAO,KAAK,EAAE,YAAA;AAC3B,QAAM,SAAQ,UAAK,eAAe,MAApB,mBAAwB,OAAO,KAAK;AAClD,SAAO,KAAK,SAAS,KAAK,KAAK,QAAQ,+BAAO,cAAc,SAAS,MAAM;AAC7E;"}
|