@zenstackhq/server 1.0.0-alpha.71 → 1.0.0-alpha.74

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.
@@ -0,0 +1 @@
1
+ export { default as ZenStackMiddleware } from './middleware';
@@ -0,0 +1,9 @@
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.ZenStackMiddleware = void 0;
7
+ var middleware_1 = require("./middleware");
8
+ Object.defineProperty(exports, "ZenStackMiddleware", { enumerable: true, get: function () { return __importDefault(middleware_1).default; } });
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/express/index.ts"],"names":[],"mappings":";;;;;;AAAA,2CAA6D;AAApD,iIAAA,OAAO,OAAsB"}
@@ -0,0 +1,25 @@
1
+ import { ModelZodSchema } from '@zenstackhq/runtime/zod';
2
+ import type { Handler, Request, Response } from 'express';
3
+ import { LoggerConfig } from '../openapi';
4
+ /**
5
+ * Express middleware options
6
+ */
7
+ export interface MiddlewareOptions {
8
+ /**
9
+ * Callback for getting a PrismaClient for the given request
10
+ */
11
+ getPrisma: (req: Request, res: Response) => unknown | Promise<unknown>;
12
+ /**
13
+ * Logger settings
14
+ */
15
+ logger?: LoggerConfig;
16
+ /**
17
+ * Zod schemas for validating request input. Pass `true` to load from standard location (need to enable `@core/zod` plugin in schema.zmodel).
18
+ */
19
+ zodSchemas?: ModelZodSchema | boolean;
20
+ }
21
+ /**
22
+ * Creates an Express middleware for handling CRUD requests.
23
+ */
24
+ declare const factory: (options: MiddlewareOptions) => Handler;
25
+ export default factory;
@@ -0,0 +1,43 @@
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
+ const zod_1 = require("@zenstackhq/runtime/zod");
13
+ const openapi_1 = require("../openapi");
14
+ /**
15
+ * Creates an Express middleware for handling CRUD requests.
16
+ */
17
+ const factory = (options) => {
18
+ let schemas;
19
+ if (typeof options.zodSchemas === 'object') {
20
+ schemas = options.zodSchemas;
21
+ }
22
+ else if (options.zodSchemas === true) {
23
+ schemas = (0, zod_1.getModelZodSchemas)();
24
+ }
25
+ return (request, response) => __awaiter(void 0, void 0, void 0, function* () {
26
+ const prisma = (yield options.getPrisma(request, response));
27
+ if (!prisma) {
28
+ throw new Error('unable to get prisma from request context');
29
+ }
30
+ const r = yield (0, openapi_1.handleRequest)({
31
+ method: request.method,
32
+ path: request.path,
33
+ query: request.query,
34
+ requestBody: request.body,
35
+ prisma,
36
+ logger: options.logger,
37
+ zodSchemas: schemas,
38
+ });
39
+ response.status(r.status).json(r.body);
40
+ });
41
+ };
42
+ exports.default = factory;
43
+ //# sourceMappingURL=middleware.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/express/middleware.ts"],"names":[],"mappings":";;;;;;;;;;;AAEA,iDAA6E;AAE7E,wCAAyD;AAsBzD;;GAEG;AACH,MAAM,OAAO,GAAG,CAAC,OAA0B,EAAW,EAAE;IACpD,IAAI,OAAmC,CAAC;IACxC,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,EAAE;QACxC,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;KAChC;SAAM,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,EAAE;QACpC,OAAO,GAAG,IAAA,wBAAkB,GAAE,CAAC;KAClC;IAED,OAAO,CAAO,OAAO,EAAE,QAAQ,EAAE,EAAE;QAC/B,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAqB,CAAC;QAChF,IAAI,CAAC,MAAM,EAAE;YACT,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;SAChE;QAED,MAAM,CAAC,GAAG,MAAM,IAAA,uBAAa,EAAC;YAC1B,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,KAAK,EAAE,OAAO,CAAC,KAA0C;YACzD,WAAW,EAAE,OAAO,CAAC,IAAI;YACzB,MAAM;YACN,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,UAAU,EAAE,OAAO;SACtB,CAAC,CAAC;QAEH,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;IAC3C,CAAC,CAAA,CAAC;AACN,CAAC,CAAC;AAEF,kBAAe,OAAO,CAAC"}
@@ -1,9 +1,26 @@
1
+ import { ModelZodSchema } from '@zenstackhq/runtime/zod';
1
2
  import { FastifyPluginCallback, FastifyReply, FastifyRequest } from 'fastify';
2
3
  import { LoggerConfig } from '../openapi';
4
+ /**
5
+ * Fastify plugin options
6
+ */
3
7
  export interface PluginOptions {
8
+ /**
9
+ * Url prefix, e.g.: /api
10
+ */
4
11
  prefix: string;
12
+ /**
13
+ * Callback for getting a PrismaClient for the given request
14
+ */
5
15
  getPrisma: (request: FastifyRequest, reply: FastifyReply) => unknown | Promise<unknown>;
16
+ /**
17
+ * Logger settings
18
+ */
6
19
  logger?: LoggerConfig;
20
+ /**
21
+ * Zod schemas for validating request input. Pass `true` to load from standard location (need to enable `@core/zod` plugin in schema.zmodel).
22
+ */
23
+ zodSchemas?: ModelZodSchema | boolean;
7
24
  }
8
25
  declare const _default: FastifyPluginCallback<PluginOptions, import("fastify").RawServerDefault, import("fastify").FastifyTypeProviderDefault, import("fastify").FastifyBaseLogger>;
9
26
  export default _default;
package/fastify/plugin.js CHANGED
@@ -12,8 +12,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
12
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
13
13
  };
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
+ const zod_1 = require("@zenstackhq/runtime/zod");
15
16
  const fastify_plugin_1 = __importDefault(require("fastify-plugin"));
16
17
  const openapi_1 = require("../openapi");
18
+ /**
19
+ * Fastify plugin for handling CRUD requests.
20
+ */
17
21
  const pluginHandler = (fastify, options, done) => {
18
22
  var _a, _b, _c, _d;
19
23
  const prefix = (_a = options.prefix) !== null && _a !== void 0 ? _a : '';
@@ -23,6 +27,13 @@ const pluginHandler = (fastify, options, done) => {
23
27
  else {
24
28
  (_d = (_c = options.logger) === null || _c === void 0 ? void 0 : _c.info) === null || _d === void 0 ? void 0 : _d.call(_c, `ZenStackPlugin installing routes at prefix: ${prefix}`);
25
29
  }
30
+ let schemas;
31
+ if (typeof options.zodSchemas === 'object') {
32
+ schemas = options.zodSchemas;
33
+ }
34
+ else if (options.zodSchemas === true) {
35
+ schemas = (0, zod_1.getModelZodSchemas)();
36
+ }
26
37
  fastify.all(`${prefix}/*`, (request, reply) => __awaiter(void 0, void 0, void 0, function* () {
27
38
  const prisma = (yield options.getPrisma(request, reply));
28
39
  if (!prisma) {
@@ -36,6 +47,7 @@ const pluginHandler = (fastify, options, done) => {
36
47
  requestBody: request.body,
37
48
  prisma,
38
49
  logger: options.logger,
50
+ zodSchemas: schemas,
39
51
  });
40
52
  reply.status(response.status).send(response.body);
41
53
  }));
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/fastify/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAGA,oEAAgC;AAChC,wCAAyD;AAQzD,MAAM,aAAa,GAAyC,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;;IACnF,MAAM,MAAM,GAAG,MAAA,OAAO,CAAC,MAAM,mCAAI,EAAE,CAAC;IAEpC,IAAI,CAAA,MAAA,OAAO,CAAC,MAAM,0CAAE,IAAI,MAAK,SAAS,EAAE;QACpC,OAAO,CAAC,GAAG,CAAC,+CAA+C,MAAM,EAAE,CAAC,CAAC;KACxE;SAAM;QACH,MAAA,MAAA,OAAO,CAAC,MAAM,0CAAE,IAAI,mDAAG,+CAA+C,MAAM,EAAE,CAAC,CAAC;KACnF;IAED,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,EAAE,CAAO,OAAO,EAAE,KAAK,EAAE,EAAE;QAChD,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAqB,CAAC;QAC7E,IAAI,CAAC,MAAM,EAAE;YACT,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;SAChE;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAA+B,CAAC;QAEtD,MAAM,QAAQ,GAAG,MAAM,IAAA,uBAAa,EAAC;YACjC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,IAAI,EAAG,OAAO,CAAC,MAAc,CAAC,GAAG,CAAC;YAClC,KAAK;YACL,WAAW,EAAE,OAAO,CAAC,IAAI;YACzB,MAAM;YACN,MAAM,EAAE,OAAO,CAAC,MAAM;SACzB,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,EAAE,CAAC;AACX,CAAC,CAAC;AAEF,kBAAe,IAAA,wBAAE,EAAC,aAAa,CAAC,CAAC"}
1
+ {"version":3,"file":"plugin.js","sourceRoot":"","sources":["../../src/fastify/plugin.ts"],"names":[],"mappings":";;;;;;;;;;;;;;AAEA,iDAA6E;AAE7E,oEAAgC;AAChC,wCAAyD;AA2BzD;;GAEG;AACH,MAAM,aAAa,GAAyC,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE;;IACnF,MAAM,MAAM,GAAG,MAAA,OAAO,CAAC,MAAM,mCAAI,EAAE,CAAC;IAEpC,IAAI,CAAA,MAAA,OAAO,CAAC,MAAM,0CAAE,IAAI,MAAK,SAAS,EAAE;QACpC,OAAO,CAAC,GAAG,CAAC,+CAA+C,MAAM,EAAE,CAAC,CAAC;KACxE;SAAM;QACH,MAAA,MAAA,OAAO,CAAC,MAAM,0CAAE,IAAI,mDAAG,+CAA+C,MAAM,EAAE,CAAC,CAAC;KACnF;IAED,IAAI,OAAmC,CAAC;IACxC,IAAI,OAAO,OAAO,CAAC,UAAU,KAAK,QAAQ,EAAE;QACxC,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC;KAChC;SAAM,IAAI,OAAO,CAAC,UAAU,KAAK,IAAI,EAAE;QACpC,OAAO,GAAG,IAAA,wBAAkB,GAAE,CAAC;KAClC;IAED,OAAO,CAAC,GAAG,CAAC,GAAG,MAAM,IAAI,EAAE,CAAO,OAAO,EAAE,KAAK,EAAE,EAAE;QAChD,MAAM,MAAM,GAAG,CAAC,MAAM,OAAO,CAAC,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC,CAAqB,CAAC;QAC7E,IAAI,CAAC,MAAM,EAAE;YACT,MAAM,IAAI,KAAK,CAAC,2CAA2C,CAAC,CAAC;SAChE;QACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAA+B,CAAC;QAEtD,MAAM,QAAQ,GAAG,MAAM,IAAA,uBAAa,EAAC;YACjC,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,IAAI,EAAG,OAAO,CAAC,MAAc,CAAC,GAAG,CAAC;YAClC,KAAK;YACL,WAAW,EAAE,OAAO,CAAC,IAAI;YACzB,MAAM;YACN,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,UAAU,EAAE,OAAO;SACtB,CAAC,CAAC;QAEH,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC,CAAA,CAAC,CAAC;IAEH,IAAI,EAAE,CAAC;AACX,CAAC,CAAC;AAEF,kBAAe,IAAA,wBAAE,EAAC,aAAa,CAAC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import { DbClientContract } from '@zenstackhq/runtime';
2
+ import type { ModelZodSchema } from '@zenstackhq/runtime/zod';
2
3
  type LoggerMethod = (message: string, code?: string) => void;
3
4
  /**
4
5
  * Logger config.
@@ -19,17 +20,27 @@ export type RequestHandlerOptions = {
19
20
  */
20
21
  logger?: LoggerConfig | null;
21
22
  };
23
+ /**
24
+ * OpenApi request context.
25
+ */
22
26
  export type RequestContext = {
23
27
  method: string;
24
28
  path: string;
25
- query: Record<string, string | string[]>;
26
- requestBody: unknown;
29
+ query?: Record<string, string | string[]>;
30
+ requestBody?: unknown;
27
31
  prisma: DbClientContract;
28
32
  logger?: LoggerConfig;
33
+ zodSchemas?: ModelZodSchema;
29
34
  };
35
+ /**
36
+ * OpenApi response.
37
+ */
30
38
  export type Response = {
31
39
  status: number;
32
40
  body: unknown;
33
41
  };
34
- export declare function handleRequest({ method, path, query, requestBody, prisma, logger, }: RequestContext): Promise<Response>;
42
+ /**
43
+ * Handles OpenApi requests
44
+ */
45
+ export declare function handleRequest({ method, path, query, requestBody, prisma, logger, zodSchemas, }: RequestContext): Promise<Response>;
35
46
  export {};
package/openapi/index.js CHANGED
@@ -14,22 +14,47 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
14
14
  Object.defineProperty(exports, "__esModule", { value: true });
15
15
  exports.handleRequest = void 0;
16
16
  const runtime_1 = require("@zenstackhq/runtime");
17
+ const change_case_1 = require("change-case");
17
18
  const tiny_invariant_1 = __importDefault(require("tiny-invariant"));
18
- function logError(logger, message, code) {
19
- if (logger === undefined) {
20
- console.error(`@zenstackhq/openapi: error ${code ? '[' + code + ']' : ''}, ${message}`);
19
+ const zod_validation_error_1 = require("zod-validation-error");
20
+ const utils_1 = require("./utils");
21
+ function getZodSchema(zodSchemas, model, operation) {
22
+ if (zodSchemas[model]) {
23
+ return zodSchemas[model][operation];
21
24
  }
22
- else if (logger === null || logger === void 0 ? void 0 : logger.error) {
23
- logger.error(message, code);
25
+ else if (zodSchemas[(0, change_case_1.capitalCase)(model)]) {
26
+ return zodSchemas[(0, change_case_1.capitalCase)(model)][operation];
27
+ }
28
+ else {
29
+ return undefined;
24
30
  }
25
31
  }
26
- function handleRequest({ method, path, query, requestBody, prisma, logger, }) {
32
+ function zodValidate(zodSchemas, model, operation, args) {
33
+ const zodSchema = zodSchemas && getZodSchema(zodSchemas, model, operation);
34
+ if (zodSchema) {
35
+ const parseResult = zodSchema.safeParse(args);
36
+ if (parseResult.success) {
37
+ return { data: parseResult.data, error: undefined };
38
+ }
39
+ else {
40
+ return { data: undefined, error: (0, zod_validation_error_1.fromZodError)(parseResult.error).message };
41
+ }
42
+ }
43
+ else {
44
+ return { data: args, error: undefined };
45
+ }
46
+ }
47
+ /**
48
+ * Handles OpenApi requests
49
+ */
50
+ function handleRequest({ method, path, query, requestBody, prisma, logger, zodSchemas, }) {
27
51
  var _a, _b;
28
52
  return __awaiter(this, void 0, void 0, function* () {
29
53
  const parts = path.split('/');
30
54
  if (parts.length < 2) {
31
55
  return { status: 400, body: { error: 'invalid request path' } };
32
56
  }
57
+ method = method.toUpperCase();
33
58
  const op = parts.pop();
34
59
  const model = parts.pop();
35
60
  (0, tiny_invariant_1.default)(op);
@@ -44,6 +69,9 @@ function handleRequest({ method, path, query, requestBody, prisma, logger, }) {
44
69
  if (method !== 'POST') {
45
70
  return { status: 400, body: { message: 'invalid request method, only POST is supported' } };
46
71
  }
72
+ if (!requestBody) {
73
+ return { status: 400, body: { message: 'missing request body' } };
74
+ }
47
75
  args = requestBody;
48
76
  // TODO: upsert's status code should be conditional
49
77
  resCode = 201;
@@ -57,13 +85,16 @@ function handleRequest({ method, path, query, requestBody, prisma, logger, }) {
57
85
  if (method !== 'GET') {
58
86
  return { status: 400, body: { message: 'invalid request method, only GET is supported' } };
59
87
  }
60
- args = query.q ? unmarshal(query.q) : {};
88
+ args = (query === null || query === void 0 ? void 0 : query.q) ? unmarshal(query.q) : {};
61
89
  break;
62
90
  case 'update':
63
91
  case 'updateMany':
64
92
  if (method !== 'PUT' && method !== 'PATCH') {
65
93
  return { status: 400, body: { message: 'invalid request method, only PUT AND PATCH are supported' } };
66
94
  }
95
+ if (!requestBody) {
96
+ return { status: 400, body: { message: 'missing request body' } };
97
+ }
67
98
  args = requestBody;
68
99
  break;
69
100
  case 'delete':
@@ -71,16 +102,26 @@ function handleRequest({ method, path, query, requestBody, prisma, logger, }) {
71
102
  if (method !== 'DELETE') {
72
103
  return { status: 400, body: { message: 'invalid request method, only DELETE is supported' } };
73
104
  }
74
- args = query.q ? unmarshal(query.q) : {};
105
+ args = (query === null || query === void 0 ? void 0 : query.q) ? unmarshal(query.q) : {};
75
106
  break;
76
107
  default:
77
108
  return { status: 400, body: { message: 'invalid operation: ' + op } };
78
109
  }
110
+ if (zodSchemas) {
111
+ const { data, error } = zodValidate(zodSchemas, model, dbOp, args);
112
+ if (error) {
113
+ return { status: 400, body: { message: error } };
114
+ }
115
+ else {
116
+ args = data;
117
+ }
118
+ }
79
119
  try {
80
120
  if (!prisma[model]) {
81
121
  return { status: 400, body: { message: `unknown model name: ${model}` } };
82
122
  }
83
123
  const result = yield prisma[model][dbOp](args);
124
+ (0, utils_1.stripAuxFields)(result);
84
125
  return { status: resCode, body: result };
85
126
  }
86
127
  catch (err) {
@@ -137,4 +178,12 @@ exports.handleRequest = handleRequest;
137
178
  function unmarshal(value) {
138
179
  return JSON.parse(value);
139
180
  }
181
+ function logError(logger, message, code) {
182
+ if (logger === undefined) {
183
+ console.error(`@zenstackhq/openapi: error ${code ? '[' + code + ']' : ''}, ${message}`);
184
+ }
185
+ else if (logger === null || logger === void 0 ? void 0 : logger.error) {
186
+ logger.error(message, code);
187
+ }
188
+ }
140
189
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/openapi/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/openapi/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ /**
2
+ * Recursively strip auxiliary fields from the given data.
3
+ */
4
+ export declare function stripAuxFields(data: unknown): void;
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.stripAuxFields = void 0;
4
+ const sdk_1 = require("@zenstackhq/sdk");
5
+ /**
6
+ * Recursively strip auxiliary fields from the given data.
7
+ */
8
+ function stripAuxFields(data) {
9
+ if (Array.isArray(data)) {
10
+ return data.forEach(stripAuxFields);
11
+ }
12
+ else if (data && typeof data === 'object') {
13
+ for (const [key, value] of Object.entries(data)) {
14
+ if (sdk_1.AUXILIARY_FIELDS.includes(key)) {
15
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
16
+ delete data[key];
17
+ }
18
+ else {
19
+ stripAuxFields(value);
20
+ }
21
+ }
22
+ }
23
+ }
24
+ exports.stripAuxFields = stripAuxFields;
25
+ //# sourceMappingURL=utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/openapi/utils.ts"],"names":[],"mappings":";;;AAAA,yCAAmD;AAEnD;;GAEG;AACH,SAAgB,cAAc,CAAC,IAAa;IACxC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QACrB,OAAO,IAAI,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC;KACvC;SAAM,IAAI,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE;QACzC,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAC7C,IAAI,sBAAgB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;gBAChC,8DAA8D;gBAC9D,OAAQ,IAAY,CAAC,GAAG,CAAC,CAAC;aAC7B;iBAAM;gBACH,cAAc,CAAC,KAAK,CAAC,CAAC;aACzB;SACJ;KACJ;AACL,CAAC;AAbD,wCAaC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@zenstackhq/server",
3
- "version": "1.0.0-alpha.71",
3
+ "version": "1.0.0-alpha.74",
4
4
  "displayName": "ZenStack Server-side Adapters",
5
5
  "description": "ZenStack server-side adapters",
6
6
  "homepage": "https://zenstack.dev",
@@ -14,26 +14,29 @@
14
14
  "author": "",
15
15
  "license": "MIT",
16
16
  "dependencies": {
17
+ "change-case": "^4.1.2",
17
18
  "tiny-invariant": "^1.3.1",
18
- "tmp": "^0.2.1",
19
- "@zenstackhq/openapi": "1.0.0-alpha.71",
20
- "@zenstackhq/runtime": "1.0.0-alpha.71",
21
- "@zenstackhq/testtools": "1.0.0-alpha.71"
19
+ "zod-validation-error": "^0.2.1",
20
+ "@zenstackhq/runtime": "1.0.0-alpha.74",
21
+ "@zenstackhq/openapi": "1.0.0-alpha.74",
22
+ "@zenstackhq/sdk": "1.0.0-alpha.74"
22
23
  },
23
24
  "devDependencies": {
25
+ "@types/body-parser": "^1.19.2",
26
+ "@types/express": "^4.17.17",
24
27
  "@types/jest": "^29.4.0",
25
- "@types/react": "^18.0.26",
26
28
  "@types/supertest": "^2.0.12",
29
+ "body-parser": "^1.20.2",
27
30
  "copyfiles": "^2.4.1",
31
+ "express": "^4.18.2",
28
32
  "fastify": "^4.14.1",
29
33
  "fastify-plugin": "^4.5.0",
30
34
  "jest": "^29.4.3",
31
- "react": "^17.0.2 || ^18",
32
35
  "rimraf": "^3.0.2",
33
- "superjson": "^1.11.0",
34
36
  "supertest": "^6.3.3",
35
37
  "ts-jest": "^29.0.5",
36
- "typescript": "^4.9.4"
38
+ "typescript": "^4.9.4",
39
+ "@zenstackhq/testtools": "1.0.0-alpha.74"
37
40
  },
38
41
  "scripts": {
39
42
  "clean": "rimraf dist",