@zenstackhq/sdk 1.0.0-alpha.98 → 1.0.0-beta.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/code-gen.d.ts CHANGED
@@ -1,5 +1,13 @@
1
- import { Project } from 'ts-morph';
1
+ import { CompilerOptions, Project } from 'ts-morph';
2
+ /**
3
+ * Creates a TS code generation project
4
+ */
5
+ export declare function createProject(options?: CompilerOptions): Project;
6
+ /**
7
+ * Persists a TS project to disk.
8
+ */
9
+ export declare function saveProject(project: Project): Promise<void>;
2
10
  /**
3
11
  * Emit a TS project to JS files.
4
12
  */
5
- export declare function emitProject(project: Project, format?: boolean): Promise<void>;
13
+ export declare function emitProject(project: Project): Promise<void>;
package/code-gen.js CHANGED
@@ -12,8 +12,10 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
- exports.emitProject = void 0;
15
+ exports.emitProject = exports.saveProject = exports.createProject = void 0;
16
16
  const prettier_1 = __importDefault(require("prettier"));
17
+ const ts_morph_1 = require("ts-morph");
18
+ const types_1 = require("./types");
17
19
  const formatOptions = {
18
20
  trailingComma: 'all',
19
21
  tabWidth: 4,
@@ -37,17 +39,47 @@ function formatFile(sourceFile) {
37
39
  }
38
40
  });
39
41
  }
42
+ /**
43
+ * Creates a TS code generation project
44
+ */
45
+ function createProject(options) {
46
+ return new ts_morph_1.Project({
47
+ compilerOptions: Object.assign({ target: ts_morph_1.ScriptTarget.ES2016, module: ts_morph_1.ModuleKind.CommonJS, esModuleInterop: true, declaration: true, strict: true, skipLibCheck: true, noEmitOnError: true }, options),
48
+ });
49
+ }
50
+ exports.createProject = createProject;
51
+ /**
52
+ * Persists a TS project to disk.
53
+ */
54
+ function saveProject(project) {
55
+ return __awaiter(this, void 0, void 0, function* () {
56
+ yield Promise.all(project.getSourceFiles().map((sf) => __awaiter(this, void 0, void 0, function* () {
57
+ yield formatFile(sf);
58
+ })));
59
+ yield project.save();
60
+ });
61
+ }
62
+ exports.saveProject = saveProject;
40
63
  /**
41
64
  * Emit a TS project to JS files.
42
65
  */
43
- function emitProject(project, format = true) {
66
+ function emitProject(project) {
44
67
  return __awaiter(this, void 0, void 0, function* () {
45
- if (format) {
46
- yield Promise.all(project.getSourceFiles().map((sf) => __awaiter(this, void 0, void 0, function* () {
47
- yield formatFile(sf);
48
- })));
68
+ const errors = project.getPreEmitDiagnostics().filter((d) => d.getCategory() === ts_morph_1.DiagnosticCategory.Error);
69
+ if (errors.length > 0) {
70
+ console.error('Error compiling generated code:');
71
+ console.error(project.formatDiagnosticsWithColorAndContext(errors.slice(0, 10)));
72
+ yield project.save();
73
+ throw new types_1.PluginError('', `Error compiling generated code`);
74
+ }
75
+ const result = yield project.emit();
76
+ const emitErrors = result.getDiagnostics().filter((d) => d.getCategory() === ts_morph_1.DiagnosticCategory.Error);
77
+ if (emitErrors.length > 0) {
78
+ console.error('Some generated code is not emitted:');
79
+ console.error(project.formatDiagnosticsWithColorAndContext(emitErrors.slice(0, 10)));
80
+ yield project.save();
81
+ throw new types_1.PluginError('', `Error emitting generated code`);
49
82
  }
50
- yield project.emit();
51
83
  });
52
84
  }
53
85
  exports.emitProject = emitProject;
package/code-gen.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"code-gen.js","sourceRoot":"","sources":["../src/code-gen.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,wDAAgC;AAGhC,MAAM,aAAa,GAAG;IAClB,aAAa,EAAE,KAAK;IACpB,QAAQ,EAAE,CAAC;IACX,UAAU,EAAE,GAAG;IACf,cAAc,EAAE,IAAI;IACpB,IAAI,EAAE,IAAI;IACV,WAAW,EAAE,IAAI;IACjB,OAAO,EAAE,KAAK;IACd,MAAM,EAAE,YAAY;CACd,CAAC;AAEX,SAAe,UAAU,CAAC,UAAsB;;QAC5C,IAAI;YACA,MAAM,OAAO,GAAG,UAAU,CAAC,WAAW,EAAE,CAAC;YACzC,MAAM,SAAS,GAAG,kBAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;YAC1D,UAAU,CAAC,eAAe,CAAC,SAAS,CAAC,CAAC;YACtC,MAAM,UAAU,CAAC,IAAI,EAAE,CAAC;SAC3B;QAAC,WAAM;YACJ,WAAW;SACd;IACL,CAAC;CAAA;AAED;;GAEG;AACH,SAAsB,WAAW,CAAC,OAAgB,EAAE,MAAM,GAAG,IAAI;;QAC7D,IAAI,MAAM,EAAE;YACR,MAAM,OAAO,CAAC,GAAG,CACb,OAAO,CAAC,cAAc,EAAE,CAAC,GAAG,CAAC,CAAO,EAAE,EAAE,EAAE;gBACtC,MAAM,UAAU,CAAC,EAAE,CAAC,CAAC;YACzB,CAAC,CAAA,CAAC,CACL,CAAC;SACL;QACD,MAAM,OAAO,CAAC,IAAI,EAAE,CAAC;IACzB,CAAC;CAAA;AATD,kCASC"}
1
+ {"version":3,"file":"code-gen.js","sourceRoot":"","sources":["../src/code-gen.ts"],"names":[],"mappings":"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"}
package/constants.d.ts CHANGED
@@ -1,21 +1,5 @@
1
1
  /**
2
- * Auxiliary database field for supporting policy check for nested writes
2
+ * @zenstackhq/runtime package name
3
3
  */
4
- export declare const TRANSACTION_FIELD_NAME = "zenstack_transaction";
5
- /**
6
- * Auxiliary database field for building up policy check queries
7
- */
8
- export declare const GUARD_FIELD_NAME = "zenstack_guard";
9
- /**
10
- * All Auxiliary fields.
11
- */
12
- export declare const AUXILIARY_FIELDS: string[];
13
- /**
14
- * Reasons for a CRUD operation to fail.
15
- */
16
- export declare enum CrudFailureReason {
17
- /**
18
- * CRUD suceeded but the result was not readable.
19
- */
20
- RESULT_NOT_READABLE = "RESULT_NOT_READABLE"
21
- }
4
+ export declare const RUNTIME_PACKAGE = "@zenstackhq/runtime";
5
+ export { AUXILIARY_FIELDS, GUARD_FIELD_NAME, TRANSACTION_FIELD_NAME, CrudFailureReason, } from '@zenstackhq/runtime/constants';
package/constants.js CHANGED
@@ -1,26 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.CrudFailureReason = exports.AUXILIARY_FIELDS = exports.GUARD_FIELD_NAME = exports.TRANSACTION_FIELD_NAME = void 0;
3
+ exports.CrudFailureReason = exports.TRANSACTION_FIELD_NAME = exports.GUARD_FIELD_NAME = exports.AUXILIARY_FIELDS = exports.RUNTIME_PACKAGE = void 0;
4
4
  /**
5
- * Auxiliary database field for supporting policy check for nested writes
5
+ * @zenstackhq/runtime package name
6
6
  */
7
- exports.TRANSACTION_FIELD_NAME = 'zenstack_transaction';
8
- /**
9
- * Auxiliary database field for building up policy check queries
10
- */
11
- exports.GUARD_FIELD_NAME = 'zenstack_guard';
12
- /**
13
- * All Auxiliary fields.
14
- */
15
- exports.AUXILIARY_FIELDS = [exports.TRANSACTION_FIELD_NAME, exports.GUARD_FIELD_NAME];
16
- /**
17
- * Reasons for a CRUD operation to fail.
18
- */
19
- var CrudFailureReason;
20
- (function (CrudFailureReason) {
21
- /**
22
- * CRUD suceeded but the result was not readable.
23
- */
24
- CrudFailureReason["RESULT_NOT_READABLE"] = "RESULT_NOT_READABLE";
25
- })(CrudFailureReason = exports.CrudFailureReason || (exports.CrudFailureReason = {}));
7
+ exports.RUNTIME_PACKAGE = '@zenstackhq/runtime';
8
+ var constants_1 = require("@zenstackhq/runtime/constants");
9
+ Object.defineProperty(exports, "AUXILIARY_FIELDS", { enumerable: true, get: function () { return constants_1.AUXILIARY_FIELDS; } });
10
+ Object.defineProperty(exports, "GUARD_FIELD_NAME", { enumerable: true, get: function () { return constants_1.GUARD_FIELD_NAME; } });
11
+ Object.defineProperty(exports, "TRANSACTION_FIELD_NAME", { enumerable: true, get: function () { return constants_1.TRANSACTION_FIELD_NAME; } });
12
+ Object.defineProperty(exports, "CrudFailureReason", { enumerable: true, get: function () { return constants_1.CrudFailureReason; } });
26
13
  //# sourceMappingURL=constants.js.map
package/constants.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,sBAAsB,GAAG,sBAAsB,CAAC;AAE7D;;GAEG;AACU,QAAA,gBAAgB,GAAG,gBAAgB,CAAC;AAEjD;;GAEG;AACU,QAAA,gBAAgB,GAAG,CAAC,8BAAsB,EAAE,wBAAgB,CAAC,CAAC;AAE3E;;GAEG;AACH,IAAY,iBAKX;AALD,WAAY,iBAAiB;IACzB;;OAEG;IACH,gEAA2C,CAAA;AAC/C,CAAC,EALW,iBAAiB,GAAjB,yBAAiB,KAAjB,yBAAiB,QAK5B"}
1
+ {"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAA;;GAEG;AACU,QAAA,eAAe,GAAG,qBAAqB,CAAC;AAErD,2DAKuC;AAJnC,6GAAA,gBAAgB,OAAA;AAChB,6GAAA,gBAAgB,OAAA;AAChB,mHAAA,sBAAsB,OAAA;AACtB,8GAAA,iBAAiB,OAAA"}
package/index.d.ts CHANGED
@@ -2,3 +2,4 @@ export * from './code-gen';
2
2
  export * from './constants';
3
3
  export * from './types';
4
4
  export * from './utils';
5
+ export * from './policy';
package/index.js CHANGED
@@ -18,4 +18,5 @@ __exportStar(require("./code-gen"), exports);
18
18
  __exportStar(require("./constants"), exports);
19
19
  __exportStar(require("./types"), exports);
20
20
  __exportStar(require("./utils"), exports);
21
+ __exportStar(require("./policy"), exports);
21
22
  //# sourceMappingURL=index.js.map
package/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,8CAA4B;AAC5B,0CAAwB;AACxB,0CAAwB"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,8CAA4B;AAC5B,0CAAwB;AACxB,0CAAwB;AACxB,2CAAyB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zenstackhq/sdk",
3
- "version": "1.0.0-alpha.98",
3
+ "version": "1.0.0-beta.1",
4
4
  "description": "ZenStack plugin development SDK",
5
5
  "main": "index.js",
6
6
  "publishConfig": {
@@ -14,7 +14,8 @@
14
14
  "@prisma/generator-helper": "^4.7.1",
15
15
  "prettier": "^2.8.3",
16
16
  "ts-morph": "^16.0.0",
17
- "@zenstackhq/language": "1.0.0-alpha.98"
17
+ "@zenstackhq/language": "1.0.0-beta.1",
18
+ "@zenstackhq/runtime": "1.0.0-beta.1"
18
19
  },
19
20
  "devDependencies": {
20
21
  "copyfiles": "^2.4.1",
package/policy.d.ts ADDED
@@ -0,0 +1,13 @@
1
+ import type { DataModel, DataModelAttribute } from './ast';
2
+ export declare const VALIDATION_ATTRIBUTES: string[];
3
+ export declare function analyzePolicies(dataModel: DataModel): {
4
+ allows: DataModelAttribute[];
5
+ denies: DataModelAttribute[];
6
+ create: boolean | undefined;
7
+ read: boolean | undefined;
8
+ update: boolean | undefined;
9
+ delete: boolean | undefined;
10
+ allowAll: boolean;
11
+ denyAll: boolean;
12
+ hasFieldValidation: boolean;
13
+ };
package/policy.js ADDED
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.analyzePolicies = exports.VALIDATION_ATTRIBUTES = void 0;
4
+ const utils_1 = require("./utils");
5
+ exports.VALIDATION_ATTRIBUTES = [
6
+ '@length',
7
+ '@regex',
8
+ '@startsWith',
9
+ '@endsWith',
10
+ '@email',
11
+ '@url',
12
+ '@datetime',
13
+ '@gt',
14
+ '@gte',
15
+ '@lt',
16
+ '@lte',
17
+ ];
18
+ function analyzePolicies(dataModel) {
19
+ const allows = dataModel.attributes.filter((attr) => { var _a; return ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) === '@@allow'; });
20
+ const denies = dataModel.attributes.filter((attr) => { var _a; return ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) === '@@deny'; });
21
+ const create = toStaticPolicy('create', allows, denies);
22
+ const read = toStaticPolicy('read', allows, denies);
23
+ const update = toStaticPolicy('update', allows, denies);
24
+ const del = toStaticPolicy('delete', allows, denies);
25
+ const hasFieldValidation = dataModel.fields.some((field) => field.attributes.some((attr) => exports.VALIDATION_ATTRIBUTES.includes(attr.decl.$refText)));
26
+ return {
27
+ allows,
28
+ denies,
29
+ create,
30
+ read,
31
+ update,
32
+ delete: del,
33
+ allowAll: create === true && read === true && update === true && del === true,
34
+ denyAll: create === false && read === false && update === false && del === false,
35
+ hasFieldValidation,
36
+ };
37
+ }
38
+ exports.analyzePolicies = analyzePolicies;
39
+ function toStaticPolicy(operation, allows, denies) {
40
+ const filteredDenies = forOperation(operation, denies);
41
+ if (filteredDenies.some((rule) => (0, utils_1.getLiteral)(rule.args[1].value) === true)) {
42
+ // any constant true deny rule
43
+ return false;
44
+ }
45
+ const filteredAllows = forOperation(operation, allows);
46
+ if (filteredAllows.length === 0) {
47
+ // no allow rule
48
+ return false;
49
+ }
50
+ if (filteredDenies.length === 0 &&
51
+ filteredAllows.some((rule) => (0, utils_1.getLiteral)(rule.args[1].value) === true)) {
52
+ // any constant true allow rule
53
+ return true;
54
+ }
55
+ return undefined;
56
+ }
57
+ function forOperation(operation, rules) {
58
+ return rules.filter((rule) => {
59
+ const ops = (0, utils_1.getLiteral)(rule.args[0].value);
60
+ if (!ops) {
61
+ return false;
62
+ }
63
+ if (ops === 'all') {
64
+ return true;
65
+ }
66
+ const splitOps = ops.split(',').map((p) => p.trim());
67
+ return splitOps.includes(operation);
68
+ });
69
+ }
70
+ //# sourceMappingURL=policy.js.map
package/policy.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"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"}
package/types.d.ts CHANGED
@@ -10,14 +10,16 @@ export type OptionValue = string | number | boolean;
10
10
  export type PluginOptions = {
11
11
  provider?: string;
12
12
  schemaPath: string;
13
+ name: string;
13
14
  } & Record<string, OptionValue | OptionValue[]>;
14
15
  /**
15
16
  * Plugin entry point function definition
16
17
  */
17
- export type PluginFunction = (model: Model, options: PluginOptions, dmmf?: DMMF.Document) => Promise<string[]> | string[] | Promise<void> | void;
18
+ export type PluginFunction = (model: Model, options: PluginOptions, dmmf?: DMMF.Document, config?: Record<string, string>) => Promise<string[]> | string[] | Promise<void> | void;
18
19
  /**
19
20
  * Plugin error
20
21
  */
21
22
  export declare class PluginError extends Error {
22
- constructor(message: string);
23
+ plugin: string;
24
+ constructor(plugin: string, message: string);
23
25
  }
package/types.js CHANGED
@@ -5,8 +5,9 @@ exports.PluginError = void 0;
5
5
  * Plugin error
6
6
  */
7
7
  class PluginError extends Error {
8
- constructor(message) {
8
+ constructor(plugin, message) {
9
9
  super(message);
10
+ this.plugin = plugin;
10
11
  }
11
12
  }
12
13
  exports.PluginError = PluginError;
package/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AAsBA;;GAEG;AACH,MAAa,WAAY,SAAQ,KAAK;IAClC,YAAY,OAAe;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC;IACnB,CAAC;CACJ;AAJD,kCAIC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":";;;AA0BA;;GAEG;AACH,MAAa,WAAY,SAAQ,KAAK;IAClC,YAAmB,MAAc,EAAE,OAAe;QAC9C,KAAK,CAAC,OAAO,CAAC,CAAC;QADA,WAAM,GAAN,MAAM,CAAQ;IAEjC,CAAC;CACJ;AAJD,kCAIC"}
package/utils.d.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { AstNode, DataModel, DataModelAttribute, DataModelField, DataModelFieldAttribute, Enum, EnumField, Expression, Model, Reference } from '@zenstackhq/language/ast';
2
+ import { PluginOptions } from './types';
2
3
  /**
3
4
  * Gets data models that are not ignored
4
5
  */
@@ -13,3 +14,21 @@ export declare function hasAttribute(decl: DataModel | DataModelField | Enum | E
13
14
  export declare function getAttributeArgs(attr: DataModelAttribute | DataModelFieldAttribute): Record<string, Expression>;
14
15
  export declare function getAttributeArg(attr: DataModelAttribute | DataModelFieldAttribute, name: string): Expression | undefined;
15
16
  export declare function getAttributeArgLiteral<T extends string | number | boolean>(attr: DataModelAttribute | DataModelFieldAttribute, name: string): T | undefined;
17
+ /**
18
+ * Gets id fields declared at the data model level
19
+ */
20
+ export declare function getIdFields(model: DataModel): DataModelField[];
21
+ /**
22
+ * Returns if the given field is declared as an id field.
23
+ */
24
+ export declare function isIdField(field: DataModelField): boolean;
25
+ /**
26
+ * Returns if the given field is a relation field.
27
+ */
28
+ export declare function isRelationshipField(field: DataModelField): boolean;
29
+ /**
30
+ * Returns if the given field is a relation foreign key field.
31
+ */
32
+ export declare function isForeignKeyField(field: DataModelField): boolean;
33
+ export declare function resolvePath(_path: string, options: PluginOptions): string;
34
+ export declare function requireOption<T>(options: PluginOptions, name: string): T;
package/utils.js CHANGED
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getAttributeArgLiteral = exports.getAttributeArg = exports.getAttributeArgs = exports.hasAttribute = exports.getObjectLiteral = exports.getLiteralArray = exports.getArray = exports.getLiteral = exports.resolved = exports.getDataModels = void 0;
6
+ exports.requireOption = exports.resolvePath = exports.isForeignKeyField = exports.isRelationshipField = exports.isIdField = exports.getIdFields = exports.getAttributeArgLiteral = exports.getAttributeArg = exports.getAttributeArgs = exports.hasAttribute = exports.getObjectLiteral = exports.getLiteralArray = exports.getArray = exports.getLiteral = exports.resolved = exports.getDataModels = void 0;
4
7
  const ast_1 = require("@zenstackhq/language/ast");
8
+ const path_1 = __importDefault(require("path"));
5
9
  /**
6
10
  * Gets data models that are not ignored
7
11
  */
@@ -19,7 +23,7 @@ exports.resolved = resolved;
19
23
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
20
24
  function getLiteral(expr) {
21
25
  if (!(0, ast_1.isLiteralExpr)(expr)) {
22
- return undefined;
26
+ return getObjectLiteral(expr);
23
27
  }
24
28
  return expr.value;
25
29
  }
@@ -102,4 +106,90 @@ function getAttributeArgLiteral(attr, name) {
102
106
  return undefined;
103
107
  }
104
108
  exports.getAttributeArgLiteral = getAttributeArgLiteral;
109
+ /**
110
+ * Gets id fields declared at the data model level
111
+ */
112
+ function getIdFields(model) {
113
+ const idAttr = model.attributes.find((attr) => { var _a; return ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) === '@@id'; });
114
+ if (!idAttr) {
115
+ return [];
116
+ }
117
+ const fieldsArg = idAttr.args.find((a) => { var _a; return ((_a = a.$resolvedParam) === null || _a === void 0 ? void 0 : _a.name) === 'fields'; });
118
+ if (!fieldsArg || !(0, ast_1.isArrayExpr)(fieldsArg.value)) {
119
+ return [];
120
+ }
121
+ return fieldsArg.value.items
122
+ .filter((item) => (0, ast_1.isReferenceExpr)(item))
123
+ .map((item) => resolved(item.target));
124
+ }
125
+ exports.getIdFields = getIdFields;
126
+ /**
127
+ * Returns if the given field is declared as an id field.
128
+ */
129
+ function isIdField(field) {
130
+ // field-level @id attribute
131
+ if (field.attributes.some((attr) => { var _a; return ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) === '@id'; })) {
132
+ return true;
133
+ }
134
+ // model-level @@id attribute with a list of fields
135
+ const model = field.$container;
136
+ const modelLevelIds = getIdFields(model);
137
+ if (modelLevelIds.includes(field)) {
138
+ return true;
139
+ }
140
+ return false;
141
+ }
142
+ exports.isIdField = isIdField;
143
+ /**
144
+ * Returns if the given field is a relation field.
145
+ */
146
+ function isRelationshipField(field) {
147
+ var _a;
148
+ return (0, ast_1.isDataModel)((_a = field.type.reference) === null || _a === void 0 ? void 0 : _a.ref);
149
+ }
150
+ exports.isRelationshipField = isRelationshipField;
151
+ /**
152
+ * Returns if the given field is a relation foreign key field.
153
+ */
154
+ function isForeignKeyField(field) {
155
+ const model = field.$container;
156
+ return model.fields.some((f) => {
157
+ // find @relation attribute
158
+ const relAttr = f.attributes.find((attr) => { var _a; return ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) === '@relation'; });
159
+ if (relAttr) {
160
+ // find "fields" arg
161
+ const fieldsArg = relAttr.args.find((a) => { var _a; return ((_a = a.$resolvedParam) === null || _a === void 0 ? void 0 : _a.name) === 'fields'; });
162
+ if (fieldsArg && (0, ast_1.isArrayExpr)(fieldsArg.value)) {
163
+ // find a matching field reference
164
+ return fieldsArg.value.items.some((item) => {
165
+ if ((0, ast_1.isReferenceExpr)(item)) {
166
+ return item.target.ref === field;
167
+ }
168
+ else {
169
+ return false;
170
+ }
171
+ });
172
+ }
173
+ }
174
+ return false;
175
+ });
176
+ }
177
+ exports.isForeignKeyField = isForeignKeyField;
178
+ function resolvePath(_path, options) {
179
+ if (path_1.default.isAbsolute(_path)) {
180
+ return _path;
181
+ }
182
+ else {
183
+ return path_1.default.join(path_1.default.dirname(options.schemaPath), _path);
184
+ }
185
+ }
186
+ exports.resolvePath = resolvePath;
187
+ function requireOption(options, name) {
188
+ const value = options[name];
189
+ if (value === undefined) {
190
+ throw new Error(`Plugin "${options.name}" is missing required option: ${name}`);
191
+ }
192
+ return value;
193
+ }
194
+ exports.requireOption = requireOption;
105
195
  //# sourceMappingURL=utils.js.map
package/utils.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}