@lssm/lib.schema 1.41.1 → 1.42.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +3 -0
- package/dist/EnumType.d.ts +42 -0
- package/dist/EnumType.d.ts.map +1 -0
- package/dist/EnumType.js +57 -1
- package/dist/EnumType.js.map +1 -0
- package/dist/FieldType.d.ts +31 -0
- package/dist/FieldType.d.ts.map +1 -0
- package/dist/FieldType.js +50 -1
- package/dist/FieldType.js.map +1 -0
- package/dist/ScalarTypeEnum.d.ts +33 -0
- package/dist/ScalarTypeEnum.d.ts.map +1 -0
- package/dist/ScalarTypeEnum.js +237 -1
- package/dist/ScalarTypeEnum.js.map +1 -0
- package/dist/SchemaModel.d.ts +62 -0
- package/dist/SchemaModel.d.ts.map +1 -0
- package/dist/SchemaModel.js +40 -1
- package/dist/SchemaModel.js.map +1 -0
- package/dist/entity/defineEntity.d.ts +93 -0
- package/dist/entity/defineEntity.d.ts.map +1 -0
- package/dist/entity/defineEntity.js +237 -1
- package/dist/entity/defineEntity.js.map +1 -0
- package/dist/entity/generator.d.ts +38 -0
- package/dist/entity/generator.d.ts.map +1 -0
- package/dist/entity/generator.js +218 -4
- package/dist/entity/generator.js.map +1 -0
- package/dist/entity/index.d.ts +4 -0
- package/dist/entity/index.js +5 -1
- package/dist/entity/types.d.ts +146 -0
- package/dist/entity/types.d.ts.map +1 -0
- package/dist/entity/types.js +1 -1
- package/dist/index.d.ts +9 -0
- package/dist/index.js +9 -1
- package/package.json +23 -25
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Chaman Ventures, SASU
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
CHANGED
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
# @lssm/lib.schema
|
|
2
2
|
|
|
3
|
+
Website: https://contractspec.lssm.tech/
|
|
4
|
+
|
|
5
|
+
|
|
3
6
|
**Multi-surface consistency starts here** — Define schemas once, export to Zod, GraphQL, and JSON Schema.
|
|
4
7
|
|
|
5
8
|
A schema dictionary to describe operation I/O once and generate consistent types across all surfaces (API, database, UI). Part of ContractSpec's spec-first approach.
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
import { GraphQLEnumType } from "graphql";
|
|
3
|
+
|
|
4
|
+
//#region src/EnumType.d.ts
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Strongly-typed string enum wrapper with one source of truth for zod, GraphQL, and JSON Schema.
|
|
8
|
+
*/
|
|
9
|
+
declare class EnumType<T extends [string, ...string[]]> {
|
|
10
|
+
private readonly name;
|
|
11
|
+
private readonly values;
|
|
12
|
+
private readonly gqlEnum;
|
|
13
|
+
constructor(name: string, values: T);
|
|
14
|
+
/** Enum type name (used by GraphQL and JSON Schema). */
|
|
15
|
+
getName(): string;
|
|
16
|
+
/** Returns the literal tuple of allowed values. */
|
|
17
|
+
getEnumValues(): T;
|
|
18
|
+
/** GraphQL enum instance suitable for Pothos or vanilla GraphQL schemas. */
|
|
19
|
+
getPothos(): GraphQLEnumType;
|
|
20
|
+
/** zod schema representing this enum. */
|
|
21
|
+
getZod(): z.ZodEnum<{ [K in T[number]]: K }>;
|
|
22
|
+
/** Minimal JSON representation (alias of getJsonSchema). */
|
|
23
|
+
getJson(): {
|
|
24
|
+
type: 'string';
|
|
25
|
+
enum: T;
|
|
26
|
+
};
|
|
27
|
+
/** JSON Schema for this enum. */
|
|
28
|
+
getJsonSchema(): {
|
|
29
|
+
type: 'string';
|
|
30
|
+
enum: T;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
type AnyEnumType = EnumType<[string, ...string[]]>;
|
|
34
|
+
/**
|
|
35
|
+
* Helper to define an EnumType.
|
|
36
|
+
* @param name Display/type name used across GraphQL and JSON Schema
|
|
37
|
+
* @param values Literal tuple of allowed string values (at least one)
|
|
38
|
+
*/
|
|
39
|
+
declare const defineEnum: <T extends [string, ...string[]]>(name: string, values: T) => EnumType<T>;
|
|
40
|
+
//#endregion
|
|
41
|
+
export { AnyEnumType, EnumType, defineEnum };
|
|
42
|
+
//# sourceMappingURL=EnumType.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EnumType.d.ts","names":[],"sources":["../src/EnumType.ts"],"sourcesContent":[],"mappings":";;;;;;;AAMA;AAKoC,cALvB,QAKuB,CAAA,UAAA,CAAA,MAAA,EAAA,GAAA,MAAA,EAAA,CAAA,CAAA,CAAA;EAejB,iBAAA,IAAA;EAMJ,iBAAA,MAAA;EAKe,iBAAA,OAAA;EAAY,WAAA,CAAA,IAAA,EAAA,MAAA,EAAA,MAAA,EA1BN,CA0BM;EAA5B;EAKuB,OAAA,CAAA,CAAA,EAAA,MAAA;EAKM;EAAC,aAAA,CAAA,CAAA,EArBzB,CAqByB;EAKhC;EAOC,SAAA,CAAA,CAAA,EA3BE,eA8BgB;EADrB;EAAC,MAAA,CAAA,CAAA,EAxBC,CAAA,CAAE,OAwBH,CAAA,QAxBmB,CAwBnB,CAAA,MAAA,CAAA,GAxB+B,CAwB/B,EAAA,CAAA;;;;UAnB0B;;;;;UAKM;;;KAK/B,WAAA,GAAc;;;;;;cAOb,oEAEH,MAAC,SAAA"}
|
package/dist/EnumType.js
CHANGED
|
@@ -1 +1,57 @@
|
|
|
1
|
-
import*as
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
import { GraphQLEnumType } from "graphql";
|
|
3
|
+
|
|
4
|
+
//#region src/EnumType.ts
|
|
5
|
+
/**
|
|
6
|
+
* Strongly-typed string enum wrapper with one source of truth for zod, GraphQL, and JSON Schema.
|
|
7
|
+
*/
|
|
8
|
+
var EnumType = class {
|
|
9
|
+
name;
|
|
10
|
+
values;
|
|
11
|
+
gqlEnum;
|
|
12
|
+
constructor(name, values) {
|
|
13
|
+
this.name = name;
|
|
14
|
+
this.values = values;
|
|
15
|
+
this.gqlEnum = new GraphQLEnumType({
|
|
16
|
+
name: this.name,
|
|
17
|
+
values: Object.fromEntries(values.map((v) => [v, { value: v }]))
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
/** Enum type name (used by GraphQL and JSON Schema). */
|
|
21
|
+
getName() {
|
|
22
|
+
return this.name;
|
|
23
|
+
}
|
|
24
|
+
/** Returns the literal tuple of allowed values. */
|
|
25
|
+
getEnumValues() {
|
|
26
|
+
return this.values;
|
|
27
|
+
}
|
|
28
|
+
/** GraphQL enum instance suitable for Pothos or vanilla GraphQL schemas. */
|
|
29
|
+
getPothos() {
|
|
30
|
+
return this.gqlEnum;
|
|
31
|
+
}
|
|
32
|
+
/** zod schema representing this enum. */
|
|
33
|
+
getZod() {
|
|
34
|
+
return z.enum(this.values);
|
|
35
|
+
}
|
|
36
|
+
/** Minimal JSON representation (alias of getJsonSchema). */
|
|
37
|
+
getJson() {
|
|
38
|
+
return {
|
|
39
|
+
type: "string",
|
|
40
|
+
enum: this.values
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
/** JSON Schema for this enum. */
|
|
44
|
+
getJsonSchema() {
|
|
45
|
+
return this.getJson();
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
/**
|
|
49
|
+
* Helper to define an EnumType.
|
|
50
|
+
* @param name Display/type name used across GraphQL and JSON Schema
|
|
51
|
+
* @param values Literal tuple of allowed string values (at least one)
|
|
52
|
+
*/
|
|
53
|
+
const defineEnum = (name, values) => new EnumType(name, values);
|
|
54
|
+
|
|
55
|
+
//#endregion
|
|
56
|
+
export { EnumType, defineEnum };
|
|
57
|
+
//# sourceMappingURL=EnumType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EnumType.js","names":[],"sources":["../src/EnumType.ts"],"sourcesContent":["import * as z from 'zod';\nimport { GraphQLEnumType } from 'graphql';\n\n/**\n * Strongly-typed string enum wrapper with one source of truth for zod, GraphQL, and JSON Schema.\n */\nexport class EnumType<T extends [string, ...string[]]> {\n private readonly name: string;\n private readonly values: T;\n private readonly gqlEnum: GraphQLEnumType;\n\n constructor(name: string, values: T) {\n this.name = name;\n this.values = values;\n this.gqlEnum = new GraphQLEnumType({\n name: this.name,\n values: Object.fromEntries(values.map((v) => [v, { value: v }] as const)),\n });\n }\n\n /** Enum type name (used by GraphQL and JSON Schema). */\n getName(): string {\n return this.name;\n }\n\n /** Returns the literal tuple of allowed values. */\n getEnumValues(): T {\n return this.values;\n }\n\n // For SchemaModel and adapters expecting a Pothos/GraphQL type-like object\n /** GraphQL enum instance suitable for Pothos or vanilla GraphQL schemas. */\n getPothos(): GraphQLEnumType {\n return this.gqlEnum;\n }\n\n /** zod schema representing this enum. */\n getZod(): z.ZodEnum<{ [K in T[number]]: K }> {\n return z.enum(this.values);\n }\n\n /** Minimal JSON representation (alias of getJsonSchema). */\n getJson(): { type: 'string'; enum: T } {\n return { type: 'string', enum: this.values } as const;\n }\n\n /** JSON Schema for this enum. */\n getJsonSchema(): { type: 'string'; enum: T } {\n return this.getJson();\n }\n}\n\nexport type AnyEnumType = EnumType<[string, ...string[]]>;\n\n/**\n * Helper to define an EnumType.\n * @param name Display/type name used across GraphQL and JSON Schema\n * @param values Literal tuple of allowed string values (at least one)\n */\nexport const defineEnum = <T extends [string, ...string[]]>(\n name: string,\n values: T\n) => new EnumType(name, values);\n"],"mappings":";;;;;;;AAMA,IAAa,WAAb,MAAuD;CACrD,AAAiB;CACjB,AAAiB;CACjB,AAAiB;CAEjB,YAAY,MAAc,QAAW;AACnC,OAAK,OAAO;AACZ,OAAK,SAAS;AACd,OAAK,UAAU,IAAI,gBAAgB;GACjC,MAAM,KAAK;GACX,QAAQ,OAAO,YAAY,OAAO,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,GAAG,CAAC,CAAU,CAAC;GAC1E,CAAC;;;CAIJ,UAAkB;AAChB,SAAO,KAAK;;;CAId,gBAAmB;AACjB,SAAO,KAAK;;;CAKd,YAA6B;AAC3B,SAAO,KAAK;;;CAId,SAA6C;AAC3C,SAAO,EAAE,KAAK,KAAK,OAAO;;;CAI5B,UAAuC;AACrC,SAAO;GAAE,MAAM;GAAU,MAAM,KAAK;GAAQ;;;CAI9C,gBAA6C;AAC3C,SAAO,KAAK,SAAS;;;;;;;;AAWzB,MAAa,cACX,MACA,WACG,IAAI,SAAS,MAAM,OAAO"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import * as z from "zod";
|
|
2
|
+
import { GraphQLScalarType, GraphQLScalarTypeConfig } from "graphql";
|
|
3
|
+
|
|
4
|
+
//#region src/FieldType.d.ts
|
|
5
|
+
interface FieldTypeConfig<TInternal, TExternal = TInternal> extends GraphQLScalarTypeConfig<TInternal, TExternal> {
|
|
6
|
+
zod: z.ZodType<TInternal>;
|
|
7
|
+
jsonSchema: unknown | (() => unknown);
|
|
8
|
+
}
|
|
9
|
+
type AnyFieldType = FieldType<any, any>;
|
|
10
|
+
/**
|
|
11
|
+
* GraphQL scalar wrapper that carries zod and JSON Schema metadata.
|
|
12
|
+
*
|
|
13
|
+
* TInternal is the runtime representation; TExternal is the GraphQL output.
|
|
14
|
+
*/
|
|
15
|
+
declare class FieldType<TInternal, TExternal = TInternal> extends GraphQLScalarType<TInternal, TExternal> {
|
|
16
|
+
private zodSchema;
|
|
17
|
+
private readonly jsonSchemaDef?;
|
|
18
|
+
constructor(config: FieldTypeConfig<TInternal, TExternal>);
|
|
19
|
+
/** Return the attached zod schema for validation. */
|
|
20
|
+
getZod(): z.ZodType<TInternal>;
|
|
21
|
+
/** GraphQL scalar instance usable by Pothos or vanilla GraphQL. */
|
|
22
|
+
getPothos(): GraphQLScalarType<TInternal, TExternal>;
|
|
23
|
+
/** Return the JSON Schema (evaluates factory if provided). */
|
|
24
|
+
getJson(): unknown;
|
|
25
|
+
getJsonSchemaDef(): unknown | (() => unknown);
|
|
26
|
+
getJsonSchema(): unknown;
|
|
27
|
+
}
|
|
28
|
+
type ZodFieldType<Field extends AnyFieldType> = z.infer<ReturnType<Field['getZod']>>;
|
|
29
|
+
//#endregion
|
|
30
|
+
export { AnyFieldType, FieldType, FieldTypeConfig, ZodFieldType };
|
|
31
|
+
//# sourceMappingURL=FieldType.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldType.d.ts","names":[],"sources":["../src/FieldType.ts"],"sourcesContent":[],"mappings":";;;;UAGiB,uCAEH,mBACJ,wBAAwB,WAAW;OACtC,CAAA,CAAE,QAAQ;EAJA,UAAA,EAAA,OAAe,GAAA,CAAA,GAAA,GAAA,OAAA,CAAA;;AAGE,KAMtB,YAAA,GAAe,SANO,CAAA,GAAA,EAAA,GAAA,CAAA;;;;;;AAMtB,cAOC,SAPW,CAAG,SAAA,EAAS,YAStB,SATsB,CAAA,SAU1B,iBAV0B,CAUR,SAVQ,EAUG,SAVH,CAAA,CAAA;EAOvB,QAAA,SAAS;EAER,iBAAA,aAAA;EACc,WAAA,CAAA,MAAA,EAIN,eAJM,CAIU,SAJV,EAIqB,SAJrB,CAAA;EAAW;EAID,MAAA,CAAA,CAAA,EAO1B,CAAA,CAAE,OAPwB,CAOhB,SAPgB,CAAA;EAAW;EAA3B,SAAA,CAAA,CAAA,EAYP,iBAZO,CAYW,SAZX,EAYsB,SAZtB,CAAA;EAOA;EAAR,OAAA,CAAA,CAAA,EAAA,OAAA;EAKmB,gBAAA,CAAA,CAAA,EAAA,OAAA,GAAA,CAAA,GAAA,GAAA,OAAA,CAAA;EAAW,aAAA,CAAA,CAAA,EAAA,OAAA;;AAhBlC,KAoDE,YApDF,CAAA,cAoD6B,YApD7B,CAAA,GAoD6C,CAAA,CAAE,KApD/C,CAqDR,UArDQ,CAqDG,KArDH,CAAA,QAAA,CAAA,CAAA,CAAA"}
|
package/dist/FieldType.js
CHANGED
|
@@ -1 +1,50 @@
|
|
|
1
|
-
import"zod";
|
|
1
|
+
import "zod";
|
|
2
|
+
import { GraphQLScalarType } from "graphql";
|
|
3
|
+
|
|
4
|
+
//#region src/FieldType.ts
|
|
5
|
+
/**
|
|
6
|
+
* GraphQL scalar wrapper that carries zod and JSON Schema metadata.
|
|
7
|
+
*
|
|
8
|
+
* TInternal is the runtime representation; TExternal is the GraphQL output.
|
|
9
|
+
*/
|
|
10
|
+
var FieldType = class extends GraphQLScalarType {
|
|
11
|
+
zodSchema;
|
|
12
|
+
jsonSchemaDef;
|
|
13
|
+
constructor(config) {
|
|
14
|
+
super(config);
|
|
15
|
+
this.zodSchema = config.zod;
|
|
16
|
+
this.jsonSchemaDef = config.jsonSchema;
|
|
17
|
+
}
|
|
18
|
+
/** Return the attached zod schema for validation. */
|
|
19
|
+
getZod() {
|
|
20
|
+
return this.zodSchema;
|
|
21
|
+
}
|
|
22
|
+
/** GraphQL scalar instance usable by Pothos or vanilla GraphQL. */
|
|
23
|
+
getPothos() {
|
|
24
|
+
return this;
|
|
25
|
+
}
|
|
26
|
+
/** Return the JSON Schema (evaluates factory if provided). */
|
|
27
|
+
getJson() {
|
|
28
|
+
return typeof this.jsonSchemaDef === "function" ? this.jsonSchemaDef() : this.jsonSchemaDef;
|
|
29
|
+
}
|
|
30
|
+
getJsonSchemaDef() {
|
|
31
|
+
return this.jsonSchemaDef;
|
|
32
|
+
}
|
|
33
|
+
getJsonSchema() {
|
|
34
|
+
const deepResolve = (v) => {
|
|
35
|
+
const value = typeof v === "function" ? v() : v;
|
|
36
|
+
if (Array.isArray(value)) return value.map((item) => deepResolve(item));
|
|
37
|
+
if (value && typeof value === "object") {
|
|
38
|
+
const obj = {};
|
|
39
|
+
for (const [k, val] of Object.entries(value)) obj[k] = deepResolve(val);
|
|
40
|
+
return obj;
|
|
41
|
+
}
|
|
42
|
+
return value;
|
|
43
|
+
};
|
|
44
|
+
return deepResolve(this.getJson());
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
//#endregion
|
|
49
|
+
export { FieldType };
|
|
50
|
+
//# sourceMappingURL=FieldType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldType.js","names":["obj: Record<string, unknown>"],"sources":["../src/FieldType.ts"],"sourcesContent":["import * as z from 'zod';\nimport { GraphQLScalarType, type GraphQLScalarTypeConfig } from 'graphql';\n\nexport interface FieldTypeConfig<\n TInternal,\n TExternal = TInternal,\n> extends GraphQLScalarTypeConfig<TInternal, TExternal> {\n zod: z.ZodType<TInternal>;\n jsonSchema: unknown | (() => unknown);\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type AnyFieldType = FieldType<any, any>;\n\n/**\n * GraphQL scalar wrapper that carries zod and JSON Schema metadata.\n *\n * TInternal is the runtime representation; TExternal is the GraphQL output.\n */\nexport class FieldType<\n TInternal,\n TExternal = TInternal,\n> extends GraphQLScalarType<TInternal, TExternal> {\n private zodSchema: z.ZodType<TInternal>;\n private readonly jsonSchemaDef?: unknown | (() => unknown);\n\n constructor(config: FieldTypeConfig<TInternal, TExternal>) {\n super(config);\n this.zodSchema = config.zod;\n this.jsonSchemaDef = config.jsonSchema;\n }\n\n /** Return the attached zod schema for validation. */\n getZod(): z.ZodType<TInternal> {\n return this.zodSchema;\n }\n\n /** GraphQL scalar instance usable by Pothos or vanilla GraphQL. */\n getPothos(): GraphQLScalarType<TInternal, TExternal> {\n return this;\n }\n\n /** Return the JSON Schema (evaluates factory if provided). */\n getJson(): unknown {\n return typeof this.jsonSchemaDef === 'function'\n ? (this.jsonSchemaDef as () => unknown)()\n : this.jsonSchemaDef;\n }\n\n // Return the raw jsonSchema config (value or factory)\n getJsonSchemaDef(): unknown | (() => unknown) {\n return this.jsonSchemaDef;\n }\n\n // Return a deep-resolved JSON Schema (evaluates factory and nested factories)\n getJsonSchema(): unknown {\n const deepResolve = (v: unknown): unknown => {\n const value = typeof v === 'function' ? (v as () => unknown)() : v;\n if (Array.isArray(value)) return value.map((item) => deepResolve(item));\n if (value && typeof value === 'object') {\n const obj: Record<string, unknown> = {};\n for (const [k, val] of Object.entries(\n value as Record<string, unknown>\n )) {\n obj[k] = deepResolve(val);\n }\n return obj;\n }\n return value;\n };\n return deepResolve(this.getJson());\n }\n}\n\nexport type ZodFieldType<Field extends AnyFieldType> = z.infer<\n ReturnType<Field['getZod']>\n>;\n"],"mappings":";;;;;;;;;AAmBA,IAAa,YAAb,cAGU,kBAAwC;CAChD,AAAQ;CACR,AAAiB;CAEjB,YAAY,QAA+C;AACzD,QAAM,OAAO;AACb,OAAK,YAAY,OAAO;AACxB,OAAK,gBAAgB,OAAO;;;CAI9B,SAA+B;AAC7B,SAAO,KAAK;;;CAId,YAAqD;AACnD,SAAO;;;CAIT,UAAmB;AACjB,SAAO,OAAO,KAAK,kBAAkB,aAChC,KAAK,eAAiC,GACvC,KAAK;;CAIX,mBAA8C;AAC5C,SAAO,KAAK;;CAId,gBAAyB;EACvB,MAAM,eAAe,MAAwB;GAC3C,MAAM,QAAQ,OAAO,MAAM,aAAc,GAAqB,GAAG;AACjE,OAAI,MAAM,QAAQ,MAAM,CAAE,QAAO,MAAM,KAAK,SAAS,YAAY,KAAK,CAAC;AACvE,OAAI,SAAS,OAAO,UAAU,UAAU;IACtC,MAAMA,MAA+B,EAAE;AACvC,SAAK,MAAM,CAAC,GAAG,QAAQ,OAAO,QAC5B,MACD,CACC,KAAI,KAAK,YAAY,IAAI;AAE3B,WAAO;;AAET,UAAO;;AAET,SAAO,YAAY,KAAK,SAAS,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { FieldType } from "./FieldType.js";
|
|
2
|
+
|
|
3
|
+
//#region src/ScalarTypeEnum.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Factory functions for common scalar FieldTypes with zod/GraphQL/JSON Schema.
|
|
7
|
+
*/
|
|
8
|
+
declare const ScalarTypeEnum: {
|
|
9
|
+
readonly String_unsecure: () => FieldType<string>;
|
|
10
|
+
readonly Int_unsecure: () => FieldType<number>;
|
|
11
|
+
readonly Float_unsecure: () => FieldType<number>;
|
|
12
|
+
readonly Boolean: () => FieldType<boolean>;
|
|
13
|
+
readonly ID: () => FieldType<string>;
|
|
14
|
+
readonly JSON: () => FieldType<unknown>;
|
|
15
|
+
readonly JSONObject: () => FieldType<Record<string, unknown>>;
|
|
16
|
+
readonly Date: () => FieldType<Date, string>;
|
|
17
|
+
readonly DateTime: () => FieldType<Date, string>;
|
|
18
|
+
readonly Time: () => FieldType<string>;
|
|
19
|
+
readonly EmailAddress: () => FieldType<string>;
|
|
20
|
+
readonly URL: () => FieldType<string>;
|
|
21
|
+
readonly PhoneNumber: () => FieldType<string>;
|
|
22
|
+
readonly NonEmptyString: () => FieldType<string>;
|
|
23
|
+
readonly Locale: () => FieldType<string>;
|
|
24
|
+
readonly TimeZone: () => FieldType<string>;
|
|
25
|
+
readonly Latitude: () => FieldType<number>;
|
|
26
|
+
readonly Longitude: () => FieldType<number>;
|
|
27
|
+
readonly Currency: () => FieldType<string>;
|
|
28
|
+
readonly CountryCode: () => FieldType<string>;
|
|
29
|
+
};
|
|
30
|
+
type ScalarTypeEnum = [keyof typeof ScalarTypeEnum];
|
|
31
|
+
//#endregion
|
|
32
|
+
export { ScalarTypeEnum };
|
|
33
|
+
//# sourceMappingURL=ScalarTypeEnum.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScalarTypeEnum.d.ts","names":[],"sources":["../src/ScalarTypeEnum.ts"],"sourcesContent":[],"mappings":";;;;;;AAkBA;AAEuB,cAFV,cAEU,EAAA;EAaH,SAAA,eAAA,EAAA,GAAA,GAbG,SAaH,CAAA,MAAA,CAAA;EAgBE,SAAA,YAAA,EAAA,GAAA,GAhBF,SAgBE,CAAA,MAAA,CAAA;EAiBP,SAAA,cAAA,EAAA,GAAA,GAjBO,SAiBP,CAAA,MAAA,CAAA;EAaL,SAAA,OAAA,EAAA,GAAA,GAbK,SAaL,CAAA,OAAA,CAAA;EAeE,SAAA,EAAA,EAAA,GAAA,GAfF,SAeE,CAAA,MAAA,CAAA;EAQgB,SAAA,IAAA,EAAA,GAAA,GARhB,SAQgB,CAAA,OAAA,CAAA;EAAV,SAAA,UAAA,EAAA,GAAA,GAAA,SAAA,CAAU,MAAV,CAAA,MAAA,EAAA,OAAA,CAAA,CAAA;EAQI,SAAA,IAAA,EAAA,GAAA,GAAV,SAAU,CAAA,IAAA,EAAA,MAAA,CAAA;EAAV,SAAA,QAAA,EAAA,GAAA,GAUI,SAVJ,CAUc,IAVd,EAAA,MAAA,CAAA;EAUc,SAAA,IAAA,EAAA,GAAA,GAUd,SAVc,CAAA,MAAA,CAAA;EAAV,SAAA,YAAA,EAAA,GAAA,GAsBI,SAtBJ,CAAA,MAAA,CAAA;EAUJ,SAAA,GAAA,EAAA,GAAA,GAoBD,SApBC,CAAA,MAAA,CAAA;EAYQ,SAAA,WAAA,EAAA,GAAA,GAgBD,SAhBC,CAAA,MAAA,CAAA;EAQT,SAAA,cAAA,EAAA,GAAA,GAgBW,SAhBX,CAAA,MAAA,CAAA;EAQQ,SAAA,MAAA,EAAA,GAAA,GAgBL,SAhBK,CAAA,MAAA,CAAA;EAQG,SAAA,QAAA,EAAA,GAAA,GAgBN,SAhBM,CAAA,MAAA,CAAA;EAQR,SAAA,QAAA,EAAA,GAAA,GAgBE,SAhBF,CAAA,MAAA,CAAA;EAQE,SAAA,SAAA,EAAA,GAAA,GAgBC,SAhBD,CAAA,MAAA,CAAA;EAQA,SAAA,QAAA,EAAA,GAAA,GAgBA,SAhBA,CAAA,MAAA,CAAA;EAQC,SAAA,WAAA,EAAA,GAAA,GAgBE,SAhBF,CAAA,MAAA,CAAA;CAQD;AAQG,KAqBP,cAAA,GArBO,CAAA,MAAA,OAqBwB,cArBxB,CAAA"}
|
package/dist/ScalarTypeEnum.js
CHANGED
|
@@ -1 +1,237 @@
|
|
|
1
|
-
import{FieldType
|
|
1
|
+
import { FieldType } from "./FieldType.js";
|
|
2
|
+
import * as z from "zod";
|
|
3
|
+
import { Kind } from "graphql";
|
|
4
|
+
|
|
5
|
+
//#region src/ScalarTypeEnum.ts
|
|
6
|
+
const localeRegex = /^[A-Za-z]{2}(?:-[A-Za-z0-9]{2,8})*$/;
|
|
7
|
+
const timezoneRegex = /^(?:UTC|[A-Za-z_]+\/[A-Za-z_]+)$/;
|
|
8
|
+
const phoneRegex = /^[+]?\d[\d\s().-]{3,}$/;
|
|
9
|
+
const currencyRegex = /^[A-Z]{3}$/;
|
|
10
|
+
const countryRegex = /^[A-Z]{2}$/;
|
|
11
|
+
const latMin = -90;
|
|
12
|
+
const latMax = 90;
|
|
13
|
+
const lonMin = -180;
|
|
14
|
+
const lonMax = 180;
|
|
15
|
+
/**
|
|
16
|
+
* Factory functions for common scalar FieldTypes with zod/GraphQL/JSON Schema.
|
|
17
|
+
*/
|
|
18
|
+
const ScalarTypeEnum = {
|
|
19
|
+
String_unsecure: () => new FieldType({
|
|
20
|
+
name: "String_unsecure",
|
|
21
|
+
description: "Unvalidated string scalar",
|
|
22
|
+
zod: z.string(),
|
|
23
|
+
parseValue: (v) => z.string().parse(v),
|
|
24
|
+
serialize: (v) => String(v),
|
|
25
|
+
parseLiteral: (ast) => {
|
|
26
|
+
if (ast.kind !== Kind.STRING) throw new TypeError("Invalid literal");
|
|
27
|
+
return ast.value;
|
|
28
|
+
},
|
|
29
|
+
jsonSchema: { type: "string" }
|
|
30
|
+
}),
|
|
31
|
+
Int_unsecure: () => new FieldType({
|
|
32
|
+
name: "Int_unsecure",
|
|
33
|
+
description: "Unvalidated integer scalar",
|
|
34
|
+
zod: z.number().int(),
|
|
35
|
+
parseValue: (v) => {
|
|
36
|
+
const num = typeof v === "number" ? v : Number(v);
|
|
37
|
+
return z.number().int().parse(num);
|
|
38
|
+
},
|
|
39
|
+
serialize: (v) => Math.trunc(typeof v === "number" ? v : Number(v)),
|
|
40
|
+
parseLiteral: (ast) => {
|
|
41
|
+
if (ast.kind !== Kind.INT) throw new TypeError("Invalid literal");
|
|
42
|
+
return Number(ast.value);
|
|
43
|
+
},
|
|
44
|
+
jsonSchema: { type: "integer" }
|
|
45
|
+
}),
|
|
46
|
+
Float_unsecure: () => new FieldType({
|
|
47
|
+
name: "Float_unsecure",
|
|
48
|
+
description: "Unvalidated float scalar",
|
|
49
|
+
zod: z.number(),
|
|
50
|
+
parseValue: (v) => {
|
|
51
|
+
const num = typeof v === "number" ? v : Number(v);
|
|
52
|
+
return z.number().parse(num);
|
|
53
|
+
},
|
|
54
|
+
serialize: (v) => Number(v),
|
|
55
|
+
parseLiteral: (ast) => {
|
|
56
|
+
if (ast.kind !== Kind.FLOAT && ast.kind !== Kind.INT) throw new TypeError("Invalid literal");
|
|
57
|
+
return Number(ast.value);
|
|
58
|
+
},
|
|
59
|
+
jsonSchema: { type: "number" }
|
|
60
|
+
}),
|
|
61
|
+
Boolean: () => new FieldType({
|
|
62
|
+
name: "Boolean",
|
|
63
|
+
description: "Unvalidated boolean scalar",
|
|
64
|
+
zod: z.boolean(),
|
|
65
|
+
parseValue: (v) => z.coerce.boolean().parse(v),
|
|
66
|
+
serialize: (v) => Boolean(v),
|
|
67
|
+
parseLiteral: (ast) => {
|
|
68
|
+
if (ast.kind !== Kind.BOOLEAN) throw new TypeError("Invalid literal");
|
|
69
|
+
return ast.value;
|
|
70
|
+
},
|
|
71
|
+
jsonSchema: { type: "boolean" }
|
|
72
|
+
}),
|
|
73
|
+
ID: () => new FieldType({
|
|
74
|
+
name: "ID",
|
|
75
|
+
description: "Unvalidated id scalar",
|
|
76
|
+
zod: z.string(),
|
|
77
|
+
parseValue: (v) => z.string().parse(v),
|
|
78
|
+
serialize: (v) => String(v),
|
|
79
|
+
parseLiteral: (ast) => {
|
|
80
|
+
if (ast.kind !== Kind.STRING) throw new TypeError("Invalid literal");
|
|
81
|
+
return ast.value;
|
|
82
|
+
},
|
|
83
|
+
jsonSchema: { type: "string" }
|
|
84
|
+
}),
|
|
85
|
+
JSON: () => new FieldType({
|
|
86
|
+
name: "JSON",
|
|
87
|
+
zod: z.any(),
|
|
88
|
+
parseValue: (v) => v,
|
|
89
|
+
serialize: (v) => v,
|
|
90
|
+
jsonSchema: {}
|
|
91
|
+
}),
|
|
92
|
+
JSONObject: () => new FieldType({
|
|
93
|
+
name: "JSONObject",
|
|
94
|
+
zod: z.record(z.string(), z.any()),
|
|
95
|
+
parseValue: (v) => z.record(z.string(), z.any()).parse(v),
|
|
96
|
+
serialize: (v) => v ?? {},
|
|
97
|
+
jsonSchema: { type: "object" }
|
|
98
|
+
}),
|
|
99
|
+
Date: () => new FieldType({
|
|
100
|
+
name: "Date",
|
|
101
|
+
zod: z.date(),
|
|
102
|
+
parseValue: (v) => v instanceof Date ? v : new Date(String(v)),
|
|
103
|
+
serialize: (v) => v instanceof Date ? v.toISOString().split("T")[0] : String(v),
|
|
104
|
+
jsonSchema: {
|
|
105
|
+
type: "string",
|
|
106
|
+
format: "date"
|
|
107
|
+
}
|
|
108
|
+
}),
|
|
109
|
+
DateTime: () => new FieldType({
|
|
110
|
+
name: "DateTime",
|
|
111
|
+
zod: z.date(),
|
|
112
|
+
parseValue: (v) => v instanceof Date ? v : new Date(String(v)),
|
|
113
|
+
serialize: (v) => {
|
|
114
|
+
return v instanceof Date ? v.toISOString() : String(v);
|
|
115
|
+
},
|
|
116
|
+
jsonSchema: {
|
|
117
|
+
type: "string",
|
|
118
|
+
format: "date-time"
|
|
119
|
+
}
|
|
120
|
+
}),
|
|
121
|
+
Time: () => new FieldType({
|
|
122
|
+
name: "Time",
|
|
123
|
+
zod: z.string().regex(/^\d{2}:\d{2}(:\d{2})?$/),
|
|
124
|
+
parseValue: (v) => z.string().regex(/^\d{2}:\d{2}(:\d{2})?$/).parse(v),
|
|
125
|
+
serialize: (v) => String(v),
|
|
126
|
+
jsonSchema: {
|
|
127
|
+
type: "string",
|
|
128
|
+
pattern: "^\\d{2}:\\d{2}(:\\d{2})?$"
|
|
129
|
+
}
|
|
130
|
+
}),
|
|
131
|
+
EmailAddress: () => new FieldType({
|
|
132
|
+
name: "EmailAddress",
|
|
133
|
+
zod: z.string().email(),
|
|
134
|
+
parseValue: (v) => z.string().email().parse(v),
|
|
135
|
+
serialize: (v) => String(v),
|
|
136
|
+
jsonSchema: {
|
|
137
|
+
type: "string",
|
|
138
|
+
format: "email"
|
|
139
|
+
}
|
|
140
|
+
}),
|
|
141
|
+
URL: () => new FieldType({
|
|
142
|
+
name: "URL",
|
|
143
|
+
zod: z.string().url(),
|
|
144
|
+
parseValue: (v) => z.string().url().parse(v),
|
|
145
|
+
serialize: (v) => String(v),
|
|
146
|
+
jsonSchema: {
|
|
147
|
+
type: "string",
|
|
148
|
+
format: "uri"
|
|
149
|
+
}
|
|
150
|
+
}),
|
|
151
|
+
PhoneNumber: () => new FieldType({
|
|
152
|
+
name: "PhoneNumber",
|
|
153
|
+
zod: z.string().regex(phoneRegex),
|
|
154
|
+
parseValue: (v) => z.string().regex(phoneRegex).parse(v),
|
|
155
|
+
serialize: (v) => String(v),
|
|
156
|
+
jsonSchema: {
|
|
157
|
+
type: "string",
|
|
158
|
+
pattern: phoneRegex.source
|
|
159
|
+
}
|
|
160
|
+
}),
|
|
161
|
+
NonEmptyString: () => new FieldType({
|
|
162
|
+
name: "NonEmptyString",
|
|
163
|
+
zod: z.string().min(1),
|
|
164
|
+
parseValue: (v) => z.string().min(1).parse(v),
|
|
165
|
+
serialize: (v) => String(v),
|
|
166
|
+
jsonSchema: {
|
|
167
|
+
type: "string",
|
|
168
|
+
minLength: 1
|
|
169
|
+
}
|
|
170
|
+
}),
|
|
171
|
+
Locale: () => new FieldType({
|
|
172
|
+
name: "Locale",
|
|
173
|
+
zod: z.string().regex(localeRegex),
|
|
174
|
+
parseValue: (v) => z.string().regex(localeRegex).parse(v),
|
|
175
|
+
serialize: (v) => String(v),
|
|
176
|
+
jsonSchema: {
|
|
177
|
+
type: "string",
|
|
178
|
+
pattern: localeRegex.source
|
|
179
|
+
}
|
|
180
|
+
}),
|
|
181
|
+
TimeZone: () => new FieldType({
|
|
182
|
+
name: "TimeZone",
|
|
183
|
+
zod: z.string().regex(timezoneRegex),
|
|
184
|
+
parseValue: (v) => z.string().regex(timezoneRegex).parse(v),
|
|
185
|
+
serialize: (v) => String(v),
|
|
186
|
+
jsonSchema: {
|
|
187
|
+
type: "string",
|
|
188
|
+
pattern: timezoneRegex.source
|
|
189
|
+
}
|
|
190
|
+
}),
|
|
191
|
+
Latitude: () => new FieldType({
|
|
192
|
+
name: "Latitude",
|
|
193
|
+
zod: z.number().min(latMin).max(latMax),
|
|
194
|
+
parseValue: (v) => z.coerce.number().min(latMin).max(latMax).parse(v),
|
|
195
|
+
serialize: (v) => Number(v),
|
|
196
|
+
jsonSchema: {
|
|
197
|
+
type: "number",
|
|
198
|
+
minimum: latMin,
|
|
199
|
+
maximum: latMax
|
|
200
|
+
}
|
|
201
|
+
}),
|
|
202
|
+
Longitude: () => new FieldType({
|
|
203
|
+
name: "Longitude",
|
|
204
|
+
zod: z.number().min(lonMin).max(lonMax),
|
|
205
|
+
parseValue: (v) => z.coerce.number().min(lonMin).max(lonMax).parse(v),
|
|
206
|
+
serialize: (v) => Number(v),
|
|
207
|
+
jsonSchema: {
|
|
208
|
+
type: "number",
|
|
209
|
+
minimum: lonMin,
|
|
210
|
+
maximum: lonMax
|
|
211
|
+
}
|
|
212
|
+
}),
|
|
213
|
+
Currency: () => new FieldType({
|
|
214
|
+
name: "Currency",
|
|
215
|
+
zod: z.string().regex(currencyRegex),
|
|
216
|
+
parseValue: (v) => z.string().regex(currencyRegex).parse(v),
|
|
217
|
+
serialize: (v) => String(v),
|
|
218
|
+
jsonSchema: {
|
|
219
|
+
type: "string",
|
|
220
|
+
pattern: currencyRegex.source
|
|
221
|
+
}
|
|
222
|
+
}),
|
|
223
|
+
CountryCode: () => new FieldType({
|
|
224
|
+
name: "CountryCode",
|
|
225
|
+
zod: z.string().regex(countryRegex),
|
|
226
|
+
parseValue: (v) => z.string().regex(countryRegex).parse(v),
|
|
227
|
+
serialize: (v) => String(v),
|
|
228
|
+
jsonSchema: {
|
|
229
|
+
type: "string",
|
|
230
|
+
pattern: countryRegex.source
|
|
231
|
+
}
|
|
232
|
+
})
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
//#endregion
|
|
236
|
+
export { ScalarTypeEnum };
|
|
237
|
+
//# sourceMappingURL=ScalarTypeEnum.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ScalarTypeEnum.js","names":[],"sources":["../src/ScalarTypeEnum.ts"],"sourcesContent":["import * as z from 'zod';\nimport { Kind, type ValueNode } from 'graphql';\nimport { FieldType } from './FieldType';\n\n// Helpers to build standard scalars\nconst localeRegex = /^[A-Za-z]{2}(?:-[A-Za-z0-9]{2,8})*$/;\nconst timezoneRegex = /^(?:UTC|[A-Za-z_]+\\/[A-Za-z_]+)$/;\nconst phoneRegex = /^[+]?\\d[\\d\\s().-]{3,}$/;\nconst currencyRegex = /^[A-Z]{3}$/;\nconst countryRegex = /^[A-Z]{2}$/;\nconst latMin = -90;\nconst latMax = 90;\nconst lonMin = -180;\nconst lonMax = 180;\n\n/**\n * Factory functions for common scalar FieldTypes with zod/GraphQL/JSON Schema.\n */\nexport const ScalarTypeEnum = {\n // primitives (_unsecure)\n String_unsecure: (): FieldType<string> =>\n new FieldType<string>({\n name: 'String_unsecure',\n description: 'Unvalidated string scalar',\n zod: z.string(),\n parseValue: (v) => z.string().parse(v),\n serialize: (v) => String(v),\n parseLiteral: (ast: ValueNode) => {\n if (ast.kind !== Kind.STRING) throw new TypeError('Invalid literal');\n return ast.value;\n },\n jsonSchema: { type: 'string' },\n }),\n Int_unsecure: (): FieldType<number> =>\n new FieldType<number>({\n name: 'Int_unsecure',\n description: 'Unvalidated integer scalar',\n zod: z.number().int(),\n parseValue: (v) => {\n const num = typeof v === 'number' ? v : Number(v as unknown);\n return z.number().int().parse(num);\n },\n serialize: (v) => Math.trunc(typeof v === 'number' ? v : Number(v)),\n parseLiteral: (ast: ValueNode) => {\n if (ast.kind !== Kind.INT) throw new TypeError('Invalid literal');\n return Number(ast.value);\n },\n jsonSchema: { type: 'integer' },\n }),\n Float_unsecure: (): FieldType<number> =>\n new FieldType<number>({\n name: 'Float_unsecure',\n description: 'Unvalidated float scalar',\n zod: z.number(),\n parseValue: (v) => {\n const num = typeof v === 'number' ? v : Number(v as unknown);\n return z.number().parse(num);\n },\n serialize: (v) => Number(v),\n parseLiteral: (ast: ValueNode) => {\n if (ast.kind !== Kind.FLOAT && ast.kind !== Kind.INT)\n throw new TypeError('Invalid literal');\n return Number(ast.value);\n },\n jsonSchema: { type: 'number' },\n }),\n Boolean: (): FieldType<boolean> =>\n new FieldType<boolean>({\n name: 'Boolean',\n description: 'Unvalidated boolean scalar',\n zod: z.boolean(),\n parseValue: (v) => z.coerce.boolean().parse(v),\n serialize: (v) => Boolean(v),\n parseLiteral: (ast: ValueNode) => {\n if (ast.kind !== Kind.BOOLEAN) throw new TypeError('Invalid literal');\n return ast.value;\n },\n jsonSchema: { type: 'boolean' },\n }),\n ID: (): FieldType<string> =>\n new FieldType<string>({\n name: 'ID',\n description: 'Unvalidated id scalar',\n zod: z.string(),\n parseValue: (v) => z.string().parse(v),\n serialize: (v) => String(v),\n parseLiteral: (ast: ValueNode) => {\n if (ast.kind !== Kind.STRING) throw new TypeError('Invalid literal');\n return ast.value;\n },\n jsonSchema: { type: 'string' },\n }),\n\n // Validated custom scalars\n JSON: (): FieldType<unknown> =>\n new FieldType<unknown>({\n name: 'JSON',\n zod: z.any(),\n parseValue: (v) => v,\n serialize: (v) => v,\n jsonSchema: {},\n }),\n JSONObject: (): FieldType<Record<string, unknown>> =>\n new FieldType<Record<string, unknown>>({\n name: 'JSONObject',\n zod: z.record(z.string(), z.any()),\n parseValue: (v) => z.record(z.string(), z.any()).parse(v),\n serialize: (v) => (v ?? {}) as Record<string, unknown>,\n jsonSchema: { type: 'object' },\n }),\n Date: (): FieldType<Date, string> =>\n new FieldType<Date, string>({\n name: 'Date',\n zod: z.date(),\n parseValue: (v) => (v instanceof Date ? v : new Date(String(v))),\n serialize: (v) =>\n // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n v instanceof Date ? v.toISOString().split('T')[0]! : String(v),\n jsonSchema: { type: 'string', format: 'date' },\n }),\n DateTime: (): FieldType<Date, string> =>\n new FieldType<Date, string>({\n name: 'DateTime',\n zod: z.date(),\n parseValue: (v) => (v instanceof Date ? v : new Date(String(v))),\n serialize: (v) => {\n return v instanceof Date ? v.toISOString() : String(v);\n },\n jsonSchema: { type: 'string', format: 'date-time' },\n }),\n Time: (): FieldType<string> =>\n new FieldType<string>({\n name: 'Time',\n zod: z.string().regex(/^\\d{2}:\\d{2}(:\\d{2})?$/),\n parseValue: (v) =>\n z\n .string()\n .regex(/^\\d{2}:\\d{2}(:\\d{2})?$/)\n .parse(v),\n serialize: (v) => String(v),\n jsonSchema: { type: 'string', pattern: '^\\\\d{2}:\\\\d{2}(:\\\\d{2})?$' },\n }),\n EmailAddress: (): FieldType<string> =>\n new FieldType<string>({\n name: 'EmailAddress',\n zod: z.string().email(),\n parseValue: (v) => z.string().email().parse(v),\n serialize: (v) => String(v),\n jsonSchema: { type: 'string', format: 'email' },\n }),\n URL: (): FieldType<string> =>\n new FieldType<string>({\n name: 'URL',\n zod: z.string().url(),\n parseValue: (v) => z.string().url().parse(v),\n serialize: (v) => String(v),\n jsonSchema: { type: 'string', format: 'uri' },\n }),\n PhoneNumber: (): FieldType<string> =>\n new FieldType<string>({\n name: 'PhoneNumber',\n zod: z.string().regex(phoneRegex),\n parseValue: (v) => z.string().regex(phoneRegex).parse(v),\n serialize: (v) => String(v),\n jsonSchema: { type: 'string', pattern: phoneRegex.source },\n }),\n NonEmptyString: (): FieldType<string> =>\n new FieldType<string>({\n name: 'NonEmptyString',\n zod: z.string().min(1),\n parseValue: (v) => z.string().min(1).parse(v),\n serialize: (v) => String(v),\n jsonSchema: { type: 'string', minLength: 1 },\n }),\n Locale: (): FieldType<string> =>\n new FieldType<string>({\n name: 'Locale',\n zod: z.string().regex(localeRegex),\n parseValue: (v) => z.string().regex(localeRegex).parse(v),\n serialize: (v) => String(v),\n jsonSchema: { type: 'string', pattern: localeRegex.source },\n }),\n TimeZone: (): FieldType<string> =>\n new FieldType<string>({\n name: 'TimeZone',\n zod: z.string().regex(timezoneRegex),\n parseValue: (v) => z.string().regex(timezoneRegex).parse(v),\n serialize: (v) => String(v),\n jsonSchema: { type: 'string', pattern: timezoneRegex.source },\n }),\n Latitude: (): FieldType<number> =>\n new FieldType<number>({\n name: 'Latitude',\n zod: z.number().min(latMin).max(latMax),\n parseValue: (v) => z.coerce.number().min(latMin).max(latMax).parse(v),\n serialize: (v) => Number(v),\n jsonSchema: { type: 'number', minimum: latMin, maximum: latMax },\n }),\n Longitude: (): FieldType<number> =>\n new FieldType<number>({\n name: 'Longitude',\n zod: z.number().min(lonMin).max(lonMax),\n parseValue: (v) => z.coerce.number().min(lonMin).max(lonMax).parse(v),\n serialize: (v) => Number(v),\n jsonSchema: { type: 'number', minimum: lonMin, maximum: lonMax },\n }),\n Currency: (): FieldType<string> =>\n new FieldType<string>({\n name: 'Currency',\n zod: z.string().regex(currencyRegex),\n parseValue: (v) => z.string().regex(currencyRegex).parse(v),\n serialize: (v) => String(v),\n jsonSchema: { type: 'string', pattern: currencyRegex.source },\n }),\n CountryCode: (): FieldType<string> =>\n new FieldType<string>({\n name: 'CountryCode',\n zod: z.string().regex(countryRegex),\n parseValue: (v) => z.string().regex(countryRegex).parse(v),\n serialize: (v) => String(v),\n jsonSchema: { type: 'string', pattern: countryRegex.source },\n }),\n // GeoJSON: (): FieldType<Record<string, unknown>, Record<string, unknown>> =>\n // new FieldType<Record<string, unknown>, Record<string, unknown>>({\n // name: 'GeoJSON',\n // zod: z.object({ type: z.string(), coordinates: z.any() }).passthrough(),\n // parseValue: (v) =>\n // z\n // .object({ type: z.string(), coordinates: z.any() })\n // .passthrough()\n // .parse(v),\n // serialize: (v) => v,\n // jsonSchema: { type: 'object' },\n // }),\n} as const;\nexport type ScalarTypeEnum = [keyof typeof ScalarTypeEnum];\n"],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { AnyEnumType } from "./EnumType.js";
|
|
2
|
+
import { AnyFieldType } from "./FieldType.js";
|
|
3
|
+
import * as z from "zod";
|
|
4
|
+
import { Maybe } from "graphql/jsutils/Maybe";
|
|
5
|
+
|
|
6
|
+
//#region src/SchemaModel.d.ts
|
|
7
|
+
type FieldLike = AnyFieldType | AnyEnumType | AnySchemaModel;
|
|
8
|
+
/** Field configuration for a SchemaModel property. */
|
|
9
|
+
interface SchemaFieldConfig<Type extends FieldLike = FieldLike> {
|
|
10
|
+
type: Type;
|
|
11
|
+
isOptional: boolean;
|
|
12
|
+
/** When present and true, the field is an array */
|
|
13
|
+
isArray?: true;
|
|
14
|
+
}
|
|
15
|
+
type SchemaModelFieldsAnyConfig<Type extends FieldLike = FieldLike> = Record<string, SchemaFieldConfig<Type>>;
|
|
16
|
+
/** Model definition: name and fields. */
|
|
17
|
+
interface SchemaModelConfig<Fields extends SchemaModelFieldsAnyConfig> {
|
|
18
|
+
name: string;
|
|
19
|
+
description?: Maybe<string>;
|
|
20
|
+
fields: Fields;
|
|
21
|
+
}
|
|
22
|
+
/**
|
|
23
|
+
* Named object model built from FieldType/EnumType/SchemaModel fields.
|
|
24
|
+
* Provides zod and GraphQL input helpers, and supports arrays/optional fields.
|
|
25
|
+
*/
|
|
26
|
+
declare class SchemaModel<Fields extends SchemaModelFieldsAnyConfig> {
|
|
27
|
+
readonly config: SchemaModelConfig<Fields>;
|
|
28
|
+
constructor(config: SchemaModelConfig<Fields>);
|
|
29
|
+
/**
|
|
30
|
+
* Build a typed ZodObject from the model fields, preserving each field's
|
|
31
|
+
* Zod schema and optionality at the type level when possible.
|
|
32
|
+
*/
|
|
33
|
+
getZod(): TopLevelZodFromModel<Fields>;
|
|
34
|
+
/** Input object name for GraphQL builder adapters. */
|
|
35
|
+
getPothosInput(): string;
|
|
36
|
+
}
|
|
37
|
+
type AnySchemaModel = SchemaModel<SchemaModelFieldsAnyConfig>;
|
|
38
|
+
type ZodSchemaModel<Field extends AnySchemaModel> = z.infer<ReturnType<Field['getZod']>>;
|
|
39
|
+
type InferZodFromType<T> = T extends SchemaModel<SchemaModelFieldsAnyConfig> ? z.ZodObject<z.ZodRawShape> : T extends AnyFieldType ? ReturnType<T['getZod']> : T extends AnyEnumType ? ReturnType<T['getZod']> : never;
|
|
40
|
+
type MaybeArray<Z extends z.ZodType, A> = A extends true ? z.ZodArray<Z> : Z;
|
|
41
|
+
type MaybeOptional<Z extends z.ZodType, O> = O extends true ? z.ZodOptional<Z> : Z;
|
|
42
|
+
/**
|
|
43
|
+
* Helper type: derive the Zod shape from the field config.
|
|
44
|
+
* Supports nested SchemaModel and arrays, preserving optionality and list-ness.
|
|
45
|
+
*/
|
|
46
|
+
type FieldIsArray<FC> = FC extends {
|
|
47
|
+
isArray: true;
|
|
48
|
+
} ? true : false;
|
|
49
|
+
type ZodShapeFromFields<F extends SchemaModelFieldsAnyConfig> = { [K in keyof F]: MaybeOptional<MaybeArray<InferZodFromType<F[K]['type']>, FieldIsArray<F[K]>>, F[K]['isOptional']> };
|
|
50
|
+
/**
|
|
51
|
+
* The top-level Zod schema returned by getZod():
|
|
52
|
+
* either ZodObject<...> or ZodArray<ZodObject<...>> when config.isArray.
|
|
53
|
+
*/
|
|
54
|
+
type TopLevelZodFromModel<F extends SchemaModelFieldsAnyConfig> = z.ZodObject<ZodShapeFromFields<F>>;
|
|
55
|
+
/**
|
|
56
|
+
* Helper to define a SchemaModel with type inference.
|
|
57
|
+
* Equivalent to `new SchemaModel(config)` but with better ergonomics.
|
|
58
|
+
*/
|
|
59
|
+
declare const defineSchemaModel: <Fields extends SchemaModelFieldsAnyConfig>(config: SchemaModelConfig<Fields>) => SchemaModel<Fields>;
|
|
60
|
+
//#endregion
|
|
61
|
+
export { AnySchemaModel, SchemaFieldConfig, SchemaModel, SchemaModelConfig, SchemaModelFieldsAnyConfig, TopLevelZodFromModel, ZodSchemaModel, ZodShapeFromFields, defineSchemaModel };
|
|
62
|
+
//# sourceMappingURL=SchemaModel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SchemaModel.d.ts","names":[],"sources":["../src/SchemaModel.ts"],"sourcesContent":[],"mappings":";;;;;;KAKK,SAAA,GAAY,eAAe,cAAc;;AAAzC,UAGY,iBAHH,CAAA,aAGkC,SAHlC,GAG8C,SAH9C,CAAA,CAAA;EAAG,IAAA,EAIT,IAJS;EAAe,UAAA,EAAA,OAAA;EAAc;EAAc,OAAA,CAAA,EAAA,IAAA;AAG5D;AAAgD,KAOpC,0BAPoC,CAAA,aAOI,SAPJ,GAOgB,SAPhB,CAAA,GAQ9C,MAR8C,CAAA,MAAA,EAQ/B,iBAR+B,CAQb,IARa,CAAA,CAAA;;AACxC,UAUS,iBAVT,CAAA,eAU0C,0BAV1C,CAAA,CAAA;EAAI,IAAA,EAAA,MAAA;EAMA,WAAA,CAAA,EAMI,KANJ,CAAA,MAAA,CAAA;EAAwC,MAAA,EAO1C,MAP0C;;;;;;AAInC,cAUJ,WAVqB,CAAA,eAUM,0BAVN,CAAA,CAAA;EAAgB,SAAA,MAAA,EAWZ,iBAXY,CAWM,MAXN,CAAA;EAElC,WAAA,CAAA,MAAA,EASsB,iBATtB,CASwC,MATxC,CAAA;EACN;;AAOV;;EACwD,MAAA,CAAA,CAAA,EAM5C,oBAN4C,CAMvB,MANuB,CAAA;EAAlB;EAAkB,cAAA,CAAA,CAAA,EAAA,MAAA;;AAMvB,KAwBrB,cAAA,GAAiB,WAxBI,CAwBQ,0BAxBR,CAAA;AAArB,KA0BA,cA1BA,CAAA,cA0B6B,cA1B7B,CAAA,GA0B+C,CAAA,CAAE,KA1BjD,CA2BV,UA3BU,CA2BC,KA3BD,CAAA,QAAA,CAAA,CAAA,CAAA;KA8BP,gBA9B2B,CAAA,CAAA,CAAA,GA+B9B,CA/B8B,SA+BpB,WA/BoB,CA+BR,0BA/BQ,CAAA,GAgC1B,CAAA,CAAE,SAhCwB,CAgCd,CAAA,CAAE,WAhCY,CAAA,GAiC1B,CAjC0B,SAiChB,YAjCgB,GAkCxB,UAlCwB,CAkCb,CAlCa,CAAA,QAAA,CAAA,CAAA,GAmCxB,CAnCwB,SAmCd,WAnCc,GAoCtB,UApCsB,CAoCX,CApCW,CAAA,QAAA,CAAA,CAAA,GAAA,KAAA;AAwBhC,KAeK,UAfO,CAAA,UAec,CAAA,CAAE,OAfa,EAAA,CAAA,CAAA,GAeC,CAfD,SAAA,IAAA,GAekB,CAAA,CAAE,QAfhC,CAeyC,CAfzC,CAAA,GAe8C,CAfnC;AAExC,KAcK,aAdO,CAAA,UAciB,CAAA,CAAE,OAdL,EAAA,CAAA,CAAA,GAcmB,CAdnB,SAAA,IAAA,GAetB,CAAA,CAAE,WAfoB,CAeR,CAfQ,CAAA,GAgBtB,CAhBsB;;;;;KAsBrB,YAtB6D,CAAA,EAAA,CAAA,GAsB1C,EAtB0C,SAAA;EAI7D,OAAA,EAAA,IAAA;CACH,GAAA,IAAA,GAAA,KAAA;AAAsB,KAmBZ,kBAnBY,CAAA,UAmBiB,0BAnBjB,CAAA,GAAA,QAAZ,MAoBE,CApBF,GAoBM,aApBN,CAqBR,UArBQ,CAqBG,gBArBH,CAqBoB,CArBpB,CAqBsB,CArBtB,CAAA,CAAA,MAAA,CAAA,CAAA,EAqBmC,YArBnC,CAqBgD,CArBhD,CAqBkD,CArBlD,CAAA,CAAA,CAAA,EAsBR,CAtBQ,CAsBN,CAtBM,CAAA,CAAA,YAAA,CAAA,CAAA,EACM;;;;;AAEV,KA2BI,oBA3BJ,CAAA,UA2BmC,0BA3BnC,CAAA,GA4BN,CAAA,CAAE,SA5BI,CA4BM,kBA5BN,CA4ByB,CA5BzB,CAAA,CAAA;;;;;AAEY,cAgCP,iBAhCO,EAAA,CAAA,eAgC6B,0BAhC7B,CAAA,CAAA,MAAA,EAiCV,iBAjCU,CAiCQ,MAjCR,CAAA,EAAA,GAkCjB,WAlCiB,CAkCL,MAlCK,CAAA"}
|