@zenstackhq/schema 3.4.0-beta.3 → 3.4.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/dist/index.cjs +140 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +106 -35
- package/dist/index.d.ts +106 -35
- package/dist/index.js +137 -1
- package/dist/index.js.map +1 -1
- package/package.json +7 -4
package/dist/index.cjs
CHANGED
|
@@ -21,7 +21,9 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
21
21
|
// src/index.ts
|
|
22
22
|
var src_exports = {};
|
|
23
23
|
__export(src_exports, {
|
|
24
|
-
ExpressionUtils: () => ExpressionUtils
|
|
24
|
+
ExpressionUtils: () => ExpressionUtils,
|
|
25
|
+
InvalidSchemaError: () => InvalidSchemaError,
|
|
26
|
+
SchemaAccessor: () => SchemaAccessor
|
|
25
27
|
});
|
|
26
28
|
module.exports = __toCommonJS(src_exports);
|
|
27
29
|
|
|
@@ -118,8 +120,144 @@ var ExpressionUtils = {
|
|
|
118
120
|
return ExpressionUtils.isLiteral(expr) ? expr.value : void 0;
|
|
119
121
|
}, "getLiteralValue")
|
|
120
122
|
};
|
|
123
|
+
|
|
124
|
+
// src/accessor.ts
|
|
125
|
+
var InvalidSchemaError = class extends Error {
|
|
126
|
+
static {
|
|
127
|
+
__name(this, "InvalidSchemaError");
|
|
128
|
+
}
|
|
129
|
+
constructor(message) {
|
|
130
|
+
super(message);
|
|
131
|
+
}
|
|
132
|
+
};
|
|
133
|
+
function _requireModel(schema, name) {
|
|
134
|
+
const model = schema.models[name];
|
|
135
|
+
if (!model) throw new InvalidSchemaError(`Model "${name}" not found in schema`);
|
|
136
|
+
return model;
|
|
137
|
+
}
|
|
138
|
+
__name(_requireModel, "_requireModel");
|
|
139
|
+
function _getField(schema, modelOrType, field) {
|
|
140
|
+
const modelDef = schema.models?.[modelOrType];
|
|
141
|
+
if (modelDef) {
|
|
142
|
+
return modelDef.fields[field];
|
|
143
|
+
}
|
|
144
|
+
const typeDef = schema.typeDefs?.[modelOrType];
|
|
145
|
+
if (typeDef) {
|
|
146
|
+
return typeDef.fields[field];
|
|
147
|
+
}
|
|
148
|
+
return void 0;
|
|
149
|
+
}
|
|
150
|
+
__name(_getField, "_getField");
|
|
151
|
+
function _requireField(schema, modelOrType, field) {
|
|
152
|
+
const fieldDef = _getField(schema, modelOrType, field);
|
|
153
|
+
if (!fieldDef) throw new InvalidSchemaError(`Field "${modelOrType}.${field}" not found in schema`);
|
|
154
|
+
return fieldDef;
|
|
155
|
+
}
|
|
156
|
+
__name(_requireField, "_requireField");
|
|
157
|
+
function _requireModelField(schema, model, field) {
|
|
158
|
+
const modelDef = _requireModel(schema, model);
|
|
159
|
+
const fieldDef = modelDef.fields[field];
|
|
160
|
+
if (!fieldDef) throw new InvalidSchemaError(`Field "${model}.${field}" not found in schema`);
|
|
161
|
+
return fieldDef;
|
|
162
|
+
}
|
|
163
|
+
__name(_requireModelField, "_requireModelField");
|
|
164
|
+
var accessors = {
|
|
165
|
+
get providerType() {
|
|
166
|
+
return this.schema.provider.type;
|
|
167
|
+
},
|
|
168
|
+
getModel(name) {
|
|
169
|
+
return this.schema.models[name];
|
|
170
|
+
},
|
|
171
|
+
requireModel(name) {
|
|
172
|
+
return _requireModel(this.schema, name);
|
|
173
|
+
},
|
|
174
|
+
getField(modelOrType, field) {
|
|
175
|
+
return _getField(this.schema, modelOrType, field);
|
|
176
|
+
},
|
|
177
|
+
requireField(modelOrType, field) {
|
|
178
|
+
return _requireField(this.schema, modelOrType, field);
|
|
179
|
+
},
|
|
180
|
+
getEnum(name) {
|
|
181
|
+
return this.schema.enums?.[name];
|
|
182
|
+
},
|
|
183
|
+
requireEnum(name) {
|
|
184
|
+
const enumDef = this.schema.enums?.[name];
|
|
185
|
+
if (!enumDef) throw new InvalidSchemaError(`Enum "${name}" not found in schema`);
|
|
186
|
+
return enumDef;
|
|
187
|
+
},
|
|
188
|
+
getTypeDef(name) {
|
|
189
|
+
return this.schema.typeDefs?.[name];
|
|
190
|
+
},
|
|
191
|
+
requireTypeDef(name) {
|
|
192
|
+
const typeDef = this.schema.typeDefs?.[name];
|
|
193
|
+
if (!typeDef) throw new InvalidSchemaError(`TypeDef "${name}" not found in schema`);
|
|
194
|
+
return typeDef;
|
|
195
|
+
},
|
|
196
|
+
getProcedure(name) {
|
|
197
|
+
return this.schema.procedures?.[name];
|
|
198
|
+
},
|
|
199
|
+
requireProcedure(name) {
|
|
200
|
+
const procedure = this.schema.procedures?.[name];
|
|
201
|
+
if (!procedure) throw new InvalidSchemaError(`Procedure "${name}" not found in schema`);
|
|
202
|
+
return procedure;
|
|
203
|
+
},
|
|
204
|
+
getUniqueFields(model) {
|
|
205
|
+
const modelDef = _requireModel(this.schema, model);
|
|
206
|
+
const result = [];
|
|
207
|
+
for (const [key, value] of Object.entries(modelDef.uniqueFields)) {
|
|
208
|
+
if (value === null || typeof value !== "object") {
|
|
209
|
+
throw new InvalidSchemaError(`Invalid unique field definition for "${model}.${key}"`);
|
|
210
|
+
}
|
|
211
|
+
if (typeof value.type === "string") {
|
|
212
|
+
result.push({
|
|
213
|
+
name: key,
|
|
214
|
+
def: _requireModelField(this.schema, model, key)
|
|
215
|
+
});
|
|
216
|
+
} else {
|
|
217
|
+
result.push({
|
|
218
|
+
name: key,
|
|
219
|
+
defs: Object.fromEntries(Object.keys(value).map((k) => [
|
|
220
|
+
k,
|
|
221
|
+
_requireModelField(this.schema, model, k)
|
|
222
|
+
]))
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
return result;
|
|
227
|
+
},
|
|
228
|
+
getDelegateDiscriminator(model) {
|
|
229
|
+
const modelDef = _requireModel(this.schema, model);
|
|
230
|
+
const delegateAttr = modelDef.attributes?.find((attr) => attr.name === "@@delegate");
|
|
231
|
+
if (!delegateAttr) {
|
|
232
|
+
return void 0;
|
|
233
|
+
}
|
|
234
|
+
const discriminator = delegateAttr.args?.find((arg) => arg.name === "discriminator");
|
|
235
|
+
if (!discriminator || !ExpressionUtils.isField(discriminator.value)) {
|
|
236
|
+
throw new InvalidSchemaError(`Discriminator field not defined for model "${model}"`);
|
|
237
|
+
}
|
|
238
|
+
return discriminator.value.field;
|
|
239
|
+
}
|
|
240
|
+
};
|
|
241
|
+
var SchemaAccessor = /* @__PURE__ */ __name(function(schema) {
|
|
242
|
+
return new Proxy({
|
|
243
|
+
schema
|
|
244
|
+
}, {
|
|
245
|
+
get(target, prop) {
|
|
246
|
+
const descriptor = Object.getOwnPropertyDescriptor(accessors, prop);
|
|
247
|
+
if (descriptor?.get) {
|
|
248
|
+
return descriptor.get.call(target);
|
|
249
|
+
}
|
|
250
|
+
if (prop in accessors) {
|
|
251
|
+
return accessors[prop].bind(target);
|
|
252
|
+
}
|
|
253
|
+
return schema[prop];
|
|
254
|
+
}
|
|
255
|
+
});
|
|
256
|
+
}, "SchemaAccessor");
|
|
121
257
|
// Annotate the CommonJS export names for ESM import in node:
|
|
122
258
|
0 && (module.exports = {
|
|
123
|
-
ExpressionUtils
|
|
259
|
+
ExpressionUtils,
|
|
260
|
+
InvalidSchemaError,
|
|
261
|
+
SchemaAccessor
|
|
124
262
|
});
|
|
125
263
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/expression-utils.ts"],"sourcesContent":["export type * from './expression';\nexport * from './expression-utils';\nexport type * from './schema';\n","import type {\n ArrayExpression,\n BinaryExpression,\n BinaryOperator,\n BindingExpression,\n CallExpression,\n Expression,\n FieldExpression,\n LiteralExpression,\n MemberExpression,\n NullExpression,\n ThisExpression,\n UnaryExpression,\n UnaryOperator,\n} from './expression';\n\n/**\n * Utility functions to create and work with Expression objects\n */\nexport const ExpressionUtils = {\n literal: (value: string | number | boolean): LiteralExpression => {\n return { kind: 'literal', value };\n },\n\n array: (type: string, items: Expression[]): ArrayExpression => {\n return { kind: 'array', type, items };\n },\n\n call: (functionName: string, args?: Expression[]): CallExpression => {\n return { kind: 'call', function: functionName, args };\n },\n\n binary: (left: Expression, op: BinaryOperator, right: Expression, binding?: string): BinaryExpression => {\n return { kind: 'binary', op, left, right, binding };\n },\n\n unary: (op: UnaryOperator, operand: Expression): UnaryExpression => {\n return { kind: 'unary', op, operand };\n },\n\n field: (field: string): FieldExpression => {\n return { kind: 'field', field };\n },\n\n member: (receiver: Expression, members: string[]): MemberExpression => {\n return { kind: 'member', receiver: receiver, members };\n },\n\n binding: (name: string): BindingExpression => {\n return { kind: 'binding', name };\n },\n\n _this: (): ThisExpression => {\n return { kind: 'this' };\n },\n\n _null: (): NullExpression => {\n return { kind: 'null' };\n },\n\n and: (expr: Expression, ...expressions: Expression[]) => {\n return expressions.reduce((acc, exp) => ExpressionUtils.binary(acc, '&&', exp), expr);\n },\n\n or: (expr: Expression, ...expressions: Expression[]) => {\n return expressions.reduce((acc, exp) => ExpressionUtils.binary(acc, '||', exp), expr);\n },\n\n not: (expr: Expression) => {\n return ExpressionUtils.unary('!', expr);\n },\n\n is: (value: unknown, kind: Expression['kind']): value is Expression => {\n return !!value && typeof value === 'object' && 'kind' in value && value.kind === kind;\n },\n\n isLiteral: (value: unknown): value is LiteralExpression => ExpressionUtils.is(value, 'literal'),\n\n isArray: (value: unknown): value is ArrayExpression => ExpressionUtils.is(value, 'array'),\n\n isCall: (value: unknown): value is CallExpression => ExpressionUtils.is(value, 'call'),\n\n isNull: (value: unknown): value is NullExpression => ExpressionUtils.is(value, 'null'),\n\n isThis: (value: unknown): value is ThisExpression => ExpressionUtils.is(value, 'this'),\n\n isUnary: (value: unknown): value is UnaryExpression => ExpressionUtils.is(value, 'unary'),\n\n isBinary: (value: unknown): value is BinaryExpression => ExpressionUtils.is(value, 'binary'),\n\n isField: (value: unknown): value is FieldExpression => ExpressionUtils.is(value, 'field'),\n\n isMember: (value: unknown): value is MemberExpression => ExpressionUtils.is(value, 'member'),\n\n isBinding: (value: unknown): value is BindingExpression => ExpressionUtils.is(value, 'binding'),\n\n getLiteralValue: (expr: Expression): string | number | boolean | undefined => {\n return ExpressionUtils.isLiteral(expr) ? expr.value : undefined;\n },\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AACA;;;;;;;ACkBO,IAAMA,kBAAkB;EAC3BC,SAAS,wBAACC,UAAAA;AACN,WAAO;MAAEC,MAAM;MAAWD;IAAM;EACpC,GAFS;EAITE,OAAO,wBAACC,MAAcC,UAAAA;AAClB,WAAO;MAAEH,MAAM;MAASE;MAAMC;IAAM;EACxC,GAFO;EAIPC,MAAM,wBAACC,cAAsBC,SAAAA;AACzB,WAAO;MAAEN,MAAM;MAAQO,UAAUF;MAAcC;IAAK;EACxD,GAFM;EAINE,QAAQ,wBAACC,MAAkBC,IAAoBC,OAAmBC,YAAAA;AAC9D,WAAO;MAAEZ,MAAM;MAAUU;MAAID;MAAME;MAAOC;IAAQ;EACtD,GAFQ;EAIRC,OAAO,wBAACH,IAAmBI,YAAAA;AACvB,WAAO;MAAEd,MAAM;MAASU;MAAII;IAAQ;EACxC,GAFO;EAIPC,OAAO,wBAACA,UAAAA;AACJ,WAAO;MAAEf,MAAM;MAASe;IAAM;EAClC,GAFO;EAIPC,QAAQ,wBAACC,UAAsBC,YAAAA;AAC3B,WAAO;MAAElB,MAAM;MAAUiB;MAAoBC;IAAQ;EACzD,GAFQ;EAIRN,SAAS,wBAACO,SAAAA;AACN,WAAO;MAAEnB,MAAM;MAAWmB;IAAK;EACnC,GAFS;EAITC,OAAO,6BAAA;AACH,WAAO;MAAEpB,MAAM;IAAO;EAC1B,GAFO;EAIPqB,OAAO,6BAAA;AACH,WAAO;MAAErB,MAAM;IAAO;EAC1B,GAFO;EAIPsB,KAAK,wBAACC,SAAqBC,gBAAAA;AACvB,WAAOA,YAAYC,OAAO,CAACC,KAAKC,QAAQ9B,gBAAgBW,OAAOkB,KAAK,MAAMC,GAAAA,GAAMJ,IAAAA;EACpF,GAFK;EAILK,IAAI,wBAACL,SAAqBC,gBAAAA;AACtB,WAAOA,YAAYC,OAAO,CAACC,KAAKC,QAAQ9B,gBAAgBW,OAAOkB,KAAK,MAAMC,GAAAA,GAAMJ,IAAAA;EACpF,GAFI;EAIJM,KAAK,wBAACN,SAAAA;AACF,WAAO1B,gBAAgBgB,MAAM,KAAKU,IAAAA;EACtC,GAFK;EAILO,IAAI,wBAAC/B,OAAgBC,SAAAA;AACjB,WAAO,CAAC,CAACD,SAAS,OAAOA,UAAU,YAAY,UAAUA,SAASA,MAAMC,SAASA;EACrF,GAFI;EAIJ+B,WAAW,wBAAChC,UAA+CF,gBAAgBiC,GAAG/B,OAAO,SAAA,GAA1E;EAEXiC,SAAS,wBAACjC,UAA6CF,gBAAgBiC,GAAG/B,OAAO,OAAA,GAAxE;EAETkC,QAAQ,wBAAClC,UAA4CF,gBAAgBiC,GAAG/B,OAAO,MAAA,GAAvE;EAERmC,QAAQ,wBAACnC,UAA4CF,gBAAgBiC,GAAG/B,OAAO,MAAA,GAAvE;EAERoC,QAAQ,wBAACpC,UAA4CF,gBAAgBiC,GAAG/B,OAAO,MAAA,GAAvE;EAERqC,SAAS,wBAACrC,UAA6CF,gBAAgBiC,GAAG/B,OAAO,OAAA,GAAxE;EAETsC,UAAU,wBAACtC,UAA8CF,gBAAgBiC,GAAG/B,OAAO,QAAA,GAAzE;EAEVuC,SAAS,wBAACvC,UAA6CF,gBAAgBiC,GAAG/B,OAAO,OAAA,GAAxE;EAETwC,UAAU,wBAACxC,UAA8CF,gBAAgBiC,GAAG/B,OAAO,QAAA,GAAzE;EAEVyC,WAAW,wBAACzC,UAA+CF,gBAAgBiC,GAAG/B,OAAO,SAAA,GAA1E;EAEX0C,iBAAiB,wBAAClB,SAAAA;AACd,WAAO1B,gBAAgBkC,UAAUR,IAAAA,IAAQA,KAAKxB,QAAQ2C;EAC1D,GAFiB;AAGrB;","names":["ExpressionUtils","literal","value","kind","array","type","items","call","functionName","args","function","binary","left","op","right","binding","unary","operand","field","member","receiver","members","name","_this","_null","and","expr","expressions","reduce","acc","exp","or","not","is","isLiteral","isArray","isCall","isNull","isThis","isUnary","isBinary","isField","isMember","isBinding","getLiteralValue","undefined"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/expression-utils.ts","../src/accessor.ts"],"sourcesContent":["export { InvalidSchemaError, SchemaAccessor } from './accessor';\nexport type * from './expression';\nexport * from './expression-utils';\nexport type * from './schema';\n","import type {\n ArrayExpression,\n BinaryExpression,\n BinaryOperator,\n BindingExpression,\n CallExpression,\n Expression,\n FieldExpression,\n LiteralExpression,\n MemberExpression,\n NullExpression,\n ThisExpression,\n UnaryExpression,\n UnaryOperator,\n} from './expression';\n\n/**\n * Utility functions to create and work with Expression objects\n */\nexport const ExpressionUtils = {\n literal: (value: string | number | boolean): LiteralExpression => {\n return { kind: 'literal', value };\n },\n\n array: (type: string, items: Expression[]): ArrayExpression => {\n return { kind: 'array', type, items };\n },\n\n call: (functionName: string, args?: Expression[]): CallExpression => {\n return { kind: 'call', function: functionName, args };\n },\n\n binary: (left: Expression, op: BinaryOperator, right: Expression, binding?: string): BinaryExpression => {\n return { kind: 'binary', op, left, right, binding };\n },\n\n unary: (op: UnaryOperator, operand: Expression): UnaryExpression => {\n return { kind: 'unary', op, operand };\n },\n\n field: (field: string): FieldExpression => {\n return { kind: 'field', field };\n },\n\n member: (receiver: Expression, members: string[]): MemberExpression => {\n return { kind: 'member', receiver: receiver, members };\n },\n\n binding: (name: string): BindingExpression => {\n return { kind: 'binding', name };\n },\n\n _this: (): ThisExpression => {\n return { kind: 'this' };\n },\n\n _null: (): NullExpression => {\n return { kind: 'null' };\n },\n\n and: (expr: Expression, ...expressions: Expression[]) => {\n return expressions.reduce((acc, exp) => ExpressionUtils.binary(acc, '&&', exp), expr);\n },\n\n or: (expr: Expression, ...expressions: Expression[]) => {\n return expressions.reduce((acc, exp) => ExpressionUtils.binary(acc, '||', exp), expr);\n },\n\n not: (expr: Expression) => {\n return ExpressionUtils.unary('!', expr);\n },\n\n is: (value: unknown, kind: Expression['kind']): value is Expression => {\n return !!value && typeof value === 'object' && 'kind' in value && value.kind === kind;\n },\n\n isLiteral: (value: unknown): value is LiteralExpression => ExpressionUtils.is(value, 'literal'),\n\n isArray: (value: unknown): value is ArrayExpression => ExpressionUtils.is(value, 'array'),\n\n isCall: (value: unknown): value is CallExpression => ExpressionUtils.is(value, 'call'),\n\n isNull: (value: unknown): value is NullExpression => ExpressionUtils.is(value, 'null'),\n\n isThis: (value: unknown): value is ThisExpression => ExpressionUtils.is(value, 'this'),\n\n isUnary: (value: unknown): value is UnaryExpression => ExpressionUtils.is(value, 'unary'),\n\n isBinary: (value: unknown): value is BinaryExpression => ExpressionUtils.is(value, 'binary'),\n\n isField: (value: unknown): value is FieldExpression => ExpressionUtils.is(value, 'field'),\n\n isMember: (value: unknown): value is MemberExpression => ExpressionUtils.is(value, 'member'),\n\n isBinding: (value: unknown): value is BindingExpression => ExpressionUtils.is(value, 'binding'),\n\n getLiteralValue: (expr: Expression): string | number | boolean | undefined => {\n return ExpressionUtils.isLiteral(expr) ? expr.value : undefined;\n },\n};\n","import { ExpressionUtils } from './expression-utils';\nimport type {\n DataSourceProviderType,\n EnumDef,\n FieldDef,\n ModelDef,\n ProcedureDef,\n SchemaDef,\n TypeDefDef,\n} from './schema';\n\ntype Accessors = {\n /**\n * The data source provider type of the schema, e.g. \"sqlite\", \"postgresql\", etc.\n */\n get providerType(): DataSourceProviderType;\n\n /**\n * Gets a model definition by name. Returns `undefined` if the model is not found.\n */\n getModel(name: string): ModelDef | undefined;\n\n /**\n * Gets a model definition by name. Throws an error if the model is not found.\n */\n requireModel(name: string): ModelDef;\n\n /**\n * Gets a field definition by model/type and field name. Returns `undefined` if the field is not found.\n */\n getField(modelOrType: string, field: string): FieldDef | undefined;\n\n /**\n * Gets a field definition by model/type and field name. Throws an error if the field is not found.\n */\n requireField(modelOrType: string, field: string): FieldDef;\n\n /***\n * Gets an enum definition by name. Returns `undefined` if the enum is not found.\n */\n getEnum(name: string): EnumDef | undefined;\n\n /**\n * Gets an enum definition by name. Throws an error if the enum is not found.\n */\n requireEnum(name: string): EnumDef;\n\n /**\n * Gets a type definition by name. Returns `undefined` if the type definition is not found.\n * @param name\n */\n getTypeDef(name: string): TypeDefDef | undefined;\n\n /**\n * Gets a type definition by name. Throws an error if the type definition is not found.\n */\n requireTypeDef(name: string): TypeDefDef;\n\n /**\n * Gets a procedure definition by name. Returns `undefined` if the procedure is not found.\n */\n getProcedure(name: string): ProcedureDef | undefined;\n\n /**\n * Gets a procedure definition by name. Throws an error if the procedure is not found.\n */\n requireProcedure(name: string): ProcedureDef;\n\n /**\n * Gets the unique fields of a model, including both singular and compound unique fields.\n */\n getUniqueFields(\n model: string,\n ): Array<{ name: string; def: FieldDef } | { name: string; defs: Record<string, FieldDef> }>;\n\n /**\n * Gets the delegate discriminator field for a model, if defined via `@@delegate` attribute. Returns `undefined` if not available.\n */\n getDelegateDiscriminator(model: string): string | undefined;\n};\n\nexport class InvalidSchemaError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\ntype AccessorTarget = { schema: SchemaDef };\n\nfunction _requireModel(schema: SchemaDef, name: string): ModelDef {\n const model = schema.models[name];\n if (!model) throw new InvalidSchemaError(`Model \"${name}\" not found in schema`);\n return model;\n}\n\nfunction _getField(schema: SchemaDef, modelOrType: string, field: string): FieldDef | undefined {\n const modelDef = schema.models?.[modelOrType];\n if (modelDef) {\n return modelDef.fields[field];\n }\n const typeDef = schema.typeDefs?.[modelOrType];\n if (typeDef) {\n return typeDef.fields[field];\n }\n return undefined;\n}\n\nfunction _requireField(schema: SchemaDef, modelOrType: string, field: string): FieldDef {\n const fieldDef = _getField(schema, modelOrType, field);\n if (!fieldDef) throw new InvalidSchemaError(`Field \"${modelOrType}.${field}\" not found in schema`);\n return fieldDef;\n}\n\nfunction _requireModelField(schema: SchemaDef, model: string, field: string) {\n const modelDef = _requireModel(schema, model);\n const fieldDef = modelDef.fields[field];\n if (!fieldDef) throw new InvalidSchemaError(`Field \"${model}.${field}\" not found in schema`);\n return fieldDef;\n}\n\nconst accessors: Accessors = {\n get providerType() {\n return (this as unknown as AccessorTarget).schema.provider.type;\n },\n\n getModel(this: { schema: SchemaDef }, name: string) {\n return this.schema.models[name];\n },\n\n requireModel(this: { schema: SchemaDef }, name: string) {\n return _requireModel(this.schema, name);\n },\n\n getField(this: { schema: SchemaDef }, modelOrType: string, field: string) {\n return _getField(this.schema, modelOrType, field);\n },\n\n requireField(this: { schema: SchemaDef }, modelOrType: string, field: string) {\n return _requireField(this.schema, modelOrType, field);\n },\n\n getEnum(this: { schema: SchemaDef }, name: string) {\n return this.schema.enums?.[name];\n },\n\n requireEnum(this: { schema: SchemaDef }, name: string) {\n const enumDef = this.schema.enums?.[name];\n if (!enumDef) throw new InvalidSchemaError(`Enum \"${name}\" not found in schema`);\n return enumDef;\n },\n\n getTypeDef(this: { schema: SchemaDef }, name: string) {\n return this.schema.typeDefs?.[name];\n },\n\n requireTypeDef(this: { schema: SchemaDef }, name: string) {\n const typeDef = this.schema.typeDefs?.[name];\n if (!typeDef) throw new InvalidSchemaError(`TypeDef \"${name}\" not found in schema`);\n return typeDef;\n },\n\n getProcedure(this: { schema: SchemaDef }, name: string) {\n return this.schema.procedures?.[name];\n },\n\n requireProcedure(this: { schema: SchemaDef }, name: string) {\n const procedure = this.schema.procedures?.[name];\n if (!procedure) throw new InvalidSchemaError(`Procedure \"${name}\" not found in schema`);\n return procedure;\n },\n\n getUniqueFields(this: { schema: SchemaDef }, model: string) {\n const modelDef = _requireModel(this.schema, model);\n const result: Array<{ name: string; def: FieldDef } | { name: string; defs: Record<string, FieldDef> }> = [];\n for (const [key, value] of Object.entries(modelDef.uniqueFields)) {\n if (value === null || typeof value !== 'object') {\n throw new InvalidSchemaError(`Invalid unique field definition for \"${model}.${key}\"`);\n }\n\n if (typeof value.type === 'string') {\n // singular unique field\n result.push({ name: key, def: _requireModelField(this.schema, model, key) });\n } else {\n // compound unique field\n result.push({\n name: key,\n defs: Object.fromEntries(\n Object.keys(value).map((k) => [k, _requireModelField(this.schema, model, k)]),\n ),\n });\n }\n }\n return result;\n },\n\n getDelegateDiscriminator(this: { schema: SchemaDef }, model: string) {\n const modelDef = _requireModel(this.schema, model);\n const delegateAttr = modelDef.attributes?.find((attr) => attr.name === '@@delegate');\n if (!delegateAttr) {\n return undefined;\n }\n const discriminator = delegateAttr.args?.find((arg) => arg.name === 'discriminator');\n if (!discriminator || !ExpressionUtils.isField(discriminator.value)) {\n throw new InvalidSchemaError(`Discriminator field not defined for model \"${model}\"`);\n }\n return discriminator.value.field;\n },\n};\n\nexport type SchemaAccessor<Schema extends SchemaDef> = Schema & Accessors;\n\nexport interface SchemaAccessorConstructor {\n new <Schema extends SchemaDef>(schema: Schema): SchemaAccessor<Schema>;\n}\n\nexport const SchemaAccessor = function <Schema extends SchemaDef>(this: any, schema: Schema) {\n return new Proxy(\n { schema },\n {\n get(target, prop) {\n const descriptor = Object.getOwnPropertyDescriptor(accessors, prop);\n if (descriptor?.get) {\n return descriptor.get.call(target);\n }\n if (prop in accessors) {\n return (accessors as any)[prop].bind(target);\n }\n return (schema as any)[prop];\n },\n },\n );\n} as unknown as SchemaAccessorConstructor;\n"],"mappings":"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","names":["ExpressionUtils","literal","value","kind","array","type","items","call","functionName","args","function","binary","left","op","right","binding","unary","operand","field","member","receiver","members","name","_this","_null","and","expr","expressions","reduce","acc","exp","or","not","is","isLiteral","isArray","isCall","isNull","isThis","isUnary","isBinary","isField","isMember","isBinding","getLiteralValue","undefined","InvalidSchemaError","Error","message","_requireModel","schema","name","model","models","_getField","modelOrType","field","modelDef","fields","typeDef","typeDefs","undefined","_requireField","fieldDef","_requireModelField","accessors","providerType","provider","type","getModel","requireModel","getField","requireField","getEnum","enums","requireEnum","enumDef","getTypeDef","requireTypeDef","getProcedure","procedures","requireProcedure","procedure","getUniqueFields","result","key","value","Object","entries","uniqueFields","push","def","defs","fromEntries","keys","map","k","getDelegateDiscriminator","delegateAttr","attributes","find","attr","discriminator","args","arg","ExpressionUtils","isField","SchemaAccessor","Proxy","get","target","prop","descriptor","getOwnPropertyDescriptor","call","bind"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -49,37 +49,6 @@ type NullExpression = {
|
|
|
49
49
|
type UnaryOperator = '!';
|
|
50
50
|
type BinaryOperator = '&&' | '||' | '==' | '!=' | '<' | '<=' | '>' | '>=' | '?' | '!' | '^' | 'in';
|
|
51
51
|
|
|
52
|
-
/**
|
|
53
|
-
* Utility functions to create and work with Expression objects
|
|
54
|
-
*/
|
|
55
|
-
declare const ExpressionUtils: {
|
|
56
|
-
literal: (value: string | number | boolean) => LiteralExpression;
|
|
57
|
-
array: (type: string, items: Expression[]) => ArrayExpression;
|
|
58
|
-
call: (functionName: string, args?: Expression[]) => CallExpression;
|
|
59
|
-
binary: (left: Expression, op: BinaryOperator, right: Expression, binding?: string) => BinaryExpression;
|
|
60
|
-
unary: (op: UnaryOperator, operand: Expression) => UnaryExpression;
|
|
61
|
-
field: (field: string) => FieldExpression;
|
|
62
|
-
member: (receiver: Expression, members: string[]) => MemberExpression;
|
|
63
|
-
binding: (name: string) => BindingExpression;
|
|
64
|
-
_this: () => ThisExpression;
|
|
65
|
-
_null: () => NullExpression;
|
|
66
|
-
and: (expr: Expression, ...expressions: Expression[]) => Expression;
|
|
67
|
-
or: (expr: Expression, ...expressions: Expression[]) => Expression;
|
|
68
|
-
not: (expr: Expression) => UnaryExpression;
|
|
69
|
-
is: (value: unknown, kind: Expression["kind"]) => value is Expression;
|
|
70
|
-
isLiteral: (value: unknown) => value is LiteralExpression;
|
|
71
|
-
isArray: (value: unknown) => value is ArrayExpression;
|
|
72
|
-
isCall: (value: unknown) => value is CallExpression;
|
|
73
|
-
isNull: (value: unknown) => value is NullExpression;
|
|
74
|
-
isThis: (value: unknown) => value is ThisExpression;
|
|
75
|
-
isUnary: (value: unknown) => value is UnaryExpression;
|
|
76
|
-
isBinary: (value: unknown) => value is BinaryExpression;
|
|
77
|
-
isField: (value: unknown) => value is FieldExpression;
|
|
78
|
-
isMember: (value: unknown) => value is MemberExpression;
|
|
79
|
-
isBinding: (value: unknown) => value is BindingExpression;
|
|
80
|
-
getLiteralValue: (expr: Expression) => string | number | boolean | undefined;
|
|
81
|
-
};
|
|
82
|
-
|
|
83
52
|
type DataSourceProviderType = 'sqlite' | 'postgresql' | 'mysql';
|
|
84
53
|
type DataSourceProvider = {
|
|
85
54
|
type: DataSourceProviderType;
|
|
@@ -94,12 +63,13 @@ type SchemaDef = {
|
|
|
94
63
|
procedures?: Record<string, ProcedureDef>;
|
|
95
64
|
authType?: GetModels<SchemaDef> | GetTypeDefs<SchemaDef>;
|
|
96
65
|
};
|
|
66
|
+
type UniqueFieldsInfo = Pick<FieldDef, 'type'> | Record<string, Pick<FieldDef, 'type'>>;
|
|
97
67
|
type ModelDef = {
|
|
98
68
|
name: string;
|
|
99
69
|
baseModel?: string;
|
|
100
70
|
fields: Record<string, FieldDef>;
|
|
101
71
|
attributes?: readonly AttributeApplication[];
|
|
102
|
-
uniqueFields: Record<string,
|
|
72
|
+
uniqueFields: Record<string, UniqueFieldsInfo>;
|
|
103
73
|
idFields: readonly string[];
|
|
104
74
|
computedFields?: Record<string, Function>;
|
|
105
75
|
isDelegate?: boolean;
|
|
@@ -179,7 +149,7 @@ type GetDelegateModels<Schema extends SchemaDef> = keyof {
|
|
|
179
149
|
};
|
|
180
150
|
type GetSubModels<Schema extends SchemaDef, Model extends GetModels<Schema>> = GetModel<Schema, Model>['subModels'] extends readonly string[] ? Extract<GetModel<Schema, Model>['subModels'][number], GetModels<Schema>> : never;
|
|
181
151
|
type GetModel<Schema extends SchemaDef, Model extends GetModels<Schema>> = Schema['models'][Model];
|
|
182
|
-
type GetEnums<Schema extends SchemaDef> = keyof Schema['enums']
|
|
152
|
+
type GetEnums<Schema extends SchemaDef> = Extract<keyof Schema['enums'], string>;
|
|
183
153
|
type GetEnum<Schema extends SchemaDef, Enum extends GetEnums<Schema>> = Schema['enums'][Enum] extends EnumDef ? Schema['enums'][Enum]['values'] : never;
|
|
184
154
|
type GetTypeDefs<Schema extends SchemaDef> = Extract<keyof Schema['typeDefs'], string>;
|
|
185
155
|
type GetTypeDef<Schema extends SchemaDef, TypeDef extends GetTypeDefs<Schema>> = Schema['typeDefs'] extends Record<string, unknown> ? Schema['typeDefs'][TypeDef] : never;
|
|
@@ -212,7 +182,7 @@ type TypeDefFieldIsArray<Schema extends SchemaDef, TypeDef extends GetTypeDefs<S
|
|
|
212
182
|
type FieldIsRelation<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetModelFields<Schema, Model>> = GetModelField<Schema, Model, Field>['relation'] extends object ? true : false;
|
|
213
183
|
type FieldIsArray<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetModelFields<Schema, Model>> = GetModelField<Schema, Model, Field>['array'] extends true ? true : false;
|
|
214
184
|
type FieldIsComputed<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetModelFields<Schema, Model>> = GetModelField<Schema, Model, Field>['computed'] extends true ? true : false;
|
|
215
|
-
type FieldHasDefault<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetModelFields<Schema, Model>> = GetModelField<Schema, Model, Field>['default'] extends object | number | string | boolean ? true : GetModelField<Schema, Model, Field>['updatedAt'] extends
|
|
185
|
+
type FieldHasDefault<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetModelFields<Schema, Model>> = GetModelField<Schema, Model, Field>['default'] extends object | number | string | boolean ? true : GetModelField<Schema, Model, Field>['updatedAt'] extends true | UpdatedAtInfo ? true : GetModelField<Schema, Model, Field>['relation'] extends {
|
|
216
186
|
hasDefault: true;
|
|
217
187
|
} ? true : false;
|
|
218
188
|
type FieldIsRelationArray<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetModelFields<Schema, Model>> = FieldIsRelation<Schema, Model, Field> extends true ? FieldIsArray<Schema, Model, Field> : false;
|
|
@@ -220,4 +190,105 @@ type IsDelegateModel<Schema extends SchemaDef, Model extends GetModels<Schema>>
|
|
|
220
190
|
type FieldIsDelegateRelation<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends RelationFields<Schema, Model>> = GetModelFieldType<Schema, Model, Field> extends GetModels<Schema> ? IsDelegateModel<Schema, GetModelFieldType<Schema, Model, Field>> : false;
|
|
221
191
|
type FieldIsDelegateDiscriminator<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetModelFields<Schema, Model>> = GetModelField<Schema, Model, Field>['isDiscriminator'] extends true ? true : false;
|
|
222
192
|
|
|
223
|
-
|
|
193
|
+
type Accessors = {
|
|
194
|
+
/**
|
|
195
|
+
* The data source provider type of the schema, e.g. "sqlite", "postgresql", etc.
|
|
196
|
+
*/
|
|
197
|
+
get providerType(): DataSourceProviderType;
|
|
198
|
+
/**
|
|
199
|
+
* Gets a model definition by name. Returns `undefined` if the model is not found.
|
|
200
|
+
*/
|
|
201
|
+
getModel(name: string): ModelDef | undefined;
|
|
202
|
+
/**
|
|
203
|
+
* Gets a model definition by name. Throws an error if the model is not found.
|
|
204
|
+
*/
|
|
205
|
+
requireModel(name: string): ModelDef;
|
|
206
|
+
/**
|
|
207
|
+
* Gets a field definition by model/type and field name. Returns `undefined` if the field is not found.
|
|
208
|
+
*/
|
|
209
|
+
getField(modelOrType: string, field: string): FieldDef | undefined;
|
|
210
|
+
/**
|
|
211
|
+
* Gets a field definition by model/type and field name. Throws an error if the field is not found.
|
|
212
|
+
*/
|
|
213
|
+
requireField(modelOrType: string, field: string): FieldDef;
|
|
214
|
+
/***
|
|
215
|
+
* Gets an enum definition by name. Returns `undefined` if the enum is not found.
|
|
216
|
+
*/
|
|
217
|
+
getEnum(name: string): EnumDef | undefined;
|
|
218
|
+
/**
|
|
219
|
+
* Gets an enum definition by name. Throws an error if the enum is not found.
|
|
220
|
+
*/
|
|
221
|
+
requireEnum(name: string): EnumDef;
|
|
222
|
+
/**
|
|
223
|
+
* Gets a type definition by name. Returns `undefined` if the type definition is not found.
|
|
224
|
+
* @param name
|
|
225
|
+
*/
|
|
226
|
+
getTypeDef(name: string): TypeDefDef | undefined;
|
|
227
|
+
/**
|
|
228
|
+
* Gets a type definition by name. Throws an error if the type definition is not found.
|
|
229
|
+
*/
|
|
230
|
+
requireTypeDef(name: string): TypeDefDef;
|
|
231
|
+
/**
|
|
232
|
+
* Gets a procedure definition by name. Returns `undefined` if the procedure is not found.
|
|
233
|
+
*/
|
|
234
|
+
getProcedure(name: string): ProcedureDef | undefined;
|
|
235
|
+
/**
|
|
236
|
+
* Gets a procedure definition by name. Throws an error if the procedure is not found.
|
|
237
|
+
*/
|
|
238
|
+
requireProcedure(name: string): ProcedureDef;
|
|
239
|
+
/**
|
|
240
|
+
* Gets the unique fields of a model, including both singular and compound unique fields.
|
|
241
|
+
*/
|
|
242
|
+
getUniqueFields(model: string): Array<{
|
|
243
|
+
name: string;
|
|
244
|
+
def: FieldDef;
|
|
245
|
+
} | {
|
|
246
|
+
name: string;
|
|
247
|
+
defs: Record<string, FieldDef>;
|
|
248
|
+
}>;
|
|
249
|
+
/**
|
|
250
|
+
* Gets the delegate discriminator field for a model, if defined via `@@delegate` attribute. Returns `undefined` if not available.
|
|
251
|
+
*/
|
|
252
|
+
getDelegateDiscriminator(model: string): string | undefined;
|
|
253
|
+
};
|
|
254
|
+
declare class InvalidSchemaError extends Error {
|
|
255
|
+
constructor(message: string);
|
|
256
|
+
}
|
|
257
|
+
interface SchemaAccessorConstructor {
|
|
258
|
+
new <Schema extends SchemaDef>(schema: Schema): SchemaAccessor<Schema>;
|
|
259
|
+
}
|
|
260
|
+
type SchemaAccessor<Schema extends SchemaDef> = Schema & Accessors;
|
|
261
|
+
declare const SchemaAccessor: SchemaAccessorConstructor;
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Utility functions to create and work with Expression objects
|
|
265
|
+
*/
|
|
266
|
+
declare const ExpressionUtils: {
|
|
267
|
+
literal: (value: string | number | boolean) => LiteralExpression;
|
|
268
|
+
array: (type: string, items: Expression[]) => ArrayExpression;
|
|
269
|
+
call: (functionName: string, args?: Expression[]) => CallExpression;
|
|
270
|
+
binary: (left: Expression, op: BinaryOperator, right: Expression, binding?: string) => BinaryExpression;
|
|
271
|
+
unary: (op: UnaryOperator, operand: Expression) => UnaryExpression;
|
|
272
|
+
field: (field: string) => FieldExpression;
|
|
273
|
+
member: (receiver: Expression, members: string[]) => MemberExpression;
|
|
274
|
+
binding: (name: string) => BindingExpression;
|
|
275
|
+
_this: () => ThisExpression;
|
|
276
|
+
_null: () => NullExpression;
|
|
277
|
+
and: (expr: Expression, ...expressions: Expression[]) => Expression;
|
|
278
|
+
or: (expr: Expression, ...expressions: Expression[]) => Expression;
|
|
279
|
+
not: (expr: Expression) => UnaryExpression;
|
|
280
|
+
is: (value: unknown, kind: Expression["kind"]) => value is Expression;
|
|
281
|
+
isLiteral: (value: unknown) => value is LiteralExpression;
|
|
282
|
+
isArray: (value: unknown) => value is ArrayExpression;
|
|
283
|
+
isCall: (value: unknown) => value is CallExpression;
|
|
284
|
+
isNull: (value: unknown) => value is NullExpression;
|
|
285
|
+
isThis: (value: unknown) => value is ThisExpression;
|
|
286
|
+
isUnary: (value: unknown) => value is UnaryExpression;
|
|
287
|
+
isBinary: (value: unknown) => value is BinaryExpression;
|
|
288
|
+
isField: (value: unknown) => value is FieldExpression;
|
|
289
|
+
isMember: (value: unknown) => value is MemberExpression;
|
|
290
|
+
isBinding: (value: unknown) => value is BindingExpression;
|
|
291
|
+
getLiteralValue: (expr: Expression) => string | number | boolean | undefined;
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
export { type ArrayExpression, type AttributeApplication, type AttributeArg, type BinaryExpression, type BinaryOperator, type BindingExpression, type BuiltinType, type CallExpression, type CascadeAction, type DataSourceProvider, type DataSourceProviderType, type EnumDef, type EnumField, type Expression, ExpressionUtils, type FieldDef, type FieldExpression, type FieldHasDefault, type FieldIsArray, type FieldIsComputed, type FieldIsDelegateDiscriminator, type FieldIsDelegateRelation, type FieldIsRelation, type FieldIsRelationArray, type FieldType, type ForeignKeyFields, type GetDelegateModels, type GetEnum, type GetEnums, type GetModel, type GetModelDiscriminator, type GetModelField, type GetModelFieldType, type GetModelFields, type GetModels, type GetSubModels, type GetTypeDef, type GetTypeDefField, type GetTypeDefFieldType, type GetTypeDefFields, type GetTypeDefs, InvalidSchemaError, type IsDelegateModel, type LiteralExpression, type MappedBuiltinType, type MemberExpression, type ModelDef, type ModelFieldIsOptional, type NonRelationFields, type NullExpression, type ProcedureDef, type ProcedureParam, type RelationFieldType, type RelationFields, type RelationInfo, type ScalarFields, SchemaAccessor, type SchemaDef, type ThisExpression, type TypeDefDef, type TypeDefFieldIsArray, type TypeDefFieldIsOptional, type UnaryExpression, type UnaryOperator, type UniqueFieldsInfo, type UpdatedAtInfo };
|
package/dist/index.d.ts
CHANGED
|
@@ -49,37 +49,6 @@ type NullExpression = {
|
|
|
49
49
|
type UnaryOperator = '!';
|
|
50
50
|
type BinaryOperator = '&&' | '||' | '==' | '!=' | '<' | '<=' | '>' | '>=' | '?' | '!' | '^' | 'in';
|
|
51
51
|
|
|
52
|
-
/**
|
|
53
|
-
* Utility functions to create and work with Expression objects
|
|
54
|
-
*/
|
|
55
|
-
declare const ExpressionUtils: {
|
|
56
|
-
literal: (value: string | number | boolean) => LiteralExpression;
|
|
57
|
-
array: (type: string, items: Expression[]) => ArrayExpression;
|
|
58
|
-
call: (functionName: string, args?: Expression[]) => CallExpression;
|
|
59
|
-
binary: (left: Expression, op: BinaryOperator, right: Expression, binding?: string) => BinaryExpression;
|
|
60
|
-
unary: (op: UnaryOperator, operand: Expression) => UnaryExpression;
|
|
61
|
-
field: (field: string) => FieldExpression;
|
|
62
|
-
member: (receiver: Expression, members: string[]) => MemberExpression;
|
|
63
|
-
binding: (name: string) => BindingExpression;
|
|
64
|
-
_this: () => ThisExpression;
|
|
65
|
-
_null: () => NullExpression;
|
|
66
|
-
and: (expr: Expression, ...expressions: Expression[]) => Expression;
|
|
67
|
-
or: (expr: Expression, ...expressions: Expression[]) => Expression;
|
|
68
|
-
not: (expr: Expression) => UnaryExpression;
|
|
69
|
-
is: (value: unknown, kind: Expression["kind"]) => value is Expression;
|
|
70
|
-
isLiteral: (value: unknown) => value is LiteralExpression;
|
|
71
|
-
isArray: (value: unknown) => value is ArrayExpression;
|
|
72
|
-
isCall: (value: unknown) => value is CallExpression;
|
|
73
|
-
isNull: (value: unknown) => value is NullExpression;
|
|
74
|
-
isThis: (value: unknown) => value is ThisExpression;
|
|
75
|
-
isUnary: (value: unknown) => value is UnaryExpression;
|
|
76
|
-
isBinary: (value: unknown) => value is BinaryExpression;
|
|
77
|
-
isField: (value: unknown) => value is FieldExpression;
|
|
78
|
-
isMember: (value: unknown) => value is MemberExpression;
|
|
79
|
-
isBinding: (value: unknown) => value is BindingExpression;
|
|
80
|
-
getLiteralValue: (expr: Expression) => string | number | boolean | undefined;
|
|
81
|
-
};
|
|
82
|
-
|
|
83
52
|
type DataSourceProviderType = 'sqlite' | 'postgresql' | 'mysql';
|
|
84
53
|
type DataSourceProvider = {
|
|
85
54
|
type: DataSourceProviderType;
|
|
@@ -94,12 +63,13 @@ type SchemaDef = {
|
|
|
94
63
|
procedures?: Record<string, ProcedureDef>;
|
|
95
64
|
authType?: GetModels<SchemaDef> | GetTypeDefs<SchemaDef>;
|
|
96
65
|
};
|
|
66
|
+
type UniqueFieldsInfo = Pick<FieldDef, 'type'> | Record<string, Pick<FieldDef, 'type'>>;
|
|
97
67
|
type ModelDef = {
|
|
98
68
|
name: string;
|
|
99
69
|
baseModel?: string;
|
|
100
70
|
fields: Record<string, FieldDef>;
|
|
101
71
|
attributes?: readonly AttributeApplication[];
|
|
102
|
-
uniqueFields: Record<string,
|
|
72
|
+
uniqueFields: Record<string, UniqueFieldsInfo>;
|
|
103
73
|
idFields: readonly string[];
|
|
104
74
|
computedFields?: Record<string, Function>;
|
|
105
75
|
isDelegate?: boolean;
|
|
@@ -179,7 +149,7 @@ type GetDelegateModels<Schema extends SchemaDef> = keyof {
|
|
|
179
149
|
};
|
|
180
150
|
type GetSubModels<Schema extends SchemaDef, Model extends GetModels<Schema>> = GetModel<Schema, Model>['subModels'] extends readonly string[] ? Extract<GetModel<Schema, Model>['subModels'][number], GetModels<Schema>> : never;
|
|
181
151
|
type GetModel<Schema extends SchemaDef, Model extends GetModels<Schema>> = Schema['models'][Model];
|
|
182
|
-
type GetEnums<Schema extends SchemaDef> = keyof Schema['enums']
|
|
152
|
+
type GetEnums<Schema extends SchemaDef> = Extract<keyof Schema['enums'], string>;
|
|
183
153
|
type GetEnum<Schema extends SchemaDef, Enum extends GetEnums<Schema>> = Schema['enums'][Enum] extends EnumDef ? Schema['enums'][Enum]['values'] : never;
|
|
184
154
|
type GetTypeDefs<Schema extends SchemaDef> = Extract<keyof Schema['typeDefs'], string>;
|
|
185
155
|
type GetTypeDef<Schema extends SchemaDef, TypeDef extends GetTypeDefs<Schema>> = Schema['typeDefs'] extends Record<string, unknown> ? Schema['typeDefs'][TypeDef] : never;
|
|
@@ -212,7 +182,7 @@ type TypeDefFieldIsArray<Schema extends SchemaDef, TypeDef extends GetTypeDefs<S
|
|
|
212
182
|
type FieldIsRelation<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetModelFields<Schema, Model>> = GetModelField<Schema, Model, Field>['relation'] extends object ? true : false;
|
|
213
183
|
type FieldIsArray<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetModelFields<Schema, Model>> = GetModelField<Schema, Model, Field>['array'] extends true ? true : false;
|
|
214
184
|
type FieldIsComputed<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetModelFields<Schema, Model>> = GetModelField<Schema, Model, Field>['computed'] extends true ? true : false;
|
|
215
|
-
type FieldHasDefault<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetModelFields<Schema, Model>> = GetModelField<Schema, Model, Field>['default'] extends object | number | string | boolean ? true : GetModelField<Schema, Model, Field>['updatedAt'] extends
|
|
185
|
+
type FieldHasDefault<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetModelFields<Schema, Model>> = GetModelField<Schema, Model, Field>['default'] extends object | number | string | boolean ? true : GetModelField<Schema, Model, Field>['updatedAt'] extends true | UpdatedAtInfo ? true : GetModelField<Schema, Model, Field>['relation'] extends {
|
|
216
186
|
hasDefault: true;
|
|
217
187
|
} ? true : false;
|
|
218
188
|
type FieldIsRelationArray<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetModelFields<Schema, Model>> = FieldIsRelation<Schema, Model, Field> extends true ? FieldIsArray<Schema, Model, Field> : false;
|
|
@@ -220,4 +190,105 @@ type IsDelegateModel<Schema extends SchemaDef, Model extends GetModels<Schema>>
|
|
|
220
190
|
type FieldIsDelegateRelation<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends RelationFields<Schema, Model>> = GetModelFieldType<Schema, Model, Field> extends GetModels<Schema> ? IsDelegateModel<Schema, GetModelFieldType<Schema, Model, Field>> : false;
|
|
221
191
|
type FieldIsDelegateDiscriminator<Schema extends SchemaDef, Model extends GetModels<Schema>, Field extends GetModelFields<Schema, Model>> = GetModelField<Schema, Model, Field>['isDiscriminator'] extends true ? true : false;
|
|
222
192
|
|
|
223
|
-
|
|
193
|
+
type Accessors = {
|
|
194
|
+
/**
|
|
195
|
+
* The data source provider type of the schema, e.g. "sqlite", "postgresql", etc.
|
|
196
|
+
*/
|
|
197
|
+
get providerType(): DataSourceProviderType;
|
|
198
|
+
/**
|
|
199
|
+
* Gets a model definition by name. Returns `undefined` if the model is not found.
|
|
200
|
+
*/
|
|
201
|
+
getModel(name: string): ModelDef | undefined;
|
|
202
|
+
/**
|
|
203
|
+
* Gets a model definition by name. Throws an error if the model is not found.
|
|
204
|
+
*/
|
|
205
|
+
requireModel(name: string): ModelDef;
|
|
206
|
+
/**
|
|
207
|
+
* Gets a field definition by model/type and field name. Returns `undefined` if the field is not found.
|
|
208
|
+
*/
|
|
209
|
+
getField(modelOrType: string, field: string): FieldDef | undefined;
|
|
210
|
+
/**
|
|
211
|
+
* Gets a field definition by model/type and field name. Throws an error if the field is not found.
|
|
212
|
+
*/
|
|
213
|
+
requireField(modelOrType: string, field: string): FieldDef;
|
|
214
|
+
/***
|
|
215
|
+
* Gets an enum definition by name. Returns `undefined` if the enum is not found.
|
|
216
|
+
*/
|
|
217
|
+
getEnum(name: string): EnumDef | undefined;
|
|
218
|
+
/**
|
|
219
|
+
* Gets an enum definition by name. Throws an error if the enum is not found.
|
|
220
|
+
*/
|
|
221
|
+
requireEnum(name: string): EnumDef;
|
|
222
|
+
/**
|
|
223
|
+
* Gets a type definition by name. Returns `undefined` if the type definition is not found.
|
|
224
|
+
* @param name
|
|
225
|
+
*/
|
|
226
|
+
getTypeDef(name: string): TypeDefDef | undefined;
|
|
227
|
+
/**
|
|
228
|
+
* Gets a type definition by name. Throws an error if the type definition is not found.
|
|
229
|
+
*/
|
|
230
|
+
requireTypeDef(name: string): TypeDefDef;
|
|
231
|
+
/**
|
|
232
|
+
* Gets a procedure definition by name. Returns `undefined` if the procedure is not found.
|
|
233
|
+
*/
|
|
234
|
+
getProcedure(name: string): ProcedureDef | undefined;
|
|
235
|
+
/**
|
|
236
|
+
* Gets a procedure definition by name. Throws an error if the procedure is not found.
|
|
237
|
+
*/
|
|
238
|
+
requireProcedure(name: string): ProcedureDef;
|
|
239
|
+
/**
|
|
240
|
+
* Gets the unique fields of a model, including both singular and compound unique fields.
|
|
241
|
+
*/
|
|
242
|
+
getUniqueFields(model: string): Array<{
|
|
243
|
+
name: string;
|
|
244
|
+
def: FieldDef;
|
|
245
|
+
} | {
|
|
246
|
+
name: string;
|
|
247
|
+
defs: Record<string, FieldDef>;
|
|
248
|
+
}>;
|
|
249
|
+
/**
|
|
250
|
+
* Gets the delegate discriminator field for a model, if defined via `@@delegate` attribute. Returns `undefined` if not available.
|
|
251
|
+
*/
|
|
252
|
+
getDelegateDiscriminator(model: string): string | undefined;
|
|
253
|
+
};
|
|
254
|
+
declare class InvalidSchemaError extends Error {
|
|
255
|
+
constructor(message: string);
|
|
256
|
+
}
|
|
257
|
+
interface SchemaAccessorConstructor {
|
|
258
|
+
new <Schema extends SchemaDef>(schema: Schema): SchemaAccessor<Schema>;
|
|
259
|
+
}
|
|
260
|
+
type SchemaAccessor<Schema extends SchemaDef> = Schema & Accessors;
|
|
261
|
+
declare const SchemaAccessor: SchemaAccessorConstructor;
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Utility functions to create and work with Expression objects
|
|
265
|
+
*/
|
|
266
|
+
declare const ExpressionUtils: {
|
|
267
|
+
literal: (value: string | number | boolean) => LiteralExpression;
|
|
268
|
+
array: (type: string, items: Expression[]) => ArrayExpression;
|
|
269
|
+
call: (functionName: string, args?: Expression[]) => CallExpression;
|
|
270
|
+
binary: (left: Expression, op: BinaryOperator, right: Expression, binding?: string) => BinaryExpression;
|
|
271
|
+
unary: (op: UnaryOperator, operand: Expression) => UnaryExpression;
|
|
272
|
+
field: (field: string) => FieldExpression;
|
|
273
|
+
member: (receiver: Expression, members: string[]) => MemberExpression;
|
|
274
|
+
binding: (name: string) => BindingExpression;
|
|
275
|
+
_this: () => ThisExpression;
|
|
276
|
+
_null: () => NullExpression;
|
|
277
|
+
and: (expr: Expression, ...expressions: Expression[]) => Expression;
|
|
278
|
+
or: (expr: Expression, ...expressions: Expression[]) => Expression;
|
|
279
|
+
not: (expr: Expression) => UnaryExpression;
|
|
280
|
+
is: (value: unknown, kind: Expression["kind"]) => value is Expression;
|
|
281
|
+
isLiteral: (value: unknown) => value is LiteralExpression;
|
|
282
|
+
isArray: (value: unknown) => value is ArrayExpression;
|
|
283
|
+
isCall: (value: unknown) => value is CallExpression;
|
|
284
|
+
isNull: (value: unknown) => value is NullExpression;
|
|
285
|
+
isThis: (value: unknown) => value is ThisExpression;
|
|
286
|
+
isUnary: (value: unknown) => value is UnaryExpression;
|
|
287
|
+
isBinary: (value: unknown) => value is BinaryExpression;
|
|
288
|
+
isField: (value: unknown) => value is FieldExpression;
|
|
289
|
+
isMember: (value: unknown) => value is MemberExpression;
|
|
290
|
+
isBinding: (value: unknown) => value is BindingExpression;
|
|
291
|
+
getLiteralValue: (expr: Expression) => string | number | boolean | undefined;
|
|
292
|
+
};
|
|
293
|
+
|
|
294
|
+
export { type ArrayExpression, type AttributeApplication, type AttributeArg, type BinaryExpression, type BinaryOperator, type BindingExpression, type BuiltinType, type CallExpression, type CascadeAction, type DataSourceProvider, type DataSourceProviderType, type EnumDef, type EnumField, type Expression, ExpressionUtils, type FieldDef, type FieldExpression, type FieldHasDefault, type FieldIsArray, type FieldIsComputed, type FieldIsDelegateDiscriminator, type FieldIsDelegateRelation, type FieldIsRelation, type FieldIsRelationArray, type FieldType, type ForeignKeyFields, type GetDelegateModels, type GetEnum, type GetEnums, type GetModel, type GetModelDiscriminator, type GetModelField, type GetModelFieldType, type GetModelFields, type GetModels, type GetSubModels, type GetTypeDef, type GetTypeDefField, type GetTypeDefFieldType, type GetTypeDefFields, type GetTypeDefs, InvalidSchemaError, type IsDelegateModel, type LiteralExpression, type MappedBuiltinType, type MemberExpression, type ModelDef, type ModelFieldIsOptional, type NonRelationFields, type NullExpression, type ProcedureDef, type ProcedureParam, type RelationFieldType, type RelationFields, type RelationInfo, type ScalarFields, SchemaAccessor, type SchemaDef, type ThisExpression, type TypeDefDef, type TypeDefFieldIsArray, type TypeDefFieldIsOptional, type UnaryExpression, type UnaryOperator, type UniqueFieldsInfo, type UpdatedAtInfo };
|
package/dist/index.js
CHANGED
|
@@ -94,7 +94,143 @@ var ExpressionUtils = {
|
|
|
94
94
|
return ExpressionUtils.isLiteral(expr) ? expr.value : void 0;
|
|
95
95
|
}, "getLiteralValue")
|
|
96
96
|
};
|
|
97
|
+
|
|
98
|
+
// src/accessor.ts
|
|
99
|
+
var InvalidSchemaError = class extends Error {
|
|
100
|
+
static {
|
|
101
|
+
__name(this, "InvalidSchemaError");
|
|
102
|
+
}
|
|
103
|
+
constructor(message) {
|
|
104
|
+
super(message);
|
|
105
|
+
}
|
|
106
|
+
};
|
|
107
|
+
function _requireModel(schema, name) {
|
|
108
|
+
const model = schema.models[name];
|
|
109
|
+
if (!model) throw new InvalidSchemaError(`Model "${name}" not found in schema`);
|
|
110
|
+
return model;
|
|
111
|
+
}
|
|
112
|
+
__name(_requireModel, "_requireModel");
|
|
113
|
+
function _getField(schema, modelOrType, field) {
|
|
114
|
+
const modelDef = schema.models?.[modelOrType];
|
|
115
|
+
if (modelDef) {
|
|
116
|
+
return modelDef.fields[field];
|
|
117
|
+
}
|
|
118
|
+
const typeDef = schema.typeDefs?.[modelOrType];
|
|
119
|
+
if (typeDef) {
|
|
120
|
+
return typeDef.fields[field];
|
|
121
|
+
}
|
|
122
|
+
return void 0;
|
|
123
|
+
}
|
|
124
|
+
__name(_getField, "_getField");
|
|
125
|
+
function _requireField(schema, modelOrType, field) {
|
|
126
|
+
const fieldDef = _getField(schema, modelOrType, field);
|
|
127
|
+
if (!fieldDef) throw new InvalidSchemaError(`Field "${modelOrType}.${field}" not found in schema`);
|
|
128
|
+
return fieldDef;
|
|
129
|
+
}
|
|
130
|
+
__name(_requireField, "_requireField");
|
|
131
|
+
function _requireModelField(schema, model, field) {
|
|
132
|
+
const modelDef = _requireModel(schema, model);
|
|
133
|
+
const fieldDef = modelDef.fields[field];
|
|
134
|
+
if (!fieldDef) throw new InvalidSchemaError(`Field "${model}.${field}" not found in schema`);
|
|
135
|
+
return fieldDef;
|
|
136
|
+
}
|
|
137
|
+
__name(_requireModelField, "_requireModelField");
|
|
138
|
+
var accessors = {
|
|
139
|
+
get providerType() {
|
|
140
|
+
return this.schema.provider.type;
|
|
141
|
+
},
|
|
142
|
+
getModel(name) {
|
|
143
|
+
return this.schema.models[name];
|
|
144
|
+
},
|
|
145
|
+
requireModel(name) {
|
|
146
|
+
return _requireModel(this.schema, name);
|
|
147
|
+
},
|
|
148
|
+
getField(modelOrType, field) {
|
|
149
|
+
return _getField(this.schema, modelOrType, field);
|
|
150
|
+
},
|
|
151
|
+
requireField(modelOrType, field) {
|
|
152
|
+
return _requireField(this.schema, modelOrType, field);
|
|
153
|
+
},
|
|
154
|
+
getEnum(name) {
|
|
155
|
+
return this.schema.enums?.[name];
|
|
156
|
+
},
|
|
157
|
+
requireEnum(name) {
|
|
158
|
+
const enumDef = this.schema.enums?.[name];
|
|
159
|
+
if (!enumDef) throw new InvalidSchemaError(`Enum "${name}" not found in schema`);
|
|
160
|
+
return enumDef;
|
|
161
|
+
},
|
|
162
|
+
getTypeDef(name) {
|
|
163
|
+
return this.schema.typeDefs?.[name];
|
|
164
|
+
},
|
|
165
|
+
requireTypeDef(name) {
|
|
166
|
+
const typeDef = this.schema.typeDefs?.[name];
|
|
167
|
+
if (!typeDef) throw new InvalidSchemaError(`TypeDef "${name}" not found in schema`);
|
|
168
|
+
return typeDef;
|
|
169
|
+
},
|
|
170
|
+
getProcedure(name) {
|
|
171
|
+
return this.schema.procedures?.[name];
|
|
172
|
+
},
|
|
173
|
+
requireProcedure(name) {
|
|
174
|
+
const procedure = this.schema.procedures?.[name];
|
|
175
|
+
if (!procedure) throw new InvalidSchemaError(`Procedure "${name}" not found in schema`);
|
|
176
|
+
return procedure;
|
|
177
|
+
},
|
|
178
|
+
getUniqueFields(model) {
|
|
179
|
+
const modelDef = _requireModel(this.schema, model);
|
|
180
|
+
const result = [];
|
|
181
|
+
for (const [key, value] of Object.entries(modelDef.uniqueFields)) {
|
|
182
|
+
if (value === null || typeof value !== "object") {
|
|
183
|
+
throw new InvalidSchemaError(`Invalid unique field definition for "${model}.${key}"`);
|
|
184
|
+
}
|
|
185
|
+
if (typeof value.type === "string") {
|
|
186
|
+
result.push({
|
|
187
|
+
name: key,
|
|
188
|
+
def: _requireModelField(this.schema, model, key)
|
|
189
|
+
});
|
|
190
|
+
} else {
|
|
191
|
+
result.push({
|
|
192
|
+
name: key,
|
|
193
|
+
defs: Object.fromEntries(Object.keys(value).map((k) => [
|
|
194
|
+
k,
|
|
195
|
+
_requireModelField(this.schema, model, k)
|
|
196
|
+
]))
|
|
197
|
+
});
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
return result;
|
|
201
|
+
},
|
|
202
|
+
getDelegateDiscriminator(model) {
|
|
203
|
+
const modelDef = _requireModel(this.schema, model);
|
|
204
|
+
const delegateAttr = modelDef.attributes?.find((attr) => attr.name === "@@delegate");
|
|
205
|
+
if (!delegateAttr) {
|
|
206
|
+
return void 0;
|
|
207
|
+
}
|
|
208
|
+
const discriminator = delegateAttr.args?.find((arg) => arg.name === "discriminator");
|
|
209
|
+
if (!discriminator || !ExpressionUtils.isField(discriminator.value)) {
|
|
210
|
+
throw new InvalidSchemaError(`Discriminator field not defined for model "${model}"`);
|
|
211
|
+
}
|
|
212
|
+
return discriminator.value.field;
|
|
213
|
+
}
|
|
214
|
+
};
|
|
215
|
+
var SchemaAccessor = /* @__PURE__ */ __name(function(schema) {
|
|
216
|
+
return new Proxy({
|
|
217
|
+
schema
|
|
218
|
+
}, {
|
|
219
|
+
get(target, prop) {
|
|
220
|
+
const descriptor = Object.getOwnPropertyDescriptor(accessors, prop);
|
|
221
|
+
if (descriptor?.get) {
|
|
222
|
+
return descriptor.get.call(target);
|
|
223
|
+
}
|
|
224
|
+
if (prop in accessors) {
|
|
225
|
+
return accessors[prop].bind(target);
|
|
226
|
+
}
|
|
227
|
+
return schema[prop];
|
|
228
|
+
}
|
|
229
|
+
});
|
|
230
|
+
}, "SchemaAccessor");
|
|
97
231
|
export {
|
|
98
|
-
ExpressionUtils
|
|
232
|
+
ExpressionUtils,
|
|
233
|
+
InvalidSchemaError,
|
|
234
|
+
SchemaAccessor
|
|
99
235
|
};
|
|
100
236
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/expression-utils.ts"],"sourcesContent":["import type {\n ArrayExpression,\n BinaryExpression,\n BinaryOperator,\n BindingExpression,\n CallExpression,\n Expression,\n FieldExpression,\n LiteralExpression,\n MemberExpression,\n NullExpression,\n ThisExpression,\n UnaryExpression,\n UnaryOperator,\n} from './expression';\n\n/**\n * Utility functions to create and work with Expression objects\n */\nexport const ExpressionUtils = {\n literal: (value: string | number | boolean): LiteralExpression => {\n return { kind: 'literal', value };\n },\n\n array: (type: string, items: Expression[]): ArrayExpression => {\n return { kind: 'array', type, items };\n },\n\n call: (functionName: string, args?: Expression[]): CallExpression => {\n return { kind: 'call', function: functionName, args };\n },\n\n binary: (left: Expression, op: BinaryOperator, right: Expression, binding?: string): BinaryExpression => {\n return { kind: 'binary', op, left, right, binding };\n },\n\n unary: (op: UnaryOperator, operand: Expression): UnaryExpression => {\n return { kind: 'unary', op, operand };\n },\n\n field: (field: string): FieldExpression => {\n return { kind: 'field', field };\n },\n\n member: (receiver: Expression, members: string[]): MemberExpression => {\n return { kind: 'member', receiver: receiver, members };\n },\n\n binding: (name: string): BindingExpression => {\n return { kind: 'binding', name };\n },\n\n _this: (): ThisExpression => {\n return { kind: 'this' };\n },\n\n _null: (): NullExpression => {\n return { kind: 'null' };\n },\n\n and: (expr: Expression, ...expressions: Expression[]) => {\n return expressions.reduce((acc, exp) => ExpressionUtils.binary(acc, '&&', exp), expr);\n },\n\n or: (expr: Expression, ...expressions: Expression[]) => {\n return expressions.reduce((acc, exp) => ExpressionUtils.binary(acc, '||', exp), expr);\n },\n\n not: (expr: Expression) => {\n return ExpressionUtils.unary('!', expr);\n },\n\n is: (value: unknown, kind: Expression['kind']): value is Expression => {\n return !!value && typeof value === 'object' && 'kind' in value && value.kind === kind;\n },\n\n isLiteral: (value: unknown): value is LiteralExpression => ExpressionUtils.is(value, 'literal'),\n\n isArray: (value: unknown): value is ArrayExpression => ExpressionUtils.is(value, 'array'),\n\n isCall: (value: unknown): value is CallExpression => ExpressionUtils.is(value, 'call'),\n\n isNull: (value: unknown): value is NullExpression => ExpressionUtils.is(value, 'null'),\n\n isThis: (value: unknown): value is ThisExpression => ExpressionUtils.is(value, 'this'),\n\n isUnary: (value: unknown): value is UnaryExpression => ExpressionUtils.is(value, 'unary'),\n\n isBinary: (value: unknown): value is BinaryExpression => ExpressionUtils.is(value, 'binary'),\n\n isField: (value: unknown): value is FieldExpression => ExpressionUtils.is(value, 'field'),\n\n isMember: (value: unknown): value is MemberExpression => ExpressionUtils.is(value, 'member'),\n\n isBinding: (value: unknown): value is BindingExpression => ExpressionUtils.is(value, 'binding'),\n\n getLiteralValue: (expr: Expression): string | number | boolean | undefined => {\n return ExpressionUtils.isLiteral(expr) ? expr.value : undefined;\n },\n};\n"],"mappings":";;;;AAmBO,IAAMA,kBAAkB;EAC3BC,SAAS,wBAACC,UAAAA;AACN,WAAO;MAAEC,MAAM;MAAWD;IAAM;EACpC,GAFS;EAITE,OAAO,wBAACC,MAAcC,UAAAA;AAClB,WAAO;MAAEH,MAAM;MAASE;MAAMC;IAAM;EACxC,GAFO;EAIPC,MAAM,wBAACC,cAAsBC,SAAAA;AACzB,WAAO;MAAEN,MAAM;MAAQO,UAAUF;MAAcC;IAAK;EACxD,GAFM;EAINE,QAAQ,wBAACC,MAAkBC,IAAoBC,OAAmBC,YAAAA;AAC9D,WAAO;MAAEZ,MAAM;MAAUU;MAAID;MAAME;MAAOC;IAAQ;EACtD,GAFQ;EAIRC,OAAO,wBAACH,IAAmBI,YAAAA;AACvB,WAAO;MAAEd,MAAM;MAASU;MAAII;IAAQ;EACxC,GAFO;EAIPC,OAAO,wBAACA,UAAAA;AACJ,WAAO;MAAEf,MAAM;MAASe;IAAM;EAClC,GAFO;EAIPC,QAAQ,wBAACC,UAAsBC,YAAAA;AAC3B,WAAO;MAAElB,MAAM;MAAUiB;MAAoBC;IAAQ;EACzD,GAFQ;EAIRN,SAAS,wBAACO,SAAAA;AACN,WAAO;MAAEnB,MAAM;MAAWmB;IAAK;EACnC,GAFS;EAITC,OAAO,6BAAA;AACH,WAAO;MAAEpB,MAAM;IAAO;EAC1B,GAFO;EAIPqB,OAAO,6BAAA;AACH,WAAO;MAAErB,MAAM;IAAO;EAC1B,GAFO;EAIPsB,KAAK,wBAACC,SAAqBC,gBAAAA;AACvB,WAAOA,YAAYC,OAAO,CAACC,KAAKC,QAAQ9B,gBAAgBW,OAAOkB,KAAK,MAAMC,GAAAA,GAAMJ,IAAAA;EACpF,GAFK;EAILK,IAAI,wBAACL,SAAqBC,gBAAAA;AACtB,WAAOA,YAAYC,OAAO,CAACC,KAAKC,QAAQ9B,gBAAgBW,OAAOkB,KAAK,MAAMC,GAAAA,GAAMJ,IAAAA;EACpF,GAFI;EAIJM,KAAK,wBAACN,SAAAA;AACF,WAAO1B,gBAAgBgB,MAAM,KAAKU,IAAAA;EACtC,GAFK;EAILO,IAAI,wBAAC/B,OAAgBC,SAAAA;AACjB,WAAO,CAAC,CAACD,SAAS,OAAOA,UAAU,YAAY,UAAUA,SAASA,MAAMC,SAASA;EACrF,GAFI;EAIJ+B,WAAW,wBAAChC,UAA+CF,gBAAgBiC,GAAG/B,OAAO,SAAA,GAA1E;EAEXiC,SAAS,wBAACjC,UAA6CF,gBAAgBiC,GAAG/B,OAAO,OAAA,GAAxE;EAETkC,QAAQ,wBAAClC,UAA4CF,gBAAgBiC,GAAG/B,OAAO,MAAA,GAAvE;EAERmC,QAAQ,wBAACnC,UAA4CF,gBAAgBiC,GAAG/B,OAAO,MAAA,GAAvE;EAERoC,QAAQ,wBAACpC,UAA4CF,gBAAgBiC,GAAG/B,OAAO,MAAA,GAAvE;EAERqC,SAAS,wBAACrC,UAA6CF,gBAAgBiC,GAAG/B,OAAO,OAAA,GAAxE;EAETsC,UAAU,wBAACtC,UAA8CF,gBAAgBiC,GAAG/B,OAAO,QAAA,GAAzE;EAEVuC,SAAS,wBAACvC,UAA6CF,gBAAgBiC,GAAG/B,OAAO,OAAA,GAAxE;EAETwC,UAAU,wBAACxC,UAA8CF,gBAAgBiC,GAAG/B,OAAO,QAAA,GAAzE;EAEVyC,WAAW,wBAACzC,UAA+CF,gBAAgBiC,GAAG/B,OAAO,SAAA,GAA1E;EAEX0C,iBAAiB,wBAAClB,SAAAA;AACd,WAAO1B,gBAAgBkC,UAAUR,IAAAA,IAAQA,KAAKxB,QAAQ2C;EAC1D,GAFiB;AAGrB;","names":["ExpressionUtils","literal","value","kind","array","type","items","call","functionName","args","function","binary","left","op","right","binding","unary","operand","field","member","receiver","members","name","_this","_null","and","expr","expressions","reduce","acc","exp","or","not","is","isLiteral","isArray","isCall","isNull","isThis","isUnary","isBinary","isField","isMember","isBinding","getLiteralValue","undefined"]}
|
|
1
|
+
{"version":3,"sources":["../src/expression-utils.ts","../src/accessor.ts"],"sourcesContent":["import type {\n ArrayExpression,\n BinaryExpression,\n BinaryOperator,\n BindingExpression,\n CallExpression,\n Expression,\n FieldExpression,\n LiteralExpression,\n MemberExpression,\n NullExpression,\n ThisExpression,\n UnaryExpression,\n UnaryOperator,\n} from './expression';\n\n/**\n * Utility functions to create and work with Expression objects\n */\nexport const ExpressionUtils = {\n literal: (value: string | number | boolean): LiteralExpression => {\n return { kind: 'literal', value };\n },\n\n array: (type: string, items: Expression[]): ArrayExpression => {\n return { kind: 'array', type, items };\n },\n\n call: (functionName: string, args?: Expression[]): CallExpression => {\n return { kind: 'call', function: functionName, args };\n },\n\n binary: (left: Expression, op: BinaryOperator, right: Expression, binding?: string): BinaryExpression => {\n return { kind: 'binary', op, left, right, binding };\n },\n\n unary: (op: UnaryOperator, operand: Expression): UnaryExpression => {\n return { kind: 'unary', op, operand };\n },\n\n field: (field: string): FieldExpression => {\n return { kind: 'field', field };\n },\n\n member: (receiver: Expression, members: string[]): MemberExpression => {\n return { kind: 'member', receiver: receiver, members };\n },\n\n binding: (name: string): BindingExpression => {\n return { kind: 'binding', name };\n },\n\n _this: (): ThisExpression => {\n return { kind: 'this' };\n },\n\n _null: (): NullExpression => {\n return { kind: 'null' };\n },\n\n and: (expr: Expression, ...expressions: Expression[]) => {\n return expressions.reduce((acc, exp) => ExpressionUtils.binary(acc, '&&', exp), expr);\n },\n\n or: (expr: Expression, ...expressions: Expression[]) => {\n return expressions.reduce((acc, exp) => ExpressionUtils.binary(acc, '||', exp), expr);\n },\n\n not: (expr: Expression) => {\n return ExpressionUtils.unary('!', expr);\n },\n\n is: (value: unknown, kind: Expression['kind']): value is Expression => {\n return !!value && typeof value === 'object' && 'kind' in value && value.kind === kind;\n },\n\n isLiteral: (value: unknown): value is LiteralExpression => ExpressionUtils.is(value, 'literal'),\n\n isArray: (value: unknown): value is ArrayExpression => ExpressionUtils.is(value, 'array'),\n\n isCall: (value: unknown): value is CallExpression => ExpressionUtils.is(value, 'call'),\n\n isNull: (value: unknown): value is NullExpression => ExpressionUtils.is(value, 'null'),\n\n isThis: (value: unknown): value is ThisExpression => ExpressionUtils.is(value, 'this'),\n\n isUnary: (value: unknown): value is UnaryExpression => ExpressionUtils.is(value, 'unary'),\n\n isBinary: (value: unknown): value is BinaryExpression => ExpressionUtils.is(value, 'binary'),\n\n isField: (value: unknown): value is FieldExpression => ExpressionUtils.is(value, 'field'),\n\n isMember: (value: unknown): value is MemberExpression => ExpressionUtils.is(value, 'member'),\n\n isBinding: (value: unknown): value is BindingExpression => ExpressionUtils.is(value, 'binding'),\n\n getLiteralValue: (expr: Expression): string | number | boolean | undefined => {\n return ExpressionUtils.isLiteral(expr) ? expr.value : undefined;\n },\n};\n","import { ExpressionUtils } from './expression-utils';\nimport type {\n DataSourceProviderType,\n EnumDef,\n FieldDef,\n ModelDef,\n ProcedureDef,\n SchemaDef,\n TypeDefDef,\n} from './schema';\n\ntype Accessors = {\n /**\n * The data source provider type of the schema, e.g. \"sqlite\", \"postgresql\", etc.\n */\n get providerType(): DataSourceProviderType;\n\n /**\n * Gets a model definition by name. Returns `undefined` if the model is not found.\n */\n getModel(name: string): ModelDef | undefined;\n\n /**\n * Gets a model definition by name. Throws an error if the model is not found.\n */\n requireModel(name: string): ModelDef;\n\n /**\n * Gets a field definition by model/type and field name. Returns `undefined` if the field is not found.\n */\n getField(modelOrType: string, field: string): FieldDef | undefined;\n\n /**\n * Gets a field definition by model/type and field name. Throws an error if the field is not found.\n */\n requireField(modelOrType: string, field: string): FieldDef;\n\n /***\n * Gets an enum definition by name. Returns `undefined` if the enum is not found.\n */\n getEnum(name: string): EnumDef | undefined;\n\n /**\n * Gets an enum definition by name. Throws an error if the enum is not found.\n */\n requireEnum(name: string): EnumDef;\n\n /**\n * Gets a type definition by name. Returns `undefined` if the type definition is not found.\n * @param name\n */\n getTypeDef(name: string): TypeDefDef | undefined;\n\n /**\n * Gets a type definition by name. Throws an error if the type definition is not found.\n */\n requireTypeDef(name: string): TypeDefDef;\n\n /**\n * Gets a procedure definition by name. Returns `undefined` if the procedure is not found.\n */\n getProcedure(name: string): ProcedureDef | undefined;\n\n /**\n * Gets a procedure definition by name. Throws an error if the procedure is not found.\n */\n requireProcedure(name: string): ProcedureDef;\n\n /**\n * Gets the unique fields of a model, including both singular and compound unique fields.\n */\n getUniqueFields(\n model: string,\n ): Array<{ name: string; def: FieldDef } | { name: string; defs: Record<string, FieldDef> }>;\n\n /**\n * Gets the delegate discriminator field for a model, if defined via `@@delegate` attribute. Returns `undefined` if not available.\n */\n getDelegateDiscriminator(model: string): string | undefined;\n};\n\nexport class InvalidSchemaError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n\ntype AccessorTarget = { schema: SchemaDef };\n\nfunction _requireModel(schema: SchemaDef, name: string): ModelDef {\n const model = schema.models[name];\n if (!model) throw new InvalidSchemaError(`Model \"${name}\" not found in schema`);\n return model;\n}\n\nfunction _getField(schema: SchemaDef, modelOrType: string, field: string): FieldDef | undefined {\n const modelDef = schema.models?.[modelOrType];\n if (modelDef) {\n return modelDef.fields[field];\n }\n const typeDef = schema.typeDefs?.[modelOrType];\n if (typeDef) {\n return typeDef.fields[field];\n }\n return undefined;\n}\n\nfunction _requireField(schema: SchemaDef, modelOrType: string, field: string): FieldDef {\n const fieldDef = _getField(schema, modelOrType, field);\n if (!fieldDef) throw new InvalidSchemaError(`Field \"${modelOrType}.${field}\" not found in schema`);\n return fieldDef;\n}\n\nfunction _requireModelField(schema: SchemaDef, model: string, field: string) {\n const modelDef = _requireModel(schema, model);\n const fieldDef = modelDef.fields[field];\n if (!fieldDef) throw new InvalidSchemaError(`Field \"${model}.${field}\" not found in schema`);\n return fieldDef;\n}\n\nconst accessors: Accessors = {\n get providerType() {\n return (this as unknown as AccessorTarget).schema.provider.type;\n },\n\n getModel(this: { schema: SchemaDef }, name: string) {\n return this.schema.models[name];\n },\n\n requireModel(this: { schema: SchemaDef }, name: string) {\n return _requireModel(this.schema, name);\n },\n\n getField(this: { schema: SchemaDef }, modelOrType: string, field: string) {\n return _getField(this.schema, modelOrType, field);\n },\n\n requireField(this: { schema: SchemaDef }, modelOrType: string, field: string) {\n return _requireField(this.schema, modelOrType, field);\n },\n\n getEnum(this: { schema: SchemaDef }, name: string) {\n return this.schema.enums?.[name];\n },\n\n requireEnum(this: { schema: SchemaDef }, name: string) {\n const enumDef = this.schema.enums?.[name];\n if (!enumDef) throw new InvalidSchemaError(`Enum \"${name}\" not found in schema`);\n return enumDef;\n },\n\n getTypeDef(this: { schema: SchemaDef }, name: string) {\n return this.schema.typeDefs?.[name];\n },\n\n requireTypeDef(this: { schema: SchemaDef }, name: string) {\n const typeDef = this.schema.typeDefs?.[name];\n if (!typeDef) throw new InvalidSchemaError(`TypeDef \"${name}\" not found in schema`);\n return typeDef;\n },\n\n getProcedure(this: { schema: SchemaDef }, name: string) {\n return this.schema.procedures?.[name];\n },\n\n requireProcedure(this: { schema: SchemaDef }, name: string) {\n const procedure = this.schema.procedures?.[name];\n if (!procedure) throw new InvalidSchemaError(`Procedure \"${name}\" not found in schema`);\n return procedure;\n },\n\n getUniqueFields(this: { schema: SchemaDef }, model: string) {\n const modelDef = _requireModel(this.schema, model);\n const result: Array<{ name: string; def: FieldDef } | { name: string; defs: Record<string, FieldDef> }> = [];\n for (const [key, value] of Object.entries(modelDef.uniqueFields)) {\n if (value === null || typeof value !== 'object') {\n throw new InvalidSchemaError(`Invalid unique field definition for \"${model}.${key}\"`);\n }\n\n if (typeof value.type === 'string') {\n // singular unique field\n result.push({ name: key, def: _requireModelField(this.schema, model, key) });\n } else {\n // compound unique field\n result.push({\n name: key,\n defs: Object.fromEntries(\n Object.keys(value).map((k) => [k, _requireModelField(this.schema, model, k)]),\n ),\n });\n }\n }\n return result;\n },\n\n getDelegateDiscriminator(this: { schema: SchemaDef }, model: string) {\n const modelDef = _requireModel(this.schema, model);\n const delegateAttr = modelDef.attributes?.find((attr) => attr.name === '@@delegate');\n if (!delegateAttr) {\n return undefined;\n }\n const discriminator = delegateAttr.args?.find((arg) => arg.name === 'discriminator');\n if (!discriminator || !ExpressionUtils.isField(discriminator.value)) {\n throw new InvalidSchemaError(`Discriminator field not defined for model \"${model}\"`);\n }\n return discriminator.value.field;\n },\n};\n\nexport type SchemaAccessor<Schema extends SchemaDef> = Schema & Accessors;\n\nexport interface SchemaAccessorConstructor {\n new <Schema extends SchemaDef>(schema: Schema): SchemaAccessor<Schema>;\n}\n\nexport const SchemaAccessor = function <Schema extends SchemaDef>(this: any, schema: Schema) {\n return new Proxy(\n { schema },\n {\n get(target, prop) {\n const descriptor = Object.getOwnPropertyDescriptor(accessors, prop);\n if (descriptor?.get) {\n return descriptor.get.call(target);\n }\n if (prop in accessors) {\n return (accessors as any)[prop].bind(target);\n }\n return (schema as any)[prop];\n },\n },\n );\n} as unknown as SchemaAccessorConstructor;\n"],"mappings":";;;;AAmBO,IAAMA,kBAAkB;EAC3BC,SAAS,wBAACC,UAAAA;AACN,WAAO;MAAEC,MAAM;MAAWD;IAAM;EACpC,GAFS;EAITE,OAAO,wBAACC,MAAcC,UAAAA;AAClB,WAAO;MAAEH,MAAM;MAASE;MAAMC;IAAM;EACxC,GAFO;EAIPC,MAAM,wBAACC,cAAsBC,SAAAA;AACzB,WAAO;MAAEN,MAAM;MAAQO,UAAUF;MAAcC;IAAK;EACxD,GAFM;EAINE,QAAQ,wBAACC,MAAkBC,IAAoBC,OAAmBC,YAAAA;AAC9D,WAAO;MAAEZ,MAAM;MAAUU;MAAID;MAAME;MAAOC;IAAQ;EACtD,GAFQ;EAIRC,OAAO,wBAACH,IAAmBI,YAAAA;AACvB,WAAO;MAAEd,MAAM;MAASU;MAAII;IAAQ;EACxC,GAFO;EAIPC,OAAO,wBAACA,UAAAA;AACJ,WAAO;MAAEf,MAAM;MAASe;IAAM;EAClC,GAFO;EAIPC,QAAQ,wBAACC,UAAsBC,YAAAA;AAC3B,WAAO;MAAElB,MAAM;MAAUiB;MAAoBC;IAAQ;EACzD,GAFQ;EAIRN,SAAS,wBAACO,SAAAA;AACN,WAAO;MAAEnB,MAAM;MAAWmB;IAAK;EACnC,GAFS;EAITC,OAAO,6BAAA;AACH,WAAO;MAAEpB,MAAM;IAAO;EAC1B,GAFO;EAIPqB,OAAO,6BAAA;AACH,WAAO;MAAErB,MAAM;IAAO;EAC1B,GAFO;EAIPsB,KAAK,wBAACC,SAAqBC,gBAAAA;AACvB,WAAOA,YAAYC,OAAO,CAACC,KAAKC,QAAQ9B,gBAAgBW,OAAOkB,KAAK,MAAMC,GAAAA,GAAMJ,IAAAA;EACpF,GAFK;EAILK,IAAI,wBAACL,SAAqBC,gBAAAA;AACtB,WAAOA,YAAYC,OAAO,CAACC,KAAKC,QAAQ9B,gBAAgBW,OAAOkB,KAAK,MAAMC,GAAAA,GAAMJ,IAAAA;EACpF,GAFI;EAIJM,KAAK,wBAACN,SAAAA;AACF,WAAO1B,gBAAgBgB,MAAM,KAAKU,IAAAA;EACtC,GAFK;EAILO,IAAI,wBAAC/B,OAAgBC,SAAAA;AACjB,WAAO,CAAC,CAACD,SAAS,OAAOA,UAAU,YAAY,UAAUA,SAASA,MAAMC,SAASA;EACrF,GAFI;EAIJ+B,WAAW,wBAAChC,UAA+CF,gBAAgBiC,GAAG/B,OAAO,SAAA,GAA1E;EAEXiC,SAAS,wBAACjC,UAA6CF,gBAAgBiC,GAAG/B,OAAO,OAAA,GAAxE;EAETkC,QAAQ,wBAAClC,UAA4CF,gBAAgBiC,GAAG/B,OAAO,MAAA,GAAvE;EAERmC,QAAQ,wBAACnC,UAA4CF,gBAAgBiC,GAAG/B,OAAO,MAAA,GAAvE;EAERoC,QAAQ,wBAACpC,UAA4CF,gBAAgBiC,GAAG/B,OAAO,MAAA,GAAvE;EAERqC,SAAS,wBAACrC,UAA6CF,gBAAgBiC,GAAG/B,OAAO,OAAA,GAAxE;EAETsC,UAAU,wBAACtC,UAA8CF,gBAAgBiC,GAAG/B,OAAO,QAAA,GAAzE;EAEVuC,SAAS,wBAACvC,UAA6CF,gBAAgBiC,GAAG/B,OAAO,OAAA,GAAxE;EAETwC,UAAU,wBAACxC,UAA8CF,gBAAgBiC,GAAG/B,OAAO,QAAA,GAAzE;EAEVyC,WAAW,wBAACzC,UAA+CF,gBAAgBiC,GAAG/B,OAAO,SAAA,GAA1E;EAEX0C,iBAAiB,wBAAClB,SAAAA;AACd,WAAO1B,gBAAgBkC,UAAUR,IAAAA,IAAQA,KAAKxB,QAAQ2C;EAC1D,GAFiB;AAGrB;;;AClBO,IAAMC,qBAAN,cAAiCC,MAAAA;EAjFxC,OAiFwCA;;;EACpC,YAAYC,SAAiB;AACzB,UAAMA,OAAAA;EACV;AACJ;AAIA,SAASC,cAAcC,QAAmBC,MAAY;AAClD,QAAMC,QAAQF,OAAOG,OAAOF,IAAAA;AAC5B,MAAI,CAACC,MAAO,OAAM,IAAIN,mBAAmB,UAAUK,IAAAA,uBAA2B;AAC9E,SAAOC;AACX;AAJSH;AAMT,SAASK,UAAUJ,QAAmBK,aAAqBC,OAAa;AACpE,QAAMC,WAAWP,OAAOG,SAASE,WAAAA;AACjC,MAAIE,UAAU;AACV,WAAOA,SAASC,OAAOF,KAAAA;EAC3B;AACA,QAAMG,UAAUT,OAAOU,WAAWL,WAAAA;AAClC,MAAII,SAAS;AACT,WAAOA,QAAQD,OAAOF,KAAAA;EAC1B;AACA,SAAOK;AACX;AAVSP;AAYT,SAASQ,cAAcZ,QAAmBK,aAAqBC,OAAa;AACxE,QAAMO,WAAWT,UAAUJ,QAAQK,aAAaC,KAAAA;AAChD,MAAI,CAACO,SAAU,OAAM,IAAIjB,mBAAmB,UAAUS,WAAAA,IAAeC,KAAAA,uBAA4B;AACjG,SAAOO;AACX;AAJSD;AAMT,SAASE,mBAAmBd,QAAmBE,OAAeI,OAAa;AACvE,QAAMC,WAAWR,cAAcC,QAAQE,KAAAA;AACvC,QAAMW,WAAWN,SAASC,OAAOF,KAAAA;AACjC,MAAI,CAACO,SAAU,OAAM,IAAIjB,mBAAmB,UAAUM,KAAAA,IAASI,KAAAA,uBAA4B;AAC3F,SAAOO;AACX;AALSC;AAOT,IAAMC,YAAuB;EACzB,IAAIC,eAAe;AACf,WAAQ,KAAmChB,OAAOiB,SAASC;EAC/D;EAEAC,SAAsClB,MAAY;AAC9C,WAAO,KAAKD,OAAOG,OAAOF,IAAAA;EAC9B;EAEAmB,aAA0CnB,MAAY;AAClD,WAAOF,cAAc,KAAKC,QAAQC,IAAAA;EACtC;EAEAoB,SAAsChB,aAAqBC,OAAa;AACpE,WAAOF,UAAU,KAAKJ,QAAQK,aAAaC,KAAAA;EAC/C;EAEAgB,aAA0CjB,aAAqBC,OAAa;AACxE,WAAOM,cAAc,KAAKZ,QAAQK,aAAaC,KAAAA;EACnD;EAEAiB,QAAqCtB,MAAY;AAC7C,WAAO,KAAKD,OAAOwB,QAAQvB,IAAAA;EAC/B;EAEAwB,YAAyCxB,MAAY;AACjD,UAAMyB,UAAU,KAAK1B,OAAOwB,QAAQvB,IAAAA;AACpC,QAAI,CAACyB,QAAS,OAAM,IAAI9B,mBAAmB,SAASK,IAAAA,uBAA2B;AAC/E,WAAOyB;EACX;EAEAC,WAAwC1B,MAAY;AAChD,WAAO,KAAKD,OAAOU,WAAWT,IAAAA;EAClC;EAEA2B,eAA4C3B,MAAY;AACpD,UAAMQ,UAAU,KAAKT,OAAOU,WAAWT,IAAAA;AACvC,QAAI,CAACQ,QAAS,OAAM,IAAIb,mBAAmB,YAAYK,IAAAA,uBAA2B;AAClF,WAAOQ;EACX;EAEAoB,aAA0C5B,MAAY;AAClD,WAAO,KAAKD,OAAO8B,aAAa7B,IAAAA;EACpC;EAEA8B,iBAA8C9B,MAAY;AACtD,UAAM+B,YAAY,KAAKhC,OAAO8B,aAAa7B,IAAAA;AAC3C,QAAI,CAAC+B,UAAW,OAAM,IAAIpC,mBAAmB,cAAcK,IAAAA,uBAA2B;AACtF,WAAO+B;EACX;EAEAC,gBAA6C/B,OAAa;AACtD,UAAMK,WAAWR,cAAc,KAAKC,QAAQE,KAAAA;AAC5C,UAAMgC,SAAoG,CAAA;AAC1G,eAAW,CAACC,KAAKC,KAAAA,KAAUC,OAAOC,QAAQ/B,SAASgC,YAAY,GAAG;AAC9D,UAAIH,UAAU,QAAQ,OAAOA,UAAU,UAAU;AAC7C,cAAM,IAAIxC,mBAAmB,wCAAwCM,KAAAA,IAASiC,GAAAA,GAAM;MACxF;AAEA,UAAI,OAAOC,MAAMlB,SAAS,UAAU;AAEhCgB,eAAOM,KAAK;UAAEvC,MAAMkC;UAAKM,KAAK3B,mBAAmB,KAAKd,QAAQE,OAAOiC,GAAAA;QAAK,CAAA;MAC9E,OAAO;AAEHD,eAAOM,KAAK;UACRvC,MAAMkC;UACNO,MAAML,OAAOM,YACTN,OAAOO,KAAKR,KAAAA,EAAOS,IAAI,CAACC,MAAM;YAACA;YAAGhC,mBAAmB,KAAKd,QAAQE,OAAO4C,CAAAA;WAAG,CAAA;QAEpF,CAAA;MACJ;IACJ;AACA,WAAOZ;EACX;EAEAa,yBAAsD7C,OAAa;AAC/D,UAAMK,WAAWR,cAAc,KAAKC,QAAQE,KAAAA;AAC5C,UAAM8C,eAAezC,SAAS0C,YAAYC,KAAK,CAACC,SAASA,KAAKlD,SAAS,YAAA;AACvE,QAAI,CAAC+C,cAAc;AACf,aAAOrC;IACX;AACA,UAAMyC,gBAAgBJ,aAAaK,MAAMH,KAAK,CAACI,QAAQA,IAAIrD,SAAS,eAAA;AACpE,QAAI,CAACmD,iBAAiB,CAACG,gBAAgBC,QAAQJ,cAAchB,KAAK,GAAG;AACjE,YAAM,IAAIxC,mBAAmB,8CAA8CM,KAAAA,GAAQ;IACvF;AACA,WAAOkD,cAAchB,MAAM9B;EAC/B;AACJ;AAQO,IAAMmD,iBAAiB,gCAA+CzD,QAAc;AACvF,SAAO,IAAI0D,MACP;IAAE1D;EAAO,GACT;IACI2D,IAAIC,QAAQC,MAAI;AACZ,YAAMC,aAAazB,OAAO0B,yBAAyBhD,WAAW8C,IAAAA;AAC9D,UAAIC,YAAYH,KAAK;AACjB,eAAOG,WAAWH,IAAIK,KAAKJ,MAAAA;MAC/B;AACA,UAAIC,QAAQ9C,WAAW;AACnB,eAAQA,UAAkB8C,IAAAA,EAAMI,KAAKL,MAAAA;MACzC;AACA,aAAQ5D,OAAe6D,IAAAA;IAC3B;EACJ,CAAA;AAER,GAhB8B;","names":["ExpressionUtils","literal","value","kind","array","type","items","call","functionName","args","function","binary","left","op","right","binding","unary","operand","field","member","receiver","members","name","_this","_null","and","expr","expressions","reduce","acc","exp","or","not","is","isLiteral","isArray","isCall","isNull","isThis","isUnary","isBinary","isField","isMember","isBinding","getLiteralValue","undefined","InvalidSchemaError","Error","message","_requireModel","schema","name","model","models","_getField","modelOrType","field","modelDef","fields","typeDef","typeDefs","undefined","_requireField","fieldDef","_requireModelField","accessors","providerType","provider","type","getModel","requireModel","getField","requireField","getEnum","enums","requireEnum","enumDef","getTypeDef","requireTypeDef","getProcedure","procedures","requireProcedure","procedure","getUniqueFields","result","key","value","Object","entries","uniqueFields","push","def","defs","fromEntries","keys","map","k","getDelegateDiscriminator","delegateAttr","attributes","find","attr","discriminator","args","arg","ExpressionUtils","isField","SchemaAccessor","Proxy","get","target","prop","descriptor","getOwnPropertyDescriptor","call","bind"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zenstackhq/schema",
|
|
3
|
-
"version": "3.4.0
|
|
3
|
+
"version": "3.4.0",
|
|
4
4
|
"description": "ZenStack Runtime Schema",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"keywords": [],
|
|
@@ -25,13 +25,16 @@
|
|
|
25
25
|
"decimal.js": "^10.4.3"
|
|
26
26
|
},
|
|
27
27
|
"devDependencies": {
|
|
28
|
-
"@zenstackhq/eslint-config": "3.4.0
|
|
29
|
-
"@zenstackhq/typescript-config": "3.4.0
|
|
28
|
+
"@zenstackhq/eslint-config": "3.4.0",
|
|
29
|
+
"@zenstackhq/typescript-config": "3.4.0",
|
|
30
|
+
"@zenstackhq/vitest-config": "3.4.0"
|
|
30
31
|
},
|
|
31
32
|
"scripts": {
|
|
32
33
|
"build": "tsc --noEmit && tsup-node",
|
|
33
34
|
"watch": "tsup-node --watch",
|
|
34
35
|
"lint": "eslint src --ext ts",
|
|
35
|
-
"
|
|
36
|
+
"test": "vitest run",
|
|
37
|
+
"pack": "pnpm pack",
|
|
38
|
+
"test:generate": "tsx ../../scripts/test-generate.ts ."
|
|
36
39
|
}
|
|
37
40
|
}
|