@ng-forge/dynamic-forms 0.4.0 → 0.5.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.
Files changed (22) hide show
  1. package/README.md +3 -0
  2. package/fesm2022/ng-forge-dynamic-forms-integration.mjs +138 -58
  3. package/fesm2022/ng-forge-dynamic-forms-integration.mjs.map +1 -1
  4. package/fesm2022/{ng-forge-dynamic-forms-ng-forge-dynamic-forms-DHxoGouT.mjs → ng-forge-dynamic-forms-ng-forge-dynamic-forms-BWFdMPyw.mjs} +3876 -354
  5. package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-BWFdMPyw.mjs.map +1 -0
  6. package/fesm2022/{ng-forge-dynamic-forms-page-field.component-Bt6blv9I.mjs → ng-forge-dynamic-forms-page-field.component-RN1hmG69.mjs} +2 -2
  7. package/fesm2022/{ng-forge-dynamic-forms-page-field.component-Bt6blv9I.mjs.map → ng-forge-dynamic-forms-page-field.component-RN1hmG69.mjs.map} +1 -1
  8. package/fesm2022/ng-forge-dynamic-forms-schema.mjs +92 -0
  9. package/fesm2022/ng-forge-dynamic-forms-schema.mjs.map +1 -0
  10. package/fesm2022/{ng-forge-dynamic-forms-text-field.component-DKCx7Z_U.mjs → ng-forge-dynamic-forms-text-field.component-DIVyioMX.mjs} +2 -2
  11. package/fesm2022/{ng-forge-dynamic-forms-text-field.component-DKCx7Z_U.mjs.map → ng-forge-dynamic-forms-text-field.component-DIVyioMX.mjs.map} +1 -1
  12. package/fesm2022/ng-forge-dynamic-forms.mjs +1 -1
  13. package/package.json +5 -4
  14. package/types/ng-forge-dynamic-forms-integration.d.ts +6 -14
  15. package/types/ng-forge-dynamic-forms-schema.d.ts +178 -0
  16. package/types/ng-forge-dynamic-forms.d.ts +1040 -45
  17. package/fesm2022/ng-forge-dynamic-forms-ng-forge-dynamic-forms-DHxoGouT.mjs.map +0 -1
  18. package/fesm2022/ng-forge-dynamic-forms-testing-test-button.harness-C79EBW0o.mjs +0 -31
  19. package/fesm2022/ng-forge-dynamic-forms-testing-test-button.harness-C79EBW0o.mjs.map +0 -1
  20. package/fesm2022/ng-forge-dynamic-forms-testing.mjs +0 -973
  21. package/fesm2022/ng-forge-dynamic-forms-testing.mjs.map +0 -1
  22. package/types/ng-forge-dynamic-forms-testing.d.ts +0 -603
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
2
2
  import { inject, DestroyRef, Injector, input, computed, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
  import { NgComponentOutlet } from '@angular/common';
4
4
  import { outputFromObservable } from '@angular/core/rxjs-interop';
5
- import { i as injectFieldRegistry, E as EventBus, D as DynamicFormLogger, v as validatePageNesting, d as derivedFromDeferred, c as createFieldResolutionPipe, e as emitComponentInitialized } from './ng-forge-dynamic-forms-ng-forge-dynamic-forms-DHxoGouT.mjs';
5
+ import { i as injectFieldRegistry, E as EventBus, D as DynamicFormLogger, v as validatePageNesting, d as derivedFromDeferred, c as createFieldResolutionPipe, e as emitComponentInitialized } from './ng-forge-dynamic-forms-ng-forge-dynamic-forms-BWFdMPyw.mjs';
6
6
  import { explicitEffect } from 'ngxtension/explicit-effect';
7
7
 
8
8
  /**
@@ -117,4 +117,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
117
117
  }], ctorParameters: () => [], propDecorators: { field: [{ type: i0.Input, args: [{ isSignal: true, alias: "field", required: true }] }], key: [{ type: i0.Input, args: [{ isSignal: true, alias: "key", required: true }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], pageIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "pageIndex", required: true }] }], isVisible: [{ type: i0.Input, args: [{ isSignal: true, alias: "isVisible", required: true }] }], nextPage: [{ type: i0.Output, args: ["nextPage"] }], previousPage: [{ type: i0.Output, args: ["previousPage"] }], pageChange: [{ type: i0.Output, args: ["pageChange"] }] } });
118
118
 
119
119
  export { PageFieldComponent as default };
120
- //# sourceMappingURL=ng-forge-dynamic-forms-page-field.component-Bt6blv9I.mjs.map
120
+ //# sourceMappingURL=ng-forge-dynamic-forms-page-field.component-RN1hmG69.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ng-forge-dynamic-forms-page-field.component-Bt6blv9I.mjs","sources":["../../../../packages/dynamic-forms/src/lib/fields/page/page-field.component.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, DestroyRef, inject, Injector, input } from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport { outputFromObservable } from '@angular/core/rxjs-interop';\nimport { derivedFromDeferred } from '../../utils/derived-from-deferred/derived-from-deferred';\nimport { createFieldResolutionPipe, ResolvedField } from '../../utils/resolve-field/resolve-field';\nimport { emitComponentInitialized } from '../../utils/emit-initialization/emit-initialization';\nimport { explicitEffect } from 'ngxtension/explicit-effect';\nimport { PageField, validatePageNesting } from '../../definitions/default/page-field';\nimport { injectFieldRegistry } from '../../utils/inject-field-registry/inject-field-registry';\nimport { EventBus } from '../../events/event.bus';\nimport { NextPageEvent, PageChangeEvent, PreviousPageEvent } from '../../events/constants';\nimport { FieldDef } from '../../definitions/base/field-def';\nimport { DynamicFormLogger } from '../../providers/features/logger/logger.token';\n\n/**\n * Renders a single page in multi-page (wizard) forms.\n *\n * Visibility is controlled by the PageOrchestrator via the isVisible input.\n * Pages cannot be nested within other pages - validation prevents this.\n * Field values are flattened into the parent form (no nesting under page key).\n */\n@Component({\n selector: 'section[page-field]',\n imports: [NgComponentOutlet],\n template: `\n @for (field of resolvedFields(); track field.key) {\n <ng-container *ngComponentOutlet=\"field.component; injector: field.injector; inputs: field.inputs()\" />\n }\n `,\n styleUrl: './page-field.component.scss',\n host: {\n '[class]': 'hostClasses()',\n '[class.disabled]': 'disabled()',\n '[class.df-page-visible]': 'isVisible()',\n '[class.df-page-hidden]': '!isVisible()',\n '[attr.aria-hidden]': '!isVisible()',\n '[attr.data-page-index]': 'pageIndex()',\n '[id]': '`${key()}`',\n '[attr.data-testid]': 'key()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class PageFieldComponent {\n // ─────────────────────────────────────────────────────────────────────────────\n // Dependencies\n // ─────────────────────────────────────────────────────────────────────────────\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly fieldRegistry = injectFieldRegistry();\n private readonly injector = inject(Injector);\n private readonly eventBus = inject(EventBus);\n private readonly logger = inject(DynamicFormLogger);\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Inputs\n // ─────────────────────────────────────────────────────────────────────────────\n\n field = input.required<PageField>();\n key = input.required<string>();\n className = input<string>();\n pageIndex = input.required<number>();\n isVisible = input.required<boolean>();\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Computed Signals\n // ─────────────────────────────────────────────────────────────────────────────\n\n readonly hostClasses = computed(() => {\n const base = 'df-field df-page-field';\n const custom = this.className();\n return custom ? `${base} ${custom}` : base;\n });\n\n readonly disabled = computed(() => this.field().disabled || false);\n\n readonly isValid = computed(() => {\n const pageField = this.field();\n const valid = validatePageNesting(pageField);\n\n if (!valid) {\n this.logger.error(\n `Invalid configuration: Page '${pageField.key}' contains nested page fields. ` +\n `Pages cannot contain other pages. Consider using groups or rows for nested structure.`,\n pageField,\n );\n }\n\n return valid;\n });\n\n private readonly rawFieldRegistry = computed(() => this.fieldRegistry.raw);\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Outputs\n // ─────────────────────────────────────────────────────────────────────────────\n\n readonly nextPage = outputFromObservable(this.eventBus.on<NextPageEvent>('next-page'));\n readonly previousPage = outputFromObservable(this.eventBus.on<PreviousPageEvent>('previous-page'));\n readonly pageChange = outputFromObservable(this.eventBus.on<PageChangeEvent>('page-change'));\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Field Resolution\n // ─────────────────────────────────────────────────────────────────────────────\n\n private readonly fieldsSource = computed(() => {\n if (!this.isValid()) {\n return [];\n }\n return this.field().fields || [];\n });\n\n protected readonly resolvedFields = derivedFromDeferred(\n this.fieldsSource,\n createFieldResolutionPipe(() => ({\n loadTypeComponent: (type: string) => this.fieldRegistry.loadTypeComponent(type),\n registry: this.rawFieldRegistry(),\n injector: this.injector,\n destroyRef: this.destroyRef,\n onError: (fieldDef: FieldDef<unknown>, error: unknown) => {\n const fieldKey = fieldDef.key || '<no key>';\n this.logger.error(\n `Failed to load component for field type '${fieldDef.type}' (key: ${fieldKey}) ` +\n `within page '${this.field().key}'. Ensure the field type is registered in your field registry.`,\n error,\n );\n },\n })),\n { initialValue: [] as ResolvedField[], injector: this.injector },\n );\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Constructor\n // ─────────────────────────────────────────────────────────────────────────────\n\n constructor() {\n this.setupEffects();\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Private Methods\n // ─────────────────────────────────────────────────────────────────────────────\n\n private setupEffects(): void {\n // Emit initialization event when fields are resolved\n explicitEffect([this.resolvedFields], ([fields]) => {\n if (fields.length > 0) {\n emitComponentInitialized(this.eventBus, 'page', this.field().key, this.injector);\n }\n });\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ng-forge-dynamic-forms-page-field.component-RN1hmG69.mjs","sources":["../../../../packages/dynamic-forms/src/lib/fields/page/page-field.component.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, DestroyRef, inject, Injector, input } from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport { outputFromObservable } from '@angular/core/rxjs-interop';\nimport { derivedFromDeferred } from '../../utils/derived-from-deferred/derived-from-deferred';\nimport { createFieldResolutionPipe, ResolvedField } from '../../utils/resolve-field/resolve-field';\nimport { emitComponentInitialized } from '../../utils/emit-initialization/emit-initialization';\nimport { explicitEffect } from 'ngxtension/explicit-effect';\nimport { PageField, validatePageNesting } from '../../definitions/default/page-field';\nimport { injectFieldRegistry } from '../../utils/inject-field-registry/inject-field-registry';\nimport { EventBus } from '../../events/event.bus';\nimport { NextPageEvent, PageChangeEvent, PreviousPageEvent } from '../../events/constants';\nimport { FieldDef } from '../../definitions/base/field-def';\nimport { DynamicFormLogger } from '../../providers/features/logger/logger.token';\n\n/**\n * Renders a single page in multi-page (wizard) forms.\n *\n * Visibility is controlled by the PageOrchestrator via the isVisible input.\n * Pages cannot be nested within other pages - validation prevents this.\n * Field values are flattened into the parent form (no nesting under page key).\n */\n@Component({\n selector: 'section[page-field]',\n imports: [NgComponentOutlet],\n template: `\n @for (field of resolvedFields(); track field.key) {\n <ng-container *ngComponentOutlet=\"field.component; injector: field.injector; inputs: field.inputs()\" />\n }\n `,\n styleUrl: './page-field.component.scss',\n host: {\n '[class]': 'hostClasses()',\n '[class.disabled]': 'disabled()',\n '[class.df-page-visible]': 'isVisible()',\n '[class.df-page-hidden]': '!isVisible()',\n '[attr.aria-hidden]': '!isVisible()',\n '[attr.data-page-index]': 'pageIndex()',\n '[id]': '`${key()}`',\n '[attr.data-testid]': 'key()',\n },\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport default class PageFieldComponent {\n // ─────────────────────────────────────────────────────────────────────────────\n // Dependencies\n // ─────────────────────────────────────────────────────────────────────────────\n\n private readonly destroyRef = inject(DestroyRef);\n private readonly fieldRegistry = injectFieldRegistry();\n private readonly injector = inject(Injector);\n private readonly eventBus = inject(EventBus);\n private readonly logger = inject(DynamicFormLogger);\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Inputs\n // ─────────────────────────────────────────────────────────────────────────────\n\n field = input.required<PageField>();\n key = input.required<string>();\n className = input<string>();\n pageIndex = input.required<number>();\n isVisible = input.required<boolean>();\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Computed Signals\n // ─────────────────────────────────────────────────────────────────────────────\n\n readonly hostClasses = computed(() => {\n const base = 'df-field df-page-field';\n const custom = this.className();\n return custom ? `${base} ${custom}` : base;\n });\n\n readonly disabled = computed(() => this.field().disabled || false);\n\n readonly isValid = computed(() => {\n const pageField = this.field();\n const valid = validatePageNesting(pageField);\n\n if (!valid) {\n this.logger.error(\n `Invalid configuration: Page '${pageField.key}' contains nested page fields. ` +\n `Pages cannot contain other pages. Consider using groups or rows for nested structure.`,\n pageField,\n );\n }\n\n return valid;\n });\n\n private readonly rawFieldRegistry = computed(() => this.fieldRegistry.raw);\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Outputs\n // ─────────────────────────────────────────────────────────────────────────────\n\n readonly nextPage = outputFromObservable(this.eventBus.on<NextPageEvent>('next-page'));\n readonly previousPage = outputFromObservable(this.eventBus.on<PreviousPageEvent>('previous-page'));\n readonly pageChange = outputFromObservable(this.eventBus.on<PageChangeEvent>('page-change'));\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Field Resolution\n // ─────────────────────────────────────────────────────────────────────────────\n\n private readonly fieldsSource = computed(() => {\n if (!this.isValid()) {\n return [];\n }\n return this.field().fields || [];\n });\n\n protected readonly resolvedFields = derivedFromDeferred(\n this.fieldsSource,\n createFieldResolutionPipe(() => ({\n loadTypeComponent: (type: string) => this.fieldRegistry.loadTypeComponent(type),\n registry: this.rawFieldRegistry(),\n injector: this.injector,\n destroyRef: this.destroyRef,\n onError: (fieldDef: FieldDef<unknown>, error: unknown) => {\n const fieldKey = fieldDef.key || '<no key>';\n this.logger.error(\n `Failed to load component for field type '${fieldDef.type}' (key: ${fieldKey}) ` +\n `within page '${this.field().key}'. Ensure the field type is registered in your field registry.`,\n error,\n );\n },\n })),\n { initialValue: [] as ResolvedField[], injector: this.injector },\n );\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Constructor\n // ─────────────────────────────────────────────────────────────────────────────\n\n constructor() {\n this.setupEffects();\n }\n\n // ─────────────────────────────────────────────────────────────────────────────\n // Private Methods\n // ─────────────────────────────────────────────────────────────────────────────\n\n private setupEffects(): void {\n // Emit initialization event when fields are resolved\n explicitEffect([this.resolvedFields], ([fields]) => {\n if (fields.length > 0) {\n emitComponentInitialized(this.eventBus, 'page', this.field().key, this.injector);\n }\n });\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,92 @@
1
+ /**
2
+ * Internal marker symbol to identify StandardSchemaMarker instances.
3
+ * Uses ɵ prefix following Angular's convention for internal APIs.
4
+ */
5
+ const STANDARD_SCHEMA_KIND = 'standardSchema';
6
+ /**
7
+ * Wraps a Standard Schema compliant schema for use with dynamic forms.
8
+ *
9
+ * This function creates a marker wrapper around schemas that implement the
10
+ * Standard Schema spec (Zod, Valibot, ArkType, etc.), allowing the dynamic
11
+ * forms system to identify and use them for validation.
12
+ *
13
+ * @typeParam T - The inferred type that the schema validates to
14
+ * @param schema - A schema implementing the Standard Schema V1 spec
15
+ * @returns A wrapped schema marker that can be passed to dynamic form configuration
16
+ *
17
+ * @example
18
+ * ```typescript
19
+ * import { z } from 'zod';
20
+ * import { standardSchema } from '@ng-forge/dynamic-forms/schema';
21
+ *
22
+ * const loginSchema = z.object({
23
+ * email: z.string().email('Invalid email format'),
24
+ * password: z.string().min(8, 'Password must be at least 8 characters'),
25
+ * });
26
+ *
27
+ * // Wrap for use with dynamic forms
28
+ * const formSchema = standardSchema(loginSchema);
29
+ *
30
+ * // Use in form configuration
31
+ * const formConfig = {
32
+ * schema: formSchema,
33
+ * fields: [
34
+ * input({ key: 'email', label: 'Email' }),
35
+ * input({ key: 'password', label: 'Password', props: { type: 'password' } }),
36
+ * ],
37
+ * };
38
+ * ```
39
+ */
40
+ function standardSchema(schema) {
41
+ return {
42
+ ɵkind: STANDARD_SCHEMA_KIND,
43
+ schema,
44
+ };
45
+ }
46
+ /**
47
+ * Type guard to check if a value is a StandardSchemaMarker.
48
+ *
49
+ * This is useful when processing form configuration to determine if a schema
50
+ * has been provided and should be used for validation.
51
+ *
52
+ * @param value - The value to check
53
+ * @returns True if the value is a StandardSchemaMarker, false otherwise
54
+ *
55
+ * @example
56
+ * ```typescript
57
+ * import { isStandardSchemaMarker } from '@ng-forge/dynamic-forms/schema';
58
+ *
59
+ * function processFormConfig(config: FormConfig) {
60
+ * if (config.schema && isStandardSchemaMarker(config.schema)) {
61
+ * // Use the schema for validation
62
+ * const result = config.schema.schema['~standard'].validate(formValue);
63
+ * }
64
+ * }
65
+ * ```
66
+ */
67
+ function isStandardSchemaMarker(value) {
68
+ return (typeof value === 'object' &&
69
+ value !== null &&
70
+ 'ɵkind' in value &&
71
+ value.ɵkind === STANDARD_SCHEMA_KIND &&
72
+ 'schema' in value);
73
+ }
74
+
75
+ /**
76
+ * @ng-forge/dynamic-forms/schema
77
+ *
78
+ * Schema integration API for using Standard Schema compliant validation libraries
79
+ * (Zod, Valibot, ArkType, etc.) with dynamic forms.
80
+ *
81
+ * This entrypoint provides:
82
+ * - `standardSchema()` - Wrapper function to mark schemas for use with forms
83
+ * - `isStandardSchemaMarker()` - Type guard for schema detection
84
+ * - Type definitions for form schema configuration
85
+ */
86
+
87
+ /**
88
+ * Generated bundle index. Do not edit.
89
+ */
90
+
91
+ export { isStandardSchemaMarker, standardSchema };
92
+ //# sourceMappingURL=ng-forge-dynamic-forms-schema.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ng-forge-dynamic-forms-schema.mjs","sources":["../../../../packages/dynamic-forms/schema/src/standard-schema-marker.ts","../../../../packages/dynamic-forms/schema/src/public_api.ts","../../../../packages/dynamic-forms/schema/src/ng-forge-dynamic-forms-schema.ts"],"sourcesContent":["import type { SchemaPath, SchemaPathTree } from '@angular/forms/signals';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\n\n/**\n * Internal marker symbol to identify StandardSchemaMarker instances.\n * Uses ɵ prefix following Angular's convention for internal APIs.\n */\nexport const STANDARD_SCHEMA_KIND = 'standardSchema' as const;\n\n/**\n * Angular schema callback function type.\n * This is the raw callback that Angular's schema() function accepts.\n *\n * Use this when you want to write Angular schema validation directly\n * without any wrapper. This is ideal for Angular-only projects that\n * want full access to Angular's form validation APIs.\n *\n * @typeParam T - The form value type\n *\n * @example\n * ```typescript\n * import { FormConfig } from '@ng-forge/dynamic-forms';\n * import { validateTree } from '@angular/forms/signals';\n *\n * const config = {\n * // Raw callback - no wrapper needed!\n * schema: (path) => {\n * validateTree(path, (ctx) => {\n * const { password, confirmPassword } = ctx.value();\n * if (password !== confirmPassword) {\n * return [{ kind: 'passwordMismatch', fieldTree: ctx.fieldTreeOf(path).confirmPassword }];\n * }\n * return null;\n * });\n * },\n * fields: [\n * { key: 'password', type: 'input', label: 'Password', required: true },\n * { key: 'confirmPassword', type: 'input', label: 'Confirm', required: true,\n * validationMessages: { passwordMismatch: 'Passwords must match' } },\n * ],\n * } as const satisfies FormConfig;\n * ```\n */\nexport type AngularSchemaCallback<T = unknown> = (path: SchemaPath<T> & SchemaPathTree<T>) => void;\n\n/**\n * Wrapper interface that marks a schema as implementing the Standard Schema spec.\n * This allows the dynamic forms system to identify and use standard-compliant schemas\n * for validation without coupling to any specific schema library.\n *\n * The `out` variance modifier makes this type covariant in T, meaning a\n * StandardSchemaMarker<SpecificType> is assignable to StandardSchemaMarker<BroaderType>.\n * This enables Zod/Valibot schemas to be used with FormConfig's inferred TValue.\n *\n * @typeParam T - The inferred type that the schema validates to (covariant)\n *\n * @example\n * ```typescript\n * import { z } from 'zod';\n * import { standardSchema } from '@ng-forge/dynamic-forms/schema';\n *\n * const userSchema = z.object({\n * name: z.string(),\n * email: z.string().email(),\n * });\n *\n * // Wrap the Zod schema with standardSchema marker\n * const formSchema = standardSchema(userSchema);\n * ```\n */\nexport interface StandardSchemaMarker<out T = unknown> {\n /**\n * Internal marker identifying this as a standard schema wrapper.\n * @internal\n */\n readonly ɵkind: typeof STANDARD_SCHEMA_KIND;\n\n /**\n * The underlying schema that implements the Standard Schema spec.\n */\n readonly schema: StandardSchemaV1<T>;\n}\n\n/**\n * Type alias for form schemas that can be used with dynamic forms.\n * Supports both Standard Schema compliant schemas (Zod, Valibot, ArkType)\n * and raw Angular schema callbacks.\n *\n * The covariance from StandardSchemaMarker flows through, allowing\n * schemas with specific types to be assigned to broader form value types.\n *\n * @typeParam T - The inferred type that the schema validates to\n *\n * @example Standard Schema (Zod)\n * ```typescript\n * import { z } from 'zod';\n * import { standardSchema } from '@ng-forge/dynamic-forms/schema';\n *\n * const config = {\n * schema: standardSchema(z.object({ ... })),\n * fields: [...],\n * };\n * ```\n *\n * @example Angular Schema Callback\n * ```typescript\n * import { validateTree } from '@angular/forms/signals';\n *\n * const config = {\n * schema: (path) => {\n * validateTree(path, (ctx) => { ... });\n * },\n * fields: [...],\n * };\n * ```\n */\nexport type FormSchema<T = unknown> = StandardSchemaMarker<T> | AngularSchemaCallback<T>;\n\n/**\n * Wraps a Standard Schema compliant schema for use with dynamic forms.\n *\n * This function creates a marker wrapper around schemas that implement the\n * Standard Schema spec (Zod, Valibot, ArkType, etc.), allowing the dynamic\n * forms system to identify and use them for validation.\n *\n * @typeParam T - The inferred type that the schema validates to\n * @param schema - A schema implementing the Standard Schema V1 spec\n * @returns A wrapped schema marker that can be passed to dynamic form configuration\n *\n * @example\n * ```typescript\n * import { z } from 'zod';\n * import { standardSchema } from '@ng-forge/dynamic-forms/schema';\n *\n * const loginSchema = z.object({\n * email: z.string().email('Invalid email format'),\n * password: z.string().min(8, 'Password must be at least 8 characters'),\n * });\n *\n * // Wrap for use with dynamic forms\n * const formSchema = standardSchema(loginSchema);\n *\n * // Use in form configuration\n * const formConfig = {\n * schema: formSchema,\n * fields: [\n * input({ key: 'email', label: 'Email' }),\n * input({ key: 'password', label: 'Password', props: { type: 'password' } }),\n * ],\n * };\n * ```\n */\nexport function standardSchema<T>(schema: StandardSchemaV1<T>): StandardSchemaMarker<T> {\n return {\n ɵkind: STANDARD_SCHEMA_KIND,\n schema,\n };\n}\n\n/**\n * Type guard to check if a value is a StandardSchemaMarker.\n *\n * This is useful when processing form configuration to determine if a schema\n * has been provided and should be used for validation.\n *\n * @param value - The value to check\n * @returns True if the value is a StandardSchemaMarker, false otherwise\n *\n * @example\n * ```typescript\n * import { isStandardSchemaMarker } from '@ng-forge/dynamic-forms/schema';\n *\n * function processFormConfig(config: FormConfig) {\n * if (config.schema && isStandardSchemaMarker(config.schema)) {\n * // Use the schema for validation\n * const result = config.schema.schema['~standard'].validate(formValue);\n * }\n * }\n * ```\n */\nexport function isStandardSchemaMarker(value: unknown): value is StandardSchemaMarker {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'ɵkind' in value &&\n (value as StandardSchemaMarker).ɵkind === STANDARD_SCHEMA_KIND &&\n 'schema' in value\n );\n}\n\n/**\n * Extracts the output type from a Standard Schema.\n * Works with Zod, Valibot, ArkType, and other Standard Schema compliant libraries.\n */\nexport type InferSchemaOutput<T> = T extends StandardSchemaV1<infer Output> ? Output : never;\n","/**\n * @ng-forge/dynamic-forms/schema\n *\n * Schema integration API for using Standard Schema compliant validation libraries\n * (Zod, Valibot, ArkType, etc.) with dynamic forms.\n *\n * This entrypoint provides:\n * - `standardSchema()` - Wrapper function to mark schemas for use with forms\n * - `isStandardSchemaMarker()` - Type guard for schema detection\n * - Type definitions for form schema configuration\n */\n\nexport { standardSchema, isStandardSchemaMarker } from './standard-schema-marker';\nexport type { StandardSchemaMarker, FormSchema, InferSchemaOutput, AngularSchemaCallback } from './standard-schema-marker';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"AAGA;;;AAGG;AACI,MAAM,oBAAoB,GAAG,gBAAyB;AA+G7D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCG;AACG,SAAU,cAAc,CAAI,MAA2B,EAAA;IAC3D,OAAO;AACL,QAAA,KAAK,EAAE,oBAAoB;QAC3B,MAAM;KACP;AACH;AAEA;;;;;;;;;;;;;;;;;;;;AAoBG;AACG,SAAU,sBAAsB,CAAC,KAAc,EAAA;AACnD,IAAA,QACE,OAAO,KAAK,KAAK,QAAQ;AACzB,QAAA,KAAK,KAAK,IAAI;AACd,QAAA,OAAO,IAAI,KAAK;QACf,KAA8B,CAAC,KAAK,KAAK,oBAAoB;QAC9D,QAAQ,IAAI,KAAK;AAErB;;AC5LA;;;;;;;;;;AAUG;;ACVH;;AAEG;;;;"}
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { input, computed, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
  import { AsyncPipe } from '@angular/common';
4
- import { a as DynamicTextPipe } from './ng-forge-dynamic-forms-ng-forge-dynamic-forms-DHxoGouT.mjs';
4
+ import { a as DynamicTextPipe } from './ng-forge-dynamic-forms-ng-forge-dynamic-forms-BWFdMPyw.mjs';
5
5
 
6
6
  class TextFieldComponent {
7
7
  key = input.required(...(ngDevMode ? [{ debugName: "key" }] : []));
@@ -110,4 +110,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.1.0", ngImpor
110
110
  }], propDecorators: { key: [{ type: i0.Input, args: [{ isSignal: true, alias: "key", required: true }] }], label: [{ type: i0.Input, args: [{ isSignal: true, alias: "label", required: true }] }], className: [{ type: i0.Input, args: [{ isSignal: true, alias: "className", required: false }] }], tabIndex: [{ type: i0.Input, args: [{ isSignal: true, alias: "tabIndex", required: false }] }], hidden: [{ type: i0.Input, args: [{ isSignal: true, alias: "hidden", required: false }] }], props: [{ type: i0.Input, args: [{ isSignal: true, alias: "props", required: false }] }] } });
111
111
 
112
112
  export { TextFieldComponent as default };
113
- //# sourceMappingURL=ng-forge-dynamic-forms-text-field.component-DKCx7Z_U.mjs.map
113
+ //# sourceMappingURL=ng-forge-dynamic-forms-text-field.component-DIVyioMX.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"ng-forge-dynamic-forms-text-field.component-DKCx7Z_U.mjs","sources":["../../../../packages/dynamic-forms/src/lib/fields/text/text-field.component.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { AsyncPipe } from '@angular/common';\nimport { DynamicTextPipe } from '../../pipes/dynamic-text/dynamic-text.pipe';\nimport { TextProps } from '../../definitions/default/text-field';\nimport { DynamicText } from '../../models/types/dynamic-text';\n\n@Component({\n selector: 'df-text',\n template: `\n @switch (elementType()) {\n @case ('p') {\n <p class=\"df-text df-text-p\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </p>\n }\n @case ('h1') {\n <h1 class=\"df-text df-text-h1\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </h1>\n }\n @case ('h2') {\n <h2 class=\"df-text df-text-h2\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </h2>\n }\n @case ('h3') {\n <h3 class=\"df-text df-text-h3\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </h3>\n }\n @case ('h4') {\n <h4 class=\"df-text df-text-h4\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </h4>\n }\n @case ('h5') {\n <h5 class=\"df-text df-text-h5\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </h5>\n }\n @case ('h6') {\n <h6 class=\"df-text df-text-h6\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </h6>\n }\n @case ('span') {\n <span class=\"df-text df-text-span\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </span>\n }\n }\n `,\n styleUrl: './text-field.component.scss',\n imports: [AsyncPipe, DynamicTextPipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[id]': '`${key()}`',\n '[attr.data-testid]': 'key()',\n '[attr.hidden]': 'hidden() || null',\n },\n})\nexport default class TextFieldComponent {\n readonly key = input.required<string>();\n readonly label = input.required<DynamicText>();\n readonly className = input<string>();\n readonly tabIndex = input<number>();\n readonly hidden = input<boolean>();\n readonly props = input<TextProps>();\n\n readonly elementType = computed(() => this.props()?.elementType || 'p');\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ng-forge-dynamic-forms-text-field.component-DIVyioMX.mjs","sources":["../../../../packages/dynamic-forms/src/lib/fields/text/text-field.component.ts"],"sourcesContent":["import { ChangeDetectionStrategy, Component, computed, input } from '@angular/core';\nimport { AsyncPipe } from '@angular/common';\nimport { DynamicTextPipe } from '../../pipes/dynamic-text/dynamic-text.pipe';\nimport { TextProps } from '../../definitions/default/text-field';\nimport { DynamicText } from '../../models/types/dynamic-text';\n\n@Component({\n selector: 'df-text',\n template: `\n @switch (elementType()) {\n @case ('p') {\n <p class=\"df-text df-text-p\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </p>\n }\n @case ('h1') {\n <h1 class=\"df-text df-text-h1\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </h1>\n }\n @case ('h2') {\n <h2 class=\"df-text df-text-h2\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </h2>\n }\n @case ('h3') {\n <h3 class=\"df-text df-text-h3\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </h3>\n }\n @case ('h4') {\n <h4 class=\"df-text df-text-h4\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </h4>\n }\n @case ('h5') {\n <h5 class=\"df-text df-text-h5\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </h5>\n }\n @case ('h6') {\n <h6 class=\"df-text df-text-h6\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </h6>\n }\n @case ('span') {\n <span class=\"df-text df-text-span\" [class]=\"className() || ''\">\n {{ label() | dynamicText | async }}\n </span>\n }\n }\n `,\n styleUrl: './text-field.component.scss',\n imports: [AsyncPipe, DynamicTextPipe],\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n '[id]': '`${key()}`',\n '[attr.data-testid]': 'key()',\n '[attr.hidden]': 'hidden() || null',\n },\n})\nexport default class TextFieldComponent {\n readonly key = input.required<string>();\n readonly label = input.required<DynamicText>();\n readonly className = input<string>();\n readonly tabIndex = input<number>();\n readonly hidden = input<boolean>();\n readonly props = input<TextProps>();\n\n readonly elementType = computed(() => this.props()?.elementType || 'p');\n}\n"],"names":[],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- export { O as ARRAY_CONTEXT, A as AddArrayItemEvent, X as ArrayFieldComponent, a2 as BUILT_IN_FIELDS, C as ConsoleLogger, Q as DEFAULT_PROPS, T as DEFAULT_VALIDATION_MESSAGES, b as DynamicForm, z as DynamicFormError, D as DynamicFormLogger, a as DynamicTextPipe, E as EventBus, M as FIELD_REGISTRY, U as FIELD_SIGNAL_CONTEXT, V as FORM_OPTIONS, F as FormClearEvent, u as FormResetEvent, Y as GroupFieldComponent, x as NextPageEvent, N as NoopLogger, P as PageChangeEvent, y as PreviousPageEvent, R as RemoveArrayItemEvent, a6 as RootFormRegistryService, Z as RowFieldComponent, S as SubmitEvent, a5 as applyMetaToElement, _ as applyValidator, $ as applyValidators, H as arrayFieldMapper, B as baseFieldMapper, G as buildBaseInputs, W as dynamicTextToObservable, a0 as getArrayLength, I as groupFieldMapper, a4 as interpolateParams, l as isArrayField, h as isCheckedField, m as isContainerField, n as isDisplayOnlyField, f as isFormStateCondition, o as isGroupField, q as isLeafField, s as isPageField, k as isRowField, t as isValueBearingField, j as isValueField, a3 as omit, J as pageFieldMapper, p as provideDynamicForm, g as resolveNextButtonDisabled, r as resolveSubmitButtonDisabled, a1 as resolveTokens, K as rowFieldMapper, L as textFieldMapper, w as withLoggerConfig } from './ng-forge-dynamic-forms-ng-forge-dynamic-forms-DHxoGouT.mjs';
1
+ export { W as ARRAY_CONTEXT, A as AddArrayItemEvent, a0 as ArrayFieldComponent, a7 as BUILT_IN_FIELDS, C as ConsoleLogger, X as DEFAULT_PROPS, Y as DEFAULT_VALIDATION_MESSAGES, b as DynamicForm, J as DynamicFormError, D as DynamicFormLogger, a as DynamicTextPipe, E as EventBus, V as FIELD_REGISTRY, Z as FIELD_SIGNAL_CONTEXT, _ as FORM_OPTIONS, F as FormClearEvent, y as FormResetEvent, a1 as GroupFieldComponent, z as NextPageEvent, N as NoopLogger, P as PageChangeEvent, B as PreviousPageEvent, R as RemoveArrayItemEvent, ac as RootFormRegistryService, a2 as RowFieldComponent, S as SubmitEvent, ab as applyMetaToElement, a3 as applyValidator, a4 as applyValidators, M as arrayFieldMapper, K as baseFieldMapper, L as buildBaseInputs, G as createField, $ as dynamicTextToObservable, H as field, I as formConfig, a5 as getArrayLength, O as groupFieldMapper, h as hasFormValue, aa as interpolateParams, n as isArrayField, k as isCheckedField, o as isContainerField, q as isDisplayOnlyField, a8 as isEqual, g as isFormStateCondition, s as isGroupField, t as isLeafField, u as isPageField, m as isRowField, x as isValueBearingField, l as isValueField, a9 as omit, Q as pageFieldMapper, p as provideDynamicForm, j as resolveNextButtonDisabled, r as resolveSubmitButtonDisabled, a6 as resolveTokens, T as rowFieldMapper, U as textFieldMapper, f as withEventFormValue, w as withLoggerConfig } from './ng-forge-dynamic-forms-ng-forge-dynamic-forms-BWFdMPyw.mjs';
2
2
  //# sourceMappingURL=ng-forge-dynamic-forms.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ng-forge/dynamic-forms",
3
- "version": "0.4.0",
3
+ "version": "0.5.1",
4
4
  "description": "Type-safe, signal-powered dynamic forms for Angular. Build complex forms from configuration with full TypeScript inference.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -37,6 +37,7 @@
37
37
  "@angular/common": "~21.1.0",
38
38
  "@angular/core": "~21.1.0",
39
39
  "@angular/forms": "~21.1.0",
40
+ "@standard-schema/spec": "^1.0.0",
40
41
  "rxjs": ">=7.0.0"
41
42
  },
42
43
  "dependencies": {
@@ -57,9 +58,9 @@
57
58
  "types": "./types/ng-forge-dynamic-forms-integration.d.ts",
58
59
  "default": "./fesm2022/ng-forge-dynamic-forms-integration.mjs"
59
60
  },
60
- "./testing": {
61
- "types": "./types/ng-forge-dynamic-forms-testing.d.ts",
62
- "default": "./fesm2022/ng-forge-dynamic-forms-testing.mjs"
61
+ "./schema": {
62
+ "types": "./types/ng-forge-dynamic-forms-schema.d.ts",
63
+ "default": "./fesm2022/ng-forge-dynamic-forms-schema.mjs"
63
64
  }
64
65
  }
65
66
  }
@@ -1,6 +1,6 @@
1
1
  import { FormEvent, FieldDef, FormEventConstructor, BaseCheckedField, BaseValueField, DynamicText, FieldMeta, FieldOption, ValidationMessages } from '@ng-forge/dynamic-forms';
2
- import * as i0 from '@angular/core';
3
- import { Signal, Injector, ElementRef, PipeTransform } from '@angular/core';
2
+ export { isEqual } from '@ng-forge/dynamic-forms';
3
+ import { Signal, Injector, ElementRef } from '@angular/core';
4
4
  import { FieldTree } from '@angular/forms/signals';
5
5
 
6
6
  /**
@@ -447,6 +447,9 @@ declare function checkboxFieldMapper(fieldDef: BaseCheckedField<unknown>): Signa
447
447
  * - maxDate: Maximum selectable date
448
448
  * - startAt: Initial date to display when opening the picker
449
449
  *
450
+ * Date values are automatically converted from strings to Date objects
451
+ * since UI libraries (Material, PrimeNG, etc.) expect Date objects.
452
+ *
450
453
  * @param fieldDef The datepicker field definition
451
454
  * @returns Signal containing Record of input names to values for ngComponentOutlet
452
455
  */
@@ -503,11 +506,6 @@ declare function createResolvedErrorsSignal<T>(field: Signal<FieldTree<T>>, vali
503
506
  */
504
507
  declare function shouldShowErrors<T>(field: Signal<FieldTree<T>>): Signal<boolean>;
505
508
 
506
- /**
507
- * Performs a deep equality comparison between two values
508
- */
509
- declare function isEqual(a: unknown, b: unknown): boolean;
510
-
511
509
  /**
512
510
  * Configuration options for setupMetaTracking.
513
511
  */
@@ -573,11 +571,5 @@ interface MetaTrackingOptions {
573
571
  */
574
572
  declare function setupMetaTracking(elementRef: ElementRef<HTMLElement>, meta: Signal<FieldMeta | undefined>, options?: MetaTrackingOptions): void;
575
573
 
576
- declare class ValueInArrayPipe implements PipeTransform {
577
- transform<T>(element: T, array: T[] | undefined): boolean;
578
- static ɵfac: i0.ɵɵFactoryDeclaration<ValueInArrayPipe, never>;
579
- static ɵpipe: i0.ɵɵPipeDeclaration<ValueInArrayPipe, "inArray", true>;
580
- }
581
-
582
- export { ValueInArrayPipe, buildValueFieldInputs, checkboxFieldMapper, createResolvedErrorsSignal, datepickerFieldMapper, isEqual, optionsFieldMapper, resolveValueFieldContext, setupMetaTracking, shouldShowErrors, valueFieldMapper };
574
+ export { buildValueFieldInputs, checkboxFieldMapper, createResolvedErrorsSignal, datepickerFieldMapper, optionsFieldMapper, resolveValueFieldContext, setupMetaTracking, shouldShowErrors, valueFieldMapper };
583
575
  export type { Autocapitalize, AutocompleteValue, ButtonField, CheckboxField, DatepickerField, DatepickerProps, EnterKeyHint, EventArgs, FieldWithOptions, HtmlInputType, InferInputValue, InputField, InputMeta, InputMode, InputProps, InputType, InputTypeToValueType, MetaTrackingOptions, MultiCheckboxField, NumericInputType, RadioField, ResolvedError, SelectField, SelectProps, SliderField, StringInputType, TextareaField, TextareaMeta, TextareaProps, TextareaWrap, ToggleField, ValueFieldContext };
@@ -0,0 +1,178 @@
1
+ import { SchemaPath, SchemaPathTree } from '@angular/forms/signals';
2
+ import { StandardSchemaV1 } from '@standard-schema/spec';
3
+
4
+ /**
5
+ * Internal marker symbol to identify StandardSchemaMarker instances.
6
+ * Uses ɵ prefix following Angular's convention for internal APIs.
7
+ */
8
+ declare const STANDARD_SCHEMA_KIND: "standardSchema";
9
+ /**
10
+ * Angular schema callback function type.
11
+ * This is the raw callback that Angular's schema() function accepts.
12
+ *
13
+ * Use this when you want to write Angular schema validation directly
14
+ * without any wrapper. This is ideal for Angular-only projects that
15
+ * want full access to Angular's form validation APIs.
16
+ *
17
+ * @typeParam T - The form value type
18
+ *
19
+ * @example
20
+ * ```typescript
21
+ * import { FormConfig } from '@ng-forge/dynamic-forms';
22
+ * import { validateTree } from '@angular/forms/signals';
23
+ *
24
+ * const config = {
25
+ * // Raw callback - no wrapper needed!
26
+ * schema: (path) => {
27
+ * validateTree(path, (ctx) => {
28
+ * const { password, confirmPassword } = ctx.value();
29
+ * if (password !== confirmPassword) {
30
+ * return [{ kind: 'passwordMismatch', fieldTree: ctx.fieldTreeOf(path).confirmPassword }];
31
+ * }
32
+ * return null;
33
+ * });
34
+ * },
35
+ * fields: [
36
+ * { key: 'password', type: 'input', label: 'Password', required: true },
37
+ * { key: 'confirmPassword', type: 'input', label: 'Confirm', required: true,
38
+ * validationMessages: { passwordMismatch: 'Passwords must match' } },
39
+ * ],
40
+ * } as const satisfies FormConfig;
41
+ * ```
42
+ */
43
+ type AngularSchemaCallback<T = unknown> = (path: SchemaPath<T> & SchemaPathTree<T>) => void;
44
+ /**
45
+ * Wrapper interface that marks a schema as implementing the Standard Schema spec.
46
+ * This allows the dynamic forms system to identify and use standard-compliant schemas
47
+ * for validation without coupling to any specific schema library.
48
+ *
49
+ * The `out` variance modifier makes this type covariant in T, meaning a
50
+ * StandardSchemaMarker<SpecificType> is assignable to StandardSchemaMarker<BroaderType>.
51
+ * This enables Zod/Valibot schemas to be used with FormConfig's inferred TValue.
52
+ *
53
+ * @typeParam T - The inferred type that the schema validates to (covariant)
54
+ *
55
+ * @example
56
+ * ```typescript
57
+ * import { z } from 'zod';
58
+ * import { standardSchema } from '@ng-forge/dynamic-forms/schema';
59
+ *
60
+ * const userSchema = z.object({
61
+ * name: z.string(),
62
+ * email: z.string().email(),
63
+ * });
64
+ *
65
+ * // Wrap the Zod schema with standardSchema marker
66
+ * const formSchema = standardSchema(userSchema);
67
+ * ```
68
+ */
69
+ interface StandardSchemaMarker<out T = unknown> {
70
+ /**
71
+ * Internal marker identifying this as a standard schema wrapper.
72
+ * @internal
73
+ */
74
+ readonly ɵkind: typeof STANDARD_SCHEMA_KIND;
75
+ /**
76
+ * The underlying schema that implements the Standard Schema spec.
77
+ */
78
+ readonly schema: StandardSchemaV1<T>;
79
+ }
80
+ /**
81
+ * Type alias for form schemas that can be used with dynamic forms.
82
+ * Supports both Standard Schema compliant schemas (Zod, Valibot, ArkType)
83
+ * and raw Angular schema callbacks.
84
+ *
85
+ * The covariance from StandardSchemaMarker flows through, allowing
86
+ * schemas with specific types to be assigned to broader form value types.
87
+ *
88
+ * @typeParam T - The inferred type that the schema validates to
89
+ *
90
+ * @example Standard Schema (Zod)
91
+ * ```typescript
92
+ * import { z } from 'zod';
93
+ * import { standardSchema } from '@ng-forge/dynamic-forms/schema';
94
+ *
95
+ * const config = {
96
+ * schema: standardSchema(z.object({ ... })),
97
+ * fields: [...],
98
+ * };
99
+ * ```
100
+ *
101
+ * @example Angular Schema Callback
102
+ * ```typescript
103
+ * import { validateTree } from '@angular/forms/signals';
104
+ *
105
+ * const config = {
106
+ * schema: (path) => {
107
+ * validateTree(path, (ctx) => { ... });
108
+ * },
109
+ * fields: [...],
110
+ * };
111
+ * ```
112
+ */
113
+ type FormSchema<T = unknown> = StandardSchemaMarker<T> | AngularSchemaCallback<T>;
114
+ /**
115
+ * Wraps a Standard Schema compliant schema for use with dynamic forms.
116
+ *
117
+ * This function creates a marker wrapper around schemas that implement the
118
+ * Standard Schema spec (Zod, Valibot, ArkType, etc.), allowing the dynamic
119
+ * forms system to identify and use them for validation.
120
+ *
121
+ * @typeParam T - The inferred type that the schema validates to
122
+ * @param schema - A schema implementing the Standard Schema V1 spec
123
+ * @returns A wrapped schema marker that can be passed to dynamic form configuration
124
+ *
125
+ * @example
126
+ * ```typescript
127
+ * import { z } from 'zod';
128
+ * import { standardSchema } from '@ng-forge/dynamic-forms/schema';
129
+ *
130
+ * const loginSchema = z.object({
131
+ * email: z.string().email('Invalid email format'),
132
+ * password: z.string().min(8, 'Password must be at least 8 characters'),
133
+ * });
134
+ *
135
+ * // Wrap for use with dynamic forms
136
+ * const formSchema = standardSchema(loginSchema);
137
+ *
138
+ * // Use in form configuration
139
+ * const formConfig = {
140
+ * schema: formSchema,
141
+ * fields: [
142
+ * input({ key: 'email', label: 'Email' }),
143
+ * input({ key: 'password', label: 'Password', props: { type: 'password' } }),
144
+ * ],
145
+ * };
146
+ * ```
147
+ */
148
+ declare function standardSchema<T>(schema: StandardSchemaV1<T>): StandardSchemaMarker<T>;
149
+ /**
150
+ * Type guard to check if a value is a StandardSchemaMarker.
151
+ *
152
+ * This is useful when processing form configuration to determine if a schema
153
+ * has been provided and should be used for validation.
154
+ *
155
+ * @param value - The value to check
156
+ * @returns True if the value is a StandardSchemaMarker, false otherwise
157
+ *
158
+ * @example
159
+ * ```typescript
160
+ * import { isStandardSchemaMarker } from '@ng-forge/dynamic-forms/schema';
161
+ *
162
+ * function processFormConfig(config: FormConfig) {
163
+ * if (config.schema && isStandardSchemaMarker(config.schema)) {
164
+ * // Use the schema for validation
165
+ * const result = config.schema.schema['~standard'].validate(formValue);
166
+ * }
167
+ * }
168
+ * ```
169
+ */
170
+ declare function isStandardSchemaMarker(value: unknown): value is StandardSchemaMarker;
171
+ /**
172
+ * Extracts the output type from a Standard Schema.
173
+ * Works with Zod, Valibot, ArkType, and other Standard Schema compliant libraries.
174
+ */
175
+ type InferSchemaOutput<T> = T extends StandardSchemaV1<infer Output> ? Output : never;
176
+
177
+ export { isStandardSchemaMarker, standardSchema };
178
+ export type { AngularSchemaCallback, FormSchema, InferSchemaOutput, StandardSchemaMarker };