@baseplate-dev/project-builder-lib 0.5.3 → 0.6.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +69 -0
- package/dist/definition/index.d.ts +0 -1
- package/dist/definition/index.d.ts.map +1 -1
- package/dist/definition/index.js +0 -1
- package/dist/definition/index.js.map +1 -1
- package/dist/definition/model/model-field-utils.js +2 -2
- package/dist/definition/model/model-field-utils.js.map +1 -1
- package/dist/definition/model/model-utils.d.ts.map +1 -1
- package/dist/definition/model/model-utils.js +2 -2
- package/dist/definition/model/model-utils.js.map +1 -1
- package/dist/definition/project-definition-container.d.ts +21 -12
- package/dist/definition/project-definition-container.d.ts.map +1 -1
- package/dist/definition/project-definition-container.js +42 -23
- package/dist/definition/project-definition-container.js.map +1 -1
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +6 -0
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/migration-024-graphql-object-type-field-auth.d.ts +30 -0
- package/dist/migrations/migration-024-graphql-object-type-field-auth.d.ts.map +1 -0
- package/dist/migrations/migration-024-graphql-object-type-field-auth.js +54 -0
- package/dist/migrations/migration-024-graphql-object-type-field-auth.js.map +1 -0
- package/dist/migrations/migration-025-service-method-auth.d.ts +44 -0
- package/dist/migrations/migration-025-service-method-auth.d.ts.map +1 -0
- package/dist/migrations/migration-025-service-method-auth.js +62 -0
- package/dist/migrations/migration-025-service-method-auth.js.map +1 -0
- package/dist/migrations/migration-026-query-shared-roles.d.ts +32 -0
- package/dist/migrations/migration-026-query-shared-roles.d.ts.map +1 -0
- package/dist/migrations/migration-026-query-shared-roles.js +48 -0
- package/dist/migrations/migration-026-query-shared-roles.js.map +1 -0
- package/dist/parser/apply-definition-fixes.d.ts +13 -0
- package/dist/parser/apply-definition-fixes.d.ts.map +1 -0
- package/dist/parser/apply-definition-fixes.js +25 -0
- package/dist/parser/apply-definition-fixes.js.map +1 -0
- package/dist/parser/clean-default-values.d.ts +14 -0
- package/dist/parser/clean-default-values.d.ts.map +1 -0
- package/dist/parser/clean-default-values.js +24 -0
- package/dist/parser/clean-default-values.js.map +1 -0
- package/dist/parser/collect-definition-issues.d.ts +36 -0
- package/dist/parser/collect-definition-issues.d.ts.map +1 -0
- package/dist/parser/collect-definition-issues.js +94 -0
- package/dist/parser/collect-definition-issues.js.map +1 -0
- package/dist/parser/collect-expression-issues.d.ts +17 -0
- package/dist/parser/collect-expression-issues.d.ts.map +1 -0
- package/dist/parser/collect-expression-issues.js +33 -0
- package/dist/parser/collect-expression-issues.js.map +1 -0
- package/dist/parser/definition-issue-checkers/mutation-roles-checker.d.ts +11 -0
- package/dist/parser/definition-issue-checkers/mutation-roles-checker.d.ts.map +1 -0
- package/dist/parser/definition-issue-checkers/mutation-roles-checker.js +41 -0
- package/dist/parser/definition-issue-checkers/mutation-roles-checker.js.map +1 -0
- package/dist/parser/definition-issue-checkers/relation-type-mismatch-checker.d.ts +10 -0
- package/dist/parser/definition-issue-checkers/relation-type-mismatch-checker.d.ts.map +1 -0
- package/dist/parser/definition-issue-checkers/relation-type-mismatch-checker.js +36 -0
- package/dist/parser/definition-issue-checkers/relation-type-mismatch-checker.js.map +1 -0
- package/dist/parser/definition-issue-utils.d.ts +23 -0
- package/dist/parser/definition-issue-utils.d.ts.map +1 -0
- package/dist/parser/definition-issue-utils.js +33 -0
- package/dist/parser/definition-issue-utils.js.map +1 -0
- package/dist/parser/index.d.ts +9 -0
- package/dist/parser/index.d.ts.map +1 -1
- package/dist/parser/index.js +8 -0
- package/dist/parser/index.js.map +1 -1
- package/dist/parser/parser.d.ts.map +1 -1
- package/dist/parser/parser.js +7 -2
- package/dist/parser/parser.js.map +1 -1
- package/dist/parser/schema-structure.d.ts +53 -0
- package/dist/parser/schema-structure.d.ts.map +1 -0
- package/dist/parser/schema-structure.js +171 -0
- package/dist/parser/schema-structure.js.map +1 -0
- package/dist/parser/transform-data-with-schema.d.ts +35 -0
- package/dist/parser/transform-data-with-schema.d.ts.map +1 -0
- package/dist/parser/transform-data-with-schema.js +140 -0
- package/dist/parser/transform-data-with-schema.js.map +1 -0
- package/dist/parser/types.d.ts +6 -3
- package/dist/parser/types.d.ts.map +1 -1
- package/dist/parser/walk-data-with-schema.d.ts +46 -0
- package/dist/parser/walk-data-with-schema.d.ts.map +1 -0
- package/dist/parser/walk-data-with-schema.js +140 -0
- package/dist/parser/walk-data-with-schema.js.map +1 -0
- package/dist/parser/walk-schema-structure.d.ts +60 -0
- package/dist/parser/walk-schema-structure.d.ts.map +1 -0
- package/dist/parser/walk-schema-structure.js +163 -0
- package/dist/parser/walk-schema-structure.js.map +1 -0
- package/dist/plugins/imports/loader.d.ts +1 -1
- package/dist/plugins/imports/loader.d.ts.map +1 -1
- package/dist/plugins/imports/loader.js +2 -2
- package/dist/plugins/imports/loader.js.map +1 -1
- package/dist/plugins/imports/types.d.ts +1 -1
- package/dist/plugins/imports/types.d.ts.map +1 -1
- package/dist/plugins/metadata/types.d.ts +1 -1
- package/dist/plugins/metadata/types.js +1 -1
- package/dist/plugins/plugins.test-utils.d.ts +15 -0
- package/dist/plugins/plugins.test-utils.d.ts.map +1 -1
- package/dist/plugins/plugins.test-utils.js +24 -0
- package/dist/plugins/plugins.test-utils.js.map +1 -1
- package/dist/plugins/spec/config-spec.d.ts +1 -0
- package/dist/plugins/spec/config-spec.d.ts.map +1 -1
- package/dist/plugins/spec/config-spec.js +1 -0
- package/dist/plugins/spec/config-spec.js.map +1 -1
- package/dist/plugins/store/store.d.ts +6 -1
- package/dist/plugins/store/store.d.ts.map +1 -1
- package/dist/plugins/store/store.js +9 -1
- package/dist/plugins/store/store.js.map +1 -1
- package/dist/references/definition-ref-registry.d.ts +105 -0
- package/dist/references/definition-ref-registry.d.ts.map +1 -0
- package/dist/references/definition-ref-registry.js +40 -0
- package/dist/references/definition-ref-registry.js.map +1 -0
- package/dist/references/deserialize-schema.d.ts +4 -6
- package/dist/references/deserialize-schema.d.ts.map +1 -1
- package/dist/references/deserialize-schema.js +4 -5
- package/dist/references/deserialize-schema.js.map +1 -1
- package/dist/references/expression-types.d.ts +46 -14
- package/dist/references/expression-types.d.ts.map +1 -1
- package/dist/references/expression-types.js +17 -0
- package/dist/references/expression-types.js.map +1 -1
- package/dist/references/extend-parser-context-with-refs.d.ts +32 -2
- package/dist/references/extend-parser-context-with-refs.d.ts.map +1 -1
- package/dist/references/extend-parser-context-with-refs.js +123 -163
- package/dist/references/extend-parser-context-with-refs.js.map +1 -1
- package/dist/references/extract-definition-refs.d.ts +9 -8
- package/dist/references/extract-definition-refs.d.ts.map +1 -1
- package/dist/references/extract-definition-refs.js +110 -26
- package/dist/references/extract-definition-refs.js.map +1 -1
- package/dist/references/fix-ref-deletions.d.ts +6 -6
- package/dist/references/fix-ref-deletions.d.ts.map +1 -1
- package/dist/references/fix-ref-deletions.js +2 -2
- package/dist/references/fix-ref-deletions.js.map +1 -1
- package/dist/references/index.d.ts +3 -0
- package/dist/references/index.d.ts.map +1 -1
- package/dist/references/index.js +3 -0
- package/dist/references/index.js.map +1 -1
- package/dist/references/parse-schema-with-references.d.ts +8 -6
- package/dist/references/parse-schema-with-references.d.ts.map +1 -1
- package/dist/references/parse-schema-with-references.js +10 -12
- package/dist/references/parse-schema-with-references.js.map +1 -1
- package/dist/references/ref-schema-visitor.d.ts +33 -0
- package/dist/references/ref-schema-visitor.d.ts.map +1 -0
- package/dist/references/ref-schema-visitor.js +61 -0
- package/dist/references/ref-schema-visitor.js.map +1 -0
- package/dist/references/resolve-slots.d.ts +1 -1
- package/dist/references/resolve-slots.d.ts.map +1 -1
- package/dist/references/serialize-schema.d.ts +9 -2
- package/dist/references/serialize-schema.d.ts.map +1 -1
- package/dist/references/serialize-schema.js +20 -4
- package/dist/references/serialize-schema.js.map +1 -1
- package/dist/schema/apps/web/admin/admin.d.ts +22 -37
- package/dist/schema/apps/web/admin/admin.d.ts.map +1 -1
- package/dist/schema/apps/web/admin/sections/crud-actions/admin-crud-action.d.ts +6 -15
- package/dist/schema/apps/web/admin/sections/crud-actions/admin-crud-action.d.ts.map +1 -1
- package/dist/schema/apps/web/admin/sections/crud-actions/admin-crud-action.js +3 -8
- package/dist/schema/apps/web/admin/sections/crud-actions/admin-crud-action.js.map +1 -1
- package/dist/schema/apps/web/admin/sections/crud-columns/admin-crud-column.d.ts +6 -15
- package/dist/schema/apps/web/admin/sections/crud-columns/admin-crud-column.d.ts.map +1 -1
- package/dist/schema/apps/web/admin/sections/crud-columns/admin-crud-column.js +3 -8
- package/dist/schema/apps/web/admin/sections/crud-columns/admin-crud-column.js.map +1 -1
- package/dist/schema/apps/web/admin/sections/crud-form/admin-crud-input.d.ts +9 -15
- package/dist/schema/apps/web/admin/sections/crud-form/admin-crud-input.d.ts.map +1 -1
- package/dist/schema/apps/web/admin/sections/crud-form/admin-crud-input.js +3 -8
- package/dist/schema/apps/web/admin/sections/crud-form/admin-crud-input.js.map +1 -1
- package/dist/schema/apps/web/admin/sections/crud.d.ts +6 -6
- package/dist/schema/apps/web/web-app.d.ts +32 -47
- package/dist/schema/apps/web/web-app.d.ts.map +1 -1
- package/dist/schema/creator/definition-default-registry.d.ts +22 -0
- package/dist/schema/creator/definition-default-registry.d.ts.map +1 -0
- package/dist/schema/creator/definition-default-registry.js +18 -0
- package/dist/schema/creator/definition-default-registry.js.map +1 -0
- package/dist/schema/creator/definition-fix-registry.d.ts +45 -0
- package/dist/schema/creator/definition-fix-registry.d.ts.map +1 -0
- package/dist/schema/creator/definition-fix-registry.js +41 -0
- package/dist/schema/creator/definition-fix-registry.js.map +1 -0
- package/dist/schema/creator/definition-issue-checker-spec.d.ts +37 -0
- package/dist/schema/creator/definition-issue-checker-spec.d.ts.map +1 -0
- package/dist/schema/creator/definition-issue-checker-spec.js +28 -0
- package/dist/schema/creator/definition-issue-checker-spec.js.map +1 -0
- package/dist/schema/creator/definition-issue-checkers.d.ts +16 -0
- package/dist/schema/creator/definition-issue-checkers.d.ts.map +1 -0
- package/dist/schema/creator/definition-issue-checkers.js +35 -0
- package/dist/schema/creator/definition-issue-checkers.js.map +1 -0
- package/dist/schema/creator/definition-issue-registry.d.ts +54 -0
- package/dist/schema/creator/definition-issue-registry.d.ts.map +1 -0
- package/dist/schema/creator/definition-issue-registry.js +47 -0
- package/dist/schema/creator/definition-issue-registry.js.map +1 -0
- package/dist/schema/creator/definition-issue-types.d.ts +53 -0
- package/dist/schema/creator/definition-issue-types.d.ts.map +1 -0
- package/dist/schema/creator/definition-issue-types.js +2 -0
- package/dist/schema/creator/definition-issue-types.js.map +1 -0
- package/dist/schema/creator/extend-parser-context-with-defaults.d.ts +20 -4
- package/dist/schema/creator/extend-parser-context-with-defaults.d.ts.map +1 -1
- package/dist/schema/creator/extend-parser-context-with-defaults.js +24 -42
- package/dist/schema/creator/extend-parser-context-with-defaults.js.map +1 -1
- package/dist/schema/creator/index.d.ts +6 -0
- package/dist/schema/creator/index.d.ts.map +1 -1
- package/dist/schema/creator/index.js +5 -0
- package/dist/schema/creator/index.js.map +1 -1
- package/dist/schema/creator/schema-creator.d.ts.map +1 -1
- package/dist/schema/creator/schema-creator.js +18 -4
- package/dist/schema/creator/schema-creator.js.map +1 -1
- package/dist/schema/creator/types.d.ts +3 -30
- package/dist/schema/creator/types.d.ts.map +1 -1
- package/dist/schema/models/authorizer/authorizer-expression-acorn-parser.d.ts.map +1 -1
- package/dist/schema/models/authorizer/authorizer-expression-acorn-parser.js +116 -25
- package/dist/schema/models/authorizer/authorizer-expression-acorn-parser.js.map +1 -1
- package/dist/schema/models/authorizer/authorizer-expression-ast.d.ts +82 -1
- package/dist/schema/models/authorizer/authorizer-expression-ast.d.ts.map +1 -1
- package/dist/schema/models/authorizer/authorizer-expression-ast.js.map +1 -1
- package/dist/schema/models/authorizer/authorizer-expression-parser.d.ts +8 -9
- package/dist/schema/models/authorizer/authorizer-expression-parser.d.ts.map +1 -1
- package/dist/schema/models/authorizer/authorizer-expression-parser.js +28 -35
- package/dist/schema/models/authorizer/authorizer-expression-parser.js.map +1 -1
- package/dist/schema/models/authorizer/authorizer-expression-validator.d.ts +42 -4
- package/dist/schema/models/authorizer/authorizer-expression-validator.d.ts.map +1 -1
- package/dist/schema/models/authorizer/authorizer-expression-validator.js +119 -18
- package/dist/schema/models/authorizer/authorizer-expression-validator.js.map +1 -1
- package/dist/schema/models/graphql.d.ts +42 -111
- package/dist/schema/models/graphql.d.ts.map +1 -1
- package/dist/schema/models/graphql.js +59 -19
- package/dist/schema/models/graphql.js.map +1 -1
- package/dist/schema/models/models.d.ts +1134 -343
- package/dist/schema/models/models.d.ts.map +1 -1
- package/dist/schema/models/models.js +258 -86
- package/dist/schema/models/models.js.map +1 -1
- package/dist/schema/plugins/definition.d.ts +2 -30
- package/dist/schema/plugins/definition.d.ts.map +1 -1
- package/dist/schema/plugins/definition.js +26 -15
- package/dist/schema/plugins/definition.js.map +1 -1
- package/dist/schema/project-definition.d.ts +532 -186
- package/dist/schema/project-definition.d.ts.map +1 -1
- package/dist/schema/project-definition.js +15 -3
- package/dist/schema/project-definition.js.map +1 -1
- package/dist/schema/settings/general.d.ts +1 -1
- package/dist/schema/settings/general.d.ts.map +1 -1
- package/dist/schema/settings/general.js +4 -1
- package/dist/schema/settings/general.js.map +1 -1
- package/dist/schema/settings/settings.d.ts +3 -3
- package/dist/schema/settings/theme.d.ts +3 -3
- package/dist/testing/definition-helpers.test-helper.d.ts +12 -0
- package/dist/testing/definition-helpers.test-helper.d.ts.map +1 -0
- package/dist/testing/definition-helpers.test-helper.js +77 -0
- package/dist/testing/definition-helpers.test-helper.js.map +1 -0
- package/dist/testing/expression-stub-parser.test-helper.d.ts +59 -0
- package/dist/testing/expression-stub-parser.test-helper.d.ts.map +1 -0
- package/dist/testing/expression-stub-parser.test-helper.js +79 -0
- package/dist/testing/expression-stub-parser.test-helper.js.map +1 -0
- package/dist/testing/expression-warning-parser.test-helper.d.ts +39 -0
- package/dist/testing/expression-warning-parser.test-helper.d.ts.map +1 -0
- package/dist/testing/expression-warning-parser.test-helper.js +62 -0
- package/dist/testing/expression-warning-parser.test-helper.js.map +1 -0
- package/dist/testing/index.d.ts +5 -0
- package/dist/testing/index.d.ts.map +1 -0
- package/dist/testing/index.js +5 -0
- package/dist/testing/index.js.map +1 -0
- package/dist/testing/parser-context.test-helper.d.ts +8 -0
- package/dist/testing/parser-context.test-helper.d.ts.map +1 -0
- package/dist/testing/parser-context.test-helper.js +16 -0
- package/dist/testing/parser-context.test-helper.js.map +1 -0
- package/dist/{definition/project-definition-container.test-utils.d.ts → testing/project-definition-container.test-helper.d.ts} +4 -2
- package/dist/testing/project-definition-container.test-helper.d.ts.map +1 -0
- package/dist/{definition/project-definition-container.test-utils.js → testing/project-definition-container.test-helper.js} +11 -5
- package/dist/testing/project-definition-container.test-helper.js.map +1 -0
- package/dist/tools/assign-entity-ids.d.ts +17 -0
- package/dist/tools/assign-entity-ids.d.ts.map +1 -0
- package/dist/tools/assign-entity-ids.js +34 -0
- package/dist/tools/assign-entity-ids.js.map +1 -0
- package/dist/tools/entity-service/entity-navigation.d.ts +13 -0
- package/dist/tools/entity-service/entity-navigation.d.ts.map +1 -0
- package/dist/tools/entity-service/entity-navigation.js +84 -0
- package/dist/tools/entity-service/entity-navigation.js.map +1 -0
- package/dist/tools/entity-service/entity-read.d.ts +38 -0
- package/dist/tools/entity-service/entity-read.d.ts.map +1 -0
- package/dist/tools/entity-service/entity-read.js +56 -0
- package/dist/tools/entity-service/entity-read.js.map +1 -0
- package/dist/tools/entity-service/entity-type-map.d.ts +18 -0
- package/dist/tools/entity-service/entity-type-map.d.ts.map +1 -0
- package/dist/tools/entity-service/entity-type-map.js +75 -0
- package/dist/tools/entity-service/entity-type-map.js.map +1 -0
- package/dist/tools/entity-service/entity-write.d.ts +39 -0
- package/dist/tools/entity-service/entity-write.d.ts.map +1 -0
- package/dist/tools/entity-service/entity-write.js +99 -0
- package/dist/tools/entity-service/entity-write.js.map +1 -0
- package/dist/tools/entity-service/index.d.ts +5 -0
- package/dist/tools/entity-service/index.d.ts.map +1 -0
- package/dist/tools/entity-service/index.js +4 -0
- package/dist/tools/entity-service/index.js.map +1 -0
- package/dist/tools/entity-service/types.d.ts +41 -0
- package/dist/tools/entity-service/types.d.ts.map +1 -0
- package/dist/tools/entity-service/types.js +2 -0
- package/dist/tools/entity-service/types.js.map +1 -0
- package/dist/tools/index.d.ts +2 -1
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +2 -1
- package/dist/tools/index.js.map +1 -1
- package/dist/tools/merge-schema/diff-definition.d.ts +74 -0
- package/dist/tools/merge-schema/diff-definition.d.ts.map +1 -0
- package/dist/tools/merge-schema/diff-definition.js +163 -0
- package/dist/tools/merge-schema/diff-definition.js.map +1 -0
- package/dist/tools/merge-schema/entity-utils.d.ts +18 -0
- package/dist/tools/merge-schema/entity-utils.d.ts.map +1 -0
- package/dist/tools/merge-schema/entity-utils.js +42 -0
- package/dist/tools/merge-schema/entity-utils.js.map +1 -0
- package/dist/tools/merge-schema/index.d.ts +10 -0
- package/dist/tools/merge-schema/index.d.ts.map +1 -0
- package/dist/tools/merge-schema/index.js +7 -0
- package/dist/tools/merge-schema/index.js.map +1 -0
- package/dist/tools/merge-schema/merge-data-with-schema.d.ts +21 -0
- package/dist/tools/merge-schema/merge-data-with-schema.d.ts.map +1 -0
- package/dist/tools/merge-schema/merge-data-with-schema.js +168 -0
- package/dist/tools/merge-schema/merge-data-with-schema.js.map +1 -0
- package/dist/tools/merge-schema/merge-definition.d.ts +42 -0
- package/dist/tools/merge-schema/merge-definition.d.ts.map +1 -0
- package/dist/tools/merge-schema/merge-definition.js +53 -0
- package/dist/tools/merge-schema/merge-definition.js.map +1 -0
- package/dist/tools/merge-schema/merge-rule-registry.d.ts +47 -0
- package/dist/tools/merge-schema/merge-rule-registry.d.ts.map +1 -0
- package/dist/tools/merge-schema/merge-rule-registry.js +53 -0
- package/dist/tools/merge-schema/merge-rule-registry.js.map +1 -0
- package/dist/tools/merge-schema/walk-schema.d.ts +26 -0
- package/dist/tools/merge-schema/walk-schema.d.ts.map +1 -0
- package/dist/tools/merge-schema/walk-schema.js +94 -0
- package/dist/tools/merge-schema/walk-schema.js.map +1 -0
- package/dist/utils/definition-diff/definition-diff.js.map +1 -1
- package/dist/web/components/definition-diff-alert.d.ts +9 -0
- package/dist/web/components/definition-diff-alert.d.ts.map +1 -0
- package/dist/web/components/definition-diff-alert.js +17 -0
- package/dist/web/components/definition-diff-alert.js.map +1 -0
- package/dist/web/components/index.d.ts +1 -1
- package/dist/web/components/index.d.ts.map +1 -1
- package/dist/web/components/index.js +1 -1
- package/dist/web/components/index.js.map +1 -1
- package/dist/web/hooks/use-project-definition.d.ts +10 -2
- package/dist/web/hooks/use-project-definition.d.ts.map +1 -1
- package/dist/web/hooks/use-project-definition.js.map +1 -1
- package/dist/web/specs/entity-type-url-web-spec.d.ts +68 -0
- package/dist/web/specs/entity-type-url-web-spec.d.ts.map +1 -0
- package/dist/web/specs/entity-type-url-web-spec.js +27 -0
- package/dist/web/specs/entity-type-url-web-spec.js.map +1 -0
- package/dist/web/specs/index.d.ts +1 -0
- package/dist/web/specs/index.d.ts.map +1 -1
- package/dist/web/specs/index.js +1 -0
- package/dist/web/specs/index.js.map +1 -1
- package/package.json +12 -11
- package/dist/definition/project-definition-container.test-utils.d.ts.map +0 -1
- package/dist/definition/project-definition-container.test-utils.js.map +0 -1
- package/dist/references/collect-refs.d.ts +0 -24
- package/dist/references/collect-refs.d.ts.map +0 -1
- package/dist/references/collect-refs.js +0 -86
- package/dist/references/collect-refs.js.map +0 -1
- package/dist/references/markers.d.ts +0 -59
- package/dist/references/markers.d.ts.map +0 -1
- package/dist/references/markers.js +0 -29
- package/dist/references/markers.js.map +0 -1
- package/dist/references/strip-ref-markers.d.ts +0 -7
- package/dist/references/strip-ref-markers.d.ts.map +0 -1
- package/dist/references/strip-ref-markers.js +0 -25
- package/dist/references/strip-ref-markers.js.map +0 -1
- package/dist/schema/models/mocks.d.ts +0 -6
- package/dist/schema/models/mocks.d.ts.map +0 -1
- package/dist/schema/models/mocks.js +0 -55
- package/dist/schema/models/mocks.js.map +0 -1
- package/dist/tools/model-merger/index.d.ts +0 -2
- package/dist/tools/model-merger/index.d.ts.map +0 -1
- package/dist/tools/model-merger/index.js +0 -2
- package/dist/tools/model-merger/index.js.map +0 -1
- package/dist/tools/model-merger/model-merger.d.ts +0 -569
- package/dist/tools/model-merger/model-merger.d.ts.map +0 -1
- package/dist/tools/model-merger/model-merger.js +0 -319
- package/dist/tools/model-merger/model-merger.js.map +0 -1
- package/dist/web/components/model-merger-result-alert.d.ts +0 -8
- package/dist/web/components/model-merger-result-alert.d.ts.map +0 -1
- package/dist/web/components/model-merger-result-alert.js +0 -20
- package/dist/web/components/model-merger-result-alert.js.map +0 -1
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { z } from 'zod';
|
|
2
|
+
import type { SchemaPathElement } from '#src/parser/walk-schema-structure.js';
|
|
3
|
+
import type { EntitySchemaMeta } from '#src/references/definition-ref-registry.js';
|
|
4
|
+
import type { DefinitionEntity, DefinitionEntityType } from '#src/references/types.js';
|
|
5
|
+
/**
|
|
6
|
+
* Metadata about an entity type's location in the definition schema.
|
|
7
|
+
*/
|
|
8
|
+
export interface EntityTypeMetadata {
|
|
9
|
+
/** Entity type name (e.g., "model", "model-scalar-field") */
|
|
10
|
+
name: string;
|
|
11
|
+
/** The DefinitionEntityType instance */
|
|
12
|
+
entityType: DefinitionEntityType;
|
|
13
|
+
/** Entity metadata from schema annotations */
|
|
14
|
+
entityMeta: EntitySchemaMeta;
|
|
15
|
+
/** Element schema for the entity array */
|
|
16
|
+
elementSchema: z.ZodType;
|
|
17
|
+
/** Path from parent entity (or root) to this entity's array */
|
|
18
|
+
relativePath: SchemaPathElement[];
|
|
19
|
+
/** Parent entity type name, if this is a nested entity */
|
|
20
|
+
parentEntityTypeName?: string;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Map from entity type name to its metadata.
|
|
24
|
+
* Built once from the schema and reused for all operations.
|
|
25
|
+
*/
|
|
26
|
+
export type EntityTypeMap = Map<string, EntityTypeMetadata>;
|
|
27
|
+
export interface EntityServiceContext {
|
|
28
|
+
/**
|
|
29
|
+
* The serialized definition but with defaults provided.
|
|
30
|
+
*/
|
|
31
|
+
serializedDefinition: Record<string, unknown>;
|
|
32
|
+
/**
|
|
33
|
+
* The entity type map built from the schema.
|
|
34
|
+
*/
|
|
35
|
+
entityTypeMap: EntityTypeMap;
|
|
36
|
+
/**
|
|
37
|
+
* Looks up an entity by its ID.
|
|
38
|
+
*/
|
|
39
|
+
lookupEntity: (entityId: string) => DefinitionEntity | undefined;
|
|
40
|
+
}
|
|
41
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/tools/entity-service/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,sCAAsC,CAAC;AAC9E,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AACnF,OAAO,KAAK,EACV,gBAAgB,EAChB,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AAElC;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,6DAA6D;IAC7D,IAAI,EAAE,MAAM,CAAC;IACb,wCAAwC;IACxC,UAAU,EAAE,oBAAoB,CAAC;IACjC,8CAA8C;IAC9C,UAAU,EAAE,gBAAgB,CAAC;IAC7B,0CAA0C;IAC1C,aAAa,EAAE,CAAC,CAAC,OAAO,CAAC;IACzB,+DAA+D;IAC/D,YAAY,EAAE,iBAAiB,EAAE,CAAC;IAClC,0DAA0D;IAC1D,oBAAoB,CAAC,EAAE,MAAM,CAAC;CAC/B;AAED;;;GAGG;AACH,MAAM,MAAM,aAAa,GAAG,GAAG,CAAC,MAAM,EAAE,kBAAkB,CAAC,CAAC;AAE5D,MAAM,WAAW,oBAAoB;IACnC;;OAEG;IACH,oBAAoB,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9C;;OAEG;IACH,aAAa,EAAE,aAAa,CAAC;IAC7B;;OAEG;IACH,YAAY,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,gBAAgB,GAAG,SAAS,CAAC;CAClE"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/tools/entity-service/types.ts"],"names":[],"mappings":""}
|
package/dist/tools/index.d.ts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC"}
|
package/dist/tools/index.js
CHANGED
package/dist/tools/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,cAAc,2BAA2B,CAAC;AAC1C,cAAc,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { z } from 'zod';
|
|
2
|
+
import type { PartialProjectDefinitionInput, ProjectDefinition } from '#src/schema/index.js';
|
|
3
|
+
type PlainObject = Record<string, unknown>;
|
|
4
|
+
/**
|
|
5
|
+
* A single diff entry representing a changed entity or section.
|
|
6
|
+
*/
|
|
7
|
+
export interface DefinitionDiffEntry {
|
|
8
|
+
/** Top-level key in the definition (e.g., "models", "settings") */
|
|
9
|
+
path: string;
|
|
10
|
+
/**
|
|
11
|
+
* Human-readable label for this entry.
|
|
12
|
+
*
|
|
13
|
+
* Entity arrays: `"Model: User"`, `"App: backend"`
|
|
14
|
+
* Other fields: `"Settings"`, `"Features"`
|
|
15
|
+
*/
|
|
16
|
+
label: string;
|
|
17
|
+
/** Type of change */
|
|
18
|
+
type: 'added' | 'updated' | 'removed';
|
|
19
|
+
/** The current serialized value (undefined for additions) */
|
|
20
|
+
current: unknown;
|
|
21
|
+
/** The merged serialized value (undefined for removals) */
|
|
22
|
+
merged: unknown;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Result of diffing a project definition against a partial merge.
|
|
26
|
+
*/
|
|
27
|
+
export interface DefinitionDiff {
|
|
28
|
+
/** Whether there are any changes */
|
|
29
|
+
hasChanges: boolean;
|
|
30
|
+
/** Individual diff entries grouped by entity/section */
|
|
31
|
+
entries: DefinitionDiffEntry[];
|
|
32
|
+
}
|
|
33
|
+
export interface DiffSerializedDefinitionsOptions {
|
|
34
|
+
/**
|
|
35
|
+
* When provided, only these top-level keys are compared.
|
|
36
|
+
* When omitted, all keys from both definitions are compared.
|
|
37
|
+
*/
|
|
38
|
+
scopeToKeys?: Set<string>;
|
|
39
|
+
/**
|
|
40
|
+
* When provided, entity array diffs are scoped to only these entity names
|
|
41
|
+
* per top-level key. When omitted, all entities in both arrays are compared.
|
|
42
|
+
*/
|
|
43
|
+
entityNamesByKey?: Map<string, Set<string>>;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Compares two serialized project definitions at the entity level, producing
|
|
47
|
+
* diff entries for added, updated, and removed entities/fields.
|
|
48
|
+
*
|
|
49
|
+
* Both definitions should be in serialized form (with entity names, not IDs).
|
|
50
|
+
*
|
|
51
|
+
* @param schema - The project definition Zod schema
|
|
52
|
+
* @param currentDef - The current serialized definition
|
|
53
|
+
* @param otherDef - The other serialized definition to compare against
|
|
54
|
+
* @param options - Optional scoping options
|
|
55
|
+
* @returns Entity-level diff entries
|
|
56
|
+
*/
|
|
57
|
+
export declare function diffSerializedDefinitions(schema: z.ZodType, currentDef: PlainObject, otherDef: PlainObject, options?: DiffSerializedDefinitionsOptions): DefinitionDiff;
|
|
58
|
+
/**
|
|
59
|
+
* Computes a structured, entity-grouped diff between the current project definition
|
|
60
|
+
* and the result of merging a partial definition into it.
|
|
61
|
+
*
|
|
62
|
+
* For top-level entity arrays (models, apps, enums, libraries, features), produces
|
|
63
|
+
* one entry per entity that was added, updated, or removed — detected via schema
|
|
64
|
+
* entity metadata (`withEnt` annotations) using `collectEntityArrays`. For other
|
|
65
|
+
* top-level fields (settings, plugins, etc.), produces one entry per changed field.
|
|
66
|
+
*
|
|
67
|
+
* @param schema - The project definition Zod schema
|
|
68
|
+
* @param definition - The current parsed project definition (with IDs)
|
|
69
|
+
* @param partialDef - A partial serialized definition to merge in
|
|
70
|
+
* @returns A structured diff with entity-level entries
|
|
71
|
+
*/
|
|
72
|
+
export declare function diffDefinition(schema: z.ZodType, definition: ProjectDefinition, partialDef: PartialProjectDefinitionInput): DefinitionDiff;
|
|
73
|
+
export {};
|
|
74
|
+
//# sourceMappingURL=diff-definition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-definition.d.ts","sourceRoot":"","sources":["../../../src/tools/merge-schema/diff-definition.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAM7B,OAAO,KAAK,EACV,6BAA6B,EAC7B,iBAAiB,EAClB,MAAM,sBAAsB,CAAC;AAQ9B,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3C;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,mEAAmE;IACnE,IAAI,EAAE,MAAM,CAAC;IACb;;;;;OAKG;IACH,KAAK,EAAE,MAAM,CAAC;IACd,qBAAqB;IACrB,IAAI,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IACtC,6DAA6D;IAC7D,OAAO,EAAE,OAAO,CAAC;IACjB,2DAA2D;IAC3D,MAAM,EAAE,OAAO,CAAC;CACjB;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,oCAAoC;IACpC,UAAU,EAAE,OAAO,CAAC;IACpB,wDAAwD;IACxD,OAAO,EAAE,mBAAmB,EAAE,CAAC;CAChC;AAuED,MAAM,WAAW,gCAAgC;IAC/C;;;OAGG;IACH,WAAW,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAE1B;;;OAGG;IACH,gBAAgB,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC;CAC7C;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,CAAC,CAAC,OAAO,EACjB,UAAU,EAAE,WAAW,EACvB,QAAQ,EAAE,WAAW,EACrB,OAAO,CAAC,EAAE,gCAAgC,GACzC,cAAc,CA2EhB;AAMD;;;;;;;;;;;;;GAaG;AACH,wBAAgB,cAAc,CAC5B,MAAM,EAAE,CAAC,CAAC,OAAO,EACjB,UAAU,EAAE,iBAAiB,EAC7B,UAAU,EAAE,6BAA6B,GACxC,cAAc,CAwChB"}
|
|
@@ -0,0 +1,163 @@
|
|
|
1
|
+
import { isEqual } from 'es-toolkit';
|
|
2
|
+
import { capitalize } from 'es-toolkit/compat';
|
|
3
|
+
import { serializeSchema } from '#src/references/serialize-schema.js';
|
|
4
|
+
import { getEntityName } from './entity-utils.js';
|
|
5
|
+
import { mergeDefinition } from './merge-definition.js';
|
|
6
|
+
import { collectEntityArrays } from './walk-schema.js';
|
|
7
|
+
// ---------------------------------------------------------------------------
|
|
8
|
+
// Entity array diffing
|
|
9
|
+
// ---------------------------------------------------------------------------
|
|
10
|
+
/**
|
|
11
|
+
* Diffs an entity array by the `name` field.
|
|
12
|
+
*
|
|
13
|
+
* When `scopeToNames` is provided, only those entities are compared — this prevents
|
|
14
|
+
* showing "removed" entries for entities that the partial doesn't care about.
|
|
15
|
+
* When omitted, all entities in both arrays are compared.
|
|
16
|
+
*/
|
|
17
|
+
function diffEntityArray(path, entityMeta, currentArray, otherArray, scopeToNames) {
|
|
18
|
+
const entries = [];
|
|
19
|
+
const label = capitalize(entityMeta.type.name);
|
|
20
|
+
const currentByName = new Map(currentArray.map((item) => [getEntityName(entityMeta, item), item]));
|
|
21
|
+
const otherByName = new Map(otherArray.map((item) => [getEntityName(entityMeta, item), item]));
|
|
22
|
+
const namesToDiff = scopeToNames ?? new Set([...currentByName.keys(), ...otherByName.keys()]);
|
|
23
|
+
for (const name of namesToDiff) {
|
|
24
|
+
const currentItem = currentByName.get(name);
|
|
25
|
+
const otherItem = otherByName.get(name);
|
|
26
|
+
if (!currentItem && otherItem) {
|
|
27
|
+
entries.push({
|
|
28
|
+
path,
|
|
29
|
+
label: `${label}: ${name}`,
|
|
30
|
+
type: 'added',
|
|
31
|
+
current: undefined,
|
|
32
|
+
merged: otherItem,
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
else if (currentItem && !otherItem) {
|
|
36
|
+
entries.push({
|
|
37
|
+
path,
|
|
38
|
+
label: `${label}: ${name}`,
|
|
39
|
+
type: 'removed',
|
|
40
|
+
current: currentItem,
|
|
41
|
+
merged: undefined,
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
else if (currentItem && otherItem && !isEqual(currentItem, otherItem)) {
|
|
45
|
+
entries.push({
|
|
46
|
+
path,
|
|
47
|
+
label: `${label}: ${name}`,
|
|
48
|
+
type: 'updated',
|
|
49
|
+
current: currentItem,
|
|
50
|
+
merged: otherItem,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
return entries;
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* Compares two serialized project definitions at the entity level, producing
|
|
58
|
+
* diff entries for added, updated, and removed entities/fields.
|
|
59
|
+
*
|
|
60
|
+
* Both definitions should be in serialized form (with entity names, not IDs).
|
|
61
|
+
*
|
|
62
|
+
* @param schema - The project definition Zod schema
|
|
63
|
+
* @param currentDef - The current serialized definition
|
|
64
|
+
* @param otherDef - The other serialized definition to compare against
|
|
65
|
+
* @param options - Optional scoping options
|
|
66
|
+
* @returns Entity-level diff entries
|
|
67
|
+
*/
|
|
68
|
+
export function diffSerializedDefinitions(schema, currentDef, otherDef, options) {
|
|
69
|
+
const entityArrayInfoByKey = new Map(collectEntityArrays(schema)
|
|
70
|
+
.filter((info) => !info.path.includes('.'))
|
|
71
|
+
.map((info) => [info.path, info]));
|
|
72
|
+
const entries = [];
|
|
73
|
+
const keysToCompare = options?.scopeToKeys ??
|
|
74
|
+
new Set([...Object.keys(currentDef), ...Object.keys(otherDef)]);
|
|
75
|
+
for (const key of keysToCompare) {
|
|
76
|
+
const currentValue = currentDef[key];
|
|
77
|
+
const otherValue = otherDef[key];
|
|
78
|
+
if (isEqual(currentValue, otherValue)) {
|
|
79
|
+
continue;
|
|
80
|
+
}
|
|
81
|
+
const entityInfo = entityArrayInfoByKey.get(key);
|
|
82
|
+
if (entityInfo) {
|
|
83
|
+
const currentArray = (Array.isArray(currentValue) ? currentValue : []);
|
|
84
|
+
const otherArray = (Array.isArray(otherValue) ? otherValue : []);
|
|
85
|
+
const scopeToNames = options?.entityNamesByKey?.get(key);
|
|
86
|
+
entries.push(...diffEntityArray(key, entityInfo.entityMeta, currentArray, otherArray, scopeToNames));
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
const label = capitalize(key);
|
|
90
|
+
if (currentValue === undefined) {
|
|
91
|
+
entries.push({
|
|
92
|
+
path: key,
|
|
93
|
+
label,
|
|
94
|
+
type: 'added',
|
|
95
|
+
current: undefined,
|
|
96
|
+
merged: otherValue,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
else if (otherValue === undefined) {
|
|
100
|
+
entries.push({
|
|
101
|
+
path: key,
|
|
102
|
+
label,
|
|
103
|
+
type: 'removed',
|
|
104
|
+
current: currentValue,
|
|
105
|
+
merged: undefined,
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
else {
|
|
109
|
+
entries.push({
|
|
110
|
+
path: key,
|
|
111
|
+
label,
|
|
112
|
+
type: 'updated',
|
|
113
|
+
current: currentValue,
|
|
114
|
+
merged: otherValue,
|
|
115
|
+
});
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
return {
|
|
120
|
+
hasChanges: entries.length > 0,
|
|
121
|
+
entries,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
// ---------------------------------------------------------------------------
|
|
125
|
+
// High-level diff with merge
|
|
126
|
+
// ---------------------------------------------------------------------------
|
|
127
|
+
/**
|
|
128
|
+
* Computes a structured, entity-grouped diff between the current project definition
|
|
129
|
+
* and the result of merging a partial definition into it.
|
|
130
|
+
*
|
|
131
|
+
* For top-level entity arrays (models, apps, enums, libraries, features), produces
|
|
132
|
+
* one entry per entity that was added, updated, or removed — detected via schema
|
|
133
|
+
* entity metadata (`withEnt` annotations) using `collectEntityArrays`. For other
|
|
134
|
+
* top-level fields (settings, plugins, etc.), produces one entry per changed field.
|
|
135
|
+
*
|
|
136
|
+
* @param schema - The project definition Zod schema
|
|
137
|
+
* @param definition - The current parsed project definition (with IDs)
|
|
138
|
+
* @param partialDef - A partial serialized definition to merge in
|
|
139
|
+
* @returns A structured diff with entity-level entries
|
|
140
|
+
*/
|
|
141
|
+
export function diffDefinition(schema, definition, partialDef) {
|
|
142
|
+
const serializedDef = serializeSchema(schema, definition);
|
|
143
|
+
const mergedDef = mergeDefinition(schema, definition, partialDef);
|
|
144
|
+
const partialObj = partialDef;
|
|
145
|
+
const scopeToKeys = new Set(Object.keys(partialObj));
|
|
146
|
+
// Build entity name scopes from the partial definition
|
|
147
|
+
const entityArrayInfoByKey = new Map(collectEntityArrays(schema)
|
|
148
|
+
.filter((info) => !info.path.includes('.'))
|
|
149
|
+
.map((info) => [info.path, info]));
|
|
150
|
+
const entityNamesByKey = new Map();
|
|
151
|
+
for (const key of scopeToKeys) {
|
|
152
|
+
const entityInfo = entityArrayInfoByKey.get(key);
|
|
153
|
+
if (entityInfo) {
|
|
154
|
+
const partialArray = (Array.isArray(partialObj[key]) ? partialObj[key] : []);
|
|
155
|
+
entityNamesByKey.set(key, new Set(partialArray.map((item) => getEntityName(entityInfo.entityMeta, item))));
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
return diffSerializedDefinitions(schema, serializedDef, mergedDef, {
|
|
159
|
+
scopeToKeys,
|
|
160
|
+
entityNamesByKey,
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
//# sourceMappingURL=diff-definition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff-definition.js","sourceRoot":"","sources":["../../../src/tools/merge-schema/diff-definition.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { z } from 'zod';
|
|
2
|
+
import type { EntitySchemaMeta } from '#src/references/definition-ref-registry.js';
|
|
3
|
+
type PlainObject = Record<string, unknown>;
|
|
4
|
+
/**
|
|
5
|
+
* Returns the first EntitySchemaMeta found on the given schema or any inner
|
|
6
|
+
* schema reachable through wrappers (optional/nullable/default).
|
|
7
|
+
*/
|
|
8
|
+
export declare function getEntityMeta(schema: z.ZodType): EntitySchemaMeta | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Resolves the name of an entity from its serialized (name-based) data using
|
|
11
|
+
* the entity schema's name resolver.
|
|
12
|
+
*
|
|
13
|
+
* Since the data is already serialized, reference IDs are already names —
|
|
14
|
+
* no cross-entity resolution or toposort is needed.
|
|
15
|
+
*/
|
|
16
|
+
export declare function getEntityName(entityMeta: EntitySchemaMeta, item: PlainObject): string;
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=entity-utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-utils.d.ts","sourceRoot":"","sources":["../../../src/tools/merge-schema/entity-utils.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAE7B,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,4CAA4C,CAAC;AAKnF,KAAK,WAAW,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;AAE3C;;;GAGG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,GAAG,gBAAgB,GAAG,SAAS,CAY7E;AAED;;;;;;GAMG;AACH,wBAAgB,aAAa,CAC3B,UAAU,EAAE,gBAAgB,EAC5B,IAAI,EAAE,WAAW,GAChB,MAAM,CAgBR"}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { getSchemaChildren } from '#src/parser/schema-structure.js';
|
|
2
|
+
import { definitionRefRegistry } from '#src/references/definition-ref-registry.js';
|
|
3
|
+
/**
|
|
4
|
+
* Returns the first EntitySchemaMeta found on the given schema or any inner
|
|
5
|
+
* schema reachable through wrappers (optional/nullable/default).
|
|
6
|
+
*/
|
|
7
|
+
export function getEntityMeta(schema) {
|
|
8
|
+
const meta = definitionRefRegistry
|
|
9
|
+
.getAll(schema)
|
|
10
|
+
.find((m) => m.kind === 'entity');
|
|
11
|
+
if (meta) {
|
|
12
|
+
return meta;
|
|
13
|
+
}
|
|
14
|
+
const children = getSchemaChildren(schema, undefined, []);
|
|
15
|
+
if (children.kind === 'wrapper') {
|
|
16
|
+
return getEntityMeta(children.innerSchema);
|
|
17
|
+
}
|
|
18
|
+
return undefined;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Resolves the name of an entity from its serialized (name-based) data using
|
|
22
|
+
* the entity schema's name resolver.
|
|
23
|
+
*
|
|
24
|
+
* Since the data is already serialized, reference IDs are already names —
|
|
25
|
+
* no cross-entity resolution or toposort is needed.
|
|
26
|
+
*/
|
|
27
|
+
export function getEntityName(entityMeta, item) {
|
|
28
|
+
if (!entityMeta.getNameResolver) {
|
|
29
|
+
return item.name;
|
|
30
|
+
}
|
|
31
|
+
const resolver = entityMeta.getNameResolver(item);
|
|
32
|
+
if (typeof resolver === 'string') {
|
|
33
|
+
return resolver;
|
|
34
|
+
}
|
|
35
|
+
// In serialized data, reference IDs are already names — pass them through
|
|
36
|
+
const resolvedIds = Object.fromEntries(Object.entries(resolver.idsToResolve ?? {}).map(([key, idOrIds]) => [
|
|
37
|
+
key,
|
|
38
|
+
idOrIds,
|
|
39
|
+
]));
|
|
40
|
+
return resolver.resolveName(resolvedIds);
|
|
41
|
+
}
|
|
42
|
+
//# sourceMappingURL=entity-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"entity-utils.js","sourceRoot":"","sources":["../../../src/tools/merge-schema/entity-utils.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4CAA4C,CAAC;AAInF;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,MAAiB;IAC7C,MAAM,IAAI,GAAG,qBAAqB;SAC/B,MAAM,CAAC,MAAM,CAAC;SACd,IAAI,CAAC,CAAC,CAAC,EAAyB,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAC3D,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,IAAI,CAAC;IACd,CAAC;IACD,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;IAC1D,IAAI,QAAQ,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;QAChC,OAAO,aAAa,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IAC7C,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAC3B,UAA4B,EAC5B,IAAiB;IAEjB,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;QAChC,OAAO,IAAI,CAAC,IAAc,CAAC;IAC7B,CAAC;IACD,MAAM,QAAQ,GAAG,UAAU,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;IAClD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,OAAO,QAAQ,CAAC;IAClB,CAAC;IACD,0EAA0E;IAC1E,MAAM,WAAW,GAAG,MAAM,CAAC,WAAW,CACpC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;QAClE,GAAG;QACH,OAAO;KACR,CAAC,CACH,CAAC;IACF,OAAO,QAAQ,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;AAC3C,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export { diffDefinition, diffSerializedDefinitions, } from './diff-definition.js';
|
|
2
|
+
export type { DefinitionDiff, DefinitionDiffEntry, DiffSerializedDefinitionsOptions, } from './diff-definition.js';
|
|
3
|
+
export { getEntityName } from './entity-utils.js';
|
|
4
|
+
export { mergeDataWithSchema } from './merge-data-with-schema.js';
|
|
5
|
+
export { applyMergedDefinition, mergeDefinition, mergeDefinitionContainer, } from './merge-definition.js';
|
|
6
|
+
export { getMergeRule, withByKeyMergeRule, withMergeRule, } from './merge-rule-registry.js';
|
|
7
|
+
export type { MergeRule } from './merge-rule-registry.js';
|
|
8
|
+
export { collectEntityArrays } from './walk-schema.js';
|
|
9
|
+
export type { EntityArrayInfo } from './walk-schema.js';
|
|
10
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/tools/merge-schema/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EACV,cAAc,EACd,mBAAmB,EACnB,gCAAgC,GACjC,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,aAAa,GACd,MAAM,0BAA0B,CAAC;AAClC,YAAY,EAAE,SAAS,EAAE,MAAM,0BAA0B,CAAC;AAC1D,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,YAAY,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { diffDefinition, diffSerializedDefinitions, } from './diff-definition.js';
|
|
2
|
+
export { getEntityName } from './entity-utils.js';
|
|
3
|
+
export { mergeDataWithSchema } from './merge-data-with-schema.js';
|
|
4
|
+
export { applyMergedDefinition, mergeDefinition, mergeDefinitionContainer, } from './merge-definition.js';
|
|
5
|
+
export { getMergeRule, withByKeyMergeRule, withMergeRule, } from './merge-rule-registry.js';
|
|
6
|
+
export { collectEntityArrays } from './walk-schema.js';
|
|
7
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/merge-schema/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,cAAc,EACd,yBAAyB,GAC1B,MAAM,sBAAsB,CAAC;AAM9B,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAClD,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EACL,qBAAqB,EACrB,eAAe,EACf,wBAAwB,GACzB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EACL,YAAY,EACZ,kBAAkB,EAClB,aAAa,GACd,MAAM,0BAA0B,CAAC;AAElC,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { PartialDeep } from 'type-fest';
|
|
2
|
+
import type { z } from 'zod';
|
|
3
|
+
/**
|
|
4
|
+
* Merges two values according to the given Zod schema and any registered merge rules.
|
|
5
|
+
*
|
|
6
|
+
* Default behaviors:
|
|
7
|
+
* - Leaf scalar → desired replaces current
|
|
8
|
+
* - Object → merge fields recursively; `undefined` desired fields keep current value (partial patch)
|
|
9
|
+
* - Array whose element has `withEnt` annotation → merge by entity name (add-only, order-preserving)
|
|
10
|
+
* - Any other array → full replace with desired
|
|
11
|
+
* - Wrapper (optional/nullable/default) → descend to inner schema
|
|
12
|
+
* - Discriminated union → find matching branch by discriminator, merge
|
|
13
|
+
*
|
|
14
|
+
* Explicit rules from `withMergeRule` override the defaults:
|
|
15
|
+
* - `replace` → always return desired value
|
|
16
|
+
* - `by-key` → merge array by a custom key function (add-only)
|
|
17
|
+
*/
|
|
18
|
+
export declare function mergeDataWithSchema<T extends z.ZodType>(schema: T, current: z.input<T>, desired: PartialDeep<z.input<T>, {
|
|
19
|
+
recurseIntoArrays: true;
|
|
20
|
+
}>): z.input<T>;
|
|
21
|
+
//# sourceMappingURL=merge-data-with-schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-data-with-schema.d.ts","sourceRoot":"","sources":["../../../src/tools/merge-schema/merge-data-with-schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAc7B;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,mBAAmB,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EACrD,MAAM,EAAE,CAAC,EACT,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EACnB,OAAO,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;IAAE,iBAAiB,EAAE,IAAI,CAAA;CAAE,CAAC,GAC5D,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAEZ"}
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { toMerged } from 'es-toolkit';
|
|
2
|
+
import { getSchemaChildren } from '#src/parser/schema-structure.js';
|
|
3
|
+
import { assignEntityIds } from '../assign-entity-ids.js';
|
|
4
|
+
import { getEntityMeta, getEntityName } from './entity-utils.js';
|
|
5
|
+
import { getMergeRule } from './merge-rule-registry.js';
|
|
6
|
+
/**
|
|
7
|
+
* Merges two values according to the given Zod schema and any registered merge rules.
|
|
8
|
+
*
|
|
9
|
+
* Default behaviors:
|
|
10
|
+
* - Leaf scalar → desired replaces current
|
|
11
|
+
* - Object → merge fields recursively; `undefined` desired fields keep current value (partial patch)
|
|
12
|
+
* - Array whose element has `withEnt` annotation → merge by entity name (add-only, order-preserving)
|
|
13
|
+
* - Any other array → full replace with desired
|
|
14
|
+
* - Wrapper (optional/nullable/default) → descend to inner schema
|
|
15
|
+
* - Discriminated union → find matching branch by discriminator, merge
|
|
16
|
+
*
|
|
17
|
+
* Explicit rules from `withMergeRule` override the defaults:
|
|
18
|
+
* - `replace` → always return desired value
|
|
19
|
+
* - `by-key` → merge array by a custom key function (add-only)
|
|
20
|
+
*/
|
|
21
|
+
export function mergeDataWithSchema(schema, current, desired) {
|
|
22
|
+
return mergeDataWithSchemaInternal(schema, current, desired);
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Internal untyped implementation of the schema-driven merge walker.
|
|
26
|
+
*/
|
|
27
|
+
function mergeDataWithSchemaInternal(schema, current, desired) {
|
|
28
|
+
// If desired is undefined, always keep current (partial patch semantics)
|
|
29
|
+
if (desired === undefined) {
|
|
30
|
+
return current;
|
|
31
|
+
}
|
|
32
|
+
// Check for explicit merge rule registered via withMergeRule
|
|
33
|
+
const rule = getMergeRule(schema);
|
|
34
|
+
if (rule) {
|
|
35
|
+
switch (rule.kind) {
|
|
36
|
+
case 'replace': {
|
|
37
|
+
return desired;
|
|
38
|
+
}
|
|
39
|
+
case 'by-key': {
|
|
40
|
+
return mergeByKey(current, desired, rule.getKey);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
const children = getSchemaChildren(schema, desired, []);
|
|
45
|
+
switch (children.kind) {
|
|
46
|
+
case 'leaf':
|
|
47
|
+
case 'leaf-union': {
|
|
48
|
+
return desired;
|
|
49
|
+
}
|
|
50
|
+
case 'wrapper': {
|
|
51
|
+
return mergeDataWithSchemaInternal(children.innerSchema, current, desired);
|
|
52
|
+
}
|
|
53
|
+
case 'object': {
|
|
54
|
+
const currentObj = (current ?? {});
|
|
55
|
+
const desiredObj = desired;
|
|
56
|
+
const merged = { ...currentObj };
|
|
57
|
+
for (const [key, fieldSchema] of children.entries) {
|
|
58
|
+
const desiredValue = desiredObj[key];
|
|
59
|
+
if (desiredValue === undefined) {
|
|
60
|
+
// Keep current value — partial patch semantics
|
|
61
|
+
continue;
|
|
62
|
+
}
|
|
63
|
+
merged[key] = mergeDataWithSchemaInternal(fieldSchema, currentObj[key], desiredValue);
|
|
64
|
+
}
|
|
65
|
+
return merged;
|
|
66
|
+
}
|
|
67
|
+
case 'array': {
|
|
68
|
+
const { elementSchema } = children;
|
|
69
|
+
const entityMeta = getEntityMeta(elementSchema);
|
|
70
|
+
// Auto-detect entity arrays: merge by `name` field
|
|
71
|
+
if (entityMeta) {
|
|
72
|
+
return mergeEntityArray(current, desired, elementSchema, entityMeta);
|
|
73
|
+
}
|
|
74
|
+
// Default: full replace
|
|
75
|
+
return desired;
|
|
76
|
+
}
|
|
77
|
+
case 'discriminated-union': {
|
|
78
|
+
if (!children.match) {
|
|
79
|
+
// No matching branch found for desired — replace
|
|
80
|
+
return desired;
|
|
81
|
+
}
|
|
82
|
+
// If current matches a different branch, replace to avoid leaking stale fields
|
|
83
|
+
const currentChildren = getSchemaChildren(schema, current, []);
|
|
84
|
+
if (currentChildren.kind !== 'discriminated-union' ||
|
|
85
|
+
currentChildren.match !== children.match) {
|
|
86
|
+
return desired;
|
|
87
|
+
}
|
|
88
|
+
return mergeDataWithSchemaInternal(children.match, current, desired);
|
|
89
|
+
}
|
|
90
|
+
case 'tuple':
|
|
91
|
+
case 'record':
|
|
92
|
+
case 'intersection': {
|
|
93
|
+
// For these structural types, default to full replace
|
|
94
|
+
return desired;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Merges an array of entity objects by name (add-only, order-preserving).
|
|
100
|
+
*
|
|
101
|
+
* - Current items are kept in their original order
|
|
102
|
+
* - Matched items (by name) are merged recursively via schema
|
|
103
|
+
* - Current items not in desired are kept as-is
|
|
104
|
+
* - New desired items are appended at the end with fresh generated IDs
|
|
105
|
+
*/
|
|
106
|
+
function mergeEntityArray(current, desired, elementSchema, entityMeta) {
|
|
107
|
+
const currentItems = current ?? [];
|
|
108
|
+
const desiredByName = new Map(desired.map((item) => [getEntityName(entityMeta, item), item]));
|
|
109
|
+
const seen = new Set();
|
|
110
|
+
const result = [];
|
|
111
|
+
// Walk current items in order — merge matched, keep unmatched
|
|
112
|
+
for (const currentItem of currentItems) {
|
|
113
|
+
const name = getEntityName(entityMeta, currentItem);
|
|
114
|
+
const desiredItem = desiredByName.get(name);
|
|
115
|
+
if (desiredItem) {
|
|
116
|
+
result.push(mergeDataWithSchemaInternal(elementSchema, currentItem, desiredItem));
|
|
117
|
+
seen.add(name);
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
result.push(currentItem);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
// Append new desired items at the end, with fresh IDs
|
|
124
|
+
for (const desiredItem of desired) {
|
|
125
|
+
const name = getEntityName(entityMeta, desiredItem);
|
|
126
|
+
if (!seen.has(name)) {
|
|
127
|
+
const baseItem = assignEntityIds(elementSchema, desiredItem);
|
|
128
|
+
result.push(mergeDataWithSchemaInternal(elementSchema, {}, baseItem));
|
|
129
|
+
seen.add(name);
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
return result;
|
|
133
|
+
}
|
|
134
|
+
/**
|
|
135
|
+
* Merges an array by a custom key function (add-only).
|
|
136
|
+
*
|
|
137
|
+
* - Items in `desired` that match a `current` item (by key) are merged with `toMerged`
|
|
138
|
+
* - Items in `desired` not in `current` are appended
|
|
139
|
+
* - Items in `current` not in `desired` are kept (add-only semantics)
|
|
140
|
+
*/
|
|
141
|
+
function mergeByKey(current, desired, getKey) {
|
|
142
|
+
const currentItems = current ?? [];
|
|
143
|
+
const desiredByKey = new Map(desired.map((item) => [getKey(item), item]));
|
|
144
|
+
const seen = new Set();
|
|
145
|
+
const result = [];
|
|
146
|
+
// Walk current items in order — merge matched, keep unmatched
|
|
147
|
+
for (const currentItem of currentItems) {
|
|
148
|
+
const key = getKey(currentItem);
|
|
149
|
+
const desiredItem = desiredByKey.get(key);
|
|
150
|
+
if (desiredItem) {
|
|
151
|
+
result.push(toMerged(currentItem, desiredItem));
|
|
152
|
+
seen.add(key);
|
|
153
|
+
}
|
|
154
|
+
else {
|
|
155
|
+
result.push(currentItem);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
// Append new desired items (not in current) at the end
|
|
159
|
+
for (const desiredItem of desired) {
|
|
160
|
+
const key = getKey(desiredItem);
|
|
161
|
+
if (!seen.has(key)) {
|
|
162
|
+
result.push(desiredItem);
|
|
163
|
+
seen.add(key);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
return result;
|
|
167
|
+
}
|
|
168
|
+
//# sourceMappingURL=merge-data-with-schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"merge-data-with-schema.js","sourceRoot":"","sources":["../../../src/tools/merge-schema/merge-data-with-schema.ts"],"names":[],"mappings":"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"}
|