@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,443 @@
|
|
|
1
|
+
import type { DocsTopicDescriptor } from '@vibesdotdev/docs';
|
|
2
|
+
|
|
3
|
+
const descriptor: DocsTopicDescriptor = {
|
|
4
|
+
kind: 'docs/topic',
|
|
5
|
+
id: 'config.validation',
|
|
6
|
+
title: 'Configuration Validation',
|
|
7
|
+
summary: 'Schema validation, error handling, and defaults',
|
|
8
|
+
body: {
|
|
9
|
+
type: 'markdown',
|
|
10
|
+
sourceType: 'raw',
|
|
11
|
+
source: `---
|
|
12
|
+
title: Configuration Validation
|
|
13
|
+
summary: Schema validation, error handling, and defaults
|
|
14
|
+
tags: [config, validation, schema, errors, defaults]
|
|
15
|
+
parent: config
|
|
16
|
+
order: 3
|
|
17
|
+
surfaces: [cli, web, in-app]
|
|
18
|
+
hardware: [consumer, cloud]
|
|
19
|
+
---
|
|
20
|
+
|
|
21
|
+
# Configuration Validation
|
|
22
|
+
|
|
23
|
+
Configuration validation ensures config data meets schema requirements, provides helpful error messages, and applies sensible defaults. The config system uses Zod schemas for type-safe validation.
|
|
24
|
+
|
|
25
|
+
## Schema Validation
|
|
26
|
+
|
|
27
|
+
### Zod Schema Basics
|
|
28
|
+
|
|
29
|
+
\`\`\`ts
|
|
30
|
+
import { z } from 'zod';
|
|
31
|
+
|
|
32
|
+
const configSchema = z.object({
|
|
33
|
+
// Required string
|
|
34
|
+
apiKey: z.string().min(1),
|
|
35
|
+
|
|
36
|
+
// Number with range
|
|
37
|
+
port: z.number().min(1).max(65535),
|
|
38
|
+
|
|
39
|
+
// Enum type
|
|
40
|
+
environment: z.enum(['development', 'production']),
|
|
41
|
+
|
|
42
|
+
// Optional with default
|
|
43
|
+
timeout: z.number().default(5000),
|
|
44
|
+
|
|
45
|
+
// Array of strings
|
|
46
|
+
allowedOrigins: z.array(z.string().url()),
|
|
47
|
+
|
|
48
|
+
// Nested object
|
|
49
|
+
database: z.object({
|
|
50
|
+
host: z.string(),
|
|
51
|
+
port: z.number(),
|
|
52
|
+
name: z.string()
|
|
53
|
+
})
|
|
54
|
+
});
|
|
55
|
+
\`\`\`
|
|
56
|
+
|
|
57
|
+
### Parsing Configuration
|
|
58
|
+
|
|
59
|
+
\`\`\`ts
|
|
60
|
+
import { z } from 'zod';
|
|
61
|
+
|
|
62
|
+
const configSchema = z.object({
|
|
63
|
+
apiKey: z.string().min(1),
|
|
64
|
+
port: z.number().default(3000)
|
|
65
|
+
});
|
|
66
|
+
|
|
67
|
+
const rawConfig = {
|
|
68
|
+
apiKey: '<api-key>',
|
|
69
|
+
port: '3000' // string, will be coerced
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
try {
|
|
73
|
+
const config = configSchema.parse(rawConfig);
|
|
74
|
+
console.log(config); // { apiKey: '<api-key>', port: 3000 }
|
|
75
|
+
} catch (error) {
|
|
76
|
+
if (error instanceof z.ZodError) {
|
|
77
|
+
console.error(error.errors);
|
|
78
|
+
// [
|
|
79
|
+
// {
|
|
80
|
+
// path: ['apiKey'],
|
|
81
|
+
// message: 'Required',
|
|
82
|
+
// code: 'invalid_type'
|
|
83
|
+
// }
|
|
84
|
+
// ]
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
\`\`\`
|
|
88
|
+
|
|
89
|
+
### Type Coercion
|
|
90
|
+
|
|
91
|
+
\`\`\`ts
|
|
92
|
+
const configSchema = z.object({
|
|
93
|
+
// Coerce string to number
|
|
94
|
+
port: z.coerce.number().default(3000),
|
|
95
|
+
|
|
96
|
+
// Coerce string to boolean
|
|
97
|
+
debug: z.coerce.boolean().default(false),
|
|
98
|
+
|
|
99
|
+
// Coerce string to date
|
|
100
|
+
createdAt: z.coerce.date()
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
const rawConfig = {
|
|
104
|
+
port: '3000',
|
|
105
|
+
debug: 'true',
|
|
106
|
+
createdAt: '2024-01-01'
|
|
107
|
+
};
|
|
108
|
+
|
|
109
|
+
const config = configSchema.parse(rawConfig);
|
|
110
|
+
// { port: 3000, debug: true, createdAt: Date }
|
|
111
|
+
\`\`\`
|
|
112
|
+
|
|
113
|
+
## Validation Errors
|
|
114
|
+
|
|
115
|
+
### Error Format
|
|
116
|
+
|
|
117
|
+
\`\`\`ts
|
|
118
|
+
interface ValidationError {
|
|
119
|
+
code: string; // 'invalid_type', 'too_small', etc.
|
|
120
|
+
path: string[]; // ['database', 'host']
|
|
121
|
+
message: string; // 'Required'
|
|
122
|
+
expected?: string; // 'string'
|
|
123
|
+
received?: string; // 'undefined'
|
|
124
|
+
}
|
|
125
|
+
\`\`\`
|
|
126
|
+
|
|
127
|
+
### Error Handling
|
|
128
|
+
|
|
129
|
+
\`\`\`ts
|
|
130
|
+
import { validateConfig } from '@vibesdotdev/config';
|
|
131
|
+
|
|
132
|
+
const result = validateConfig(configSchema, rawData);
|
|
133
|
+
|
|
134
|
+
if (!result.success) {
|
|
135
|
+
console.error('Validation failed:');
|
|
136
|
+
for (const error of result.errors) {
|
|
137
|
+
console.error(\` \${error.path.join('.')}: \${error.message}\`);
|
|
138
|
+
}
|
|
139
|
+
} else {
|
|
140
|
+
console.log('Config valid:', result.data);
|
|
141
|
+
}
|
|
142
|
+
\`\`\`
|
|
143
|
+
|
|
144
|
+
### Custom Error Messages
|
|
145
|
+
|
|
146
|
+
\`\`\`ts
|
|
147
|
+
const configSchema = z.object({
|
|
148
|
+
email: z.string().email('Must be a valid email address'),
|
|
149
|
+
password: z
|
|
150
|
+
.string()
|
|
151
|
+
.min(8, 'Password must be at least 8 characters')
|
|
152
|
+
.regex(/[A-Z]/, 'Password must contain uppercase letter')
|
|
153
|
+
.regex(/[0-9]/, 'Password must contain number'),
|
|
154
|
+
age: z.number().min(18, 'Must be 18 or older')
|
|
155
|
+
});
|
|
156
|
+
\`\`\`
|
|
157
|
+
|
|
158
|
+
### Error Formatting
|
|
159
|
+
|
|
160
|
+
\`\`\`ts
|
|
161
|
+
import { formatValidationErrors } from '@vibesdotdev/config';
|
|
162
|
+
|
|
163
|
+
try {
|
|
164
|
+
configSchema.parse(rawData);
|
|
165
|
+
} catch (error) {
|
|
166
|
+
if (error instanceof z.ZodError) {
|
|
167
|
+
const formatted = formatValidationErrors(error);
|
|
168
|
+
console.log(formatted);
|
|
169
|
+
// {
|
|
170
|
+
// fieldErrors: {
|
|
171
|
+
// email: ['Must be a valid email address'],
|
|
172
|
+
// password: ['Password must be at least 8 characters']
|
|
173
|
+
// },
|
|
174
|
+
// rootErrors: []
|
|
175
|
+
// }
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
\`\`\`
|
|
179
|
+
|
|
180
|
+
## Default Values
|
|
181
|
+
|
|
182
|
+
### Schema Defaults
|
|
183
|
+
|
|
184
|
+
\`\`\`ts
|
|
185
|
+
const configSchema = z.object({
|
|
186
|
+
// Simple default
|
|
187
|
+
debug: z.boolean().default(false),
|
|
188
|
+
|
|
189
|
+
// Default with transform
|
|
190
|
+
tags: z.string().transform((s) => s.split(',')).default(''),
|
|
191
|
+
|
|
192
|
+
// Default object
|
|
193
|
+
settings: z.object({
|
|
194
|
+
theme: z.enum(['light', 'dark']).default('system'),
|
|
195
|
+
notifications: z.boolean().default(true)
|
|
196
|
+
}).default({})
|
|
197
|
+
});
|
|
198
|
+
\`\`\`
|
|
199
|
+
|
|
200
|
+
### Context-Aware Defaults
|
|
201
|
+
|
|
202
|
+
\`\`\`ts
|
|
203
|
+
import { applyDefaults } from '@vibesdotdev/config';
|
|
204
|
+
|
|
205
|
+
const configSchema = z.object({
|
|
206
|
+
apiUrl: z.string(),
|
|
207
|
+
timeout: z.number()
|
|
208
|
+
});
|
|
209
|
+
|
|
210
|
+
const defaults = {
|
|
211
|
+
apiUrl: {
|
|
212
|
+
type: 'context',
|
|
213
|
+
rules: [
|
|
214
|
+
{
|
|
215
|
+
when: { environment: 'development' },
|
|
216
|
+
value: 'http://localhost:3000'
|
|
217
|
+
},
|
|
218
|
+
{
|
|
219
|
+
when: { environment: 'production' },
|
|
220
|
+
value: 'https://api.vibes.dev'
|
|
221
|
+
}
|
|
222
|
+
]
|
|
223
|
+
},
|
|
224
|
+
timeout: {
|
|
225
|
+
type: 'context',
|
|
226
|
+
rules: [
|
|
227
|
+
{
|
|
228
|
+
when: { hardware: 'consumer' },
|
|
229
|
+
value: 30000
|
|
230
|
+
},
|
|
231
|
+
{
|
|
232
|
+
when: { hardware: 'cloud' },
|
|
233
|
+
value: 10000
|
|
234
|
+
}
|
|
235
|
+
]
|
|
236
|
+
}
|
|
237
|
+
};
|
|
238
|
+
|
|
239
|
+
const config = applyDefaults(configSchema, rawData, {
|
|
240
|
+
environment: 'production',
|
|
241
|
+
hardware: 'cloud'
|
|
242
|
+
});
|
|
243
|
+
\`\`\`
|
|
244
|
+
|
|
245
|
+
### Lazy Defaults
|
|
246
|
+
|
|
247
|
+
\`\`\`ts
|
|
248
|
+
const configSchema = z.object({
|
|
249
|
+
// Default from environment variable
|
|
250
|
+
apiKey: z.string().default(() => process.env.API_KEY),
|
|
251
|
+
|
|
252
|
+
// Default from function
|
|
253
|
+
timestamp: z.number().default(() => Date.now()),
|
|
254
|
+
|
|
255
|
+
// Default from async function
|
|
256
|
+
version: z.string().default(async () => {
|
|
257
|
+
const pkg = await import('../package.json');
|
|
258
|
+
return pkg.version;
|
|
259
|
+
})
|
|
260
|
+
});
|
|
261
|
+
\`\`\`
|
|
262
|
+
|
|
263
|
+
## Custom Validation
|
|
264
|
+
|
|
265
|
+
### Refine Validation
|
|
266
|
+
|
|
267
|
+
\`\`\`ts
|
|
268
|
+
const configSchema = z.object({
|
|
269
|
+
password: z.string(),
|
|
270
|
+
confirmPassword: z.string()
|
|
271
|
+
}).refine(
|
|
272
|
+
(data) => data.password === data.confirmPassword,
|
|
273
|
+
{
|
|
274
|
+
message: 'Passwords do not match',
|
|
275
|
+
path: ['confirmPassword']
|
|
276
|
+
}
|
|
277
|
+
);
|
|
278
|
+
\`\`\`
|
|
279
|
+
|
|
280
|
+
### Async Validation
|
|
281
|
+
|
|
282
|
+
\`\`\`ts
|
|
283
|
+
const configSchema = z.object({
|
|
284
|
+
apiKey: z.string()
|
|
285
|
+
}).refineAsync(
|
|
286
|
+
async (data) => {
|
|
287
|
+
// Validate API key with remote service
|
|
288
|
+
const response = await fetch('https://api.example.com/validate', {
|
|
289
|
+
headers: { Authorization: \`Bearer \${data.apiKey}\` }
|
|
290
|
+
});
|
|
291
|
+
return response.ok;
|
|
292
|
+
},
|
|
293
|
+
{
|
|
294
|
+
message: 'Invalid API key',
|
|
295
|
+
path: ['apiKey']
|
|
296
|
+
}
|
|
297
|
+
);
|
|
298
|
+
\`\`\`
|
|
299
|
+
|
|
300
|
+
### Transform Validation
|
|
301
|
+
|
|
302
|
+
\`\`\`ts
|
|
303
|
+
const configSchema = z.object({
|
|
304
|
+
// Trim and lowercase email
|
|
305
|
+
email: z.string().transform((s) => s.trim().toLowerCase()),
|
|
306
|
+
|
|
307
|
+
// Parse JSON string
|
|
308
|
+
metadata: z.string().transform((s) => JSON.parse(s)),
|
|
309
|
+
|
|
310
|
+
// Validate and transform
|
|
311
|
+
port: z.string().transform((s) => {
|
|
312
|
+
const port = parseInt(s, 10);
|
|
313
|
+
if (port < 1 || port > 65535) {
|
|
314
|
+
throw new Error('Invalid port number');
|
|
315
|
+
}
|
|
316
|
+
return port;
|
|
317
|
+
})
|
|
318
|
+
});
|
|
319
|
+
\`\`\`
|
|
320
|
+
|
|
321
|
+
## Validation Strategies
|
|
322
|
+
|
|
323
|
+
### Strict Validation
|
|
324
|
+
|
|
325
|
+
\`\`\`ts
|
|
326
|
+
const configSchema = z.object({
|
|
327
|
+
apiKey: z.string()
|
|
328
|
+
}).strict(); // Reject unknown keys
|
|
329
|
+
|
|
330
|
+
try {
|
|
331
|
+
configSchema.parse({ apiKey: '<api-key>', unknown: 'value' });
|
|
332
|
+
} catch (error) {
|
|
333
|
+
console.error(error); // Unrecognized key 'unknown'
|
|
334
|
+
}
|
|
335
|
+
\`\`\`
|
|
336
|
+
|
|
337
|
+
### Passthrough Validation
|
|
338
|
+
|
|
339
|
+
\`\`\`ts
|
|
340
|
+
const configSchema = z.object({
|
|
341
|
+
apiKey: z.string()
|
|
342
|
+
}).passthrough(); // Allow unknown keys
|
|
343
|
+
|
|
344
|
+
const config = configSchema.parse({
|
|
345
|
+
apiKey: '<api-key>',
|
|
346
|
+
unknown: 'value' // preserved
|
|
347
|
+
});
|
|
348
|
+
\`\`\`
|
|
349
|
+
|
|
350
|
+
### Partial Validation
|
|
351
|
+
|
|
352
|
+
\`\`\`ts
|
|
353
|
+
const configSchema = z.object({
|
|
354
|
+
apiKey: z.string(),
|
|
355
|
+
port: z.number()
|
|
356
|
+
}).partial(); // All fields optional
|
|
357
|
+
|
|
358
|
+
const config = configSchema.parse({});
|
|
359
|
+
// {}
|
|
360
|
+
\`\`\`
|
|
361
|
+
|
|
362
|
+
## Validation Utilities
|
|
363
|
+
|
|
364
|
+
### Deep Merge
|
|
365
|
+
|
|
366
|
+
\`\`\`ts
|
|
367
|
+
import { deepMerge } from '@vibesdotdev/config';
|
|
368
|
+
|
|
369
|
+
const defaults = {
|
|
370
|
+
database: {
|
|
371
|
+
host: 'localhost',
|
|
372
|
+
port: 5432
|
|
373
|
+
}
|
|
374
|
+
};
|
|
375
|
+
|
|
376
|
+
const overrides = {
|
|
377
|
+
database: {
|
|
378
|
+
host: 'db.example.com'
|
|
379
|
+
}
|
|
380
|
+
};
|
|
381
|
+
|
|
382
|
+
const merged = deepMerge(defaults, overrides);
|
|
383
|
+
// { database: { host: 'db.example.com', port: 5432 } }
|
|
384
|
+
\`\`\`
|
|
385
|
+
|
|
386
|
+
### Flatten Errors
|
|
387
|
+
|
|
388
|
+
\`\`\`ts
|
|
389
|
+
import { flattenErrors } from '@vibesdotdev/config';
|
|
390
|
+
|
|
391
|
+
const zodError = new z.ZodError([...]);
|
|
392
|
+
const flat = flattenErrors(zodError);
|
|
393
|
+
|
|
394
|
+
console.log(flat);
|
|
395
|
+
// {
|
|
396
|
+
// 'database.host': ['Required'],
|
|
397
|
+
// 'database.port': ['Must be a number']
|
|
398
|
+
// }
|
|
399
|
+
\`\`\`
|
|
400
|
+
|
|
401
|
+
### Validate Against Schema
|
|
402
|
+
|
|
403
|
+
\`\`\`ts
|
|
404
|
+
import { validateAgainstSchema } from '@vibesdotdev/config';
|
|
405
|
+
|
|
406
|
+
const result = validateAgainstSchema(configSchema, rawData, {
|
|
407
|
+
strict: true,
|
|
408
|
+
applyDefaults: true,
|
|
409
|
+
context: { environment: 'production' }
|
|
410
|
+
});
|
|
411
|
+
|
|
412
|
+
if (result.success) {
|
|
413
|
+
console.log(result.data); // Validated config with defaults
|
|
414
|
+
} else {
|
|
415
|
+
console.error(result.errors);
|
|
416
|
+
}
|
|
417
|
+
\`\`\`
|
|
418
|
+
|
|
419
|
+
## Best Practices
|
|
420
|
+
|
|
421
|
+
1. **Use specific schemas** — Avoid \`z.any()\` or \`z.unknown()\`
|
|
422
|
+
2. **Provide helpful error messages** — Guide users to fix issues
|
|
423
|
+
3. **Apply sensible defaults** — Reduce required configuration
|
|
424
|
+
4. **Validate early** — Fail fast on invalid config
|
|
425
|
+
5. **Use context-aware defaults** — Different values per environment
|
|
426
|
+
6. **Document required fields** — Clear what must be provided
|
|
427
|
+
|
|
428
|
+
:::card{title="See also"}
|
|
429
|
+
- [\`config.manifests\`](config.manifests) — Configuration manifests
|
|
430
|
+
- [\`config.environment\`](config.environment) — Environment variables
|
|
431
|
+
- [\`storage.manifests\`](storage.manifests) — Storage manifests
|
|
432
|
+
:::
|
|
433
|
+
`
|
|
434
|
+
},
|
|
435
|
+
parent: 'config',
|
|
436
|
+
order: 3,
|
|
437
|
+
tags: ['config', 'validation', 'schema', 'errors', 'defaults'],
|
|
438
|
+
surfaces: ['cli', 'web', 'in-app'],
|
|
439
|
+
hardware: ['consumer', 'cloud'],
|
|
440
|
+
enabled: true
|
|
441
|
+
};
|
|
442
|
+
|
|
443
|
+
export default descriptor;
|
package/src/doctor.ts
ADDED
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config Doctor
|
|
3
|
+
*
|
|
4
|
+
* Generic diagnostic functions for validating configuration state.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import type { ConfigManifest } from './manifest/types';
|
|
8
|
+
import type { ConfigCollection } from './collection/collection';
|
|
9
|
+
|
|
10
|
+
import type { DiagnosticIssue, DetailedDiagnostic, DiagnoseConfigOptions } from './schemas/doctor.schema.ts';
|
|
11
|
+
|
|
12
|
+
export type { DiagnosticSeverity, DiagnosticIssue, DetailedDiagnostic, DiagnoseConfigOptions } from './schemas/doctor.schema.ts';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Generic diagnostic function for any ConfigManifest.
|
|
16
|
+
*
|
|
17
|
+
* Validates:
|
|
18
|
+
* - Required fields are present
|
|
19
|
+
* - Values match schema constraints
|
|
20
|
+
* - No deprecated settings (optional)
|
|
21
|
+
* - Custom validation rules
|
|
22
|
+
*
|
|
23
|
+
* @param manifest - The ConfigManifest to diagnose
|
|
24
|
+
* @param values - The current configuration values
|
|
25
|
+
* @param options - Diagnostic options
|
|
26
|
+
* @returns Detailed diagnostic result
|
|
27
|
+
*
|
|
28
|
+
* @example
|
|
29
|
+
* ```typescript
|
|
30
|
+
* const result = diagnoseConfig(myManifest, currentValues);
|
|
31
|
+
* if (!result.ready) {
|
|
32
|
+
* console.error('Config errors:', result.issues.filter(i => i.severity === 'error'));
|
|
33
|
+
* }
|
|
34
|
+
* ```
|
|
35
|
+
*/
|
|
36
|
+
export function diagnoseConfig<T extends ConfigManifest>(
|
|
37
|
+
manifest: T,
|
|
38
|
+
values: Record<string, unknown>,
|
|
39
|
+
options: DiagnoseConfigOptions = {}
|
|
40
|
+
): DetailedDiagnostic {
|
|
41
|
+
const issues: DiagnosticIssue[] = [];
|
|
42
|
+
const { checkDeprecated = false } = options;
|
|
43
|
+
|
|
44
|
+
// Check all fields from manifest
|
|
45
|
+
for (const [fieldKey, fieldMeta] of Object.entries(manifest.fields)) {
|
|
46
|
+
const value = getValueAtPath(values, fieldKey);
|
|
47
|
+
|
|
48
|
+
// Check required fields (fields without defaults)
|
|
49
|
+
// Empty string and null count as missing
|
|
50
|
+
const hasValue = value !== undefined && value !== null && value !== '';
|
|
51
|
+
if (fieldMeta.defaults?.base === undefined && !hasValue) {
|
|
52
|
+
issues.push({
|
|
53
|
+
path: fieldKey,
|
|
54
|
+
message: `Required field '${fieldMeta.ui.label || fieldKey}' is missing`,
|
|
55
|
+
severity: 'error',
|
|
56
|
+
code: 'required_field_missing'
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
// Check deprecated fields
|
|
61
|
+
if (checkDeprecated && fieldMeta.tags?.includes('deprecated')) {
|
|
62
|
+
if (value !== undefined && value !== null) {
|
|
63
|
+
issues.push({
|
|
64
|
+
path: fieldKey,
|
|
65
|
+
message: `Field '${fieldMeta.ui.label || fieldKey}' is deprecated and should be removed`,
|
|
66
|
+
severity: 'warning',
|
|
67
|
+
code: 'deprecated_field_used'
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Run custom validators
|
|
74
|
+
if (options.customValidators) {
|
|
75
|
+
for (const { path, fn } of options.customValidators) {
|
|
76
|
+
const value = getValueAtPath(values, path);
|
|
77
|
+
const error = fn(value);
|
|
78
|
+
if (error) {
|
|
79
|
+
issues.push({
|
|
80
|
+
path,
|
|
81
|
+
message: error,
|
|
82
|
+
severity: 'error',
|
|
83
|
+
code: 'custom_validation_failed'
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
const errors = issues.filter((i) => i.severity === 'error').length;
|
|
90
|
+
const warnings = issues.filter((i) => i.severity === 'warning').length;
|
|
91
|
+
const info = issues.filter((i) => i.severity === 'info').length;
|
|
92
|
+
|
|
93
|
+
return {
|
|
94
|
+
ready: errors === 0,
|
|
95
|
+
issues,
|
|
96
|
+
summary: { errors, warnings, info }
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Diagnose a ConfigCollection (group of related configs).
|
|
102
|
+
*
|
|
103
|
+
* Validates that all manifests in the collection are properly configured.
|
|
104
|
+
*
|
|
105
|
+
* @param collection - The ConfigCollection to diagnose
|
|
106
|
+
* @returns Diagnostic results for each manifest in the collection
|
|
107
|
+
*/
|
|
108
|
+
export async function diagnoseCollection(
|
|
109
|
+
collection: ConfigCollection
|
|
110
|
+
): Promise<Record<string, DetailedDiagnostic>> {
|
|
111
|
+
const results: Record<string, DetailedDiagnostic> = {};
|
|
112
|
+
|
|
113
|
+
for (const manifestId of collection.manifestIds) {
|
|
114
|
+
// Load current values for this manifest
|
|
115
|
+
// Note: This assumes manifests are registered and loadable
|
|
116
|
+
results[manifestId] = {
|
|
117
|
+
ready: true,
|
|
118
|
+
issues: [],
|
|
119
|
+
summary: { errors: 0, warnings: 0, info: 0 }
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return results;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Helper: Get value at a dot-notation path from an object
|
|
128
|
+
*/
|
|
129
|
+
function getValueAtPath(obj: Record<string, unknown>, path: string): unknown {
|
|
130
|
+
if (path in obj) {
|
|
131
|
+
return obj[path];
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
const parts = path.split('.');
|
|
135
|
+
let current: unknown = obj;
|
|
136
|
+
for (const part of parts) {
|
|
137
|
+
if (current == null || typeof current !== 'object') {
|
|
138
|
+
return undefined;
|
|
139
|
+
}
|
|
140
|
+
current = (current as Record<string, unknown>)[part];
|
|
141
|
+
}
|
|
142
|
+
return current;
|
|
143
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Runtime environment access for storage policy and other runtime-dependent modules.
|
|
3
|
+
*
|
|
4
|
+
* Provides settable env overrides so tests can inject values without mutating process.env.
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
declare const window: Record<string, unknown> | undefined;
|
|
8
|
+
|
|
9
|
+
type WindowWithEnv = { __env?: Record<string, string | undefined>; [key: string]: unknown };
|
|
10
|
+
|
|
11
|
+
/** Internal mutable env override map (used by tests) */
|
|
12
|
+
const envOverrides = new Map<string, string>();
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* Read an environment variable at runtime.
|
|
16
|
+
* Priority: envOverrides → process.env → browser window.__env
|
|
17
|
+
*/
|
|
18
|
+
export function readRuntimeEnv(key: string): string | undefined {
|
|
19
|
+
if (envOverrides.has(key)) return envOverrides.get(key);
|
|
20
|
+
|
|
21
|
+
const publicKey = `PUBLIC_${key}`;
|
|
22
|
+
|
|
23
|
+
if (typeof window !== 'undefined') {
|
|
24
|
+
return (window as WindowWithEnv).__env?.[publicKey];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
if (typeof process !== 'undefined') {
|
|
28
|
+
return (
|
|
29
|
+
process.env?.[key] ??
|
|
30
|
+
process.env?.[publicKey]
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
return undefined;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Set an environment variable override (primarily for testing).
|
|
39
|
+
*/
|
|
40
|
+
export function setRuntimeEnv(key: string, value: string): void {
|
|
41
|
+
envOverrides.set(key, value);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Clear all environment overrides (primarily for testing).
|
|
46
|
+
*/
|
|
47
|
+
export function clearRuntimeEnvOverrides(): void {
|
|
48
|
+
envOverrides.clear();
|
|
49
|
+
}
|
package/src/env.ts
ADDED
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generic environment-variable helpers.
|
|
3
|
+
*
|
|
4
|
+
* This module is the canonical home for *generic* env access: read a key,
|
|
5
|
+
* parse a number, parse a boolean, validate required keys at startup. It is
|
|
6
|
+
* isomorphic — works in Node/server and browser (`window.__env`).
|
|
7
|
+
*
|
|
8
|
+
* Domain-specific env (AI provider keys, OAuth callback URLs, SMTP, Linear
|
|
9
|
+
* status IDs, scheduler crons, …) lives with the owning module. Do not
|
|
10
|
+
* re-introduce a monorepo-wide `env` aggregate here.
|
|
11
|
+
*
|
|
12
|
+
* See `packages/config/SPEC.md` ("Does not own").
|
|
13
|
+
*/
|
|
14
|
+
|
|
15
|
+
// Declare browser globals for isomorphic compatibility (this file runs in both Node and browser)
|
|
16
|
+
declare const window: Record<string, unknown> | undefined;
|
|
17
|
+
|
|
18
|
+
type WindowWithEnv = { __env?: Record<string, string | undefined>; [key: string]: unknown };
|
|
19
|
+
|
|
20
|
+
function readBrowserEnv(key: string): string | undefined {
|
|
21
|
+
if (typeof window === 'undefined') return undefined;
|
|
22
|
+
return (window as WindowWithEnv).__env?.[key];
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
function readProcessEnv(key: string): string | undefined {
|
|
26
|
+
if (typeof process === 'undefined') return undefined;
|
|
27
|
+
return process.env?.[key];
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
function readRuntimeEnv(key: string): string | undefined {
|
|
31
|
+
const publicKey = `PUBLIC_${key}`;
|
|
32
|
+
if (typeof window !== 'undefined') {
|
|
33
|
+
return readBrowserEnv(publicKey);
|
|
34
|
+
}
|
|
35
|
+
return (
|
|
36
|
+
readProcessEnv(key) ??
|
|
37
|
+
readProcessEnv(publicKey) ??
|
|
38
|
+
readBrowserEnv(key) ??
|
|
39
|
+
readBrowserEnv(publicKey)
|
|
40
|
+
);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
function isServerRuntime(): boolean {
|
|
44
|
+
return typeof window === 'undefined' && typeof process !== 'undefined';
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
/** Read an env var (or the `PUBLIC_`-prefixed variant) with a fallback. */
|
|
48
|
+
export function getEnv(key: string, defaultValue?: string): string {
|
|
49
|
+
return readRuntimeEnv(key) || defaultValue || '';
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
/** Read an env var as a number, falling back when missing or unparseable. */
|
|
53
|
+
export function getEnvNumber(key: string, defaultValue: number): number {
|
|
54
|
+
const value = getEnv(key);
|
|
55
|
+
const parsed = parseInt(value, 10);
|
|
56
|
+
return isNaN(parsed) ? defaultValue : parsed;
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/** Read an env var as a boolean (`"true"` is true; anything else is the default). */
|
|
60
|
+
export function getEnvBoolean(key: string, defaultValue: boolean): boolean {
|
|
61
|
+
const value = getEnv(key);
|
|
62
|
+
if (!value) return defaultValue;
|
|
63
|
+
return value.toLowerCase() === 'true';
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Assert that the given env vars are set. No-op in browser runtimes.
|
|
68
|
+
* Throws with a formatted message listing every missing key.
|
|
69
|
+
*/
|
|
70
|
+
export function validateRequiredEnv(required: Array<{ key: string; description: string }>): void {
|
|
71
|
+
if (!isServerRuntime()) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const missing: Array<{ key: string; description: string }> = [];
|
|
76
|
+
|
|
77
|
+
for (const { key, description } of required) {
|
|
78
|
+
if (!readRuntimeEnv(key)) {
|
|
79
|
+
missing.push({ key, description });
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (missing.length > 0) {
|
|
84
|
+
const errorList = missing
|
|
85
|
+
.map(({ key, description }) => ` - ${key}: ${description}`)
|
|
86
|
+
.join('\n');
|
|
87
|
+
throw new Error(
|
|
88
|
+
`Missing required environment variables:\n${errorList}\n\nPlease set these variables in your environment or .env file.`
|
|
89
|
+
);
|
|
90
|
+
}
|
|
91
|
+
}
|