@zenstackhq/sdk 1.0.0-beta.1 → 1.0.0-beta.3
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/constants.d.ts +8 -0
- package/constants.js +10 -1
- package/constants.js.map +1 -1
- package/index.d.ts +2 -0
- package/index.js +2 -0
- package/index.js.map +1 -1
- package/package.json +4 -4
- package/policy.d.ts +0 -1
- package/policy.js +3 -15
- package/policy.js.map +1 -1
- package/prisma.d.ts +5 -0
- package/prisma.js +54 -0
- package/prisma.js.map +1 -0
- package/utils.d.ts +7 -4
- package/utils.js +22 -2
- package/utils.js.map +1 -1
- package/validation.d.ts +6 -0
- package/validation.js +22 -0
- package/validation.js.map +1 -0
package/constants.d.ts
CHANGED
|
@@ -3,3 +3,11 @@
|
|
|
3
3
|
*/
|
|
4
4
|
export declare const RUNTIME_PACKAGE = "@zenstackhq/runtime";
|
|
5
5
|
export { AUXILIARY_FIELDS, GUARD_FIELD_NAME, TRANSACTION_FIELD_NAME, CrudFailureReason, } from '@zenstackhq/runtime/constants';
|
|
6
|
+
/**
|
|
7
|
+
* Expression context
|
|
8
|
+
*/
|
|
9
|
+
export declare enum ExpressionContext {
|
|
10
|
+
DefaultValue = "DefaultValue",
|
|
11
|
+
AccessPolicy = "AccessPolicy",
|
|
12
|
+
ValidationRule = "ValidationRule"
|
|
13
|
+
}
|
package/constants.js
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CrudFailureReason = exports.TRANSACTION_FIELD_NAME = exports.GUARD_FIELD_NAME = exports.AUXILIARY_FIELDS = exports.RUNTIME_PACKAGE = void 0;
|
|
3
|
+
exports.ExpressionContext = exports.CrudFailureReason = exports.TRANSACTION_FIELD_NAME = exports.GUARD_FIELD_NAME = exports.AUXILIARY_FIELDS = exports.RUNTIME_PACKAGE = void 0;
|
|
4
4
|
/**
|
|
5
5
|
* @zenstackhq/runtime package name
|
|
6
6
|
*/
|
|
@@ -10,4 +10,13 @@ Object.defineProperty(exports, "AUXILIARY_FIELDS", { enumerable: true, get: func
|
|
|
10
10
|
Object.defineProperty(exports, "GUARD_FIELD_NAME", { enumerable: true, get: function () { return constants_1.GUARD_FIELD_NAME; } });
|
|
11
11
|
Object.defineProperty(exports, "TRANSACTION_FIELD_NAME", { enumerable: true, get: function () { return constants_1.TRANSACTION_FIELD_NAME; } });
|
|
12
12
|
Object.defineProperty(exports, "CrudFailureReason", { enumerable: true, get: function () { return constants_1.CrudFailureReason; } });
|
|
13
|
+
/**
|
|
14
|
+
* Expression context
|
|
15
|
+
*/
|
|
16
|
+
var ExpressionContext;
|
|
17
|
+
(function (ExpressionContext) {
|
|
18
|
+
ExpressionContext["DefaultValue"] = "DefaultValue";
|
|
19
|
+
ExpressionContext["AccessPolicy"] = "AccessPolicy";
|
|
20
|
+
ExpressionContext["ValidationRule"] = "ValidationRule";
|
|
21
|
+
})(ExpressionContext = exports.ExpressionContext || (exports.ExpressionContext = {}));
|
|
13
22
|
//# 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,eAAe,GAAG,qBAAqB,CAAC;AAErD,2DAKuC;AAJnC,6GAAA,gBAAgB,OAAA;AAChB,6GAAA,gBAAgB,OAAA;AAChB,mHAAA,sBAAsB,OAAA;AACtB,8GAAA,iBAAiB,OAAA"}
|
|
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;AAGrB;;GAEG;AACH,IAAY,iBAIX;AAJD,WAAY,iBAAiB;IACzB,kDAA6B,CAAA;IAC7B,kDAA6B,CAAA;IAC7B,sDAAiC,CAAA;AACrC,CAAC,EAJW,iBAAiB,GAAjB,yBAAiB,KAAjB,yBAAiB,QAI5B"}
|
package/index.d.ts
CHANGED
package/index.js
CHANGED
|
@@ -19,4 +19,6 @@ __exportStar(require("./constants"), exports);
|
|
|
19
19
|
__exportStar(require("./types"), exports);
|
|
20
20
|
__exportStar(require("./utils"), exports);
|
|
21
21
|
__exportStar(require("./policy"), exports);
|
|
22
|
+
__exportStar(require("./validation"), exports);
|
|
23
|
+
__exportStar(require("./prisma"), exports);
|
|
22
24
|
//# 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;AACxB,2CAAyB"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,6CAA2B;AAC3B,8CAA4B;AAC5B,0CAAwB;AACxB,0CAAwB;AACxB,2CAAyB;AACzB,+CAA6B;AAC7B,2CAAyB"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@zenstackhq/sdk",
|
|
3
|
-
"version": "1.0.0-beta.
|
|
3
|
+
"version": "1.0.0-beta.3",
|
|
4
4
|
"description": "ZenStack plugin development SDK",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"publishConfig": {
|
|
@@ -11,11 +11,11 @@
|
|
|
11
11
|
"author": "",
|
|
12
12
|
"license": "MIT",
|
|
13
13
|
"dependencies": {
|
|
14
|
-
"@prisma/generator-helper": "
|
|
14
|
+
"@prisma/generator-helper": "4.10.0",
|
|
15
15
|
"prettier": "^2.8.3",
|
|
16
16
|
"ts-morph": "^16.0.0",
|
|
17
|
-
"@zenstackhq/language": "1.0.0-beta.
|
|
18
|
-
"@zenstackhq/runtime": "1.0.0-beta.
|
|
17
|
+
"@zenstackhq/language": "1.0.0-beta.3",
|
|
18
|
+
"@zenstackhq/runtime": "1.0.0-beta.3"
|
|
19
19
|
},
|
|
20
20
|
"devDependencies": {
|
|
21
21
|
"copyfiles": "^2.4.1",
|
package/policy.d.ts
CHANGED
package/policy.js
CHANGED
|
@@ -1,20 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.analyzePolicies =
|
|
3
|
+
exports.analyzePolicies = void 0;
|
|
4
4
|
const utils_1 = require("./utils");
|
|
5
|
-
|
|
6
|
-
'@length',
|
|
7
|
-
'@regex',
|
|
8
|
-
'@startsWith',
|
|
9
|
-
'@endsWith',
|
|
10
|
-
'@email',
|
|
11
|
-
'@url',
|
|
12
|
-
'@datetime',
|
|
13
|
-
'@gt',
|
|
14
|
-
'@gte',
|
|
15
|
-
'@lt',
|
|
16
|
-
'@lte',
|
|
17
|
-
];
|
|
5
|
+
const validation_1 = require("./validation");
|
|
18
6
|
function analyzePolicies(dataModel) {
|
|
19
7
|
const allows = dataModel.attributes.filter((attr) => { var _a; return ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) === '@@allow'; });
|
|
20
8
|
const denies = dataModel.attributes.filter((attr) => { var _a; return ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) === '@@deny'; });
|
|
@@ -22,7 +10,7 @@ function analyzePolicies(dataModel) {
|
|
|
22
10
|
const read = toStaticPolicy('read', allows, denies);
|
|
23
11
|
const update = toStaticPolicy('update', allows, denies);
|
|
24
12
|
const del = toStaticPolicy('delete', allows, denies);
|
|
25
|
-
const hasFieldValidation =
|
|
13
|
+
const hasFieldValidation = (0, validation_1.hasValidationAttributes)(dataModel);
|
|
26
14
|
return {
|
|
27
15
|
allows,
|
|
28
16
|
denies,
|
package/policy.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":";;;AACA,mCAAqC;
|
|
1
|
+
{"version":3,"file":"policy.js","sourceRoot":"","sources":["../src/policy.ts"],"names":[],"mappings":"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"}
|
package/prisma.d.ts
ADDED
package/prisma.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.getPrismaClientImportSpec = void 0;
|
|
7
|
+
const ast_1 = require("./ast");
|
|
8
|
+
const utils_1 = require("./utils");
|
|
9
|
+
const path_1 = __importDefault(require("path"));
|
|
10
|
+
/**
|
|
11
|
+
* Given a ZModel and an import context directory, compute the import spec for the Prisma Client.
|
|
12
|
+
*/
|
|
13
|
+
function getPrismaClientImportSpec(model, importingFromDir) {
|
|
14
|
+
var _a;
|
|
15
|
+
const generator = model.declarations.find((d) => (0, ast_1.isGeneratorDecl)(d) &&
|
|
16
|
+
d.fields.some((f) => f.name === 'provider' && (0, utils_1.getLiteral)(f.value) === 'prisma-client-js'));
|
|
17
|
+
const clientOutputField = generator === null || generator === void 0 ? void 0 : generator.fields.find((f) => f.name === 'output');
|
|
18
|
+
const clientOutput = (0, utils_1.getLiteral)(clientOutputField === null || clientOutputField === void 0 ? void 0 : clientOutputField.value);
|
|
19
|
+
if (!clientOutput) {
|
|
20
|
+
// no user-declared Prisma Client output location
|
|
21
|
+
return '@prisma/client';
|
|
22
|
+
}
|
|
23
|
+
if (path_1.default.isAbsolute(clientOutput)) {
|
|
24
|
+
// absolute path
|
|
25
|
+
return clientOutput;
|
|
26
|
+
}
|
|
27
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
28
|
+
const zmodelDir = path_1.default.dirname(model.$document.uri.fsPath);
|
|
29
|
+
// compute prisma schema absolute output path
|
|
30
|
+
let prismaSchemaOutputDir = path_1.default.resolve(zmodelDir, './prisma');
|
|
31
|
+
const prismaPlugin = model.declarations.find((d) => (0, ast_1.isPlugin)(d) && d.fields.some((f) => f.name === 'provider' && (0, utils_1.getLiteral)(f.value) === '@core/prisma'));
|
|
32
|
+
if (prismaPlugin) {
|
|
33
|
+
const output = (0, utils_1.getLiteral)((_a = prismaPlugin.fields.find((f) => f.name === 'output')) === null || _a === void 0 ? void 0 : _a.value);
|
|
34
|
+
if (output) {
|
|
35
|
+
if (path_1.default.isAbsolute(output)) {
|
|
36
|
+
// absolute prisma schema output path
|
|
37
|
+
prismaSchemaOutputDir = path_1.default.dirname(output);
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
prismaSchemaOutputDir = path_1.default.dirname(path_1.default.resolve(zmodelDir, output));
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
// resolve the prisma client output path, which is relative to the prisma schema
|
|
45
|
+
const resolvedPrismaClientOutput = path_1.default.resolve(prismaSchemaOutputDir, clientOutput);
|
|
46
|
+
// DEBUG:
|
|
47
|
+
// console.log('PRISMA SCHEMA PATH:', prismaSchemaOutputDir);
|
|
48
|
+
// console.log('PRISMA CLIENT PATH:', resolvedPrismaClientOutput);
|
|
49
|
+
// console.log('IMPORTING PATH:', importingFromDir);
|
|
50
|
+
// compute prisma client absolute output dir relative to the importing file
|
|
51
|
+
return path_1.default.relative(importingFromDir, resolvedPrismaClientOutput);
|
|
52
|
+
}
|
|
53
|
+
exports.getPrismaClientImportSpec = getPrismaClientImportSpec;
|
|
54
|
+
//# sourceMappingURL=prisma.js.map
|
package/prisma.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"prisma.js","sourceRoot":"","sources":["../src/prisma.ts"],"names":[],"mappings":";;;;;;AAAA,+BAAgF;AAChF,mCAAqC;AACrC,gDAAwB;AAExB;;GAEG;AACH,SAAgB,yBAAyB,CAAC,KAAY,EAAE,gBAAwB;;IAC5E,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,CACrC,CAAC,CAAC,EAAE,EAAE,CACF,IAAA,qBAAe,EAAC,CAAC,CAAC;QAClB,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,IAAA,kBAAU,EAAC,CAAC,CAAC,KAAK,CAAC,KAAK,kBAAkB,CAAC,CAC/E,CAAC;IAEnB,MAAM,iBAAiB,GAAG,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC;IAC7E,MAAM,YAAY,GAAG,IAAA,kBAAU,EAAC,iBAAiB,aAAjB,iBAAiB,uBAAjB,iBAAiB,CAAE,KAAK,CAAC,CAAC;IAE1D,IAAI,CAAC,YAAY,EAAE;QACf,iDAAiD;QACjD,OAAO,gBAAgB,CAAC;KAC3B;IAED,IAAI,cAAI,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE;QAC/B,gBAAgB;QAChB,OAAO,YAAY,CAAC;KACvB;IAED,oEAAoE;IACpE,MAAM,SAAS,GAAG,cAAI,CAAC,OAAO,CAAC,KAAK,CAAC,SAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAE5D,6CAA6C;IAC7C,IAAI,qBAAqB,GAAG,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAChE,MAAM,YAAY,GAAG,KAAK,CAAC,YAAY,CAAC,IAAI,CACxC,CAAC,CAAC,EAAE,EAAE,CAAC,IAAA,cAAQ,EAAC,CAAC,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,IAAA,kBAAU,EAAC,CAAC,CAAC,KAAK,CAAC,KAAK,cAAc,CAAC,CACpG,CAAC;IACZ,IAAI,YAAY,EAAE;QACd,MAAM,MAAM,GAAG,IAAA,kBAAU,EAAC,MAAA,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,0CAAE,KAAK,CAAC,CAAC;QACvF,IAAI,MAAM,EAAE;YACR,IAAI,cAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE;gBACzB,qCAAqC;gBACrC,qBAAqB,GAAG,cAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;aAChD;iBAAM;gBACH,qBAAqB,GAAG,cAAI,CAAC,OAAO,CAAC,cAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC;aACzE;SACJ;KACJ;IAED,gFAAgF;IAChF,MAAM,0BAA0B,GAAG,cAAI,CAAC,OAAO,CAAC,qBAAqB,EAAE,YAAY,CAAC,CAAC;IAErF,SAAS;IACT,6DAA6D;IAC7D,kEAAkE;IAClE,oDAAoD;IAEpD,2EAA2E;IAC3E,OAAO,cAAI,CAAC,QAAQ,CAAC,gBAAgB,EAAE,0BAA0B,CAAC,CAAC;AACvE,CAAC;AAlDD,8DAkDC"}
|
package/utils.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
|
-
import { AstNode, DataModel, DataModelAttribute, DataModelField, DataModelFieldAttribute, Enum, EnumField, Expression, Model, Reference } from '@zenstackhq/language/ast';
|
|
1
|
+
import { AstNode, DataModel, DataModelAttribute, DataModelField, DataModelFieldAttribute, Enum, EnumField, Expression, FunctionDecl, InternalAttribute, Model, Reference, ReferenceExpr } from '@zenstackhq/language/ast';
|
|
2
2
|
import { PluginOptions } from './types';
|
|
3
|
+
import { ExpressionContext } from './constants';
|
|
3
4
|
/**
|
|
4
5
|
* Gets data models that are not ignored
|
|
5
6
|
*/
|
|
@@ -7,13 +8,14 @@ export declare function getDataModels(model: Model): DataModel[];
|
|
|
7
8
|
export declare function resolved<T extends AstNode>(ref: Reference<T>): T;
|
|
8
9
|
export declare function getLiteral<T extends string | number | boolean | any = any>(expr: Expression | undefined): T | undefined;
|
|
9
10
|
export declare function getArray(expr: Expression | undefined): Expression[] | undefined;
|
|
10
|
-
export declare function getLiteralArray<T extends string | number | boolean | any = any>(expr: Expression | undefined):
|
|
11
|
+
export declare function getLiteralArray<T extends string | number | boolean | any = any>(expr: Expression | undefined): T[] | undefined;
|
|
11
12
|
export declare function getObjectLiteral<T>(expr: Expression | undefined): T | undefined;
|
|
12
13
|
export default function indentString(string: string, count?: number): string;
|
|
13
14
|
export declare function hasAttribute(decl: DataModel | DataModelField | Enum | EnumField, name: string): boolean;
|
|
14
|
-
export declare function getAttributeArgs(attr: DataModelAttribute | DataModelFieldAttribute): Record<string, Expression>;
|
|
15
|
-
export declare function getAttributeArg(attr: DataModelAttribute | DataModelFieldAttribute, name: string): Expression | undefined;
|
|
15
|
+
export declare function getAttributeArgs(attr: DataModelAttribute | DataModelFieldAttribute | InternalAttribute): Record<string, Expression>;
|
|
16
|
+
export declare function getAttributeArg(attr: DataModelAttribute | DataModelFieldAttribute | InternalAttribute, name: string): Expression | undefined;
|
|
16
17
|
export declare function getAttributeArgLiteral<T extends string | number | boolean>(attr: DataModelAttribute | DataModelFieldAttribute, name: string): T | undefined;
|
|
18
|
+
export declare function isEnumFieldReference(node: AstNode): node is ReferenceExpr;
|
|
17
19
|
/**
|
|
18
20
|
* Gets id fields declared at the data model level
|
|
19
21
|
*/
|
|
@@ -32,3 +34,4 @@ export declare function isRelationshipField(field: DataModelField): boolean;
|
|
|
32
34
|
export declare function isForeignKeyField(field: DataModelField): boolean;
|
|
33
35
|
export declare function resolvePath(_path: string, options: PluginOptions): string;
|
|
34
36
|
export declare function requireOption<T>(options: PluginOptions, name: string): T;
|
|
37
|
+
export declare function getFunctionExpressionContext(funcDecl: FunctionDecl): ExpressionContext[];
|
package/utils.js
CHANGED
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
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;
|
|
6
|
+
exports.getFunctionExpressionContext = exports.requireOption = exports.resolvePath = exports.isForeignKeyField = exports.isRelationshipField = exports.isIdField = exports.getIdFields = exports.isEnumFieldReference = exports.getAttributeArgLiteral = exports.getAttributeArg = exports.getAttributeArgs = exports.hasAttribute = exports.getObjectLiteral = exports.getLiteralArray = exports.getArray = exports.getLiteral = exports.resolved = exports.getDataModels = void 0;
|
|
7
7
|
const ast_1 = require("@zenstackhq/language/ast");
|
|
8
8
|
const path_1 = __importDefault(require("path"));
|
|
9
9
|
/**
|
|
@@ -37,7 +37,7 @@ function getLiteralArray(expr) {
|
|
|
37
37
|
if (!arr) {
|
|
38
38
|
return undefined;
|
|
39
39
|
}
|
|
40
|
-
return arr.map((item) => getLiteral(item));
|
|
40
|
+
return arr.map((item) => getLiteral(item)).filter((v) => v !== undefined);
|
|
41
41
|
}
|
|
42
42
|
exports.getLiteralArray = getLiteralArray;
|
|
43
43
|
function getObjectLiteral(expr) {
|
|
@@ -106,6 +106,10 @@ function getAttributeArgLiteral(attr, name) {
|
|
|
106
106
|
return undefined;
|
|
107
107
|
}
|
|
108
108
|
exports.getAttributeArgLiteral = getAttributeArgLiteral;
|
|
109
|
+
function isEnumFieldReference(node) {
|
|
110
|
+
return (0, ast_1.isReferenceExpr)(node) && (0, ast_1.isEnumField)(node.target.ref);
|
|
111
|
+
}
|
|
112
|
+
exports.isEnumFieldReference = isEnumFieldReference;
|
|
109
113
|
/**
|
|
110
114
|
* Gets id fields declared at the data model level
|
|
111
115
|
*/
|
|
@@ -192,4 +196,20 @@ function requireOption(options, name) {
|
|
|
192
196
|
return value;
|
|
193
197
|
}
|
|
194
198
|
exports.requireOption = requireOption;
|
|
199
|
+
function getFunctionExpressionContext(funcDecl) {
|
|
200
|
+
const funcAllowedContext = [];
|
|
201
|
+
const funcAttr = funcDecl.attributes.find((attr) => attr.decl.$refText === '@@@expressionContext');
|
|
202
|
+
if (funcAttr) {
|
|
203
|
+
const contextArg = getAttributeArg(funcAttr, 'context');
|
|
204
|
+
if ((0, ast_1.isArrayExpr)(contextArg)) {
|
|
205
|
+
contextArg.items.forEach((item) => {
|
|
206
|
+
if (isEnumFieldReference(item)) {
|
|
207
|
+
funcAllowedContext.push(item.target.$refText);
|
|
208
|
+
}
|
|
209
|
+
});
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
return funcAllowedContext;
|
|
213
|
+
}
|
|
214
|
+
exports.getFunctionExpressionContext = getFunctionExpressionContext;
|
|
195
215
|
//# sourceMappingURL=utils.js.map
|
package/utils.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":";;;;;;AAAA,
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../src/utils.ts"],"names":[],"mappings":"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"}
|
package/validation.d.ts
ADDED
package/validation.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.hasValidationAttributes = void 0;
|
|
4
|
+
function isValidationAttribute(attr) {
|
|
5
|
+
var _a;
|
|
6
|
+
return (_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.attributes.some((attr) => attr.decl.$refText === '@@@validation');
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Returns if the given model contains any data validation rules (both at the model
|
|
10
|
+
* level and at the field level).
|
|
11
|
+
*/
|
|
12
|
+
function hasValidationAttributes(model) {
|
|
13
|
+
if (model.attributes.some((attr) => isValidationAttribute(attr))) {
|
|
14
|
+
return true;
|
|
15
|
+
}
|
|
16
|
+
if (model.fields.some((field) => field.attributes.some((attr) => isValidationAttribute(attr)))) {
|
|
17
|
+
return true;
|
|
18
|
+
}
|
|
19
|
+
return false;
|
|
20
|
+
}
|
|
21
|
+
exports.hasValidationAttributes = hasValidationAttributes;
|
|
22
|
+
//# sourceMappingURL=validation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../src/validation.ts"],"names":[],"mappings":";;;AAEA,SAAS,qBAAqB,CAAC,IAAkD;;IAC7E,OAAO,MAAA,IAAI,CAAC,IAAI,CAAC,GAAG,0CAAE,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,KAAK,eAAe,CAAC,CAAC;AAC5F,CAAC;AAED;;;GAGG;AACH,SAAgB,uBAAuB,CAAC,KAAgB;IACpD,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,EAAE;QAC9D,OAAO,IAAI,CAAC;KACf;IAED,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;QAC5F,OAAO,IAAI,CAAC;KACf;IAED,OAAO,KAAK,CAAC;AACjB,CAAC;AAVD,0DAUC"}
|