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.
Files changed (203) hide show
  1. package/cli/cli-error.d.ts +5 -0
  2. package/cli/cli-error.js +12 -0
  3. package/cli/cli-error.js.map +1 -0
  4. package/cli/cli-util.d.ts +18 -0
  5. package/cli/cli-util.js +168 -0
  6. package/cli/cli-util.js.map +1 -0
  7. package/cli/index.d.ts +10 -0
  8. package/cli/index.js +78 -6531
  9. package/cli/index.js.map +1 -0
  10. package/cli/plugin-runner.d.ts +14 -0
  11. package/cli/plugin-runner.js +133 -0
  12. package/cli/plugin-runner.js.map +1 -0
  13. package/global.d.js +1 -0
  14. package/global.d.js.map +1 -0
  15. package/language-server/constants.d.ts +12 -0
  16. package/language-server/constants.js +24 -0
  17. package/language-server/constants.js.map +1 -0
  18. package/language-server/main.d.ts +1 -0
  19. package/language-server/main.js +20 -6436
  20. package/language-server/main.js.map +1 -0
  21. package/language-server/types.d.ts +10 -0
  22. package/language-server/types.js +1 -0
  23. package/language-server/types.js.map +1 -0
  24. package/language-server/utils.d.ts +10 -0
  25. package/language-server/utils.js +28 -0
  26. package/language-server/utils.js.map +1 -0
  27. package/language-server/validator/attribute-validator.d.ts +9 -0
  28. package/language-server/validator/attribute-validator.js +15 -0
  29. package/language-server/validator/attribute-validator.js.map +1 -0
  30. package/language-server/validator/datamodel-validator.d.ts +16 -0
  31. package/language-server/validator/datamodel-validator.js +365 -0
  32. package/language-server/validator/datamodel-validator.js.map +1 -0
  33. package/language-server/validator/datasource-validator.d.ts +13 -0
  34. package/language-server/validator/datasource-validator.js +85 -0
  35. package/language-server/validator/datasource-validator.js.map +1 -0
  36. package/language-server/validator/enum-validator.d.ts +9 -0
  37. package/language-server/validator/enum-validator.js +18 -0
  38. package/language-server/validator/enum-validator.js.map +1 -0
  39. package/language-server/validator/expression-validator.d.ts +11 -0
  40. package/language-server/validator/expression-validator.js +40 -0
  41. package/language-server/validator/expression-validator.js.map +1 -0
  42. package/language-server/validator/schema-validator.d.ts +10 -0
  43. package/language-server/validator/schema-validator.js +35 -0
  44. package/language-server/validator/schema-validator.js.map +1 -0
  45. package/language-server/validator/utils.d.ts +24 -0
  46. package/language-server/validator/utils.js +116 -0
  47. package/language-server/validator/utils.js.map +1 -0
  48. package/language-server/validator/zmodel-validator.d.ts +21 -0
  49. package/language-server/validator/zmodel-validator.js +72 -0
  50. package/language-server/validator/zmodel-validator.js.map +1 -0
  51. package/language-server/zmodel-linker.d.ts +29 -0
  52. package/language-server/zmodel-linker.js +364 -0
  53. package/language-server/zmodel-linker.js.map +1 -0
  54. package/language-server/zmodel-module.d.ts +41 -0
  55. package/language-server/zmodel-module.js +84 -0
  56. package/language-server/zmodel-module.js.map +1 -0
  57. package/language-server/zmodel-scope.d.ts +10 -0
  58. package/language-server/zmodel-scope.js +34 -0
  59. package/language-server/zmodel-scope.js.map +1 -0
  60. package/language-server/zmodel-workspace-manager.d.ts +8 -0
  61. package/language-server/zmodel-workspace-manager.js +25 -0
  62. package/language-server/zmodel-workspace-manager.js.map +1 -0
  63. package/package.json +20 -15
  64. package/plugins/access-policy/expression-writer.d.ts +38 -0
  65. package/plugins/access-policy/expression-writer.js +323 -0
  66. package/plugins/access-policy/expression-writer.js.map +1 -0
  67. package/plugins/access-policy/index.d.ts +4 -0
  68. package/plugins/access-policy/index.js +15 -4289
  69. package/plugins/access-policy/index.js.map +1 -0
  70. package/plugins/access-policy/policy-guard-generator.d.ts +15 -0
  71. package/plugins/access-policy/policy-guard-generator.js +345 -0
  72. package/plugins/access-policy/policy-guard-generator.js.map +1 -0
  73. package/plugins/access-policy/typescript-expression-transformer.d.ts +26 -0
  74. package/plugins/access-policy/typescript-expression-transformer.js +110 -0
  75. package/plugins/access-policy/typescript-expression-transformer.js.map +1 -0
  76. package/plugins/access-policy/utils.d.ts +5 -0
  77. package/plugins/access-policy/utils.js +16 -0
  78. package/plugins/access-policy/utils.js.map +1 -0
  79. package/plugins/access-policy/zod-schema-generator.d.ts +12 -0
  80. package/plugins/access-policy/zod-schema-generator.js +174 -0
  81. package/plugins/access-policy/zod-schema-generator.js.map +1 -0
  82. package/plugins/model-meta/index.d.ts +4 -0
  83. package/plugins/model-meta/index.js +130 -0
  84. package/plugins/model-meta/index.js.map +1 -0
  85. package/plugins/plugin-utils.d.ts +16 -0
  86. package/plugins/plugin-utils.js +58 -0
  87. package/plugins/plugin-utils.js.map +1 -0
  88. package/plugins/prisma/indent-string.d.ts +4 -0
  89. package/plugins/prisma/indent-string.js +16 -0
  90. package/plugins/prisma/indent-string.js.map +1 -0
  91. package/plugins/prisma/index.d.ts +4 -0
  92. package/plugins/prisma/index.js +15 -3740
  93. package/plugins/prisma/index.js.map +1 -0
  94. package/plugins/prisma/prisma-builder.d.ts +123 -0
  95. package/plugins/prisma/prisma-builder.js +256 -0
  96. package/plugins/prisma/prisma-builder.js.map +1 -0
  97. package/plugins/prisma/schema-generator.d.ts +22 -0
  98. package/plugins/prisma/schema-generator.js +201 -0
  99. package/plugins/prisma/schema-generator.js.map +1 -0
  100. package/plugins/react-hooks/index.d.ts +4 -0
  101. package/plugins/react-hooks/index.js +14 -4332
  102. package/plugins/react-hooks/index.js.map +1 -0
  103. package/plugins/react-hooks/react-hooks-generator.d.ts +3 -0
  104. package/plugins/react-hooks/react-hooks-generator.js +333 -0
  105. package/plugins/react-hooks/react-hooks-generator.js.map +1 -0
  106. package/plugins/trpc/config.d.ts +9 -0
  107. package/plugins/trpc/config.js +12 -0
  108. package/plugins/trpc/config.js.map +1 -0
  109. package/plugins/trpc/generator.d.ts +4 -0
  110. package/plugins/trpc/generator.js +132 -0
  111. package/plugins/trpc/generator.js.map +1 -0
  112. package/plugins/trpc/helpers.d.ts +9 -0
  113. package/plugins/trpc/helpers.js +144 -0
  114. package/plugins/trpc/helpers.js.map +1 -0
  115. package/plugins/trpc/index.d.ts +5 -0
  116. package/plugins/trpc/index.js +14 -5401
  117. package/plugins/trpc/index.js.map +1 -0
  118. package/plugins/trpc/project.d.ts +2 -0
  119. package/plugins/trpc/project.js +21 -0
  120. package/plugins/trpc/project.js.map +1 -0
  121. package/plugins/trpc/types.d.ts +0 -0
  122. package/plugins/trpc/types.js +1 -0
  123. package/plugins/trpc/types.js.map +1 -0
  124. package/plugins/trpc/utils/removeDir.d.ts +1 -0
  125. package/plugins/trpc/utils/removeDir.js +22 -0
  126. package/plugins/trpc/utils/removeDir.js.map +1 -0
  127. package/plugins/trpc/utils/uncapitalizeFirstLetter.d.ts +1 -0
  128. package/plugins/trpc/utils/uncapitalizeFirstLetter.js +11 -0
  129. package/plugins/trpc/utils/uncapitalizeFirstLetter.js.map +1 -0
  130. package/plugins/zod/generator.d.ts +4 -0
  131. package/plugins/zod/generator.js +78 -0
  132. package/plugins/zod/generator.js.map +1 -0
  133. package/plugins/zod/helpers/aggregate-helpers.d.ts +5 -0
  134. package/plugins/zod/helpers/aggregate-helpers.js +77 -0
  135. package/plugins/zod/helpers/aggregate-helpers.js.map +1 -0
  136. package/plugins/zod/helpers/comments-helpers.d.ts +6 -0
  137. package/plugins/zod/helpers/comments-helpers.js +91 -0
  138. package/plugins/zod/helpers/comments-helpers.js.map +1 -0
  139. package/plugins/zod/helpers/helpers.d.ts +8 -0
  140. package/plugins/zod/helpers/helpers.js +39 -0
  141. package/plugins/zod/helpers/helpers.js.map +1 -0
  142. package/plugins/zod/helpers/include-helpers.d.ts +2 -0
  143. package/plugins/zod/helpers/include-helpers.js +94 -0
  144. package/plugins/zod/helpers/include-helpers.js.map +1 -0
  145. package/plugins/zod/helpers/index.d.ts +4 -0
  146. package/plugins/zod/helpers/index.js +50 -0
  147. package/plugins/zod/helpers/index.js.map +1 -0
  148. package/plugins/zod/helpers/model-helpers.d.ts +6 -0
  149. package/plugins/zod/helpers/model-helpers.js +50 -0
  150. package/plugins/zod/helpers/model-helpers.js.map +1 -0
  151. package/plugins/zod/helpers/modelArgs-helpers.d.ts +2 -0
  152. package/plugins/zod/helpers/modelArgs-helpers.js +62 -0
  153. package/plugins/zod/helpers/modelArgs-helpers.js.map +1 -0
  154. package/plugins/zod/helpers/mongodb-helpers.d.ts +3 -0
  155. package/plugins/zod/helpers/mongodb-helpers.js +63 -0
  156. package/plugins/zod/helpers/mongodb-helpers.js.map +1 -0
  157. package/plugins/zod/helpers/select-helpers.d.ts +2 -0
  158. package/plugins/zod/helpers/select-helpers.js +150 -0
  159. package/plugins/zod/helpers/select-helpers.js.map +1 -0
  160. package/plugins/zod/index.d.ts +5 -0
  161. package/plugins/zod/index.js +14 -4824
  162. package/plugins/zod/index.js.map +1 -0
  163. package/plugins/zod/transformer.d.ts +70 -0
  164. package/plugins/zod/transformer.js +464 -0
  165. package/plugins/zod/transformer.js.map +1 -0
  166. package/plugins/zod/types.d.ts +20 -0
  167. package/plugins/zod/types.js +1 -0
  168. package/plugins/zod/types.js.map +1 -0
  169. package/plugins/zod/utils/formatFile.d.ts +1 -0
  170. package/plugins/zod/utils/formatFile.js +35 -0
  171. package/plugins/zod/utils/formatFile.js.map +1 -0
  172. package/plugins/zod/utils/removeDir.d.ts +1 -0
  173. package/plugins/zod/utils/removeDir.js +22 -0
  174. package/plugins/zod/utils/removeDir.js.map +1 -0
  175. package/plugins/zod/utils/writeFileSafely.d.ts +1 -0
  176. package/plugins/zod/utils/writeFileSafely.js +18 -0
  177. package/plugins/zod/utils/writeFileSafely.js.map +1 -0
  178. package/res/prism-zmodel.js +2 -4
  179. package/res/stdlib.zmodel +12 -1
  180. package/telemetry.d.ts +21 -0
  181. package/telemetry.js +102 -0
  182. package/telemetry.js.map +1 -0
  183. package/types.d.ts +11 -0
  184. package/types.js +1 -0
  185. package/types.js.map +1 -0
  186. package/utils/ast-utils.d.ts +15 -0
  187. package/utils/ast-utils.js +79 -0
  188. package/utils/ast-utils.js.map +1 -0
  189. package/utils/exec-utils.d.ts +6 -0
  190. package/utils/exec-utils.js +17 -0
  191. package/utils/exec-utils.js.map +1 -0
  192. package/utils/indent-string.d.ts +4 -0
  193. package/utils/indent-string.js +16 -0
  194. package/utils/indent-string.js.map +1 -0
  195. package/utils/pkg-utils.d.ts +3 -0
  196. package/utils/pkg-utils.js +43 -0
  197. package/utils/pkg-utils.js.map +1 -0
  198. package/asset/logo-256-bg.png +0 -0
  199. package/asset/logo-dark-256.png +0 -0
  200. package/asset/logo-light-256.png +0 -0
  201. package/extension.js +0 -39
  202. package/res/package.template.json +0 -9
  203. 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"}
@@ -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: FieldReference[]?, onDelete: ReferentialAction?, onUpdate: ReferentialAction?, map: String?) @@@prisma
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
@@ -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,6 @@
1
+ /// <reference types="node" />
2
+ import { StdioOptions } from 'child_process';
3
+ /**
4
+ * Utility for executing command synchronously and prints outputs on current console
5
+ */
6
+ export declare function execSync(cmd: string, stdio?: StdioOptions): void;
@@ -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,4 @@
1
+ /**
2
+ * Utility for indenting strings
3
+ */
4
+ export default function indentString(string: string, count?: number): string;
@@ -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"}
Binary file
Binary file
Binary file