@contractspec/lib.schema 1.44.0
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 +154 -0
- package/dist/EnumType.d.ts +42 -0
- package/dist/EnumType.d.ts.map +1 -0
- package/dist/EnumType.js +57 -0
- 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 -0
- package/dist/FieldType.js.map +1 -0
- package/dist/GraphQLSchemaType.d.ts +19 -0
- package/dist/GraphQLSchemaType.d.ts.map +1 -0
- package/dist/GraphQLSchemaType.js +21 -0
- package/dist/GraphQLSchemaType.js.map +1 -0
- package/dist/JsonSchemaType.d.ts +112 -0
- package/dist/JsonSchemaType.d.ts.map +1 -0
- package/dist/JsonSchemaType.js +125 -0
- package/dist/JsonSchemaType.js.map +1 -0
- package/dist/ScalarTypeEnum.d.ts +33 -0
- package/dist/ScalarTypeEnum.d.ts.map +1 -0
- package/dist/ScalarTypeEnum.js +237 -0
- package/dist/ScalarTypeEnum.js.map +1 -0
- package/dist/SchemaModel.d.ts +92 -0
- package/dist/SchemaModel.d.ts.map +1 -0
- package/dist/SchemaModel.js +58 -0
- package/dist/SchemaModel.js.map +1 -0
- package/dist/SchemaModelType.d.ts +60 -0
- package/dist/SchemaModelType.d.ts.map +1 -0
- package/dist/SchemaModelType.js +21 -0
- package/dist/SchemaModelType.js.map +1 -0
- package/dist/ZodSchemaType.d.ts +92 -0
- package/dist/ZodSchemaType.d.ts.map +1 -0
- package/dist/ZodSchemaType.js +103 -0
- package/dist/ZodSchemaType.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 -0
- 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 -0
- package/dist/entity/generator.js.map +1 -0
- package/dist/entity/index.d.ts +4 -0
- package/dist/entity/index.js +5 -0
- package/dist/entity/types.d.ts +146 -0
- package/dist/entity/types.d.ts.map +1 -0
- package/dist/entity/types.js +1 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.js +13 -0
- package/package.json +64 -0
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { SchemaModelType } from "./SchemaModelType.js";
|
|
2
|
+
import * as z$1 from "zod";
|
|
3
|
+
|
|
4
|
+
//#region src/ZodSchemaType.d.ts
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Options for ZodSchemaType wrapper.
|
|
8
|
+
*/
|
|
9
|
+
interface ZodSchemaTypeOptions {
|
|
10
|
+
/** Name for GraphQL/JSON Schema representation */
|
|
11
|
+
name?: string;
|
|
12
|
+
/** Description for documentation */
|
|
13
|
+
description?: string;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Wrapper to use a raw Zod schema as a SchemaType.
|
|
17
|
+
* Enables schema definition directly with Zod for maximum flexibility.
|
|
18
|
+
*
|
|
19
|
+
* @template T - The Zod schema type being wrapped
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* const UserSchema = fromZod(
|
|
24
|
+
* z.object({
|
|
25
|
+
* id: z.string().uuid(),
|
|
26
|
+
* name: z.string().min(1),
|
|
27
|
+
* email: z.string().email(),
|
|
28
|
+
* }),
|
|
29
|
+
* { name: 'User' }
|
|
30
|
+
* );
|
|
31
|
+
*
|
|
32
|
+
* // Use in SchemaModel
|
|
33
|
+
* const CreateUserInput = new SchemaModel({
|
|
34
|
+
* name: 'CreateUserInput',
|
|
35
|
+
* fields: {
|
|
36
|
+
* user: { type: UserSchema, isOptional: false },
|
|
37
|
+
* },
|
|
38
|
+
* });
|
|
39
|
+
* ```
|
|
40
|
+
*/
|
|
41
|
+
declare class ZodSchemaType<T extends z$1.ZodType> implements SchemaModelType<z$1.infer<T>> {
|
|
42
|
+
private readonly schema;
|
|
43
|
+
private readonly options;
|
|
44
|
+
constructor(schema: T, options?: ZodSchemaTypeOptions);
|
|
45
|
+
/**
|
|
46
|
+
* Return the wrapped Zod schema.
|
|
47
|
+
*/
|
|
48
|
+
getZod(): z$1.ZodType<z$1.infer<T>>;
|
|
49
|
+
/**
|
|
50
|
+
* Return JSON Schema representation using Zod's toJSONSchema.
|
|
51
|
+
*/
|
|
52
|
+
getJsonSchema(): unknown;
|
|
53
|
+
/**
|
|
54
|
+
* Return GraphQL type info.
|
|
55
|
+
* For complex Zod types, defaults to JSON scalar.
|
|
56
|
+
*/
|
|
57
|
+
getPothos(): {
|
|
58
|
+
type: string;
|
|
59
|
+
name?: string;
|
|
60
|
+
};
|
|
61
|
+
/**
|
|
62
|
+
* Get the configured name for this schema.
|
|
63
|
+
*/
|
|
64
|
+
getName(): string | undefined;
|
|
65
|
+
/**
|
|
66
|
+
* Get the configured description for this schema.
|
|
67
|
+
*/
|
|
68
|
+
getDescription(): string | undefined;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Helper to wrap a raw Zod schema as a SchemaType.
|
|
72
|
+
*
|
|
73
|
+
* @param schema - The Zod schema to wrap
|
|
74
|
+
* @param options - Optional configuration
|
|
75
|
+
* @returns A SchemaType-compatible wrapper
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* const AddressSchema = fromZod(
|
|
80
|
+
* z.object({
|
|
81
|
+
* street: z.string(),
|
|
82
|
+
* city: z.string(),
|
|
83
|
+
* country: z.string(),
|
|
84
|
+
* }),
|
|
85
|
+
* { name: 'Address', description: 'Physical address' }
|
|
86
|
+
* );
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
declare const fromZod: <T extends z$1.ZodType>(schema: T, options?: ZodSchemaTypeOptions) => ZodSchemaType<T>;
|
|
90
|
+
//#endregion
|
|
91
|
+
export { ZodSchemaType, ZodSchemaTypeOptions, fromZod };
|
|
92
|
+
//# sourceMappingURL=ZodSchemaType.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ZodSchemaType.d.ts","names":[],"sources":["../src/ZodSchemaType.ts"],"sourcesContent":[],"mappings":";;;;;;;;AA8Dc,UA/CG,oBAAA,CA+CH;EAd6C;EAAe,IAAA,CAAA,EAAA,MAAA;EAmE7D;EAAqB,WAAE,CAAA,EAAA,MAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAnEvB,wBAAwB,GAAA,CAAE,oBAAoB,gBACzD,GAAA,CAAE,MAAM;;;sBAKY,aAAY;;;;YAQtB,GAAA,CAAE,QAAQ,GAAA,CAAE,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cAqDjB,oBAAqB,GAAA,CAAE,iBAC1B,aACE,yBACT,cAAc"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import * as z$1 from "zod";
|
|
2
|
+
|
|
3
|
+
//#region src/ZodSchemaType.ts
|
|
4
|
+
/**
|
|
5
|
+
* Zod schema wrapper for ContractSpec compatibility.
|
|
6
|
+
*
|
|
7
|
+
* Wraps raw Zod schemas to implement the SchemaType interface,
|
|
8
|
+
* enabling direct Zod usage in ContractSpec definitions.
|
|
9
|
+
*
|
|
10
|
+
* @module ZodSchemaType
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Wrapper to use a raw Zod schema as a SchemaType.
|
|
14
|
+
* Enables schema definition directly with Zod for maximum flexibility.
|
|
15
|
+
*
|
|
16
|
+
* @template T - The Zod schema type being wrapped
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* const UserSchema = fromZod(
|
|
21
|
+
* z.object({
|
|
22
|
+
* id: z.string().uuid(),
|
|
23
|
+
* name: z.string().min(1),
|
|
24
|
+
* email: z.string().email(),
|
|
25
|
+
* }),
|
|
26
|
+
* { name: 'User' }
|
|
27
|
+
* );
|
|
28
|
+
*
|
|
29
|
+
* // Use in SchemaModel
|
|
30
|
+
* const CreateUserInput = new SchemaModel({
|
|
31
|
+
* name: 'CreateUserInput',
|
|
32
|
+
* fields: {
|
|
33
|
+
* user: { type: UserSchema, isOptional: false },
|
|
34
|
+
* },
|
|
35
|
+
* });
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
var ZodSchemaType = class {
|
|
39
|
+
schema;
|
|
40
|
+
options;
|
|
41
|
+
constructor(schema, options = {}) {
|
|
42
|
+
this.schema = schema;
|
|
43
|
+
this.options = options;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Return the wrapped Zod schema.
|
|
47
|
+
*/
|
|
48
|
+
getZod() {
|
|
49
|
+
return this.schema;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Return JSON Schema representation using Zod's toJSONSchema.
|
|
53
|
+
*/
|
|
54
|
+
getJsonSchema() {
|
|
55
|
+
return z$1.toJSONSchema(this.schema);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Return GraphQL type info.
|
|
59
|
+
* For complex Zod types, defaults to JSON scalar.
|
|
60
|
+
*/
|
|
61
|
+
getPothos() {
|
|
62
|
+
return {
|
|
63
|
+
type: "JSON",
|
|
64
|
+
name: this.options.name
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
/**
|
|
68
|
+
* Get the configured name for this schema.
|
|
69
|
+
*/
|
|
70
|
+
getName() {
|
|
71
|
+
return this.options.name;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Get the configured description for this schema.
|
|
75
|
+
*/
|
|
76
|
+
getDescription() {
|
|
77
|
+
return this.options.description;
|
|
78
|
+
}
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Helper to wrap a raw Zod schema as a SchemaType.
|
|
82
|
+
*
|
|
83
|
+
* @param schema - The Zod schema to wrap
|
|
84
|
+
* @param options - Optional configuration
|
|
85
|
+
* @returns A SchemaType-compatible wrapper
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```typescript
|
|
89
|
+
* const AddressSchema = fromZod(
|
|
90
|
+
* z.object({
|
|
91
|
+
* street: z.string(),
|
|
92
|
+
* city: z.string(),
|
|
93
|
+
* country: z.string(),
|
|
94
|
+
* }),
|
|
95
|
+
* { name: 'Address', description: 'Physical address' }
|
|
96
|
+
* );
|
|
97
|
+
* ```
|
|
98
|
+
*/
|
|
99
|
+
const fromZod = (schema, options) => new ZodSchemaType(schema, options);
|
|
100
|
+
|
|
101
|
+
//#endregion
|
|
102
|
+
export { ZodSchemaType, fromZod };
|
|
103
|
+
//# sourceMappingURL=ZodSchemaType.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ZodSchemaType.js","names":["z"],"sources":["../src/ZodSchemaType.ts"],"sourcesContent":["/**\n * Zod schema wrapper for ContractSpec compatibility.\n *\n * Wraps raw Zod schemas to implement the SchemaType interface,\n * enabling direct Zod usage in ContractSpec definitions.\n *\n * @module ZodSchemaType\n */\n\nimport * as z from 'zod';\nimport type { SchemaModelType } from './SchemaModelType';\n\n/**\n * Options for ZodSchemaType wrapper.\n */\nexport interface ZodSchemaTypeOptions {\n /** Name for GraphQL/JSON Schema representation */\n name?: string;\n /** Description for documentation */\n description?: string;\n}\n\n/**\n * Wrapper to use a raw Zod schema as a SchemaType.\n * Enables schema definition directly with Zod for maximum flexibility.\n *\n * @template T - The Zod schema type being wrapped\n *\n * @example\n * ```typescript\n * const UserSchema = fromZod(\n * z.object({\n * id: z.string().uuid(),\n * name: z.string().min(1),\n * email: z.string().email(),\n * }),\n * { name: 'User' }\n * );\n *\n * // Use in SchemaModel\n * const CreateUserInput = new SchemaModel({\n * name: 'CreateUserInput',\n * fields: {\n * user: { type: UserSchema, isOptional: false },\n * },\n * });\n * ```\n */\nexport class ZodSchemaType<T extends z.ZodType> implements SchemaModelType<\n z.infer<T>\n> {\n private readonly schema: T;\n private readonly options: ZodSchemaTypeOptions;\n\n constructor(schema: T, options: ZodSchemaTypeOptions = {}) {\n this.schema = schema;\n this.options = options;\n }\n\n /**\n * Return the wrapped Zod schema.\n */\n getZod(): z.ZodType<z.infer<T>> {\n return this.schema as z.ZodType<z.infer<T>>;\n }\n\n /**\n * Return JSON Schema representation using Zod's toJSONSchema.\n */\n getJsonSchema(): unknown {\n return z.toJSONSchema(this.schema);\n }\n\n /**\n * Return GraphQL type info.\n * For complex Zod types, defaults to JSON scalar.\n */\n getPothos(): { type: string; name?: string } {\n return { type: 'JSON', name: this.options.name };\n }\n\n /**\n * Get the configured name for this schema.\n */\n getName(): string | undefined {\n return this.options.name;\n }\n\n /**\n * Get the configured description for this schema.\n */\n getDescription(): string | undefined {\n return this.options.description;\n }\n}\n\n/**\n * Helper to wrap a raw Zod schema as a SchemaType.\n *\n * @param schema - The Zod schema to wrap\n * @param options - Optional configuration\n * @returns A SchemaType-compatible wrapper\n *\n * @example\n * ```typescript\n * const AddressSchema = fromZod(\n * z.object({\n * street: z.string(),\n * city: z.string(),\n * country: z.string(),\n * }),\n * { name: 'Address', description: 'Physical address' }\n * );\n * ```\n */\nexport const fromZod = <T extends z.ZodType>(\n schema: T,\n options?: ZodSchemaTypeOptions\n): ZodSchemaType<T> => new ZodSchemaType(schema, options);\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgDA,IAAa,gBAAb,MAEE;CACA,AAAiB;CACjB,AAAiB;CAEjB,YAAY,QAAW,UAAgC,EAAE,EAAE;AACzD,OAAK,SAAS;AACd,OAAK,UAAU;;;;;CAMjB,SAAgC;AAC9B,SAAO,KAAK;;;;;CAMd,gBAAyB;AACvB,SAAOA,IAAE,aAAa,KAAK,OAAO;;;;;;CAOpC,YAA6C;AAC3C,SAAO;GAAE,MAAM;GAAQ,MAAM,KAAK,QAAQ;GAAM;;;;;CAMlD,UAA8B;AAC5B,SAAO,KAAK,QAAQ;;;;;CAMtB,iBAAqC;AACnC,SAAO,KAAK,QAAQ;;;;;;;;;;;;;;;;;;;;;;AAuBxB,MAAa,WACX,QACA,YACqB,IAAI,cAAc,QAAQ,QAAQ"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { EntityEnumDef, EntityEnumField, EntityField, EntityIndex, EntityRelationField, EntityScalarField, EntitySpec } from "./types.js";
|
|
2
|
+
|
|
3
|
+
//#region src/entity/defineEntity.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Helper to define a database entity with full type safety.
|
|
7
|
+
*
|
|
8
|
+
* @example
|
|
9
|
+
* ```typescript
|
|
10
|
+
* const UserEntity = defineEntity({
|
|
11
|
+
* name: 'User',
|
|
12
|
+
* schema: 'lssm_sigil',
|
|
13
|
+
* description: 'A user of the platform.',
|
|
14
|
+
* fields: {
|
|
15
|
+
* id: field.id(),
|
|
16
|
+
* email: field.string({ isUnique: true, zod: z.string().email() }),
|
|
17
|
+
* name: field.string({ isOptional: true }),
|
|
18
|
+
* createdAt: field.createdAt(),
|
|
19
|
+
* updatedAt: field.updatedAt(),
|
|
20
|
+
* memberships: field.hasMany('Member'),
|
|
21
|
+
* },
|
|
22
|
+
* indexes: [{ fields: ['email'], unique: true }],
|
|
23
|
+
* });
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
declare function defineEntity<TFields extends Record<string, EntityField>>(spec: EntitySpec<TFields>): EntitySpec<TFields>;
|
|
27
|
+
/**
|
|
28
|
+
* Helper to define an enum that can be shared across entities.
|
|
29
|
+
*/
|
|
30
|
+
declare function defineEntityEnum(def: EntityEnumDef): EntityEnumDef;
|
|
31
|
+
/**
|
|
32
|
+
* Field builder helpers for common field patterns.
|
|
33
|
+
*/
|
|
34
|
+
declare const field: {
|
|
35
|
+
/** String field */
|
|
36
|
+
string(opts?: Partial<Omit<EntityScalarField, "kind" | "type">>): EntityScalarField;
|
|
37
|
+
/** Integer field */
|
|
38
|
+
int(opts?: Partial<Omit<EntityScalarField, "kind" | "type">>): EntityScalarField;
|
|
39
|
+
/** Float field */
|
|
40
|
+
float(opts?: Partial<Omit<EntityScalarField, "kind" | "type">>): EntityScalarField;
|
|
41
|
+
/** Boolean field */
|
|
42
|
+
boolean(opts?: Partial<Omit<EntityScalarField, "kind" | "type">>): EntityScalarField;
|
|
43
|
+
/** DateTime field */
|
|
44
|
+
dateTime(opts?: Partial<Omit<EntityScalarField, "kind" | "type">>): EntityScalarField;
|
|
45
|
+
/** JSON field */
|
|
46
|
+
json(opts?: Partial<Omit<EntityScalarField, "kind" | "type">>): EntityScalarField;
|
|
47
|
+
/** BigInt field */
|
|
48
|
+
bigInt(opts?: Partial<Omit<EntityScalarField, "kind" | "type">>): EntityScalarField;
|
|
49
|
+
/** Decimal field */
|
|
50
|
+
decimal(opts?: Partial<Omit<EntityScalarField, "kind" | "type">>): EntityScalarField;
|
|
51
|
+
/** Bytes field */
|
|
52
|
+
bytes(opts?: Partial<Omit<EntityScalarField, "kind" | "type">>): EntityScalarField;
|
|
53
|
+
/** Primary key field with cuid() default */
|
|
54
|
+
id(opts?: Partial<Omit<EntityScalarField, "kind" | "type" | "isId">>): EntityScalarField;
|
|
55
|
+
/** Primary key field with uuid() default */
|
|
56
|
+
uuid(opts?: Partial<Omit<EntityScalarField, "kind" | "type" | "isId">>): EntityScalarField;
|
|
57
|
+
/** Auto-increment integer primary key */
|
|
58
|
+
autoIncrement(opts?: Partial<Omit<EntityScalarField, "kind" | "type" | "isId">>): EntityScalarField;
|
|
59
|
+
/** createdAt timestamp with now() default */
|
|
60
|
+
createdAt(opts?: Partial<Omit<EntityScalarField, "kind" | "type" | "default">>): EntityScalarField;
|
|
61
|
+
/** updatedAt timestamp with @updatedAt */
|
|
62
|
+
updatedAt(opts?: Partial<Omit<EntityScalarField, "kind" | "type" | "updatedAt">>): EntityScalarField;
|
|
63
|
+
/** Email field with validation */
|
|
64
|
+
email(opts?: Partial<Omit<EntityScalarField, "kind" | "type">>): EntityScalarField;
|
|
65
|
+
/** URL field with validation */
|
|
66
|
+
url(opts?: Partial<Omit<EntityScalarField, "kind" | "type">>): EntityScalarField;
|
|
67
|
+
/** Enum field */
|
|
68
|
+
enum(enumName: string, opts?: Partial<Omit<EntityEnumField, "kind" | "enumName">>): EntityEnumField;
|
|
69
|
+
/** Inline enum field with values */
|
|
70
|
+
inlineEnum(enumName: string, values: readonly string[], opts?: Partial<Omit<EntityEnumField, "kind" | "enumName" | "values">>): EntityEnumField;
|
|
71
|
+
/** Has one relation (1:1 inverse side) */
|
|
72
|
+
hasOne(target: string, opts?: Partial<Omit<EntityRelationField, "kind" | "type" | "target">>): EntityRelationField;
|
|
73
|
+
/** Has many relation (1:N inverse side) */
|
|
74
|
+
hasMany(target: string, opts?: Partial<Omit<EntityRelationField, "kind" | "type" | "target">>): EntityRelationField;
|
|
75
|
+
/** Belongs to relation (N:1 owning side with foreign key) */
|
|
76
|
+
belongsTo(target: string, fields: string[], references: string[], opts?: Partial<Omit<EntityRelationField, "kind" | "type" | "target" | "fields" | "references">>): EntityRelationField;
|
|
77
|
+
/** Foreign key field (string) - use with belongsTo */
|
|
78
|
+
foreignKey(opts?: Partial<Omit<EntityScalarField, "kind" | "type">>): EntityScalarField;
|
|
79
|
+
};
|
|
80
|
+
/**
|
|
81
|
+
* Index builder helpers.
|
|
82
|
+
*/
|
|
83
|
+
declare const index: {
|
|
84
|
+
/** Create a regular index */
|
|
85
|
+
on(fields: string[], opts?: Partial<Omit<EntityIndex, "fields">>): EntityIndex;
|
|
86
|
+
/** Create a unique constraint index */
|
|
87
|
+
unique(fields: string[], opts?: Partial<Omit<EntityIndex, "fields" | "unique">>): EntityIndex;
|
|
88
|
+
/** Create a compound index with sort orders */
|
|
89
|
+
compound(fields: string[], sort: Record<string, "Asc" | "Desc">, opts?: Partial<Omit<EntityIndex, "fields" | "sort">>): EntityIndex;
|
|
90
|
+
};
|
|
91
|
+
//#endregion
|
|
92
|
+
export { defineEntity, defineEntityEnum, field, index };
|
|
93
|
+
//# sourceMappingURL=defineEntity.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defineEntity.d.ts","names":[],"sources":["../../src/entity/defineEntity.ts"],"sourcesContent":[],"mappings":"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"}
|
|
@@ -0,0 +1,237 @@
|
|
|
1
|
+
import * as z$1 from "zod";
|
|
2
|
+
|
|
3
|
+
//#region src/entity/defineEntity.ts
|
|
4
|
+
/**
|
|
5
|
+
* Helper to define a database entity with full type safety.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```typescript
|
|
9
|
+
* const UserEntity = defineEntity({
|
|
10
|
+
* name: 'User',
|
|
11
|
+
* schema: 'lssm_sigil',
|
|
12
|
+
* description: 'A user of the platform.',
|
|
13
|
+
* fields: {
|
|
14
|
+
* id: field.id(),
|
|
15
|
+
* email: field.string({ isUnique: true, zod: z.string().email() }),
|
|
16
|
+
* name: field.string({ isOptional: true }),
|
|
17
|
+
* createdAt: field.createdAt(),
|
|
18
|
+
* updatedAt: field.updatedAt(),
|
|
19
|
+
* memberships: field.hasMany('Member'),
|
|
20
|
+
* },
|
|
21
|
+
* indexes: [{ fields: ['email'], unique: true }],
|
|
22
|
+
* });
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
function defineEntity(spec) {
|
|
26
|
+
return spec;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Helper to define an enum that can be shared across entities.
|
|
30
|
+
*/
|
|
31
|
+
function defineEntityEnum(def) {
|
|
32
|
+
return def;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Field builder helpers for common field patterns.
|
|
36
|
+
*/
|
|
37
|
+
const field = {
|
|
38
|
+
string(opts) {
|
|
39
|
+
return {
|
|
40
|
+
kind: "scalar",
|
|
41
|
+
type: "String",
|
|
42
|
+
...opts
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
int(opts) {
|
|
46
|
+
return {
|
|
47
|
+
kind: "scalar",
|
|
48
|
+
type: "Int",
|
|
49
|
+
...opts
|
|
50
|
+
};
|
|
51
|
+
},
|
|
52
|
+
float(opts) {
|
|
53
|
+
return {
|
|
54
|
+
kind: "scalar",
|
|
55
|
+
type: "Float",
|
|
56
|
+
...opts
|
|
57
|
+
};
|
|
58
|
+
},
|
|
59
|
+
boolean(opts) {
|
|
60
|
+
return {
|
|
61
|
+
kind: "scalar",
|
|
62
|
+
type: "Boolean",
|
|
63
|
+
...opts
|
|
64
|
+
};
|
|
65
|
+
},
|
|
66
|
+
dateTime(opts) {
|
|
67
|
+
return {
|
|
68
|
+
kind: "scalar",
|
|
69
|
+
type: "DateTime",
|
|
70
|
+
...opts
|
|
71
|
+
};
|
|
72
|
+
},
|
|
73
|
+
json(opts) {
|
|
74
|
+
return {
|
|
75
|
+
kind: "scalar",
|
|
76
|
+
type: "Json",
|
|
77
|
+
...opts
|
|
78
|
+
};
|
|
79
|
+
},
|
|
80
|
+
bigInt(opts) {
|
|
81
|
+
return {
|
|
82
|
+
kind: "scalar",
|
|
83
|
+
type: "BigInt",
|
|
84
|
+
...opts
|
|
85
|
+
};
|
|
86
|
+
},
|
|
87
|
+
decimal(opts) {
|
|
88
|
+
return {
|
|
89
|
+
kind: "scalar",
|
|
90
|
+
type: "Decimal",
|
|
91
|
+
...opts
|
|
92
|
+
};
|
|
93
|
+
},
|
|
94
|
+
bytes(opts) {
|
|
95
|
+
return {
|
|
96
|
+
kind: "scalar",
|
|
97
|
+
type: "Bytes",
|
|
98
|
+
...opts
|
|
99
|
+
};
|
|
100
|
+
},
|
|
101
|
+
id(opts) {
|
|
102
|
+
return {
|
|
103
|
+
kind: "scalar",
|
|
104
|
+
type: "String",
|
|
105
|
+
isId: true,
|
|
106
|
+
default: "cuid()",
|
|
107
|
+
...opts
|
|
108
|
+
};
|
|
109
|
+
},
|
|
110
|
+
uuid(opts) {
|
|
111
|
+
return {
|
|
112
|
+
kind: "scalar",
|
|
113
|
+
type: "String",
|
|
114
|
+
isId: true,
|
|
115
|
+
default: "uuid()",
|
|
116
|
+
...opts
|
|
117
|
+
};
|
|
118
|
+
},
|
|
119
|
+
autoIncrement(opts) {
|
|
120
|
+
return {
|
|
121
|
+
kind: "scalar",
|
|
122
|
+
type: "Int",
|
|
123
|
+
isId: true,
|
|
124
|
+
default: "autoincrement()",
|
|
125
|
+
...opts
|
|
126
|
+
};
|
|
127
|
+
},
|
|
128
|
+
createdAt(opts) {
|
|
129
|
+
return {
|
|
130
|
+
kind: "scalar",
|
|
131
|
+
type: "DateTime",
|
|
132
|
+
default: "now()",
|
|
133
|
+
...opts
|
|
134
|
+
};
|
|
135
|
+
},
|
|
136
|
+
updatedAt(opts) {
|
|
137
|
+
return {
|
|
138
|
+
kind: "scalar",
|
|
139
|
+
type: "DateTime",
|
|
140
|
+
updatedAt: true,
|
|
141
|
+
...opts
|
|
142
|
+
};
|
|
143
|
+
},
|
|
144
|
+
email(opts) {
|
|
145
|
+
return {
|
|
146
|
+
kind: "scalar",
|
|
147
|
+
type: "String",
|
|
148
|
+
zod: z$1.email(),
|
|
149
|
+
...opts
|
|
150
|
+
};
|
|
151
|
+
},
|
|
152
|
+
url(opts) {
|
|
153
|
+
return {
|
|
154
|
+
kind: "scalar",
|
|
155
|
+
type: "String",
|
|
156
|
+
zod: z$1.url(),
|
|
157
|
+
...opts
|
|
158
|
+
};
|
|
159
|
+
},
|
|
160
|
+
enum(enumName, opts) {
|
|
161
|
+
return {
|
|
162
|
+
kind: "enum",
|
|
163
|
+
enumName,
|
|
164
|
+
...opts
|
|
165
|
+
};
|
|
166
|
+
},
|
|
167
|
+
inlineEnum(enumName, values, opts) {
|
|
168
|
+
return {
|
|
169
|
+
kind: "enum",
|
|
170
|
+
enumName,
|
|
171
|
+
values,
|
|
172
|
+
...opts
|
|
173
|
+
};
|
|
174
|
+
},
|
|
175
|
+
hasOne(target, opts) {
|
|
176
|
+
return {
|
|
177
|
+
kind: "relation",
|
|
178
|
+
type: "hasOne",
|
|
179
|
+
target,
|
|
180
|
+
...opts
|
|
181
|
+
};
|
|
182
|
+
},
|
|
183
|
+
hasMany(target, opts) {
|
|
184
|
+
return {
|
|
185
|
+
kind: "relation",
|
|
186
|
+
type: "hasMany",
|
|
187
|
+
target,
|
|
188
|
+
...opts
|
|
189
|
+
};
|
|
190
|
+
},
|
|
191
|
+
belongsTo(target, fields, references, opts) {
|
|
192
|
+
return {
|
|
193
|
+
kind: "relation",
|
|
194
|
+
type: "belongsTo",
|
|
195
|
+
target,
|
|
196
|
+
fields,
|
|
197
|
+
references,
|
|
198
|
+
...opts
|
|
199
|
+
};
|
|
200
|
+
},
|
|
201
|
+
foreignKey(opts) {
|
|
202
|
+
return {
|
|
203
|
+
kind: "scalar",
|
|
204
|
+
type: "String",
|
|
205
|
+
...opts
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
};
|
|
209
|
+
/**
|
|
210
|
+
* Index builder helpers.
|
|
211
|
+
*/
|
|
212
|
+
const index = {
|
|
213
|
+
on(fields, opts) {
|
|
214
|
+
return {
|
|
215
|
+
fields,
|
|
216
|
+
...opts
|
|
217
|
+
};
|
|
218
|
+
},
|
|
219
|
+
unique(fields, opts) {
|
|
220
|
+
return {
|
|
221
|
+
fields,
|
|
222
|
+
unique: true,
|
|
223
|
+
...opts
|
|
224
|
+
};
|
|
225
|
+
},
|
|
226
|
+
compound(fields, sort, opts) {
|
|
227
|
+
return {
|
|
228
|
+
fields,
|
|
229
|
+
sort,
|
|
230
|
+
...opts
|
|
231
|
+
};
|
|
232
|
+
}
|
|
233
|
+
};
|
|
234
|
+
|
|
235
|
+
//#endregion
|
|
236
|
+
export { defineEntity, defineEntityEnum, field, index };
|
|
237
|
+
//# sourceMappingURL=defineEntity.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"defineEntity.js","names":["z"],"sources":["../../src/entity/defineEntity.ts"],"sourcesContent":["import * as z from 'zod';\nimport type {\n EntityEnumDef,\n EntityEnumField,\n EntityField,\n EntityIndex,\n EntityRelationField,\n EntityScalarField,\n EntitySpec,\n} from './types';\n\n/**\n * Helper to define a database entity with full type safety.\n *\n * @example\n * ```typescript\n * const UserEntity = defineEntity({\n * name: 'User',\n * schema: 'lssm_sigil',\n * description: 'A user of the platform.',\n * fields: {\n * id: field.id(),\n * email: field.string({ isUnique: true, zod: z.string().email() }),\n * name: field.string({ isOptional: true }),\n * createdAt: field.createdAt(),\n * updatedAt: field.updatedAt(),\n * memberships: field.hasMany('Member'),\n * },\n * indexes: [{ fields: ['email'], unique: true }],\n * });\n * ```\n */\nexport function defineEntity<TFields extends Record<string, EntityField>>(\n spec: EntitySpec<TFields>\n): EntitySpec<TFields> {\n return spec;\n}\n\n/**\n * Helper to define an enum that can be shared across entities.\n */\nexport function defineEntityEnum(def: EntityEnumDef): EntityEnumDef {\n return def;\n}\n\n/**\n * Field builder helpers for common field patterns.\n */\nexport const field = {\n // ============ Scalar fields ============\n\n /** String field */\n string(\n opts?: Partial<Omit<EntityScalarField, 'kind' | 'type'>>\n ): EntityScalarField {\n return { kind: 'scalar', type: 'String', ...opts };\n },\n\n /** Integer field */\n int(\n opts?: Partial<Omit<EntityScalarField, 'kind' | 'type'>>\n ): EntityScalarField {\n return { kind: 'scalar', type: 'Int', ...opts };\n },\n\n /** Float field */\n float(\n opts?: Partial<Omit<EntityScalarField, 'kind' | 'type'>>\n ): EntityScalarField {\n return { kind: 'scalar', type: 'Float', ...opts };\n },\n\n /** Boolean field */\n boolean(\n opts?: Partial<Omit<EntityScalarField, 'kind' | 'type'>>\n ): EntityScalarField {\n return { kind: 'scalar', type: 'Boolean', ...opts };\n },\n\n /** DateTime field */\n dateTime(\n opts?: Partial<Omit<EntityScalarField, 'kind' | 'type'>>\n ): EntityScalarField {\n return { kind: 'scalar', type: 'DateTime', ...opts };\n },\n\n /** JSON field */\n json(\n opts?: Partial<Omit<EntityScalarField, 'kind' | 'type'>>\n ): EntityScalarField {\n return { kind: 'scalar', type: 'Json', ...opts };\n },\n\n /** BigInt field */\n bigInt(\n opts?: Partial<Omit<EntityScalarField, 'kind' | 'type'>>\n ): EntityScalarField {\n return { kind: 'scalar', type: 'BigInt', ...opts };\n },\n\n /** Decimal field */\n decimal(\n opts?: Partial<Omit<EntityScalarField, 'kind' | 'type'>>\n ): EntityScalarField {\n return { kind: 'scalar', type: 'Decimal', ...opts };\n },\n\n /** Bytes field */\n bytes(\n opts?: Partial<Omit<EntityScalarField, 'kind' | 'type'>>\n ): EntityScalarField {\n return { kind: 'scalar', type: 'Bytes', ...opts };\n },\n\n // ============ Common patterns ============\n\n /** Primary key field with cuid() default */\n id(\n opts?: Partial<Omit<EntityScalarField, 'kind' | 'type' | 'isId'>>\n ): EntityScalarField {\n return {\n kind: 'scalar',\n type: 'String',\n isId: true,\n default: 'cuid()',\n ...opts,\n };\n },\n\n /** Primary key field with uuid() default */\n uuid(\n opts?: Partial<Omit<EntityScalarField, 'kind' | 'type' | 'isId'>>\n ): EntityScalarField {\n return {\n kind: 'scalar',\n type: 'String',\n isId: true,\n default: 'uuid()',\n ...opts,\n };\n },\n\n /** Auto-increment integer primary key */\n autoIncrement(\n opts?: Partial<Omit<EntityScalarField, 'kind' | 'type' | 'isId'>>\n ): EntityScalarField {\n return {\n kind: 'scalar',\n type: 'Int',\n isId: true,\n default: 'autoincrement()',\n ...opts,\n };\n },\n\n /** createdAt timestamp with now() default */\n createdAt(\n opts?: Partial<Omit<EntityScalarField, 'kind' | 'type' | 'default'>>\n ): EntityScalarField {\n return { kind: 'scalar', type: 'DateTime', default: 'now()', ...opts };\n },\n\n /** updatedAt timestamp with @updatedAt */\n updatedAt(\n opts?: Partial<Omit<EntityScalarField, 'kind' | 'type' | 'updatedAt'>>\n ): EntityScalarField {\n return { kind: 'scalar', type: 'DateTime', updatedAt: true, ...opts };\n },\n\n /** Email field with validation */\n email(\n opts?: Partial<Omit<EntityScalarField, 'kind' | 'type'>>\n ): EntityScalarField {\n return {\n kind: 'scalar',\n type: 'String',\n zod: z.email(),\n ...opts,\n };\n },\n\n /** URL field with validation */\n url(\n opts?: Partial<Omit<EntityScalarField, 'kind' | 'type'>>\n ): EntityScalarField {\n return {\n kind: 'scalar',\n type: 'String',\n zod: z.url(),\n ...opts,\n };\n },\n\n // ============ Enum fields ============\n\n /** Enum field */\n enum(\n enumName: string,\n opts?: Partial<Omit<EntityEnumField, 'kind' | 'enumName'>>\n ): EntityEnumField {\n return { kind: 'enum', enumName, ...opts };\n },\n\n /** Inline enum field with values */\n inlineEnum(\n enumName: string,\n values: readonly string[],\n opts?: Partial<Omit<EntityEnumField, 'kind' | 'enumName' | 'values'>>\n ): EntityEnumField {\n return { kind: 'enum', enumName, values, ...opts };\n },\n\n // ============ Relation fields ============\n\n /** Has one relation (1:1 inverse side) */\n hasOne(\n target: string,\n opts?: Partial<Omit<EntityRelationField, 'kind' | 'type' | 'target'>>\n ): EntityRelationField {\n return { kind: 'relation', type: 'hasOne', target, ...opts };\n },\n\n /** Has many relation (1:N inverse side) */\n hasMany(\n target: string,\n opts?: Partial<Omit<EntityRelationField, 'kind' | 'type' | 'target'>>\n ): EntityRelationField {\n return { kind: 'relation', type: 'hasMany', target, ...opts };\n },\n\n /** Belongs to relation (N:1 owning side with foreign key) */\n belongsTo(\n target: string,\n fields: string[],\n references: string[],\n opts?: Partial<\n Omit<\n EntityRelationField,\n 'kind' | 'type' | 'target' | 'fields' | 'references'\n >\n >\n ): EntityRelationField {\n return {\n kind: 'relation',\n type: 'belongsTo',\n target,\n fields,\n references,\n ...opts,\n };\n },\n\n /** Foreign key field (string) - use with belongsTo */\n foreignKey(\n opts?: Partial<Omit<EntityScalarField, 'kind' | 'type'>>\n ): EntityScalarField {\n return { kind: 'scalar', type: 'String', ...opts };\n },\n};\n\n/**\n * Index builder helpers.\n */\nexport const index = {\n /** Create a regular index */\n on(\n fields: string[],\n opts?: Partial<Omit<EntityIndex, 'fields'>>\n ): EntityIndex {\n return { fields, ...opts };\n },\n\n /** Create a unique constraint index */\n unique(\n fields: string[],\n opts?: Partial<Omit<EntityIndex, 'fields' | 'unique'>>\n ): EntityIndex {\n return { fields, unique: true, ...opts };\n },\n\n /** Create a compound index with sort orders */\n compound(\n fields: string[],\n sort: Record<string, 'Asc' | 'Desc'>,\n opts?: Partial<Omit<EntityIndex, 'fields' | 'sort'>>\n ): EntityIndex {\n return { fields, sort, ...opts };\n },\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AAgCA,SAAgB,aACd,MACqB;AACrB,QAAO;;;;;AAMT,SAAgB,iBAAiB,KAAmC;AAClE,QAAO;;;;;AAMT,MAAa,QAAQ;CAInB,OACE,MACmB;AACnB,SAAO;GAAE,MAAM;GAAU,MAAM;GAAU,GAAG;GAAM;;CAIpD,IACE,MACmB;AACnB,SAAO;GAAE,MAAM;GAAU,MAAM;GAAO,GAAG;GAAM;;CAIjD,MACE,MACmB;AACnB,SAAO;GAAE,MAAM;GAAU,MAAM;GAAS,GAAG;GAAM;;CAInD,QACE,MACmB;AACnB,SAAO;GAAE,MAAM;GAAU,MAAM;GAAW,GAAG;GAAM;;CAIrD,SACE,MACmB;AACnB,SAAO;GAAE,MAAM;GAAU,MAAM;GAAY,GAAG;GAAM;;CAItD,KACE,MACmB;AACnB,SAAO;GAAE,MAAM;GAAU,MAAM;GAAQ,GAAG;GAAM;;CAIlD,OACE,MACmB;AACnB,SAAO;GAAE,MAAM;GAAU,MAAM;GAAU,GAAG;GAAM;;CAIpD,QACE,MACmB;AACnB,SAAO;GAAE,MAAM;GAAU,MAAM;GAAW,GAAG;GAAM;;CAIrD,MACE,MACmB;AACnB,SAAO;GAAE,MAAM;GAAU,MAAM;GAAS,GAAG;GAAM;;CAMnD,GACE,MACmB;AACnB,SAAO;GACL,MAAM;GACN,MAAM;GACN,MAAM;GACN,SAAS;GACT,GAAG;GACJ;;CAIH,KACE,MACmB;AACnB,SAAO;GACL,MAAM;GACN,MAAM;GACN,MAAM;GACN,SAAS;GACT,GAAG;GACJ;;CAIH,cACE,MACmB;AACnB,SAAO;GACL,MAAM;GACN,MAAM;GACN,MAAM;GACN,SAAS;GACT,GAAG;GACJ;;CAIH,UACE,MACmB;AACnB,SAAO;GAAE,MAAM;GAAU,MAAM;GAAY,SAAS;GAAS,GAAG;GAAM;;CAIxE,UACE,MACmB;AACnB,SAAO;GAAE,MAAM;GAAU,MAAM;GAAY,WAAW;GAAM,GAAG;GAAM;;CAIvE,MACE,MACmB;AACnB,SAAO;GACL,MAAM;GACN,MAAM;GACN,KAAKA,IAAE,OAAO;GACd,GAAG;GACJ;;CAIH,IACE,MACmB;AACnB,SAAO;GACL,MAAM;GACN,MAAM;GACN,KAAKA,IAAE,KAAK;GACZ,GAAG;GACJ;;CAMH,KACE,UACA,MACiB;AACjB,SAAO;GAAE,MAAM;GAAQ;GAAU,GAAG;GAAM;;CAI5C,WACE,UACA,QACA,MACiB;AACjB,SAAO;GAAE,MAAM;GAAQ;GAAU;GAAQ,GAAG;GAAM;;CAMpD,OACE,QACA,MACqB;AACrB,SAAO;GAAE,MAAM;GAAY,MAAM;GAAU;GAAQ,GAAG;GAAM;;CAI9D,QACE,QACA,MACqB;AACrB,SAAO;GAAE,MAAM;GAAY,MAAM;GAAW;GAAQ,GAAG;GAAM;;CAI/D,UACE,QACA,QACA,YACA,MAMqB;AACrB,SAAO;GACL,MAAM;GACN,MAAM;GACN;GACA;GACA;GACA,GAAG;GACJ;;CAIH,WACE,MACmB;AACnB,SAAO;GAAE,MAAM;GAAU,MAAM;GAAU,GAAG;GAAM;;CAErD;;;;AAKD,MAAa,QAAQ;CAEnB,GACE,QACA,MACa;AACb,SAAO;GAAE;GAAQ,GAAG;GAAM;;CAI5B,OACE,QACA,MACa;AACb,SAAO;GAAE;GAAQ,QAAQ;GAAM,GAAG;GAAM;;CAI1C,SACE,QACA,MACA,MACa;AACb,SAAO;GAAE;GAAQ;GAAM,GAAG;GAAM;;CAEnC"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { EntityEnumDef, EntitySpec, ModuleSchemaContribution } from "./types.js";
|
|
2
|
+
|
|
3
|
+
//#region src/entity/generator.d.ts
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Options for Prisma schema generation.
|
|
7
|
+
*/
|
|
8
|
+
interface PrismaGeneratorOptions {
|
|
9
|
+
/** Output file path for the generated schema */
|
|
10
|
+
outputPath?: string;
|
|
11
|
+
/** Prisma datasource provider (default: 'postgresql') */
|
|
12
|
+
provider?: 'postgresql' | 'mysql' | 'sqlite' | 'mongodb' | 'sqlserver';
|
|
13
|
+
/** Prisma generator output path */
|
|
14
|
+
clientOutput?: string;
|
|
15
|
+
/** Include Pothos generator */
|
|
16
|
+
includePothos?: boolean;
|
|
17
|
+
/** Pothos output path */
|
|
18
|
+
pothosOutput?: string;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Generate Prisma schema content from entity specifications.
|
|
22
|
+
*/
|
|
23
|
+
declare function generatePrismaSchema(entities: EntitySpec[], options?: PrismaGeneratorOptions): string;
|
|
24
|
+
/**
|
|
25
|
+
* Compose multiple module schema contributions into a single schema.
|
|
26
|
+
*/
|
|
27
|
+
declare function composeModuleSchemas(contributions: ModuleSchemaContribution[], options?: PrismaGeneratorOptions): string;
|
|
28
|
+
/**
|
|
29
|
+
* Generate a single entity's Prisma schema fragment (for modular output).
|
|
30
|
+
*/
|
|
31
|
+
declare function generateEntityFragment(entity: EntitySpec): string;
|
|
32
|
+
/**
|
|
33
|
+
* Generate a single enum's Prisma schema fragment (for modular output).
|
|
34
|
+
*/
|
|
35
|
+
declare function generateEnumFragment(enumDef: EntityEnumDef): string;
|
|
36
|
+
//#endregion
|
|
37
|
+
export { PrismaGeneratorOptions, composeModuleSchemas, generateEntityFragment, generateEnumFragment, generatePrismaSchema };
|
|
38
|
+
//# sourceMappingURL=generator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generator.d.ts","names":[],"sources":["../../src/entity/generator.ts"],"sourcesContent":[],"mappings":";;;;;;AAcA;AAgBgB,UAhBC,sBAAA,CAiBL;EA2WI;EAuCA,UAAA,CAAA,EAAA,MAAA;EAOA;;;;;;;;;;;;iBA1ZA,oBAAA,WACJ,wBACD;;;;iBA0WK,oBAAA,gBACC,sCACN;;;;iBAqCK,sBAAA,SAA+B;;;;iBAO/B,oBAAA,UAA8B"}
|