zenstack 0.6.0-pre.11 → 0.6.0-pre.12
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/cli/cli-error.d.ts +5 -0
- package/cli/cli-error.js +12 -0
- package/cli/cli-error.js.map +1 -0
- package/cli/cli-util.d.ts +18 -0
- package/cli/cli-util.js +168 -0
- package/cli/cli-util.js.map +1 -0
- package/cli/index.d.ts +10 -0
- package/cli/index.js +78 -6531
- package/cli/index.js.map +1 -0
- package/cli/plugin-runner.d.ts +14 -0
- package/cli/plugin-runner.js +133 -0
- package/cli/plugin-runner.js.map +1 -0
- package/global.d.js +1 -0
- package/global.d.js.map +1 -0
- package/language-server/constants.d.ts +12 -0
- package/language-server/constants.js +24 -0
- package/language-server/constants.js.map +1 -0
- package/language-server/main.d.ts +1 -0
- package/language-server/main.js +20 -6436
- package/language-server/main.js.map +1 -0
- package/language-server/types.d.ts +10 -0
- package/language-server/types.js +1 -0
- package/language-server/types.js.map +1 -0
- package/language-server/utils.d.ts +10 -0
- package/language-server/utils.js +28 -0
- package/language-server/utils.js.map +1 -0
- package/language-server/validator/attribute-validator.d.ts +9 -0
- package/language-server/validator/attribute-validator.js +15 -0
- package/language-server/validator/attribute-validator.js.map +1 -0
- package/language-server/validator/datamodel-validator.d.ts +16 -0
- package/language-server/validator/datamodel-validator.js +365 -0
- package/language-server/validator/datamodel-validator.js.map +1 -0
- package/language-server/validator/datasource-validator.d.ts +13 -0
- package/language-server/validator/datasource-validator.js +85 -0
- package/language-server/validator/datasource-validator.js.map +1 -0
- package/language-server/validator/enum-validator.d.ts +9 -0
- package/language-server/validator/enum-validator.js +18 -0
- package/language-server/validator/enum-validator.js.map +1 -0
- package/language-server/validator/expression-validator.d.ts +11 -0
- package/language-server/validator/expression-validator.js +40 -0
- package/language-server/validator/expression-validator.js.map +1 -0
- package/language-server/validator/schema-validator.d.ts +10 -0
- package/language-server/validator/schema-validator.js +35 -0
- package/language-server/validator/schema-validator.js.map +1 -0
- package/language-server/validator/utils.d.ts +24 -0
- package/language-server/validator/utils.js +116 -0
- package/language-server/validator/utils.js.map +1 -0
- package/language-server/validator/zmodel-validator.d.ts +21 -0
- package/language-server/validator/zmodel-validator.js +72 -0
- package/language-server/validator/zmodel-validator.js.map +1 -0
- package/language-server/zmodel-linker.d.ts +29 -0
- package/language-server/zmodel-linker.js +364 -0
- package/language-server/zmodel-linker.js.map +1 -0
- package/language-server/zmodel-module.d.ts +41 -0
- package/language-server/zmodel-module.js +84 -0
- package/language-server/zmodel-module.js.map +1 -0
- package/language-server/zmodel-scope.d.ts +10 -0
- package/language-server/zmodel-scope.js +34 -0
- package/language-server/zmodel-scope.js.map +1 -0
- package/language-server/zmodel-workspace-manager.d.ts +8 -0
- package/language-server/zmodel-workspace-manager.js +25 -0
- package/language-server/zmodel-workspace-manager.js.map +1 -0
- package/package.json +20 -15
- package/plugins/access-policy/expression-writer.d.ts +38 -0
- package/plugins/access-policy/expression-writer.js +323 -0
- package/plugins/access-policy/expression-writer.js.map +1 -0
- package/plugins/access-policy/index.d.ts +4 -0
- package/plugins/access-policy/index.js +15 -4289
- package/plugins/access-policy/index.js.map +1 -0
- package/plugins/access-policy/policy-guard-generator.d.ts +15 -0
- package/plugins/access-policy/policy-guard-generator.js +345 -0
- package/plugins/access-policy/policy-guard-generator.js.map +1 -0
- package/plugins/access-policy/typescript-expression-transformer.d.ts +26 -0
- package/plugins/access-policy/typescript-expression-transformer.js +110 -0
- package/plugins/access-policy/typescript-expression-transformer.js.map +1 -0
- package/plugins/access-policy/utils.d.ts +5 -0
- package/plugins/access-policy/utils.js +16 -0
- package/plugins/access-policy/utils.js.map +1 -0
- package/plugins/access-policy/zod-schema-generator.d.ts +12 -0
- package/plugins/access-policy/zod-schema-generator.js +174 -0
- package/plugins/access-policy/zod-schema-generator.js.map +1 -0
- package/plugins/model-meta/index.d.ts +4 -0
- package/plugins/model-meta/index.js +130 -0
- package/plugins/model-meta/index.js.map +1 -0
- package/plugins/plugin-utils.d.ts +16 -0
- package/plugins/plugin-utils.js +58 -0
- package/plugins/plugin-utils.js.map +1 -0
- package/plugins/prisma/indent-string.d.ts +4 -0
- package/plugins/prisma/indent-string.js +16 -0
- package/plugins/prisma/indent-string.js.map +1 -0
- package/plugins/prisma/index.d.ts +4 -0
- package/plugins/prisma/index.js +15 -3740
- package/plugins/prisma/index.js.map +1 -0
- package/plugins/prisma/prisma-builder.d.ts +123 -0
- package/plugins/prisma/prisma-builder.js +256 -0
- package/plugins/prisma/prisma-builder.js.map +1 -0
- package/plugins/prisma/schema-generator.d.ts +22 -0
- package/plugins/prisma/schema-generator.js +201 -0
- package/plugins/prisma/schema-generator.js.map +1 -0
- package/plugins/react-hooks/index.d.ts +4 -0
- package/plugins/react-hooks/index.js +14 -4332
- package/plugins/react-hooks/index.js.map +1 -0
- package/plugins/react-hooks/react-hooks-generator.d.ts +3 -0
- package/plugins/react-hooks/react-hooks-generator.js +333 -0
- package/plugins/react-hooks/react-hooks-generator.js.map +1 -0
- package/plugins/trpc/config.d.ts +9 -0
- package/plugins/trpc/config.js +12 -0
- package/plugins/trpc/config.js.map +1 -0
- package/plugins/trpc/generator.d.ts +4 -0
- package/plugins/trpc/generator.js +132 -0
- package/plugins/trpc/generator.js.map +1 -0
- package/plugins/trpc/helpers.d.ts +9 -0
- package/plugins/trpc/helpers.js +144 -0
- package/plugins/trpc/helpers.js.map +1 -0
- package/plugins/trpc/index.d.ts +5 -0
- package/plugins/trpc/index.js +14 -5401
- package/plugins/trpc/index.js.map +1 -0
- package/plugins/trpc/project.d.ts +2 -0
- package/plugins/trpc/project.js +21 -0
- package/plugins/trpc/project.js.map +1 -0
- package/plugins/trpc/types.d.ts +0 -0
- package/plugins/trpc/types.js +1 -0
- package/plugins/trpc/types.js.map +1 -0
- package/plugins/trpc/utils/removeDir.d.ts +1 -0
- package/plugins/trpc/utils/removeDir.js +22 -0
- package/plugins/trpc/utils/removeDir.js.map +1 -0
- package/plugins/trpc/utils/uncapitalizeFirstLetter.d.ts +1 -0
- package/plugins/trpc/utils/uncapitalizeFirstLetter.js +11 -0
- package/plugins/trpc/utils/uncapitalizeFirstLetter.js.map +1 -0
- package/plugins/zod/generator.d.ts +4 -0
- package/plugins/zod/generator.js +78 -0
- package/plugins/zod/generator.js.map +1 -0
- package/plugins/zod/helpers/aggregate-helpers.d.ts +5 -0
- package/plugins/zod/helpers/aggregate-helpers.js +77 -0
- package/plugins/zod/helpers/aggregate-helpers.js.map +1 -0
- package/plugins/zod/helpers/comments-helpers.d.ts +6 -0
- package/plugins/zod/helpers/comments-helpers.js +91 -0
- package/plugins/zod/helpers/comments-helpers.js.map +1 -0
- package/plugins/zod/helpers/helpers.d.ts +8 -0
- package/plugins/zod/helpers/helpers.js +39 -0
- package/plugins/zod/helpers/helpers.js.map +1 -0
- package/plugins/zod/helpers/include-helpers.d.ts +2 -0
- package/plugins/zod/helpers/include-helpers.js +94 -0
- package/plugins/zod/helpers/include-helpers.js.map +1 -0
- package/plugins/zod/helpers/index.d.ts +4 -0
- package/plugins/zod/helpers/index.js +50 -0
- package/plugins/zod/helpers/index.js.map +1 -0
- package/plugins/zod/helpers/model-helpers.d.ts +6 -0
- package/plugins/zod/helpers/model-helpers.js +50 -0
- package/plugins/zod/helpers/model-helpers.js.map +1 -0
- package/plugins/zod/helpers/modelArgs-helpers.d.ts +2 -0
- package/plugins/zod/helpers/modelArgs-helpers.js +62 -0
- package/plugins/zod/helpers/modelArgs-helpers.js.map +1 -0
- package/plugins/zod/helpers/mongodb-helpers.d.ts +3 -0
- package/plugins/zod/helpers/mongodb-helpers.js +63 -0
- package/plugins/zod/helpers/mongodb-helpers.js.map +1 -0
- package/plugins/zod/helpers/select-helpers.d.ts +2 -0
- package/plugins/zod/helpers/select-helpers.js +150 -0
- package/plugins/zod/helpers/select-helpers.js.map +1 -0
- package/plugins/zod/index.d.ts +5 -0
- package/plugins/zod/index.js +14 -4824
- package/plugins/zod/index.js.map +1 -0
- package/plugins/zod/transformer.d.ts +70 -0
- package/plugins/zod/transformer.js +464 -0
- package/plugins/zod/transformer.js.map +1 -0
- package/plugins/zod/types.d.ts +20 -0
- package/plugins/zod/types.js +1 -0
- package/plugins/zod/types.js.map +1 -0
- package/plugins/zod/utils/formatFile.d.ts +1 -0
- package/plugins/zod/utils/formatFile.js +35 -0
- package/plugins/zod/utils/formatFile.js.map +1 -0
- package/plugins/zod/utils/removeDir.d.ts +1 -0
- package/plugins/zod/utils/removeDir.js +22 -0
- package/plugins/zod/utils/removeDir.js.map +1 -0
- package/plugins/zod/utils/writeFileSafely.d.ts +1 -0
- package/plugins/zod/utils/writeFileSafely.js +18 -0
- package/plugins/zod/utils/writeFileSafely.js.map +1 -0
- package/res/prism-zmodel.js +2 -4
- package/res/stdlib.zmodel +12 -1
- package/telemetry.d.ts +21 -0
- package/telemetry.js +102 -0
- package/telemetry.js.map +1 -0
- package/types.d.ts +11 -0
- package/types.js +1 -0
- package/types.js.map +1 -0
- package/utils/ast-utils.d.ts +15 -0
- package/utils/ast-utils.js +79 -0
- package/utils/ast-utils.js.map +1 -0
- package/utils/exec-utils.d.ts +6 -0
- package/utils/exec-utils.js +17 -0
- package/utils/exec-utils.js.map +1 -0
- package/utils/indent-string.d.ts +4 -0
- package/utils/indent-string.js +16 -0
- package/utils/indent-string.js.map +1 -0
- package/utils/pkg-utils.d.ts +3 -0
- package/utils/pkg-utils.js +43 -0
- package/utils/pkg-utils.js.map +1 -0
- package/asset/logo-256-bg.png +0 -0
- package/asset/logo-dark-256.png +0 -0
- package/asset/logo-light-256.png +0 -0
- package/extension.js +0 -39
- package/res/package.template.json +0 -9
- package/res/tsconfig.template.json +0 -17
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { DMMF as PrismaDMMF } from '@prisma/generator-helper';
|
|
2
|
+
export declare type TransformerParams = {
|
|
3
|
+
enumTypes?: PrismaDMMF.SchemaEnum[];
|
|
4
|
+
fields?: PrismaDMMF.SchemaArg[];
|
|
5
|
+
name?: string;
|
|
6
|
+
models?: PrismaDMMF.Model[];
|
|
7
|
+
modelOperations?: PrismaDMMF.ModelMapping[];
|
|
8
|
+
aggregateOperationSupport?: AggregateOperationSupport;
|
|
9
|
+
isDefaultPrismaClientOutput?: boolean;
|
|
10
|
+
prismaClientOutputPath?: string;
|
|
11
|
+
};
|
|
12
|
+
export declare type AggregateOperationSupport = {
|
|
13
|
+
[model: string]: {
|
|
14
|
+
count?: boolean;
|
|
15
|
+
min?: boolean;
|
|
16
|
+
max?: boolean;
|
|
17
|
+
sum?: boolean;
|
|
18
|
+
avg?: boolean;
|
|
19
|
+
};
|
|
20
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../../../src/plugins/zod/types.ts"],"sourcesContent":["import { DMMF as PrismaDMMF } from '@prisma/generator-helper';\n\nexport type TransformerParams = {\n enumTypes?: PrismaDMMF.SchemaEnum[];\n fields?: PrismaDMMF.SchemaArg[];\n name?: string;\n models?: PrismaDMMF.Model[];\n modelOperations?: PrismaDMMF.ModelMapping[];\n aggregateOperationSupport?: AggregateOperationSupport;\n isDefaultPrismaClientOutput?: boolean;\n prismaClientOutputPath?: string;\n};\n\nexport type AggregateOperationSupport = {\n [model: string]: {\n count?: boolean;\n min?: boolean;\n max?: boolean;\n sum?: boolean;\n avg?: boolean;\n };\n};\n"],"mappings":""}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const formatFile: (content: string) => Promise<string>;
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.formatFile = void 0;
|
|
7
|
+
var _prettier = _interopRequireDefault(require("prettier"));
|
|
8
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
9
|
+
const formatFile = content => {
|
|
10
|
+
return new Promise((res, rej) => _prettier.default.resolveConfig(process.cwd()).then(options => {
|
|
11
|
+
let formatOptions = options;
|
|
12
|
+
if (!options) {
|
|
13
|
+
formatOptions = {
|
|
14
|
+
trailingComma: 'all',
|
|
15
|
+
tabWidth: 2,
|
|
16
|
+
printWidth: 80,
|
|
17
|
+
bracketSpacing: true,
|
|
18
|
+
semi: true,
|
|
19
|
+
singleQuote: true,
|
|
20
|
+
useTabs: false
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
try {
|
|
24
|
+
const formatted = _prettier.default.format(content, {
|
|
25
|
+
...formatOptions,
|
|
26
|
+
parser: 'typescript'
|
|
27
|
+
});
|
|
28
|
+
res(formatted);
|
|
29
|
+
} catch (error) {
|
|
30
|
+
rej(error);
|
|
31
|
+
}
|
|
32
|
+
}));
|
|
33
|
+
};
|
|
34
|
+
exports.formatFile = formatFile;
|
|
35
|
+
//# sourceMappingURL=formatFile.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatFile.js","names":["formatFile","content","Promise","res","rej","prettier","resolveConfig","process","cwd","then","options","formatOptions","trailingComma","tabWidth","printWidth","bracketSpacing","semi","singleQuote","useTabs","formatted","format","parser","error"],"sources":["../../../../src/plugins/zod/utils/formatFile.ts"],"sourcesContent":["import prettier from 'prettier';\n\nexport const formatFile = (content: string): Promise<string> => {\n return new Promise((res, rej) =>\n prettier.resolveConfig(process.cwd()).then((options) => {\n let formatOptions = options;\n if (!options) {\n formatOptions = {\n trailingComma: 'all',\n tabWidth: 2,\n printWidth: 80,\n bracketSpacing: true,\n semi: true,\n singleQuote: true,\n useTabs: false,\n };\n }\n\n try {\n const formatted = prettier.format(content, {\n ...formatOptions,\n parser: 'typescript',\n });\n\n res(formatted);\n } catch (error) {\n rej(error);\n }\n })\n );\n};\n"],"mappings":";;;;;;AAAA;AAAgC;AAEzB,MAAMA,UAAU,GAAIC,OAAe,IAAsB;EAC5D,OAAO,IAAIC,OAAO,CAAC,CAACC,GAAG,EAAEC,GAAG,KACxBC,iBAAQ,CAACC,aAAa,CAACC,OAAO,CAACC,GAAG,EAAE,CAAC,CAACC,IAAI,CAAEC,OAAO,IAAK;IACpD,IAAIC,aAAa,GAAGD,OAAO;IAC3B,IAAI,CAACA,OAAO,EAAE;MACVC,aAAa,GAAG;QACZC,aAAa,EAAE,KAAK;QACpBC,QAAQ,EAAE,CAAC;QACXC,UAAU,EAAE,EAAE;QACdC,cAAc,EAAE,IAAI;QACpBC,IAAI,EAAE,IAAI;QACVC,WAAW,EAAE,IAAI;QACjBC,OAAO,EAAE;MACb,CAAC;IACL;IAEA,IAAI;MACA,MAAMC,SAAS,GAAGd,iBAAQ,CAACe,MAAM,CAACnB,OAAO,EAAE;QACvC,GAAGU,aAAa;QAChBU,MAAM,EAAE;MACZ,CAAC,CAAC;MAEFlB,GAAG,CAACgB,SAAS,CAAC;IAClB,CAAC,CAAC,OAAOG,KAAK,EAAE;MACZlB,GAAG,CAACkB,KAAK,CAAC;IACd;EACJ,CAAC,CAAC,CACL;AACL,CAAC;AAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export default function removeDir(dirPath: string, onlyContent: boolean): Promise<void>;
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = removeDir;
|
|
7
|
+
var _path = _interopRequireDefault(require("path"));
|
|
8
|
+
var _fs = require("fs");
|
|
9
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
10
|
+
async function removeDir(dirPath, onlyContent) {
|
|
11
|
+
const dirEntries = await _fs.promises.readdir(dirPath, {
|
|
12
|
+
withFileTypes: true
|
|
13
|
+
});
|
|
14
|
+
await Promise.all(dirEntries.map(async dirEntry => {
|
|
15
|
+
const fullPath = _path.default.join(dirPath, dirEntry.name);
|
|
16
|
+
return dirEntry.isDirectory() ? await removeDir(fullPath, false) : await _fs.promises.unlink(fullPath);
|
|
17
|
+
}));
|
|
18
|
+
if (!onlyContent) {
|
|
19
|
+
await _fs.promises.rmdir(dirPath);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=removeDir.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"removeDir.js","names":["removeDir","dirPath","onlyContent","dirEntries","fs","readdir","withFileTypes","Promise","all","map","dirEntry","fullPath","path","join","name","isDirectory","unlink","rmdir"],"sources":["../../../../src/plugins/zod/utils/removeDir.ts"],"sourcesContent":["import path from 'path';\nimport { promises as fs } from 'fs';\n\nexport default async function removeDir(dirPath: string, onlyContent: boolean) {\n const dirEntries = await fs.readdir(dirPath, { withFileTypes: true });\n await Promise.all(\n dirEntries.map(async (dirEntry) => {\n const fullPath = path.join(dirPath, dirEntry.name);\n return dirEntry.isDirectory() ? await removeDir(fullPath, false) : await fs.unlink(fullPath);\n })\n );\n if (!onlyContent) {\n await fs.rmdir(dirPath);\n }\n}\n"],"mappings":";;;;;;AAAA;AACA;AAAoC;AAErB,eAAeA,SAAS,CAACC,OAAe,EAAEC,WAAoB,EAAE;EAC3E,MAAMC,UAAU,GAAG,MAAMC,YAAE,CAACC,OAAO,CAACJ,OAAO,EAAE;IAAEK,aAAa,EAAE;EAAK,CAAC,CAAC;EACrE,MAAMC,OAAO,CAACC,GAAG,CACbL,UAAU,CAACM,GAAG,CAAC,MAAOC,QAAQ,IAAK;IAC/B,MAAMC,QAAQ,GAAGC,aAAI,CAACC,IAAI,CAACZ,OAAO,EAAES,QAAQ,CAACI,IAAI,CAAC;IAClD,OAAOJ,QAAQ,CAACK,WAAW,EAAE,GAAG,MAAMf,SAAS,CAACW,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAMP,YAAE,CAACY,MAAM,CAACL,QAAQ,CAAC;EAChG,CAAC,CAAC,CACL;EACD,IAAI,CAACT,WAAW,EAAE;IACd,MAAME,YAAE,CAACa,KAAK,CAAChB,OAAO,CAAC;EAC3B;AACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const writeFileSafely: (writeLocation: string, content: string) => Promise<void>;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.writeFileSafely = void 0;
|
|
7
|
+
var _fs = _interopRequireDefault(require("fs"));
|
|
8
|
+
var _path = _interopRequireDefault(require("path"));
|
|
9
|
+
var _formatFile = require("./formatFile");
|
|
10
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
11
|
+
const writeFileSafely = async (writeLocation, content) => {
|
|
12
|
+
_fs.default.mkdirSync(_path.default.dirname(writeLocation), {
|
|
13
|
+
recursive: true
|
|
14
|
+
});
|
|
15
|
+
_fs.default.writeFileSync(writeLocation, await (0, _formatFile.formatFile)(content));
|
|
16
|
+
};
|
|
17
|
+
exports.writeFileSafely = writeFileSafely;
|
|
18
|
+
//# sourceMappingURL=writeFileSafely.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writeFileSafely.js","names":["writeFileSafely","writeLocation","content","fs","mkdirSync","path","dirname","recursive","writeFileSync","formatFile"],"sources":["../../../../src/plugins/zod/utils/writeFileSafely.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { formatFile } from './formatFile';\n\nexport const writeFileSafely = async (writeLocation: string, content: string) => {\n fs.mkdirSync(path.dirname(writeLocation), {\n recursive: true,\n });\n\n fs.writeFileSync(writeLocation, await formatFile(content));\n};\n"],"mappings":";;;;;;AAAA;AACA;AACA;AAA0C;AAEnC,MAAMA,eAAe,GAAG,OAAOC,aAAqB,EAAEC,OAAe,KAAK;EAC7EC,WAAE,CAACC,SAAS,CAACC,aAAI,CAACC,OAAO,CAACL,aAAa,CAAC,EAAE;IACtCM,SAAS,EAAE;EACf,CAAC,CAAC;EAEFJ,WAAE,CAACK,aAAa,CAACP,aAAa,EAAE,MAAM,IAAAQ,sBAAU,EAACP,OAAO,CAAC,CAAC;AAC9D,CAAC;AAAC"}
|
package/res/prism-zmodel.js
CHANGED
|
@@ -2,13 +2,11 @@
|
|
|
2
2
|
|
|
3
3
|
(function (Prism) {
|
|
4
4
|
Prism.languages.zmodel = Prism.languages.extend('clike', {
|
|
5
|
-
keyword:
|
|
6
|
-
/\b(?:datasource|enum|generator|model|attribute|function|null|this)\b/,
|
|
5
|
+
keyword: /\b(?:datasource|enum|generator|model|attribute|function|null|this)\b/,
|
|
7
6
|
'type-class-name': /(\b()\s+)[\w.\\]+/,
|
|
8
7
|
});
|
|
9
8
|
|
|
10
|
-
Prism.languages.javascript['class-name'][0].pattern =
|
|
11
|
-
/(\b(?:model|datasource|enum|generator)\s+)[\w.\\]+/;
|
|
9
|
+
Prism.languages.javascript['class-name'][0].pattern = /(\b(?:model|datasource|enum|generator)\s+)[\w.\\]+/;
|
|
12
10
|
|
|
13
11
|
Prism.languages.insertBefore('zmodel', 'function', {
|
|
14
12
|
annotation: {
|
package/res/stdlib.zmodel
CHANGED
|
@@ -84,8 +84,19 @@ function autoincrement(): Int {}
|
|
|
84
84
|
*/
|
|
85
85
|
function dbgenerated(expr: String): Any {}
|
|
86
86
|
|
|
87
|
+
/**
|
|
88
|
+
* Gets entities value before an update. Only valid when used in a "update" policy rule.
|
|
89
|
+
*/
|
|
90
|
+
function future(): Any {}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* Marks an attribute to be only applicable to certain field types.
|
|
94
|
+
*/
|
|
87
95
|
attribute @@@targetField(targetField: AttributeTargetField[])
|
|
88
96
|
|
|
97
|
+
/**
|
|
98
|
+
* Indicates an attribute is directly supported by the Prisma schema.
|
|
99
|
+
*/
|
|
89
100
|
attribute @@@prisma()
|
|
90
101
|
|
|
91
102
|
/*
|
|
@@ -116,7 +127,7 @@ attribute @@index(_ fields: FieldReference[], map: String?) @@@prisma
|
|
|
116
127
|
/*
|
|
117
128
|
* Defines meta information about the relation.
|
|
118
129
|
*/
|
|
119
|
-
attribute @relation(_ name: String?, fields: FieldReference[]?, references:
|
|
130
|
+
attribute @relation(_ name: String?, fields: FieldReference[]?, references: TransitiveFieldReference[]?, onDelete: ReferentialAction?, onUpdate: ReferentialAction?, map: String?) @@@prisma
|
|
120
131
|
|
|
121
132
|
/*
|
|
122
133
|
* Maps a field name or enum value from the schema to a column with a different name in the database.
|
package/telemetry.d.ts
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Telemetry events
|
|
3
|
+
*/
|
|
4
|
+
export declare type TelemetryEvents = 'cli:start' | 'cli:complete' | 'cli:error' | 'cli:command:start' | 'cli:command:complete' | 'cli:command:error' | 'cli:plugin:start' | 'cli:plugin:complete' | 'cli:plugin:error';
|
|
5
|
+
/**
|
|
6
|
+
* Utility class for sending telemetry
|
|
7
|
+
*/
|
|
8
|
+
export declare class Telemetry {
|
|
9
|
+
private readonly mixpanel;
|
|
10
|
+
private readonly hostId;
|
|
11
|
+
private readonly sessionid;
|
|
12
|
+
private readonly trackingToken;
|
|
13
|
+
private readonly _os;
|
|
14
|
+
private readonly version;
|
|
15
|
+
private exitWait;
|
|
16
|
+
constructor();
|
|
17
|
+
track(event: TelemetryEvents, properties?: Record<string, unknown>): void;
|
|
18
|
+
trackSpan(startEvent: TelemetryEvents, completeEvent: TelemetryEvents, errorEvent: TelemetryEvents, properties: Record<string, unknown>, action: () => Promise<unknown> | void): Promise<void>;
|
|
19
|
+
}
|
|
20
|
+
declare const _default: Telemetry;
|
|
21
|
+
export default _default;
|
package/telemetry.js
ADDED
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = exports.Telemetry = void 0;
|
|
7
|
+
var _mixpanel = require("mixpanel");
|
|
8
|
+
var _nodeMachineId = require("node-machine-id");
|
|
9
|
+
var _cuid = _interopRequireDefault(require("cuid"));
|
|
10
|
+
var os = _interopRequireWildcard(require("os"));
|
|
11
|
+
var _sleepPromise = _interopRequireDefault(require("sleep-promise"));
|
|
12
|
+
var _asyncExitHook = _interopRequireDefault(require("async-exit-hook"));
|
|
13
|
+
var _cliError = require("./cli/cli-error");
|
|
14
|
+
var _commander = require("commander");
|
|
15
|
+
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
16
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
17
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
18
|
+
/**
|
|
19
|
+
* Utility class for sending telemetry
|
|
20
|
+
*/
|
|
21
|
+
class Telemetry {
|
|
22
|
+
hostId = (0, _nodeMachineId.machineIdSync)();
|
|
23
|
+
sessionid = (0, _cuid.default)();
|
|
24
|
+
trackingToken = process && process.env && process.env.TELEMETRY_TRACKING_TOKEN || "74944eb779d7d3b4ce185be843fde9fc";
|
|
25
|
+
_os = os.platform();
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-var-requires
|
|
27
|
+
version = require('../package.json').version;
|
|
28
|
+
exitWait = 200;
|
|
29
|
+
constructor() {
|
|
30
|
+
if ((process && process.env && process.env.DO_NOT_TRACK || "1") !== '1' && this.trackingToken) {
|
|
31
|
+
this.mixpanel = (0, _mixpanel.init)(this.trackingToken, {
|
|
32
|
+
geolocate: true
|
|
33
|
+
});
|
|
34
|
+
}
|
|
35
|
+
(0, _asyncExitHook.default)(async callback => {
|
|
36
|
+
if (this.mixpanel) {
|
|
37
|
+
// a small delay to ensure telemetry is sent
|
|
38
|
+
await (0, _sleepPromise.default)(this.exitWait);
|
|
39
|
+
}
|
|
40
|
+
callback();
|
|
41
|
+
});
|
|
42
|
+
const errorHandler = async err => {
|
|
43
|
+
this.track('cli:error', {
|
|
44
|
+
message: err.message,
|
|
45
|
+
stack: err.stack
|
|
46
|
+
});
|
|
47
|
+
if (this.mixpanel) {
|
|
48
|
+
// a small delay to ensure telemetry is sent
|
|
49
|
+
await (0, _sleepPromise.default)(this.exitWait);
|
|
50
|
+
}
|
|
51
|
+
if (err instanceof _cliError.CliError || err instanceof _commander.CommanderError) {
|
|
52
|
+
// error already logged
|
|
53
|
+
} else {
|
|
54
|
+
console.error('\nAn unexpected error occurred:\n', err);
|
|
55
|
+
}
|
|
56
|
+
process.exit(1);
|
|
57
|
+
};
|
|
58
|
+
_asyncExitHook.default.unhandledRejectionHandler(errorHandler);
|
|
59
|
+
_asyncExitHook.default.uncaughtExceptionHandler(errorHandler);
|
|
60
|
+
}
|
|
61
|
+
track(event, properties = {}) {
|
|
62
|
+
if (this.mixpanel) {
|
|
63
|
+
const payload = {
|
|
64
|
+
distinct_id: this.hostId,
|
|
65
|
+
session: this.sessionid,
|
|
66
|
+
time: new Date(),
|
|
67
|
+
$os: this._os,
|
|
68
|
+
nodeVersion: process.version,
|
|
69
|
+
version: this.version,
|
|
70
|
+
...properties
|
|
71
|
+
};
|
|
72
|
+
this.mixpanel.track(event, payload);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async trackSpan(startEvent, completeEvent, errorEvent, properties, action) {
|
|
76
|
+
this.track(startEvent, properties);
|
|
77
|
+
const start = Date.now();
|
|
78
|
+
let success = true;
|
|
79
|
+
try {
|
|
80
|
+
await Promise.resolve(action());
|
|
81
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
82
|
+
} catch (err) {
|
|
83
|
+
this.track(errorEvent, {
|
|
84
|
+
message: err.message,
|
|
85
|
+
stack: err.stack,
|
|
86
|
+
...properties
|
|
87
|
+
});
|
|
88
|
+
success = false;
|
|
89
|
+
throw err;
|
|
90
|
+
} finally {
|
|
91
|
+
this.track(completeEvent, {
|
|
92
|
+
duration: Date.now() - start,
|
|
93
|
+
success,
|
|
94
|
+
...properties
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
exports.Telemetry = Telemetry;
|
|
100
|
+
var _default = new Telemetry();
|
|
101
|
+
exports.default = _default;
|
|
102
|
+
//# sourceMappingURL=telemetry.js.map
|
package/telemetry.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"telemetry.js","names":["Telemetry","hostId","machineIdSync","sessionid","cuid","trackingToken","_os","os","platform","version","require","exitWait","constructor","mixpanel","init","geolocate","exitHook","callback","sleep","errorHandler","err","track","message","stack","CliError","CommanderError","console","error","process","exit","unhandledRejectionHandler","uncaughtExceptionHandler","event","properties","payload","distinct_id","session","time","Date","$os","nodeVersion","trackSpan","startEvent","completeEvent","errorEvent","action","start","now","success","Promise","resolve","duration"],"sources":["../src/telemetry.ts"],"sourcesContent":["import { Mixpanel, init } from 'mixpanel';\nimport { machineIdSync } from 'node-machine-id';\nimport cuid from 'cuid';\nimport * as os from 'os';\nimport sleep from 'sleep-promise';\nimport exitHook from 'async-exit-hook';\nimport { CliError } from './cli/cli-error';\nimport { CommanderError } from 'commander';\n\n/**\n * Telemetry events\n */\nexport type TelemetryEvents =\n | 'cli:start'\n | 'cli:complete'\n | 'cli:error'\n | 'cli:command:start'\n | 'cli:command:complete'\n | 'cli:command:error'\n | 'cli:plugin:start'\n | 'cli:plugin:complete'\n | 'cli:plugin:error';\n\n/**\n * Utility class for sending telemetry\n */\nexport class Telemetry {\n private readonly mixpanel: Mixpanel | undefined;\n private readonly hostId = machineIdSync();\n private readonly sessionid = cuid();\n private readonly trackingToken = process.env.TELEMETRY_TRACKING_TOKEN;\n private readonly _os = os.platform();\n // eslint-disable-next-line @typescript-eslint/no-var-requires\n private readonly version = require('../package.json').version;\n private exitWait = 200;\n\n constructor() {\n if (process.env.DO_NOT_TRACK !== '1' && this.trackingToken) {\n this.mixpanel = init(this.trackingToken, {\n geolocate: true,\n });\n }\n\n exitHook(async (callback) => {\n if (this.mixpanel) {\n // a small delay to ensure telemetry is sent\n await sleep(this.exitWait);\n }\n callback();\n });\n\n const errorHandler = async (err: Error) => {\n this.track('cli:error', {\n message: err.message,\n stack: err.stack,\n });\n if (this.mixpanel) {\n // a small delay to ensure telemetry is sent\n await sleep(this.exitWait);\n }\n\n if (err instanceof CliError || err instanceof CommanderError) {\n // error already logged\n } else {\n console.error('\\nAn unexpected error occurred:\\n', err);\n }\n\n process.exit(1);\n };\n\n exitHook.unhandledRejectionHandler(errorHandler);\n exitHook.uncaughtExceptionHandler(errorHandler);\n }\n\n track(event: TelemetryEvents, properties: Record<string, unknown> = {}) {\n if (this.mixpanel) {\n const payload = {\n distinct_id: this.hostId,\n session: this.sessionid,\n time: new Date(),\n $os: this._os,\n nodeVersion: process.version,\n version: this.version,\n ...properties,\n };\n this.mixpanel.track(event, payload);\n }\n }\n\n async trackSpan(\n startEvent: TelemetryEvents,\n completeEvent: TelemetryEvents,\n errorEvent: TelemetryEvents,\n properties: Record<string, unknown>,\n action: () => Promise<unknown> | void\n ) {\n this.track(startEvent, properties);\n const start = Date.now();\n let success = true;\n try {\n await Promise.resolve(action());\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n } catch (err: any) {\n this.track(errorEvent, {\n message: err.message,\n stack: err.stack,\n ...properties,\n });\n success = false;\n throw err;\n } finally {\n this.track(completeEvent, {\n duration: Date.now() - start,\n success,\n ...properties,\n });\n }\n }\n}\n\nexport default new Telemetry();\n"],"mappings":"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"}
|
package/types.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Model } from '@zenstackhq/language/ast';
|
|
2
|
+
export interface Context {
|
|
3
|
+
schema: Model;
|
|
4
|
+
outDir: string;
|
|
5
|
+
}
|
|
6
|
+
export interface Generator {
|
|
7
|
+
get name(): string;
|
|
8
|
+
get startMessage(): string;
|
|
9
|
+
get successMessage(): string;
|
|
10
|
+
generate(context: Context): Promise<string[]>;
|
|
11
|
+
}
|
package/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";
|
package/types.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","names":[],"sources":["../src/types.ts"],"sourcesContent":["import { Model } from '@zenstackhq/language/ast';\n\nexport interface Context {\n schema: Model;\n outDir: string;\n}\n\nexport interface Generator {\n get name(): string;\n get startMessage(): string;\n get successMessage(): string;\n generate(context: Context): Promise<string[]>;\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { DataModel, DataModelAttribute, Model } from '@zenstackhq/language/ast';
|
|
2
|
+
export declare function extractDataModelsWithAllowRules(model: Model): DataModel[];
|
|
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
|
+
};
|
|
14
|
+
export declare const VALIDATION_ATTRIBUTES: string[];
|
|
15
|
+
export declare function getIdField(dataModel: DataModel): import("@zenstackhq/language/ast").DataModelField | undefined;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.VALIDATION_ATTRIBUTES = void 0;
|
|
7
|
+
exports.analyzePolicies = analyzePolicies;
|
|
8
|
+
exports.extractDataModelsWithAllowRules = extractDataModelsWithAllowRules;
|
|
9
|
+
exports.getIdField = getIdField;
|
|
10
|
+
var _ast = require("@zenstackhq/language/ast");
|
|
11
|
+
var _sdk = require("@zenstackhq/sdk");
|
|
12
|
+
function extractDataModelsWithAllowRules(model) {
|
|
13
|
+
return model.declarations.filter(d => (0, _ast.isDataModel)(d) && d.attributes.some(attr => {
|
|
14
|
+
var _attr$decl$ref;
|
|
15
|
+
return ((_attr$decl$ref = attr.decl.ref) === null || _attr$decl$ref === void 0 ? void 0 : _attr$decl$ref.name) === '@@allow';
|
|
16
|
+
}));
|
|
17
|
+
}
|
|
18
|
+
function analyzePolicies(dataModel) {
|
|
19
|
+
const allows = dataModel.attributes.filter(attr => {
|
|
20
|
+
var _attr$decl$ref2;
|
|
21
|
+
return ((_attr$decl$ref2 = attr.decl.ref) === null || _attr$decl$ref2 === void 0 ? void 0 : _attr$decl$ref2.name) === '@@allow';
|
|
22
|
+
});
|
|
23
|
+
const denies = dataModel.attributes.filter(attr => {
|
|
24
|
+
var _attr$decl$ref3;
|
|
25
|
+
return ((_attr$decl$ref3 = attr.decl.ref) === null || _attr$decl$ref3 === void 0 ? void 0 : _attr$decl$ref3.name) === '@@deny';
|
|
26
|
+
});
|
|
27
|
+
const create = toStaticPolicy('create', allows, denies);
|
|
28
|
+
const read = toStaticPolicy('read', allows, denies);
|
|
29
|
+
const update = toStaticPolicy('update', allows, denies);
|
|
30
|
+
const del = toStaticPolicy('delete', allows, denies);
|
|
31
|
+
const hasFieldValidation = dataModel.fields.some(field => field.attributes.some(attr => VALIDATION_ATTRIBUTES.includes(attr.decl.$refText)));
|
|
32
|
+
return {
|
|
33
|
+
allows,
|
|
34
|
+
denies,
|
|
35
|
+
create,
|
|
36
|
+
read,
|
|
37
|
+
update,
|
|
38
|
+
delete: del,
|
|
39
|
+
allowAll: create === true && read === true && update === true && del === true,
|
|
40
|
+
denyAll: create === false && read === false && update === false && del === false,
|
|
41
|
+
hasFieldValidation
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
function toStaticPolicy(operation, allows, denies) {
|
|
45
|
+
const filteredDenies = forOperation(operation, denies);
|
|
46
|
+
if (filteredDenies.some(rule => (0, _sdk.getLiteral)(rule.args[1].value) === true)) {
|
|
47
|
+
// any constant true deny rule
|
|
48
|
+
return false;
|
|
49
|
+
}
|
|
50
|
+
const filteredAllows = forOperation(operation, allows);
|
|
51
|
+
if (filteredAllows.length === 0) {
|
|
52
|
+
// no allow rule
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
if (filteredDenies.length === 0 && filteredAllows.some(rule => (0, _sdk.getLiteral)(rule.args[1].value) === true)) {
|
|
56
|
+
// any constant true allow rule
|
|
57
|
+
return true;
|
|
58
|
+
}
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
function forOperation(operation, rules) {
|
|
62
|
+
return rules.filter(rule => {
|
|
63
|
+
const ops = (0, _sdk.getLiteral)(rule.args[0].value);
|
|
64
|
+
if (!ops) {
|
|
65
|
+
return false;
|
|
66
|
+
}
|
|
67
|
+
if (ops === 'all') {
|
|
68
|
+
return true;
|
|
69
|
+
}
|
|
70
|
+
const splitOps = ops.split(',').map(p => p.trim());
|
|
71
|
+
return splitOps.includes(operation);
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
const VALIDATION_ATTRIBUTES = ['@length', '@regex', '@startsWith', '@endsWith', '@email', '@url', '@datetime', '@gt', '@gte', '@lt', '@lte'];
|
|
75
|
+
exports.VALIDATION_ATTRIBUTES = VALIDATION_ATTRIBUTES;
|
|
76
|
+
function getIdField(dataModel) {
|
|
77
|
+
return dataModel.fields.find(f => f.attributes.some(attr => attr.decl.$refText === '@id'));
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=ast-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ast-utils.js","names":["extractDataModelsWithAllowRules","model","declarations","filter","d","isDataModel","attributes","some","attr","decl","ref","name","analyzePolicies","dataModel","allows","denies","create","toStaticPolicy","read","update","del","hasFieldValidation","fields","field","VALIDATION_ATTRIBUTES","includes","$refText","delete","allowAll","denyAll","operation","filteredDenies","forOperation","rule","getLiteral","args","value","filteredAllows","length","undefined","rules","ops","splitOps","split","map","p","trim","getIdField","find","f"],"sources":["../../src/utils/ast-utils.ts"],"sourcesContent":["import { DataModel, DataModelAttribute, Model, isDataModel } from '@zenstackhq/language/ast';\nimport { PolicyOperationKind } from '@zenstackhq/runtime';\nimport { getLiteral } from '@zenstackhq/sdk';\n\nexport function extractDataModelsWithAllowRules(model: Model): DataModel[] {\n return model.declarations.filter(\n (d) => isDataModel(d) && d.attributes.some((attr) => attr.decl.ref?.name === '@@allow')\n ) as DataModel[];\n}\n\nexport function analyzePolicies(dataModel: DataModel) {\n const allows = dataModel.attributes.filter((attr) => attr.decl.ref?.name === '@@allow');\n const denies = dataModel.attributes.filter((attr) => attr.decl.ref?.name === '@@deny');\n\n const create = toStaticPolicy('create', allows, denies);\n const read = toStaticPolicy('read', allows, denies);\n const update = toStaticPolicy('update', allows, denies);\n const del = toStaticPolicy('delete', allows, denies);\n const hasFieldValidation = dataModel.fields.some((field) =>\n field.attributes.some((attr) => VALIDATION_ATTRIBUTES.includes(attr.decl.$refText))\n );\n\n return {\n allows,\n denies,\n create,\n read,\n update,\n delete: del,\n allowAll: create === true && read === true && update === true && del === true,\n denyAll: create === false && read === false && update === false && del === false,\n hasFieldValidation,\n };\n}\n\nfunction toStaticPolicy(\n operation: PolicyOperationKind,\n allows: DataModelAttribute[],\n denies: DataModelAttribute[]\n): boolean | undefined {\n const filteredDenies = forOperation(operation, denies);\n if (filteredDenies.some((rule) => getLiteral<boolean>(rule.args[1].value) === true)) {\n // any constant true deny rule\n return false;\n }\n\n const filteredAllows = forOperation(operation, allows);\n if (filteredAllows.length === 0) {\n // no allow rule\n return false;\n }\n\n if (\n filteredDenies.length === 0 &&\n filteredAllows.some((rule) => getLiteral<boolean>(rule.args[1].value) === true)\n ) {\n // any constant true allow rule\n return true;\n }\n return undefined;\n}\n\nfunction forOperation(operation: PolicyOperationKind, rules: DataModelAttribute[]) {\n return rules.filter((rule) => {\n const ops = getLiteral<string>(rule.args[0].value);\n if (!ops) {\n return false;\n }\n if (ops === 'all') {\n return true;\n }\n const splitOps = ops.split(',').map((p) => p.trim());\n return splitOps.includes(operation);\n });\n}\n\nexport const VALIDATION_ATTRIBUTES = [\n '@length',\n '@regex',\n '@startsWith',\n '@endsWith',\n '@email',\n '@url',\n '@datetime',\n '@gt',\n '@gte',\n '@lt',\n '@lte',\n];\n\nexport function getIdField(dataModel: DataModel) {\n return dataModel.fields.find((f) => f.attributes.some((attr) => attr.decl.$refText === '@id'));\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.execSync = execSync;
|
|
7
|
+
var _child_process = require("child_process");
|
|
8
|
+
/**
|
|
9
|
+
* Utility for executing command synchronously and prints outputs on current console
|
|
10
|
+
*/
|
|
11
|
+
function execSync(cmd, stdio = 'inherit') {
|
|
12
|
+
(0, _child_process.execSync)(cmd, {
|
|
13
|
+
encoding: 'utf-8',
|
|
14
|
+
stdio
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=exec-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"exec-utils.js","names":["execSync","cmd","stdio","_exec","encoding"],"sources":["../../src/utils/exec-utils.ts"],"sourcesContent":["import { execSync as _exec, StdioOptions } from 'child_process';\n\n/**\n * Utility for executing command synchronously and prints outputs on current console\n */\nexport function execSync(cmd: string, stdio: StdioOptions = 'inherit'): void {\n _exec(cmd, { encoding: 'utf-8', stdio });\n}\n"],"mappings":";;;;;;AAAA;AAEA;AACA;AACA;AACO,SAASA,QAAQ,CAACC,GAAW,EAAEC,KAAmB,GAAG,SAAS,EAAQ;EACzE,IAAAC,uBAAK,EAACF,GAAG,EAAE;IAAEG,QAAQ,EAAE,OAAO;IAAEF;EAAM,CAAC,CAAC;AAC5C"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = indentString;
|
|
7
|
+
// https://github.com/sindresorhus/indent-string
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Utility for indenting strings
|
|
11
|
+
*/
|
|
12
|
+
function indentString(string, count = 4) {
|
|
13
|
+
const indent = ' ';
|
|
14
|
+
return string.replace(/^(?!\s*$)/gm, indent.repeat(count));
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=indent-string.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indent-string.js","names":["indentString","string","count","indent","replace","repeat"],"sources":["../../src/utils/indent-string.ts"],"sourcesContent":["// https://github.com/sindresorhus/indent-string\n\n/**\n * Utility for indenting strings\n */\nexport default function indentString(string: string, count = 4): string {\n const indent = ' ';\n return string.replace(/^(?!\\s*$)/gm, indent.repeat(count));\n}\n"],"mappings":";;;;;;AAAA;;AAEA;AACA;AACA;AACe,SAASA,YAAY,CAACC,MAAc,EAAEC,KAAK,GAAG,CAAC,EAAU;EACpE,MAAMC,MAAM,GAAG,GAAG;EAClB,OAAOF,MAAM,CAACG,OAAO,CAAC,aAAa,EAAED,MAAM,CAACE,MAAM,CAACH,KAAK,CAAC,CAAC;AAC9D"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
export declare type PackageManagers = 'npm' | 'yarn' | 'pnpm';
|
|
2
|
+
export declare function installPackage(pkg: string, dev: boolean, pkgManager?: PackageManagers | undefined, projectPath?: string): void;
|
|
3
|
+
export declare function ensurePackage(pkg: string, dev: boolean, pkgManager?: PackageManagers | undefined, projectPath?: string): void;
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ensurePackage = ensurePackage;
|
|
7
|
+
exports.installPackage = installPackage;
|
|
8
|
+
var _fs = _interopRequireDefault(require("fs"));
|
|
9
|
+
var _path = _interopRequireDefault(require("path"));
|
|
10
|
+
var _execUtils = require("./exec-utils");
|
|
11
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
12
|
+
function getPackageManager(projectPath = '.') {
|
|
13
|
+
if (_fs.default.existsSync(_path.default.join(projectPath, 'yarn.lock'))) {
|
|
14
|
+
return 'yarn';
|
|
15
|
+
} else if (_fs.default.existsSync(_path.default.join(projectPath, 'pnpm-lock.yaml'))) {
|
|
16
|
+
return 'pnpm';
|
|
17
|
+
} else {
|
|
18
|
+
return 'npm';
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
function installPackage(pkg, dev, pkgManager = undefined, projectPath = '.') {
|
|
22
|
+
const manager = pkgManager ?? getPackageManager(projectPath);
|
|
23
|
+
console.log(`Installing package "${pkg}" with ${manager}`);
|
|
24
|
+
switch (manager) {
|
|
25
|
+
case 'yarn':
|
|
26
|
+
(0, _execUtils.execSync)(`yarn --cwd "${projectPath}" add ${pkg} ${dev ? ' --dev' : ''} --ignore-engines`);
|
|
27
|
+
break;
|
|
28
|
+
case 'pnpm':
|
|
29
|
+
(0, _execUtils.execSync)(`pnpm add -C "${projectPath}" ${dev ? ' --save-dev' : ''} ${pkg}`);
|
|
30
|
+
break;
|
|
31
|
+
default:
|
|
32
|
+
(0, _execUtils.execSync)(`npm install --prefix "${projectPath}" ${dev ? ' --save-dev' : ''} ${pkg}`);
|
|
33
|
+
break;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
function ensurePackage(pkg, dev, pkgManager = undefined, projectPath = '.') {
|
|
37
|
+
try {
|
|
38
|
+
require(pkg);
|
|
39
|
+
} catch {
|
|
40
|
+
installPackage(pkg, dev, pkgManager, projectPath);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=pkg-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pkg-utils.js","names":["getPackageManager","projectPath","fs","existsSync","path","join","installPackage","pkg","dev","pkgManager","undefined","manager","console","log","execSync","ensurePackage","require"],"sources":["../../src/utils/pkg-utils.ts"],"sourcesContent":["import fs from 'fs';\nimport path from 'path';\nimport { execSync } from './exec-utils';\n\nexport type PackageManagers = 'npm' | 'yarn' | 'pnpm';\n\nfunction getPackageManager(projectPath = '.'): PackageManagers {\n if (fs.existsSync(path.join(projectPath, 'yarn.lock'))) {\n return 'yarn';\n } else if (fs.existsSync(path.join(projectPath, 'pnpm-lock.yaml'))) {\n return 'pnpm';\n } else {\n return 'npm';\n }\n}\n\nexport function installPackage(\n pkg: string,\n dev: boolean,\n pkgManager: PackageManagers | undefined = undefined,\n projectPath = '.'\n) {\n const manager = pkgManager ?? getPackageManager(projectPath);\n console.log(`Installing package \"${pkg}\" with ${manager}`);\n switch (manager) {\n case 'yarn':\n execSync(`yarn --cwd \"${projectPath}\" add ${pkg} ${dev ? ' --dev' : ''} --ignore-engines`);\n break;\n\n case 'pnpm':\n execSync(`pnpm add -C \"${projectPath}\" ${dev ? ' --save-dev' : ''} ${pkg}`);\n break;\n\n default:\n execSync(`npm install --prefix \"${projectPath}\" ${dev ? ' --save-dev' : ''} ${pkg}`);\n break;\n }\n}\n\nexport function ensurePackage(\n pkg: string,\n dev: boolean,\n pkgManager: PackageManagers | undefined = undefined,\n projectPath = '.'\n) {\n try {\n require(pkg);\n } catch {\n installPackage(pkg, dev, pkgManager, projectPath);\n }\n}\n"],"mappings":";;;;;;;AAAA;AACA;AACA;AAAwC;AAIxC,SAASA,iBAAiB,CAACC,WAAW,GAAG,GAAG,EAAmB;EAC3D,IAAIC,WAAE,CAACC,UAAU,CAACC,aAAI,CAACC,IAAI,CAACJ,WAAW,EAAE,WAAW,CAAC,CAAC,EAAE;IACpD,OAAO,MAAM;EACjB,CAAC,MAAM,IAAIC,WAAE,CAACC,UAAU,CAACC,aAAI,CAACC,IAAI,CAACJ,WAAW,EAAE,gBAAgB,CAAC,CAAC,EAAE;IAChE,OAAO,MAAM;EACjB,CAAC,MAAM;IACH,OAAO,KAAK;EAChB;AACJ;AAEO,SAASK,cAAc,CAC1BC,GAAW,EACXC,GAAY,EACZC,UAAuC,GAAGC,SAAS,EACnDT,WAAW,GAAG,GAAG,EACnB;EACE,MAAMU,OAAO,GAAGF,UAAU,IAAIT,iBAAiB,CAACC,WAAW,CAAC;EAC5DW,OAAO,CAACC,GAAG,CAAE,uBAAsBN,GAAI,UAASI,OAAQ,EAAC,CAAC;EAC1D,QAAQA,OAAO;IACX,KAAK,MAAM;MACP,IAAAG,mBAAQ,EAAE,eAAcb,WAAY,SAAQM,GAAI,IAAGC,GAAG,GAAG,QAAQ,GAAG,EAAG,mBAAkB,CAAC;MAC1F;IAEJ,KAAK,MAAM;MACP,IAAAM,mBAAQ,EAAE,gBAAeb,WAAY,KAAIO,GAAG,GAAG,aAAa,GAAG,EAAG,IAAGD,GAAI,EAAC,CAAC;MAC3E;IAEJ;MACI,IAAAO,mBAAQ,EAAE,yBAAwBb,WAAY,KAAIO,GAAG,GAAG,aAAa,GAAG,EAAG,IAAGD,GAAI,EAAC,CAAC;MACpF;EAAM;AAElB;AAEO,SAASQ,aAAa,CACzBR,GAAW,EACXC,GAAY,EACZC,UAAuC,GAAGC,SAAS,EACnDT,WAAW,GAAG,GAAG,EACnB;EACE,IAAI;IACAe,OAAO,CAACT,GAAG,CAAC;EAChB,CAAC,CAAC,MAAM;IACJD,cAAc,CAACC,GAAG,EAAEC,GAAG,EAAEC,UAAU,EAAER,WAAW,CAAC;EACrD;AACJ"}
|
package/asset/logo-256-bg.png
DELETED
|
Binary file
|
package/asset/logo-dark-256.png
DELETED
|
Binary file
|
package/asset/logo-light-256.png
DELETED
|
Binary file
|