From c4c28e2d097f64bc53576caaa891e6fa74cc2341 Mon Sep 17 00:00:00 2001 From: ymc9 <104139426+ymc9@users.noreply.github.com> Date: Wed, 15 Mar 2023 18:34:28 +0800 Subject: [PATCH] feat: express.js adapter --- README.md | 29 +- package.json | 2 +- packages/language/package.json | 2 +- packages/next/package.json | 2 +- packages/plugins/openapi/package.json | 2 +- packages/plugins/react/package.json | 2 +- packages/plugins/trpc/package.json | 2 +- packages/runtime/package.json | 2 +- packages/runtime/src/zod.ts | 4 +- packages/schema/package.json | 2 +- packages/schema/src/cli/plugin-runner.ts | 2 +- packages/schema/src/res/stdlib.zmodel | 2 +- packages/sdk/package.json | 2 +- packages/server/package.json | 8 +- packages/server/src/express/index.ts | 1 + packages/server/src/express/middleware.ts | 58 +++ packages/server/src/fastify/plugin.ts | 20 +- packages/server/src/openapi/index.ts | 21 +- packages/server/tests/express-adapter.test.ts | 90 +++++ ...plugin.test.ts => fastify-adapter.test.ts} | 28 +- packages/server/tests/open-api.test.ts | 26 +- packages/server/tests/utils.ts | 20 + packages/testtools/package.json | 2 +- pnpm-lock.yaml | 372 ++++++++++++++++++ tests/integration/test-run/package-lock.json | 4 +- 25 files changed, 629 insertions(+), 76 deletions(-) create mode 100644 packages/server/src/express/index.ts create mode 100644 packages/server/src/express/middleware.ts create mode 100644 packages/server/tests/express-adapter.test.ts rename packages/server/tests/{fastify-plugin.test.ts => fastify-adapter.test.ts} (88%) create mode 100644 packages/server/tests/utils.ts diff --git a/README.md b/README.md index 9205a8c44..53f509e5a 100644 --- a/README.md +++ b/README.md @@ -104,12 +104,37 @@ The following diagram gives a high-level overview of how it works. ## Features - Access control and data validation rules right inside your Prisma schema -- Auto-generated RESTful API and client library +- Auto-generated OpenAPI (RESTful) specifications, services, and client libraries - End-to-end type safety - Extensible: custom attributes, functions, and a plugin system -- Framework agnostic +- A framework-agnostic core with framework-specific adapters - Uncompromised performance +### Plugins + +- Prisma schema generator +- Zod schema generator +- React hooks generator +- OpenAPI specification generator +- [tRPC](https://trpc.io) router generator +- 🙋🏻 [Request for a plugin](https://go.zenstack.dev/chat) + +### Framework adapters + +- [Next.js](https://zenstack.dev/docs/reference/server-adapters/next) +- [Fastify](https://zenstack.dev/docs/reference/server-adapters/fastify) +- [ExpressJS](https://zenstack.dev/docs/reference/server-adapters/express) +- Nuxt.js (Future) +- SvelteKit (Future) +- 🙋🏻 [Request for an adapter](https://go.zenstack.dev/chat) + +### Prisma schema extensions + +- [Custom attributes and functions](https://zenstack.dev/docs/reference/zmodel-language#custom-attributes-and-functions) +- Multi-file schema (coming soon) +- String-typed JSON field (coming soon) +- 🙋🏻 [Request for an extension](https://go.zenstack.dev/chat) + ## Examples Check out the [Collaborative Todo App](https://zenstack-todo.vercel.app/) for a running example. You can find the source code below: diff --git a/package.json b/package.json index d8f040dcf..7e97c62b5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "zenstack-monorepo", - "version": "1.0.0-alpha.73", + "version": "1.0.0-alpha.74", "description": "", "scripts": { "build": "pnpm -r build", diff --git a/packages/language/package.json b/packages/language/package.json index d0c886a33..439c5b11f 100644 --- a/packages/language/package.json +++ b/packages/language/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/language", - "version": "1.0.0-alpha.73", + "version": "1.0.0-alpha.74", "displayName": "ZenStack modeling language compiler", "description": "ZenStack modeling language compiler", "homepage": "https://zenstack.dev", diff --git a/packages/next/package.json b/packages/next/package.json index 8d3fe8281..90a4d9f5a 100644 --- a/packages/next/package.json +++ b/packages/next/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/next", - "version": "1.0.0-alpha.73", + "version": "1.0.0-alpha.74", "displayName": "ZenStack Next.js integration", "description": "ZenStack Next.js integration", "homepage": "https://zenstack.dev", diff --git a/packages/plugins/openapi/package.json b/packages/plugins/openapi/package.json index 3d502a4bf..36e4696df 100644 --- a/packages/plugins/openapi/package.json +++ b/packages/plugins/openapi/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/openapi", "displayName": "ZenStack Plugin and Runtime for OpenAPI", - "version": "1.0.0-alpha.73", + "version": "1.0.0-alpha.74", "description": "ZenStack plugin and runtime supporting OpenAPI", "main": "index.js", "repository": { diff --git a/packages/plugins/react/package.json b/packages/plugins/react/package.json index 74af05145..0f0b9d242 100644 --- a/packages/plugins/react/package.json +++ b/packages/plugins/react/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/react", "displayName": "ZenStack plugin and runtime for ReactJS", - "version": "1.0.0-alpha.73", + "version": "1.0.0-alpha.74", "description": "ZenStack plugin and runtime for ReactJS", "main": "index.js", "repository": { diff --git a/packages/plugins/trpc/package.json b/packages/plugins/trpc/package.json index ffa1ca224..98a5db8eb 100644 --- a/packages/plugins/trpc/package.json +++ b/packages/plugins/trpc/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/trpc", "displayName": "ZenStack plugin for tRPC", - "version": "1.0.0-alpha.73", + "version": "1.0.0-alpha.74", "description": "ZenStack plugin for tRPC", "main": "index.js", "repository": { diff --git a/packages/runtime/package.json b/packages/runtime/package.json index 1a0367eb3..b2ab1432c 100644 --- a/packages/runtime/package.json +++ b/packages/runtime/package.json @@ -1,7 +1,7 @@ { "name": "@zenstackhq/runtime", "displayName": "ZenStack Runtime Library", - "version": "1.0.0-alpha.73", + "version": "1.0.0-alpha.74", "description": "Runtime of ZenStack for both client-side and server-side environments.", "repository": { "type": "git", diff --git a/packages/runtime/src/zod.ts b/packages/runtime/src/zod.ts index 0d2375163..15ee465cd 100644 --- a/packages/runtime/src/zod.ts +++ b/packages/runtime/src/zod.ts @@ -14,6 +14,8 @@ export function getModelZodSchemas(): ModelZodSchema { // eslint-disable-next-line @typescript-eslint/no-var-requires return require('.zenstack/zod').default; } catch { - throw new Error('Model meta cannot be loaded'); + throw new Error( + 'Zod schemas cannot be loaded. Please make sure "@core/zod" plugin is enabled in schema.zmodel.' + ); } } diff --git a/packages/schema/package.json b/packages/schema/package.json index 72b23ddd9..118d4fd50 100644 --- a/packages/schema/package.json +++ b/packages/schema/package.json @@ -3,7 +3,7 @@ "publisher": "zenstack", "displayName": "ZenStack Language Tools", "description": "A toolkit for building secure CRUD apps with Next.js + Typescript", - "version": "1.0.0-alpha.73", + "version": "1.0.0-alpha.74", "author": { "name": "ZenStack Team" }, diff --git a/packages/schema/src/cli/plugin-runner.ts b/packages/schema/src/cli/plugin-runner.ts index 721358170..7cf7b999d 100644 --- a/packages/schema/src/cli/plugin-runner.ts +++ b/packages/schema/src/cli/plugin-runner.ts @@ -30,7 +30,7 @@ export class PluginRunner { }> = []; const pluginDecls = context.schema.declarations.filter((d): d is Plugin => isPlugin(d)); - const prereqPlugins = ['@core/prisma', '@core/model-meta', '@core/access-policy', '@core/zod']; + const prereqPlugins = ['@core/prisma', '@core/model-meta', '@core/access-policy']; const allPluginProviders = prereqPlugins.concat( pluginDecls .map((p) => this.getPluginProvider(p)) diff --git a/packages/schema/src/res/stdlib.zmodel b/packages/schema/src/res/stdlib.zmodel index 0e1ad71a1..984f0c1d7 100644 --- a/packages/schema/src/res/stdlib.zmodel +++ b/packages/schema/src/res/stdlib.zmodel @@ -154,7 +154,7 @@ attribute @map(_ name: String) @@@prisma attribute @@map(_ name: String) @@@prisma /* -* Exclude a field from the Prisma Client (for example, a model that you do not want Prisma users to update). +* Exclude a field from the Prisma Client (for example, a field that you do not want Prisma users to update). */ attribute @ignore() @@@prisma diff --git a/packages/sdk/package.json b/packages/sdk/package.json index 2d4e8b028..940f51984 100644 --- a/packages/sdk/package.json +++ b/packages/sdk/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/sdk", - "version": "1.0.0-alpha.73", + "version": "1.0.0-alpha.74", "description": "ZenStack plugin development SDK", "main": "index.js", "scripts": { diff --git a/packages/server/package.json b/packages/server/package.json index d99ea1560..4202ffd16 100644 --- a/packages/server/package.json +++ b/packages/server/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/server", - "version": "1.0.0-alpha.73", + "version": "1.0.0-alpha.74", "displayName": "ZenStack Server-side Adapters", "description": "ZenStack server-side adapters", "homepage": "https://zenstack.dev", @@ -31,13 +31,19 @@ "zod-validation-error": "^0.2.1" }, "devDependencies": { + "@types/body-parser": "^1.19.2", + "@types/express": "^4.17.17", "@types/jest": "^29.4.0", + "@types/supertest": "^2.0.12", "@zenstackhq/testtools": "workspace:*", + "body-parser": "^1.20.2", "copyfiles": "^2.4.1", + "express": "^4.18.2", "fastify": "^4.14.1", "fastify-plugin": "^4.5.0", "jest": "^29.4.3", "rimraf": "^3.0.2", + "supertest": "^6.3.3", "ts-jest": "^29.0.5", "typescript": "^4.9.4" } diff --git a/packages/server/src/express/index.ts b/packages/server/src/express/index.ts new file mode 100644 index 000000000..bccd206a5 --- /dev/null +++ b/packages/server/src/express/index.ts @@ -0,0 +1 @@ +export { default as ZenStackMiddleware } from './middleware'; diff --git a/packages/server/src/express/middleware.ts b/packages/server/src/express/middleware.ts new file mode 100644 index 000000000..54d6e86be --- /dev/null +++ b/packages/server/src/express/middleware.ts @@ -0,0 +1,58 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ +import { DbClientContract } from '@zenstackhq/runtime'; +import { getModelZodSchemas, ModelZodSchema } from '@zenstackhq/runtime/zod'; +import type { Handler, Request, Response } from 'express'; +import { handleRequest, LoggerConfig } from '../openapi'; + +/** + * Express middleware options + */ +export interface MiddlewareOptions { + /** + * Callback for getting a PrismaClient for the given request + */ + getPrisma: (req: Request, res: Response) => unknown | Promise; + + /** + * Logger settings + */ + logger?: LoggerConfig; + + /** + * Zod schemas for validating request input. Pass `true` to load from standard location (need to enable `@core/zod` plugin in schema.zmodel). + */ + zodSchemas?: ModelZodSchema | boolean; +} + +/** + * Creates an Express middleware for handling CRUD requests. + */ +const factory = (options: MiddlewareOptions): Handler => { + let schemas: ModelZodSchema | undefined; + if (typeof options.zodSchemas === 'object') { + schemas = options.zodSchemas; + } else if (options.zodSchemas === true) { + schemas = getModelZodSchemas(); + } + + return async (request, response) => { + const prisma = (await options.getPrisma(request, response)) as DbClientContract; + if (!prisma) { + throw new Error('unable to get prisma from request context'); + } + + const r = await handleRequest({ + method: request.method, + path: request.path, + query: request.query as Record, + requestBody: request.body, + prisma, + logger: options.logger, + zodSchemas: schemas, + }); + + response.status(r.status).json(r.body); + }; +}; + +export default factory; diff --git a/packages/server/src/fastify/plugin.ts b/packages/server/src/fastify/plugin.ts index 37e03c6ad..4999b5d8a 100644 --- a/packages/server/src/fastify/plugin.ts +++ b/packages/server/src/fastify/plugin.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import { DbClientContract } from '@zenstackhq/runtime'; -import { ModelZodSchema } from '@zenstackhq/runtime/zod'; +import { getModelZodSchemas, ModelZodSchema } from '@zenstackhq/runtime/zod'; import { FastifyPluginCallback, FastifyReply, FastifyRequest } from 'fastify'; import fp from 'fastify-plugin'; import { handleRequest, LoggerConfig } from '../openapi'; @@ -15,7 +15,7 @@ export interface PluginOptions { prefix: string; /** - * Callback for gettign a PrismaClient for the given request + * Callback for getting a PrismaClient for the given request */ getPrisma: (request: FastifyRequest, reply: FastifyReply) => unknown | Promise; @@ -25,11 +25,14 @@ export interface PluginOptions { logger?: LoggerConfig; /** - * Path to the generated zod schemas + * Zod schemas for validating request input. Pass `true` to load from standard location (need to enable `@core/zod` plugin in schema.zmodel). */ - zodSchemas?: ModelZodSchema; + zodSchemas?: ModelZodSchema | boolean; } +/** + * Fastify plugin for handling CRUD requests. + */ const pluginHandler: FastifyPluginCallback = (fastify, options, done) => { const prefix = options.prefix ?? ''; @@ -39,6 +42,13 @@ const pluginHandler: FastifyPluginCallback = (fastify, options, d options.logger?.info?.(`ZenStackPlugin installing routes at prefix: ${prefix}`); } + let schemas: ModelZodSchema | undefined; + if (typeof options.zodSchemas === 'object') { + schemas = options.zodSchemas; + } else if (options.zodSchemas === true) { + schemas = getModelZodSchemas(); + } + fastify.all(`${prefix}/*`, async (request, reply) => { const prisma = (await options.getPrisma(request, reply)) as DbClientContract; if (!prisma) { @@ -53,7 +63,7 @@ const pluginHandler: FastifyPluginCallback = (fastify, options, d requestBody: request.body, prisma, logger: options.logger, - zodSchemas: options.zodSchemas, + zodSchemas: schemas, }); reply.status(response.status).send(response.body); diff --git a/packages/server/src/openapi/index.ts b/packages/server/src/openapi/index.ts index d150386b6..3f1dfc09f 100644 --- a/packages/server/src/openapi/index.ts +++ b/packages/server/src/openapi/index.ts @@ -5,7 +5,7 @@ import { isPrismaClientUnknownRequestError, isPrismaClientValidationError, } from '@zenstackhq/runtime'; -import { getModelZodSchemas, ModelZodSchema } from '@zenstackhq/runtime/zod'; +import type { ModelZodSchema } from '@zenstackhq/runtime/zod'; import { capitalCase } from 'change-case'; import invariant from 'tiny-invariant'; import { fromZodError } from 'zod-validation-error'; @@ -55,10 +55,7 @@ export type Response = { body: unknown; }; -function getZodSchema(zodSchemas: ModelZodSchema | undefined, model: string, operation: keyof DbOperations) { - if (!zodSchemas) { - zodSchemas = getModelZodSchemas(); - } +function getZodSchema(zodSchemas: ModelZodSchema, model: string, operation: keyof DbOperations) { if (zodSchemas[model]) { return zodSchemas[model][operation]; } else if (zodSchemas[capitalCase(model)]) { @@ -74,7 +71,7 @@ function zodValidate( operation: keyof DbOperations, args: unknown ) { - const zodSchema = getZodSchema(zodSchemas, model, operation); + const zodSchema = zodSchemas && getZodSchema(zodSchemas, model, operation); if (zodSchema) { const parseResult = zodSchema.safeParse(args); if (parseResult.success) { @@ -168,11 +165,13 @@ export async function handleRequest({ return { status: 400, body: { message: 'invalid operation: ' + op } }; } - const { data, error } = zodValidate(zodSchemas, model, dbOp, args); - if (error) { - return { status: 400, body: { message: error } }; - } else { - args = data; + if (zodSchemas) { + const { data, error } = zodValidate(zodSchemas, model, dbOp, args); + if (error) { + return { status: 400, body: { message: error } }; + } else { + args = data; + } } try { diff --git a/packages/server/tests/express-adapter.test.ts b/packages/server/tests/express-adapter.test.ts new file mode 100644 index 000000000..345e170a3 --- /dev/null +++ b/packages/server/tests/express-adapter.test.ts @@ -0,0 +1,90 @@ +/// + +import { loadSchema } from '@zenstackhq/testtools'; +import bodyParser from 'body-parser'; +import express from 'express'; +import request from 'supertest'; +import { ZenStackMiddleware } from '../src/express'; +import { makeUrl, schema } from './utils'; + +describe('Express adapter tests', () => { + it('run plugin', async () => { + const { prisma, zodSchemas } = await loadSchema(schema); + + const app = express(); + app.use(bodyParser.json()); + app.use('/api', ZenStackMiddleware({ getPrisma: () => prisma, zodSchemas })); + + let r = await request(app).get(makeUrl('/api/post/findMany', { where: { id: { equals: '1' } } })); + expect(r.status).toBe(200); + expect(r.body).toHaveLength(0); + + r = await request(app) + .post('/api/user/create') + .send({ + include: { posts: true }, + data: { + id: 'user1', + email: 'user1@abc.com', + posts: { + create: [ + { title: 'post1', published: true, viewCount: 1 }, + { title: 'post2', published: false, viewCount: 2 }, + ], + }, + }, + }); + + expect(r.status).toBe(201); + expect(r.body).toEqual( + expect.objectContaining({ + email: 'user1@abc.com', + posts: expect.arrayContaining([ + expect.objectContaining({ title: 'post1' }), + expect.objectContaining({ title: 'post2' }), + ]), + }) + ); + // aux fields should have been removed + const data = r.body; + expect(data.zenstack_guard).toBeUndefined(); + expect(data.zenstack_transaction).toBeUndefined(); + expect(data.posts[0].zenstack_guard).toBeUndefined(); + expect(data.posts[0].zenstack_transaction).toBeUndefined(); + + r = await request(app).get(makeUrl('/api/post/findMany')); + expect(r.status).toBe(200); + expect(r.body).toHaveLength(2); + + r = await request(app).get(makeUrl('/api/post/findMany', { where: { viewCount: { gt: 1 } } })); + expect(r.status).toBe(200); + expect(r.body).toHaveLength(1); + + r = await request(app) + .put('/api/user/update') + .send({ where: { id: 'user1' }, data: { email: 'user1@def.com' } }); + expect(r.status).toBe(200); + expect(r.body.email).toBe('user1@def.com'); + + r = await request(app).get(makeUrl('/api/post/count', { where: { viewCount: { gt: 1 } } })); + expect(r.status).toBe(200); + expect(r.body).toBe(1); + + r = await request(app).get(makeUrl('/api/post/aggregate', { _sum: { viewCount: true } })); + expect(r.status).toBe(200); + expect(r.body._sum.viewCount).toBe(3); + + r = await request(app).get(makeUrl('/api/post/groupBy', { by: ['published'], _sum: { viewCount: true } })); + expect(r.status).toBe(200); + expect(r.body).toEqual( + expect.arrayContaining([ + expect.objectContaining({ published: true, _sum: { viewCount: 1 } }), + expect.objectContaining({ published: false, _sum: { viewCount: 2 } }), + ]) + ); + + r = await request(app).delete(makeUrl('/api/user/deleteMany', { where: { id: 'user1' } })); + expect(r.status).toBe(200); + expect(r.body.count).toBe(1); + }); +}); diff --git a/packages/server/tests/fastify-plugin.test.ts b/packages/server/tests/fastify-adapter.test.ts similarity index 88% rename from packages/server/tests/fastify-plugin.test.ts rename to packages/server/tests/fastify-adapter.test.ts index 8b6f4e120..45c08100c 100644 --- a/packages/server/tests/fastify-plugin.test.ts +++ b/packages/server/tests/fastify-adapter.test.ts @@ -1,31 +1,11 @@ /// +import { loadSchema } from '@zenstackhq/testtools'; import fastify from 'fastify'; import { ZenStackFastifyPlugin } from '../src/fastify'; -import { loadSchema } from '@zenstackhq/testtools'; - -const schema = ` -model User { - id String @id @default(cuid()) - email String @unique - posts Post[] -} - -model Post { - id String @id @default(cuid()) - title String - author User? @relation(fields: [authorId], references: [id]) - authorId String? - published Boolean @default(false) - viewCount Int @default(0) -} -`; +import { makeUrl, schema } from './utils'; -function makeUrl(path: string, q?: object) { - return q ? `${path}?q=${encodeURIComponent(JSON.stringify(q))}` : path; -} - -describe('Fastify plugin tests', () => { +describe('Fastify adapter tests', () => { it('run plugin', async () => { const { prisma, zodSchemas } = await loadSchema(schema); @@ -60,7 +40,6 @@ describe('Fastify plugin tests', () => { }, }, }); - expect(r.statusCode).toBe(201); expect(r.json()).toEqual( expect.objectContaining({ @@ -71,7 +50,6 @@ describe('Fastify plugin tests', () => { ]), }) ); - // aux fields should have been removed const data = r.json(); expect(data.zenstack_guard).toBeUndefined(); diff --git a/packages/server/tests/open-api.test.ts b/packages/server/tests/open-api.test.ts index dee845e03..89e563958 100644 --- a/packages/server/tests/open-api.test.ts +++ b/packages/server/tests/open-api.test.ts @@ -3,23 +3,7 @@ import { loadSchema } from '@zenstackhq/testtools'; import { handleRequest } from '../src/openapi'; - -const schema = ` -model User { - id String @id @default(cuid()) - email String @unique - posts Post[] -} - -model Post { - id String @id @default(cuid()) - title String - author User? @relation(fields: [authorId], references: [id]) - authorId String? - published Boolean @default(false) - viewCount Int @default(0) -} -`; +import { schema } from './utils'; describe('OpenAPI server tests', () => { it('crud', async () => { @@ -148,10 +132,18 @@ describe('OpenAPI server tests', () => { it('validation error', async () => { const { prisma, zodSchemas } = await loadSchema(schema); + // without validation let r = await handleRequest({ method: 'get', path: '/api/post/findUnique', prisma, + }); + expect(r.status).toBe(400); + + r = await handleRequest({ + method: 'get', + path: '/api/post/findUnique', + prisma, zodSchemas, }); expect(r.status).toBe(400); diff --git a/packages/server/tests/utils.ts b/packages/server/tests/utils.ts new file mode 100644 index 000000000..48b00c7a5 --- /dev/null +++ b/packages/server/tests/utils.ts @@ -0,0 +1,20 @@ +export const schema = ` +model User { + id String @id @default(cuid()) + email String @unique + posts Post[] +} + +model Post { + id String @id @default(cuid()) + title String + author User? @relation(fields: [authorId], references: [id]) + authorId String? + published Boolean @default(false) + viewCount Int @default(0) +} +`; + +export function makeUrl(path: string, q?: object) { + return q ? `${path}?q=${encodeURIComponent(JSON.stringify(q))}` : path; +} diff --git a/packages/testtools/package.json b/packages/testtools/package.json index 3df6f673c..deba69c67 100644 --- a/packages/testtools/package.json +++ b/packages/testtools/package.json @@ -1,6 +1,6 @@ { "name": "@zenstackhq/testtools", - "version": "1.0.0-alpha.73", + "version": "1.0.0-alpha.74", "description": "ZenStack Test Tools", "main": "index.js", "publishConfig": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f1ac5d157..c0de0fda4 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -354,17 +354,23 @@ importers: packages/server: specifiers: + '@types/body-parser': ^1.19.2 + '@types/express': ^4.17.17 '@types/jest': ^29.4.0 + '@types/supertest': ^2.0.12 '@zenstackhq/openapi': workspace:* '@zenstackhq/runtime': workspace:* '@zenstackhq/sdk': workspace:* '@zenstackhq/testtools': workspace:* + body-parser: ^1.20.2 change-case: ^4.1.2 copyfiles: ^2.4.1 + express: ^4.18.2 fastify: ^4.14.1 fastify-plugin: ^4.5.0 jest: ^29.4.3 rimraf: ^3.0.2 + supertest: ^6.3.3 tiny-invariant: ^1.3.1 ts-jest: ^29.0.5 typescript: ^4.9.4 @@ -377,13 +383,19 @@ importers: tiny-invariant: 1.3.1 zod-validation-error: 0.2.1_zod@3.19.1 devDependencies: + '@types/body-parser': 1.19.2 + '@types/express': 4.17.17 '@types/jest': 29.4.0 + '@types/supertest': 2.0.12 '@zenstackhq/testtools': link:../testtools/dist + body-parser: 1.20.2 copyfiles: 2.4.1 + express: 4.18.2 fastify: 4.14.1 fastify-plugin: 4.5.0 jest: 29.4.3 rimraf: 3.0.2 + supertest: 6.3.3 ts-jest: 29.0.5_62v6np7q4ngunzmn4ekotpxy7y typescript: 4.9.5 publishDirectory: dist @@ -2729,6 +2741,19 @@ packages: /@types/bcryptjs/2.4.2: resolution: {integrity: sha512-LiMQ6EOPob/4yUL66SZzu6Yh77cbzJFYll+ZfaPiPPFswtIlA/Fs1MzdKYA7JApHU49zQTbJGX3PDmCpIdDBRQ==} + /@types/body-parser/1.19.2: + resolution: {integrity: sha512-ALYone6pm6QmwZoAgeyNksccT9Q4AWZQ6PvfwR37GT6r6FWUPguq6sUmNGSMV2Wr761oQoBxwGGa6DR5o1DC9g==} + dependencies: + '@types/connect': 3.4.35 + '@types/node': 18.14.2 + dev: true + + /@types/connect/3.4.35: + resolution: {integrity: sha512-cdeYyv4KWoEgpBISTxWvqYsVy444DOqehiF3fM3ne10AmJ62RSyNkUnxMJXHQWRQQX2eR94m5y1IZyDwBjV9FQ==} + dependencies: + '@types/node': 18.14.2 + dev: true + /@types/cookiejar/2.1.2: resolution: {integrity: sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==} dev: true @@ -2743,6 +2768,23 @@ packages: dependencies: '@types/ms': 0.7.31 + /@types/express-serve-static-core/4.17.33: + resolution: {integrity: sha512-TPBqmR/HRYI3eC2E5hmiivIzv+bidAfXofM+sbonAGvyDhySGw9/PQZFt2BLOrjUUR++4eJVpx6KnLQK1Fk9tA==} + dependencies: + '@types/node': 18.14.2 + '@types/qs': 6.9.7 + '@types/range-parser': 1.2.4 + dev: true + + /@types/express/4.17.17: + resolution: {integrity: sha512-Q4FmmuLGBG58btUnfS1c1r/NQdlp3DMfGDGig8WhfpA2YRUtEkxAjkZb0yvplJGYdF1fsQ81iMDcH24sSCNC/Q==} + dependencies: + '@types/body-parser': 1.19.2 + '@types/express-serve-static-core': 4.17.33 + '@types/qs': 6.9.7 + '@types/serve-static': 1.15.1 + dev: true + /@types/fs-extra/11.0.1: resolution: {integrity: sha512-MxObHvNl4A69ofaTRU8DFqvgzzv8s9yRtaPPm5gud9HDNvpB3GPQFvNuTWAI59B9huVGV5jXYJwbCsmBsOGYWA==} dependencies: @@ -2809,6 +2851,10 @@ packages: '@types/node': 18.14.2 dev: true + /@types/mime/3.0.1: + resolution: {integrity: sha512-Y4XFY5VJAuw0FgAqPNd6NNoV44jbq9Bz2L7Rh/J6jLTiHBSBJa9fxqQIvkIld4GsoDOcCbvzOUAbLPsSKKg+uA==} + dev: true + /@types/minimist/1.2.2: resolution: {integrity: sha512-jhuKLIRrhvCPLqwPcx6INqmKeiA5EWrsCOPhrlFSrbrmU4ZMPjj5Ul/oLCMDO98XRUIwVm78xICz4EPCektzeQ==} dev: true @@ -2853,6 +2899,14 @@ packages: resolution: {integrity: sha512-JCB8C6SnDoQf0cNycqd/35A7MjcnK+ZTqE7judS6o7utxUCg6imJg3QK2qzHKszlTjcj2cn+NwMB2i96ubpj7w==} dev: true + /@types/qs/6.9.7: + resolution: {integrity: sha512-FGa1F62FT09qcrueBA6qYTrJPVDzah9a+493+o2PCXsesWHIn27G98TsSMs3WPNbZIEj4+VJf6saSFpvD+3Zsw==} + dev: true + + /@types/range-parser/1.2.4: + resolution: {integrity: sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==} + dev: true + /@types/react/18.0.26: resolution: {integrity: sha512-hCR3PJQsAIXyxhTNSiDFY//LhnMZWpNNr5etoCqx/iUfGc5gXWtQR2Phl908jVR6uPXacojQWTg4qRpkxTuGug==} dependencies: @@ -2876,6 +2930,13 @@ packages: resolution: {integrity: sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==} dev: true + /@types/serve-static/1.15.1: + resolution: {integrity: sha512-NUo5XNiAdULrJENtJXZZ3fHtfMolzZwczzBbnAeBbqBwG+LaG6YaJtuwzwGSQZ2wsCrxjEhNNjAkKigy3n8teQ==} + dependencies: + '@types/mime': 3.0.1 + '@types/node': 18.14.2 + dev: true + /@types/stack-utils/2.0.1: resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} dev: true @@ -3232,6 +3293,14 @@ packages: resolution: {integrity: sha512-2BjRTZxTPvheOvGbBslFSYOUkr+SjPtOnrLP33f+VIWLzezQpZcqVg7ja3L4dBXmzzgwT+a029jRx5PCi3JuiA==} dev: true + /accepts/1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + dev: true + /acorn-jsx/5.3.2_acorn@8.8.0: resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} peerDependencies: @@ -3409,6 +3478,10 @@ packages: engines: {node: '>=12.17'} dev: true + /array-flatten/1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + dev: true + /array-union/2.1.0: resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} engines: {node: '>=8'} @@ -3679,6 +3752,46 @@ packages: inherits: 2.0.4 readable-stream: 3.6.0 + /body-parser/1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /body-parser/1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /boolbase/1.0.0: resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} dev: true @@ -3755,6 +3868,11 @@ packages: dependencies: streamsearch: 1.1.0 + /bytes/3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + dev: true + /call-bind/1.0.2: resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} dependencies: @@ -4123,6 +4241,18 @@ packages: upper-case: 2.0.2 dev: false + /content-disposition/0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + dev: true + + /content-type/1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + dev: true + /convert-source-map/1.9.0: resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} @@ -4130,6 +4260,10 @@ packages: resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} dev: true + /cookie-signature/1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + dev: true + /cookie/0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} @@ -4260,6 +4394,17 @@ packages: engines: {node: '>=0.11'} dev: true + /debug/2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + dev: true + /debug/4.3.4: resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -4350,6 +4495,16 @@ packages: engines: {node: '>=0.4.0'} dev: true + /depd/2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + dev: true + + /destroy/1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dev: true + /detect-indent/6.1.0: resolution: {integrity: sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==} engines: {node: '>=8'} @@ -4448,6 +4603,10 @@ packages: resolution: {integrity: sha512-7GO6HghkA5fYG9TYnNxi14/7K9f5occMlp3zXAuSxn7CKCxt9xbNWG7yF8hTCSUchlfWSe3uLmlPfigevRItzQ==} engines: {node: '>=12'} + /ee-first/1.1.1: + resolution: {integrity: sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=} + dev: true + /electron-to-chromium/1.4.284: resolution: {integrity: sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==} @@ -4464,6 +4623,11 @@ packages: /emoji-regex/8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + /encodeurl/1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + dev: true + /end-of-stream/1.4.4: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: @@ -4771,6 +4935,10 @@ packages: resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} engines: {node: '>=6'} + /escape-html/1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + dev: true + /escape-string-regexp/1.0.5: resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} engines: {node: '>=0.8.0'} @@ -5079,6 +5247,11 @@ packages: engines: {node: '>=0.10.0'} dev: true + /etag/1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + dev: true + /event-target-shim/5.0.1: resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} engines: {node: '>=6'} @@ -5157,6 +5330,45 @@ packages: jest-util: 29.4.3 dev: true + /express/4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: true + /extendable-error/0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} dev: true @@ -5301,6 +5513,21 @@ packages: dependencies: to-regex-range: 5.0.1 + /finalhandler/1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: true + /find-cache-dir/3.3.2: resolution: {integrity: sha512-wXZV5emFEjrridIgED11OoUKLxiYjAcqot/NJdAkOhlJ+vGzwhOAfcG5OX1jP+S0PcjEn8bdMJv+g2jwQ3Onig==} engines: {node: '>=8'} @@ -5390,6 +5617,11 @@ packages: /fp-ts/2.13.1: resolution: {integrity: sha512-0eu5ULPS2c/jsa1lGFneEFFEdTbembJv8e4QKXeVJ3lm/5hyve06dlKZrpxmMwJt6rYen7sxmHHK2CLaXvWuWQ==} + /fresh/0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + dev: true + /fs-constants/1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} @@ -5679,6 +5911,17 @@ packages: entities: 4.4.0 dev: true + /http-errors/2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + dev: true + /http-proxy-agent/5.0.0: resolution: {integrity: sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==} engines: {node: '>= 6'} @@ -7819,6 +8062,11 @@ packages: resolution: {integrity: sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==} dev: true + /media-typer/0.3.0: + resolution: {integrity: sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=} + engines: {node: '>= 0.6'} + dev: true + /meow/6.1.1: resolution: {integrity: sha512-3YffViIt2QWgTy6Pale5QpopX/IvU3LPL03jOTqp6pGj3VjesdO/U8CuHMKpnQr4shCNCM5fd5XFFvIIl6JBHg==} engines: {node: '>=8'} @@ -7836,6 +8084,10 @@ packages: yargs-parser: 18.1.3 dev: true + /merge-descriptors/1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + dev: true + /merge-stream/2.0.0: resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} @@ -7939,6 +8191,10 @@ packages: engines: {node: '>=10'} hasBin: true + /ms/2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + dev: true + /ms/2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} @@ -7971,6 +8227,11 @@ packages: resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} dev: true + /negotiator/0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + dev: true + /new-github-issue-url/0.2.1: resolution: {integrity: sha512-md4cGoxuT4T4d/HDOXbrUHkTKrp/vp+m3aOA7XXVYwNsUNMK49g3SQicTSeV5GIz/5QVGAeYRAOlyp9OvlgsYA==} engines: {node: '>=10'} @@ -8113,6 +8374,13 @@ packages: resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==} dev: true + /on-finished/2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + dev: true + /once/1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} dependencies: @@ -8262,6 +8530,11 @@ packages: entities: 4.4.0 dev: true + /parseurl/1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + dev: true + /pascal-case/3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} dependencies: @@ -8295,6 +8568,10 @@ packages: /path-parse/1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + /path-to-regexp/0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + dev: true + /path-type/4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -8542,6 +8819,31 @@ packages: engines: {node: '>=8'} dev: true + /range-parser/1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + dev: true + + /raw-body/2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + + /raw-body/2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: true + /rc/1.2.8: resolution: {integrity: sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==} hasBin: true @@ -8864,6 +9166,27 @@ packages: dependencies: lru-cache: 6.0.0 + /send/0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + dev: true + /sentence-case/3.0.4: resolution: {integrity: sha512-8LS0JInaQMCRoQ7YUytAo/xUu5W2XnQxV2HI/6uM6U7CITS1RqPElr30V6uIqyMKM9lJGRVFy5/4CuzcixNYSg==} dependencies: @@ -8872,6 +9195,18 @@ packages: upper-case-first: 2.0.2 dev: false + /serve-static/1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + dev: true + /set-blocking/2.0.0: resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} dev: true @@ -8880,6 +9215,10 @@ packages: resolution: {integrity: sha512-1jeBGaKNGdEq4FgIrORu/N570dwoPYio8lSoYLWmX7sQ//0JY08Xh9o5pBcgmHQ/MbsYp/aZnOe1s1lIsbLprQ==} dev: true + /setprototypeof/1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + dev: true + /shebang-command/1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} engines: {node: '>=0.10.0'} @@ -9035,6 +9374,11 @@ packages: escape-string-regexp: 2.0.0 dev: true + /statuses/2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + dev: true + /stream-read-all/3.0.1: resolution: {integrity: sha512-EWZT9XOceBPlVJRrYcykW8jyRSZYbkb/0ZK36uLEmoWVO5gxBOnntNTseNzfREsqxqdfEGQrD8SXQ3QWbBmq8A==} engines: {node: '>=10'} @@ -9360,6 +9704,11 @@ packages: dependencies: is-number: 7.0.0 + /toidentifier/1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + dev: true + /tr46/0.0.3: resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} @@ -9693,6 +10042,14 @@ packages: resolution: {integrity: sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==} engines: {node: '>=8'} + /type-is/1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + dev: true + /typed-array-length/1.0.4: resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} dependencies: @@ -9792,6 +10149,11 @@ packages: resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} engines: {node: '>= 10.0.0'} + /unpipe/1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + dev: true + /untildify/4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} engines: {node: '>=8'} @@ -9839,6 +10201,11 @@ packages: /util-deprecate/1.0.2: resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + /utils-merge/1.0.1: + resolution: {integrity: sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=} + engines: {node: '>= 0.4.0'} + dev: true + /uuid/3.4.0: resolution: {integrity: sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==} deprecated: Please upgrade to version 7 or higher. Older versions may use Math.random() in certain circumstances, which is known to be problematic. See https://v8.dev/blog/math-random for details. @@ -9871,6 +10238,11 @@ packages: spdx-correct: 3.1.1 spdx-expression-parse: 3.0.1 + /vary/1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + dev: true + /vsce/2.15.0: resolution: {integrity: sha512-P8E9LAZvBCQnoGoizw65JfGvyMqNGlHdlUXD1VAuxtvYAaHBKLBdKPnpy60XKVDAkQCfmMu53g+gq9FM+ydepw==} engines: {node: '>= 14'} diff --git a/tests/integration/test-run/package-lock.json b/tests/integration/test-run/package-lock.json index 123f67a13..4ca1a9d9d 100644 --- a/tests/integration/test-run/package-lock.json +++ b/tests/integration/test-run/package-lock.json @@ -126,7 +126,7 @@ }, "../../../packages/runtime/dist": { "name": "@zenstackhq/runtime", - "version": "1.0.0-alpha.73", + "version": "1.0.0-alpha.74", "license": "MIT", "dependencies": { "@types/bcryptjs": "^2.4.2", @@ -156,7 +156,7 @@ }, "../../../packages/schema/dist": { "name": "zenstack", - "version": "1.0.0-alpha.73", + "version": "1.0.0-alpha.74", "hasInstallScript": true, "license": "MIT", "dependencies": {