@wildo-ai/zod-decorators 1.1.4 → 1.1.6
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/dist/esm/currencies.shared.schemas.d.ts.map +1 -1
- package/dist/esm/currencies.shared.schemas.js.map +1 -1
- package/dist/esm/files/agent-file-formats.d.ts +51 -37
- package/dist/esm/files/agent-file-formats.d.ts.map +1 -1
- package/dist/esm/files/agent-file-formats.js +54 -47
- package/dist/esm/files/agent-file-formats.js.map +1 -1
- package/dist/esm/files/extension-nature-map.d.ts.map +1 -1
- package/dist/esm/files/mime-registry.d.ts.map +1 -1
- package/dist/esm/files/unified-registry.d.ts +2 -2
- package/dist/esm/files/unified-registry.d.ts.map +1 -1
- package/dist/esm/files/unified-registry.js +1 -1
- package/dist/esm/files/unified-registry.js.map +1 -1
- package/dist/esm/index.d.ts +1 -0
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +1 -0
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/testing/decorated-test-schemas.d.ts.map +1 -1
- package/dist/esm/testing.d.ts +11 -0
- package/dist/esm/testing.d.ts.map +1 -1
- package/dist/esm/testing.js +11 -0
- package/dist/esm/testing.js.map +1 -1
- package/dist/esm/zod-address.d.ts +146 -0
- package/dist/esm/zod-address.d.ts.map +1 -0
- package/dist/esm/zod-address.js +176 -0
- package/dist/esm/zod-address.js.map +1 -0
- package/dist/esm/zod-bigdecimal.d.ts.map +1 -1
- package/dist/esm/zod-code.d.ts +2 -0
- package/dist/esm/zod-code.d.ts.map +1 -1
- package/dist/esm/zod-code.js +4 -4
- package/dist/esm/zod-code.js.map +1 -1
- package/dist/esm/zod-color.d.ts.map +1 -1
- package/dist/esm/zod-decorators.types.d.ts +311 -29
- package/dist/esm/zod-decorators.types.d.ts.map +1 -1
- package/dist/esm/zod-decorators.types.js +177 -8
- package/dist/esm/zod-decorators.types.js.map +1 -1
- package/dist/esm/zod-duration.d.ts +2 -0
- package/dist/esm/zod-duration.d.ts.map +1 -1
- package/dist/esm/zod-duration.js +4 -4
- package/dist/esm/zod-duration.js.map +1 -1
- package/dist/esm/zod-file.d.ts +70 -4
- package/dist/esm/zod-file.d.ts.map +1 -1
- package/dist/esm/zod-file.js +92 -75
- package/dist/esm/zod-file.js.map +1 -1
- package/dist/esm/zod-money.d.ts +2 -0
- package/dist/esm/zod-money.d.ts.map +1 -1
- package/dist/esm/zod-money.js +6 -6
- package/dist/esm/zod-money.js.map +1 -1
- package/dist/esm/zod-phone.d.ts +8 -0
- package/dist/esm/zod-phone.d.ts.map +1 -1
- package/dist/esm/zod-phone.js +6 -1
- package/dist/esm/zod-phone.js.map +1 -1
- package/dist/esm/zod-range.d.ts.map +1 -1
- package/dist/esm/zod-utils.shared.d.ts +343 -12
- package/dist/esm/zod-utils.shared.d.ts.map +1 -1
- package/dist/esm/zod-utils.shared.js +1004 -90
- package/dist/esm/zod-utils.shared.js.map +1 -1
- package/dist/esm/zod-versioned.d.ts.map +1 -1
- package/dist/esm/zod-versioned.js.map +1 -1
- package/dist/esm/zod.module-override.d.ts +29 -1
- package/dist/esm/zod.module-override.d.ts.map +1 -1
- package/dist/esm/zod.module-override.js +67 -8
- package/dist/esm/zod.module-override.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +2 -7
- package/dist/esm/companion-exports.d.ts +0 -8
- package/dist/esm/companion-exports.d.ts.map +0 -1
- package/dist/esm/companion-exports.js +0 -8
- package/dist/esm/companion-exports.js.map +0 -1
package/dist/esm/index.d.ts
CHANGED
package/dist/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAiBxB,wBAAgB,iBAAiB,CAAC,WAAW,GAAE,OAAO,CAAK,GAAG,OAAO,CAAC,CAErE;AAED,cAAc,WAAW,CAAC;AAE1B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AAIzC;;;;;;GAMG"}
|
package/dist/esm/index.js
CHANGED
|
@@ -23,6 +23,7 @@ export * from './zod-money.js';
|
|
|
23
23
|
export * from './zod-bigdecimal.js';
|
|
24
24
|
export * from './zod-duration.js';
|
|
25
25
|
export * from './zod-phone.js';
|
|
26
|
+
export * from './zod-address.js';
|
|
26
27
|
export * from './zod-code.js';
|
|
27
28
|
export * from './zod-file.js';
|
|
28
29
|
export * from './zod-versioned.js';
|
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,uEAAuE;AACvE,4FAA4F;AAC5F,0FAA0F;AAC1F,yBAAyB,CAAC,CAAC,CAAC,CAAC;AAE7B,6EAA6E;AAC7E,8EAA8E;AAC9E,+EAA+E;AAC/E,kFAAkF;AAClF,mFAAmF;AACnF,kFAAkF;AAClF,yBAAyB,EAAE,CAAC;AAE5B,MAAM,UAAU,iBAAiB,CAAC,cAAwB,CAAC;IACzD,OAAO,yBAAyB,CAAC,WAAW,CAAC,CAAC;AAChD,CAAC;AAED,cAAc,WAAW,CAAC;AAE1B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AAIzC;;;;;;GAMG","sourcesContent":["import { z } from 'zod';\nimport { ensureZodDecoratorsLoaded } from './zod.module-override';\nimport { installBigIntJsonEncoding } from './install-bigint-json-encoding';\n\n// CRITICAL: Apply decorators immediately when this module is imported.\n// This ensures z.string().isUnique() etc. work without needing to call initZodDecorators().\n// The bundler may tree-shake the call in zod.module-override.ts, so we duplicate it here.\nensureZodDecoratorsLoaded(z);\n\n// Install the type-level `bigint → decimal string` JSON encoding at the SAME\n// bootstrap. `z_money` (owned by this package) stores `amount` as a `bigint`,\n// which `JSON.stringify` cannot serialize (it has no `toJSON`, unlike `Date`).\n// Installing it here — the earliest point, before any schema or serializer runs —\n// makes every JSON boundary (res.json, socket.io, queue, redis, HMAC, third-party)\n// bigint-safe with no per-boundary opt-in. See `install-bigint-json-encoding.ts`.\ninstallBigIntJsonEncoding();\n\nexport function initZodDecorators(zodInstance: typeof z = z): typeof z {\n return ensureZodDecoratorsLoaded(zodInstance);\n}\n\nexport * from './commons';\n\nexport * from './install-bigint-json-encoding';\nexport * from './zod-color';\nexport * from './zod-range';\nexport * from './zod-money';\nexport * from './zod-bigdecimal';\nexport * from './zod-duration';\nexport * from './zod-phone';\nexport * from './zod-code';\nexport * from './zod-file';\nexport * from './zod-versioned';\nexport * from './currencies.shared.schemas';\nexport * from './zod-utils.shared';\nexport * from './zod-decorators.types';\nexport * from './zod.module-override';\nexport * from './files/file-extensions.enum';\nexport * from './files/extension-nature-map';\nexport * from './files/mime-registry';\nexport * from './files/agent-file-formats';\nexport * from './files/unified-registry';\n\n\n\n/**\n * Initialize Zod decorators for the current Zod instance.\n * Safe to call multiple times - will only apply decorators once.\n *\n * This function should be called early in your application startup,\n * especially when using custom-shared-lib or custom-backend-lib packages.\n */\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAClE,OAAO,EAAE,yBAAyB,EAAE,MAAM,gCAAgC,CAAC;AAE3E,uEAAuE;AACvE,4FAA4F;AAC5F,0FAA0F;AAC1F,yBAAyB,CAAC,CAAC,CAAC,CAAC;AAE7B,6EAA6E;AAC7E,8EAA8E;AAC9E,+EAA+E;AAC/E,kFAAkF;AAClF,mFAAmF;AACnF,kFAAkF;AAClF,yBAAyB,EAAE,CAAC;AAE5B,MAAM,UAAU,iBAAiB,CAAC,cAAwB,CAAC;IACzD,OAAO,yBAAyB,CAAC,WAAW,CAAC,CAAC;AAChD,CAAC;AAED,cAAc,WAAW,CAAC;AAE1B,cAAc,gCAAgC,CAAC;AAC/C,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,aAAa,CAAC;AAC5B,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,iBAAiB,CAAC;AAChC,cAAc,6BAA6B,CAAC;AAC5C,cAAc,oBAAoB,CAAC;AACnC,cAAc,wBAAwB,CAAC;AACvC,cAAc,uBAAuB,CAAC;AACtC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,8BAA8B,CAAC;AAC7C,cAAc,uBAAuB,CAAC;AACtC,cAAc,4BAA4B,CAAC;AAC3C,cAAc,0BAA0B,CAAC;AAIzC;;;;;;GAMG","sourcesContent":["import { z } from 'zod';\nimport { ensureZodDecoratorsLoaded } from './zod.module-override';\nimport { installBigIntJsonEncoding } from './install-bigint-json-encoding';\n\n// CRITICAL: Apply decorators immediately when this module is imported.\n// This ensures z.string().isUnique() etc. work without needing to call initZodDecorators().\n// The bundler may tree-shake the call in zod.module-override.ts, so we duplicate it here.\nensureZodDecoratorsLoaded(z);\n\n// Install the type-level `bigint → decimal string` JSON encoding at the SAME\n// bootstrap. `z_money` (owned by this package) stores `amount` as a `bigint`,\n// which `JSON.stringify` cannot serialize (it has no `toJSON`, unlike `Date`).\n// Installing it here — the earliest point, before any schema or serializer runs —\n// makes every JSON boundary (res.json, socket.io, queue, redis, HMAC, third-party)\n// bigint-safe with no per-boundary opt-in. See `install-bigint-json-encoding.ts`.\ninstallBigIntJsonEncoding();\n\nexport function initZodDecorators(zodInstance: typeof z = z): typeof z {\n return ensureZodDecoratorsLoaded(zodInstance);\n}\n\nexport * from './commons';\n\nexport * from './install-bigint-json-encoding';\nexport * from './zod-color';\nexport * from './zod-range';\nexport * from './zod-money';\nexport * from './zod-bigdecimal';\nexport * from './zod-duration';\nexport * from './zod-phone';\nexport * from './zod-address';\nexport * from './zod-code';\nexport * from './zod-file';\nexport * from './zod-versioned';\nexport * from './currencies.shared.schemas';\nexport * from './zod-utils.shared';\nexport * from './zod-decorators.types';\nexport * from './zod.module-override';\nexport * from './files/file-extensions.enum';\nexport * from './files/extension-nature-map';\nexport * from './files/mime-registry';\nexport * from './files/agent-file-formats';\nexport * from './files/unified-registry';\n\n\n\n/**\n * Initialize Zod decorators for the current Zod instance.\n * Safe to call multiple times - will only apply decorators once.\n *\n * This function should be called early in your application startup,\n * especially when using custom-shared-lib or custom-backend-lib packages.\n */\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"decorated-test-schemas.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"decorated-test-schemas.d.ts","sourceRoot":"","sources":["../../../../src/testing/decorated-test-schemas.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;GAEG;AACH,eAAO,MAAM,yBAAyB;;;;;iBAKpC,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,0BAA0B;;;;;;iBAGrC,CAAC"}
|
package/dist/esm/testing.d.ts
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Public testing surface for @wildo-ai/zod-decorators.
|
|
3
3
|
* Import from `@wildo-ai/zod-decorators/testing`.
|
|
4
|
+
*
|
|
5
|
+
* entrypoint-waiver: an AUDIENCE boundary, not a file alias. Folding these fixtures into the root
|
|
6
|
+
* barrel would put them in the production graph of every consumer — the root is `sideEffects`-marked
|
|
7
|
+
* and reaches every frontend bundle — so the subpath is what keeps a test-only surface out of it.
|
|
8
|
+
* Rule 3 counts re-exported FILES and cannot see that distinction; the sibling `/testing` surfaces on
|
|
9
|
+
* `saas-models` and `saas-frontend-lib` are the same shape. Growing a second file purely to satisfy
|
|
10
|
+
* the count was rejected: it would invent surface nobody asked for.
|
|
11
|
+
*
|
|
12
|
+
* The waiver also suppresses rule 1 (`root-barrel-overlap`) for this barrel, which is a real loss.
|
|
13
|
+
* `published-testing-surface.contract.test.ts` restores it: it asserts the root barrel publishes
|
|
14
|
+
* none of the symbols below, which is the overlap rule 1 would have caught.
|
|
4
15
|
*/
|
|
5
16
|
export * from './testing/decorated-test-schemas';
|
|
6
17
|
//# sourceMappingURL=testing.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"testing.d.ts","sourceRoot":"","sources":["../../../src/testing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,cAAc,kCAAkC,CAAC"}
|
package/dist/esm/testing.js
CHANGED
|
@@ -1,6 +1,17 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Public testing surface for @wildo-ai/zod-decorators.
|
|
3
3
|
* Import from `@wildo-ai/zod-decorators/testing`.
|
|
4
|
+
*
|
|
5
|
+
* entrypoint-waiver: an AUDIENCE boundary, not a file alias. Folding these fixtures into the root
|
|
6
|
+
* barrel would put them in the production graph of every consumer — the root is `sideEffects`-marked
|
|
7
|
+
* and reaches every frontend bundle — so the subpath is what keeps a test-only surface out of it.
|
|
8
|
+
* Rule 3 counts re-exported FILES and cannot see that distinction; the sibling `/testing` surfaces on
|
|
9
|
+
* `saas-models` and `saas-frontend-lib` are the same shape. Growing a second file purely to satisfy
|
|
10
|
+
* the count was rejected: it would invent surface nobody asked for.
|
|
11
|
+
*
|
|
12
|
+
* The waiver also suppresses rule 1 (`root-barrel-overlap`) for this barrel, which is a real loss.
|
|
13
|
+
* `published-testing-surface.contract.test.ts` restores it: it asserts the root barrel publishes
|
|
14
|
+
* none of the symbols below, which is the overlap rule 1 would have caught.
|
|
4
15
|
*/
|
|
5
16
|
export * from './testing/decorated-test-schemas.js';
|
|
6
17
|
//# sourceMappingURL=testing.js.map
|
package/dist/esm/testing.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../../../src/testing.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"testing.js","sourceRoot":"","sources":["../../../src/testing.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AACH,cAAc,kCAAkC,CAAC","sourcesContent":["/**\n * Public testing surface for @wildo-ai/zod-decorators.\n * Import from `@wildo-ai/zod-decorators/testing`.\n *\n * entrypoint-waiver: an AUDIENCE boundary, not a file alias. Folding these fixtures into the root\n * barrel would put them in the production graph of every consumer — the root is `sideEffects`-marked\n * and reaches every frontend bundle — so the subpath is what keeps a test-only surface out of it.\n * Rule 3 counts re-exported FILES and cannot see that distinction; the sibling `/testing` surfaces on\n * `saas-models` and `saas-frontend-lib` are the same shape. Growing a second file purely to satisfy\n * the count was rejected: it would invent surface nobody asked for.\n *\n * The waiver also suppresses rule 1 (`root-barrel-overlap`) for this barrel, which is a real loss.\n * `published-testing-surface.contract.test.ts` restores it: it asserts the root barrel publishes\n * none of the symbols below, which is the overlap rule 1 would have caught.\n */\nexport * from './testing/decorated-test-schemas';\n"]}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import { AddressSchemaOptions, DecoratorInput, SummaryFieldParams, ZodDecorator, ZodDecorator_ParamsType } from './zod-decorators.types';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
/** A point on the globe, in decimal degrees. */
|
|
4
|
+
export interface AddressCoordinates {
|
|
5
|
+
/** -90 (south pole) to 90 (north pole). */
|
|
6
|
+
latitude: number;
|
|
7
|
+
/** -180 to 180. */
|
|
8
|
+
longitude: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* A structured postal address.
|
|
12
|
+
*
|
|
13
|
+
* The part names are the ones the framework's existing `AddressSchema` already uses (organisation
|
|
14
|
+
* profiles), so an application meets ONE address vocabulary rather than two. `postalCode` is optional
|
|
15
|
+
* because not every country issues one.
|
|
16
|
+
*/
|
|
17
|
+
export interface AddressValue {
|
|
18
|
+
line1: string;
|
|
19
|
+
line2?: string;
|
|
20
|
+
city: string;
|
|
21
|
+
/** Region, state, province or county — whatever the country calls its first subdivision. */
|
|
22
|
+
state?: string;
|
|
23
|
+
postalCode?: string;
|
|
24
|
+
/** ISO 3166-1 alpha-2, stored uppercase. */
|
|
25
|
+
country: string;
|
|
26
|
+
/** An optional geocode. It does NOT take part in identity — see {@link addressComparisonKey}. */
|
|
27
|
+
coordinates?: AddressCoordinates;
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* The parts of an address value, named once so the factory, the form control and the error routing
|
|
31
|
+
* agree. Each member's value is the key it has in {@link AddressValue}.
|
|
32
|
+
*/
|
|
33
|
+
export declare enum AddressPart {
|
|
34
|
+
/** Street and number. Required. */
|
|
35
|
+
LINE1 = "line1",
|
|
36
|
+
/** Building, floor, apartment. Optional. */
|
|
37
|
+
LINE2 = "line2",
|
|
38
|
+
/** Town or city. Required. */
|
|
39
|
+
CITY = "city",
|
|
40
|
+
/** The country's first subdivision (state, province, region, county). Optional. */
|
|
41
|
+
STATE = "state",
|
|
42
|
+
/** Optional because not every country issues one. */
|
|
43
|
+
POSTAL_CODE = "postalCode",
|
|
44
|
+
/** ISO 3166-1 alpha-2. Required. */
|
|
45
|
+
COUNTRY = "country"
|
|
46
|
+
}
|
|
47
|
+
/** The two halves of the optional geocode. Each member's value is its key in {@link AddressCoordinates}. */
|
|
48
|
+
export declare enum AddressCoordinatePart {
|
|
49
|
+
LATITUDE = "latitude",
|
|
50
|
+
LONGITUDE = "longitude"
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* The dotted path of every editable part inside an address value — the paths a validation issue is
|
|
54
|
+
* reported at (`city`, `coordinates.longitude`). A form routes each part's error to its own control
|
|
55
|
+
* by these, instead of summarising a nested error as one message for the whole field.
|
|
56
|
+
*/
|
|
57
|
+
export declare function listAddressPartPaths(): string[];
|
|
58
|
+
/**
|
|
59
|
+
* The canonical spelling of one free-text address part: trimmed, with inner whitespace collapsed to a
|
|
60
|
+
* single space. Applied on parse, so a stored value never carries the typist's accidental spacing.
|
|
61
|
+
*/
|
|
62
|
+
export declare function normalizeAddressText(value: string): string;
|
|
63
|
+
/** The canonical spelling of a country code: trimmed and uppercased. */
|
|
64
|
+
export declare function normalizeAddressCountry(value: string): string;
|
|
65
|
+
export declare const AddressCoordinatesSchema: z.ZodObject<{
|
|
66
|
+
latitude: z.ZodNumber;
|
|
67
|
+
longitude: z.ZodNumber;
|
|
68
|
+
}>;
|
|
69
|
+
/**
|
|
70
|
+
* A key under which two SPELLINGS of one address compare equal.
|
|
71
|
+
*
|
|
72
|
+
* Country and postal code are compared exactly after uppercasing (and, for the postal code, removing
|
|
73
|
+
* spaces: `75 002` and `75002` are one code). Every free-text part is compared after case-folding,
|
|
74
|
+
* stripping diacritics and treating any run of punctuation or whitespace as one separator — so
|
|
75
|
+
* `12 Rue de La Paix` and `12 rue de la paix` agree, and `Saint-Étienne` matches `saint etienne`.
|
|
76
|
+
*
|
|
77
|
+
* Coordinates are deliberately NOT part of the key: a geocode describes where a place is, and two
|
|
78
|
+
* geocoders returning slightly different points for one address must not make it two addresses.
|
|
79
|
+
*
|
|
80
|
+
* What it does NOT do, and cannot without a provider (#394): recognise an ABBREVIATION (`rue` vs `r.`),
|
|
81
|
+
* a differently SPLIT value (postal code and city typed into `line1`), or two formats of one street
|
|
82
|
+
* number (`12bis` vs `12 bis`). It recognises spelling, not meaning.
|
|
83
|
+
*/
|
|
84
|
+
export declare function addressComparisonKey(value: Pick<AddressValue, 'line1' | 'line2' | 'city' | 'state' | 'postalCode' | 'country'>): string;
|
|
85
|
+
/** Whether two addresses are the same place spelled differently (see {@link addressComparisonKey}). */
|
|
86
|
+
export declare function isSameAddress(left: Pick<AddressValue, 'line1' | 'line2' | 'city' | 'state' | 'postalCode' | 'country'>, right: Pick<AddressValue, 'line1' | 'line2' | 'city' | 'state' | 'postalCode' | 'country'>): boolean;
|
|
87
|
+
export type AddressSchemaShape = {
|
|
88
|
+
line1: z.ZodString;
|
|
89
|
+
line2: z.ZodOptional<z.ZodString>;
|
|
90
|
+
city: z.ZodString;
|
|
91
|
+
state: z.ZodOptional<z.ZodString>;
|
|
92
|
+
postalCode: z.ZodOptional<z.ZodString>;
|
|
93
|
+
country: z.ZodString;
|
|
94
|
+
coordinates: z.ZodOptional<typeof AddressCoordinatesSchema>;
|
|
95
|
+
};
|
|
96
|
+
/**
|
|
97
|
+
* @wildo_source:part:start zod.factories.address facet:layer:shared facet:family:schema-factory
|
|
98
|
+
*
|
|
99
|
+
* z_address() - Creates a structured postal address field.
|
|
100
|
+
*
|
|
101
|
+
* The value is `{ line1, line2?, city, state?, postalCode?, country, coordinates? }`: a parsed,
|
|
102
|
+
* country-aware value the framework renders with its own form and display fields, instead of an
|
|
103
|
+
* opaque `z.string()` nothing can validate, normalise or compare.
|
|
104
|
+
*
|
|
105
|
+
* - Free-text parts are normalised on parse (trimmed, inner whitespace collapsed).
|
|
106
|
+
* - `country` is an ISO 3166-1 alpha-2 code, uppercased on parse; `countriesAllowed` restricts it.
|
|
107
|
+
* - `coordinates` is an optional `{ latitude, longitude }` pair; `withCoordinates` offers it in the form.
|
|
108
|
+
* - `addressComparisonKey` / `isSameAddress` (same package) tell whether two values are one place
|
|
109
|
+
* spelled differently.
|
|
110
|
+
*
|
|
111
|
+
* An address is personal data. Declare its data category and erasure treatment on the field like any
|
|
112
|
+
* other personal field: this factory does not decide either for you.
|
|
113
|
+
*
|
|
114
|
+
* @example
|
|
115
|
+
* ```typescript
|
|
116
|
+
* import { z_address } from '@wildo-ai/zod-decorators';
|
|
117
|
+
*
|
|
118
|
+
* const shippingAddress = z_address();
|
|
119
|
+
* const siteAddress = z_address({ withCoordinates: true, countriesAllowed: ['FR', 'BE'], defaultCountry: 'FR' });
|
|
120
|
+
* ```
|
|
121
|
+
*/
|
|
122
|
+
export declare function createAddressSchema(options?: AddressSchemaOptions): DecoratedAddressSchema;
|
|
123
|
+
/**
|
|
124
|
+
* Return type for address schemas — includes the decorators applicable to a `ZodObject`.
|
|
125
|
+
*
|
|
126
|
+
* No address-specific UI or SPEC decorator exists yet: the form and display fields render from the
|
|
127
|
+
* metadata alone. Adding one later is additive.
|
|
128
|
+
*/
|
|
129
|
+
export type DecoratedAddressSchema = z.ZodObject<AddressSchemaShape> & {
|
|
130
|
+
[ZodDecorator.IS_DB_INDEXED](): DecoratedAddressSchema;
|
|
131
|
+
[ZodDecorator.IS_HIDDEN](params?: ZodDecorator_ParamsType[ZodDecorator.IS_HIDDEN]): DecoratedAddressSchema;
|
|
132
|
+
[ZodDecorator.IS_NOT_EDITABLE](params?: ZodDecorator_ParamsType[ZodDecorator.IS_NOT_EDITABLE]): DecoratedAddressSchema;
|
|
133
|
+
[ZodDecorator.IS_SUMMARY_FIELD](params?: SummaryFieldParams): DecoratedAddressSchema;
|
|
134
|
+
[ZodDecorator.IS_BACKEND_ONLY](params?: ZodDecorator_ParamsType[ZodDecorator.IS_BACKEND_ONLY]): DecoratedAddressSchema;
|
|
135
|
+
[ZodDecorator.IS_WRITE_ONLY_SECRET](params?: ZodDecorator_ParamsType[ZodDecorator.IS_WRITE_ONLY_SECRET]): DecoratedAddressSchema;
|
|
136
|
+
[ZodDecorator.EXCLUDE_FROM_CREATE](): DecoratedAddressSchema;
|
|
137
|
+
[ZodDecorator.EXCLUDE_FROM_UPDATE](): DecoratedAddressSchema;
|
|
138
|
+
addDecorators(decorators: DecoratorInput[]): DecoratedAddressSchema;
|
|
139
|
+
};
|
|
140
|
+
/**
|
|
141
|
+
* Creates a structured postal address schema. Named z_address to indicate it is a Zod helper exported
|
|
142
|
+
* standalone, like `z_money` and `z_phone`.
|
|
143
|
+
*/
|
|
144
|
+
export declare function z_address(options?: AddressSchemaOptions): DecoratedAddressSchema;
|
|
145
|
+
/** @wildo_source:part:end zod.factories.address */
|
|
146
|
+
//# sourceMappingURL=zod-address.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod-address.d.ts","sourceRoot":"","sources":["../../../src/zod-address.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
// ============================================================================
|
|
2
|
+
// ADDRESS SCHEMA HELPER (#561)
|
|
3
|
+
// ============================================================================
|
|
4
|
+
import { SCHEMA_METADATA, ZodDecorator, } from './zod-decorators.types.js';
|
|
5
|
+
import { z } from 'zod';
|
|
6
|
+
import { addChainableMethods } from './zod.module-override.js';
|
|
7
|
+
/**
|
|
8
|
+
* The parts of an address value, named once so the factory, the form control and the error routing
|
|
9
|
+
* agree. Each member's value is the key it has in {@link AddressValue}.
|
|
10
|
+
*/
|
|
11
|
+
export var AddressPart;
|
|
12
|
+
(function (AddressPart) {
|
|
13
|
+
/** Street and number. Required. */
|
|
14
|
+
AddressPart["LINE1"] = "line1";
|
|
15
|
+
/** Building, floor, apartment. Optional. */
|
|
16
|
+
AddressPart["LINE2"] = "line2";
|
|
17
|
+
/** Town or city. Required. */
|
|
18
|
+
AddressPart["CITY"] = "city";
|
|
19
|
+
/** The country's first subdivision (state, province, region, county). Optional. */
|
|
20
|
+
AddressPart["STATE"] = "state";
|
|
21
|
+
/** Optional because not every country issues one. */
|
|
22
|
+
AddressPart["POSTAL_CODE"] = "postalCode";
|
|
23
|
+
/** ISO 3166-1 alpha-2. Required. */
|
|
24
|
+
AddressPart["COUNTRY"] = "country";
|
|
25
|
+
})(AddressPart || (AddressPart = {}));
|
|
26
|
+
/** The two halves of the optional geocode. Each member's value is its key in {@link AddressCoordinates}. */
|
|
27
|
+
export var AddressCoordinatePart;
|
|
28
|
+
(function (AddressCoordinatePart) {
|
|
29
|
+
AddressCoordinatePart["LATITUDE"] = "latitude";
|
|
30
|
+
AddressCoordinatePart["LONGITUDE"] = "longitude";
|
|
31
|
+
})(AddressCoordinatePart || (AddressCoordinatePart = {}));
|
|
32
|
+
/**
|
|
33
|
+
* The dotted path of every editable part inside an address value — the paths a validation issue is
|
|
34
|
+
* reported at (`city`, `coordinates.longitude`). A form routes each part's error to its own control
|
|
35
|
+
* by these, instead of summarising a nested error as one message for the whole field.
|
|
36
|
+
*/
|
|
37
|
+
export function listAddressPartPaths() {
|
|
38
|
+
return [...Object.values(AddressPart), ...Object.values(AddressCoordinatePart).map((part) => `coordinates.${part}`)];
|
|
39
|
+
}
|
|
40
|
+
const ISO_COUNTRY_CODE_PATTERN = /^[A-Z]{2}$/;
|
|
41
|
+
/**
|
|
42
|
+
* The canonical spelling of one free-text address part: trimmed, with inner whitespace collapsed to a
|
|
43
|
+
* single space. Applied on parse, so a stored value never carries the typist's accidental spacing.
|
|
44
|
+
*/
|
|
45
|
+
export function normalizeAddressText(value) {
|
|
46
|
+
return value.trim().replace(/\s+/g, ' ');
|
|
47
|
+
}
|
|
48
|
+
/** The canonical spelling of a country code: trimmed and uppercased. */
|
|
49
|
+
export function normalizeAddressCountry(value) {
|
|
50
|
+
return value.trim().toUpperCase();
|
|
51
|
+
}
|
|
52
|
+
export const AddressCoordinatesSchema = z.object({
|
|
53
|
+
latitude: z.number().min(-90).max(90).describe('Latitude in decimal degrees, from -90 to 90.'),
|
|
54
|
+
longitude: z.number().min(-180).max(180).describe('Longitude in decimal degrees, from -180 to 180.'),
|
|
55
|
+
});
|
|
56
|
+
/**
|
|
57
|
+
* A key under which two SPELLINGS of one address compare equal.
|
|
58
|
+
*
|
|
59
|
+
* Country and postal code are compared exactly after uppercasing (and, for the postal code, removing
|
|
60
|
+
* spaces: `75 002` and `75002` are one code). Every free-text part is compared after case-folding,
|
|
61
|
+
* stripping diacritics and treating any run of punctuation or whitespace as one separator — so
|
|
62
|
+
* `12 Rue de La Paix` and `12 rue de la paix` agree, and `Saint-Étienne` matches `saint etienne`.
|
|
63
|
+
*
|
|
64
|
+
* Coordinates are deliberately NOT part of the key: a geocode describes where a place is, and two
|
|
65
|
+
* geocoders returning slightly different points for one address must not make it two addresses.
|
|
66
|
+
*
|
|
67
|
+
* What it does NOT do, and cannot without a provider (#394): recognise an ABBREVIATION (`rue` vs `r.`),
|
|
68
|
+
* a differently SPLIT value (postal code and city typed into `line1`), or two formats of one street
|
|
69
|
+
* number (`12bis` vs `12 bis`). It recognises spelling, not meaning.
|
|
70
|
+
*/
|
|
71
|
+
export function addressComparisonKey(value) {
|
|
72
|
+
const fold = (part) => (part ?? '')
|
|
73
|
+
.normalize('NFKD')
|
|
74
|
+
.replace(/[\u0300-\u036f]/g, '')
|
|
75
|
+
.toLowerCase()
|
|
76
|
+
.replace(/[^\p{L}\p{N}]+/gu, ' ')
|
|
77
|
+
.trim();
|
|
78
|
+
const postalCode = (value.postalCode ?? '').replace(/\s+/g, '').toUpperCase();
|
|
79
|
+
return [
|
|
80
|
+
normalizeAddressCountry(value.country),
|
|
81
|
+
postalCode,
|
|
82
|
+
fold(value.city),
|
|
83
|
+
fold(value.state),
|
|
84
|
+
fold(value.line1),
|
|
85
|
+
fold(value.line2),
|
|
86
|
+
].join('|');
|
|
87
|
+
}
|
|
88
|
+
/** Whether two addresses are the same place spelled differently (see {@link addressComparisonKey}). */
|
|
89
|
+
export function isSameAddress(left, right) {
|
|
90
|
+
return addressComparisonKey(left) === addressComparisonKey(right);
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* @wildo_source:part:start zod.factories.address facet:layer:shared facet:family:schema-factory
|
|
94
|
+
*
|
|
95
|
+
* z_address() - Creates a structured postal address field.
|
|
96
|
+
*
|
|
97
|
+
* The value is `{ line1, line2?, city, state?, postalCode?, country, coordinates? }`: a parsed,
|
|
98
|
+
* country-aware value the framework renders with its own form and display fields, instead of an
|
|
99
|
+
* opaque `z.string()` nothing can validate, normalise or compare.
|
|
100
|
+
*
|
|
101
|
+
* - Free-text parts are normalised on parse (trimmed, inner whitespace collapsed).
|
|
102
|
+
* - `country` is an ISO 3166-1 alpha-2 code, uppercased on parse; `countriesAllowed` restricts it.
|
|
103
|
+
* - `coordinates` is an optional `{ latitude, longitude }` pair; `withCoordinates` offers it in the form.
|
|
104
|
+
* - `addressComparisonKey` / `isSameAddress` (same package) tell whether two values are one place
|
|
105
|
+
* spelled differently.
|
|
106
|
+
*
|
|
107
|
+
* An address is personal data. Declare its data category and erasure treatment on the field like any
|
|
108
|
+
* other personal field: this factory does not decide either for you.
|
|
109
|
+
*
|
|
110
|
+
* @example
|
|
111
|
+
* ```typescript
|
|
112
|
+
* import { z_address } from '@wildo-ai/zod-decorators';
|
|
113
|
+
*
|
|
114
|
+
* const shippingAddress = z_address();
|
|
115
|
+
* const siteAddress = z_address({ withCoordinates: true, countriesAllowed: ['FR', 'BE'], defaultCountry: 'FR' });
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
export function createAddressSchema(options = {}) {
|
|
119
|
+
const countriesAllowed = options.countriesAllowed?.map(normalizeAddressCountry);
|
|
120
|
+
for (const code of countriesAllowed ?? []) {
|
|
121
|
+
if (!ISO_COUNTRY_CODE_PATTERN.test(code)) {
|
|
122
|
+
throw new Error(`[z_address] countriesAllowed contains "${code}", which is not an ISO 3166-1 alpha-2 code.`);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
const defaultCountry = options.defaultCountry === undefined ? undefined : normalizeAddressCountry(options.defaultCountry);
|
|
126
|
+
if (defaultCountry !== undefined) {
|
|
127
|
+
// Refused at DECLARATION, not at first render: a form pre-selecting a country the value may not
|
|
128
|
+
// name would be an error the author could only discover by filling the form.
|
|
129
|
+
if (!ISO_COUNTRY_CODE_PATTERN.test(defaultCountry)) {
|
|
130
|
+
throw new Error(`[z_address] defaultCountry "${options.defaultCountry}" is not an ISO 3166-1 alpha-2 code.`);
|
|
131
|
+
}
|
|
132
|
+
if (countriesAllowed && countriesAllowed.length > 0 && !countriesAllowed.includes(defaultCountry)) {
|
|
133
|
+
throw new Error(`[z_address] defaultCountry "${defaultCountry}" is not among countriesAllowed (${countriesAllowed.join(', ')}).`);
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
const text = () => z.string().overwrite(normalizeAddressText);
|
|
137
|
+
let country = z.string()
|
|
138
|
+
.overwrite(normalizeAddressCountry)
|
|
139
|
+
.regex(ISO_COUNTRY_CODE_PATTERN, { error: 'Country must be an ISO 3166-1 alpha-2 code' });
|
|
140
|
+
if (countriesAllowed && countriesAllowed.length > 0) {
|
|
141
|
+
country = country.refine((code) => countriesAllowed.includes(code), {
|
|
142
|
+
error: `Country must be one of: ${countriesAllowed.join(', ')}`,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
const addressSchema = z.object({
|
|
146
|
+
line1: text().min(1, { error: 'Address line 1 is required' }).max(100).describe("The first line of the street address."),
|
|
147
|
+
line2: text().max(100).optional().describe("The second line of the street address, when there is one."),
|
|
148
|
+
city: text().min(1, { error: 'City is required' }).max(50).describe("The city or locality."),
|
|
149
|
+
state: text().max(50).optional().describe("The region, state, province or county: whatever the country calls its first subdivision."),
|
|
150
|
+
postalCode: text().max(20).optional().describe("The postal code, when the country issues one."),
|
|
151
|
+
country: country.describe("The country, as an ISO 3166-1 alpha-2 code in upper case."),
|
|
152
|
+
coordinates: AddressCoordinatesSchema.optional().describe("An optional geocode. It does not take part in comparing two addresses."),
|
|
153
|
+
});
|
|
154
|
+
const addressMetadata = {
|
|
155
|
+
isAddress: true,
|
|
156
|
+
withCoordinates: options.withCoordinates === true,
|
|
157
|
+
...(countriesAllowed && countriesAllowed.length > 0 && { countriesAllowed }),
|
|
158
|
+
...(defaultCountry !== undefined && { defaultCountry }),
|
|
159
|
+
};
|
|
160
|
+
const existingMetadata = addressSchema[SCHEMA_METADATA] || {};
|
|
161
|
+
addressSchema[SCHEMA_METADATA] = {
|
|
162
|
+
...existingMetadata,
|
|
163
|
+
addressConfig: addressMetadata,
|
|
164
|
+
};
|
|
165
|
+
addChainableMethods(addressSchema);
|
|
166
|
+
return addressSchema;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Creates a structured postal address schema. Named z_address to indicate it is a Zod helper exported
|
|
170
|
+
* standalone, like `z_money` and `z_phone`.
|
|
171
|
+
*/
|
|
172
|
+
export function z_address(options) {
|
|
173
|
+
return createAddressSchema(options);
|
|
174
|
+
}
|
|
175
|
+
/** @wildo_source:part:end zod.factories.address */
|
|
176
|
+
//# sourceMappingURL=zod-address.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod-address.js","sourceRoot":"","sources":["../../../src/zod-address.ts"],"names":[],"mappings":"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","sourcesContent":["// ============================================================================\n// ADDRESS SCHEMA HELPER (#561)\n// ============================================================================\n\nimport {\n AddressSchemaMetadata,\n AddressSchemaOptions,\n CustomFieldMetadata,\n DecoratorInput,\n SCHEMA_METADATA,\n SummaryFieldParams,\n ZodDecorator,\n ZodDecorator_ParamsType,\n} from './zod-decorators.types';\nimport { z } from 'zod';\nimport { addChainableMethods } from './zod.module-override';\n\n/** A point on the globe, in decimal degrees. */\nexport interface AddressCoordinates {\n /** -90 (south pole) to 90 (north pole). */\n latitude: number;\n /** -180 to 180. */\n longitude: number;\n}\n\n/**\n * A structured postal address.\n *\n * The part names are the ones the framework's existing `AddressSchema` already uses (organisation\n * profiles), so an application meets ONE address vocabulary rather than two. `postalCode` is optional\n * because not every country issues one.\n */\nexport interface AddressValue {\n line1: string;\n line2?: string;\n city: string;\n /** Region, state, province or county — whatever the country calls its first subdivision. */\n state?: string;\n postalCode?: string;\n /** ISO 3166-1 alpha-2, stored uppercase. */\n country: string;\n /** An optional geocode. It does NOT take part in identity — see {@link addressComparisonKey}. */\n coordinates?: AddressCoordinates;\n}\n\n/**\n * The parts of an address value, named once so the factory, the form control and the error routing\n * agree. Each member's value is the key it has in {@link AddressValue}.\n */\nexport enum AddressPart {\n /** Street and number. Required. */\n LINE1 = 'line1',\n /** Building, floor, apartment. Optional. */\n LINE2 = 'line2',\n /** Town or city. Required. */\n CITY = 'city',\n /** The country's first subdivision (state, province, region, county). Optional. */\n STATE = 'state',\n /** Optional because not every country issues one. */\n POSTAL_CODE = 'postalCode',\n /** ISO 3166-1 alpha-2. Required. */\n COUNTRY = 'country',\n}\n\n/** The two halves of the optional geocode. Each member's value is its key in {@link AddressCoordinates}. */\nexport enum AddressCoordinatePart {\n LATITUDE = 'latitude',\n LONGITUDE = 'longitude',\n}\n\n/**\n * The dotted path of every editable part inside an address value — the paths a validation issue is\n * reported at (`city`, `coordinates.longitude`). A form routes each part's error to its own control\n * by these, instead of summarising a nested error as one message for the whole field.\n */\nexport function listAddressPartPaths(): string[] {\n return [...Object.values(AddressPart), ...Object.values(AddressCoordinatePart).map((part) => `coordinates.${part}`)];\n}\n\nconst ISO_COUNTRY_CODE_PATTERN = /^[A-Z]{2}$/;\n\n/**\n * The canonical spelling of one free-text address part: trimmed, with inner whitespace collapsed to a\n * single space. Applied on parse, so a stored value never carries the typist's accidental spacing.\n */\nexport function normalizeAddressText(value: string): string {\n return value.trim().replace(/\\s+/g, ' ');\n}\n\n/** The canonical spelling of a country code: trimmed and uppercased. */\nexport function normalizeAddressCountry(value: string): string {\n return value.trim().toUpperCase();\n}\n\nexport const AddressCoordinatesSchema: z.ZodObject<{ latitude: z.ZodNumber; longitude: z.ZodNumber }> = z.object({\n latitude: z.number().min(-90).max(90).describe('Latitude in decimal degrees, from -90 to 90.'),\n longitude: z.number().min(-180).max(180).describe('Longitude in decimal degrees, from -180 to 180.'),\n});\n\n/**\n * A key under which two SPELLINGS of one address compare equal.\n *\n * Country and postal code are compared exactly after uppercasing (and, for the postal code, removing\n * spaces: `75 002` and `75002` are one code). Every free-text part is compared after case-folding,\n * stripping diacritics and treating any run of punctuation or whitespace as one separator — so\n * `12 Rue de La Paix` and `12 rue de la paix` agree, and `Saint-Étienne` matches `saint etienne`.\n *\n * Coordinates are deliberately NOT part of the key: a geocode describes where a place is, and two\n * geocoders returning slightly different points for one address must not make it two addresses.\n *\n * What it does NOT do, and cannot without a provider (#394): recognise an ABBREVIATION (`rue` vs `r.`),\n * a differently SPLIT value (postal code and city typed into `line1`), or two formats of one street\n * number (`12bis` vs `12 bis`). It recognises spelling, not meaning.\n */\nexport function addressComparisonKey(\n value: Pick<AddressValue, 'line1' | 'line2' | 'city' | 'state' | 'postalCode' | 'country'>,\n): string {\n const fold = (part: string | undefined): string => (part ?? '')\n .normalize('NFKD')\n .replace(/[\\u0300-\\u036f]/g, '')\n .toLowerCase()\n .replace(/[^\\p{L}\\p{N}]+/gu, ' ')\n .trim();\n const postalCode = (value.postalCode ?? '').replace(/\\s+/g, '').toUpperCase();\n return [\n normalizeAddressCountry(value.country),\n postalCode,\n fold(value.city),\n fold(value.state),\n fold(value.line1),\n fold(value.line2),\n ].join('|');\n}\n\n/** Whether two addresses are the same place spelled differently (see {@link addressComparisonKey}). */\nexport function isSameAddress(\n left: Pick<AddressValue, 'line1' | 'line2' | 'city' | 'state' | 'postalCode' | 'country'>,\n right: Pick<AddressValue, 'line1' | 'line2' | 'city' | 'state' | 'postalCode' | 'country'>,\n): boolean {\n return addressComparisonKey(left) === addressComparisonKey(right);\n}\n\nexport type AddressSchemaShape = {\n line1: z.ZodString;\n line2: z.ZodOptional<z.ZodString>;\n city: z.ZodString;\n state: z.ZodOptional<z.ZodString>;\n postalCode: z.ZodOptional<z.ZodString>;\n country: z.ZodString;\n coordinates: z.ZodOptional<typeof AddressCoordinatesSchema>;\n};\n\n/**\n * @wildo_source:part:start zod.factories.address facet:layer:shared facet:family:schema-factory\n *\n * z_address() - Creates a structured postal address field.\n *\n * The value is `{ line1, line2?, city, state?, postalCode?, country, coordinates? }`: a parsed,\n * country-aware value the framework renders with its own form and display fields, instead of an\n * opaque `z.string()` nothing can validate, normalise or compare.\n *\n * - Free-text parts are normalised on parse (trimmed, inner whitespace collapsed).\n * - `country` is an ISO 3166-1 alpha-2 code, uppercased on parse; `countriesAllowed` restricts it.\n * - `coordinates` is an optional `{ latitude, longitude }` pair; `withCoordinates` offers it in the form.\n * - `addressComparisonKey` / `isSameAddress` (same package) tell whether two values are one place\n * spelled differently.\n *\n * An address is personal data. Declare its data category and erasure treatment on the field like any\n * other personal field: this factory does not decide either for you.\n *\n * @example\n * ```typescript\n * import { z_address } from '@wildo-ai/zod-decorators';\n *\n * const shippingAddress = z_address();\n * const siteAddress = z_address({ withCoordinates: true, countriesAllowed: ['FR', 'BE'], defaultCountry: 'FR' });\n * ```\n */\nexport function createAddressSchema(options: AddressSchemaOptions = {}): DecoratedAddressSchema {\n const countriesAllowed = options.countriesAllowed?.map(normalizeAddressCountry);\n for (const code of countriesAllowed ?? []) {\n if (!ISO_COUNTRY_CODE_PATTERN.test(code)) {\n throw new Error(`[z_address] countriesAllowed contains \"${code}\", which is not an ISO 3166-1 alpha-2 code.`);\n }\n }\n const defaultCountry = options.defaultCountry === undefined ? undefined : normalizeAddressCountry(options.defaultCountry);\n if (defaultCountry !== undefined) {\n // Refused at DECLARATION, not at first render: a form pre-selecting a country the value may not\n // name would be an error the author could only discover by filling the form.\n if (!ISO_COUNTRY_CODE_PATTERN.test(defaultCountry)) {\n throw new Error(`[z_address] defaultCountry \"${options.defaultCountry}\" is not an ISO 3166-1 alpha-2 code.`);\n }\n if (countriesAllowed && countriesAllowed.length > 0 && !countriesAllowed.includes(defaultCountry)) {\n throw new Error(`[z_address] defaultCountry \"${defaultCountry}\" is not among countriesAllowed (${countriesAllowed.join(', ')}).`);\n }\n }\n\n const text = (): z.ZodString => z.string().overwrite(normalizeAddressText);\n let country: z.ZodString = z.string()\n .overwrite(normalizeAddressCountry)\n .regex(ISO_COUNTRY_CODE_PATTERN, { error: 'Country must be an ISO 3166-1 alpha-2 code' });\n if (countriesAllowed && countriesAllowed.length > 0) {\n country = country.refine((code) => countriesAllowed.includes(code), {\n error: `Country must be one of: ${countriesAllowed.join(', ')}`,\n });\n }\n\n const addressSchema = z.object({\n line1: text().min(1, { error: 'Address line 1 is required' }).max(100).describe(\"The first line of the street address.\"),\n line2: text().max(100).optional().describe(\"The second line of the street address, when there is one.\"),\n city: text().min(1, { error: 'City is required' }).max(50).describe(\"The city or locality.\"),\n state: text().max(50).optional().describe(\"The region, state, province or county: whatever the country calls its first subdivision.\"),\n postalCode: text().max(20).optional().describe(\"The postal code, when the country issues one.\"),\n country: country.describe(\"The country, as an ISO 3166-1 alpha-2 code in upper case.\"),\n coordinates: AddressCoordinatesSchema.optional().describe(\"An optional geocode. It does not take part in comparing two addresses.\"),\n });\n\n const addressMetadata: AddressSchemaMetadata = {\n isAddress: true,\n withCoordinates: options.withCoordinates === true,\n ...(countriesAllowed && countriesAllowed.length > 0 && { countriesAllowed }),\n ...(defaultCountry !== undefined && { defaultCountry }),\n };\n\n const existingMetadata: CustomFieldMetadata = (addressSchema as any)[SCHEMA_METADATA] || {};\n (addressSchema as any)[SCHEMA_METADATA] = {\n ...existingMetadata,\n addressConfig: addressMetadata,\n };\n\n addChainableMethods(addressSchema);\n\n return addressSchema as DecoratedAddressSchema;\n}\n\n/**\n * Return type for address schemas — includes the decorators applicable to a `ZodObject`.\n *\n * No address-specific UI or SPEC decorator exists yet: the form and display fields render from the\n * metadata alone. Adding one later is additive.\n */\nexport type DecoratedAddressSchema = z.ZodObject<AddressSchemaShape> & {\n [ZodDecorator.IS_DB_INDEXED](): DecoratedAddressSchema;\n [ZodDecorator.IS_HIDDEN](params?: ZodDecorator_ParamsType[ZodDecorator.IS_HIDDEN]): DecoratedAddressSchema;\n [ZodDecorator.IS_NOT_EDITABLE](params?: ZodDecorator_ParamsType[ZodDecorator.IS_NOT_EDITABLE]): DecoratedAddressSchema;\n [ZodDecorator.IS_SUMMARY_FIELD](params?: SummaryFieldParams): DecoratedAddressSchema;\n [ZodDecorator.IS_BACKEND_ONLY](params?: ZodDecorator_ParamsType[ZodDecorator.IS_BACKEND_ONLY]): DecoratedAddressSchema;\n [ZodDecorator.IS_WRITE_ONLY_SECRET](params?: ZodDecorator_ParamsType[ZodDecorator.IS_WRITE_ONLY_SECRET]): DecoratedAddressSchema;\n [ZodDecorator.EXCLUDE_FROM_CREATE](): DecoratedAddressSchema;\n [ZodDecorator.EXCLUDE_FROM_UPDATE](): DecoratedAddressSchema;\n addDecorators(decorators: DecoratorInput[]): DecoratedAddressSchema;\n};\n\n/**\n * Creates a structured postal address schema. Named z_address to indicate it is a Zod helper exported\n * standalone, like `z_money` and `z_phone`.\n */\nexport function z_address(options?: AddressSchemaOptions): DecoratedAddressSchema {\n return createAddressSchema(options);\n}\n/** @wildo_source:part:end zod.factories.address */\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zod-bigdecimal.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"zod-bigdecimal.d.ts","sourceRoot":"","sources":["../../../src/zod-bigdecimal.ts"],"names":[],"mappings":"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"}
|
package/dist/esm/zod-code.d.ts
CHANGED
|
@@ -57,6 +57,8 @@ export type DecoratedCodeSchema = z.ZodObject<{
|
|
|
57
57
|
language: z.ZodString;
|
|
58
58
|
}> & {
|
|
59
59
|
[ZodDecorator.IS_DB_INDEXED](): DecoratedCodeSchema;
|
|
60
|
+
/** Installed at runtime with the other chainable methods; declared here so an authored `.codeUI(…)` typechecks. */
|
|
61
|
+
[ZodDecorator.CODE_UI](params?: ZodDecorator_ParamsType[ZodDecorator.CODE_UI]): DecoratedCodeSchema;
|
|
60
62
|
[ZodDecorator.IS_HIDDEN](params?: ZodDecorator_ParamsType[ZodDecorator.IS_HIDDEN]): DecoratedCodeSchema;
|
|
61
63
|
[ZodDecorator.IS_NOT_EDITABLE](params?: ZodDecorator_ParamsType[ZodDecorator.IS_NOT_EDITABLE]): DecoratedCodeSchema;
|
|
62
64
|
addDecorators(decorators: DecoratorInput[]): DecoratedCodeSchema;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zod-code.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"zod-code.d.ts","sourceRoot":"","sources":["../../../src/zod-code.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,cAAc,EAA4D,iBAAiB,EAAE,YAAY,EAAE,YAAY,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAC1L,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAGxB;;GAEG;AACH,MAAM,WAAW,SAAS;IACxB,uBAAuB;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,kEAAkE;IAClE,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;;GAGG;AACH,eAAO,MAAM,mBAAmB,ySAOtB,CAAC;AAEX;;GAEG;AACH,eAAO,MAAM,eAAe,EAAE,CAAC,CAAC,SAAS,CAAC;IAAE,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC;IAAC,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAA;CAAE,CAGvF,CAAC;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,OAAO,GAAE,iBAAsB,GAC9B,mBAAmB,CA6CrB;AAED;;;GAGG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,CAAC,SAAS,CAAC;IAC5C,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC;IACrB,QAAQ,EAAE,CAAC,CAAC,SAAS,CAAC;CACvB,CAAC,GAAG;IACH,CAAC,YAAY,CAAC,aAAa,CAAC,IAAI,mBAAmB,CAAC;IACpD,mHAAmH;IACnH,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,EAAE,uBAAuB,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,mBAAmB,CAAC;IACpG,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,EAAE,uBAAuB,CAAC,YAAY,CAAC,SAAS,CAAC,GAAG,mBAAmB,CAAC;IACxG,CAAC,YAAY,CAAC,eAAe,CAAC,CAAC,MAAM,CAAC,EAAE,uBAAuB,CAAC,YAAY,CAAC,eAAe,CAAC,GAAG,mBAAmB,CAAC;IACpH,aAAa,CAAC,UAAU,EAAE,cAAc,EAAE,GAAG,mBAAmB,CAAC;CAClE,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,wBAAgB,MAAM,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,mBAAmB,CAEvE;AACD,gDAAgD;AAMhD;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,YAAY,GAAG,MAAM,CAoCrE;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,MAAM,GAAG,QAAQ,IAAI,OAAO,mBAAmB,CAAC,MAAM,CAAC,CAEjG"}
|
package/dist/esm/zod-code.js
CHANGED
|
@@ -20,8 +20,8 @@ export const CommonCodeLanguages = [
|
|
|
20
20
|
* Zod schema for CodeValue.
|
|
21
21
|
*/
|
|
22
22
|
export const CodeValueSchema = z.object({
|
|
23
|
-
content: z.string(),
|
|
24
|
-
language: z.string(),
|
|
23
|
+
content: z.string().describe("The code itself."),
|
|
24
|
+
language: z.string().describe("The language the code is written in, for highlighting and validation."),
|
|
25
25
|
});
|
|
26
26
|
/**
|
|
27
27
|
* @wildo_source:part:start zod.factories.code facet:layer:shared facet:family:schema-factory
|
|
@@ -65,8 +65,8 @@ export function createCodeSchema(options = {}) {
|
|
|
65
65
|
const languageSchema = z.string();
|
|
66
66
|
// Create the code object schema
|
|
67
67
|
const codeSchema = z.object({
|
|
68
|
-
content: contentSchema,
|
|
69
|
-
language: languageSchema,
|
|
68
|
+
content: contentSchema.describe("The code itself."),
|
|
69
|
+
language: languageSchema.describe("The language the code is written in, for highlighting and validation."),
|
|
70
70
|
});
|
|
71
71
|
const codeMetadata = {
|
|
72
72
|
isCode: true,
|
package/dist/esm/zod-code.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zod-code.js","sourceRoot":"","sources":["../../../src/zod-code.ts"],"names":[],"mappings":"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","sourcesContent":["\n// ============================================================================\n// CODE SCHEMA HELPER\n// ============================================================================\n\nimport { DecoratorInput, SCHEMA_METADATA, CustomFieldMetadata, CodeSchemaMetadata, CodeSchemaOptions, CodeLanguage, ZodDecorator, ZodDecorator_ParamsType } from \"./zod-decorators.types\";\nimport { z } from \"zod\";\nimport { addChainableMethods } from \"./zod.module-override\";\n\n/**\n * Code value type - represents a code snippet with language information.\n */\nexport interface CodeValue {\n /** The code content */\n content: string;\n /** Programming language for syntax highlighting and validation */\n language: string;\n}\n\n/**\n * Common programming languages for code schema language field.\n * Can be extended with any string value.\n */\nexport const CommonCodeLanguages = [\n 'javascript', 'typescript', 'python', 'java', 'csharp', 'cpp', 'c',\n 'go', 'rust', 'ruby', 'php', 'swift', 'kotlin', 'scala',\n 'html', 'css', 'scss', 'less', 'json', 'yaml', 'xml', 'markdown',\n 'sql', 'graphql', 'bash', 'shell', 'powershell',\n 'dockerfile', 'nginx', 'apache',\n 'plaintext'\n] as const;\n\n/**\n * Zod schema for CodeValue.\n */\nexport const CodeValueSchema: z.ZodObject<{ content: z.ZodString; language: z.ZodString }> = z.object({\n content: z.string(),\n language: z.string(),\n});\n\n/**\n * @wildo_source:part:start zod.factories.code facet:layer:shared facet:family:schema-factory\n *\n * z_code() - Creates code schemas for code snippets with language.\n *\n * @example\n * ```typescript\n * import { z_code } from '@wildo-ai/zod-decorators';\n *\n * const snippet = z_code();\n * const restrictedCode = z_code({\n * allowedLanguages: ['javascript', 'typescript', 'python'],\n * maxLength: 10000\n * });\n *\n * // UI props are now set via .codeUI():\n * z_code().codeUI({ defaultLanguage: 'javascript', syntaxHighlighting: true })\n * z_code().codeUI({ display: { showLineNumbers: true }, edit: { showLineNumbers: false } })\n * ```\n */\n\n/**\n * Creates a code schema with metadata for detection and form component rendering.\n *\n * @param options - Configuration options for code field\n * @returns A Zod object schema with metadata for code detection\n */\nexport function createCodeSchema(\n options: CodeSchemaOptions = {}\n): DecoratedCodeSchema {\n const {\n allowedLanguages,\n maxLength,\n minLength,\n } = options;\n\n // Create the content schema with optional length constraints\n let contentSchema = z.string();\n if (minLength !== undefined) {\n contentSchema = contentSchema.min(minLength);\n }\n if (maxLength !== undefined) {\n contentSchema = contentSchema.max(maxLength);\n }\n\n // Language is stored as a string. Allowed languages restriction is enforced\n // through codeConfig.allowedLanguages metadata - UI components read this\n // to filter available options, same pattern as money currencies.\n const languageSchema = z.string();\n\n // Create the code object schema\n const codeSchema = z.object({\n content: contentSchema,\n language: languageSchema,\n });\n\n const codeMetadata: CodeSchemaMetadata = {\n isCode: true,\n ...(allowedLanguages !== undefined && { allowedLanguages }),\n ...(maxLength !== undefined && { maxLength }),\n ...(minLength !== undefined && { minLength }),\n };\n\n // Initialize or extend SCHEMA_METADATA with code config\n const existingMetadata: CustomFieldMetadata = (codeSchema as any)[SCHEMA_METADATA] || {};\n (codeSchema as any)[SCHEMA_METADATA] = {\n ...existingMetadata,\n codeConfig: codeMetadata,\n };\n\n // Add chainable decorator methods to the code schema instance\n addChainableMethods(codeSchema);\n\n return codeSchema as unknown as DecoratedCodeSchema;\n}\n\n/**\n * Return type for code schemas - includes decorator methods.\n * IS_DB_INDEXED will index internal fields (content, language) for query optimization.\n */\nexport type DecoratedCodeSchema = z.ZodObject<{\n content: z.ZodString;\n language: z.ZodString;\n}> & {\n [ZodDecorator.IS_DB_INDEXED](): DecoratedCodeSchema;\n [ZodDecorator.IS_HIDDEN](params?: ZodDecorator_ParamsType[ZodDecorator.IS_HIDDEN]): DecoratedCodeSchema;\n [ZodDecorator.IS_NOT_EDITABLE](params?: ZodDecorator_ParamsType[ZodDecorator.IS_NOT_EDITABLE]): DecoratedCodeSchema;\n addDecorators(decorators: DecoratorInput[]): DecoratedCodeSchema;\n};\n\n/**\n * Creates a code schema for code snippets with language information.\n * Named z_code to indicate it's a Zod helper function exported standalone.\n *\n * Code values are stored as: { content: string, language: string }\n * - content: The actual code text\n * - language: Programming language identifier for syntax highlighting\n *\n * @example\n * ```typescript\n * import { z_code } from '@wildo-ai/zod-decorators';\n *\n * // Simple usage\n * z_code() // All languages, default 'plaintext'\n *\n * // With options (structural only)\n * z_code({ allowedLanguages: ['javascript', 'typescript'] })\n * z_code({ maxLength: 5000 })\n *\n * // UI props via .codeUI()\n * z_code().codeUI({ defaultLanguage: 'typescript' })\n * z_code().codeUI({ display: { showLineNumbers: false } })\n * ```\n */\nexport function z_code(options?: CodeSchemaOptions): DecoratedCodeSchema {\n return createCodeSchema(options);\n}\n/** @wildo_source:part:end zod.factories.code */\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Get the display name for a code language.\n */\nexport function getLanguageDisplayName(language: CodeLanguage): string {\n const displayNames: Record<string, string> = {\n javascript: 'JavaScript',\n typescript: 'TypeScript',\n python: 'Python',\n java: 'Java',\n csharp: 'C#',\n cpp: 'C++',\n c: 'C',\n go: 'Go',\n rust: 'Rust',\n ruby: 'Ruby',\n php: 'PHP',\n swift: 'Swift',\n kotlin: 'Kotlin',\n scala: 'Scala',\n html: 'HTML',\n css: 'CSS',\n scss: 'SCSS',\n less: 'Less',\n json: 'JSON',\n yaml: 'YAML',\n xml: 'XML',\n markdown: 'Markdown',\n sql: 'SQL',\n graphql: 'GraphQL',\n bash: 'Bash',\n shell: 'Shell',\n powershell: 'PowerShell',\n dockerfile: 'Dockerfile',\n nginx: 'Nginx',\n apache: 'Apache',\n plaintext: 'Plain Text',\n };\n\n return displayNames[language] || language;\n}\n\n/**\n * Check if a language is in the common languages list.\n */\nexport function isCommonLanguage(language: string): language is typeof CommonCodeLanguages[number] {\n return CommonCodeLanguages.includes(language as any);\n}\n\n"]}
|
|
1
|
+
{"version":3,"file":"zod-code.js","sourceRoot":"","sources":["../../../src/zod-code.ts"],"names":[],"mappings":"AACA,+EAA+E;AAC/E,qBAAqB;AACrB,+EAA+E;AAE/E,OAAO,EAAkB,eAAe,EAA4E,YAAY,EAA2B,MAAM,wBAAwB,CAAC;AAC1L,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAY5D;;;GAGG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;IACjC,YAAY,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,GAAG;IAClE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO;IACvD,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU;IAChE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,YAAY;IAC/C,YAAY,EAAE,OAAO,EAAE,QAAQ;IAC/B,WAAW;CACH,CAAC;AAEX;;GAEG;AACH,MAAM,CAAC,MAAM,eAAe,GAAiE,CAAC,CAAC,MAAM,CAAC;IACpG,OAAO,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,CAAC;IAChD,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,uEAAuE,CAAC;CACvG,CAAC,CAAC;AAEH;;;;;;;;;;;;;;;;;;;GAmBG;AAEH;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,UAA6B,EAAE;IAE/B,MAAM,EACJ,gBAAgB,EAChB,SAAS,EACT,SAAS,GACV,GAAG,OAAO,CAAC;IAEZ,6DAA6D;IAC7D,IAAI,aAAa,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;IAC/B,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;IACD,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;QAC5B,aAAa,GAAG,aAAa,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/C,CAAC;IAED,4EAA4E;IAC5E,yEAAyE;IACzE,iEAAiE;IACjE,MAAM,cAAc,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;IAElC,gCAAgC;IAChC,MAAM,UAAU,GAAG,CAAC,CAAC,MAAM,CAAC;QAC1B,OAAO,EAAE,aAAa,CAAC,QAAQ,CAAC,kBAAkB,CAAC;QACnD,QAAQ,EAAE,cAAc,CAAC,QAAQ,CAAC,uEAAuE,CAAC;KAC3G,CAAC,CAAC;IAEH,MAAM,YAAY,GAAuB;QACvC,MAAM,EAAE,IAAI;QACZ,GAAG,CAAC,gBAAgB,KAAK,SAAS,IAAI,EAAE,gBAAgB,EAAE,CAAC;QAC3D,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC;QAC7C,GAAG,CAAC,SAAS,KAAK,SAAS,IAAI,EAAE,SAAS,EAAE,CAAC;KAC9C,CAAC;IAEF,wDAAwD;IACxD,MAAM,gBAAgB,GAAyB,UAAkB,CAAC,eAAe,CAAC,IAAI,EAAE,CAAC;IACxF,UAAkB,CAAC,eAAe,CAAC,GAAG;QACrC,GAAG,gBAAgB;QACnB,UAAU,EAAE,YAAY;KACzB,CAAC;IAEF,8DAA8D;IAC9D,mBAAmB,CAAC,UAAU,CAAC,CAAC;IAEhC,OAAO,UAA4C,CAAC;AACtD,CAAC;AAkBD;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AACH,MAAM,UAAU,MAAM,CAAC,OAA2B;IAChD,OAAO,gBAAgB,CAAC,OAAO,CAAC,CAAC;AACnC,CAAC;AACD,gDAAgD;AAEhD,+EAA+E;AAC/E,oBAAoB;AACpB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAAC,QAAsB;IAC3D,MAAM,YAAY,GAA2B;QAC3C,UAAU,EAAE,YAAY;QACxB,UAAU,EAAE,YAAY;QACxB,MAAM,EAAE,QAAQ;QAChB,IAAI,EAAE,MAAM;QACZ,MAAM,EAAE,IAAI;QACZ,GAAG,EAAE,KAAK;QACV,CAAC,EAAE,GAAG;QACN,EAAE,EAAE,IAAI;QACR,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,KAAK;QACV,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,QAAQ;QAChB,KAAK,EAAE,OAAO;QACd,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,KAAK;QACV,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,MAAM;QACZ,IAAI,EAAE,MAAM;QACZ,GAAG,EAAE,KAAK;QACV,QAAQ,EAAE,UAAU;QACpB,GAAG,EAAE,KAAK;QACV,OAAO,EAAE,SAAS;QAClB,IAAI,EAAE,MAAM;QACZ,KAAK,EAAE,OAAO;QACd,UAAU,EAAE,YAAY;QACxB,UAAU,EAAE,YAAY;QACxB,KAAK,EAAE,OAAO;QACd,MAAM,EAAE,QAAQ;QAChB,SAAS,EAAE,YAAY;KACxB,CAAC;IAEF,OAAO,YAAY,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC;AAC5C,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,QAAgB;IAC/C,OAAO,mBAAmB,CAAC,QAAQ,CAAC,QAAe,CAAC,CAAC;AACvD,CAAC","sourcesContent":["\n// ============================================================================\n// CODE SCHEMA HELPER\n// ============================================================================\n\nimport { DecoratorInput, SCHEMA_METADATA, CustomFieldMetadata, CodeSchemaMetadata, CodeSchemaOptions, CodeLanguage, ZodDecorator, ZodDecorator_ParamsType } from \"./zod-decorators.types\";\nimport { z } from \"zod\";\nimport { addChainableMethods } from \"./zod.module-override\";\n\n/**\n * Code value type - represents a code snippet with language information.\n */\nexport interface CodeValue {\n /** The code content */\n content: string;\n /** Programming language for syntax highlighting and validation */\n language: string;\n}\n\n/**\n * Common programming languages for code schema language field.\n * Can be extended with any string value.\n */\nexport const CommonCodeLanguages = [\n 'javascript', 'typescript', 'python', 'java', 'csharp', 'cpp', 'c',\n 'go', 'rust', 'ruby', 'php', 'swift', 'kotlin', 'scala',\n 'html', 'css', 'scss', 'less', 'json', 'yaml', 'xml', 'markdown',\n 'sql', 'graphql', 'bash', 'shell', 'powershell',\n 'dockerfile', 'nginx', 'apache',\n 'plaintext'\n] as const;\n\n/**\n * Zod schema for CodeValue.\n */\nexport const CodeValueSchema: z.ZodObject<{ content: z.ZodString; language: z.ZodString }> = z.object({\n content: z.string().describe(\"The code itself.\"),\n language: z.string().describe(\"The language the code is written in, for highlighting and validation.\"),\n});\n\n/**\n * @wildo_source:part:start zod.factories.code facet:layer:shared facet:family:schema-factory\n *\n * z_code() - Creates code schemas for code snippets with language.\n *\n * @example\n * ```typescript\n * import { z_code } from '@wildo-ai/zod-decorators';\n *\n * const snippet = z_code();\n * const restrictedCode = z_code({\n * allowedLanguages: ['javascript', 'typescript', 'python'],\n * maxLength: 10000\n * });\n *\n * // UI props are now set via .codeUI():\n * z_code().codeUI({ defaultLanguage: 'javascript', syntaxHighlighting: true })\n * z_code().codeUI({ display: { showLineNumbers: true }, edit: { showLineNumbers: false } })\n * ```\n */\n\n/**\n * Creates a code schema with metadata for detection and form component rendering.\n *\n * @param options - Configuration options for code field\n * @returns A Zod object schema with metadata for code detection\n */\nexport function createCodeSchema(\n options: CodeSchemaOptions = {}\n): DecoratedCodeSchema {\n const {\n allowedLanguages,\n maxLength,\n minLength,\n } = options;\n\n // Create the content schema with optional length constraints\n let contentSchema = z.string();\n if (minLength !== undefined) {\n contentSchema = contentSchema.min(minLength);\n }\n if (maxLength !== undefined) {\n contentSchema = contentSchema.max(maxLength);\n }\n\n // Language is stored as a string. Allowed languages restriction is enforced\n // through codeConfig.allowedLanguages metadata - UI components read this\n // to filter available options, same pattern as money currencies.\n const languageSchema = z.string();\n\n // Create the code object schema\n const codeSchema = z.object({\n content: contentSchema.describe(\"The code itself.\"),\n language: languageSchema.describe(\"The language the code is written in, for highlighting and validation.\"),\n });\n\n const codeMetadata: CodeSchemaMetadata = {\n isCode: true,\n ...(allowedLanguages !== undefined && { allowedLanguages }),\n ...(maxLength !== undefined && { maxLength }),\n ...(minLength !== undefined && { minLength }),\n };\n\n // Initialize or extend SCHEMA_METADATA with code config\n const existingMetadata: CustomFieldMetadata = (codeSchema as any)[SCHEMA_METADATA] || {};\n (codeSchema as any)[SCHEMA_METADATA] = {\n ...existingMetadata,\n codeConfig: codeMetadata,\n };\n\n // Add chainable decorator methods to the code schema instance\n addChainableMethods(codeSchema);\n\n return codeSchema as unknown as DecoratedCodeSchema;\n}\n\n/**\n * Return type for code schemas - includes decorator methods.\n * IS_DB_INDEXED will index internal fields (content, language) for query optimization.\n */\nexport type DecoratedCodeSchema = z.ZodObject<{\n content: z.ZodString;\n language: z.ZodString;\n}> & {\n [ZodDecorator.IS_DB_INDEXED](): DecoratedCodeSchema;\n /** Installed at runtime with the other chainable methods; declared here so an authored `.codeUI(…)` typechecks. */\n [ZodDecorator.CODE_UI](params?: ZodDecorator_ParamsType[ZodDecorator.CODE_UI]): DecoratedCodeSchema;\n [ZodDecorator.IS_HIDDEN](params?: ZodDecorator_ParamsType[ZodDecorator.IS_HIDDEN]): DecoratedCodeSchema;\n [ZodDecorator.IS_NOT_EDITABLE](params?: ZodDecorator_ParamsType[ZodDecorator.IS_NOT_EDITABLE]): DecoratedCodeSchema;\n addDecorators(decorators: DecoratorInput[]): DecoratedCodeSchema;\n};\n\n/**\n * Creates a code schema for code snippets with language information.\n * Named z_code to indicate it's a Zod helper function exported standalone.\n *\n * Code values are stored as: { content: string, language: string }\n * - content: The actual code text\n * - language: Programming language identifier for syntax highlighting\n *\n * @example\n * ```typescript\n * import { z_code } from '@wildo-ai/zod-decorators';\n *\n * // Simple usage\n * z_code() // All languages, default 'plaintext'\n *\n * // With options (structural only)\n * z_code({ allowedLanguages: ['javascript', 'typescript'] })\n * z_code({ maxLength: 5000 })\n *\n * // UI props via .codeUI()\n * z_code().codeUI({ defaultLanguage: 'typescript' })\n * z_code().codeUI({ display: { showLineNumbers: false } })\n * ```\n */\nexport function z_code(options?: CodeSchemaOptions): DecoratedCodeSchema {\n return createCodeSchema(options);\n}\n/** @wildo_source:part:end zod.factories.code */\n\n// ============================================================================\n// UTILITY FUNCTIONS\n// ============================================================================\n\n/**\n * Get the display name for a code language.\n */\nexport function getLanguageDisplayName(language: CodeLanguage): string {\n const displayNames: Record<string, string> = {\n javascript: 'JavaScript',\n typescript: 'TypeScript',\n python: 'Python',\n java: 'Java',\n csharp: 'C#',\n cpp: 'C++',\n c: 'C',\n go: 'Go',\n rust: 'Rust',\n ruby: 'Ruby',\n php: 'PHP',\n swift: 'Swift',\n kotlin: 'Kotlin',\n scala: 'Scala',\n html: 'HTML',\n css: 'CSS',\n scss: 'SCSS',\n less: 'Less',\n json: 'JSON',\n yaml: 'YAML',\n xml: 'XML',\n markdown: 'Markdown',\n sql: 'SQL',\n graphql: 'GraphQL',\n bash: 'Bash',\n shell: 'Shell',\n powershell: 'PowerShell',\n dockerfile: 'Dockerfile',\n nginx: 'Nginx',\n apache: 'Apache',\n plaintext: 'Plain Text',\n };\n\n return displayNames[language] || language;\n}\n\n/**\n * Check if a language is in the common languages list.\n */\nexport function isCommonLanguage(language: string): language is typeof CommonCodeLanguages[number] {\n return CommonCodeLanguages.includes(language as any);\n}\n\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"zod-color.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"zod-color.d.ts","sourceRoot":"","sources":["../../../src/zod-color.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB;;;GAGG;AACH,eAAO,MAAM,gBAAgB,EAAE,CAAC,CAAC,SAyFiB,CAAC;AAEnD,MAAM,MAAM,uBAAuB,GAAG,OAAO,gBAAgB,CAAC"}
|