{"version":3,"file":"elysia.mjs","names":[],"sources":["../src/adapter/elysia/handler.ts"],"sourcesContent":["import type { ClientContract } from '@zenstackhq/orm';\nimport type { SchemaDef } from '@zenstackhq/orm/schema';\nimport { Elysia, type Context as ElysiaContext } from 'elysia';\nimport { logInternalError, type CommonAdapterOptions } from '../common';\n\n/**\n * Options for initializing an Elysia middleware.\n */\nexport interface ElysiaOptions<Schema extends SchemaDef> extends CommonAdapterOptions<Schema> {\n    /**\n     * Callback method for getting a ZenStackClient instance for the given request context.\n     */\n    getClient: (context: ElysiaContext) => Promise<ClientContract<Schema>> | ClientContract<Schema>;\n\n    /**\n     * Optional base path to strip from the request path before passing to the API handler.\n     */\n    basePath?: string;\n}\n\n/**\n * Creates an Elysia middleware handler for ZenStack.\n * This handler provides automatic CRUD APIs through Elysia's routing system.\n */\nexport function createElysiaHandler<Schema extends SchemaDef>(options: ElysiaOptions<Schema>) {\n    return async (app: Elysia) => {\n        app.all('/*', async (ctx: ElysiaContext) => {\n            const { query, body, set, request } = ctx;\n            const client = await options.getClient(ctx);\n            if (!client) {\n                set.status = 500;\n                return {\n                    message: 'unable to get ZenStackClient from request context',\n                };\n            }\n\n            const url = new URL(request.url);\n            let path = url.pathname;\n\n            if (options.basePath && path.startsWith(options.basePath)) {\n                path = path.slice(options.basePath.length);\n                if (!path.startsWith('/')) {\n                    path = '/' + path;\n                }\n            }\n\n            if (!path || path === '/') {\n                set.status = 400;\n                return {\n                    message: 'missing path parameter',\n                };\n            }\n\n            try {\n                const r = await options.apiHandler.handleRequest({\n                    method: request.method,\n                    path,\n                    query,\n                    requestBody: body,\n                    client,\n                });\n\n                set.status = r.status;\n                return r.body;\n            } catch (err) {\n                set.status = 500;\n                logInternalError(options.apiHandler.log, err);\n                return {\n                    message: 'An internal server error occurred',\n                };\n            }\n        });\n\n        return app;\n    };\n}\n"],"mappings":";;;;;;;AAwBA,SAAgB,oBAA8C,SAAgC;AAC1F,QAAO,OAAO,QAAgB;AAC1B,MAAI,IAAI,MAAM,OAAO,QAAuB;GACxC,MAAM,EAAE,OAAO,MAAM,KAAK,YAAY;GACtC,MAAM,SAAS,MAAM,QAAQ,UAAU,IAAI;AAC3C,OAAI,CAAC,QAAQ;AACT,QAAI,SAAS;AACb,WAAO,EACH,SAAS,qDACZ;;GAIL,IAAI,OADQ,IAAI,IAAI,QAAQ,IAAI,CACjB;AAEf,OAAI,QAAQ,YAAY,KAAK,WAAW,QAAQ,SAAS,EAAE;AACvD,WAAO,KAAK,MAAM,QAAQ,SAAS,OAAO;AAC1C,QAAI,CAAC,KAAK,WAAW,IAAI,CACrB,QAAO,MAAM;;AAIrB,OAAI,CAAC,QAAQ,SAAS,KAAK;AACvB,QAAI,SAAS;AACb,WAAO,EACH,SAAS,0BACZ;;AAGL,OAAI;IACA,MAAM,IAAI,MAAM,QAAQ,WAAW,cAAc;KAC7C,QAAQ,QAAQ;KAChB;KACA;KACA,aAAa;KACb;KACH,CAAC;AAEF,QAAI,SAAS,EAAE;AACf,WAAO,EAAE;YACJ,KAAK;AACV,QAAI,SAAS;AACb,qBAAiB,QAAQ,WAAW,KAAK,IAAI;AAC7C,WAAO,EACH,SAAS,qCACZ;;IAEP;AAEF,SAAO"}