@vibesdotdev/config 0.0.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/README.md +85 -0
- package/SPEC.md +71 -0
- package/dist/adapters/cli/flags.d.ts +75 -0
- package/dist/adapters/cli/flags.d.ts.map +1 -0
- package/dist/adapters/cli/flags.js +221 -0
- package/dist/adapters/cli/flags.js.map +1 -0
- package/dist/adapters/cli/index.d.ts +12 -0
- package/dist/adapters/cli/index.d.ts.map +1 -0
- package/dist/adapters/cli/index.js +9 -0
- package/dist/adapters/cli/index.js.map +1 -0
- package/dist/adapters/cli/mappings.d.ts +17 -0
- package/dist/adapters/cli/mappings.d.ts.map +1 -0
- package/dist/adapters/cli/mappings.js +32 -0
- package/dist/adapters/cli/mappings.js.map +1 -0
- package/dist/adapters/cli/prompts.d.ts +28 -0
- package/dist/adapters/cli/prompts.d.ts.map +1 -0
- package/dist/adapters/cli/prompts.js +55 -0
- package/dist/adapters/cli/prompts.js.map +1 -0
- package/dist/adapters/cli/schemas/flags.schema.d.ts +8 -0
- package/dist/adapters/cli/schemas/flags.schema.d.ts.map +1 -0
- package/dist/adapters/cli/schemas/flags.schema.js +2 -0
- package/dist/adapters/cli/schemas/flags.schema.js.map +1 -0
- package/dist/adapters/cli/schemas/mappings.schema.d.ts +2 -0
- package/dist/adapters/cli/schemas/mappings.schema.d.ts.map +1 -0
- package/dist/adapters/cli/schemas/mappings.schema.js +2 -0
- package/dist/adapters/cli/schemas/mappings.schema.js.map +1 -0
- package/dist/adapters/cli/schemas/prompts.schema.d.ts +5 -0
- package/dist/adapters/cli/schemas/prompts.schema.d.ts.map +1 -0
- package/dist/adapters/cli/schemas/prompts.schema.js +2 -0
- package/dist/adapters/cli/schemas/prompts.schema.js.map +1 -0
- package/dist/adapters/cli/schemas/wizard.schema.d.ts +19 -0
- package/dist/adapters/cli/schemas/wizard.schema.d.ts.map +1 -0
- package/dist/adapters/cli/schemas/wizard.schema.js +2 -0
- package/dist/adapters/cli/schemas/wizard.schema.js.map +1 -0
- package/dist/adapters/cli/wizard.d.ts +33 -0
- package/dist/adapters/cli/wizard.d.ts.map +1 -0
- package/dist/adapters/cli/wizard.js +77 -0
- package/dist/adapters/cli/wizard.js.map +1 -0
- package/dist/browser/index.d.ts +7 -0
- package/dist/browser/index.d.ts.map +1 -0
- package/dist/browser/index.js +4 -0
- package/dist/browser/index.js.map +1 -0
- package/dist/cli/settings.descriptor.d.ts +9 -0
- package/dist/cli/settings.descriptor.d.ts.map +1 -0
- package/dist/cli/settings.descriptor.js +18 -0
- package/dist/cli/settings.descriptor.js.map +1 -0
- package/dist/cli/types.d.ts +57 -0
- package/dist/cli/types.d.ts.map +1 -0
- package/dist/cli/types.js +9 -0
- package/dist/cli/types.js.map +1 -0
- package/dist/client/index.d.ts +19 -0
- package/dist/client/index.d.ts.map +1 -0
- package/dist/client/index.js +145 -0
- package/dist/client/index.js.map +1 -0
- package/dist/client/storage.d.ts +48 -0
- package/dist/client/storage.d.ts.map +1 -0
- package/dist/client/storage.js +46 -0
- package/dist/client/storage.js.map +1 -0
- package/dist/collection/collection.d.ts +46 -0
- package/dist/collection/collection.d.ts.map +1 -0
- package/dist/collection/collection.js +93 -0
- package/dist/collection/collection.js.map +1 -0
- package/dist/collection/index.d.ts +6 -0
- package/dist/collection/index.d.ts.map +1 -0
- package/dist/collection/index.js +5 -0
- package/dist/collection/index.js.map +1 -0
- package/dist/common/index.d.ts +7 -0
- package/dist/common/index.d.ts.map +1 -0
- package/dist/common/index.js +4 -0
- package/dist/common/index.js.map +1 -0
- package/dist/config.context.descriptor.d.ts +21 -0
- package/dist/config.context.descriptor.d.ts.map +1 -0
- package/dist/config.context.descriptor.js +11 -0
- package/dist/config.context.descriptor.js.map +1 -0
- package/dist/config.plugin.d.ts +15 -0
- package/dist/config.plugin.d.ts.map +1 -0
- package/dist/config.plugin.js +166 -0
- package/dist/config.plugin.js.map +1 -0
- package/dist/crud/base-types.d.ts +10 -0
- package/dist/crud/base-types.d.ts.map +1 -0
- package/dist/crud/base-types.js +10 -0
- package/dist/crud/base-types.js.map +1 -0
- package/dist/crud/index.d.ts +4 -0
- package/dist/crud/index.d.ts.map +1 -0
- package/dist/crud/index.js +2 -0
- package/dist/crud/index.js.map +1 -0
- package/dist/crud/schemas/base-types.schema.d.ts +19 -0
- package/dist/crud/schemas/base-types.schema.d.ts.map +1 -0
- package/dist/crud/schemas/base-types.schema.js +2 -0
- package/dist/crud/schemas/base-types.schema.js.map +1 -0
- package/dist/crud/schemas/shared.schema.d.ts +13 -0
- package/dist/crud/schemas/shared.schema.d.ts.map +1 -0
- package/dist/crud/schemas/shared.schema.js +2 -0
- package/dist/crud/schemas/shared.schema.js.map +1 -0
- package/dist/crud/shared.d.ts +8 -0
- package/dist/crud/shared.d.ts.map +1 -0
- package/dist/crud/shared.js +8 -0
- package/dist/crud/shared.js.map +1 -0
- package/dist/crud/types.d.ts +250 -0
- package/dist/crud/types.d.ts.map +1 -0
- package/dist/crud/types.js +22 -0
- package/dist/crud/types.js.map +1 -0
- package/dist/docs/environment.docs.descriptor.d.ts +4 -0
- package/dist/docs/environment.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/environment.docs.descriptor.js +383 -0
- package/dist/docs/environment.docs.descriptor.js.map +1 -0
- package/dist/docs/manifests.docs.descriptor.d.ts +4 -0
- package/dist/docs/manifests.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/manifests.docs.descriptor.js +503 -0
- package/dist/docs/manifests.docs.descriptor.js.map +1 -0
- package/dist/docs/validation.docs.descriptor.d.ts +4 -0
- package/dist/docs/validation.docs.descriptor.d.ts.map +1 -0
- package/dist/docs/validation.docs.descriptor.js +441 -0
- package/dist/docs/validation.docs.descriptor.js.map +1 -0
- package/dist/doctor.d.ts +42 -0
- package/dist/doctor.d.ts.map +1 -0
- package/dist/doctor.js +119 -0
- package/dist/doctor.js.map +1 -0
- package/dist/env.d.ts +28 -0
- package/dist/env.d.ts.map +1 -0
- package/dist/env.js +75 -0
- package/dist/env.js.map +1 -0
- package/dist/env.runtime.d.ts +19 -0
- package/dist/env.runtime.d.ts.map +1 -0
- package/dist/env.runtime.js +37 -0
- package/dist/env.runtime.js.map +1 -0
- package/dist/environment/current.d.ts +32 -0
- package/dist/environment/current.d.ts.map +1 -0
- package/dist/environment/current.js +91 -0
- package/dist/environment/current.js.map +1 -0
- package/dist/environment/environment.config.descriptor.d.ts +11 -0
- package/dist/environment/environment.config.descriptor.d.ts.map +1 -0
- package/dist/environment/environment.config.descriptor.js +51 -0
- package/dist/environment/environment.config.descriptor.js.map +1 -0
- package/dist/environment/environment.config.schema.d.ts +47 -0
- package/dist/environment/environment.config.schema.d.ts.map +1 -0
- package/dist/environment/environment.config.schema.js +19 -0
- package/dist/environment/environment.config.schema.js.map +1 -0
- package/dist/environment/environment.local.descriptor.d.ts +11 -0
- package/dist/environment/environment.local.descriptor.d.ts.map +1 -0
- package/dist/environment/environment.local.descriptor.js +42 -0
- package/dist/environment/environment.local.descriptor.js.map +1 -0
- package/dist/environment/environment.plugin.d.ts +9 -0
- package/dist/environment/environment.plugin.d.ts.map +1 -0
- package/dist/environment/environment.plugin.js +27 -0
- package/dist/environment/environment.plugin.js.map +1 -0
- package/dist/environment/environment.production.descriptor.d.ts +10 -0
- package/dist/environment/environment.production.descriptor.d.ts.map +1 -0
- package/dist/environment/environment.production.descriptor.js +37 -0
- package/dist/environment/environment.production.descriptor.js.map +1 -0
- package/dist/environment/environment.staging.descriptor.d.ts +11 -0
- package/dist/environment/environment.staging.descriptor.d.ts.map +1 -0
- package/dist/environment/environment.staging.descriptor.js +22 -0
- package/dist/environment/environment.staging.descriptor.js.map +1 -0
- package/dist/environment/index.d.ts +8 -0
- package/dist/environment/index.d.ts.map +1 -0
- package/dist/environment/index.js +9 -0
- package/dist/environment/index.js.map +1 -0
- package/dist/environment/kinds/environment.default.d.ts +23 -0
- package/dist/environment/kinds/environment.default.d.ts.map +1 -0
- package/dist/environment/kinds/environment.default.js +49 -0
- package/dist/environment/kinds/environment.default.js.map +1 -0
- package/dist/environment/kinds/environment.interface.d.ts +7 -0
- package/dist/environment/kinds/environment.interface.d.ts.map +1 -0
- package/dist/environment/kinds/environment.interface.js +7 -0
- package/dist/environment/kinds/environment.interface.js.map +1 -0
- package/dist/environment/kinds/environment.kind.d.ts +10 -0
- package/dist/environment/kinds/environment.kind.d.ts.map +1 -0
- package/dist/environment/kinds/environment.kind.js +57 -0
- package/dist/environment/kinds/environment.kind.js.map +1 -0
- package/dist/environment/kinds/environment.schema.d.ts +34 -0
- package/dist/environment/kinds/environment.schema.d.ts.map +1 -0
- package/dist/environment/kinds/environment.schema.js +46 -0
- package/dist/environment/kinds/environment.schema.js.map +1 -0
- package/dist/environment/kinds/index.d.ts +8 -0
- package/dist/environment/kinds/index.d.ts.map +1 -0
- package/dist/environment/kinds/index.js +7 -0
- package/dist/environment/kinds/index.js.map +1 -0
- package/dist/environment/kinds/schemas/environment.interface.schema.d.ts +11 -0
- package/dist/environment/kinds/schemas/environment.interface.schema.d.ts.map +1 -0
- package/dist/environment/kinds/schemas/environment.interface.schema.js +2 -0
- package/dist/environment/kinds/schemas/environment.interface.schema.js.map +1 -0
- package/dist/environment/kinds/schemas/environment.schema.d.ts +30 -0
- package/dist/environment/kinds/schemas/environment.schema.d.ts.map +1 -0
- package/dist/environment/kinds/schemas/environment.schema.js +2 -0
- package/dist/environment/kinds/schemas/environment.schema.js.map +1 -0
- package/dist/environment/schemas/current.schema.d.ts +20 -0
- package/dist/environment/schemas/current.schema.d.ts.map +1 -0
- package/dist/environment/schemas/current.schema.js +2 -0
- package/dist/environment/schemas/current.schema.js.map +1 -0
- package/dist/environment/schemas/environment.config.schema.d.ts +4 -0
- package/dist/environment/schemas/environment.config.schema.d.ts.map +1 -0
- package/dist/environment/schemas/environment.config.schema.js +2 -0
- package/dist/environment/schemas/environment.config.schema.js.map +1 -0
- package/dist/extensions/index.d.ts +8 -0
- package/dist/extensions/index.d.ts.map +1 -0
- package/dist/extensions/index.js +8 -0
- package/dist/extensions/index.js.map +1 -0
- package/dist/extensions/registry.d.ts +41 -0
- package/dist/extensions/registry.d.ts.map +1 -0
- package/dist/extensions/registry.js +142 -0
- package/dist/extensions/registry.js.map +1 -0
- package/dist/extensions/types.d.ts +101 -0
- package/dist/extensions/types.d.ts.map +1 -0
- package/dist/extensions/types.js +8 -0
- package/dist/extensions/types.js.map +1 -0
- package/dist/form/core/field-resolver.d.ts +42 -0
- package/dist/form/core/field-resolver.d.ts.map +1 -0
- package/dist/form/core/field-resolver.js +293 -0
- package/dist/form/core/field-resolver.js.map +1 -0
- package/dist/form/core/groups.d.ts +20 -0
- package/dist/form/core/groups.d.ts.map +1 -0
- package/dist/form/core/groups.js +69 -0
- package/dist/form/core/groups.js.map +1 -0
- package/dist/form/core/index.d.ts +8 -0
- package/dist/form/core/index.d.ts.map +1 -0
- package/dist/form/core/index.js +6 -0
- package/dist/form/core/index.js.map +1 -0
- package/dist/form/core/nested-utils.d.ts +40 -0
- package/dist/form/core/nested-utils.d.ts.map +1 -0
- package/dist/form/core/nested-utils.js +98 -0
- package/dist/form/core/nested-utils.js.map +1 -0
- package/dist/form/core/schemas/validation.schema.d.ts +9 -0
- package/dist/form/core/schemas/validation.schema.d.ts.map +1 -0
- package/dist/form/core/schemas/validation.schema.js +2 -0
- package/dist/form/core/schemas/validation.schema.js.map +1 -0
- package/dist/form/core/types.d.ts +103 -0
- package/dist/form/core/types.d.ts.map +1 -0
- package/dist/form/core/types.js +2 -0
- package/dist/form/core/types.js.map +1 -0
- package/dist/form/core/validation.d.ts +23 -0
- package/dist/form/core/validation.d.ts.map +1 -0
- package/dist/form/core/validation.js +103 -0
- package/dist/form/core/validation.js.map +1 -0
- package/dist/form/core/visibility.d.ts +37 -0
- package/dist/form/core/visibility.d.ts.map +1 -0
- package/dist/form/core/visibility.js +128 -0
- package/dist/form/core/visibility.js.map +1 -0
- package/dist/form/index.d.ts +8 -0
- package/dist/form/index.d.ts.map +1 -0
- package/dist/form/index.js +2 -0
- package/dist/form/index.js.map +1 -0
- package/dist/index.d.ts +18 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/loader/cli/index.d.ts +61 -0
- package/dist/loader/cli/index.d.ts.map +1 -0
- package/dist/loader/cli/index.js +263 -0
- package/dist/loader/cli/index.js.map +1 -0
- package/dist/loader/cli/loaders.d.ts +13 -0
- package/dist/loader/cli/loaders.d.ts.map +1 -0
- package/dist/loader/cli/loaders.js +132 -0
- package/dist/loader/cli/loaders.js.map +1 -0
- package/dist/loader/cli/types.d.ts +152 -0
- package/dist/loader/cli/types.d.ts.map +1 -0
- package/dist/loader/cli/types.js +5 -0
- package/dist/loader/cli/types.js.map +1 -0
- package/dist/loader/cli/utils.d.ts +53 -0
- package/dist/loader/cli/utils.d.ts.map +1 -0
- package/dist/loader/cli/utils.js +198 -0
- package/dist/loader/cli/utils.js.map +1 -0
- package/dist/loader/client.d.ts +18 -0
- package/dist/loader/client.d.ts.map +1 -0
- package/dist/loader/client.js +109 -0
- package/dist/loader/client.js.map +1 -0
- package/dist/loader/discovery.d.ts +48 -0
- package/dist/loader/discovery.d.ts.map +1 -0
- package/dist/loader/discovery.js +253 -0
- package/dist/loader/discovery.js.map +1 -0
- package/dist/loader/file-loader.d.ts +17 -0
- package/dist/loader/file-loader.d.ts.map +1 -0
- package/dist/loader/file-loader.js +237 -0
- package/dist/loader/file-loader.js.map +1 -0
- package/dist/loader/index.d.ts +9 -0
- package/dist/loader/index.d.ts.map +1 -0
- package/dist/loader/index.js +8 -0
- package/dist/loader/index.js.map +1 -0
- package/dist/loader/index.server.d.ts +66 -0
- package/dist/loader/index.server.d.ts.map +1 -0
- package/dist/loader/index.server.js +256 -0
- package/dist/loader/index.server.js.map +1 -0
- package/dist/loader/merge.d.ts +88 -0
- package/dist/loader/merge.d.ts.map +1 -0
- package/dist/loader/merge.js +301 -0
- package/dist/loader/merge.js.map +1 -0
- package/dist/loader/schemas/merge.schema.d.ts +8 -0
- package/dist/loader/schemas/merge.schema.d.ts.map +1 -0
- package/dist/loader/schemas/merge.schema.js +2 -0
- package/dist/loader/schemas/merge.schema.js.map +1 -0
- package/dist/loader/schemas/validation.schema.d.ts +17 -0
- package/dist/loader/schemas/validation.schema.d.ts.map +1 -0
- package/dist/loader/schemas/validation.schema.js +2 -0
- package/dist/loader/schemas/validation.schema.js.map +1 -0
- package/dist/loader/server.d.ts +3 -0
- package/dist/loader/server.d.ts.map +1 -0
- package/dist/loader/server.js +2 -0
- package/dist/loader/server.js.map +1 -0
- package/dist/loader/types.d.ts +136 -0
- package/dist/loader/types.d.ts.map +1 -0
- package/dist/loader/types.js +24 -0
- package/dist/loader/types.js.map +1 -0
- package/dist/loader/validation.d.ts +59 -0
- package/dist/loader/validation.d.ts.map +1 -0
- package/dist/loader/validation.js +218 -0
- package/dist/loader/validation.js.map +1 -0
- package/dist/manifest/builder.d.ts +172 -0
- package/dist/manifest/builder.d.ts.map +1 -0
- package/dist/manifest/builder.js +336 -0
- package/dist/manifest/builder.js.map +1 -0
- package/dist/manifest/config-manifest.d.ts +199 -0
- package/dist/manifest/config-manifest.d.ts.map +1 -0
- package/dist/manifest/config-manifest.js +388 -0
- package/dist/manifest/config-manifest.js.map +1 -0
- package/dist/manifest/index.d.ts +10 -0
- package/dist/manifest/index.d.ts.map +1 -0
- package/dist/manifest/index.js +20 -0
- package/dist/manifest/index.js.map +1 -0
- package/dist/manifest/schema.d.ts +460 -0
- package/dist/manifest/schema.d.ts.map +1 -0
- package/dist/manifest/schema.js +187 -0
- package/dist/manifest/schema.js.map +1 -0
- package/dist/manifest/schemas/builder.schema.d.ts +20 -0
- package/dist/manifest/schemas/builder.schema.d.ts.map +1 -0
- package/dist/manifest/schemas/builder.schema.js +2 -0
- package/dist/manifest/schemas/builder.schema.js.map +1 -0
- package/dist/manifest/schemas/config-manifest.schema.d.ts +2 -0
- package/dist/manifest/schemas/config-manifest.schema.d.ts.map +1 -0
- package/dist/manifest/schemas/config-manifest.schema.js +2 -0
- package/dist/manifest/schemas/config-manifest.schema.js.map +1 -0
- package/dist/manifest/schemas/schema.schema.d.ts +83 -0
- package/dist/manifest/schemas/schema.schema.d.ts.map +1 -0
- package/dist/manifest/schemas/schema.schema.js +2 -0
- package/dist/manifest/schemas/schema.schema.js.map +1 -0
- package/dist/manifest/types.d.ts +563 -0
- package/dist/manifest/types.d.ts.map +1 -0
- package/dist/manifest/types.js +9 -0
- package/dist/manifest/types.js.map +1 -0
- package/dist/routing/index.d.ts +29 -0
- package/dist/routing/index.d.ts.map +1 -0
- package/dist/routing/index.js +35 -0
- package/dist/routing/index.js.map +1 -0
- package/dist/routing/merge.d.ts +164 -0
- package/dist/routing/merge.d.ts.map +1 -0
- package/dist/routing/merge.js +460 -0
- package/dist/routing/merge.js.map +1 -0
- package/dist/routing/registry.d.ts +145 -0
- package/dist/routing/registry.d.ts.map +1 -0
- package/dist/routing/registry.js +459 -0
- package/dist/routing/registry.js.map +1 -0
- package/dist/routing/schemas/merge.schema.d.ts +5 -0
- package/dist/routing/schemas/merge.schema.d.ts.map +1 -0
- package/dist/routing/schemas/merge.schema.js +2 -0
- package/dist/routing/schemas/merge.schema.js.map +1 -0
- package/dist/routing/types.d.ts +358 -0
- package/dist/routing/types.d.ts.map +1 -0
- package/dist/routing/types.js +89 -0
- package/dist/routing/types.js.map +1 -0
- package/dist/schema/extend-zod.d.ts +137 -0
- package/dist/schema/extend-zod.d.ts.map +1 -0
- package/dist/schema/extend-zod.js +243 -0
- package/dist/schema/extend-zod.js.map +1 -0
- package/dist/schema/index.d.ts +9 -0
- package/dist/schema/index.d.ts.map +1 -0
- package/dist/schema/index.js +10 -0
- package/dist/schema/index.js.map +1 -0
- package/dist/schema/references.d.ts +9 -0
- package/dist/schema/references.d.ts.map +1 -0
- package/dist/schema/references.js +9 -0
- package/dist/schema/references.js.map +1 -0
- package/dist/schema/resolver.d.ts +45 -0
- package/dist/schema/resolver.d.ts.map +1 -0
- package/dist/schema/resolver.js +267 -0
- package/dist/schema/resolver.js.map +1 -0
- package/dist/schema/schemas/extend-zod.schema.d.ts +16 -0
- package/dist/schema/schemas/extend-zod.schema.d.ts.map +1 -0
- package/dist/schema/schemas/extend-zod.schema.js +2 -0
- package/dist/schema/schemas/extend-zod.schema.js.map +1 -0
- package/dist/schema/schemas/references.schema.d.ts +70 -0
- package/dist/schema/schemas/references.schema.d.ts.map +1 -0
- package/dist/schema/schemas/references.schema.js +2 -0
- package/dist/schema/schemas/references.schema.js.map +1 -0
- package/dist/schemas/collection.d.ts +31 -0
- package/dist/schemas/collection.d.ts.map +1 -0
- package/dist/schemas/collection.js +22 -0
- package/dist/schemas/collection.js.map +1 -0
- package/dist/schemas/config-manifest-descriptor.d.ts +495 -0
- package/dist/schemas/config-manifest-descriptor.d.ts.map +1 -0
- package/dist/schemas/config-manifest-descriptor.js +210 -0
- package/dist/schemas/config-manifest-descriptor.js.map +1 -0
- package/dist/schemas/config-registry-state.d.ts +8 -0
- package/dist/schemas/config-registry-state.d.ts.map +1 -0
- package/dist/schemas/config-registry-state.js +6 -0
- package/dist/schemas/config-registry-state.js.map +1 -0
- package/dist/schemas/doctor.schema.d.ts +25 -0
- package/dist/schemas/doctor.schema.d.ts.map +1 -0
- package/dist/schemas/doctor.schema.js +2 -0
- package/dist/schemas/doctor.schema.js.map +1 -0
- package/dist/schemas/index.d.ts +8 -0
- package/dist/schemas/index.d.ts.map +1 -0
- package/dist/schemas/index.js +21 -0
- package/dist/schemas/index.js.map +1 -0
- package/dist/server/index.d.ts +5 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +4 -0
- package/dist/server/index.js.map +1 -0
- package/dist/services/config-accessor.d.ts +40 -0
- package/dist/services/config-accessor.d.ts.map +1 -0
- package/dist/services/config-accessor.js +180 -0
- package/dist/services/config-accessor.js.map +1 -0
- package/dist/services/config-storage/index.d.ts +8 -0
- package/dist/services/config-storage/index.d.ts.map +1 -0
- package/dist/services/config-storage/index.js +7 -0
- package/dist/services/config-storage/index.js.map +1 -0
- package/dist/services/config-storage/service.d.ts +63 -0
- package/dist/services/config-storage/service.d.ts.map +1 -0
- package/dist/services/config-storage/service.js +234 -0
- package/dist/services/config-storage/service.js.map +1 -0
- package/dist/services/config.d.ts +3 -0
- package/dist/services/config.d.ts.map +1 -0
- package/dist/services/config.js +30 -0
- package/dist/services/config.js.map +1 -0
- package/dist/services/encryption.d.ts +114 -0
- package/dist/services/encryption.d.ts.map +1 -0
- package/dist/services/encryption.js +232 -0
- package/dist/services/encryption.js.map +1 -0
- package/dist/services/index.d.ts +12 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +16 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/loader/loader.descriptor.d.ts +103 -0
- package/dist/services/loader/loader.descriptor.d.ts.map +1 -0
- package/dist/services/loader/loader.descriptor.js +60 -0
- package/dist/services/loader/loader.descriptor.js.map +1 -0
- package/dist/services/loader/loader.impl.cloud.d.ts +55 -0
- package/dist/services/loader/loader.impl.cloud.d.ts.map +1 -0
- package/dist/services/loader/loader.impl.cloud.js +182 -0
- package/dist/services/loader/loader.impl.cloud.js.map +1 -0
- package/dist/services/loader/loader.impl.consumer.d.ts +48 -0
- package/dist/services/loader/loader.impl.consumer.d.ts.map +1 -0
- package/dist/services/loader/loader.impl.consumer.js +175 -0
- package/dist/services/loader/loader.impl.consumer.js.map +1 -0
- package/dist/services/loader/loader.impl.consumer.local-first.d.ts +59 -0
- package/dist/services/loader/loader.impl.consumer.local-first.d.ts.map +1 -0
- package/dist/services/loader/loader.impl.consumer.local-first.js +347 -0
- package/dist/services/loader/loader.impl.consumer.local-first.js.map +1 -0
- package/dist/services/manifest-utils.d.ts +47 -0
- package/dist/services/manifest-utils.d.ts.map +1 -0
- package/dist/services/manifest-utils.js +105 -0
- package/dist/services/manifest-utils.js.map +1 -0
- package/dist/services/schemas/config-accessor.schema.d.ts +10 -0
- package/dist/services/schemas/config-accessor.schema.d.ts.map +1 -0
- package/dist/services/schemas/config-accessor.schema.js +2 -0
- package/dist/services/schemas/config-accessor.schema.js.map +1 -0
- package/dist/services/schemas/encryption.schema.d.ts +22 -0
- package/dist/services/schemas/encryption.schema.d.ts.map +1 -0
- package/dist/services/schemas/encryption.schema.js +2 -0
- package/dist/services/schemas/encryption.schema.js.map +1 -0
- package/dist/services/schemas/manifest-utils.schema.d.ts +4 -0
- package/dist/services/schemas/manifest-utils.schema.d.ts.map +1 -0
- package/dist/services/schemas/manifest-utils.schema.js +2 -0
- package/dist/services/schemas/manifest-utils.schema.js.map +1 -0
- package/dist/settings/assemble.d.ts +28 -0
- package/dist/settings/assemble.d.ts.map +1 -0
- package/dist/settings/assemble.js +30 -0
- package/dist/settings/assemble.js.map +1 -0
- package/dist/settings/index.d.ts +10 -0
- package/dist/settings/index.d.ts.map +1 -0
- package/dist/settings/index.js +10 -0
- package/dist/settings/index.js.map +1 -0
- package/dist/settings/settings-section.schema.d.ts +49 -0
- package/dist/settings/settings-section.schema.d.ts.map +1 -0
- package/dist/settings/settings-section.schema.js +70 -0
- package/dist/settings/settings-section.schema.js.map +1 -0
- package/dist/storage/adapter.d.ts +11 -0
- package/dist/storage/adapter.d.ts.map +1 -0
- package/dist/storage/adapter.js +8 -0
- package/dist/storage/adapter.js.map +1 -0
- package/dist/storage/index.d.ts +8 -0
- package/dist/storage/index.d.ts.map +1 -0
- package/dist/storage/index.js +8 -0
- package/dist/storage/index.js.map +1 -0
- package/dist/storage/schemas.d.ts +257 -0
- package/dist/storage/schemas.d.ts.map +1 -0
- package/dist/storage/schemas.js +179 -0
- package/dist/storage/schemas.js.map +1 -0
- package/dist/storage/types.d.ts +74 -0
- package/dist/storage/types.d.ts.map +1 -0
- package/dist/storage/types.js +7 -0
- package/dist/storage/types.js.map +1 -0
- package/dist/system-constants.d.ts +95 -0
- package/dist/system-constants.d.ts.map +1 -0
- package/dist/system-constants.js +110 -0
- package/dist/system-constants.js.map +1 -0
- package/package.json +417 -0
- package/src/adapters/cli/flags.ts +260 -0
- package/src/adapters/cli/index.ts +24 -0
- package/src/adapters/cli/mappings.ts +43 -0
- package/src/adapters/cli/prompts.ts +70 -0
- package/src/adapters/cli/schemas/flags.schema.ts +8 -0
- package/src/adapters/cli/schemas/mappings.schema.ts +3 -0
- package/src/adapters/cli/schemas/prompts.schema.ts +4 -0
- package/src/adapters/cli/schemas/wizard.schema.ts +21 -0
- package/src/adapters/cli/wizard.ts +106 -0
- package/src/adapters/web/components/ManifestForm.svelte +817 -0
- package/src/browser/index.ts +86 -0
- package/src/cli/settings.descriptor.ts +23 -0
- package/src/cli/types.ts +59 -0
- package/src/client/index.ts +169 -0
- package/src/client/storage.ts +76 -0
- package/src/collection/collection.ts +121 -0
- package/src/collection/index.ts +6 -0
- package/src/common/index.ts +86 -0
- package/src/config.context.descriptor.ts +12 -0
- package/src/config.plugin.ts +214 -0
- package/src/crud/base-types.ts +10 -0
- package/src/crud/index.ts +15 -0
- package/src/crud/schemas/base-types.schema.ts +20 -0
- package/src/crud/schemas/shared.schema.ts +14 -0
- package/src/crud/shared.ts +8 -0
- package/src/crud/types.ts +299 -0
- package/src/docs/environment.docs.descriptor.ts +385 -0
- package/src/docs/manifests.docs.descriptor.ts +505 -0
- package/src/docs/validation.docs.descriptor.ts +443 -0
- package/src/doctor.ts +143 -0
- package/src/env.runtime.ts +49 -0
- package/src/env.ts +91 -0
- package/src/environment/current.ts +108 -0
- package/src/environment/environment.config.descriptor.ts +60 -0
- package/src/environment/environment.config.schema.ts +24 -0
- package/src/environment/environment.local.descriptor.ts +45 -0
- package/src/environment/environment.plugin.ts +31 -0
- package/src/environment/environment.production.descriptor.ts +40 -0
- package/src/environment/environment.staging.descriptor.ts +25 -0
- package/src/environment/index.ts +22 -0
- package/src/environment/kinds/environment.default.ts +57 -0
- package/src/environment/kinds/environment.interface.ts +10 -0
- package/src/environment/kinds/environment.kind.ts +69 -0
- package/src/environment/kinds/environment.schema.ts +57 -0
- package/src/environment/kinds/index.ts +8 -0
- package/src/environment/kinds/schemas/environment.interface.schema.ts +11 -0
- package/src/environment/kinds/schemas/environment.schema.ts +24 -0
- package/src/environment/schemas/current.schema.ts +21 -0
- package/src/environment/schemas/environment.config.schema.ts +3 -0
- package/src/extensions/index.ts +26 -0
- package/src/extensions/registry.ts +179 -0
- package/src/extensions/types.ts +123 -0
- package/src/form/core/field-resolver.ts +380 -0
- package/src/form/core/groups.ts +96 -0
- package/src/form/core/index.ts +41 -0
- package/src/form/core/nested-utils.ts +115 -0
- package/src/form/core/schemas/validation.schema.ts +9 -0
- package/src/form/core/types.ts +115 -0
- package/src/form/core/validation.ts +137 -0
- package/src/form/core/visibility.ts +172 -0
- package/src/form/index.ts +36 -0
- package/src/index.ts +69 -0
- package/src/js-yaml.d.ts +4 -0
- package/src/loader/cli/index.ts +386 -0
- package/src/loader/cli/loaders.ts +153 -0
- package/src/loader/cli/types.ts +181 -0
- package/src/loader/cli/utils.ts +236 -0
- package/src/loader/client.ts +140 -0
- package/src/loader/discovery.ts +291 -0
- package/src/loader/file-loader.ts +262 -0
- package/src/loader/index.server.ts +389 -0
- package/src/loader/index.ts +18 -0
- package/src/loader/merge.ts +366 -0
- package/src/loader/schemas/merge.schema.ts +8 -0
- package/src/loader/schemas/validation.schema.ts +18 -0
- package/src/loader/server.ts +15 -0
- package/src/loader/types.ts +142 -0
- package/src/loader/validation.ts +261 -0
- package/src/manifest/builder.ts +452 -0
- package/src/manifest/config-manifest.ts +482 -0
- package/src/manifest/index.ts +92 -0
- package/src/manifest/schema.ts +249 -0
- package/src/manifest/schemas/builder.schema.ts +33 -0
- package/src/manifest/schemas/config-manifest.schema.ts +1 -0
- package/src/manifest/schemas/schema.schema.ts +99 -0
- package/src/manifest/types.ts +726 -0
- package/src/routing/index.ts +105 -0
- package/src/routing/merge.ts +589 -0
- package/src/routing/registry.ts +595 -0
- package/src/routing/schemas/merge.schema.ts +6 -0
- package/src/routing/types.ts +470 -0
- package/src/schema/extend-zod.ts +289 -0
- package/src/schema/index.ts +44 -0
- package/src/schema/references.ts +21 -0
- package/src/schema/resolver.ts +343 -0
- package/src/schema/schemas/extend-zod.schema.ts +16 -0
- package/src/schema/schemas/references.schema.ts +86 -0
- package/src/schemas/collection.ts +38 -0
- package/src/schemas/config-manifest-descriptor.ts +259 -0
- package/src/schemas/config-registry-state.ts +13 -0
- package/src/schemas/doctor.schema.ts +27 -0
- package/src/schemas/index.ts +53 -0
- package/src/server/index.ts +4 -0
- package/src/services/config-accessor.ts +218 -0
- package/src/services/config-storage/index.ts +8 -0
- package/src/services/config-storage/service.ts +355 -0
- package/src/services/config.ts +37 -0
- package/src/services/encryption.ts +260 -0
- package/src/services/index.ts +34 -0
- package/src/services/loader/loader.descriptor.ts +96 -0
- package/src/services/loader/loader.impl.cloud.ts +214 -0
- package/src/services/loader/loader.impl.consumer.local-first.ts +417 -0
- package/src/services/loader/loader.impl.consumer.ts +213 -0
- package/src/services/manifest-utils.ts +119 -0
- package/src/services/schemas/config-accessor.schema.ts +11 -0
- package/src/services/schemas/encryption.schema.ts +23 -0
- package/src/services/schemas/manifest-utils.schema.ts +4 -0
- package/src/settings/assemble.ts +46 -0
- package/src/settings/index.ts +19 -0
- package/src/settings/settings-section.schema.ts +84 -0
- package/src/storage/adapter.ts +12 -0
- package/src/storage/index.ts +48 -0
- package/src/storage/schemas.ts +215 -0
- package/src/storage/types.ts +88 -0
- package/src/system-constants.ts +121 -0
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Merge Utilities
|
|
3
|
+
*
|
|
4
|
+
* Deep merge configs with priority handling.
|
|
5
|
+
* Higher priority sources override lower priority ones.
|
|
6
|
+
*
|
|
7
|
+
* Supports graceful validation where invalid fields are discarded
|
|
8
|
+
* per-source, allowing valid fields from lower-priority sources
|
|
9
|
+
* to fill in gaps.
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import type { z } from 'zod/v4';
|
|
13
|
+
import { type LoadedConfigSource, CONFIG_PRIORITIES } from './types.ts';
|
|
14
|
+
import {
|
|
15
|
+
validateGracefully,
|
|
16
|
+
formatValidationIssues,
|
|
17
|
+
type FieldValidationIssue
|
|
18
|
+
} from './validation.ts';
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Check if value is a plain object (not array, null, Date, etc.)
|
|
22
|
+
*/
|
|
23
|
+
function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
24
|
+
if (typeof value !== 'object' || value === null) return false;
|
|
25
|
+
if (Array.isArray(value)) return false;
|
|
26
|
+
if (value instanceof Date) return false;
|
|
27
|
+
if (value instanceof RegExp) return false;
|
|
28
|
+
if (value instanceof Map || value instanceof Set) return false;
|
|
29
|
+
return Object.getPrototypeOf(value) === Object.prototype;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Deep merge two objects
|
|
34
|
+
* Source values override target values.
|
|
35
|
+
* Both plain objects are merged recursively.
|
|
36
|
+
* Arrays are replaced, not merged.
|
|
37
|
+
*/
|
|
38
|
+
export function deepMerge<T extends Record<string, unknown>>(target: T, source: Partial<T>): T {
|
|
39
|
+
const result = { ...target };
|
|
40
|
+
|
|
41
|
+
for (const key in source) {
|
|
42
|
+
const sourceValue = source[key];
|
|
43
|
+
const targetValue = result[key];
|
|
44
|
+
|
|
45
|
+
if (sourceValue === undefined) {
|
|
46
|
+
continue;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// Both are plain objects - merge recursively
|
|
50
|
+
if (isPlainObject(sourceValue) && isPlainObject(targetValue)) {
|
|
51
|
+
result[key] = deepMerge(
|
|
52
|
+
targetValue as Record<string, unknown>,
|
|
53
|
+
sourceValue as Record<string, unknown>
|
|
54
|
+
) as T[Extract<keyof T, string>];
|
|
55
|
+
} else {
|
|
56
|
+
// Override with source value
|
|
57
|
+
result[key] = sourceValue as T[Extract<keyof T, string>];
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* Merge multiple config sources in priority order
|
|
66
|
+
*
|
|
67
|
+
* Sources with lower priority are merged first, so higher priority
|
|
68
|
+
* sources override them.
|
|
69
|
+
*
|
|
70
|
+
* @param sources - Array of loaded config sources
|
|
71
|
+
* @returns Merged config object
|
|
72
|
+
*/
|
|
73
|
+
export function mergeConfigSources<T extends Record<string, unknown>>(
|
|
74
|
+
sources: LoadedConfigSource<T>[]
|
|
75
|
+
): T {
|
|
76
|
+
// Sort by priority (lowest first)
|
|
77
|
+
const sorted = [...sources]
|
|
78
|
+
.filter((s) => s.loaded && s.data !== null && s.data !== undefined)
|
|
79
|
+
.sort((a, b) => a.priority - b.priority);
|
|
80
|
+
|
|
81
|
+
if (sorted.length === 0) {
|
|
82
|
+
return {} as T;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
// Start with empty object and merge each source
|
|
86
|
+
let result = {} as T;
|
|
87
|
+
for (const source of sorted) {
|
|
88
|
+
if (isPlainObject(source.data)) {
|
|
89
|
+
result = deepMerge(result, source.data as Partial<T>);
|
|
90
|
+
} else {
|
|
91
|
+
// Non-object data - just use it directly
|
|
92
|
+
result = source.data;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
return result;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
/**
|
|
100
|
+
* Merge configs for record-type manifests
|
|
101
|
+
*
|
|
102
|
+
* For record manifests, we merge by record ID.
|
|
103
|
+
* Later sources can override or add records.
|
|
104
|
+
*/
|
|
105
|
+
export function mergeRecordConfigs<T extends { id: string }>(
|
|
106
|
+
sources: LoadedConfigSource<Record<string, T> | T[]>[]
|
|
107
|
+
): Record<string, T> {
|
|
108
|
+
const sorted = [...sources]
|
|
109
|
+
.filter((s) => s.loaded && s.data !== null && s.data !== undefined)
|
|
110
|
+
.sort((a, b) => a.priority - b.priority);
|
|
111
|
+
|
|
112
|
+
const result: Record<string, T> = {};
|
|
113
|
+
|
|
114
|
+
for (const source of sorted) {
|
|
115
|
+
const data = source.data;
|
|
116
|
+
|
|
117
|
+
if (Array.isArray(data)) {
|
|
118
|
+
// Array of records - merge by ID
|
|
119
|
+
for (const record of data) {
|
|
120
|
+
if (record && typeof record === 'object' && 'id' in record) {
|
|
121
|
+
const existing = result[record.id];
|
|
122
|
+
if (existing && isPlainObject(existing) && isPlainObject(record)) {
|
|
123
|
+
result[record.id] = deepMerge(existing, record) as T;
|
|
124
|
+
} else {
|
|
125
|
+
result[record.id] = record;
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
} else if (isPlainObject(data)) {
|
|
130
|
+
// Object keyed by ID
|
|
131
|
+
for (const [id, record] of Object.entries(data)) {
|
|
132
|
+
if (record && typeof record === 'object') {
|
|
133
|
+
const existing = result[id];
|
|
134
|
+
if (existing && isPlainObject(existing) && isPlainObject(record)) {
|
|
135
|
+
result[id] = deepMerge(existing, record as Partial<T>) as T;
|
|
136
|
+
} else {
|
|
137
|
+
result[id] = { ...record, id } as T;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return result;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Create a defaults source from schema defaults or provided defaults
|
|
149
|
+
* Accepts Partial<T> since defaults don't need to be complete
|
|
150
|
+
*/
|
|
151
|
+
export function createDefaultsSource<T>(defaults: Partial<T>): LoadedConfigSource<T> {
|
|
152
|
+
return {
|
|
153
|
+
source: 'defaults',
|
|
154
|
+
scope: 'defaults',
|
|
155
|
+
priority: CONFIG_PRIORITIES.DEFAULTS,
|
|
156
|
+
data: defaults as T, // Defaults are merged with other sources
|
|
157
|
+
loaded: true
|
|
158
|
+
};
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Create a storage source from adapter data
|
|
163
|
+
*/
|
|
164
|
+
export function createStorageSource<T>(data: T | null): LoadedConfigSource<T> | null {
|
|
165
|
+
if (data === null || data === undefined) {
|
|
166
|
+
return null;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return {
|
|
170
|
+
source: 'storage',
|
|
171
|
+
scope: 'storage',
|
|
172
|
+
priority: CONFIG_PRIORITIES.STORAGE,
|
|
173
|
+
data,
|
|
174
|
+
loaded: true
|
|
175
|
+
};
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
// Validated Merge Functions
|
|
179
|
+
|
|
180
|
+
import type { ValidatedMergeResult } from './schemas/merge.schema.ts';
|
|
181
|
+
|
|
182
|
+
export type { ValidatedMergeResult } from './schemas/merge.schema.ts';
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* Merge config sources with per-field validation.
|
|
186
|
+
*
|
|
187
|
+
* Each source's data is validated field-by-field against the schema.
|
|
188
|
+
* Invalid fields are discarded, allowing valid fields from lower-priority
|
|
189
|
+
* sources to be used instead.
|
|
190
|
+
*
|
|
191
|
+
* @example
|
|
192
|
+
* ```ts
|
|
193
|
+
* // Project config has invalid toolApprovalMode
|
|
194
|
+
* const projectSource = { data: { name: 'Dev', toolApprovalMode: 'invalid' }, priority: 3 };
|
|
195
|
+
* // User config has valid toolApprovalMode
|
|
196
|
+
* const userSource = { data: { toolApprovalMode: 'auto-approve-safe' }, priority: 1 };
|
|
197
|
+
*
|
|
198
|
+
* const result = mergeConfigSourcesWithValidation([projectSource, userSource], schema);
|
|
199
|
+
* // result.data = { name: 'Dev', toolApprovalMode: 'auto-approve-safe' }
|
|
200
|
+
* // result.issues = Map { 'project' => [{ path: ['toolApprovalMode'], ... }] }
|
|
201
|
+
* ```
|
|
202
|
+
*/
|
|
203
|
+
export function mergeConfigSourcesWithValidation<T extends Record<string, unknown>>(
|
|
204
|
+
sources: LoadedConfigSource<T>[],
|
|
205
|
+
schema: z.ZodType<T>,
|
|
206
|
+
options?: {
|
|
207
|
+
/** Whether to log validation issues */
|
|
208
|
+
logIssues?: boolean;
|
|
209
|
+
/** Custom logger */
|
|
210
|
+
logger?: (message: string) => void;
|
|
211
|
+
}
|
|
212
|
+
): ValidatedMergeResult<T> {
|
|
213
|
+
const { logIssues = false, logger = console.warn } = options ?? {};
|
|
214
|
+
|
|
215
|
+
// Sort by priority (lowest first - will be overridden by higher)
|
|
216
|
+
const sorted = [...sources]
|
|
217
|
+
.filter((s) => s.loaded && s.data !== null && s.data !== undefined)
|
|
218
|
+
.sort((a, b) => a.priority - b.priority);
|
|
219
|
+
|
|
220
|
+
if (sorted.length === 0) {
|
|
221
|
+
return {
|
|
222
|
+
data: {} as T,
|
|
223
|
+
issues: new Map(),
|
|
224
|
+
hasIssues: false,
|
|
225
|
+
contributingSources: []
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
const allIssues = new Map<string, FieldValidationIssue[]>();
|
|
230
|
+
const contributingSources: string[] = [];
|
|
231
|
+
|
|
232
|
+
// Validate and merge each source
|
|
233
|
+
let result = {} as T;
|
|
234
|
+
for (const source of sorted) {
|
|
235
|
+
if (!isPlainObject(source.data)) {
|
|
236
|
+
// Non-object data - validate whole thing
|
|
237
|
+
const validation = validateGracefully(schema, source.data);
|
|
238
|
+
if (validation.hasIssues) {
|
|
239
|
+
allIssues.set(source.source, validation.issues);
|
|
240
|
+
if (logIssues) {
|
|
241
|
+
logger(formatValidationIssues(validation.issues, source.source));
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
if (Object.keys(validation.valid).length > 0) {
|
|
245
|
+
result = validation.valid as T;
|
|
246
|
+
contributingSources.push(source.source);
|
|
247
|
+
}
|
|
248
|
+
continue;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
// Validate per-field
|
|
252
|
+
const validation = validateGracefully(schema, source.data);
|
|
253
|
+
|
|
254
|
+
if (validation.hasIssues) {
|
|
255
|
+
allIssues.set(source.source, validation.issues);
|
|
256
|
+
if (logIssues) {
|
|
257
|
+
logger(formatValidationIssues(validation.issues, source.source));
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// Merge valid fields (higher priority overrides lower)
|
|
262
|
+
if (Object.keys(validation.valid).length > 0) {
|
|
263
|
+
result = deepMerge(result, validation.valid as Partial<T>);
|
|
264
|
+
contributingSources.push(source.source);
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
return {
|
|
269
|
+
data: result,
|
|
270
|
+
issues: allIssues,
|
|
271
|
+
hasIssues: allIssues.size > 0,
|
|
272
|
+
contributingSources
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Merge record configs with per-record, per-field validation.
|
|
278
|
+
*
|
|
279
|
+
* Each record in each source is validated field-by-field.
|
|
280
|
+
* Invalid fields are discarded, allowing valid fields from
|
|
281
|
+
* lower-priority sources to fill in.
|
|
282
|
+
*/
|
|
283
|
+
export function mergeRecordConfigsWithValidation<T extends { id: string }>(
|
|
284
|
+
sources: LoadedConfigSource<Record<string, T> | T[]>[],
|
|
285
|
+
recordSchema: z.ZodType<T>,
|
|
286
|
+
options?: {
|
|
287
|
+
logIssues?: boolean;
|
|
288
|
+
logger?: (message: string) => void;
|
|
289
|
+
}
|
|
290
|
+
): ValidatedMergeResult<Record<string, T>> {
|
|
291
|
+
const { logIssues = false, logger = console.warn } = options ?? {};
|
|
292
|
+
|
|
293
|
+
const sorted = [...sources]
|
|
294
|
+
.filter((s) => s.loaded && s.data !== null && s.data !== undefined)
|
|
295
|
+
.sort((a, b) => a.priority - b.priority);
|
|
296
|
+
|
|
297
|
+
const result: Record<string, Partial<T>> = {};
|
|
298
|
+
const allIssues = new Map<string, FieldValidationIssue[]>();
|
|
299
|
+
const contributingSources: string[] = [];
|
|
300
|
+
|
|
301
|
+
for (const source of sorted) {
|
|
302
|
+
const data = source.data;
|
|
303
|
+
const sourceIssues: FieldValidationIssue[] = [];
|
|
304
|
+
let contributed = false;
|
|
305
|
+
|
|
306
|
+
// Normalize to record format
|
|
307
|
+
let records: Record<string, unknown>;
|
|
308
|
+
if (Array.isArray(data)) {
|
|
309
|
+
records = {};
|
|
310
|
+
for (const item of data) {
|
|
311
|
+
if (item && typeof item === 'object' && 'id' in item) {
|
|
312
|
+
records[(item as { id: string }).id] = item;
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
} else if (isPlainObject(data)) {
|
|
316
|
+
records = data;
|
|
317
|
+
} else {
|
|
318
|
+
continue;
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
// Validate and merge each record
|
|
322
|
+
for (const [id, record] of Object.entries(records)) {
|
|
323
|
+
if (!record || typeof record !== 'object') continue;
|
|
324
|
+
|
|
325
|
+
const validation = validateGracefully(recordSchema, record);
|
|
326
|
+
|
|
327
|
+
if (validation.hasIssues) {
|
|
328
|
+
// Prefix issues with record ID
|
|
329
|
+
sourceIssues.push(
|
|
330
|
+
...validation.issues.map((issue) => ({
|
|
331
|
+
...issue,
|
|
332
|
+
path: [id, ...issue.path]
|
|
333
|
+
}))
|
|
334
|
+
);
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
// Merge valid fields into this record
|
|
338
|
+
if (Object.keys(validation.valid).length > 0) {
|
|
339
|
+
const existing = result[id] ?? {};
|
|
340
|
+
result[id] = deepMerge(
|
|
341
|
+
existing as Record<string, unknown>,
|
|
342
|
+
{ ...validation.valid, id } as Record<string, unknown>
|
|
343
|
+
) as Partial<T>;
|
|
344
|
+
contributed = true;
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
|
|
348
|
+
if (sourceIssues.length > 0) {
|
|
349
|
+
allIssues.set(source.source, sourceIssues);
|
|
350
|
+
if (logIssues) {
|
|
351
|
+
logger(formatValidationIssues(sourceIssues, source.source));
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
if (contributed) {
|
|
356
|
+
contributingSources.push(source.source);
|
|
357
|
+
}
|
|
358
|
+
}
|
|
359
|
+
|
|
360
|
+
return {
|
|
361
|
+
data: result as Record<string, T>,
|
|
362
|
+
issues: allIssues,
|
|
363
|
+
hasIssues: allIssues.size > 0,
|
|
364
|
+
contributingSources
|
|
365
|
+
};
|
|
366
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export interface FieldValidationIssue {
|
|
2
|
+
path: (string | number)[];
|
|
3
|
+
message: string;
|
|
4
|
+
invalidValue?: unknown;
|
|
5
|
+
expected?: string;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
export interface FieldValidationResult<T> {
|
|
9
|
+
valid: Partial<T>;
|
|
10
|
+
issues: FieldValidationIssue[];
|
|
11
|
+
hasIssues: boolean;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface RecordValidationResult<T> {
|
|
15
|
+
valid: Record<string, Partial<T>>;
|
|
16
|
+
issues: Map<string, FieldValidationIssue[]>;
|
|
17
|
+
hasIssues: boolean;
|
|
18
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export type {
|
|
2
|
+
ConfigLoadResult as ServerConfigLoadResult,
|
|
3
|
+
DiscoveredConfigFile,
|
|
4
|
+
DiscoveryOptions,
|
|
5
|
+
LoadOptions as ServerLoadOptions,
|
|
6
|
+
LoadedConfigSource as ServerLoadedConfigSource
|
|
7
|
+
} from './index.server.ts';
|
|
8
|
+
export {
|
|
9
|
+
loadConfigFromManifest as serverLoadConfigFromManifest,
|
|
10
|
+
loadRecordConfigFromManifest as serverLoadRecordConfigFromManifest,
|
|
11
|
+
hasConfigFiles,
|
|
12
|
+
getConfigLoadDebugInfo,
|
|
13
|
+
discoverConfigFiles,
|
|
14
|
+
loadConfigFromPath
|
|
15
|
+
} from './index.server.ts';
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config File Loader Types
|
|
3
|
+
*
|
|
4
|
+
* Types for the multi-source config file loading system.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { ConfigManifest } from '../manifest/types.ts';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Supported config file formats
|
|
11
|
+
*/
|
|
12
|
+
export type ConfigFileFormat = 'ts' | 'js' | 'json' | 'jsonc' | 'yaml';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Config file scope (determines search paths)
|
|
16
|
+
*/
|
|
17
|
+
export type ConfigFileScope = 'global' | 'local' | 'project';
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Priority levels for config sources
|
|
21
|
+
* Higher number = higher priority (wins in merge)
|
|
22
|
+
*/
|
|
23
|
+
export const CONFIG_PRIORITIES = {
|
|
24
|
+
/** Schema defaults */
|
|
25
|
+
DEFAULTS: 0,
|
|
26
|
+
/** Global: ~/.vibes/{namespace}.* */
|
|
27
|
+
GLOBAL: 1,
|
|
28
|
+
/** Local: ./.vibes/{namespace}.* */
|
|
29
|
+
LOCAL: 2,
|
|
30
|
+
/** Project: ./vibes.{namespace}.* */
|
|
31
|
+
PROJECT: 3,
|
|
32
|
+
/** Storage adapter (localdb/json) - user edits */
|
|
33
|
+
STORAGE: 4,
|
|
34
|
+
/** CLI overrides */
|
|
35
|
+
CLI: 5
|
|
36
|
+
} as const;
|
|
37
|
+
|
|
38
|
+
export type ConfigPriority = (typeof CONFIG_PRIORITIES)[keyof typeof CONFIG_PRIORITIES];
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* A discovered config file
|
|
42
|
+
*/
|
|
43
|
+
export interface DiscoveredConfigFile {
|
|
44
|
+
/** Absolute path to the file */
|
|
45
|
+
path: string;
|
|
46
|
+
/** File format */
|
|
47
|
+
format: ConfigFileFormat;
|
|
48
|
+
/** Scope this file belongs to */
|
|
49
|
+
scope: ConfigFileScope;
|
|
50
|
+
/** Priority for merging */
|
|
51
|
+
priority: ConfigPriority;
|
|
52
|
+
/** Whether the file exists */
|
|
53
|
+
exists: boolean;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* A loaded config source
|
|
58
|
+
*/
|
|
59
|
+
export interface LoadedConfigSource<T = unknown> {
|
|
60
|
+
/** Source identifier (file path or 'storage' or 'defaults') */
|
|
61
|
+
source: string;
|
|
62
|
+
/** Scope */
|
|
63
|
+
scope: ConfigFileScope | 'storage' | 'defaults';
|
|
64
|
+
/** Priority used for merging */
|
|
65
|
+
priority: ConfigPriority;
|
|
66
|
+
/** The loaded data */
|
|
67
|
+
data: T;
|
|
68
|
+
/** Format that was loaded */
|
|
69
|
+
format?: ConfigFileFormat;
|
|
70
|
+
/** Whether this source was successfully loaded */
|
|
71
|
+
loaded: boolean;
|
|
72
|
+
/** Error if loading failed */
|
|
73
|
+
error?: string;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* Result of loading config from all sources
|
|
78
|
+
*/
|
|
79
|
+
export interface ConfigLoadResult<T = unknown> {
|
|
80
|
+
/** Merged configuration data */
|
|
81
|
+
data: T;
|
|
82
|
+
/** All sources that were checked/loaded */
|
|
83
|
+
sources: LoadedConfigSource<T>[];
|
|
84
|
+
/** Sources that were successfully loaded and merged */
|
|
85
|
+
mergedSources: LoadedConfigSource<T>[];
|
|
86
|
+
/** Whether any file sources were found */
|
|
87
|
+
hasFileSources: boolean;
|
|
88
|
+
/** Whether storage had data */
|
|
89
|
+
hasStorageData: boolean;
|
|
90
|
+
/** Validation issues found when using graceful validation (by source) */
|
|
91
|
+
validationIssues?: Map<string, { path: (string | number)[]; message: string }[]>;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Options for discovering config files
|
|
96
|
+
*/
|
|
97
|
+
export interface DiscoveryOptions {
|
|
98
|
+
/** Namespace for the config (e.g., 'autoloop', 'ai', 'pm') */
|
|
99
|
+
namespace: string;
|
|
100
|
+
/** Scopes to search */
|
|
101
|
+
scopes?: ConfigFileScope[];
|
|
102
|
+
/** Custom patterns to search (in addition to defaults) */
|
|
103
|
+
patterns?: string[];
|
|
104
|
+
/** Fallback patterns if primary not found */
|
|
105
|
+
fallbackPatterns?: string[];
|
|
106
|
+
/** Working directory (defaults to process.cwd()) */
|
|
107
|
+
cwd?: string;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Options for loading config
|
|
112
|
+
*/
|
|
113
|
+
export interface LoadOptions<T = unknown> {
|
|
114
|
+
/** The manifest to load config for */
|
|
115
|
+
manifest: ConfigManifest;
|
|
116
|
+
/** Working directory */
|
|
117
|
+
cwd?: string;
|
|
118
|
+
/** Whether to include storage adapter data */
|
|
119
|
+
includeStorage?: boolean;
|
|
120
|
+
/** Whether to include defaults */
|
|
121
|
+
includeDefaults?: boolean;
|
|
122
|
+
/** Custom default values */
|
|
123
|
+
defaults?: Partial<T>;
|
|
124
|
+
/** Storage adapter to use (if not using manifest's storage config) */
|
|
125
|
+
storageAdapter?: {
|
|
126
|
+
load(): Promise<T | null>;
|
|
127
|
+
};
|
|
128
|
+
/**
|
|
129
|
+
* Enable graceful per-field validation.
|
|
130
|
+
* Invalid fields are discarded instead of failing the entire load.
|
|
131
|
+
* This allows valid fields from lower-priority sources to fill in.
|
|
132
|
+
*/
|
|
133
|
+
validateGracefully?: boolean;
|
|
134
|
+
/**
|
|
135
|
+
* Callback when validation issues are found.
|
|
136
|
+
* Called with the source name and list of issues.
|
|
137
|
+
*/
|
|
138
|
+
onValidationIssues?: (
|
|
139
|
+
source: string,
|
|
140
|
+
issues: { path: (string | number)[]; message: string }[]
|
|
141
|
+
) => void;
|
|
142
|
+
}
|