zenstack 0.6.0-pre.10 → 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 -4318
- 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 -5386
- 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 -4808
- 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,174 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.ZodSchemaGenerator = void 0;
|
|
7
|
+
var _ast = require("@zenstackhq/language/ast");
|
|
8
|
+
var _sdk = require("@zenstackhq/sdk");
|
|
9
|
+
var _changeCase = require("change-case");
|
|
10
|
+
var _astUtils = require("../../utils/ast-utils");
|
|
11
|
+
/**
|
|
12
|
+
* Writes Zod schema for data models.
|
|
13
|
+
*/
|
|
14
|
+
class ZodSchemaGenerator {
|
|
15
|
+
generate(writer, models) {
|
|
16
|
+
writer.inlineBlock(() => {
|
|
17
|
+
models.forEach(model => {
|
|
18
|
+
const fields = model.fields.filter(field => {
|
|
19
|
+
var _field$type$reference;
|
|
20
|
+
return !_sdk.AUXILIARY_FIELDS.includes(field.name) &&
|
|
21
|
+
// scalar fields only
|
|
22
|
+
!(0, _ast.isDataModelField)((_field$type$reference = field.type.reference) === null || _field$type$reference === void 0 ? void 0 : _field$type$reference.ref) && this.hasValidationAttributes(field);
|
|
23
|
+
});
|
|
24
|
+
if (fields.length === 0) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
writer.write(`${(0, _changeCase.camelCase)(model.name)}: z.object(`);
|
|
28
|
+
writer.inlineBlock(() => {
|
|
29
|
+
fields.forEach(field => {
|
|
30
|
+
writer.writeLine(`${field.name}: ${this.makeFieldValidator(field)},`);
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
writer.writeLine(').partial(),');
|
|
34
|
+
});
|
|
35
|
+
});
|
|
36
|
+
}
|
|
37
|
+
hasValidationAttributes(field) {
|
|
38
|
+
return field.attributes.some(attr => _astUtils.VALIDATION_ATTRIBUTES.includes(attr.decl.$refText));
|
|
39
|
+
}
|
|
40
|
+
makeFieldValidator(field) {
|
|
41
|
+
let schema = this.makeZodSchema(field);
|
|
42
|
+
// translate field constraint attributes to zod schema
|
|
43
|
+
for (const attr of field.attributes) {
|
|
44
|
+
var _attr$decl$ref;
|
|
45
|
+
switch ((_attr$decl$ref = attr.decl.ref) === null || _attr$decl$ref === void 0 ? void 0 : _attr$decl$ref.name) {
|
|
46
|
+
case '@length':
|
|
47
|
+
{
|
|
48
|
+
const min = this.getAttrLiteralArg(attr, 'min');
|
|
49
|
+
if (min) {
|
|
50
|
+
schema += `.min(${min})`;
|
|
51
|
+
}
|
|
52
|
+
const max = this.getAttrLiteralArg(attr, 'max');
|
|
53
|
+
if (max) {
|
|
54
|
+
schema += `.max(${max})`;
|
|
55
|
+
}
|
|
56
|
+
break;
|
|
57
|
+
}
|
|
58
|
+
case '@regex':
|
|
59
|
+
{
|
|
60
|
+
const expr = this.getAttrLiteralArg(attr, 'regex');
|
|
61
|
+
if (expr) {
|
|
62
|
+
schema += `.regex(/${expr}/)`;
|
|
63
|
+
}
|
|
64
|
+
break;
|
|
65
|
+
}
|
|
66
|
+
case '@startsWith':
|
|
67
|
+
{
|
|
68
|
+
const text = this.getAttrLiteralArg(attr, 'text');
|
|
69
|
+
if (text) {
|
|
70
|
+
schema += `.startsWith(${JSON.stringify(text)})`;
|
|
71
|
+
}
|
|
72
|
+
break;
|
|
73
|
+
}
|
|
74
|
+
case '@endsWith':
|
|
75
|
+
{
|
|
76
|
+
const text = this.getAttrLiteralArg(attr, 'text');
|
|
77
|
+
if (text) {
|
|
78
|
+
schema += `.endsWith(${JSON.stringify(text)})`;
|
|
79
|
+
}
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
case '@email':
|
|
83
|
+
{
|
|
84
|
+
schema += `.email()`;
|
|
85
|
+
break;
|
|
86
|
+
}
|
|
87
|
+
case '@url':
|
|
88
|
+
{
|
|
89
|
+
schema += `.url()`;
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
case '@datetime':
|
|
93
|
+
{
|
|
94
|
+
schema += `.datetime({ offset: true })`;
|
|
95
|
+
break;
|
|
96
|
+
}
|
|
97
|
+
case '@gt':
|
|
98
|
+
{
|
|
99
|
+
const value = this.getAttrLiteralArg(attr, 'value');
|
|
100
|
+
if (value !== undefined) {
|
|
101
|
+
schema += `.gt(${value})`;
|
|
102
|
+
}
|
|
103
|
+
break;
|
|
104
|
+
}
|
|
105
|
+
case '@gte':
|
|
106
|
+
{
|
|
107
|
+
const value = this.getAttrLiteralArg(attr, 'value');
|
|
108
|
+
if (value !== undefined) {
|
|
109
|
+
schema += `.gte(${value})`;
|
|
110
|
+
}
|
|
111
|
+
break;
|
|
112
|
+
}
|
|
113
|
+
case '@lt':
|
|
114
|
+
{
|
|
115
|
+
const value = this.getAttrLiteralArg(attr, 'value');
|
|
116
|
+
if (value !== undefined) {
|
|
117
|
+
schema += `.lt(${value})`;
|
|
118
|
+
}
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
case '@lte':
|
|
122
|
+
{
|
|
123
|
+
const value = this.getAttrLiteralArg(attr, 'value');
|
|
124
|
+
if (value !== undefined) {
|
|
125
|
+
schema += `.lte(${value})`;
|
|
126
|
+
}
|
|
127
|
+
break;
|
|
128
|
+
}
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (field.type.optional) {
|
|
132
|
+
schema += '.nullable()';
|
|
133
|
+
}
|
|
134
|
+
return schema;
|
|
135
|
+
}
|
|
136
|
+
makeZodSchema(field) {
|
|
137
|
+
let schema;
|
|
138
|
+
switch (field.type.type) {
|
|
139
|
+
case 'Int':
|
|
140
|
+
case 'Float':
|
|
141
|
+
case 'Decimal':
|
|
142
|
+
schema = 'z.number()';
|
|
143
|
+
break;
|
|
144
|
+
case 'BigInt':
|
|
145
|
+
schema = 'z.bigint()';
|
|
146
|
+
break;
|
|
147
|
+
case 'String':
|
|
148
|
+
schema = 'z.string()';
|
|
149
|
+
break;
|
|
150
|
+
case 'Boolean':
|
|
151
|
+
schema = 'z.boolean()';
|
|
152
|
+
break;
|
|
153
|
+
case 'DateTime':
|
|
154
|
+
schema = 'z.date()';
|
|
155
|
+
break;
|
|
156
|
+
default:
|
|
157
|
+
schema = 'z.any()';
|
|
158
|
+
break;
|
|
159
|
+
}
|
|
160
|
+
if (field.type.array) {
|
|
161
|
+
schema = `z.array(${schema})`;
|
|
162
|
+
}
|
|
163
|
+
return schema;
|
|
164
|
+
}
|
|
165
|
+
getAttrLiteralArg(attr, paramName) {
|
|
166
|
+
const arg = attr.args.find(arg => {
|
|
167
|
+
var _arg$$resolvedParam;
|
|
168
|
+
return ((_arg$$resolvedParam = arg.$resolvedParam) === null || _arg$$resolvedParam === void 0 ? void 0 : _arg$$resolvedParam.name) === paramName;
|
|
169
|
+
});
|
|
170
|
+
return arg && (0, _sdk.getLiteral)(arg.value);
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
exports.ZodSchemaGenerator = ZodSchemaGenerator;
|
|
174
|
+
//# sourceMappingURL=zod-schema-generator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zod-schema-generator.js","names":["ZodSchemaGenerator","generate","writer","models","inlineBlock","forEach","model","fields","filter","field","AUXILIARY_FIELDS","includes","name","isDataModelField","type","reference","ref","hasValidationAttributes","length","write","camelCase","writeLine","makeFieldValidator","attributes","some","attr","VALIDATION_ATTRIBUTES","decl","$refText","schema","makeZodSchema","min","getAttrLiteralArg","max","expr","text","JSON","stringify","value","undefined","optional","array","paramName","arg","args","find","$resolvedParam","getLiteral"],"sources":["../../../src/plugins/access-policy/zod-schema-generator.ts"],"sourcesContent":["import { DataModel, DataModelField, DataModelFieldAttribute, isDataModelField } from '@zenstackhq/language/ast';\nimport { AUXILIARY_FIELDS, getLiteral } from '@zenstackhq/sdk';\nimport { camelCase } from 'change-case';\nimport { CodeBlockWriter } from 'ts-morph';\nimport { VALIDATION_ATTRIBUTES } from '../../utils/ast-utils';\n\n/**\n * Writes Zod schema for data models.\n */\nexport class ZodSchemaGenerator {\n generate(writer: CodeBlockWriter, models: DataModel[]) {\n writer.inlineBlock(() => {\n models.forEach((model) => {\n const fields = model.fields.filter(\n (field) =>\n !AUXILIARY_FIELDS.includes(field.name) &&\n // scalar fields only\n !isDataModelField(field.type.reference?.ref) &&\n this.hasValidationAttributes(field)\n );\n\n if (fields.length === 0) {\n return;\n }\n\n writer.write(`${camelCase(model.name)}: z.object(`);\n writer.inlineBlock(() => {\n fields.forEach((field) => {\n writer.writeLine(`${field.name}: ${this.makeFieldValidator(field)},`);\n });\n });\n writer.writeLine(').partial(),');\n });\n });\n }\n\n private hasValidationAttributes(field: DataModelField) {\n return field.attributes.some((attr) => VALIDATION_ATTRIBUTES.includes(attr.decl.$refText));\n }\n\n private makeFieldValidator(field: DataModelField) {\n let schema = this.makeZodSchema(field);\n // translate field constraint attributes to zod schema\n for (const attr of field.attributes) {\n switch (attr.decl.ref?.name) {\n case '@length': {\n const min = this.getAttrLiteralArg<number>(attr, 'min');\n if (min) {\n schema += `.min(${min})`;\n }\n const max = this.getAttrLiteralArg<number>(attr, 'max');\n if (max) {\n schema += `.max(${max})`;\n }\n break;\n }\n case '@regex': {\n const expr = this.getAttrLiteralArg<string>(attr, 'regex');\n if (expr) {\n schema += `.regex(/${expr}/)`;\n }\n break;\n }\n case '@startsWith': {\n const text = this.getAttrLiteralArg<string>(attr, 'text');\n if (text) {\n schema += `.startsWith(${JSON.stringify(text)})`;\n }\n break;\n }\n case '@endsWith': {\n const text = this.getAttrLiteralArg<string>(attr, 'text');\n if (text) {\n schema += `.endsWith(${JSON.stringify(text)})`;\n }\n break;\n }\n case '@email': {\n schema += `.email()`;\n break;\n }\n case '@url': {\n schema += `.url()`;\n break;\n }\n case '@datetime': {\n schema += `.datetime({ offset: true })`;\n break;\n }\n case '@gt': {\n const value = this.getAttrLiteralArg<number>(attr, 'value');\n if (value !== undefined) {\n schema += `.gt(${value})`;\n }\n break;\n }\n case '@gte': {\n const value = this.getAttrLiteralArg<number>(attr, 'value');\n if (value !== undefined) {\n schema += `.gte(${value})`;\n }\n break;\n }\n case '@lt': {\n const value = this.getAttrLiteralArg<number>(attr, 'value');\n if (value !== undefined) {\n schema += `.lt(${value})`;\n }\n break;\n }\n case '@lte': {\n const value = this.getAttrLiteralArg<number>(attr, 'value');\n if (value !== undefined) {\n schema += `.lte(${value})`;\n }\n break;\n }\n }\n }\n\n if (field.type.optional) {\n schema += '.nullable()';\n }\n\n return schema;\n }\n\n private makeZodSchema(field: DataModelField) {\n let schema: string;\n switch (field.type.type) {\n case 'Int':\n case 'Float':\n case 'Decimal':\n schema = 'z.number()';\n break;\n case 'BigInt':\n schema = 'z.bigint()';\n break;\n case 'String':\n schema = 'z.string()';\n break;\n case 'Boolean':\n schema = 'z.boolean()';\n break;\n case 'DateTime':\n schema = 'z.date()';\n break;\n default:\n schema = 'z.any()';\n break;\n }\n\n if (field.type.array) {\n schema = `z.array(${schema})`;\n }\n\n return schema;\n }\n\n private getAttrLiteralArg<T extends string | number>(attr: DataModelFieldAttribute, paramName: string) {\n const arg = attr.args.find((arg) => arg.$resolvedParam?.name === paramName);\n return arg && getLiteral<T>(arg.value);\n }\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = run;
|
|
7
|
+
exports.name = void 0;
|
|
8
|
+
var _ast = require("@zenstackhq/language/ast");
|
|
9
|
+
var _sdk = require("@zenstackhq/sdk");
|
|
10
|
+
var _changeCase = require("change-case");
|
|
11
|
+
var _path = _interopRequireDefault(require("path"));
|
|
12
|
+
var _tsMorph = require("ts-morph");
|
|
13
|
+
var _pluginUtils = require("../plugin-utils");
|
|
14
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
15
|
+
const name = 'Model Metadata';
|
|
16
|
+
exports.name = name;
|
|
17
|
+
async function run(model, options) {
|
|
18
|
+
const output = options.output ? options.output : (0, _pluginUtils.getDefaultOutputFolder)();
|
|
19
|
+
if (!output) {
|
|
20
|
+
console.error(`Unable to determine output path, not running plugin ${name}`);
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const dataModels = model.declarations.filter(d => (0, _ast.isDataModel)(d));
|
|
24
|
+
const project = new _tsMorph.Project();
|
|
25
|
+
if (!options.output) {
|
|
26
|
+
(0, _pluginUtils.ensureNodeModuleFolder)(output);
|
|
27
|
+
}
|
|
28
|
+
const sf = project.createSourceFile(_path.default.join(output, 'model-meta.ts'), undefined, {
|
|
29
|
+
overwrite: true
|
|
30
|
+
});
|
|
31
|
+
sf.addVariableStatement({
|
|
32
|
+
declarationKind: _tsMorph.VariableDeclarationKind.Const,
|
|
33
|
+
declarations: [{
|
|
34
|
+
name: 'metadata',
|
|
35
|
+
initializer: writer => generateModelMetadata(dataModels, writer)
|
|
36
|
+
}]
|
|
37
|
+
});
|
|
38
|
+
sf.addStatements('export default metadata;');
|
|
39
|
+
sf.formatText();
|
|
40
|
+
await project.save();
|
|
41
|
+
await project.emit();
|
|
42
|
+
}
|
|
43
|
+
function generateModelMetadata(dataModels, writer) {
|
|
44
|
+
writer.block(() => {
|
|
45
|
+
writer.write('fields:');
|
|
46
|
+
writer.block(() => {
|
|
47
|
+
for (const model of dataModels) {
|
|
48
|
+
writer.write(`${(0, _changeCase.camelCase)(model.name)}:`);
|
|
49
|
+
writer.block(() => {
|
|
50
|
+
for (const f of model.fields) {
|
|
51
|
+
var _f$type$reference;
|
|
52
|
+
const backlink = getBackLink(f);
|
|
53
|
+
writer.write(`${f.name}: {
|
|
54
|
+
name: "${f.name}",
|
|
55
|
+
type: "${f.type.reference ? f.type.reference.$refText :
|
|
56
|
+
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
57
|
+
f.type.type}",
|
|
58
|
+
isId: ${isIdField(f)},
|
|
59
|
+
isDataModel: ${(0, _ast.isDataModel)((_f$type$reference = f.type.reference) === null || _f$type$reference === void 0 ? void 0 : _f$type$reference.ref)},
|
|
60
|
+
isArray: ${f.type.array},
|
|
61
|
+
isOptional: ${f.type.optional},
|
|
62
|
+
attributes: ${JSON.stringify(getFieldAttributes(f))},
|
|
63
|
+
backLink: ${backlink ? "'" + backlink + "'" : 'undefined'}
|
|
64
|
+
},`);
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
writer.write(',');
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
writer.write(',');
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
function getBackLink(field) {
|
|
74
|
+
var _field$type$reference, _field$type$reference2;
|
|
75
|
+
if (!((_field$type$reference = field.type.reference) !== null && _field$type$reference !== void 0 && _field$type$reference.ref) || !(0, _ast.isDataModel)((_field$type$reference2 = field.type.reference) === null || _field$type$reference2 === void 0 ? void 0 : _field$type$reference2.ref)) {
|
|
76
|
+
return undefined;
|
|
77
|
+
}
|
|
78
|
+
const relName = getRelationName(field);
|
|
79
|
+
const sourceModel = field.$container;
|
|
80
|
+
const targetModel = field.type.reference.ref;
|
|
81
|
+
for (const otherField of targetModel.fields) {
|
|
82
|
+
var _otherField$type$refe;
|
|
83
|
+
if (((_otherField$type$refe = otherField.type.reference) === null || _otherField$type$refe === void 0 ? void 0 : _otherField$type$refe.ref) === sourceModel) {
|
|
84
|
+
if (relName) {
|
|
85
|
+
const otherRelName = getRelationName(otherField);
|
|
86
|
+
if (relName === otherRelName) {
|
|
87
|
+
return otherField.name;
|
|
88
|
+
}
|
|
89
|
+
} else {
|
|
90
|
+
return otherField.name;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return undefined;
|
|
95
|
+
}
|
|
96
|
+
function getRelationName(field) {
|
|
97
|
+
var _relAttr$args, _relAttr$args2;
|
|
98
|
+
const relAttr = field.attributes.find(attr => {
|
|
99
|
+
var _attr$decl$ref;
|
|
100
|
+
return ((_attr$decl$ref = attr.decl.ref) === null || _attr$decl$ref === void 0 ? void 0 : _attr$decl$ref.name) === 'relation';
|
|
101
|
+
});
|
|
102
|
+
const relName = relAttr && ((_relAttr$args = relAttr.args) === null || _relAttr$args === void 0 ? void 0 : _relAttr$args[0]) && (0, _sdk.getLiteral)((_relAttr$args2 = relAttr.args) === null || _relAttr$args2 === void 0 ? void 0 : _relAttr$args2[0].value);
|
|
103
|
+
return relName;
|
|
104
|
+
}
|
|
105
|
+
function getFieldAttributes(field) {
|
|
106
|
+
return field.attributes.map(attr => {
|
|
107
|
+
const args = [];
|
|
108
|
+
for (const arg of attr.args) {
|
|
109
|
+
if (!(0, _ast.isLiteralExpr)(arg.value)) {
|
|
110
|
+
// attributes with non-literal args are skipped
|
|
111
|
+
return undefined;
|
|
112
|
+
}
|
|
113
|
+
args.push({
|
|
114
|
+
name: arg.name,
|
|
115
|
+
value: arg.value.value
|
|
116
|
+
});
|
|
117
|
+
}
|
|
118
|
+
return {
|
|
119
|
+
name: (0, _sdk.resolved)(attr.decl).name,
|
|
120
|
+
args
|
|
121
|
+
};
|
|
122
|
+
}).filter(d => !!d);
|
|
123
|
+
}
|
|
124
|
+
function isIdField(field) {
|
|
125
|
+
return field.attributes.some(attr => {
|
|
126
|
+
var _attr$decl$ref2;
|
|
127
|
+
return ((_attr$decl$ref2 = attr.decl.ref) === null || _attr$decl$ref2 === void 0 ? void 0 : _attr$decl$ref2.name) === '@id';
|
|
128
|
+
});
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["name","run","model","options","output","getDefaultOutputFolder","console","error","dataModels","declarations","filter","d","isDataModel","project","Project","ensureNodeModuleFolder","sf","createSourceFile","path","join","undefined","overwrite","addVariableStatement","declarationKind","VariableDeclarationKind","Const","initializer","writer","generateModelMetadata","addStatements","formatText","save","emit","block","write","camelCase","f","fields","backlink","getBackLink","type","reference","$refText","isIdField","ref","array","optional","JSON","stringify","getFieldAttributes","field","relName","getRelationName","sourceModel","$container","targetModel","otherField","otherRelName","relAttr","attributes","find","attr","decl","args","getLiteral","value","map","arg","isLiteralExpr","push","resolved","some"],"sources":["../../../src/plugins/model-meta/index.ts"],"sourcesContent":["import { DataModel, DataModelField, Model, isDataModel, isLiteralExpr } from '@zenstackhq/language/ast';\nimport { RuntimeAttribute } from '@zenstackhq/runtime';\nimport { PluginOptions, getLiteral, resolved } from '@zenstackhq/sdk';\nimport { camelCase } from 'change-case';\nimport path from 'path';\nimport { CodeBlockWriter, Project, VariableDeclarationKind } from 'ts-morph';\nimport { ensureNodeModuleFolder, getDefaultOutputFolder } from '../plugin-utils';\n\nexport const name = 'Model Metadata';\n\nexport default async function run(model: Model, options: PluginOptions) {\n const output = options.output ? (options.output as string) : getDefaultOutputFolder();\n if (!output) {\n console.error(`Unable to determine output path, not running plugin ${name}`);\n return;\n }\n\n const dataModels = model.declarations.filter((d): d is DataModel => isDataModel(d));\n\n const project = new Project();\n\n if (!options.output) {\n ensureNodeModuleFolder(output);\n }\n\n const sf = project.createSourceFile(path.join(output, 'model-meta.ts'), undefined, { overwrite: true });\n sf.addVariableStatement({\n declarationKind: VariableDeclarationKind.Const,\n declarations: [{ name: 'metadata', initializer: (writer) => generateModelMetadata(dataModels, writer) }],\n });\n sf.addStatements('export default metadata;');\n\n sf.formatText();\n\n await project.save();\n await project.emit();\n}\n\nfunction generateModelMetadata(dataModels: DataModel[], writer: CodeBlockWriter) {\n writer.block(() => {\n writer.write('fields:');\n writer.block(() => {\n for (const model of dataModels) {\n writer.write(`${camelCase(model.name)}:`);\n writer.block(() => {\n for (const f of model.fields) {\n const backlink = getBackLink(f);\n writer.write(`${f.name}: {\n name: \"${f.name}\",\n type: \"${\n f.type.reference\n ? f.type.reference.$refText\n : // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n f.type.type!\n }\",\n isId: ${isIdField(f)},\n isDataModel: ${isDataModel(f.type.reference?.ref)},\n isArray: ${f.type.array},\n isOptional: ${f.type.optional},\n attributes: ${JSON.stringify(getFieldAttributes(f))},\n backLink: ${backlink ? \"'\" + backlink + \"'\" : 'undefined'} \n },`);\n }\n });\n writer.write(',');\n }\n });\n writer.write(',');\n });\n}\n\nfunction getBackLink(field: DataModelField) {\n if (!field.type.reference?.ref || !isDataModel(field.type.reference?.ref)) {\n return undefined;\n }\n\n const relName = getRelationName(field);\n\n const sourceModel = field.$container as DataModel;\n const targetModel = field.type.reference.ref as DataModel;\n\n for (const otherField of targetModel.fields) {\n if (otherField.type.reference?.ref === sourceModel) {\n if (relName) {\n const otherRelName = getRelationName(otherField);\n if (relName === otherRelName) {\n return otherField.name;\n }\n } else {\n return otherField.name;\n }\n }\n }\n return undefined;\n}\n\nfunction getRelationName(field: DataModelField) {\n const relAttr = field.attributes.find((attr) => attr.decl.ref?.name === 'relation');\n const relName = relAttr && relAttr.args?.[0] && getLiteral<string>(relAttr.args?.[0].value);\n return relName;\n}\n\nfunction getFieldAttributes(field: DataModelField): RuntimeAttribute[] {\n return field.attributes\n .map((attr) => {\n const args: Array<{ name?: string; value: unknown }> = [];\n for (const arg of attr.args) {\n if (!isLiteralExpr(arg.value)) {\n // attributes with non-literal args are skipped\n return undefined;\n }\n args.push({ name: arg.name, value: arg.value.value });\n }\n return { name: resolved(attr.decl).name, args };\n })\n .filter((d): d is RuntimeAttribute => !!d);\n}\n\nfunction isIdField(field: DataModelField) {\n return field.attributes.some((attr) => attr.decl.ref?.name === '@id');\n}\n"],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { PolicyOperationKind } from '@zenstackhq/runtime';
|
|
2
|
+
export declare const RUNTIME_PACKAGE = "@zenstackhq/runtime";
|
|
3
|
+
export declare const ALL_OPERATION_KINDS: PolicyOperationKind[];
|
|
4
|
+
/**
|
|
5
|
+
* Gets the nearest "node_modules" folder by walking up froma start path.
|
|
6
|
+
*/
|
|
7
|
+
export declare function getNodeModulesFolder(startPath?: string): string | undefined;
|
|
8
|
+
/**
|
|
9
|
+
* Gets the default node_modules/.zenstack output folder for plugins.
|
|
10
|
+
* @returns
|
|
11
|
+
*/
|
|
12
|
+
export declare function getDefaultOutputFolder(): string | undefined;
|
|
13
|
+
/**
|
|
14
|
+
* Ensure a folder exists and has a package.json in it.
|
|
15
|
+
*/
|
|
16
|
+
export declare function ensureNodeModuleFolder(folder: string): void;
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.RUNTIME_PACKAGE = exports.ALL_OPERATION_KINDS = void 0;
|
|
7
|
+
exports.ensureNodeModuleFolder = ensureNodeModuleFolder;
|
|
8
|
+
exports.getDefaultOutputFolder = getDefaultOutputFolder;
|
|
9
|
+
exports.getNodeModulesFolder = getNodeModulesFolder;
|
|
10
|
+
var _fs = _interopRequireDefault(require("fs"));
|
|
11
|
+
var _path = _interopRequireDefault(require("path"));
|
|
12
|
+
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
|
|
13
|
+
const RUNTIME_PACKAGE = '@zenstackhq/runtime';
|
|
14
|
+
exports.RUNTIME_PACKAGE = RUNTIME_PACKAGE;
|
|
15
|
+
const ALL_OPERATION_KINDS = ['create', 'update', 'postUpdate', 'read', 'delete'];
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Gets the nearest "node_modules" folder by walking up froma start path.
|
|
19
|
+
*/
|
|
20
|
+
exports.ALL_OPERATION_KINDS = ALL_OPERATION_KINDS;
|
|
21
|
+
function getNodeModulesFolder(startPath) {
|
|
22
|
+
startPath = startPath ?? process.cwd();
|
|
23
|
+
if (_fs.default.existsSync(_path.default.join(startPath, 'node_modules'))) {
|
|
24
|
+
return _path.default.join(startPath, 'node_modules');
|
|
25
|
+
} else if (startPath !== '/') {
|
|
26
|
+
const parent = _path.default.join(startPath, '..');
|
|
27
|
+
return getNodeModulesFolder(parent);
|
|
28
|
+
} else {
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Gets the default node_modules/.zenstack output folder for plugins.
|
|
35
|
+
* @returns
|
|
36
|
+
*/
|
|
37
|
+
function getDefaultOutputFolder() {
|
|
38
|
+
const modulesFolder = getNodeModulesFolder();
|
|
39
|
+
return modulesFolder ? _path.default.join(modulesFolder, '.zenstack') : undefined;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Ensure a folder exists and has a package.json in it.
|
|
44
|
+
*/
|
|
45
|
+
function ensureNodeModuleFolder(folder) {
|
|
46
|
+
if (!_fs.default.existsSync(folder)) {
|
|
47
|
+
_fs.default.mkdirSync(folder, {
|
|
48
|
+
recursive: true
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
if (!_fs.default.existsSync(_path.default.join(folder, 'package.json'))) {
|
|
52
|
+
_fs.default.writeFileSync(_path.default.join(folder, 'package.json'), JSON.stringify({
|
|
53
|
+
name: '.zenstack',
|
|
54
|
+
version: '1.0.0'
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=plugin-utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"plugin-utils.js","names":["RUNTIME_PACKAGE","ALL_OPERATION_KINDS","getNodeModulesFolder","startPath","process","cwd","fs","existsSync","path","join","parent","undefined","getDefaultOutputFolder","modulesFolder","ensureNodeModuleFolder","folder","mkdirSync","recursive","writeFileSync","JSON","stringify","name","version"],"sources":["../../src/plugins/plugin-utils.ts"],"sourcesContent":["import { PolicyOperationKind } from '@zenstackhq/runtime';\nimport fs from 'fs';\nimport path from 'path';\n\nexport const RUNTIME_PACKAGE = '@zenstackhq/runtime';\nexport const ALL_OPERATION_KINDS: PolicyOperationKind[] = ['create', 'update', 'postUpdate', 'read', 'delete'];\n\n/**\n * Gets the nearest \"node_modules\" folder by walking up froma start path.\n */\nexport function getNodeModulesFolder(startPath?: string): string | undefined {\n startPath = startPath ?? process.cwd();\n if (fs.existsSync(path.join(startPath, 'node_modules'))) {\n return path.join(startPath, 'node_modules');\n } else if (startPath !== '/') {\n const parent = path.join(startPath, '..');\n return getNodeModulesFolder(parent);\n } else {\n return undefined;\n }\n}\n\n/**\n * Gets the default node_modules/.zenstack output folder for plugins.\n * @returns\n */\nexport function getDefaultOutputFolder() {\n const modulesFolder = getNodeModulesFolder();\n return modulesFolder ? path.join(modulesFolder, '.zenstack') : undefined;\n}\n\n/**\n * Ensure a folder exists and has a package.json in it.\n */\nexport function ensureNodeModuleFolder(folder: string) {\n if (!fs.existsSync(folder)) {\n fs.mkdirSync(folder, { recursive: true });\n }\n if (!fs.existsSync(path.join(folder, 'package.json'))) {\n fs.writeFileSync(\n path.join(folder, 'package.json'),\n JSON.stringify({\n name: '.zenstack',\n version: '1.0.0',\n })\n );\n }\n}\n"],"mappings":";;;;;;;;;AACA;AACA;AAAwB;AAEjB,MAAMA,eAAe,GAAG,qBAAqB;AAAC;AAC9C,MAAMC,mBAA0C,GAAG,CAAC,QAAQ,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC;;AAE9G;AACA;AACA;AAFA;AAGO,SAASC,oBAAoB,CAACC,SAAkB,EAAsB;EACzEA,SAAS,GAAGA,SAAS,IAAIC,OAAO,CAACC,GAAG,EAAE;EACtC,IAAIC,WAAE,CAACC,UAAU,CAACC,aAAI,CAACC,IAAI,CAACN,SAAS,EAAE,cAAc,CAAC,CAAC,EAAE;IACrD,OAAOK,aAAI,CAACC,IAAI,CAACN,SAAS,EAAE,cAAc,CAAC;EAC/C,CAAC,MAAM,IAAIA,SAAS,KAAK,GAAG,EAAE;IAC1B,MAAMO,MAAM,GAAGF,aAAI,CAACC,IAAI,CAACN,SAAS,EAAE,IAAI,CAAC;IACzC,OAAOD,oBAAoB,CAACQ,MAAM,CAAC;EACvC,CAAC,MAAM;IACH,OAAOC,SAAS;EACpB;AACJ;;AAEA;AACA;AACA;AACA;AACO,SAASC,sBAAsB,GAAG;EACrC,MAAMC,aAAa,GAAGX,oBAAoB,EAAE;EAC5C,OAAOW,aAAa,GAAGL,aAAI,CAACC,IAAI,CAACI,aAAa,EAAE,WAAW,CAAC,GAAGF,SAAS;AAC5E;;AAEA;AACA;AACA;AACO,SAASG,sBAAsB,CAACC,MAAc,EAAE;EACnD,IAAI,CAACT,WAAE,CAACC,UAAU,CAACQ,MAAM,CAAC,EAAE;IACxBT,WAAE,CAACU,SAAS,CAACD,MAAM,EAAE;MAAEE,SAAS,EAAE;IAAK,CAAC,CAAC;EAC7C;EACA,IAAI,CAACX,WAAE,CAACC,UAAU,CAACC,aAAI,CAACC,IAAI,CAACM,MAAM,EAAE,cAAc,CAAC,CAAC,EAAE;IACnDT,WAAE,CAACY,aAAa,CACZV,aAAI,CAACC,IAAI,CAACM,MAAM,EAAE,cAAc,CAAC,EACjCI,IAAI,CAACC,SAAS,CAAC;MACXC,IAAI,EAAE,WAAW;MACjBC,OAAO,EAAE;IACb,CAAC,CAAC,CACL;EACL;AACJ"}
|
|
@@ -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/plugins/prisma/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"}
|