@palbase/backend 24.2.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.
Files changed (61) hide show
  1. package/dist/bin/palbase-backend.cjs +101 -60
  2. package/dist/bin/palbase-backend.cjs.map +1 -1
  3. package/dist/bin/palbase-backend.js +17 -13
  4. package/dist/bin/palbase-backend.js.map +1 -1
  5. package/dist/{chunk-EIXCY4SS.js → chunk-43A3KGWL.js} +80 -49
  6. package/dist/chunk-43A3KGWL.js.map +1 -0
  7. package/dist/{chunk-ERDL5VAE.js → chunk-5CMLOAEF.js} +2 -2
  8. package/dist/chunk-OEQBHE2Z.js +825 -0
  9. package/dist/chunk-OEQBHE2Z.js.map +1 -0
  10. package/dist/{chunk-7Z6MGMXQ.js → chunk-XJ2RSHEU.js} +11 -5
  11. package/dist/chunk-XJ2RSHEU.js.map +1 -0
  12. package/dist/{chunk-UWSYTUGM.js → chunk-ZQRWW37O.js} +44 -1
  13. package/dist/chunk-ZQRWW37O.js.map +1 -0
  14. package/dist/db/env.cjs.map +1 -1
  15. package/dist/db/env.d.cts +29 -13
  16. package/dist/db/env.d.ts +29 -13
  17. package/dist/db/index.cjs +233 -110
  18. package/dist/db/index.cjs.map +1 -1
  19. package/dist/db/index.d.cts +1 -1
  20. package/dist/db/index.d.ts +1 -1
  21. package/dist/db/index.js +11 -1
  22. package/dist/engine/index.cjs +87 -50
  23. package/dist/engine/index.cjs.map +1 -1
  24. package/dist/engine/index.d.cts +2 -2
  25. package/dist/engine/index.d.ts +2 -2
  26. package/dist/engine/index.js +3 -3
  27. package/dist/{index-C0PMn5jl.d.ts → index-BF1f0DfA.d.ts} +5 -2
  28. package/dist/{index-DAwHMppB.d.cts → index-CoaDN9dL.d.cts} +5 -2
  29. package/dist/{index-ByBMibIJ.d.ts → index-Ct1iiB4N.d.ts} +232 -60
  30. package/dist/{index-D4rts8T7.d.cts → index-CwaWRhyc.d.cts} +232 -60
  31. package/dist/index.cjs +572 -296
  32. package/dist/index.cjs.map +1 -1
  33. package/dist/index.d.cts +124 -20
  34. package/dist/index.d.ts +124 -20
  35. package/dist/index.js +164 -216
  36. package/dist/index.js.map +1 -1
  37. package/dist/openapi/index.cjs +100 -36
  38. package/dist/openapi/index.cjs.map +1 -1
  39. package/dist/openapi/index.js +59 -2
  40. package/dist/openapi/index.js.map +1 -1
  41. package/docs/README.md +64 -31
  42. package/docs/endpoints.md +25 -28
  43. package/docs/llms-full.txt +465 -148
  44. package/docs/schema.md +338 -86
  45. package/docs/services.md +39 -4
  46. package/package.json +1 -1
  47. package/template/AGENTS.md +119 -314
  48. package/template/CLAUDE.md +13 -0
  49. package/template/controllers/notes.controller.ts +6 -13
  50. package/template/db/public.ts +38 -0
  51. package/template/models/notes/create.ts +38 -0
  52. package/template/package.json +6 -3
  53. package/template/services/note.service.test.ts +45 -0
  54. package/template/services/note.service.ts +2 -2
  55. package/dist/chunk-7Z6MGMXQ.js.map +0 -1
  56. package/dist/chunk-EIXCY4SS.js.map +0 -1
  57. package/dist/chunk-LCL7TUAI.js +0 -534
  58. package/dist/chunk-LCL7TUAI.js.map +0 -1
  59. package/dist/chunk-UWSYTUGM.js.map +0 -1
  60. package/template/db/schema.ts +0 -35
  61. /package/dist/{chunk-ERDL5VAE.js.map → chunk-5CMLOAEF.js.map} +0 -0
@@ -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,