@zenstackhq/openapi 1.0.0-alpha.100

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/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2022 ZenStack
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,5 @@
1
+ # ZenStack OpenAPI plugin
2
+
3
+ This package contains ZenStack plugin for generating OpenAPI specification.
4
+
5
+ Visit [Homepage](https://zenstack.dev) for more details.
package/generator.d.ts ADDED
@@ -0,0 +1,40 @@
1
+ import { DMMF } from '@prisma/generator-helper';
2
+ import { PluginOptions } from '@zenstackhq/sdk';
3
+ import { type Model } from '@zenstackhq/sdk/ast';
4
+ /**
5
+ * Generates OpenAPI specification.
6
+ */
7
+ export declare class OpenAPIGenerator {
8
+ private model;
9
+ private options;
10
+ private dmmf;
11
+ private inputObjectTypes;
12
+ private outputObjectTypes;
13
+ private usedComponents;
14
+ private aggregateOperationSupport;
15
+ private includedModels;
16
+ private warnings;
17
+ constructor(model: Model, options: PluginOptions, dmmf: DMMF.Document);
18
+ generate(): string[];
19
+ private generateSecuritySchemes;
20
+ private pruneComponents;
21
+ private collectUsedComponents;
22
+ private generatePaths;
23
+ private generatePathsForModel;
24
+ private aggregateFields;
25
+ private component;
26
+ private getOption;
27
+ private generateComponents;
28
+ private generateEnumComponent;
29
+ private generateEntityComponent;
30
+ private generateField;
31
+ private generateInputComponent;
32
+ private generateOutputComponent;
33
+ private setInputRequired;
34
+ private setOutputRequired;
35
+ private prismaTypeToOpenAPIType;
36
+ private wrapArray;
37
+ private ref;
38
+ private array;
39
+ private oneOf;
40
+ }
package/generator.js ADDED
@@ -0,0 +1,667 @@
1
+ "use strict";
2
+ // Inspired by: https://github.com/omar-dulaimi/prisma-trpc-generator
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || function (mod) {
20
+ if (mod && mod.__esModule) return mod;
21
+ var result = {};
22
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
23
+ __setModuleDefault(result, mod);
24
+ return result;
25
+ };
26
+ var __importDefault = (this && this.__importDefault) || function (mod) {
27
+ return (mod && mod.__esModule) ? mod : { "default": mod };
28
+ };
29
+ Object.defineProperty(exports, "__esModule", { value: true });
30
+ exports.OpenAPIGenerator = void 0;
31
+ const sdk_1 = require("@zenstackhq/sdk");
32
+ const ast_1 = require("@zenstackhq/sdk/ast");
33
+ const dmmf_helpers_1 = require("@zenstackhq/sdk/dmmf-helpers");
34
+ const change_case_1 = require("change-case");
35
+ const fs = __importStar(require("fs"));
36
+ const path = __importStar(require("path"));
37
+ const tiny_invariant_1 = __importDefault(require("tiny-invariant"));
38
+ const yaml_1 = __importDefault(require("yaml"));
39
+ const zod_validation_error_1 = require("zod-validation-error");
40
+ const meta_1 = require("./meta");
41
+ const schema_1 = require("./schema");
42
+ /**
43
+ * Generates OpenAPI specification.
44
+ */
45
+ class OpenAPIGenerator {
46
+ constructor(model, options, dmmf) {
47
+ this.model = model;
48
+ this.options = options;
49
+ this.dmmf = dmmf;
50
+ this.inputObjectTypes = [];
51
+ this.outputObjectTypes = [];
52
+ this.usedComponents = new Set();
53
+ this.warnings = [];
54
+ }
55
+ generate() {
56
+ const output = this.getOption('output', '');
57
+ if (!output) {
58
+ throw new sdk_1.PluginError('"output" option is required');
59
+ }
60
+ // input types
61
+ this.inputObjectTypes.push(...this.dmmf.schema.inputObjectTypes.prisma);
62
+ this.outputObjectTypes.push(...this.dmmf.schema.outputObjectTypes.prisma);
63
+ this.includedModels = (0, sdk_1.getDataModels)(this.model).filter((d) => !(0, sdk_1.hasAttribute)(d, '@@openapi.ignore'));
64
+ // add input object types that are missing from Prisma dmmf
65
+ (0, dmmf_helpers_1.addMissingInputObjectTypesForModelArgs)(this.inputObjectTypes, this.dmmf.datamodel.models);
66
+ (0, dmmf_helpers_1.addMissingInputObjectTypesForInclude)(this.inputObjectTypes, this.dmmf.datamodel.models);
67
+ (0, dmmf_helpers_1.addMissingInputObjectTypesForSelect)(this.inputObjectTypes, this.outputObjectTypes, this.dmmf.datamodel.models);
68
+ (0, dmmf_helpers_1.addMissingInputObjectTypesForAggregate)(this.inputObjectTypes, this.outputObjectTypes);
69
+ this.aggregateOperationSupport = (0, dmmf_helpers_1.resolveAggregateOperationSupport)(this.inputObjectTypes);
70
+ const components = this.generateComponents();
71
+ const paths = this.generatePaths(components);
72
+ // generate security schemes, and root-level security
73
+ this.generateSecuritySchemes(components);
74
+ let security = undefined;
75
+ if (components.securitySchemes && Object.keys(components.securitySchemes).length > 0) {
76
+ security = Object.keys(components.securitySchemes).map((scheme) => ({ [scheme]: [] }));
77
+ }
78
+ // prune unused component schemas
79
+ this.pruneComponents(components);
80
+ const openapi = {
81
+ openapi: this.getOption('specVersion', '3.1.0'),
82
+ info: {
83
+ title: this.getOption('title', 'ZenStack Generated API'),
84
+ version: this.getOption('version', '1.0.0'),
85
+ description: this.getOption('description'),
86
+ summary: this.getOption('summary'),
87
+ },
88
+ tags: this.includedModels.map((model) => {
89
+ var _a;
90
+ const meta = (0, meta_1.getModelResourceMeta)(model);
91
+ return {
92
+ name: (0, change_case_1.camelCase)(model.name),
93
+ description: (_a = meta === null || meta === void 0 ? void 0 : meta.tagDescription) !== null && _a !== void 0 ? _a : `${model.name} operations`,
94
+ };
95
+ }),
96
+ components,
97
+ paths,
98
+ security,
99
+ };
100
+ const ext = path.extname(output);
101
+ if (ext && (ext.toLowerCase() === '.yaml' || ext.toLowerCase() === '.yml')) {
102
+ fs.writeFileSync(output, yaml_1.default.stringify(openapi));
103
+ }
104
+ else {
105
+ fs.writeFileSync(output, JSON.stringify(openapi, undefined, 2));
106
+ }
107
+ return this.warnings;
108
+ }
109
+ generateSecuritySchemes(components) {
110
+ const securitySchemes = this.getOption('securitySchemes');
111
+ if (securitySchemes) {
112
+ const parsed = schema_1.SecuritySchemesSchema.safeParse(securitySchemes);
113
+ if (!parsed.success) {
114
+ throw new sdk_1.PluginError(`"securitySchemes" option is invalid: ${(0, zod_validation_error_1.fromZodError)(parsed.error)}`);
115
+ }
116
+ components.securitySchemes = parsed.data;
117
+ }
118
+ }
119
+ pruneComponents(components) {
120
+ const schemas = components.schemas;
121
+ if (schemas) {
122
+ // build a transitive closure for all reachable schemas from roots
123
+ const allUsed = new Set(this.usedComponents);
124
+ let todo = [...allUsed];
125
+ while (todo.length > 0) {
126
+ const curr = new Set(allUsed);
127
+ Object.entries(schemas)
128
+ .filter(([key]) => todo.includes(key))
129
+ .forEach(([, value]) => {
130
+ this.collectUsedComponents(value, allUsed);
131
+ });
132
+ todo = [...allUsed].filter((e) => !curr.has(e));
133
+ }
134
+ // prune unused schemas
135
+ Object.keys(schemas).forEach((key) => {
136
+ if (!allUsed.has(key)) {
137
+ delete schemas[key];
138
+ }
139
+ });
140
+ }
141
+ }
142
+ collectUsedComponents(value, allUsed) {
143
+ if (!value) {
144
+ return;
145
+ }
146
+ if (Array.isArray(value)) {
147
+ value.forEach((item) => {
148
+ this.collectUsedComponents(item, allUsed);
149
+ });
150
+ }
151
+ else if (typeof value === 'object') {
152
+ Object.entries(value).forEach(([subKey, subValue]) => {
153
+ if (subKey === '$ref') {
154
+ const ref = subValue;
155
+ const name = ref.split('/').pop();
156
+ if (name && !allUsed.has(name)) {
157
+ allUsed.add(name);
158
+ }
159
+ }
160
+ else {
161
+ this.collectUsedComponents(subValue, allUsed);
162
+ }
163
+ });
164
+ }
165
+ }
166
+ generatePaths(components) {
167
+ let result = {};
168
+ const includeModelNames = this.includedModels.map((d) => d.name);
169
+ for (const model of this.dmmf.datamodel.models) {
170
+ if (includeModelNames.includes(model.name)) {
171
+ const zmodel = this.model.declarations.find((d) => (0, ast_1.isDataModel)(d) && d.name === model.name);
172
+ if (zmodel) {
173
+ result = Object.assign(Object.assign({}, result), this.generatePathsForModel(model, zmodel, components));
174
+ }
175
+ else {
176
+ this.warnings.push(`Unable to load ZModel definition for: ${model.name}}`);
177
+ }
178
+ }
179
+ }
180
+ return result;
181
+ }
182
+ generatePathsForModel(model, zmodel, components) {
183
+ var _a, _b, _c, _d, _e;
184
+ const result = {};
185
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
186
+ const ops = this.dmmf.mappings.modelOperations.find((ops) => ops.model === model.name);
187
+ if (!ops) {
188
+ this.warnings.push(`Unable to find mapping for model ${model.name}`);
189
+ return undefined;
190
+ }
191
+ const definitions = [];
192
+ const hasRelation = zmodel.fields.some((f) => { var _a; return (0, ast_1.isDataModel)((_a = f.type.reference) === null || _a === void 0 ? void 0 : _a.ref); });
193
+ // analyze access policies to determine default security
194
+ const { create, read, update, delete: del } = (0, sdk_1.analyzePolicies)(zmodel);
195
+ if (ops['createOne']) {
196
+ definitions.push({
197
+ method: 'post',
198
+ operation: 'create',
199
+ inputType: this.component(`${model.name}CreateArgs`, {
200
+ type: 'object',
201
+ properties: {
202
+ select: this.ref(`${model.name}Select`),
203
+ include: hasRelation ? this.ref(`${model.name}Include`) : undefined,
204
+ data: this.ref(`${model.name}CreateInput`),
205
+ },
206
+ }, components),
207
+ outputType: this.ref(model.name),
208
+ description: `Create a new ${model.name}`,
209
+ successCode: 201,
210
+ security: create === true ? [] : undefined,
211
+ });
212
+ }
213
+ if (ops['createMany']) {
214
+ definitions.push({
215
+ method: 'post',
216
+ operation: 'createMany',
217
+ inputType: this.component(`${model.name}CreateManyArgs`, {
218
+ type: 'object',
219
+ properties: {
220
+ data: this.ref(`${model.name}CreateManyInput`),
221
+ },
222
+ }, components),
223
+ outputType: this.ref('BatchPayload'),
224
+ description: `Create several ${model.name}`,
225
+ successCode: 201,
226
+ security: create === true ? [] : undefined,
227
+ });
228
+ }
229
+ if (ops['findUnique']) {
230
+ definitions.push({
231
+ method: 'get',
232
+ operation: 'findUnique',
233
+ inputType: this.component(`${model.name}FindUniqueArgs`, {
234
+ type: 'object',
235
+ properties: {
236
+ select: this.ref(`${model.name}Select`),
237
+ include: hasRelation ? this.ref(`${model.name}Include`) : undefined,
238
+ where: this.ref(`${model.name}WhereUniqueInput`),
239
+ },
240
+ }, components),
241
+ outputType: this.ref(model.name),
242
+ description: `Find one unique ${model.name}`,
243
+ security: read === true ? [] : undefined,
244
+ });
245
+ }
246
+ if (ops['findFirst']) {
247
+ definitions.push({
248
+ method: 'get',
249
+ operation: 'findFirst',
250
+ inputType: this.component(`${model.name}FindFirstArgs`, {
251
+ type: 'object',
252
+ properties: {
253
+ select: this.ref(`${model.name}Select`),
254
+ include: hasRelation ? this.ref(`${model.name}Include`) : undefined,
255
+ where: this.ref(`${model.name}WhereInput`),
256
+ },
257
+ }, components),
258
+ outputType: this.ref(model.name),
259
+ description: `Find the first ${model.name} matching the given condition`,
260
+ security: read === true ? [] : undefined,
261
+ });
262
+ }
263
+ if (ops['findMany']) {
264
+ definitions.push({
265
+ method: 'get',
266
+ operation: 'findMany',
267
+ inputType: this.component(`${model.name}FindManyArgs`, {
268
+ type: 'object',
269
+ properties: {
270
+ select: this.ref(`${model.name}Select`),
271
+ include: hasRelation ? this.ref(`${model.name}Include`) : undefined,
272
+ where: this.ref(`${model.name}WhereInput`),
273
+ },
274
+ }, components),
275
+ outputType: this.array(this.ref(model.name)),
276
+ description: `Find a list of ${model.name}`,
277
+ security: read === true ? [] : undefined,
278
+ });
279
+ }
280
+ if (ops['updateOne']) {
281
+ definitions.push({
282
+ method: 'patch',
283
+ operation: 'update',
284
+ inputType: this.component(`${model.name}UpdateArgs`, {
285
+ type: 'object',
286
+ properties: {
287
+ select: this.ref(`${model.name}Select`),
288
+ include: hasRelation ? this.ref(`${model.name}Include`) : undefined,
289
+ where: this.ref(`${model.name}WhereUniqueInput`),
290
+ data: this.ref(`${model.name}UpdateInput`),
291
+ },
292
+ }, components),
293
+ outputType: this.ref(model.name),
294
+ description: `Update a ${model.name}`,
295
+ security: update === true ? [] : undefined,
296
+ });
297
+ }
298
+ if (ops['updateMany']) {
299
+ definitions.push({
300
+ operation: 'updateMany',
301
+ method: 'patch',
302
+ inputType: this.component(`${model.name}UpdateManyArgs`, {
303
+ type: 'object',
304
+ properties: {
305
+ where: this.ref(`${model.name}WhereInput`),
306
+ data: this.ref(`${model.name}UpdateManyMutationInput`),
307
+ },
308
+ }, components),
309
+ outputType: this.ref('BatchPayload'),
310
+ description: `Update ${model.name}s matching the given condition`,
311
+ security: update === true ? [] : undefined,
312
+ });
313
+ }
314
+ if (ops['upsertOne']) {
315
+ definitions.push({
316
+ method: 'post',
317
+ operation: 'upsert',
318
+ inputType: this.component(`${model.name}UpsertArgs`, {
319
+ type: 'object',
320
+ properties: {
321
+ select: this.ref(`${model.name}Select`),
322
+ include: hasRelation ? this.ref(`${model.name}Include`) : undefined,
323
+ where: this.ref(`${model.name}WhereUniqueInput`),
324
+ create: this.ref(`${model.name}CreateInput`),
325
+ update: this.ref(`${model.name}UpdateInput`),
326
+ },
327
+ }, components),
328
+ outputType: this.ref(model.name),
329
+ description: `Upsert a ${model.name}`,
330
+ security: create === true && update == true ? [] : undefined,
331
+ });
332
+ }
333
+ if (ops['deleteOne']) {
334
+ definitions.push({
335
+ method: 'delete',
336
+ operation: 'delete',
337
+ inputType: this.component(`${model.name}DeleteUniqueArgs`, {
338
+ type: 'object',
339
+ properties: {
340
+ select: this.ref(`${model.name}Select`),
341
+ include: hasRelation ? this.ref(`${model.name}Include`) : undefined,
342
+ where: this.ref(`${model.name}WhereUniqueInput`),
343
+ },
344
+ }, components),
345
+ outputType: this.ref(model.name),
346
+ description: `Delete one unique ${model.name}`,
347
+ security: del === true ? [] : undefined,
348
+ });
349
+ }
350
+ if (ops['deleteMany']) {
351
+ definitions.push({
352
+ method: 'delete',
353
+ operation: 'deleteMany',
354
+ inputType: this.component(`${model.name}DeleteManyArgs`, {
355
+ type: 'object',
356
+ properties: {
357
+ where: this.ref(`${model.name}WhereInput`),
358
+ },
359
+ }, components),
360
+ outputType: this.ref('BatchPayload'),
361
+ description: `Delete ${model.name}s matching the given condition`,
362
+ security: del === true ? [] : undefined,
363
+ });
364
+ }
365
+ // somehow dmmf doesn't contain "count" operation, so we unconditionally add it here
366
+ definitions.push({
367
+ method: 'get',
368
+ operation: 'count',
369
+ inputType: this.component(`${model.name}CountArgs`, {
370
+ type: 'object',
371
+ properties: {
372
+ select: this.ref(`${model.name}Select`),
373
+ where: this.ref(`${model.name}WhereInput`),
374
+ },
375
+ }, components),
376
+ outputType: this.oneOf({ type: 'integer' }, this.ref(`${model.name}CountAggregateOutputType`)),
377
+ description: `Find a list of ${model.name}`,
378
+ security: read === true ? [] : undefined,
379
+ });
380
+ if (ops['aggregate']) {
381
+ definitions.push({
382
+ method: 'get',
383
+ operation: 'aggregate',
384
+ inputType: this.component(`${model.name}AggregateArgs`, {
385
+ type: 'object',
386
+ properties: Object.assign({ where: this.ref(`${model.name}WhereInput`), orderBy: this.ref(`${model.name}OrderByWithRelationInput`), cursor: this.ref(`${model.name}WhereUniqueInput`), take: { type: 'integer' }, skip: { type: 'integer' } }, this.aggregateFields(model)),
387
+ }, components),
388
+ outputType: this.ref(`Aggregate${model.name}`),
389
+ description: `Aggregate ${model.name}s`,
390
+ security: read === true ? [] : undefined,
391
+ });
392
+ }
393
+ if (ops['groupBy']) {
394
+ definitions.push({
395
+ method: 'get',
396
+ operation: 'groupBy',
397
+ inputType: this.component(`${model.name}GroupByArgs`, {
398
+ type: 'object',
399
+ properties: Object.assign({ where: this.ref(`${model.name}WhereInput`), orderBy: this.ref(`${model.name}OrderByWithRelationInput`), by: this.ref(`${model.name}ScalarFieldEnum`), having: this.ref(`${model.name}ScalarWhereWithAggregatesInput`), take: { type: 'integer' }, skip: { type: 'integer' } }, this.aggregateFields(model)),
400
+ }, components),
401
+ outputType: this.array(this.ref(`${model.name}GroupByOutputType`)),
402
+ description: `Group ${model.name}s by fields`,
403
+ security: read === true ? [] : undefined,
404
+ });
405
+ }
406
+ // get meta specified with @@openapi.meta
407
+ const resourceMeta = (0, meta_1.getModelResourceMeta)(zmodel);
408
+ for (const { method, operation, description, inputType, outputType, successCode, security } of definitions) {
409
+ const meta = resourceMeta === null || resourceMeta === void 0 ? void 0 : resourceMeta[operation];
410
+ if ((meta === null || meta === void 0 ? void 0 : meta.ignore) === true) {
411
+ continue;
412
+ }
413
+ const resolvedMethod = (_a = meta === null || meta === void 0 ? void 0 : meta.method) !== null && _a !== void 0 ? _a : method;
414
+ let resolvedPath = (_b = meta === null || meta === void 0 ? void 0 : meta.path) !== null && _b !== void 0 ? _b : operation;
415
+ if (resolvedPath.startsWith('/')) {
416
+ resolvedPath = resolvedPath.substring(1);
417
+ }
418
+ let prefix = this.getOption('prefix', '');
419
+ if (prefix.endsWith('/')) {
420
+ prefix = prefix.substring(0, prefix.length - 1);
421
+ }
422
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
423
+ const def = {
424
+ operationId: `${operation}${model.name}`,
425
+ description: (_c = meta === null || meta === void 0 ? void 0 : meta.description) !== null && _c !== void 0 ? _c : description,
426
+ tags: (meta === null || meta === void 0 ? void 0 : meta.tags) || [(0, change_case_1.camelCase)(model.name)],
427
+ summary: meta === null || meta === void 0 ? void 0 : meta.summary,
428
+ // security priority: operation-level > model-level > inferred
429
+ security: (_e = (_d = meta === null || meta === void 0 ? void 0 : meta.security) !== null && _d !== void 0 ? _d : resourceMeta === null || resourceMeta === void 0 ? void 0 : resourceMeta.security) !== null && _e !== void 0 ? _e : security,
430
+ deprecated: meta === null || meta === void 0 ? void 0 : meta.deprecated,
431
+ responses: {
432
+ [successCode !== undefined ? successCode : '200']: {
433
+ description: 'Successful operation',
434
+ content: {
435
+ 'application/json': {
436
+ schema: outputType,
437
+ },
438
+ },
439
+ },
440
+ '400': {
441
+ description: 'Invalid request',
442
+ },
443
+ '403': {
444
+ description: 'Forbidden',
445
+ },
446
+ },
447
+ };
448
+ if (inputType) {
449
+ if (['post', 'put', 'patch'].includes(resolvedMethod)) {
450
+ def.requestBody = {
451
+ content: {
452
+ 'application/json': {
453
+ schema: inputType,
454
+ },
455
+ },
456
+ };
457
+ }
458
+ else {
459
+ def.parameters = [
460
+ {
461
+ name: 'q',
462
+ in: 'query',
463
+ required: true,
464
+ content: {
465
+ 'application/json': {
466
+ schema: inputType,
467
+ },
468
+ },
469
+ },
470
+ ];
471
+ }
472
+ }
473
+ result[`${prefix}/${(0, change_case_1.camelCase)(model.name)}/${resolvedPath}`] = {
474
+ [resolvedMethod]: def,
475
+ };
476
+ }
477
+ return result;
478
+ }
479
+ aggregateFields(model) {
480
+ const result = {};
481
+ const supportedOps = this.aggregateOperationSupport[model.name];
482
+ if (supportedOps) {
483
+ if (supportedOps.count) {
484
+ result._count = this.oneOf({ type: 'boolean' }, this.ref(`${model.name}CountAggregateInput`));
485
+ }
486
+ if (supportedOps.min) {
487
+ result._min = this.ref(`${model.name}MinAggregateInput`);
488
+ }
489
+ if (supportedOps.max) {
490
+ result._max = this.ref(`${model.name}MaxAggregateInput`);
491
+ }
492
+ if (supportedOps.sum) {
493
+ result._sum = this.ref(`${model.name}SumAggregateInput`);
494
+ }
495
+ if (supportedOps.avg) {
496
+ result._avg = this.ref(`${model.name}AvgAggregateInput`);
497
+ }
498
+ }
499
+ return result;
500
+ }
501
+ component(name, def, components) {
502
+ (0, tiny_invariant_1.default)(components.schemas);
503
+ components.schemas[name] = def;
504
+ return this.ref(name);
505
+ }
506
+ getOption(name, defaultValue) {
507
+ const value = this.options[name];
508
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
509
+ // @ts-expect-error
510
+ return value === undefined ? defaultValue : value;
511
+ }
512
+ generateComponents() {
513
+ var _a;
514
+ const schemas = {};
515
+ const components = {
516
+ schemas,
517
+ };
518
+ // user-defined and built-in enums
519
+ for (const _enum of [...((_a = this.dmmf.schema.enumTypes.model) !== null && _a !== void 0 ? _a : []), ...this.dmmf.schema.enumTypes.prisma]) {
520
+ schemas[_enum.name] = this.generateEnumComponent(_enum);
521
+ }
522
+ // data models
523
+ for (const model of this.dmmf.datamodel.models) {
524
+ schemas[model.name] = this.generateEntityComponent(model);
525
+ }
526
+ for (const input of this.inputObjectTypes) {
527
+ schemas[input.name] = this.generateInputComponent(input);
528
+ }
529
+ for (const output of this.outputObjectTypes.filter((t) => !['Query', 'Mutation'].includes(t.name))) {
530
+ schemas[output.name] = this.generateOutputComponent(output);
531
+ }
532
+ // misc types
533
+ schemas['BatchPayload'] = {
534
+ type: 'object',
535
+ properties: {
536
+ count: { type: 'integer' },
537
+ },
538
+ };
539
+ return components;
540
+ }
541
+ generateEnumComponent(_enum) {
542
+ const schema = {
543
+ type: 'string',
544
+ enum: _enum.values.filter((f) => !sdk_1.AUXILIARY_FIELDS.includes(f)),
545
+ };
546
+ return schema;
547
+ }
548
+ generateEntityComponent(model) {
549
+ const properties = {};
550
+ const fields = model.fields.filter((f) => !sdk_1.AUXILIARY_FIELDS.includes(f.name));
551
+ const required = [];
552
+ for (const field of fields) {
553
+ properties[field.name] = this.generateField(field);
554
+ if (field.isRequired && !(field.relationName && field.isList)) {
555
+ required.push(field.name);
556
+ }
557
+ }
558
+ const result = { type: 'object', properties };
559
+ if (required.length > 0) {
560
+ result.required = required;
561
+ }
562
+ return result;
563
+ }
564
+ generateField(def) {
565
+ switch (def.kind) {
566
+ case 'scalar':
567
+ return this.wrapArray(this.prismaTypeToOpenAPIType(def.type), def.isList);
568
+ case 'enum':
569
+ case 'object':
570
+ return this.wrapArray(this.ref(def.type, false), def.isList);
571
+ default:
572
+ throw new sdk_1.PluginError(`Unsupported field kind: ${def.kind}`);
573
+ }
574
+ }
575
+ generateInputComponent(input) {
576
+ const properties = {};
577
+ const fields = input.fields.filter((f) => !sdk_1.AUXILIARY_FIELDS.includes(f.name));
578
+ for (const field of fields) {
579
+ const options = field.inputTypes
580
+ .filter((f) => f.type !== 'Null')
581
+ .map((f) => {
582
+ return this.wrapArray(this.prismaTypeToOpenAPIType(f.type), f.isList);
583
+ });
584
+ properties[field.name] = options.length > 1 ? { oneOf: options } : options[0];
585
+ }
586
+ const result = { type: 'object', properties };
587
+ this.setInputRequired(fields, result);
588
+ return result;
589
+ }
590
+ generateOutputComponent(output) {
591
+ const properties = {};
592
+ const fields = output.fields.filter((f) => !sdk_1.AUXILIARY_FIELDS.includes(f.name));
593
+ for (const field of fields) {
594
+ let outputType;
595
+ switch (field.outputType.location) {
596
+ case 'scalar':
597
+ case 'enumTypes':
598
+ outputType = this.prismaTypeToOpenAPIType(field.outputType.type);
599
+ break;
600
+ case 'outputObjectTypes':
601
+ outputType = this.prismaTypeToOpenAPIType(typeof field.outputType.type === 'string' ? field.outputType.type : field.outputType.type.name);
602
+ break;
603
+ }
604
+ field.outputType;
605
+ properties[field.name] = this.wrapArray(outputType, field.outputType.isList);
606
+ }
607
+ const result = { type: 'object', properties };
608
+ this.setOutputRequired(fields, result);
609
+ return result;
610
+ }
611
+ setInputRequired(fields, result) {
612
+ const required = fields.filter((f) => f.isRequired).map((f) => f.name);
613
+ if (required.length > 0) {
614
+ result.required = required;
615
+ }
616
+ }
617
+ setOutputRequired(fields, result) {
618
+ const required = fields.filter((f) => f.isNullable !== true).map((f) => f.name);
619
+ if (required.length > 0) {
620
+ result.required = required;
621
+ }
622
+ }
623
+ prismaTypeToOpenAPIType(type) {
624
+ switch (type) {
625
+ case 'String':
626
+ return { type: 'string' };
627
+ case 'Int':
628
+ case 'BigInt':
629
+ return { type: 'integer' };
630
+ case 'Float':
631
+ case 'Decimal':
632
+ return { type: 'number' };
633
+ case 'Boolean':
634
+ case 'True':
635
+ return { type: 'boolean' };
636
+ case 'DateTime':
637
+ return { type: 'string', format: 'date-time' };
638
+ case 'JSON':
639
+ case 'Json':
640
+ return {};
641
+ default:
642
+ return this.ref(type.toString(), false);
643
+ }
644
+ }
645
+ wrapArray(schema, isArray) {
646
+ if (isArray) {
647
+ return { type: 'array', items: schema };
648
+ }
649
+ else {
650
+ return schema;
651
+ }
652
+ }
653
+ ref(type, rooted = true) {
654
+ if (rooted) {
655
+ this.usedComponents.add(type);
656
+ }
657
+ return { $ref: `#/components/schemas/${type}` };
658
+ }
659
+ array(itemType) {
660
+ return { type: 'array', items: itemType };
661
+ }
662
+ oneOf(...schemas) {
663
+ return { oneOf: schemas };
664
+ }
665
+ }
666
+ exports.OpenAPIGenerator = OpenAPIGenerator;
667
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../src/generator.ts"],"names":[],"mappings":"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"}
package/index.d.ts ADDED
@@ -0,0 +1,5 @@
1
+ import { DMMF } from '@prisma/generator-helper';
2
+ import { PluginOptions } from '@zenstackhq/sdk';
3
+ import { Model } from '@zenstackhq/sdk/ast';
4
+ export declare const name = "OpenAPI";
5
+ export default function run(model: Model, options: PluginOptions, dmmf: DMMF.Document): Promise<string[]>;
package/index.js ADDED
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.name = void 0;
13
+ const generator_1 = require("./generator");
14
+ exports.name = 'OpenAPI';
15
+ function run(model, options, dmmf) {
16
+ return __awaiter(this, void 0, void 0, function* () {
17
+ return new generator_1.OpenAPIGenerator(model, options, dmmf).generate();
18
+ });
19
+ }
20
+ exports.default = run;
21
+ //# sourceMappingURL=index.js.map
package/index.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;AAGA,2CAA+C;AAElC,QAAA,IAAI,GAAG,SAAS,CAAC;AAE9B,SAA8B,GAAG,CAAC,KAAY,EAAE,OAAsB,EAAE,IAAmB;;QACvF,OAAO,IAAI,4BAAgB,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,QAAQ,EAAE,CAAC;IACjE,CAAC;CAAA;AAFD,sBAEC"}
package/meta.d.ts ADDED
@@ -0,0 +1,26 @@
1
+ import { DataModel } from '@zenstackhq/sdk/ast';
2
+ /**
3
+ * Metadata for a resource, expressed by @@openapi.meta attribute.
4
+ */
5
+ export type ModelMeta = {
6
+ tagDescription?: string;
7
+ security?: Array<Record<string, string[]>>;
8
+ };
9
+ /**
10
+ * Metadata for a resource operation, expressed by @@openapi.meta attribute.
11
+ */
12
+ export type OperationMeta = {
13
+ ignore?: boolean;
14
+ method?: string;
15
+ path?: string;
16
+ summary?: string;
17
+ description?: string;
18
+ tags?: string[];
19
+ deprecated?: boolean;
20
+ security?: Array<Record<string, string[]>>;
21
+ };
22
+ /**
23
+ * Metadata for a resource, expressed by @@openapi.meta attribute.
24
+ */
25
+ export type ResourceMeta = ModelMeta & Record<string, OperationMeta>;
26
+ export declare function getModelResourceMeta(model: DataModel): ResourceMeta | undefined;
package/meta.js ADDED
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getModelResourceMeta = void 0;
4
+ const sdk_1 = require("@zenstackhq/sdk");
5
+ function getModelResourceMeta(model) {
6
+ var _a;
7
+ return (0, sdk_1.getObjectLiteral)((_a = model.attributes.find((attr) => { var _a; return ((_a = attr.decl.ref) === null || _a === void 0 ? void 0 : _a.name) === '@@openapi.meta'; })) === null || _a === void 0 ? void 0 : _a.args[0].value);
8
+ }
9
+ exports.getModelResourceMeta = getModelResourceMeta;
10
+ //# sourceMappingURL=meta.js.map
package/meta.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"meta.js","sourceRoot":"","sources":["../src/meta.ts"],"names":[],"mappings":";;;AAAA,yCAAmD;AA8BnD,SAAgB,oBAAoB,CAAC,KAAgB;;IACjD,OAAO,IAAA,sBAAgB,EACnB,MAAA,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,WAAC,OAAA,CAAA,MAAA,IAAI,CAAC,IAAI,CAAC,GAAG,0CAAE,IAAI,MAAK,gBAAgB,CAAA,EAAA,CAAC,0CAAE,IAAI,CAAC,CAAC,EAAE,KAAK,CAC3F,CAAC;AACN,CAAC;AAJD,oDAIC"}
package/package.json ADDED
@@ -0,0 +1,53 @@
1
+ {
2
+ "name": "@zenstackhq/openapi",
3
+ "displayName": "ZenStack Plugin and Runtime for OpenAPI",
4
+ "version": "1.0.0-alpha.100",
5
+ "description": "ZenStack plugin and runtime supporting OpenAPI",
6
+ "main": "index.js",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/zenstackhq/zenstack"
10
+ },
11
+ "publishConfig": {
12
+ "directory": "dist",
13
+ "linkDirectory": true
14
+ },
15
+ "keywords": [],
16
+ "author": "ZenStack Team",
17
+ "license": "MIT",
18
+ "dependencies": {
19
+ "@prisma/generator-helper": "^4.7.1",
20
+ "change-case": "^4.1.2",
21
+ "openapi-types": "^12.1.0",
22
+ "tiny-invariant": "^1.3.1",
23
+ "yaml": "^2.2.1",
24
+ "zod": "^3.19.1",
25
+ "zod-validation-error": "^0.2.1",
26
+ "@zenstackhq/sdk": "1.0.0-alpha.100",
27
+ "@zenstackhq/runtime": "1.0.0-alpha.100"
28
+ },
29
+ "devDependencies": {
30
+ "@prisma/internals": "^4.7.1",
31
+ "@readme/openapi-parser": "^2.4.0",
32
+ "@types/jest": "^29.4.0",
33
+ "@types/tmp": "^0.2.3",
34
+ "@typescript-eslint/eslint-plugin": "^5.54.0",
35
+ "@typescript-eslint/parser": "^5.54.0",
36
+ "copyfiles": "^2.4.1",
37
+ "eslint": "^8.35.0",
38
+ "jest": "^29.4.3",
39
+ "rimraf": "^3.0.2",
40
+ "tmp": "^0.2.1",
41
+ "ts-jest": "^29.0.5",
42
+ "typescript": "^4.9.5",
43
+ "zenstack": "1.0.0-alpha.100",
44
+ "@zenstackhq/testtools": "1.0.0-alpha.100"
45
+ },
46
+ "scripts": {
47
+ "clean": "rimraf dist",
48
+ "build": "pnpm lint && pnpm clean && tsc && copyfiles ./package.json ./README.md ./LICENSE dist && copyfiles -u 1 ./src/plugin.zmodel dist",
49
+ "watch": "tsc --watch",
50
+ "lint": "eslint src --ext ts",
51
+ "test": "jest"
52
+ }
53
+ }
package/plugin.zmodel ADDED
@@ -0,0 +1,9 @@
1
+ /*
2
+ * Mark a data model to be ignored when generating OpenAPI specification.
3
+ */
4
+ attribute @@openapi.ignore()
5
+
6
+ /*
7
+ * Provide metadata for a data model for generating OpenAPI specification.
8
+ */
9
+ attribute @@openapi.meta(_ meta: Object)
package/schema.d.ts ADDED
@@ -0,0 +1,194 @@
1
+ import z from 'zod';
2
+ /**
3
+ * Zod schema for OpenAPI security schemes: https://swagger.io/docs/specification/authentication/
4
+ */
5
+ export declare const SecuritySchemesSchema: z.ZodRecord<z.ZodString, z.ZodUnion<[z.ZodObject<{
6
+ type: z.ZodLiteral<"http">;
7
+ scheme: z.ZodLiteral<"basic">;
8
+ }, "strip", z.ZodTypeAny, {
9
+ type: "http";
10
+ scheme: "basic";
11
+ }, {
12
+ type: "http";
13
+ scheme: "basic";
14
+ }>, z.ZodObject<{
15
+ type: z.ZodLiteral<"http">;
16
+ scheme: z.ZodLiteral<"bearer">;
17
+ bearerFormat: z.ZodOptional<z.ZodString>;
18
+ }, "strip", z.ZodTypeAny, {
19
+ bearerFormat?: string | undefined;
20
+ type: "http";
21
+ scheme: "bearer";
22
+ }, {
23
+ bearerFormat?: string | undefined;
24
+ type: "http";
25
+ scheme: "bearer";
26
+ }>, z.ZodObject<{
27
+ type: z.ZodLiteral<"apiKey">;
28
+ in: z.ZodUnion<[z.ZodLiteral<"header">, z.ZodLiteral<"query">, z.ZodLiteral<"cookie">]>;
29
+ name: z.ZodString;
30
+ }, "strip", z.ZodTypeAny, {
31
+ type: "apiKey";
32
+ in: "header" | "query" | "cookie";
33
+ name: string;
34
+ }, {
35
+ type: "apiKey";
36
+ in: "header" | "query" | "cookie";
37
+ name: string;
38
+ }>, z.ZodObject<{
39
+ type: z.ZodLiteral<"oauth2">;
40
+ description: z.ZodString;
41
+ flows: z.ZodObject<{
42
+ authorizationCode: z.ZodObject<{
43
+ authorizationUrl: z.ZodString;
44
+ tokenUrl: z.ZodString;
45
+ refreshUrl: z.ZodString;
46
+ scopes: z.ZodRecord<z.ZodString, z.ZodString>;
47
+ }, "strip", z.ZodTypeAny, {
48
+ authorizationUrl: string;
49
+ tokenUrl: string;
50
+ refreshUrl: string;
51
+ scopes: Record<string, string>;
52
+ }, {
53
+ authorizationUrl: string;
54
+ tokenUrl: string;
55
+ refreshUrl: string;
56
+ scopes: Record<string, string>;
57
+ }>;
58
+ implicit: z.ZodObject<{
59
+ authorizationUrl: z.ZodString;
60
+ refreshUrl: z.ZodString;
61
+ scopes: z.ZodRecord<z.ZodString, z.ZodString>;
62
+ }, "strip", z.ZodTypeAny, {
63
+ authorizationUrl: string;
64
+ refreshUrl: string;
65
+ scopes: Record<string, string>;
66
+ }, {
67
+ authorizationUrl: string;
68
+ refreshUrl: string;
69
+ scopes: Record<string, string>;
70
+ }>;
71
+ password: z.ZodObject<{
72
+ tokenUrl: z.ZodString;
73
+ refreshUrl: z.ZodString;
74
+ scopes: z.ZodRecord<z.ZodString, z.ZodString>;
75
+ }, "strip", z.ZodTypeAny, {
76
+ tokenUrl: string;
77
+ refreshUrl: string;
78
+ scopes: Record<string, string>;
79
+ }, {
80
+ tokenUrl: string;
81
+ refreshUrl: string;
82
+ scopes: Record<string, string>;
83
+ }>;
84
+ clientCredentials: z.ZodObject<{
85
+ tokenUrl: z.ZodString;
86
+ refreshUrl: z.ZodString;
87
+ scopes: z.ZodRecord<z.ZodString, z.ZodString>;
88
+ }, "strip", z.ZodTypeAny, {
89
+ tokenUrl: string;
90
+ refreshUrl: string;
91
+ scopes: Record<string, string>;
92
+ }, {
93
+ tokenUrl: string;
94
+ refreshUrl: string;
95
+ scopes: Record<string, string>;
96
+ }>;
97
+ }, "strip", z.ZodTypeAny, {
98
+ authorizationCode: {
99
+ authorizationUrl: string;
100
+ tokenUrl: string;
101
+ refreshUrl: string;
102
+ scopes: Record<string, string>;
103
+ };
104
+ implicit: {
105
+ authorizationUrl: string;
106
+ refreshUrl: string;
107
+ scopes: Record<string, string>;
108
+ };
109
+ password: {
110
+ tokenUrl: string;
111
+ refreshUrl: string;
112
+ scopes: Record<string, string>;
113
+ };
114
+ clientCredentials: {
115
+ tokenUrl: string;
116
+ refreshUrl: string;
117
+ scopes: Record<string, string>;
118
+ };
119
+ }, {
120
+ authorizationCode: {
121
+ authorizationUrl: string;
122
+ tokenUrl: string;
123
+ refreshUrl: string;
124
+ scopes: Record<string, string>;
125
+ };
126
+ implicit: {
127
+ authorizationUrl: string;
128
+ refreshUrl: string;
129
+ scopes: Record<string, string>;
130
+ };
131
+ password: {
132
+ tokenUrl: string;
133
+ refreshUrl: string;
134
+ scopes: Record<string, string>;
135
+ };
136
+ clientCredentials: {
137
+ tokenUrl: string;
138
+ refreshUrl: string;
139
+ scopes: Record<string, string>;
140
+ };
141
+ }>;
142
+ }, "strip", z.ZodTypeAny, {
143
+ type: "oauth2";
144
+ description: string;
145
+ flows: {
146
+ authorizationCode: {
147
+ authorizationUrl: string;
148
+ tokenUrl: string;
149
+ refreshUrl: string;
150
+ scopes: Record<string, string>;
151
+ };
152
+ implicit: {
153
+ authorizationUrl: string;
154
+ refreshUrl: string;
155
+ scopes: Record<string, string>;
156
+ };
157
+ password: {
158
+ tokenUrl: string;
159
+ refreshUrl: string;
160
+ scopes: Record<string, string>;
161
+ };
162
+ clientCredentials: {
163
+ tokenUrl: string;
164
+ refreshUrl: string;
165
+ scopes: Record<string, string>;
166
+ };
167
+ };
168
+ }, {
169
+ type: "oauth2";
170
+ description: string;
171
+ flows: {
172
+ authorizationCode: {
173
+ authorizationUrl: string;
174
+ tokenUrl: string;
175
+ refreshUrl: string;
176
+ scopes: Record<string, string>;
177
+ };
178
+ implicit: {
179
+ authorizationUrl: string;
180
+ refreshUrl: string;
181
+ scopes: Record<string, string>;
182
+ };
183
+ password: {
184
+ tokenUrl: string;
185
+ refreshUrl: string;
186
+ scopes: Record<string, string>;
187
+ };
188
+ clientCredentials: {
189
+ tokenUrl: string;
190
+ refreshUrl: string;
191
+ scopes: Record<string, string>;
192
+ };
193
+ };
194
+ }>]>>;
package/schema.js ADDED
@@ -0,0 +1,47 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SecuritySchemesSchema = void 0;
7
+ const zod_1 = __importDefault(require("zod"));
8
+ /**
9
+ * Zod schema for OpenAPI security schemes: https://swagger.io/docs/specification/authentication/
10
+ */
11
+ exports.SecuritySchemesSchema = zod_1.default.record(zod_1.default.union([
12
+ zod_1.default.object({ type: zod_1.default.literal('http'), scheme: zod_1.default.literal('basic') }),
13
+ zod_1.default.object({ type: zod_1.default.literal('http'), scheme: zod_1.default.literal('bearer'), bearerFormat: zod_1.default.string().optional() }),
14
+ zod_1.default.object({
15
+ type: zod_1.default.literal('apiKey'),
16
+ in: zod_1.default.union([zod_1.default.literal('header'), zod_1.default.literal('query'), zod_1.default.literal('cookie')]),
17
+ name: zod_1.default.string(),
18
+ }),
19
+ zod_1.default.object({
20
+ type: zod_1.default.literal('oauth2'),
21
+ description: zod_1.default.string(),
22
+ flows: zod_1.default.object({
23
+ authorizationCode: zod_1.default.object({
24
+ authorizationUrl: zod_1.default.string(),
25
+ tokenUrl: zod_1.default.string(),
26
+ refreshUrl: zod_1.default.string(),
27
+ scopes: zod_1.default.record(zod_1.default.string()),
28
+ }),
29
+ implicit: zod_1.default.object({
30
+ authorizationUrl: zod_1.default.string(),
31
+ refreshUrl: zod_1.default.string(),
32
+ scopes: zod_1.default.record(zod_1.default.string()),
33
+ }),
34
+ password: zod_1.default.object({
35
+ tokenUrl: zod_1.default.string(),
36
+ refreshUrl: zod_1.default.string(),
37
+ scopes: zod_1.default.record(zod_1.default.string()),
38
+ }),
39
+ clientCredentials: zod_1.default.object({
40
+ tokenUrl: zod_1.default.string(),
41
+ refreshUrl: zod_1.default.string(),
42
+ scopes: zod_1.default.record(zod_1.default.string()),
43
+ }),
44
+ }),
45
+ }),
46
+ ]));
47
+ //# sourceMappingURL=schema.js.map
package/schema.js.map ADDED
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../src/schema.ts"],"names":[],"mappings":";;;;;;AAAA,8CAAoB;AAEpB;;GAEG;AACU,QAAA,qBAAqB,GAAG,aAAC,CAAC,MAAM,CACzC,aAAC,CAAC,KAAK,CAAC;IACJ,aAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,aAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,aAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;IACjE,aAAC,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,aAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,aAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,YAAY,EAAE,aAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAC;IACvG,aAAC,CAAC,MAAM,CAAC;QACL,IAAI,EAAE,aAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QACzB,EAAE,EAAE,aAAC,CAAC,KAAK,CAAC,CAAC,aAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,aAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,aAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3E,IAAI,EAAE,aAAC,CAAC,MAAM,EAAE;KACnB,CAAC;IACF,aAAC,CAAC,MAAM,CAAC;QACL,IAAI,EAAE,aAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;QACzB,WAAW,EAAE,aAAC,CAAC,MAAM,EAAE;QACvB,KAAK,EAAE,aAAC,CAAC,MAAM,CAAC;YACZ,iBAAiB,EAAE,aAAC,CAAC,MAAM,CAAC;gBACxB,gBAAgB,EAAE,aAAC,CAAC,MAAM,EAAE;gBAC5B,QAAQ,EAAE,aAAC,CAAC,MAAM,EAAE;gBACpB,UAAU,EAAE,aAAC,CAAC,MAAM,EAAE;gBACtB,MAAM,EAAE,aAAC,CAAC,MAAM,CAAC,aAAC,CAAC,MAAM,EAAE,CAAC;aAC/B,CAAC;YACF,QAAQ,EAAE,aAAC,CAAC,MAAM,CAAC;gBACf,gBAAgB,EAAE,aAAC,CAAC,MAAM,EAAE;gBAC5B,UAAU,EAAE,aAAC,CAAC,MAAM,EAAE;gBACtB,MAAM,EAAE,aAAC,CAAC,MAAM,CAAC,aAAC,CAAC,MAAM,EAAE,CAAC;aAC/B,CAAC;YACF,QAAQ,EAAE,aAAC,CAAC,MAAM,CAAC;gBACf,QAAQ,EAAE,aAAC,CAAC,MAAM,EAAE;gBACpB,UAAU,EAAE,aAAC,CAAC,MAAM,EAAE;gBACtB,MAAM,EAAE,aAAC,CAAC,MAAM,CAAC,aAAC,CAAC,MAAM,EAAE,CAAC;aAC/B,CAAC;YACF,iBAAiB,EAAE,aAAC,CAAC,MAAM,CAAC;gBACxB,QAAQ,EAAE,aAAC,CAAC,MAAM,EAAE;gBACpB,UAAU,EAAE,aAAC,CAAC,MAAM,EAAE;gBACtB,MAAM,EAAE,aAAC,CAAC,MAAM,CAAC,aAAC,CAAC,MAAM,EAAE,CAAC;aAC/B,CAAC;SACL,CAAC;KACL,CAAC;CACL,CAAC,CACL,CAAC"}