@palbase/backend 24.3.0 → 25.0.0
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/dist/bin/palbase-backend.cjs +101 -60
- package/dist/bin/palbase-backend.cjs.map +1 -1
- package/dist/bin/palbase-backend.js +17 -13
- package/dist/bin/palbase-backend.js.map +1 -1
- package/dist/{chunk-EIXCY4SS.js → chunk-43A3KGWL.js} +80 -49
- package/dist/chunk-43A3KGWL.js.map +1 -0
- package/dist/{chunk-ERDL5VAE.js → chunk-5CMLOAEF.js} +2 -2
- package/dist/chunk-OEQBHE2Z.js +825 -0
- package/dist/chunk-OEQBHE2Z.js.map +1 -0
- package/dist/{chunk-7Z6MGMXQ.js → chunk-XJ2RSHEU.js} +11 -5
- package/dist/chunk-XJ2RSHEU.js.map +1 -0
- package/dist/{chunk-UWSYTUGM.js → chunk-ZQRWW37O.js} +44 -1
- package/dist/chunk-ZQRWW37O.js.map +1 -0
- package/dist/db/env.cjs.map +1 -1
- package/dist/db/env.d.cts +29 -13
- package/dist/db/env.d.ts +29 -13
- package/dist/db/index.cjs +212 -111
- package/dist/db/index.cjs.map +1 -1
- package/dist/db/index.d.cts +1 -1
- package/dist/db/index.d.ts +1 -1
- package/dist/db/index.js +11 -1
- package/dist/engine/index.cjs +87 -50
- package/dist/engine/index.cjs.map +1 -1
- package/dist/engine/index.d.cts +2 -2
- package/dist/engine/index.d.ts +2 -2
- package/dist/engine/index.js +3 -3
- package/dist/{index-DEneI8Mn.d.ts → index-BF1f0DfA.d.ts} +5 -2
- package/dist/{index-C-ALG22n.d.cts → index-CoaDN9dL.d.cts} +5 -2
- package/dist/{index-BTMYod_l.d.ts → index-Ct1iiB4N.d.ts} +203 -61
- package/dist/{index-BLAbr9ZH.d.cts → index-CwaWRhyc.d.cts} +203 -61
- package/dist/index.cjs +550 -297
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +122 -20
- package/dist/index.d.ts +122 -20
- package/dist/index.js +164 -217
- package/dist/index.js.map +1 -1
- package/dist/openapi/index.cjs +100 -36
- package/dist/openapi/index.cjs.map +1 -1
- package/dist/openapi/index.js +59 -2
- package/dist/openapi/index.js.map +1 -1
- package/docs/README.md +64 -31
- package/docs/endpoints.md +25 -28
- package/docs/llms-full.txt +399 -153
- package/docs/schema.md +272 -91
- package/docs/services.md +39 -4
- package/package.json +1 -1
- package/template/AGENTS.md +119 -314
- package/template/CLAUDE.md +13 -0
- package/template/controllers/notes.controller.ts +6 -13
- package/template/db/public.ts +38 -0
- package/template/models/notes/create.ts +38 -0
- package/template/package.json +6 -3
- package/template/services/note.service.test.ts +45 -0
- package/template/services/note.service.ts +2 -2
- package/dist/chunk-7Z6MGMXQ.js.map +0 -1
- package/dist/chunk-D5CQES25.js +0 -556
- package/dist/chunk-D5CQES25.js.map +0 -1
- package/dist/chunk-EIXCY4SS.js.map +0 -1
- package/dist/chunk-UWSYTUGM.js.map +0 -1
- package/template/db/schema.ts +0 -35
- /package/dist/{chunk-ERDL5VAE.js.map → chunk-5CMLOAEF.js.map} +0 -0
package/dist/openapi/index.cjs
CHANGED
|
@@ -5799,6 +5799,50 @@ module.exports = __toCommonJS(openapi_exports);
|
|
|
5799
5799
|
|
|
5800
5800
|
// src/openapi/aggregate.ts
|
|
5801
5801
|
var import_zod_to_openapi3 = require("@asteasolutions/zod-to-openapi");
|
|
5802
|
+
|
|
5803
|
+
// src/decorators/registry.ts
|
|
5804
|
+
var ROUTES = /* @__PURE__ */ Symbol.for("palbase.backend.routes");
|
|
5805
|
+
var ROOM = /* @__PURE__ */ Symbol.for("palbase.backend.room");
|
|
5806
|
+
var RETURN_BUFFER = /* @__PURE__ */ Symbol.for("palbase.backend.returnBuffer");
|
|
5807
|
+
var THROWS_BUFFER = /* @__PURE__ */ Symbol.for("palbase.backend.throwsBuffer");
|
|
5808
|
+
function carrierOf(target) {
|
|
5809
|
+
const ctor = typeof target === "function" ? target : target.constructor ?? target;
|
|
5810
|
+
return ctor;
|
|
5811
|
+
}
|
|
5812
|
+
function getRoutes(ctor) {
|
|
5813
|
+
const carrier = carrierOf(ctor);
|
|
5814
|
+
const routes = carrier[ROUTES] ?? [];
|
|
5815
|
+
const returnBuffer = carrier[RETURN_BUFFER];
|
|
5816
|
+
if (returnBuffer) {
|
|
5817
|
+
for (const route of routes) {
|
|
5818
|
+
const buffered = returnBuffer[route.fnName];
|
|
5819
|
+
if (buffered && route.returnSchema === void 0) {
|
|
5820
|
+
route.returnSchema = buffered;
|
|
5821
|
+
}
|
|
5822
|
+
}
|
|
5823
|
+
}
|
|
5824
|
+
const throwsBuffer = carrier[THROWS_BUFFER];
|
|
5825
|
+
if (throwsBuffer) {
|
|
5826
|
+
for (const route of routes) {
|
|
5827
|
+
const buffered = throwsBuffer[route.fnName];
|
|
5828
|
+
if (buffered && route.throws === void 0) {
|
|
5829
|
+
route.throws = buffered;
|
|
5830
|
+
}
|
|
5831
|
+
}
|
|
5832
|
+
}
|
|
5833
|
+
return routes.map((r) => ({
|
|
5834
|
+
...r,
|
|
5835
|
+
params: r.params.slice(),
|
|
5836
|
+
...r.throws !== void 0 ? { throws: r.throws.slice() } : {}
|
|
5837
|
+
}));
|
|
5838
|
+
}
|
|
5839
|
+
function getRoom(ctor) {
|
|
5840
|
+
const carrier = carrierOf(ctor);
|
|
5841
|
+
if (!Object.prototype.hasOwnProperty.call(carrier, ROOM)) return void 0;
|
|
5842
|
+
return carrier[ROOM];
|
|
5843
|
+
}
|
|
5844
|
+
|
|
5845
|
+
// src/openapi/aggregate.ts
|
|
5802
5846
|
var import_zod3 = require("zod");
|
|
5803
5847
|
|
|
5804
5848
|
// src/openapi/convert.ts
|
|
@@ -5915,42 +5959,6 @@ var import_fast_glob = __toESM(require_out4(), 1);
|
|
|
5915
5959
|
var import_node_path = __toESM(require("path"), 1);
|
|
5916
5960
|
var import_node_url = require("url");
|
|
5917
5961
|
|
|
5918
|
-
// src/decorators/registry.ts
|
|
5919
|
-
var ROUTES = /* @__PURE__ */ Symbol.for("palbase.backend.routes");
|
|
5920
|
-
var RETURN_BUFFER = /* @__PURE__ */ Symbol.for("palbase.backend.returnBuffer");
|
|
5921
|
-
var THROWS_BUFFER = /* @__PURE__ */ Symbol.for("palbase.backend.throwsBuffer");
|
|
5922
|
-
function carrierOf(target) {
|
|
5923
|
-
const ctor = typeof target === "function" ? target : target.constructor ?? target;
|
|
5924
|
-
return ctor;
|
|
5925
|
-
}
|
|
5926
|
-
function getRoutes(ctor) {
|
|
5927
|
-
const carrier = carrierOf(ctor);
|
|
5928
|
-
const routes = carrier[ROUTES] ?? [];
|
|
5929
|
-
const returnBuffer = carrier[RETURN_BUFFER];
|
|
5930
|
-
if (returnBuffer) {
|
|
5931
|
-
for (const route of routes) {
|
|
5932
|
-
const buffered = returnBuffer[route.fnName];
|
|
5933
|
-
if (buffered && route.returnSchema === void 0) {
|
|
5934
|
-
route.returnSchema = buffered;
|
|
5935
|
-
}
|
|
5936
|
-
}
|
|
5937
|
-
}
|
|
5938
|
-
const throwsBuffer = carrier[THROWS_BUFFER];
|
|
5939
|
-
if (throwsBuffer) {
|
|
5940
|
-
for (const route of routes) {
|
|
5941
|
-
const buffered = throwsBuffer[route.fnName];
|
|
5942
|
-
if (buffered && route.throws === void 0) {
|
|
5943
|
-
route.throws = buffered;
|
|
5944
|
-
}
|
|
5945
|
-
}
|
|
5946
|
-
}
|
|
5947
|
-
return routes.map((r) => ({
|
|
5948
|
-
...r,
|
|
5949
|
-
params: r.params.slice(),
|
|
5950
|
-
...r.throws !== void 0 ? { throws: r.throws.slice() } : {}
|
|
5951
|
-
}));
|
|
5952
|
-
}
|
|
5953
|
-
|
|
5954
5962
|
// src/decorators/controller.ts
|
|
5955
5963
|
var CONTROLLER_META = /* @__PURE__ */ Symbol.for("palbase.backend.controllerMeta");
|
|
5956
5964
|
var APP_DEFAULT_AUTH = /* @__PURE__ */ Symbol.for("palbase.backend.appDefaultAuth");
|
|
@@ -6026,6 +6034,9 @@ var DEFAULT_IGNORE = [
|
|
|
6026
6034
|
"**/node_modules/**"
|
|
6027
6035
|
];
|
|
6028
6036
|
function flattenController(controller) {
|
|
6037
|
+
if (getRoom(controller) !== void 0 && !isController(controller)) {
|
|
6038
|
+
return [];
|
|
6039
|
+
}
|
|
6029
6040
|
const meta = resolveController(controller);
|
|
6030
6041
|
const controllerName = deriveControllerName(controller.name);
|
|
6031
6042
|
const routes = getRoutes(controller);
|
|
@@ -6355,6 +6366,44 @@ function isRefinedSchema(schema) {
|
|
|
6355
6366
|
if (!typeName) return false;
|
|
6356
6367
|
return typeName === "ZodEffects" || typeName === "ZodPreprocess" || typeName === "ZodTransform";
|
|
6357
6368
|
}
|
|
6369
|
+
function firstUntypedField(schema) {
|
|
6370
|
+
const shape = schema?.shape;
|
|
6371
|
+
if (!shape) return void 0;
|
|
6372
|
+
for (const [field, sub] of Object.entries(shape)) {
|
|
6373
|
+
const kind = sub?._def?.typeName;
|
|
6374
|
+
if (kind === "ZodUnknown" || kind === "ZodAny") return field;
|
|
6375
|
+
}
|
|
6376
|
+
return void 0;
|
|
6377
|
+
}
|
|
6378
|
+
function assertRoomFieldsTyped(pattern, room) {
|
|
6379
|
+
for (const [event, schema] of Object.entries(room.events)) {
|
|
6380
|
+
const field = firstUntypedField(schema);
|
|
6381
|
+
if (field !== void 0) {
|
|
6382
|
+
throw new Error(
|
|
6383
|
+
`@Room("${pattern}") event "${event}" has an untyped field "${field}". An untyped payload makes every generated client opaque \u2014 declare its shape.`
|
|
6384
|
+
);
|
|
6385
|
+
}
|
|
6386
|
+
}
|
|
6387
|
+
for (const [message, meta] of Object.entries(room.messages)) {
|
|
6388
|
+
const field = firstUntypedField(meta.schema);
|
|
6389
|
+
if (field !== void 0) {
|
|
6390
|
+
throw new Error(
|
|
6391
|
+
`@Room("${pattern}") message "${message}" has an untyped field "${field}". Inbound payloads reach the server \u2014 declare the shape so it can be validated.`
|
|
6392
|
+
);
|
|
6393
|
+
}
|
|
6394
|
+
}
|
|
6395
|
+
}
|
|
6396
|
+
function roomExtension(room, register) {
|
|
6397
|
+
const events = {};
|
|
6398
|
+
for (const [name, schema] of Object.entries(room.events)) {
|
|
6399
|
+
events[name] = { $ref: register(name, schema) };
|
|
6400
|
+
}
|
|
6401
|
+
const messages = {};
|
|
6402
|
+
for (const [name, meta] of Object.entries(room.messages)) {
|
|
6403
|
+
messages[name] = { $ref: register(name, meta.schema) };
|
|
6404
|
+
}
|
|
6405
|
+
return { events, messages, graceMs: room.graceMs };
|
|
6406
|
+
}
|
|
6358
6407
|
|
|
6359
6408
|
// src/openapi/aggregate.ts
|
|
6360
6409
|
(0, import_zod_to_openapi3.extendZodWithOpenApi)(import_zod3.z);
|
|
@@ -6380,6 +6429,18 @@ async function aggregateOpenAPI(projectRoot, options = {}) {
|
|
|
6380
6429
|
registerControllerRoute(registry, route);
|
|
6381
6430
|
}
|
|
6382
6431
|
const generator = new import_zod_to_openapi3.OpenApiGeneratorV31(registry.definitions);
|
|
6432
|
+
const roomExt = {};
|
|
6433
|
+
for (const lc of loadedControllers) {
|
|
6434
|
+
const room = getRoom(lc.controller);
|
|
6435
|
+
if (room === void 0) continue;
|
|
6436
|
+
assertRoomFieldsTyped(room.pattern, room);
|
|
6437
|
+
const slug = room.pattern.replace(/[^A-Za-z0-9]+/g, "_").replace(/^_|_$/g, "");
|
|
6438
|
+
roomExt[room.pattern] = roomExtension(room, (name, schema) => {
|
|
6439
|
+
const componentName = `Room_${slug}_${name}`;
|
|
6440
|
+
registry.register(componentName, schema);
|
|
6441
|
+
return `#/components/schemas/${componentName}`;
|
|
6442
|
+
});
|
|
6443
|
+
}
|
|
6383
6444
|
const document = generator.generateDocument({
|
|
6384
6445
|
openapi: "3.2.0",
|
|
6385
6446
|
info: {
|
|
@@ -6388,6 +6449,9 @@ async function aggregateOpenAPI(projectRoot, options = {}) {
|
|
|
6388
6449
|
description: "Auto-generated from class controllers (@Controller/@Get/@Post + @Body/@QueryParams/@Param) Zod schemas + method return types at deploy time. Do not edit by hand."
|
|
6389
6450
|
}
|
|
6390
6451
|
});
|
|
6452
|
+
if (Object.keys(roomExt).length > 0) {
|
|
6453
|
+
document["x-palbase-room"] = roomExt;
|
|
6454
|
+
}
|
|
6391
6455
|
return {
|
|
6392
6456
|
document,
|
|
6393
6457
|
endpointCount: controllerRoutes.length,
|