diff --git a/docs/docs/quickstart.md b/docs/docs/quickstart.md index 941c89ec9..46230eb8a 100644 --- a/docs/docs/quickstart.md +++ b/docs/docs/quickstart.md @@ -114,6 +114,7 @@ import { remultHapi } from 'remult/remult-hapi' ```ts [Hono] import { Hono } from 'hono' +import { serve } from '@hono/node-server' import { remultHono } from 'remult/remult-hono' const app = new Hono() @@ -121,7 +122,7 @@ const app = new Hono() const api = remultHono({}) // [!code highlight] app.route('', api) // [!code highlight] -export default app +serve(app) ``` ```ts [Nest] diff --git a/package-lock.json b/package-lock.json index 2b13c4cf9..8b14dd212 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,18 @@ { "name": "remult-mono-repo", - "version": "0.26.2", + "version": "0.26.3-exp.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "remult-mono-repo", - "version": "0.26.2", + "version": "0.26.3-exp.0", "devDependencies": { "@fastify/express": "^2.0.1", "@fastify/middie": "^8.0.0", "@fastify/swagger-ui": "^1.8.1", "@hapi/hapi": "^21.3.2", - "@hono/node-server": "^1.8.2", + "@hono/node-server": "^1.11.0", "@koa/router": "^12.0.0", "@microsoft/fetch-event-source": "^2.0.1", "@paralleldrive/cuid2": "^2.2.1", @@ -52,7 +52,7 @@ "fastify-plugin": "^4.0.0", "graphql": "^15.8.0", "graphql-yoga": "^3.9.1", - "hono": "^4.0.9", + "hono": "^4.2.5", "knex": "^2.4.0", "koa": "^2.13.4", "koa-bodyparser": "^4.3.0", @@ -2819,9 +2819,9 @@ } }, "node_modules/@hono/node-server": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.8.2.tgz", - "integrity": "sha512-h8l2TBLCPHZBUrrkosZ6L5CpBLj6zdESyF4B+zngiCDF7aZFQJ0alVbLx7jn8PCVi9EyoFf8a4hOZFi1tD95EA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.11.0.tgz", + "integrity": "sha512-TLIJq9TMtD1NEG1mVoqNUn1Ita0qSaB5XboZErjFBcO/GJYXwWY4dVdTi9G0lbxtu0x+hJXDItcLaFHb7rlFTw==", "dev": true, "engines": { "node": ">=18.14.1" @@ -14189,9 +14189,9 @@ "dev": true }, "node_modules/hono": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.0.9.tgz", - "integrity": "sha512-XkFx6y6jAl08bGmoy53oGtHl8eHUixvmBulfcghrSySoJD3cW4UfFUa7JDGLOsIeJUv/a9d2pBFQUX7rzRnjvA==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.2.5.tgz", + "integrity": "sha512-uonJD3i/yy005kQ7bPZRVfG3rejYJwyPqBmPoUGijS4UB/qM+YlrZ7xzSWy+ByDu9buGHUG+f+SKzz03Y6V1Kw==", "dev": true, "engines": { "node": ">=16.0.0" @@ -29939,9 +29939,9 @@ } }, "@hono/node-server": { - "version": "1.8.2", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.8.2.tgz", - "integrity": "sha512-h8l2TBLCPHZBUrrkosZ6L5CpBLj6zdESyF4B+zngiCDF7aZFQJ0alVbLx7jn8PCVi9EyoFf8a4hOZFi1tD95EA==", + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.11.0.tgz", + "integrity": "sha512-TLIJq9TMtD1NEG1mVoqNUn1Ita0qSaB5XboZErjFBcO/GJYXwWY4dVdTi9G0lbxtu0x+hJXDItcLaFHb7rlFTw==", "dev": true }, "@humanwhocodes/config-array": { @@ -38228,9 +38228,9 @@ "dev": true }, "hono": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.0.9.tgz", - "integrity": "sha512-XkFx6y6jAl08bGmoy53oGtHl8eHUixvmBulfcghrSySoJD3cW4UfFUa7JDGLOsIeJUv/a9d2pBFQUX7rzRnjvA==", + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/hono/-/hono-4.2.5.tgz", + "integrity": "sha512-uonJD3i/yy005kQ7bPZRVfG3rejYJwyPqBmPoUGijS4UB/qM+YlrZ7xzSWy+ByDu9buGHUG+f+SKzz03Y6V1Kw==", "dev": true }, "hookable": { diff --git a/package.json b/package.json index f4a674e2e..3db48692a 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "remult-mono-repo", "description": "See projects/core for the remult core package.json. This package.json is used for remult/core development, test projects and experimental work. See ", - "version": "0.26.2", + "version": "0.26.3-exp.0", "scripts": { "format": "prettier \"./projects/core/**\" --write", "test": "vitest --ui --coverage", @@ -39,7 +39,7 @@ "@fastify/middie": "^8.0.0", "@fastify/swagger-ui": "^1.8.1", "@hapi/hapi": "^21.3.2", - "@hono/node-server": "^1.8.2", + "@hono/node-server": "^1.11.0", "@koa/router": "^12.0.0", "@microsoft/fetch-event-source": "^2.0.1", "@paralleldrive/cuid2": "^2.2.1", @@ -79,7 +79,7 @@ "fastify-plugin": "^4.0.0", "graphql": "^15.8.0", "graphql-yoga": "^3.9.1", - "hono": "^4.0.9", + "hono": "^4.2.5", "knex": "^2.4.0", "koa": "^2.13.4", "koa-bodyparser": "^4.3.0", diff --git a/projects/core/remult-hono.ts b/projects/core/remult-hono.ts index 8ea2e0258..bb7ac0c24 100644 --- a/projects/core/remult-hono.ts +++ b/projects/core/remult-hono.ts @@ -41,7 +41,6 @@ export function remultHono( let honoRouter: GenericRouter = { route(path) { - if (path.endsWith('*')) path = path.substring(0, path.length - 1) + '.*' let r = { get(handler) { app.get(path, honoHandler(handler)) @@ -78,7 +77,7 @@ export function remultHono( }, end: () => { if (sse) sse.close() - else res(c.text('')) + else res(c.body(null)) }, send: (data: string) => { res(c.html(data)) diff --git a/projects/core/server/expressBridge.ts b/projects/core/server/expressBridge.ts index 4b8c0fe49..fca3cbcff 100644 --- a/projects/core/server/expressBridge.ts +++ b/projects/core/server/expressBridge.ts @@ -404,8 +404,8 @@ export class RemultServerImplementation r, ) if (this.options.admin !== undefined && this.options.admin !== false) { - r.route(this.options.rootPath + '/admin*').get( - this.process(async (remult, req, res, orig, origResponse) => { + const admin = this.process( + async (remult, req, res, orig, origResponse) => { if (remult.isAllowed(this.options.admin)) origResponse.send( remultAdminHtml({ @@ -415,8 +415,11 @@ export class RemultServerImplementation }), ) else res.notFound() - }), + }, ) + r.route(this.options.rootPath + '/admin/:id').get(admin) + r.route(this.options.rootPath + '/admin/').get(admin) + r.route(this.options.rootPath + '/admin').get(admin) } if (this.options.subscriptionServer instanceof SseSubscriptionServer) { const streamPath = this.options.rootPath + '/' + streamUrl diff --git a/projects/core/src/remult3/remult3.ts b/projects/core/src/remult3/remult3.ts index 2c54be219..58cbe7bdc 100644 --- a/projects/core/src/remult3/remult3.ts +++ b/projects/core/src/remult3/remult3.ts @@ -818,6 +818,7 @@ export type ClassFieldDecorator = ( //y1 - fix async hooks - was it fixed? //p1 - consider upsert (where,set) //p1 - consider id to also support keyof (id:['company','index']) +//p1 - wait a second to close stream //p1 - reconsider update many, maybe the second parameter should be in a set option - break existing //p1 - add documentation for bun sqlite @@ -829,7 +830,7 @@ export type ClassFieldDecorator = ( //p1 - maybe add decorator comment in the readme as well (I heard you've lost me in decorators) - and improve the describeClass function //p1 - return error on connection error //p1 - consider including the admin in the tutorial - and maybe even in the demo when we setup the api -//p1 - +//p2 -fix remult admin not to load the html into memory until used //y2 - JY suggestion of having generate as part of the ensure schema - not sure //y2 - currently for string fields we default for 255 in knex (which is their default) why not just use text (varchar max) - and only use exact length when one is provided? diff --git a/projects/test-servers/deno-fresh/routes/api/_middleware.ts b/projects/test-servers/deno-fresh/routes/api/_middleware.ts index cbe27f548..9e1e0fb64 100644 --- a/projects/test-servers/deno-fresh/routes/api/_middleware.ts +++ b/projects/test-servers/deno-fresh/routes/api/_middleware.ts @@ -6,6 +6,7 @@ import { Task } from '../../shared/task.ts' export const api = remultFresh( { entities: [Task], + admin:true }, Response, ) diff --git a/projects/test-servers/next-server/src/pages/api/[...remult].ts b/projects/test-servers/next-server/src/pages/api/[...remult].ts index f607dc6ac..8d35cdaeb 100644 --- a/projects/test-servers/next-server/src/pages/api/[...remult].ts +++ b/projects/test-servers/next-server/src/pages/api/[...remult].ts @@ -3,4 +3,5 @@ import { Task } from '../../shared/Task' export default remultNext({ entities: [Task], + admin: true, }) diff --git a/projects/test-servers/node-servers/hapiServer.ts b/projects/test-servers/node-servers/hapiServer.ts index 9a0c8000a..340f10613 100644 --- a/projects/test-servers/node-servers/hapiServer.ts +++ b/projects/test-servers/node-servers/hapiServer.ts @@ -59,7 +59,7 @@ const init = async () => { host: '127.0.0.1', }) - const api = remultHapi({ entities: [Task] }) + const api = remultHapi({ entities: [Task], admin: true }) await server.register(api) await server.register({ plugin: routesPlugin, diff --git a/projects/test-servers/node-servers/koaServer.ts b/projects/test-servers/node-servers/koaServer.ts index de9ae6d73..97b5eb7d3 100644 --- a/projects/test-servers/node-servers/koaServer.ts +++ b/projects/test-servers/node-servers/koaServer.ts @@ -6,7 +6,7 @@ import { Task } from '../shared/Task' const app = new koa() -const api = createRemultServer({ entities: [Task] }) +const api = createRemultServer({ entities: [Task], admin: true }) app.use(bodyParser()) app.use(async (ctx, next) => { const r = await api.handle(ctx.request) diff --git a/projects/test-servers/node-servers/middlewareCore.ts b/projects/test-servers/node-servers/middlewareCore.ts index 90b8a448c..65a5598da 100644 --- a/projects/test-servers/node-servers/middlewareCore.ts +++ b/projects/test-servers/node-servers/middlewareCore.ts @@ -7,7 +7,7 @@ const app = express() app.use(express.json()) const api = createRemultServerCore( - { entities: [Task] }, + { entities: [Task], admin: true }, { buildGenericRequestInfo: (req) => req, getRequestBody: (req) => req.body, diff --git a/projects/test-servers/node-servers/middlewareServer.ts b/projects/test-servers/node-servers/middlewareServer.ts index 7e02ec01b..6aaf02bbb 100644 --- a/projects/test-servers/node-servers/middlewareServer.ts +++ b/projects/test-servers/node-servers/middlewareServer.ts @@ -6,7 +6,7 @@ import { Task } from '../shared/Task' const app = express() app.use(express.json()) -const api = createRemultServer({ entities: [Task] }) +const api = createRemultServer({ entities: [Task], admin: true }) app.use(async (req, res, next) => { ;(await api.handle(req, res)) || next() }) diff --git a/projects/test-servers/nuxt-server/package-lock.json b/projects/test-servers/nuxt-server/package-lock.json index fcebf86ea..38201c4a0 100644 --- a/projects/test-servers/nuxt-server/package-lock.json +++ b/projects/test-servers/nuxt-server/package-lock.json @@ -10,7 +10,7 @@ "remult": "^0.23.0-esm.8" }, "devDependencies": { - "@nuxt/devtools": "*", + "@nuxt/devtools": "latest", "nuxt": "^3.9.0", "vue": "^3.3.13", "vue-router": "^4.2.5" diff --git a/projects/tests/backend-tests/all-server-tests.ts b/projects/tests/backend-tests/all-server-tests.ts index a1d3c33a0..314d2de89 100644 --- a/projects/tests/backend-tests/all-server-tests.ts +++ b/projects/tests/backend-tests/all-server-tests.ts @@ -85,7 +85,9 @@ export function allServerTests( 'delete many', withRemultForTest(async () => { await create3Tasks() - expect(await repo(Task).deleteMany({ where: { title: ['a', 'c'] } })).toBe(2) + expect( + await repo(Task).deleteMany({ where: { title: ['a', 'c'] } }), + ).toBe(2) expect(await repo(Task).count()).toBe(1) }), ) @@ -94,7 +96,9 @@ export function allServerTests( withRemultForTest(async () => { await create3Tasks() expect( - await repo(Task).deleteMany({ where: { $or: [{ title: 'a' }, { title: 'c' }] } }), + await repo(Task).deleteMany({ + where: { $or: [{ title: 'a' }, { title: 'c' }] }, + }), ).toBe(2) expect(await repo(Task).count()).toBe(1) }), @@ -103,7 +107,9 @@ export function allServerTests( 'delete many 3', withRemultForTest(async () => { await create3Tasks() - expect(await repo(Task).deleteMany({ where: { title: { $ne: 'b' } } })).toBe(2) + expect( + await repo(Task).deleteMany({ where: { title: { $ne: 'b' } } }), + ).toBe(2) expect(await repo(Task).count()).toBe(1) }), ) @@ -112,7 +118,10 @@ export function allServerTests( withRemultForTest(async () => { await create3Tasks() expect( - await repo(Task).updateMany({ where: { title: ['a', 'c'] } }, { title: 'dd' }), + await repo(Task).updateMany( + { where: { title: ['a', 'c'] } }, + { title: 'dd' }, + ), ).toBe(2) expect(await repo(Task).count({ title: 'dd' })).toBe(2) expect(await repo(Task).count({ title: { '!=': 'dd' } })).toBe(1) @@ -123,7 +132,10 @@ export function allServerTests( withRemultForTest(async () => { await create3Tasks() expect( - await repo(Task).updateMany({ where: { title: { $ne: 'b' } } }, { title: 'dd' }), + await repo(Task).updateMany( + { where: { title: { $ne: 'b' } } }, + { title: 'dd' }, + ), ).toBe(2) expect(await repo(Task).count({ title: 'dd' })).toBe(2) expect(await repo(Task).count({ title: { '!=': 'dd' } })).toBe(1) @@ -148,20 +160,46 @@ export function allServerTests( }), ) it( - 'delete with url params', + 'admin', withRemultForTest(async () => { await create3Tasks() + expect((await axios.get(remult.apiClient.url + '/admin')).status).toBe( + 200, + ) + }), + ) + it( + 'admin/', + withRemultForTest(async () => { + await create3Tasks() + expect((await axios.get(remult.apiClient.url + '/admin/')).status).toBe( + 200, + ) + }), + ) + it( + 'admin/tasks', + withRemultForTest(async () => { expect( - (await axios.delete(remult.apiClient.url + '/tasks' + '?title.ne=b')) - .data, - ).toMatchInlineSnapshot(` + (await axios.get(remult.apiClient.url + '/admin/tasks')).status, + ).toBe(200) + }), + ), + it( + 'delete with url params', + withRemultForTest(async () => { + await create3Tasks() + expect( + (await axios.delete(remult.apiClient.url + '/tasks' + '?title.ne=b')) + .data, + ).toMatchInlineSnapshot(` { "deleted": 2, } `) - expect(await repo(Task).count()).toBe(1) - }), - ) + expect(await repo(Task).count()).toBe(1) + }), + ) it( 'update many 2', withRemultForTest(async () => { diff --git a/projects/tests/backend-tests/test-express-server.spec.ts b/projects/tests/backend-tests/test-express-server.spec.ts index 0789a1f01..d73868532 100644 --- a/projects/tests/backend-tests/test-express-server.spec.ts +++ b/projects/tests/backend-tests/test-express-server.spec.ts @@ -3,7 +3,7 @@ import { type RemultExpressServer, remultExpress, } from '../../core/remult-express.js' -import { afterAll, beforeAll, beforeEach, describe, expect, it } from 'vitest' +import { beforeEach, describe, expect, it } from 'vitest' import { Task, test_compound_id } from '../../test-servers/shared/Task.js' import { InMemoryDataProvider, @@ -28,6 +28,7 @@ describe('test express server', async () => { let api = remultExpress({ entities: [Task, test_compound_id], dataProvider: new InMemoryDataProvider(), + admin: true, error: (e) => errorHandler?.(e), getUser: async () => { if (throwExceptionOnGetUser) diff --git a/projects/tests/backend-tests/test-fastify-server.spec.ts b/projects/tests/backend-tests/test-fastify-server.spec.ts index eb0420614..a4e631528 100644 --- a/projects/tests/backend-tests/test-fastify-server.spec.ts +++ b/projects/tests/backend-tests/test-fastify-server.spec.ts @@ -16,6 +16,7 @@ describe('test fastify server', async () => { const app = fastify() const api = remultFastify({ entities: [Task], + admin: true, }) await app.register(api) app.get('/api/test', async (req, res) => { diff --git a/projects/tests/backend-tests/test-hapi.spec.ts b/projects/tests/backend-tests/test-hapi.spec.ts index bee3b2321..d8e40b1bc 100644 --- a/projects/tests/backend-tests/test-hapi.spec.ts +++ b/projects/tests/backend-tests/test-hapi.spec.ts @@ -15,6 +15,8 @@ describe('test hapi server', async () => { const app = server({ port }) const api = remultHapi({ entities: [Task], + + admin: true, }) await app.register(api) app.route({ diff --git a/projects/tests/backend-tests/test-hono-server.spec.ts b/projects/tests/backend-tests/test-hono-server.spec.ts index a813ed9d0..fa0b98c90 100644 --- a/projects/tests/backend-tests/test-hono-server.spec.ts +++ b/projects/tests/backend-tests/test-hono-server.spec.ts @@ -16,6 +16,7 @@ describe('test holo server', async () => { const app = new Hono() const api = remultHono({ entities: [Task], + admin: true, }) app.route('', api) app.get('/api/test', api.withRemult, async (c) =>