@tulipes/core 0.1.3 → 0.1.5
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/README.md +25 -10
- package/dist/boot/boot.d.ts +3 -3
- package/dist/boot/boot.js +12 -9
- package/dist/boot/boot.js.map +1 -1
- package/dist/boot/contracts.d.ts +2 -2
- package/dist/cli/init.d.ts +9 -7
- package/dist/cli/init.js +464 -67
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/main.js +1 -1
- package/dist/http/error-handler.js +21 -0
- package/dist/http/error-handler.js.map +1 -1
- package/dist/queues/queue-manager.d.ts +1 -1
- package/dist/queues/queue-manager.js +1 -1
- package/dist/sockets/load-sockets.d.ts +2 -2
- package/dist/sockets/load-sockets.js +1 -1
- package/dist/sockets/socket-manager.d.ts +1 -1
- package/dist/sockets/socket-manager.js +1 -1
- package/package.json +3 -2
- package/templates/CLAUDE.md +72 -0
- package/templates/claude/skills/tulipes-boot-errors/SKILL.md +64 -0
- package/templates/claude/skills/tulipes-endpoint/SKILL.md +82 -0
- package/templates/claude/skills/tulipes-env-variable/SKILL.md +78 -0
- package/templates/claude/skills/tulipes-model/SKILL.md +75 -0
- package/templates/claude/skills/tulipes-module/SKILL.md +60 -0
- package/templates/claude/skills/tulipes-permissions/SKILL.md +61 -0
- package/templates/claude/skills/tulipes-queue/SKILL.md +62 -0
- package/templates/claude/skills/tulipes-socket/SKILL.md +55 -0
package/dist/cli/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAClG,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;;;;;;;;GAYG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,OAAe,EAAE,MAAe;IAC5D,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,EAAE,MAAM,IAAI,GAAG,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;IAEzC,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,KAAK,MAAM,CAAC,EAAE,CAAC;QAC1E,OAAO,CAAC,KAAK,CAAC,qBAAqB,GAAG,eAAe,CAAC,CAAC;QACvD,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrB,OAAO;IACT,CAAC;IAED,MAAM,WAAW,GAAG,UAAU,EAAE,CAAC;IACjC,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;IAE/C,KAAK,MAAM,CAAC,OAAO,EAAE,OAAO,CAAC,IAAI,KAAK,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QACpC,SAAS,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,aAAa,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACjC,OAAO,CAAC,GAAG,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;IACrC,CAAC;IAED,eAAe,CAAC,GAAG,CAAC,CAAC;IAErB,OAAO,CAAC,GAAG,CAAC;QACV,EAAE;QACF,YAAY,IAAI,mBAAmB;QACnC,EAAE;QACF,MAAM,IAAI,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS;QACvD,sEAAsE;QACtE,gBAAgB;QAChB,YAAY;QACZ,EAAE;QACF,iCAAiC;QACjC,EAAE;QACF,8DAA8D;QAC9D,mEAAmE;QACnE,sBAAsB;KACvB,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AACrD,CAAC;AAED;;;;GAIG;AACH,SAAS,UAAU;IACjB,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,cAAc,CAAC,EAAE,MAAM,CAAC,CAE/E,CAAC;IACF,OAAO,GAAG,CAAC,OAAO,CAAC;AACrB,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,OAAO,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACnE,CAAC;AAED;;;;;;;;;GASG;AACH,SAAS,eAAe,CAAC,GAAW;IAClC,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,CAAC;IACnD,IAAI,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,CAAC,8BAA8B;IAElE,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC9C,IAAI,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzB,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC;IAED,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;IACzC,IAAI,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACvB,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC1D,KAAK,MAAM,KAAK,IAAI,WAAW,CAAC,IAAI,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC,EAAE,CAAC;YACxD,OAAO,CAAC,GAAG,CAAC,2BAA2B,KAAK,WAAW,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,GAAW;IAC/B,MAAM,IAAI,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACpF,OAAO,IAAI,IAAI,aAAa,CAAC;AAC/B,CAAC;AAED,MAAM,IAAI,GAAG,CAAC,KAAc,EAAU,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC;AAE/E,SAAS,aAAa,CAAC,IAAY,EAAE,WAAmB;IACtD,MAAM,IAAI,GAAG,IAAI,WAAW,EAAE,CAAC;IAE/B,MAAM,KAAK,GAAuB;QAChC,CAAC,cAAc,EAAE,IAAI,CAAC;gBACpB,IAAI;gBACJ,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,QAAQ;gBACd,iEAAiE;gBACjE,yDAAyD;gBACzD,cAAc,EAAE,aAAa;gBAC7B,UAAU,EAAE,CAAC,WAAW,CAAC;gBACzB,OAAO,EAAE;oBACP,GAAG,EAAE,aAAa;oBAClB,MAAM,EAAE,eAAe;oBACvB,IAAI,EAAE,cAAc;oBACpB,KAAK,EAAE,mBAAmB;oBAC1B,SAAS,EAAE,cAAc;iBAC1B;gBACD,YAAY,EAAE;oBACZ,eAAe,EAAE,IAAI;oBACrB,OAAO,EAAE,IAAI;iBACd;gBACD,eAAe,EAAE;oBACf,gBAAgB,EAAE,IAAI;oBACtB,aAAa,EAAE,KAAK;oBACpB,GAAG,EAAE,IAAI;oBACT,UAAU,EAAE,IAAI;iBACjB;aACF,CAAC,CAAC;QAEH,CAAC,eAAe,EAAE,IAAI,CAAC;gBACrB,eAAe,EAAE;oBACf,MAAM,EAAE,QAAQ;oBAChB,GAAG,EAAE,CAAC,QAAQ,CAAC;oBACf,MAAM,EAAE,UAAU;oBAClB,gBAAgB,EAAE,UAAU;oBAC5B,MAAM,EAAE,IAAI;oBACZ,wBAAwB,EAAE,IAAI;oBAC9B,oBAAoB,EAAE,IAAI;oBAC1B,YAAY,EAAE,IAAI;oBAClB,gCAAgC,EAAE,IAAI;oBACtC,MAAM,EAAE,IAAI;iBACb;gBACD,OAAO,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,CAAC;aAC/D,CAAC,CAAC;QAEH,CAAC,aAAa,EAAE;gBACd,0BAA0B;gBAC1B,EAAE;gBACF,yEAAyE;gBACzE,0EAA0E;gBAC1E,qBAAqB;gBACrB,EAAE;gBACF,yEAAyE;gBACzE,2EAA2E;gBAC3E,qEAAqE;gBACrE,yBAAyB;gBACzB,kBAAkB;gBAClB,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,CAAC,YAAY,EAAE;gBACb,eAAe;gBACf,OAAO;gBACP,OAAO;gBACP,EAAE;gBACF,oEAAoE;gBACpE,6DAA6D;gBAC7D,YAAY;gBACZ,oBAAoB;gBACpB,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,CAAC,QAAQ,EAAE;gBACT,4CAA4C;gBAC5C,EAAE;gBACF,gEAAgE;gBAChE,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,CAAC,WAAW,EAAE;gBACZ,4CAA4C;gBAC5C,EAAE;gBACF,uEAAuE;gBACvE,8DAA8D;gBAC9D,sDAAsD;gBACtD,+DAA+D;gBAC/D,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,CAAC,sBAAsB,EAAE;gBACvB,wDAAwD;gBACxD,EAAE;gBACF,KAAK;gBACL,2EAA2E;gBAC3E,IAAI;gBACJ,yEAAyE;gBACzE,qEAAqE;gBACrE,uDAAuD;gBACvD,IAAI;gBACJ,6DAA6D;gBAC7D,iCAAiC;gBACjC,+DAA+D;gBAC/D,QAAQ;gBACR,IAAI;gBACJ,wEAAwE;gBACxE,0EAA0E;gBAC1E,uEAAuE;gBACvE,qCAAqC;gBACrC,IAAI;gBACJ,0EAA0E;gBAC1E,yEAAyE;gBACzE,uDAAuD;gBACvD,IAAI;gBACJ,0EAA0E;gBAC1E,+DAA+D;gBAC/D,sDAAsD;gBACtD,yEAAyE;gBACzE,uCAAuC;gBACvC,KAAK;gBACL,wEAAwE;gBACxE,yEAAyE;gBACzE,wCAAwC;gBACxC,OAAO;gBACP,wEAAwE;gBACxE,2BAA2B,IAAI,0CAA0C;gBACzE,gEAAgE;gBAChE,OAAO;gBACP,UAAU;gBACV,aAAa,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG;gBACpC,uBAAuB;gBACvB,mCAAmC;gBACnC,0EAA0E;gBAC1E,8BAA8B;gBAC9B,kFAAkF;gBAClF,oCAAoC;gBACpC,MAAM;gBACN,EAAE;gBACF,OAAO;gBACP,sEAAsE;gBACtE,sEAAsE;gBACtE,4EAA4E;gBAC5E,OAAO;gBACP,UAAU;gBACV,wBAAwB;gBACxB,2DAA2D;gBAC3D,4BAA4B;gBAC5B,MAAM;gBACN,EAAE;gBACF,OAAO;gBACP,yDAAyD;gBACzD,0EAA0E;gBAC1E,0DAA0D;gBAC1D,OAAO;gBACP,WAAW;gBACX,wEAAwE;gBACxE,sCAAsC;gBACtC,uBAAuB;gBACvB,0EAA0E;gBAC1E,sDAAsD;gBACtD,6CAA6C;gBAC7C,2EAA2E;gBAC3E,2DAA2D;gBAC3D,wBAAwB;gBACxB,4EAA4E;gBAC5E,oBAAoB;gBACpB,yBAAyB;gBACzB,MAAM;gBACN,EAAE;gBACF,OAAO;gBACP,wEAAwE;gBACxE,iDAAiD;gBACjD,OAAO;gBACP,iBAAiB;gBACjB,uBAAuB;gBACvB,oBAAoB;gBACpB,MAAM;gBACN,EAAE;gBACF,OAAO;gBACP,yEAAyE;gBACzE,4EAA4E;gBAC5E,oEAAoE;gBACpE,OAAO;gBACP,eAAe;gBACf,uDAAuD;gBACvD,+CAA+C;gBAC/C,4CAA4C;gBAC5C,iCAAiC;gBACjC,yBAAyB;gBACzB,qEAAqE;gBACrE,iDAAiD;gBACjD,MAAM;gBACN,EAAE;gBACF,OAAO;gBACP,2EAA2E;gBAC3E,wEAAwE;gBACxE,yDAAyD;gBACzD,OAAO;gBACP,WAAW;gBACX,4DAA4D;gBAC5D,wCAAwC;gBACxC,MAAM;gBACN,EAAE;gBACF,OAAO;gBACP,oEAAoE;gBACpE,OAAO;gBACP,cAAc;gBACd,oBAAoB;gBACpB,uEAAuE;gBACvE,MAAM;gBACN,EAAE;gBACF,OAAO;gBACP,kEAAkE;gBAClE,oEAAoE;gBACpE,sEAAsE;gBACtE,eAAe;gBACf,OAAO;gBACP,eAAe;gBACf,mBAAmB;gBACnB,6BAA6B;gBAC7B,MAAM;gBACN,EAAE;gBACF,OAAO;gBACP,2EAA2E;gBAC3E,OAAO;gBACP,WAAW;gBACX,0BAA0B;gBAC1B,qCAAqC;gBACrC,MAAM;gBACN,4BAA4B;gBAC5B,EAAE;gBACF,2BAA2B;gBAC3B,EAAE;gBACF,KAAK;gBACL,6EAA6E;gBAC7E,0EAA0E;gBAC1E,sEAAsE;gBACtE,qEAAqE;gBACrE,qBAAqB;gBACrB,KAAK;gBACL,yCAAyC;gBACzC,2EAA2E;gBAC3E,GAAG;gBACH,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,CAAC,wBAAwB,EAAE;gBACzB,0EAA0E;gBAC1E,wEAAwE;gBACxE,qCAAqC;gBACrC,EAAE;gBACF,WAAW;gBACX,iBAAiB;gBACjB,EAAE;gBACF,wEAAwE;gBACxE,iDAAiD;gBACjD,oCAAoC;gBACpC,EAAE;gBACF,uCAAuC,IAAI,EAAE;gBAC7C,kCAAkC;gBAClC,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,0EAA0E;QAC1E,CAAC,2BAA2B,EAAE,IAAI,CAAC;gBACjC,IAAI,EAAE,WAAW;gBACjB,OAAO,EAAE,OAAO;gBAChB,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,EAAE;gBACrC,YAAY,EAAE,EAAE,eAAe,EAAE,IAAI,EAAE;aACxC,CAAC,CAAC;QAEH,CAAC,kCAAkC,EAAE,IAAI,CAAC;gBACxC,SAAS,EAAE;oBACT;wBACE,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,QAAQ;wBACd,KAAK,EAAE,MAAM;wBACb,WAAW,EAAE,0CAA0C;wBACvD,OAAO,EAAE,IAAI;qBACd;oBACD,qEAAqE;oBACrE,+DAA+D;oBAC/D;wBACE,IAAI,EAAE,WAAW;wBACjB,IAAI,EAAE,KAAK;wBACX,KAAK,EAAE,UAAU;wBACjB,QAAQ,EAAE,IAAI;wBACd,WAAW,EAAE,2BAA2B;qBACzC;oBACD;wBACE,IAAI,EAAE,WAAW;wBACjB,IAAI,EAAE,KAAK;wBACX,KAAK,EAAE,OAAO;wBACd,QAAQ,EAAE,IAAI;wBACd,WAAW,EAAE,yCAAyC;qBACvD;iBACF;aACF,CAAC,CAAC;QAEH,CAAC,4BAA4B,EAAE;gBAC7B,sDAAsD;gBACtD,EAAE;gBACF,KAAK;gBACL,0EAA0E;gBAC1E,sDAAsD;gBACtD,KAAK;gBACL,0DAA0D;gBAC1D,+CAA+C;gBAC/C,EAAE;gBACF,sEAAsE;gBACtE,4BAA4B;gBAC5B,GAAG;gBACH,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,CAAC,oCAAoC,EAAE;gBACrC,2CAA2C;gBAC3C,gDAAgD;gBAChD,EAAE;gBACF,KAAK;gBACL,iEAAiE;gBACjE,yEAAyE;gBACzE,sEAAsE;gBACtE,KAAK;gBACL,0DAA0D;gBAC1D,mCAAmC;gBACnC,kDAAkD;gBAClD,aAAa;gBACb,OAAO;gBACP,GAAG;gBACH,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,0EAA0E;QAC1E,CAAC,+BAA+B,EAAE,IAAI,CAAC;gBACrC,IAAI,EAAE,eAAe;gBACrB,OAAO,EAAE,OAAO;gBAChB,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE,EAAE;gBACtC,YAAY,EAAE;oBACZ,eAAe,EAAE,IAAI;oBACrB,IAAI,EAAE,IAAI;oBACV,OAAO,EAAE,IAAI;oBACb,MAAM,EAAE,IAAI;oBACZ,IAAI,EAAE,IAAI;oBACV,WAAW,EAAE,KAAK;oBAClB,aAAa,EAAE,KAAK;iBACrB;gBACD,eAAe,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE;aACzC,CAAC,CAAC;QAEH,CAAC,sCAAsC,EAAE,IAAI,CAAC;gBAC5C,SAAS,EAAE;oBACT;wBACE,IAAI,EAAE,WAAW;wBACjB,IAAI,EAAE,MAAM;wBACZ,IAAI,EAAE,CAAC,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,CAAC;wBAC1D,KAAK,EAAE,SAAS;wBAChB,WAAW,EAAE,wBAAwB;wBACrC,OAAO,EAAE,MAAM;qBAChB;oBACD;wBACE,IAAI,EAAE,cAAc;wBACpB,IAAI,EAAE,QAAQ;wBACd,KAAK,EAAE,MAAM;wBACb,WAAW,EACT,gHAAgH;wBAClH,OAAO,EAAE,EAAE;qBACZ;oBACD;wBACE,IAAI,EAAE,kBAAkB;wBACxB,IAAI,EAAE,SAAS;wBACf,KAAK,EAAE,MAAM;wBACb,WAAW,EACT,2GAA2G;wBAC7G,OAAO,EAAE,KAAK;qBACf;oBACD;wBACE,IAAI,EAAE,cAAc;wBACpB,IAAI,EAAE,QAAQ;wBACd,KAAK,EAAE,WAAW;wBAClB,WAAW,EACT,0GAA0G;wBAC5G,OAAO,EAAE,UAAU;qBACpB;iBACF;aACF,CAAC,CAAC;QAEH,CAAC,uCAAuC,EAAE;gBACxC,0CAA0C;gBAC1C,8CAA8C;gBAC9C,uDAAuD;gBACvD,EAAE;gBACF,KAAK;gBACL,0EAA0E;gBAC1E,mEAAmE;gBACnE,qDAAqD;gBACrD,KAAK;gBACL,0EAA0E;gBAC1E,2DAA2D;gBAC3D,EAAE;gBACF,YAAY;gBACZ,kEAAkE;gBAClE,sEAAsE;gBACtE,8BAA8B;gBAC9B,2BAA2B;gBAC3B,iFAAiF;gBACjF,QAAQ;gBACR,0EAA0E;gBAC1E,2EAA2E;gBAC3E,qEAAqE;gBACrE,sEAAsE;gBACtE,qCAAqC;gBACrC,wEAAwE;gBACxE,gCAAgC;gBAChC,uCAAuC;gBACvC,MAAM;gBACN,GAAG;gBACH,EAAE;gBACF,KAAK;gBACL,kEAAkE;gBAClE,sEAAsE;gBACtE,+DAA+D;gBAC/D,KAAK;gBACL,sEAAsE;gBACtE,+DAA+D;gBAC/D,qEAAqE;gBACrE,EAAE;gBACF,sBAAsB;gBACtB,2EAA2E;gBAC3E,wEAAwE;gBACxE,uEAAuE;gBACvE,wBAAwB;gBACxB,wBAAwB;gBACxB,yGAAyG;gBACzG,UAAU;gBACV,OAAO;gBACP,kDAAkD;gBAClD,KAAK;gBACL,EAAE;gBACF,kFAAkF;gBAClF,4CAA4C;gBAC5C,GAAG;gBACH,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEjB,CAAC,oCAAoC,EAAE;gBACjC,2CAA2C;gBAC3C,uDAAuD;gBACvD,EAAE;gBACF,mCAAmC;gBACnC,EAAE;gBACF,KAAK;gBACL,wEAAwE;gBACxE,oEAAoE;gBACpE,iCAAiC;gBACjC,KAAK;gBACL,4DAA4D;gBAC5D,kCAAkC;gBAClC,EAAE;gBACF,qBAAqB;gBACrB,kDAAkD;gBAClD,mDAAmD;gBACnD,oBAAoB;gBACpB,gCAAgC;gBAChC,yEAAyE;gBACzE,UAAU;gBACV,SAAS;gBACT,OAAO;gBACP,oBAAoB;gBACpB,GAAG;gBACH,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAET,CAAC,4CAA4C,EAAE;gBACjD,0BAA0B;gBAC1B,gCAAgC;gBAChC,8BAA8B;gBAC9B,uCAAuC;gBACvC,gDAAgD;gBAChD,EAAE;gBACF,uEAAuE;gBACvE,gDAAgD;gBAChD,EAAE;gBACF,KAAK;gBACL,yEAAyE;gBACzE,uEAAuE;gBACvE,iDAAiD;gBACjD,IAAI;gBACJ,mBAAmB;gBACnB,2EAA2E;gBAC3E,6EAA6E;gBAC7E,uEAAuE;gBACvE,4EAA4E;gBAC5E,KAAK;gBACL,mFAAmF;gBACnF,iDAAiD;gBACjD,6CAA6C;gBAC7C,EAAE;gBACF,aAAa;gBACb,gBAAgB;gBAChB,oCAAoC;gBACpC,uEAAuE;gBACvE,uEAAuE;gBACvE,6EAA6E;gBAC7E,sBAAsB;gBACtB,2DAA2D;gBAC3D,+BAA+B;gBAC/B,yBAAyB;gBACzB,aAAa;gBACb,6EAA6E;gBAC7E,UAAU;gBACV,SAAS;gBACT,MAAM;gBACN,EAAE;gBACF,yEAAyE;gBACzE,0EAA0E;gBAC1E,uEAAuE;gBACvE,GAAG;gBACH,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,CAAC,4BAA4B,EAAE,IAAI,CAAC;gBAClC,IAAI,EAAE,YAAY;gBAClB,OAAO,EAAE,OAAO;gBAChB,OAAO,EAAE,IAAI;gBACb,IAAI,EAAE,QAAQ;gBACd,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,EAAE,SAAS,EAAE,EAAE,EAAE;gBACtD,YAAY,EAAE;oBACZ,eAAe,EAAE,IAAI;oBACrB,OAAO,EAAE,IAAI;oBACb,QAAQ,EAAE,IAAI;iBACf;aACF,CAAC,CAAC;QAEH,CAAC,mCAAmC,EAAE,IAAI,CAAC;gBACzC,SAAS,EAAE;oBACT;wBACE,IAAI,EAAE,gBAAgB;wBACtB,IAAI,EAAE,QAAQ;wBACd,KAAK,EAAE,OAAO;wBACd,WAAW,EAAE,sCAAsC;wBACnD,OAAO,EAAE,OAAO;qBACjB;iBACF;aACF,CAAC,CAAC;QAEH,CAAC,gCAAgC,EAAE;gBACjC,gDAAgD;gBAChD,EAAE;gBACF,KAAK;gBACL,6DAA6D;gBAC7D,0EAA0E;gBAC1E,mDAAmD;gBACnD,KAAK;gBACL,6DAA6D;gBAC7D,YAAY;gBACZ,kDAAkD;gBAClD,MAAM;gBACN,GAAG;gBACH,EAAE;gBACF,6EAA6E;gBAC7E,iEAAiE;gBACjE,gFAAgF;gBAChF,GAAG;gBACH,EAAE;gBACF,KAAK;gBACL,wEAAwE;gBACxE,mEAAmE;gBACnE,KAAK;gBACL,qDAAqD;gBACrD,0EAA0E;gBAC1E,GAAG;gBACH,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,CAAC,6BAA6B,EAAE;gBAC9B,sDAAsD;gBACtD,EAAE;gBACF,KAAK;gBACL,wEAAwE;gBACxE,uEAAuE;gBACvE,uEAAuE;gBACvE,8BAA8B;gBAC9B,KAAK;gBACL,2DAA2D;gBAC3D,oCAAoC;gBACpC,GAAG;gBACH,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,CAAC,mCAAmC,EAAE;gBACpC,KAAK;gBACL,uEAAuE;gBACvE,wEAAwE;gBACxE,yDAAyD;gBACzD,KAAK;gBACL,yEAAyE;gBACzE,uCAAuC;gBACvC,GAAG;gBACH,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,CAAC,gDAAgD,EAAE;gBACjD,mDAAmD;gBACnD,gDAAgD;gBAChD,EAAE;gBACF,yDAAyD;gBACzD,EAAE;gBACF,KAAK;gBACL,sEAAsE;gBACtE,wEAAwE;gBACxE,qCAAqC;gBACrC,IAAI;gBACJ,uEAAuE;gBACvE,uEAAuE;gBACvE,KAAK;gBACL,0CAA0C;gBAC1C,mDAAmD;gBACnD,qDAAqD;gBACrD,gBAAgB;gBAChB,qEAAqE;gBACrE,8BAA8B;gBAC9B,SAAS;gBACT,MAAM;gBACN,GAAG;gBACH,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,CAAC,sCAAsC,EAAE;gBACvC,mCAAmC;gBACnC,gDAAgD;gBAChD,iDAAiD;gBACjD,EAAE;gBACF,8DAA8D;gBAC9D,EAAE;gBACF,yDAAyD;gBACzD,4BAA4B;gBAC5B,gCAAgC;gBAChC,EAAE;gBACF,qEAAqE;gBACrE,+CAA+C;gBAC/C,kDAAkD;gBAClD,EAAE;gBACF,+CAA+C;gBAC/C,EAAE;gBACF,qEAAqE;gBACrE,yCAAyC;gBACzC,yDAAyD;gBACzD,0EAA0E;gBAC1E,sEAAsE;gBACtE,gEAAgE;gBAChE,0CAA0C;gBAC1C,yEAAyE;gBACzE,OAAO;gBACP,qEAAqE;gBACrE,OAAO;gBACP,EAAE;gBACF,mEAAmE;gBACnE,yEAAyE;gBACzE,8DAA8D;gBAC9D,yCAAyC;gBACzC,mEAAmE;gBACnE,OAAO;gBACP,kFAAkF;gBAClF,OAAO;gBACP,EAAE;gBACF,kBAAkB;gBAClB,GAAG;gBACH,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEb,CAAC,wCAAwC,EAAE;gBACzC,gDAAgD;gBAChD,8DAA8D;gBAC9D,EAAE;gBACF,KAAK;gBACL,0EAA0E;gBAC1E,sDAAsD;gBACtD,IAAI;gBACJ,+CAA+C;gBAC/C,KAAK;gBACL,wFAAwF;gBACxF,0CAA0C;gBAC1C,wCAAwC;gBACxC,iCAAiC;gBACjC,0CAA0C;gBAC1C,mCAAmC;gBACnC,WAAW;gBACX,EAAE;gBACF,yEAAyE;gBACzE,SAAS;gBACT,OAAO;gBACP,GAAG;gBACH,EAAE;aACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;KAGd,CAAC;IAEF,0EAA0E;IAC1E,KAAK,CAAC,IAAI,CACN,CAAC,wCAAwC,EAAE;YACzC,oCAAoC;YACpC,mDAAmD;YACnD,EAAE;YACF,KAAK;YACL,uEAAuE;YACvE,uEAAuE;YACvE,iDAAiD;YACjD,IAAI;YACJ,mEAAmE;YACnE,KAAK;YACL,oCAAoC;YACpC,KAAK;YACL,wFAAwF;YACxF,gDAAgD;YAChD,sDAAsD;YACtD,MAAM;YACN,yBAAyB;YACzB,IAAI;YACJ,EAAE;YACF,iFAAiF;YACjF,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAEb,CAAC,qDAAqD,EAAE;YACtD,gDAAgD;YAChD,EAAE;YACF,KAAK;YACL,mEAAmE;YACnE,6DAA6D;YAC7D,IAAI;YACJ,4EAA4E;YAC5E,8CAA8C;YAC9C,KAAK;YACL,+EAA+E;YAC/E,6CAA6C;YAC7C,EAAE;YACF,6BAA6B;YAC7B,wBAAwB;YACxB,oEAAoE;YACpE,uBAAuB;YACvB,MAAM;YACN,GAAG;YACH,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAEb,CAAC,sCAAsC,EAAE;YACvC,gDAAgD;YAChD,4DAA4D;YAC5D,EAAE;YACF,KAAK;YACL,2EAA2E;YAC3E,uEAAuE;YACvE,0DAA0D;YAC1D,IAAI;YACJ,sEAAsE;YACtE,KAAK;YACL,qFAAqF;YACrF,0CAA0C;YAC1C,EAAE;YACF,2DAA2D;YAC3D,uEAAuE;YACvE,wEAAwE;YACxE,oDAAoD;YACpD,oFAAoF;YACpF,+BAA+B;YAC/B,OAAO;YACP,GAAG;YACH,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAEb,CAAC,0CAA0C,EAAE;YAC3C,mCAAmC;YACnC,gDAAgD;YAChD,iDAAiD;YACjD,EAAE;YACF,KAAK;YACL,mEAAmE;YACnE,sEAAsE;YACtE,KAAK;YACL,oFAAoF;YACpF,4BAA4B;YAC5B,kDAAkD;YAClD,EAAE;YACF,4DAA4D;YAC5D,sEAAsE;YACtE,gEAAgE;YAChE,4EAA4E;YAC5E,4DAA4D;YAC5D,sFAAsF;YACtF,EAAE;YACF,qCAAqC;YACrC,wBAAwB;YACxB,eAAe;YACf,8CAA8C;YAC9C,qBAAqB;YACrB,gBAAgB;YAChB,EAAE;YACF,8DAA8D;YAC9D,OAAO;YACP,EAAE;YACF,uEAAuE;YACvE,kCAAkC;YAClC,8EAA8E;YAC9E,gFAAgF;YAChF,EAAE;YACF,qEAAqE;YACrE,qEAAqE;YACrE,mEAAmE;YACnE,mDAAmD;YACnD,OAAO;YACP,EAAE;YACF,kBAAkB;YAClB,GAAG;YACH,EAAE;SACL,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CACd,CAAC;IAEF,KAAK,CAAC,IAAI,CACR,CAAC,WAAW,EAAE;YACZ,KAAK,IAAI,EAAE;YACX,EAAE;YACF,uEAAuE;YACvE,EAAE;YACF,QAAQ;YACR,EAAE;YACF,OAAO;YACP,oEAAoE;YACpE,cAAc;YACd,4EAA4E;YAC5E,KAAK;YACL,EAAE;YACF,wEAAwE;YACxE,yEAAyE;YACzE,sBAAsB;YACtB,EAAE;YACF,qBAAqB;YACrB,EAAE;YACF,0EAA0E;YAC1E,0BAA0B;YAC1B,EAAE;YACF,qBAAqB;YACrB,WAAW;YACX,iEAAiE;YACjE,gFAAgF;YAChF,0DAA0D;YAC1D,mEAAmE;YACnE,oEAAoE;YACpE,6CAA6C;YAC7C,8DAA8D;YAC9D,sEAAsE;YACtE,uEAAuE;YACvE,iEAAiE;YACjE,EAAE;YACF,mBAAmB;YACnB,EAAE;YACF,oBAAoB;YACpB,WAAW;YACX,0EAA0E;YAC1E,4EAA4E;YAC5E,yEAAyE;YACzE,2EAA2E;YAC3E,4DAA4D;YAC5D,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CACd,CAAC;IAEF,OAAO,KAAK,CAAC;AACf,CAAC"}
|
package/dist/cli/main.js
CHANGED
|
@@ -11,7 +11,7 @@ import { runDev } from "./dev.js";
|
|
|
11
11
|
const HELP = `tulipes — module-based express framework
|
|
12
12
|
|
|
13
13
|
Usage:
|
|
14
|
-
tulipes init [dir] scaffold a new application (
|
|
14
|
+
tulipes init [dir] scaffold a new application (needs mongo + redis)
|
|
15
15
|
tulipes sync regenerate types/config.d.ts and .env.example
|
|
16
16
|
tulipes env:check validate env against every meta.variables.json (CI-friendly)
|
|
17
17
|
tulipes new module <name> scaffold a module under ./modules
|
|
@@ -16,6 +16,17 @@ export class HttpError extends Error {
|
|
|
16
16
|
this.details = details;
|
|
17
17
|
}
|
|
18
18
|
}
|
|
19
|
+
/**
|
|
20
|
+
* A 4xx carried on a non-HttpError (express, body-parser, multer…), or
|
|
21
|
+
* undefined when the error is ours to own as a 500.
|
|
22
|
+
*/
|
|
23
|
+
function clientErrorStatus(error) {
|
|
24
|
+
const candidate = error
|
|
25
|
+
?.status ?? error?.statusCode;
|
|
26
|
+
return typeof candidate === "number" && candidate >= 400 && candidate <= 499
|
|
27
|
+
? candidate
|
|
28
|
+
: undefined;
|
|
29
|
+
}
|
|
19
30
|
/** Terminal 404 — anything no router claimed. */
|
|
20
31
|
export function notFoundHandler() {
|
|
21
32
|
return (req, _res, next) => {
|
|
@@ -37,6 +48,16 @@ export function errorHandler(appEnv) {
|
|
|
37
48
|
});
|
|
38
49
|
return;
|
|
39
50
|
}
|
|
51
|
+
// Express middleware signals client faults with a numeric status on the
|
|
52
|
+
// error — a body over the parser's limit is 413, malformed JSON is 400.
|
|
53
|
+
// Flattening those to 500 would blame the server for the caller's
|
|
54
|
+
// mistake, so 4xx statuses are honored and their messages passed
|
|
55
|
+
// through (they describe the request, never our internals).
|
|
56
|
+
const status = clientErrorStatus(error);
|
|
57
|
+
if (status !== undefined) {
|
|
58
|
+
res.status(status).json({ error: error.message });
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
40
61
|
console.error("[http] unhandled error:", error);
|
|
41
62
|
res.status(500).json({
|
|
42
63
|
error: revealInternals
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/http/error-handler.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,MAAM,OAAO,SAAU,SAAQ,KAAK;IACzB,MAAM,CAAS;IACf,OAAO,CAAW;IAE3B,YAAY,MAAc,EAAE,OAAe,EAAE,OAAiB;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED,iDAAiD;AACjD,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QACzB,IAAI,CAAC,IAAI,SAAS,CAAC,GAAG,EAAE,gBAAgB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,MAAM,eAAe,GAAG,MAAM,KAAK,aAAa,IAAI,MAAM,KAAK,MAAM,CAAC;IAEtE,OAAO,CAAC,KAAc,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QAC1C,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;YAC/B,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;gBAC5B,KAAK,EAAE,KAAK,CAAC,OAAO;gBACpB,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;aAC/D,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAChD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE,eAAe;gBACpB,CAAC,CAAC,aAAc,KAAe,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;gBAC3D,CAAC,CAAC,uBAAuB;SAC5B,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
1
|
+
{"version":3,"file":"error-handler.js","sourceRoot":"","sources":["../../src/http/error-handler.ts"],"names":[],"mappings":"AAIA;;;;;;;GAOG;AACH,MAAM,OAAO,SAAU,SAAQ,KAAK;IACzB,MAAM,CAAS;IACf,OAAO,CAAW;IAE3B,YAAY,MAAc,EAAE,OAAe,EAAE,OAAiB;QAC5D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC;QACxB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAED;;;GAGG;AACH,SAAS,iBAAiB,CAAC,KAAc;IACvC,MAAM,SAAS,GAAI,KAA2D;QAC5E,EAAE,MAAM,IAAK,KAAyC,EAAE,UAAU,CAAC;IAErE,OAAO,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,IAAI,GAAG,IAAI,SAAS,IAAI,GAAG;QAC1E,CAAC,CAAC,SAAS;QACX,CAAC,CAAC,SAAS,CAAC;AAChB,CAAC;AAED,iDAAiD;AACjD,MAAM,UAAU,eAAe;IAC7B,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE;QACzB,IAAI,CAAC,IAAI,SAAS,CAAC,GAAG,EAAE,gBAAgB,GAAG,CAAC,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACrE,CAAC,CAAC;AACJ,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,YAAY,CAAC,MAAc;IACzC,MAAM,eAAe,GAAG,MAAM,KAAK,aAAa,IAAI,MAAM,KAAK,MAAM,CAAC;IAEtE,OAAO,CAAC,KAAc,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,EAAE;QAC1C,IAAI,KAAK,YAAY,SAAS,EAAE,CAAC;YAC/B,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC;gBAC5B,KAAK,EAAE,KAAK,CAAC,OAAO;gBACpB,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;aAC/D,CAAC,CAAC;YACH,OAAO;QACT,CAAC;QAED,wEAAwE;QACxE,wEAAwE;QACxE,kEAAkE;QAClE,iEAAiE;QACjE,4DAA4D;QAC5D,MAAM,MAAM,GAAG,iBAAiB,CAAC,KAAK,CAAC,CAAC;QACxC,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YACzB,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAG,KAAe,CAAC,OAAO,EAAE,CAAC,CAAC;YAC7D,OAAO;QACT,CAAC;QAED,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAChD,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC;YACnB,KAAK,EAAE,eAAe;gBACpB,CAAC,CAAC,aAAc,KAAe,EAAE,OAAO,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE;gBAC3D,CAAC,CAAC,uBAAuB;SAC5B,CAAC,CAAC;IACL,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -5,7 +5,7 @@ import { BootReport } from "../errors/boot-error.js";
|
|
|
5
5
|
* run in BOTH modes — definitions and processors are always registered — and
|
|
6
6
|
* the mode decides what happens with them:
|
|
7
7
|
*
|
|
8
|
-
*
|
|
8
|
+
* backend → queues produce; processors are registered but never started
|
|
9
9
|
* worker → `startWorkers()` turns every registered processor into a
|
|
10
10
|
* consuming BullMQ Worker
|
|
11
11
|
*
|
|
@@ -6,7 +6,7 @@ import { BootReport } from "../errors/boot-error.js";
|
|
|
6
6
|
* run in BOTH modes — definitions and processors are always registered — and
|
|
7
7
|
* the mode decides what happens with them:
|
|
8
8
|
*
|
|
9
|
-
*
|
|
9
|
+
* backend → queues produce; processors are registered but never started
|
|
10
10
|
* worker → `startWorkers()` turns every registered processor into a
|
|
11
11
|
* consuming BullMQ Worker
|
|
12
12
|
*
|
|
@@ -3,10 +3,10 @@ import { BootReport } from "../errors/boot-error.js";
|
|
|
3
3
|
import type { Ctx } from "../boot/contracts.js";
|
|
4
4
|
import type { ModuleFiles } from "../modules/explorer.js";
|
|
5
5
|
import { SocketManager, type SocketRegistry } from "./socket-manager.js";
|
|
6
|
-
/** Default export of `sockets/*.sockets.ts` (
|
|
6
|
+
/** Default export of `sockets/*.sockets.ts` (backend branch only). */
|
|
7
7
|
export type SocketsFn = (ctx: Ctx, sockets: SocketRegistry) => void | Promise<void>;
|
|
8
8
|
/**
|
|
9
|
-
* Phase
|
|
9
|
+
* Phase 11b: attach Socket.IO to the http server and run every
|
|
10
10
|
* `*.sockets.ts` in load order. No socket files → no Socket.IO server at
|
|
11
11
|
* all; websockets are opt-in per app, not a standing cost.
|
|
12
12
|
*/
|
|
@@ -2,7 +2,7 @@ import { BootReport } from "../errors/boot-error.js";
|
|
|
2
2
|
import { importFile } from "../boot/import-file.js";
|
|
3
3
|
import { SocketManager } from "./socket-manager.js";
|
|
4
4
|
/**
|
|
5
|
-
* Phase
|
|
5
|
+
* Phase 11b: attach Socket.IO to the http server and run every
|
|
6
6
|
* `*.sockets.ts` in load order. No socket files → no Socket.IO server at
|
|
7
7
|
* all; websockets are opt-in per app, not a standing cost.
|
|
8
8
|
*/
|
|
@@ -2,7 +2,7 @@ import type { Server as HttpServer } from "node:http";
|
|
|
2
2
|
import { Server, type Namespace, type ServerOptions } from "socket.io";
|
|
3
3
|
import { BootReport } from "../errors/boot-error.js";
|
|
4
4
|
/**
|
|
5
|
-
* Wraps the process-wide Socket.IO server (
|
|
5
|
+
* Wraps the process-wide Socket.IO server (backend branch only, phase 11b).
|
|
6
6
|
*
|
|
7
7
|
* Namespaces are the socket-side equivalent of route prefixes, and get the
|
|
8
8
|
* same ownership rule as everything else in Tulipes: a module claims its
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Server } from "socket.io";
|
|
2
2
|
import { BootReport } from "../errors/boot-error.js";
|
|
3
3
|
/**
|
|
4
|
-
* Wraps the process-wide Socket.IO server (
|
|
4
|
+
* Wraps the process-wide Socket.IO server (backend branch only, phase 11b).
|
|
5
5
|
*
|
|
6
6
|
* Namespaces are the socket-side equivalent of route prefixes, and get the
|
|
7
7
|
* same ownership rule as everything else in Tulipes: a module claims its
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@tulipes/core",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.5",
|
|
4
4
|
"description": "Module-based Express framework: convention-driven boot pipeline, env contracts, ACL, queues, sockets and CLI",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -20,7 +20,8 @@
|
|
|
20
20
|
"./errors": "./dist/errors/index.js"
|
|
21
21
|
},
|
|
22
22
|
"files": [
|
|
23
|
-
"dist"
|
|
23
|
+
"dist",
|
|
24
|
+
"templates"
|
|
24
25
|
],
|
|
25
26
|
"scripts": {
|
|
26
27
|
"typecheck": "tsc --noEmit",
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
# Working in this project
|
|
2
|
+
|
|
3
|
+
This is a **Tulipes** application (`@tulipes/core`) — a module-based Express
|
|
4
|
+
framework. It is convention-driven and deliberately fail-closed: almost
|
|
5
|
+
everything that can be validated at boot is, and a violation crashes the
|
|
6
|
+
process with a report rather than degrading quietly.
|
|
7
|
+
|
|
8
|
+
Writing plain Express here will fight the framework. Read the rule that
|
|
9
|
+
applies before you write code.
|
|
10
|
+
|
|
11
|
+
## Non-negotiable rules
|
|
12
|
+
|
|
13
|
+
1. **Never read `process.env` directly.** Every configuration value is
|
|
14
|
+
declared in a module's `meta.variables.json` and read with
|
|
15
|
+
`ctx.Environment.get("NAME")`. Reading an undeclared name throws on
|
|
16
|
+
purpose. → skill `tulipes-env-variable`
|
|
17
|
+
2. **A feature is a module, not a layer.** Everything a feature needs —
|
|
18
|
+
routes, models, config, permissions, jobs — lives in one folder under
|
|
19
|
+
`modules/`. Never add a top-level `services/` or `middlewares/` folder.
|
|
20
|
+
→ skill `tulipes-module`
|
|
21
|
+
3. **Never call `mongoose.model()` yourself.** Models are declarations
|
|
22
|
+
picked up by the framework and read from `ctx.models`. → skill
|
|
23
|
+
`tulipes-model`
|
|
24
|
+
4. **Global middleware belongs to a sys-tier module**, not to the
|
|
25
|
+
entrypoint. `app.ts` stays three lines. → skill `tulipes-endpoint`
|
|
26
|
+
5. **Run `yarn sync` after touching any `meta.variables.json` or
|
|
27
|
+
`module.config.ts`.** It regenerates `types/config.d.ts` and
|
|
28
|
+
`.env.example`; stale generated types are a lie.
|
|
29
|
+
6. **Errors are `HttpError`.** `throw new HttpError(404, "…")` from
|
|
30
|
+
anywhere in a route; the framework's terminal handler renders it.
|
|
31
|
+
Never hand-roll an error-response shape.
|
|
32
|
+
7. **Cross-module imports use the package name** (`@app/users`), never a
|
|
33
|
+
relative path that climbs out of the module. The workspace boundary is
|
|
34
|
+
what keeps modules independent.
|
|
35
|
+
|
|
36
|
+
## Where things go
|
|
37
|
+
|
|
38
|
+
| Decision | Location |
|
|
39
|
+
|---|---|
|
|
40
|
+
| Value differs per deployment (URL, secret, toggle) | that module's `meta.variables.json` |
|
|
41
|
+
| Policy shared by ≥2 modules (pagination, body limit) | `config/app.config.ts` |
|
|
42
|
+
| Config for one feature | that module's `module.config.ts` |
|
|
43
|
+
| Middleware for every request | a sys-tier module's routes file |
|
|
44
|
+
| Middleware for one feature's routes | that module's own `Router` |
|
|
45
|
+
| Helper used by ≥2 modules | `lib/` |
|
|
46
|
+
| Helper used by one module | that module's `helpers/` |
|
|
47
|
+
|
|
48
|
+
## Boot order (why load order matters)
|
|
49
|
+
|
|
50
|
+
`sys` modules load before `app` modules; within a tier, lower `priority`
|
|
51
|
+
first; then `dependsOn` topological order. Config → ACL → database →
|
|
52
|
+
queues → routes. If code needs something another module provides, declare
|
|
53
|
+
`dependsOn` — do not rely on luck.
|
|
54
|
+
|
|
55
|
+
## Commands
|
|
56
|
+
|
|
57
|
+
| Command | Use |
|
|
58
|
+
|---|---|
|
|
59
|
+
| `yarn dev` | run the backend process (regenerates types first) |
|
|
60
|
+
| `yarn worker` | run the queue-consumer process |
|
|
61
|
+
| `yarn sync` | regenerate `types/config.d.ts` + `.env.example` |
|
|
62
|
+
| `yarn check` | validate the environment without booting |
|
|
63
|
+
| `yarn typecheck` | typecheck the whole app |
|
|
64
|
+
| `yarn tulipes new module <name>` | scaffold a module |
|
|
65
|
+
|
|
66
|
+
## Verifying your work
|
|
67
|
+
|
|
68
|
+
A change is not done until the app boots. Run `yarn typecheck`, then
|
|
69
|
+
`yarn dev` and confirm the startup banner lists what you added (modules,
|
|
70
|
+
queues, sockets, roles). Boot failures print an aggregate report naming
|
|
71
|
+
every problem at once — read all of it before fixing anything. → skill
|
|
72
|
+
`tulipes-boot-errors`
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tulipes-boot-errors
|
|
3
|
+
description: Use when a Tulipes app fails to boot, when a route/model/queue you added is not being picked up, or when reading a TulipesBootError report. Maps each boot phase's crash message to its cause and fix.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Diagnosing a boot failure
|
|
7
|
+
|
|
8
|
+
Boot crashes with a `TulipesBootError` naming the phase and listing
|
|
9
|
+
**every** problem found in that phase:
|
|
10
|
+
|
|
11
|
+
```
|
|
12
|
+
TulipesBootError: Boot aborted during "environment" — 3 issue(s):
|
|
13
|
+
✖ [core] required variable "MONGO_URI" has no value (…)
|
|
14
|
+
✖ [users] variable "USERS_MAX_SESSIONS": "abc" is not a number
|
|
15
|
+
✖ [users] required variable "USERS_ADMIN_EMAIL" has no value (…)
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
**Read the whole list before changing anything.** The report is complete
|
|
19
|
+
for that phase — fixing one line at a time wastes restarts. Phases run in
|
|
20
|
+
order and stop at the first failing one, so a later phase may still hold
|
|
21
|
+
problems the report has not reached yet.
|
|
22
|
+
|
|
23
|
+
## By phase
|
|
24
|
+
|
|
25
|
+
| Phase | Typical message | Cause and fix |
|
|
26
|
+
|---|---|---|
|
|
27
|
+
| `environment` | `required variable "X" has no value` | Declared `required` but nothing supplies it. Add it to `.envs/.env.<APP_ENV>`, or give the spec a `default`. |
|
|
28
|
+
| `environment` | `"abc" is not a number` / `not one of: …` | Value fails its declared `type`/`enum`. Fix the value or the spec. |
|
|
29
|
+
| `environment` | `variable "X" is already declared by module "y"` | Two modules declare the same name. Delete the duplicate; read the other module's variable instead. |
|
|
30
|
+
| `module graph` | `dependsOn "x" — no such module exists` | Typo, or you used the package name. `dependsOn` takes short names (`"users"`). |
|
|
31
|
+
| `module graph` | `dependency cycle: a → b → a` | Mutual dependency. Move the shared part to `lib/` or a third module. |
|
|
32
|
+
| `module graph` | `sys module cannot depend on app module` | A sys module needs something app-tier. Either it is not really sys, or the dependency belongs in `lib/`. |
|
|
33
|
+
| `config` | `module.config must default-export a function` | Missing/misspelled `export default`. |
|
|
34
|
+
| `acl` | `allow() on unknown role "x"` | Role never defined. Define it in the sys `core` module, and `dependsOn` that module. |
|
|
35
|
+
| `acl` | `already granted … duplicate grant` | Two modules grant the same role+resource. Namespace the resource by module. |
|
|
36
|
+
| `database` | `connection failed` | Mongo unreachable or `MONGO_URI` wrong. Check the service is running. |
|
|
37
|
+
| `database` | `modules declare models but "MONGO_URI" is not declared` | Add the variable to the sys `core` module's meta file. |
|
|
38
|
+
| `queues` | `queue name … is invalid` | Queue names use `.`, not `:`. |
|
|
39
|
+
| `routes` | `must default-export a routes function` | Missing `export default` in a `*.routes.ts`. |
|
|
40
|
+
|
|
41
|
+
## "My file is being ignored"
|
|
42
|
+
|
|
43
|
+
The framework discovers files by convention. If something you added never
|
|
44
|
+
runs, check in this order:
|
|
45
|
+
|
|
46
|
+
1. **Filename suffix** — `*.routes.ts`, `*.model.ts`, `*.queues.ts`,
|
|
47
|
+
`*.sockets.ts`, `*.bootstrap.ts`, `module.config.ts`, `module.acl.ts`.
|
|
48
|
+
A file named `users.route.ts` (no `s`) is invisible.
|
|
49
|
+
2. **Directory** — routes in `routes/`, models in `models/`, and so on.
|
|
50
|
+
Nested subfolders are not scanned.
|
|
51
|
+
3. **The module is registered** — it needs a `package.json` and a
|
|
52
|
+
`yarn install` after creation. The startup banner lists every module it
|
|
53
|
+
found; if yours is missing, the problem is there.
|
|
54
|
+
4. **`export default`** — every contract file except models exports a
|
|
55
|
+
function as its default.
|
|
56
|
+
|
|
57
|
+
## Other symptoms
|
|
58
|
+
|
|
59
|
+
- **Types are `unknown` or a new variable is not typed** → run `yarn sync`.
|
|
60
|
+
- **Worker exits immediately** → no processors registered; it refuses to
|
|
61
|
+
idle. Add a `*.queues.ts` with `process()`.
|
|
62
|
+
- **Env change has no effect** → `process.env` beats the file. Check for a
|
|
63
|
+
shell export or container variable of the same name.
|
|
64
|
+
- To validate configuration without booting the whole app: `yarn check`.
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tulipes-endpoint
|
|
3
|
+
description: Use when adding or changing an HTTP endpoint in a Tulipes app, mounting middleware, handling request errors, or wondering where global middleware goes. Covers the routes contract, HttpError, validation and the request pipeline order.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Adding an endpoint
|
|
7
|
+
|
|
8
|
+
Routes live in `modules/<name>/routes/*.routes.ts`. The file
|
|
9
|
+
default-exports a function that receives the context and returns a Router.
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
import { Router } from "express";
|
|
13
|
+
import type { Ctx } from "@tulipes/core/boot";
|
|
14
|
+
import { HttpError } from "@tulipes/core/http";
|
|
15
|
+
|
|
16
|
+
export default function billingRoutes({ config, models }: Ctx): Router {
|
|
17
|
+
const router = Router();
|
|
18
|
+
|
|
19
|
+
router.get("/invoices/:id", async (req, res) => {
|
|
20
|
+
const invoice = await models!.get("Invoice").findById(req.params.id).lean();
|
|
21
|
+
if (!invoice) throw new HttpError(404, "no such invoice");
|
|
22
|
+
res.json(invoice);
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
return router;
|
|
26
|
+
}
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Then `yarn dev` and hit the route. Nothing else is registered anywhere —
|
|
30
|
+
the framework discovers the file.
|
|
31
|
+
|
|
32
|
+
## Errors
|
|
33
|
+
|
|
34
|
+
Throw `HttpError(status, message, details?)`. Express 5 forwards rejected
|
|
35
|
+
async handlers to the framework's terminal handler, so `throw` works
|
|
36
|
+
inside `async` routes without a try/catch.
|
|
37
|
+
|
|
38
|
+
- `HttpError` → `{ error, details? }` with your status.
|
|
39
|
+
- Middleware errors carrying a 4xx (oversized body → 413, malformed JSON →
|
|
40
|
+
400) are passed through.
|
|
41
|
+
- Anything else → anonymous `500`, with the real message only in
|
|
42
|
+
development. **Never** catch an error just to `res.status(500).json(...)`
|
|
43
|
+
yourself; you would leak internals that the framework hides.
|
|
44
|
+
|
|
45
|
+
## The request pipeline
|
|
46
|
+
|
|
47
|
+
```
|
|
48
|
+
module routers, in load order:
|
|
49
|
+
sys modules global middleware (request ids, helmet, cors, logging, body parsing)
|
|
50
|
+
app modules your feature routes
|
|
51
|
+
notFoundHandler framework — 404 for anything unclaimed
|
|
52
|
+
errorHandler framework — terminal
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
- **Middleware for every request** → a sys-tier module's routes file,
|
|
56
|
+
mounted on `ctx.app` (that file returns nothing). Sys modules load
|
|
57
|
+
first, which is what puts it ahead of all feature routes.
|
|
58
|
+
- **Middleware for one feature** → `router.use(...)` inside that module's
|
|
59
|
+
own routes file, or per-route as a handler argument.
|
|
60
|
+
- Never mount middleware in `app.ts`, and never reorder by moving
|
|
61
|
+
`app.use` calls around — ordering is `tier` + `priority`.
|
|
62
|
+
|
|
63
|
+
## Permissions
|
|
64
|
+
|
|
65
|
+
Check with the ACL rather than ad-hoc role comparisons:
|
|
66
|
+
|
|
67
|
+
```ts
|
|
68
|
+
if (!acl!.can(req.user.role, "invoices:write")) {
|
|
69
|
+
throw new HttpError(403, "forbidden");
|
|
70
|
+
}
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
Grants are declared in `module.acl.ts` → skill `tulipes-permissions`.
|
|
74
|
+
|
|
75
|
+
## Conventions worth following
|
|
76
|
+
|
|
77
|
+
- Validate input at the edge and throw `HttpError(422, …)` with details.
|
|
78
|
+
- Clamp list endpoints with the shared bounds:
|
|
79
|
+
`config.pagination!.defaultLimit` / `maxLimit`.
|
|
80
|
+
- Build paths from `config.api!.prefix` instead of hardcoding `/api/v1`.
|
|
81
|
+
- Keep handlers thin; put real work in `controllers/` or `helpers/` and
|
|
82
|
+
import it directly (the framework does not scan those folders).
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tulipes-env-variable
|
|
3
|
+
description: Use when adding or changing any configuration value in a Tulipes app — API keys, connection strings, feature toggles, limits — or when tempted to read process.env. Covers meta.variables.json, the resolution precedence and typed reads.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Adding a configuration value
|
|
7
|
+
|
|
8
|
+
**Never read `process.env` directly.** Every value is declared by exactly
|
|
9
|
+
one module and read through the typed store. An undeclared read throws, so
|
|
10
|
+
a typo can never reach production as `undefined`.
|
|
11
|
+
|
|
12
|
+
## Steps
|
|
13
|
+
|
|
14
|
+
1. Choose the owning module. Infra shared by everything (`PORT`,
|
|
15
|
+
`MONGO_URI`, `REDIS_URL`) belongs to the sys `core` module; anything
|
|
16
|
+
feature-specific belongs to that feature's module.
|
|
17
|
+
2. Declare it in that module's `meta.variables.json`:
|
|
18
|
+
|
|
19
|
+
```json
|
|
20
|
+
{
|
|
21
|
+
"variables": [
|
|
22
|
+
{
|
|
23
|
+
"name": "STRIPE_API_KEY",
|
|
24
|
+
"type": "secret",
|
|
25
|
+
"group": "billing",
|
|
26
|
+
"required": true,
|
|
27
|
+
"description": "Server-side Stripe key"
|
|
28
|
+
},
|
|
29
|
+
{
|
|
30
|
+
"name": "BILLING_TRIAL_DAYS",
|
|
31
|
+
"type": "number",
|
|
32
|
+
"group": "billing",
|
|
33
|
+
"description": "Free trial length",
|
|
34
|
+
"default": 14
|
|
35
|
+
}
|
|
36
|
+
]
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
3. Add a value to `.envs/.env.development` for anything `required`.
|
|
41
|
+
4. `yarn sync` — regenerates `types/config.d.ts` (so the read is typed)
|
|
42
|
+
and `.env.example` (so deployments know what to set).
|
|
43
|
+
5. Read it: `Environment.get("BILLING_TRIAL_DAYS")` → typed `number`.
|
|
44
|
+
|
|
45
|
+
## Field rules
|
|
46
|
+
|
|
47
|
+
| Field | Rule |
|
|
48
|
+
|---|---|
|
|
49
|
+
| `name` | UPPER_SNAKE, and **globally unique** — two modules declaring the same name crash the boot. Do not re-declare a variable another module owns; just read it. |
|
|
50
|
+
| `type` | `string` · `number` · `boolean` · `enum` · `url` · `secret`. Values are coerced (`"14"` → `14`) and validated. |
|
|
51
|
+
| `enum` | Required with `type: "enum"`. Generates a literal union type. |
|
|
52
|
+
| `required` | No value anywhere → boot crash. Mutually exclusive with `default`. |
|
|
53
|
+
| `default` | Used when nothing supplies a value. Never put a real credential here. |
|
|
54
|
+
| `group` | Free-form label; groups the variable in the generated `.env.example`. |
|
|
55
|
+
|
|
56
|
+
Use `secret` for anything sensitive — those values are redacted in logs,
|
|
57
|
+
reports and the startup banner.
|
|
58
|
+
|
|
59
|
+
## Precedence
|
|
60
|
+
|
|
61
|
+
`process.env` › `.envs/.env.<APP_ENV>` › `default`. Container-injected
|
|
62
|
+
values always win, which is why deployments need no file.
|
|
63
|
+
|
|
64
|
+
## Where it does NOT go
|
|
65
|
+
|
|
66
|
+
- Value shared by several modules but the same everywhere (pagination
|
|
67
|
+
limits, body size) → `config/app.config.ts`, not a variable.
|
|
68
|
+
- Value used by one module and never changed per deployment → that
|
|
69
|
+
module's `module.config.ts`.
|
|
70
|
+
|
|
71
|
+
## Gotchas
|
|
72
|
+
|
|
73
|
+
- `Environment.get()` on an undeclared name **throws**. If you added the
|
|
74
|
+
entry and still get the error, you did not run `yarn sync`, or you
|
|
75
|
+
edited a different module's meta file than the one you are reading from.
|
|
76
|
+
- `APP_ENV` (not `NODE_ENV`) selects the env file.
|
|
77
|
+
- A missing `required` variable is not a runtime surprise — the boot
|
|
78
|
+
aborts and lists every missing variable at once.
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tulipes-model
|
|
3
|
+
description: Use when adding or changing a database model in a Tulipes app, querying from a route or job, seeding data, or ensuring indexes. Covers the ModelDef contract, the model store and bootstrap tasks.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Adding a model
|
|
7
|
+
|
|
8
|
+
Model files are **declarations**, not registrations. Never call
|
|
9
|
+
`mongoose.model()` — the framework compiles the schema on its own
|
|
10
|
+
connection and puts it in the model store.
|
|
11
|
+
|
|
12
|
+
`modules/billing/models/invoice.model.ts`:
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
import { Schema } from "mongoose";
|
|
16
|
+
import type { ModelDef } from "@tulipes/core/db";
|
|
17
|
+
|
|
18
|
+
const invoiceSchema = new Schema({
|
|
19
|
+
customer: { type: Schema.Types.ObjectId, ref: "User", required: true },
|
|
20
|
+
amountCents: { type: Number, required: true, min: 0 },
|
|
21
|
+
status: { type: String, enum: ["draft", "paid"], default: "draft", index: true },
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
export default { name: "Invoice", schema: invoiceSchema } satisfies ModelDef;
|
|
25
|
+
```
|
|
26
|
+
|
|
27
|
+
Read it anywhere the context reaches:
|
|
28
|
+
|
|
29
|
+
```ts
|
|
30
|
+
const Invoice = models!.get("Invoice");
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
`models.get()` throws on an unregistered name (listing what does exist),
|
|
34
|
+
so a typo fails at the call site instead of returning `undefined`.
|
|
35
|
+
|
|
36
|
+
## Requirements
|
|
37
|
+
|
|
38
|
+
- The database needs `MONGO_URI` declared (sys `core` module) and set. A
|
|
39
|
+
module that ships models without it is a boot refusal, not a warning.
|
|
40
|
+
- Model names are globally unique; two modules registering `Invoice`
|
|
41
|
+
crashes the boot naming both.
|
|
42
|
+
- Reference other modules' models by name (`ref: "User"`) — no import,
|
|
43
|
+
therefore no coupling.
|
|
44
|
+
|
|
45
|
+
## Seeding and indexes
|
|
46
|
+
|
|
47
|
+
Put anything that must run after models exist but before the server
|
|
48
|
+
accepts traffic in `modules/<name>/bootstrap/*.bootstrap.ts`:
|
|
49
|
+
|
|
50
|
+
```ts
|
|
51
|
+
import type { Ctx } from "@tulipes/core/boot";
|
|
52
|
+
|
|
53
|
+
export default async function seedPlans({ models }: Ctx): Promise<void> {
|
|
54
|
+
const Plan = models!.get("Plan");
|
|
55
|
+
await Plan.updateOne(
|
|
56
|
+
{ code: "free" },
|
|
57
|
+
{ $setOnInsert: { code: "free", priceCents: 0 } },
|
|
58
|
+
{ upsert: true },
|
|
59
|
+
);
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
**Make bootstrap tasks idempotent** — they run on every boot, in every
|
|
64
|
+
process, including each worker. Upsert; never blind-insert.
|
|
65
|
+
|
|
66
|
+
## Gotchas
|
|
67
|
+
|
|
68
|
+
- Global plugins (timestamps, soft delete) only apply to schemas compiled
|
|
69
|
+
*after* registration, which is why `registerBasePlugins()` runs in
|
|
70
|
+
`app.ts` before `boot()`. Adding a plugin later than that silently
|
|
71
|
+
misses your models.
|
|
72
|
+
- Mongoose queries are lazy: `await` them, and prefer `.lean()` for reads
|
|
73
|
+
you only serialize.
|
|
74
|
+
- If the app soft-deletes, ordinary queries already exclude deleted rows;
|
|
75
|
+
use `.withDeleted()` / `.onlyDeleted()` to opt out deliberately.
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: tulipes-module
|
|
3
|
+
description: Use when adding a new feature to a Tulipes app — a new module under modules/ — or when deciding whether something belongs in an existing module, a new one, or lib/. Covers the tulipes manifest key, tier, priority, dependsOn and workspace wiring.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# Adding a module
|
|
7
|
+
|
|
8
|
+
A module is one feature, one folder, one workspace package. It owns its
|
|
9
|
+
routes, models, config, permissions and jobs, and can be deleted without
|
|
10
|
+
touching anything else.
|
|
11
|
+
|
|
12
|
+
## Decide first
|
|
13
|
+
|
|
14
|
+
- **Extend an existing module** when the work is part of that feature
|
|
15
|
+
(another users endpoint → `modules/users`).
|
|
16
|
+
- **New module** when it is a separate feature with its own vocabulary.
|
|
17
|
+
- **`lib/`** when it is a helper with no routes/models of its own, shared
|
|
18
|
+
by two or more modules.
|
|
19
|
+
|
|
20
|
+
## Steps
|
|
21
|
+
|
|
22
|
+
1. Scaffold: `yarn tulipes new module billing`. It creates the folder,
|
|
23
|
+
`package.json` (scope detected from siblings), `meta.variables.json`,
|
|
24
|
+
`module.config.ts` and a routes file.
|
|
25
|
+
2. Set ordering in `modules/billing/package.json`:
|
|
26
|
+
|
|
27
|
+
```json
|
|
28
|
+
{
|
|
29
|
+
"name": "@app/billing",
|
|
30
|
+
"tulipes": { "tier": "app", "priority": 100, "dependsOn": ["users"] },
|
|
31
|
+
"dependencies": { "@tulipes/core": "^0.1.3", "express": "^5" }
|
|
32
|
+
}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
3. `yarn install` — the module is a workspace, so the package manager must
|
|
36
|
+
link it before imports resolve.
|
|
37
|
+
4. Add only what the feature needs (every file is optional): `routes/`,
|
|
38
|
+
`models/`, `queues/`, `sockets/`, `bootstrap/`, `module.acl.ts`.
|
|
39
|
+
5. `yarn sync && yarn dev` — the banner must list the module.
|
|
40
|
+
|
|
41
|
+
## The manifest key
|
|
42
|
+
|
|
43
|
+
| Field | Meaning |
|
|
44
|
+
|---|---|
|
|
45
|
+
| `tier` | `sys` loads before every `app` module. Use `sys` **only** for framework-level concerns: global middleware, roles, infra variables. A business feature is always `app`. |
|
|
46
|
+
| `priority` | Lower loads earlier within a tier. Default 100. Use it for coarse ordering, not for dependencies. |
|
|
47
|
+
| `dependsOn` | Short names (`"users"`, not `"@app/users"`) of modules that must load first. Declare this whenever you import from another module or read its config. |
|
|
48
|
+
|
|
49
|
+
## Gotchas
|
|
50
|
+
|
|
51
|
+
- **`dependsOn` and the npm dependency are two different things.** To
|
|
52
|
+
import `@app/users` you need it in `dependencies` (resolution) *and* in
|
|
53
|
+
`dependsOn` (load order). Missing the first fails at import; missing the
|
|
54
|
+
second gives you a module whose config namespace may not exist yet.
|
|
55
|
+
- A `sys` module may not `dependsOn` an `app` module — that inverts the
|
|
56
|
+
tier guarantee and crashes the boot.
|
|
57
|
+
- Cycles crash the boot with the cycle printed. If two modules need each
|
|
58
|
+
other, the shared part belongs in `lib/` or a third module.
|
|
59
|
+
- The folder name is cosmetic; the **short name** (last segment of the
|
|
60
|
+
package name) is what `dependsOn` and the config namespace use.
|