@zenstackhq/schema 3.4.0-beta.4 → 3.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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
@@ -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, Pick<FieldDef, 'type'> | Record<string, Pick<FieldDef, 'type'>>>;
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 (true | UpdatedAtInfo) ? true : GetModelField<Schema, Model, Field>['relation'] 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
- 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, 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, type SchemaDef, type ThisExpression, type TypeDefDef, type TypeDefFieldIsArray, type TypeDefFieldIsOptional, type UnaryExpression, type UnaryOperator, type UpdatedAtInfo };
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, Pick<FieldDef, 'type'> | Record<string, Pick<FieldDef, 'type'>>>;
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 (true | UpdatedAtInfo) ? true : GetModelField<Schema, Model, Field>['relation'] 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
- 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, 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, type SchemaDef, type ThisExpression, type TypeDefDef, type TypeDefFieldIsArray, type TypeDefFieldIsOptional, type UnaryExpression, type UnaryOperator, type UpdatedAtInfo };
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":"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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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zenstackhq/schema",
3
- "version": "3.4.0-beta.4",
3
+ "version": "3.4.1",
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/typescript-config": "3.4.0-beta.4",
29
- "@zenstackhq/eslint-config": "3.4.0-beta.4"
28
+ "@zenstackhq/vitest-config": "3.4.1",
29
+ "@zenstackhq/eslint-config": "3.4.1",
30
+ "@zenstackhq/typescript-config": "3.4.1"
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
- "pack": "pnpm pack"
36
+ "test": "vitest run",
37
+ "pack": "pnpm pack",
38
+ "test:generate": "tsx ../../scripts/test-generate.ts ."
36
39
  }
37
40
  }