@slopware/sloppy-darwin-x64 0.1.0-alpha.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 (434) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +5 -0
  3. package/bin/sloppy +0 -0
  4. package/bin/sloppyc +0 -0
  5. package/docs/KNOWN_LIMITATIONS.md +16 -0
  6. package/docs/LICENSES.md +6 -0
  7. package/docs/NOTICE.md +8 -0
  8. package/examples/README.md +140 -0
  9. package/examples/auth-api/README.md +20 -0
  10. package/examples/auth-api/app.js +61 -0
  11. package/examples/auth-api/appsettings.json +7 -0
  12. package/examples/auth-api/sloppy.json +5 -0
  13. package/examples/cache-basic/README.md +9 -0
  14. package/examples/cache-basic/app.js +32 -0
  15. package/examples/cache-hybrid-postgres/README.md +10 -0
  16. package/examples/cache-hybrid-postgres/app.js +27 -0
  17. package/examples/cache-output-api/README.md +10 -0
  18. package/examples/cache-output-api/app.js +35 -0
  19. package/examples/codec-base64-hex/README.md +14 -0
  20. package/examples/codec-base64-hex/app.js +15 -0
  21. package/examples/codec-checksums/README.md +15 -0
  22. package/examples/codec-checksums/app.js +8 -0
  23. package/examples/codec-compression/README.md +13 -0
  24. package/examples/codec-compression/app.js +9 -0
  25. package/examples/codec-streaming-compression/README.md +19 -0
  26. package/examples/codec-streaming-compression/app.js +16 -0
  27. package/examples/codec-text-binary/README.md +16 -0
  28. package/examples/codec-text-binary/app.js +17 -0
  29. package/examples/compiler-hello/README.md +71 -0
  30. package/examples/compiler-hello/app.js +7 -0
  31. package/examples/compiler-hello/expected/app.js +8 -0
  32. package/examples/compiler-hello/expected/app.js.map +53 -0
  33. package/examples/compiler-hello/expected/app.plan.json +229 -0
  34. package/examples/compiler-hello/expected/routes.slrt +0 -0
  35. package/examples/config-basic/README.md +13 -0
  36. package/examples/config-basic/app.js +13 -0
  37. package/examples/config-basic/appsettings.json +7 -0
  38. package/examples/config-secrets-redaction/README.md +9 -0
  39. package/examples/config-secrets-redaction/app.js +9 -0
  40. package/examples/config-secrets-redaction/appsettings.json +5 -0
  41. package/examples/config-strict-mode/README.md +7 -0
  42. package/examples/config-strict-mode/app.js +10 -0
  43. package/examples/config-strict-mode/appsettings.json +7 -0
  44. package/examples/configured-api/README.md +38 -0
  45. package/examples/configured-api/app.js +12 -0
  46. package/examples/configured-api/appsettings.Development.json +5 -0
  47. package/examples/configured-api/appsettings.json +6 -0
  48. package/examples/configured-api/sloppy.json +5 -0
  49. package/examples/core-config-secrets/README.md +10 -0
  50. package/examples/core-config-secrets/app.js +15 -0
  51. package/examples/core-fs-time-codec/README.md +9 -0
  52. package/examples/core-fs-time-codec/app.js +8 -0
  53. package/examples/core-network-time-codec/README.md +11 -0
  54. package/examples/core-network-time-codec/app.js +20 -0
  55. package/examples/core-policy-audit/README.md +7 -0
  56. package/examples/core-policy-audit/app.js +22 -0
  57. package/examples/core-process-time-codec/README.md +8 -0
  58. package/examples/core-process-time-codec/app.js +28 -0
  59. package/examples/core-worker-time/README.md +8 -0
  60. package/examples/core-worker-time/app.js +17 -0
  61. package/examples/crypto-hash-hmac/README.md +17 -0
  62. package/examples/crypto-hash-hmac/app.js +29 -0
  63. package/examples/crypto-password/README.md +21 -0
  64. package/examples/crypto-password/app.js +12 -0
  65. package/examples/crypto-random-token/README.md +16 -0
  66. package/examples/crypto-random-token/app.js +12 -0
  67. package/examples/crypto-secret-constant-time/README.md +21 -0
  68. package/examples/crypto-secret-constant-time/app.js +15 -0
  69. package/examples/data-foundation/README.md +39 -0
  70. package/examples/data-foundation/app.js +63 -0
  71. package/examples/dependency-graph/README.md +19 -0
  72. package/examples/dependency-graph/fixtures/graph-helper/index.js +3 -0
  73. package/examples/dependency-graph/fixtures/graph-helper/package.json +6 -0
  74. package/examples/dependency-graph/package.json +7 -0
  75. package/examples/dependency-graph/public/message.txt +1 -0
  76. package/examples/dependency-graph/sloppy.json +9 -0
  77. package/examples/dependency-graph/src/main.ts +8 -0
  78. package/examples/dogfood/README.md +23 -0
  79. package/examples/dogfood/dogfood.json +136 -0
  80. package/examples/dynamic-module-include/README.md +20 -0
  81. package/examples/dynamic-module-include/public/readme.txt +1 -0
  82. package/examples/dynamic-module-include/sloppy.json +12 -0
  83. package/examples/dynamic-module-include/src/main.ts +6 -0
  84. package/examples/dynamic-module-include/src/plugins/alpha.js +3 -0
  85. package/examples/dynamic-module-include/src/plugins/beta.js +3 -0
  86. package/examples/ergonomics/README.md +42 -0
  87. package/examples/ergonomics/app.js +38 -0
  88. package/examples/framework-controller/README.md +12 -0
  89. package/examples/framework-controller/app.js +31 -0
  90. package/examples/framework-di-services/README.md +17 -0
  91. package/examples/framework-di-services/app.ts +40 -0
  92. package/examples/framework-explicit-binding/README.md +12 -0
  93. package/examples/framework-explicit-binding/app.ts +34 -0
  94. package/examples/framework-hello/README.md +16 -0
  95. package/examples/framework-hello/app.ts +16 -0
  96. package/examples/framework-postgres-crud/README.md +73 -0
  97. package/examples/framework-postgres-crud/app.ts +64 -0
  98. package/examples/framework-sqlite-crud/README.md +52 -0
  99. package/examples/framework-sqlite-crud/app.ts +90 -0
  100. package/examples/framework-sqlite-crud/appsettings.json +11 -0
  101. package/examples/framework-sqlserver-crud/README.md +73 -0
  102. package/examples/framework-sqlserver-crud/app.ts +64 -0
  103. package/examples/framework-validation-errors/README.md +12 -0
  104. package/examples/framework-validation-errors/app.ts +16 -0
  105. package/examples/fs-basic/README.md +24 -0
  106. package/examples/fs-basic/app.js +12 -0
  107. package/examples/fs-roots-policy/README.md +14 -0
  108. package/examples/fs-roots-policy/app.js +4 -0
  109. package/examples/fs-streams/README.md +18 -0
  110. package/examples/fs-streams/app.js +11 -0
  111. package/examples/fs-watch/README.md +19 -0
  112. package/examples/fs-watch/app.js +11 -0
  113. package/examples/hello/README.md +63 -0
  114. package/examples/hello/app.js +19 -0
  115. package/examples/hello-minimal/README.md +51 -0
  116. package/examples/hello-minimal/sloppy.json +5 -0
  117. package/examples/hello-minimal/src/main.ts +9 -0
  118. package/examples/http-client-basic/README.md +11 -0
  119. package/examples/http-client-basic/app.js +46 -0
  120. package/examples/http-client-generated/README.md +22 -0
  121. package/examples/http-client-generated/openapi.json +45 -0
  122. package/examples/http-client-resilience/README.md +4 -0
  123. package/examples/http-client-resilience/app.js +38 -0
  124. package/examples/http-client-runtime-loopback/README.md +24 -0
  125. package/examples/http-client-testhost/README.md +4 -0
  126. package/examples/http-client-testhost/app.js +27 -0
  127. package/examples/http-client-testhost-package-mock/README.md +26 -0
  128. package/examples/http-client-typed/README.md +5 -0
  129. package/examples/http-client-typed/app.js +33 -0
  130. package/examples/modules-api/README.md +30 -0
  131. package/examples/modules-api/app.js +9 -0
  132. package/examples/modules-api/modules/routes.js +16 -0
  133. package/examples/modules-api/sloppy.json +5 -0
  134. package/examples/modules-basic/README.md +32 -0
  135. package/examples/modules-basic/app.js +41 -0
  136. package/examples/net-deadline-cancel/README.md +13 -0
  137. package/examples/net-deadline-cancel/app.js +34 -0
  138. package/examples/net-local-ipc/README.md +12 -0
  139. package/examples/net-local-ipc/app.js +46 -0
  140. package/examples/net-policy-strict/README.md +12 -0
  141. package/examples/net-policy-strict/app.js +34 -0
  142. package/examples/net-tcp-client/README.md +10 -0
  143. package/examples/net-tcp-client/app.js +23 -0
  144. package/examples/net-tcp-echo/README.md +11 -0
  145. package/examples/net-tcp-echo/app.js +45 -0
  146. package/examples/net-tcp-server/README.md +10 -0
  147. package/examples/net-tcp-server/app.js +28 -0
  148. package/examples/node-compat-path-events/README.md +15 -0
  149. package/examples/node-compat-path-events/sloppy.json +6 -0
  150. package/examples/node-compat-path-events/src/main.ts +15 -0
  151. package/examples/ops-compiler/README.md +9 -0
  152. package/examples/ops-compiler/app.js +26 -0
  153. package/examples/ops-health-metrics-management/README.md +14 -0
  154. package/examples/ops-health-metrics-management/app.js +24 -0
  155. package/examples/orm-basic/README.md +17 -0
  156. package/examples/orm-basic/app.js +82 -0
  157. package/examples/orm-cursor-export/README.md +16 -0
  158. package/examples/orm-cursor-export/app.js +28 -0
  159. package/examples/orm-migrations/README.md +14 -0
  160. package/examples/orm-migrations/migrations/.gitkeep +1 -0
  161. package/examples/orm-migrations/sloppy.json +9 -0
  162. package/examples/orm-migrations/src/app.ts +34 -0
  163. package/examples/orm-relations-includes/README.md +10 -0
  164. package/examples/orm-relations-includes/app.js +47 -0
  165. package/examples/orm-testservices/README.md +37 -0
  166. package/examples/orm-testservices/test.mjs +32 -0
  167. package/examples/os-runtime-api/README.md +11 -0
  168. package/examples/os-runtime-api/app.js +44 -0
  169. package/examples/package-zod-like/README.md +28 -0
  170. package/examples/package-zod-like/fixtures/zod-like/index.js +48 -0
  171. package/examples/package-zod-like/fixtures/zod-like/package.json +12 -0
  172. package/examples/package-zod-like/package.json +7 -0
  173. package/examples/package-zod-like/sloppy.json +6 -0
  174. package/examples/package-zod-like/src/main.ts +16 -0
  175. package/examples/postgres-basic/README.md +31 -0
  176. package/examples/postgres-basic/app.js +50 -0
  177. package/examples/prealpha-control-plane/README.md +50 -0
  178. package/examples/prealpha-control-plane/appsettings.Development.json +11 -0
  179. package/examples/prealpha-control-plane/appsettings.json +15 -0
  180. package/examples/prealpha-control-plane/sloppy.json +5 -0
  181. package/examples/prealpha-control-plane/src/db/schema.js +7 -0
  182. package/examples/prealpha-control-plane/src/db/seed.js +6 -0
  183. package/examples/prealpha-control-plane/src/main.js +21 -0
  184. package/examples/prealpha-control-plane/src/routes/apps.js +34 -0
  185. package/examples/prealpha-control-plane/src/routes/builds.js +25 -0
  186. package/examples/prealpha-control-plane/src/routes/deployments.js +19 -0
  187. package/examples/prealpha-control-plane/src/routes/diagnostics.js +11 -0
  188. package/examples/prealpha-control-plane/src/routes/health.js +27 -0
  189. package/examples/prealpha-control-plane/src/routes/projects.js +38 -0
  190. package/examples/prealpha-control-plane/src/services/diagnosticsSink.js +11 -0
  191. package/examples/prealpha-control-plane/src/services/repositories.js +9 -0
  192. package/examples/prealpha-control-plane/src/validation/schemas.js +6 -0
  193. package/examples/program-fs-process/README.md +31 -0
  194. package/examples/program-fs-process/sloppy.json +9 -0
  195. package/examples/program-fs-process/src/main.ts +27 -0
  196. package/examples/program-hello/README.md +32 -0
  197. package/examples/program-hello/main.ts +8 -0
  198. package/examples/program-hello/message.ts +1 -0
  199. package/examples/program-hello/sloppy.json +5 -0
  200. package/examples/rate-limit-auth/README.md +3 -0
  201. package/examples/rate-limit-auth/app.js +14 -0
  202. package/examples/rate-limit-basic/README.md +3 -0
  203. package/examples/rate-limit-basic/app.js +13 -0
  204. package/examples/rate-limit-redis/README.md +5 -0
  205. package/examples/rate-limit-redis/app.js +20 -0
  206. package/examples/rate-limit-testhost/README.md +4 -0
  207. package/examples/rate-limit-testhost/app.js +13 -0
  208. package/examples/rate-limit-websocket/README.md +3 -0
  209. package/examples/rate-limit-websocket/app.js +16 -0
  210. package/examples/realtime-auth/README.md +8 -0
  211. package/examples/realtime-auth/app.js +25 -0
  212. package/examples/realtime-auth/test.mjs +43 -0
  213. package/examples/realtime-chat/README.md +8 -0
  214. package/examples/realtime-chat/app.js +32 -0
  215. package/examples/realtime-chat/test.mjs +52 -0
  216. package/examples/realtime-dashboard/README.md +20 -0
  217. package/examples/realtime-dashboard/app.js +37 -0
  218. package/examples/realtime-presence/README.md +8 -0
  219. package/examples/realtime-presence/app.js +32 -0
  220. package/examples/realtime-presence/test.mjs +50 -0
  221. package/examples/realtime-testhost/README.md +8 -0
  222. package/examples/realtime-testhost/test.mjs +31 -0
  223. package/examples/redis-basic/README.md +17 -0
  224. package/examples/redis-basic/app.js +39 -0
  225. package/examples/redis-cache/README.md +14 -0
  226. package/examples/redis-cache/app.js +36 -0
  227. package/examples/redis-locks/README.md +13 -0
  228. package/examples/redis-locks/app.js +49 -0
  229. package/examples/request-context/README.md +32 -0
  230. package/examples/request-context/app.js +15 -0
  231. package/examples/sqlite-basic/README.md +52 -0
  232. package/examples/sqlite-basic/app.js +56 -0
  233. package/examples/sqlserver-basic/README.md +36 -0
  234. package/examples/sqlserver-basic/app.js +59 -0
  235. package/examples/static-files-basic/README.md +11 -0
  236. package/examples/static-files-basic/app.js +12 -0
  237. package/examples/static-files-basic/public/app.js +1 -0
  238. package/examples/static-files-basic/public/site.css +3 -0
  239. package/examples/static-files-package/README.md +12 -0
  240. package/examples/static-files-package/app.js +10 -0
  241. package/examples/static-files-package/public/index.html +2 -0
  242. package/examples/static-files-precompressed/README.md +12 -0
  243. package/examples/static-files-precompressed/app.js +11 -0
  244. package/examples/static-files-precompressed/public/app.js +1 -0
  245. package/examples/static-files-precompressed/public/app.js.br +0 -0
  246. package/examples/static-files-precompressed/public/app.js.gz +0 -0
  247. package/examples/static-files-spa/README.md +12 -0
  248. package/examples/static-files-spa/app.js +16 -0
  249. package/examples/static-files-spa/dist/assets/app.js +1 -0
  250. package/examples/static-files-spa/dist/index.html +4 -0
  251. package/examples/static-files-testhost/README.md +8 -0
  252. package/examples/static-files-testhost/app.js +13 -0
  253. package/examples/static-files-testhost/public/app.js +1 -0
  254. package/examples/static-files-testhost/public/app.js.gz +0 -0
  255. package/examples/static-files-testhost/test.mjs +38 -0
  256. package/examples/testhost-basic/README.md +26 -0
  257. package/examples/testhost-db/README.md +31 -0
  258. package/examples/testservices-postgres/README.md +68 -0
  259. package/examples/testservices-redis/README.md +71 -0
  260. package/examples/testservices-sqlserver/README.md +75 -0
  261. package/examples/time-basic/README.md +18 -0
  262. package/examples/time-basic/app.js +12 -0
  263. package/examples/time-deadline-cancellation/README.md +11 -0
  264. package/examples/time-deadline-cancellation/app.js +27 -0
  265. package/examples/time-fake-clock/README.md +14 -0
  266. package/examples/time-fake-clock/app.js +25 -0
  267. package/examples/time-interval-schedule/README.md +13 -0
  268. package/examples/time-interval-schedule/app.js +60 -0
  269. package/examples/users-api-sqlite/README.md +74 -0
  270. package/examples/users-api-sqlite/app.js +11 -0
  271. package/examples/users-api-sqlite/appsettings.Development.json +11 -0
  272. package/examples/users-api-sqlite/appsettings.json +11 -0
  273. package/examples/users-api-sqlite/modules/users.js +40 -0
  274. package/examples/users-api-sqlite/sloppy.json +5 -0
  275. package/examples/validation-errors/README.md +36 -0
  276. package/examples/validation-errors/app.js +14 -0
  277. package/examples/validation-errors/invalid-user.http +6 -0
  278. package/examples/validation-errors/sloppy.json +5 -0
  279. package/examples/web-dynamic-routes/README.md +17 -0
  280. package/examples/web-dynamic-routes/app.ts +27 -0
  281. package/examples/webhooks-basic/README.md +11 -0
  282. package/examples/webhooks-basic/app.js +48 -0
  283. package/examples/websocket-auth/README.md +8 -0
  284. package/examples/websocket-auth/app.js +16 -0
  285. package/examples/websocket-echo/README.md +9 -0
  286. package/examples/websocket-echo/app.js +36 -0
  287. package/examples/websocket-json-schema/README.md +5 -0
  288. package/examples/websocket-json-schema/app.js +25 -0
  289. package/examples/websocket-testhost/README.md +11 -0
  290. package/examples/websocket-testhost/test.mjs +49 -0
  291. package/examples/workers-background-service/README.md +7 -0
  292. package/examples/workers-background-service/app.js +16 -0
  293. package/examples/workers-js-isolate/README.md +8 -0
  294. package/examples/workers-js-isolate/app.js +19 -0
  295. package/examples/workers-js-isolate/workers/parser.ts +11 -0
  296. package/examples/workers-shutdown/README.md +6 -0
  297. package/examples/workers-shutdown/app.js +26 -0
  298. package/examples/workers-workerpool/README.md +6 -0
  299. package/examples/workers-workerpool/app.js +23 -0
  300. package/examples/workers-workqueue/README.md +8 -0
  301. package/examples/workers-workqueue/app.js +24 -0
  302. package/manifest.json +59 -0
  303. package/package.json +31 -0
  304. package/stdlib/sloppy/README.md +177 -0
  305. package/stdlib/sloppy/app.js +2142 -0
  306. package/stdlib/sloppy/auth.js +1813 -0
  307. package/stdlib/sloppy/bootstrap.manifest.json +83 -0
  308. package/stdlib/sloppy/cache.js +1542 -0
  309. package/stdlib/sloppy/codec.js +1153 -0
  310. package/stdlib/sloppy/config.js +61 -0
  311. package/stdlib/sloppy/crypto.js +312 -0
  312. package/stdlib/sloppy/data.js +2945 -0
  313. package/stdlib/sloppy/ffi.js +185 -0
  314. package/stdlib/sloppy/fs.js +795 -0
  315. package/stdlib/sloppy/health.js +603 -0
  316. package/stdlib/sloppy/http.js +1595 -0
  317. package/stdlib/sloppy/index.js +59 -0
  318. package/stdlib/sloppy/internal/bytes.js +31 -0
  319. package/stdlib/sloppy/internal/capabilities.js +155 -0
  320. package/stdlib/sloppy/internal/config.js +640 -0
  321. package/stdlib/sloppy/internal/disposable.js +31 -0
  322. package/stdlib/sloppy/internal/headers.js +63 -0
  323. package/stdlib/sloppy/internal/intrinsics.js +2 -0
  324. package/stdlib/sloppy/internal/json.js +20 -0
  325. package/stdlib/sloppy/internal/logging.js +278 -0
  326. package/stdlib/sloppy/internal/modules.js +405 -0
  327. package/stdlib/sloppy/internal/redaction.js +87 -0
  328. package/stdlib/sloppy/internal/routes.js +2279 -0
  329. package/stdlib/sloppy/internal/runtime-classic.js +19837 -0
  330. package/stdlib/sloppy/internal/services.js +690 -0
  331. package/stdlib/sloppy/internal/shared.js +32 -0
  332. package/stdlib/sloppy/internal/testhost-diagnostics.js +88 -0
  333. package/stdlib/sloppy/internal/testhost-http-server.js +238 -0
  334. package/stdlib/sloppy/internal/testhost-http.js +118 -0
  335. package/stdlib/sloppy/internal/testhost-loopback.js +50 -0
  336. package/stdlib/sloppy/internal/testservices-docker.js +154 -0
  337. package/stdlib/sloppy/internal/validation.js +117 -0
  338. package/stdlib/sloppy/metrics.js +427 -0
  339. package/stdlib/sloppy/net.js +5208 -0
  340. package/stdlib/sloppy/node/assert/strict.js +39 -0
  341. package/stdlib/sloppy/node/assert.js +228 -0
  342. package/stdlib/sloppy/node/buffer.js +247 -0
  343. package/stdlib/sloppy/node/console.js +33 -0
  344. package/stdlib/sloppy/node/constants.js +9 -0
  345. package/stdlib/sloppy/node/crypto.js +89 -0
  346. package/stdlib/sloppy/node/diagnostics_channel.js +41 -0
  347. package/stdlib/sloppy/node/events.js +113 -0
  348. package/stdlib/sloppy/node/fs/promises.js +27 -0
  349. package/stdlib/sloppy/node/fs.js +280 -0
  350. package/stdlib/sloppy/node/http.js +11 -0
  351. package/stdlib/sloppy/node/https.js +11 -0
  352. package/stdlib/sloppy/node/module.js +40 -0
  353. package/stdlib/sloppy/node/os.js +22 -0
  354. package/stdlib/sloppy/node/path.js +78 -0
  355. package/stdlib/sloppy/node/perf_hooks.js +12 -0
  356. package/stdlib/sloppy/node/process.js +129 -0
  357. package/stdlib/sloppy/node/querystring.js +21 -0
  358. package/stdlib/sloppy/node/stream/promises.js +3 -0
  359. package/stdlib/sloppy/node/stream.js +132 -0
  360. package/stdlib/sloppy/node/string_decoder.js +23 -0
  361. package/stdlib/sloppy/node/timers.js +26 -0
  362. package/stdlib/sloppy/node/tty.js +18 -0
  363. package/stdlib/sloppy/node/url.js +17 -0
  364. package/stdlib/sloppy/node/util.js +95 -0
  365. package/stdlib/sloppy/node/zlib.js +72 -0
  366. package/stdlib/sloppy/orm.js +2188 -0
  367. package/stdlib/sloppy/os.js +580 -0
  368. package/stdlib/sloppy/problem-details.js +29 -0
  369. package/stdlib/sloppy/providers/sqlite.js +26 -0
  370. package/stdlib/sloppy/rate-limit.js +856 -0
  371. package/stdlib/sloppy/realtime.js +1508 -0
  372. package/stdlib/sloppy/redis.js +1272 -0
  373. package/stdlib/sloppy/request-id.js +184 -0
  374. package/stdlib/sloppy/request-logging.js +101 -0
  375. package/stdlib/sloppy/results.js +933 -0
  376. package/stdlib/sloppy/schema.js +546 -0
  377. package/stdlib/sloppy/testing.js +4081 -0
  378. package/stdlib/sloppy/testservices.js +1041 -0
  379. package/stdlib/sloppy/time.js +894 -0
  380. package/stdlib/sloppy/webhooks.js +1330 -0
  381. package/stdlib/sloppy/workers.js +986 -0
  382. package/templates/api/README.md +82 -0
  383. package/templates/api/appsettings.Development.json +14 -0
  384. package/templates/api/appsettings.json +13 -0
  385. package/templates/api/data/.gitkeep +1 -0
  386. package/templates/api/gitignore +4 -0
  387. package/templates/api/migrations/0001_create_users.sql +1 -0
  388. package/templates/api/package.json +16 -0
  389. package/templates/api/public/hello.txt +1 -0
  390. package/templates/api/sloppy.json +14 -0
  391. package/templates/api/src/config.ts +1 -0
  392. package/templates/api/src/db/migrate.ts +14 -0
  393. package/templates/api/src/db/schema.ts +4 -0
  394. package/templates/api/src/db/usersRepository.ts +23 -0
  395. package/templates/api/src/main.ts +18 -0
  396. package/templates/api/src/models/user.ts +7 -0
  397. package/templates/api/src/routes/health.ts +20 -0
  398. package/templates/api/src/routes/users.ts +40 -0
  399. package/templates/api/src/services/usersService.ts +21 -0
  400. package/templates/api/tsconfig.json +15 -0
  401. package/templates/cli/README.md +16 -0
  402. package/templates/cli/gitignore +2 -0
  403. package/templates/cli/package.json +13 -0
  404. package/templates/cli/sloppy.json +6 -0
  405. package/templates/cli/src/commands/echo.ts +9 -0
  406. package/templates/cli/src/commands/inspect.ts +20 -0
  407. package/templates/cli/src/main.ts +50 -0
  408. package/templates/cli/tsconfig.json +15 -0
  409. package/templates/minimal-api/README.md +14 -0
  410. package/templates/minimal-api/gitignore +3 -0
  411. package/templates/minimal-api/package.json +14 -0
  412. package/templates/minimal-api/sloppy.json +5 -0
  413. package/templates/minimal-api/src/main.ts +9 -0
  414. package/templates/minimal-api/tsconfig.json +15 -0
  415. package/templates/node-compat/README.md +40 -0
  416. package/templates/node-compat/gitignore +2 -0
  417. package/templates/node-compat/package.json +11 -0
  418. package/templates/node-compat/sloppy.json +6 -0
  419. package/templates/node-compat/src/main.ts +40 -0
  420. package/templates/package-api/README.md +44 -0
  421. package/templates/package-api/fixtures/validator-lite/index.js +7 -0
  422. package/templates/package-api/fixtures/validator-lite/package.json +6 -0
  423. package/templates/package-api/gitignore +3 -0
  424. package/templates/package-api/package.json +17 -0
  425. package/templates/package-api/sloppy.json +5 -0
  426. package/templates/package-api/src/main.ts +10 -0
  427. package/templates/package-api/src/routes/health.ts +5 -0
  428. package/templates/package-api/src/routes/users.ts +12 -0
  429. package/templates/package-api/tsconfig.json +15 -0
  430. package/templates/program/README.md +12 -0
  431. package/templates/program/gitignore +1 -0
  432. package/templates/program/package.json +10 -0
  433. package/templates/program/sloppy.json +6 -0
  434. package/templates/program/src/main.ts +9 -0
@@ -0,0 +1,690 @@
1
+ import { isPromiseLike } from "./shared.js";
2
+ import { Cache, isCache } from "../cache.js";
3
+ import { Http } from "../http.js";
4
+ import { Redis } from "../redis.js";
5
+
6
+ function validateServiceToken(token) {
7
+ if (typeof token === "string" && token.length !== 0) {
8
+ return;
9
+ }
10
+ if (
11
+ token !== null &&
12
+ typeof token === "object" &&
13
+ typeof token.__sloppyHttpClientToken === "string" &&
14
+ token.__sloppyHttpClientToken.length !== 0
15
+ ) {
16
+ return;
17
+ }
18
+ if (
19
+ token !== null &&
20
+ typeof token === "object" &&
21
+ typeof token.__sloppyRedisToken === "string" &&
22
+ token.__sloppyRedisToken.length !== 0
23
+ ) {
24
+ return;
25
+ }
26
+ throw new TypeError("Sloppy service token must be a non-empty string or supported typed service token.");
27
+ }
28
+
29
+ function serviceTokenDisplay(token) {
30
+ return normalizeServiceToken(token);
31
+ }
32
+
33
+ function normalizeServiceToken(token) {
34
+ validateServiceToken(token);
35
+ if (typeof token === "string") {
36
+ return token;
37
+ }
38
+ return token.__sloppyHttpClientToken ?? token.__sloppyRedisToken;
39
+ }
40
+
41
+ function cacheServiceToken(name = "default") {
42
+ return Cache.token(name);
43
+ }
44
+
45
+ function validateCacheInstance(cache) {
46
+ if (!isCache(cache) || typeof cache.stats !== "function") {
47
+ throw new TypeError("Sloppy services.addCache expects a Cache instance.");
48
+ }
49
+ }
50
+
51
+ function validateWebhooksDescriptor(descriptor) {
52
+ if (
53
+ descriptor === null ||
54
+ typeof descriptor !== "object" ||
55
+ descriptor.__sloppyWebhooksOutboxRegistration !== true ||
56
+ typeof descriptor.token !== "string" ||
57
+ descriptor.token.length === 0 ||
58
+ typeof descriptor.createService !== "function"
59
+ ) {
60
+ throw new TypeError("Sloppy services.addWebhooks expects Webhooks.outbox(...).");
61
+ }
62
+ return descriptor;
63
+ }
64
+
65
+ function createServicesBuilder(guard) {
66
+ const registrations = new Map();
67
+ let currentModule = null;
68
+
69
+ function addRegistration(token, registration) {
70
+ guard.assertMutable();
71
+ const normalizedToken = normalizeServiceToken(token);
72
+
73
+ if (registrations.has(normalizedToken)) {
74
+ throw new Error(`Sloppy service '${serviceTokenDisplay(normalizedToken)}' is already registered.`);
75
+ }
76
+
77
+ registrations.set(normalizedToken, {
78
+ ...registration,
79
+ module: currentModule,
80
+ });
81
+ return services;
82
+ }
83
+
84
+ const services = {
85
+ addSingleton(token, factoryOrValue) {
86
+ const registration = {
87
+ lifetime: "singleton",
88
+ factory: typeof factoryOrValue === "function" ? factoryOrValue : null,
89
+ value: factoryOrValue,
90
+ initialized: typeof factoryOrValue !== "function",
91
+ };
92
+
93
+ return addRegistration(token, registration);
94
+ },
95
+
96
+ addCache(cacheOrName, nameOrOptions = undefined) {
97
+ guard.assertMutable();
98
+ const cache = typeof cacheOrName === "string"
99
+ ? Cache.redis(cacheOrName, nameOrOptions ?? {})
100
+ : cacheOrName;
101
+ validateCacheInstance(cache);
102
+ const cacheName = typeof cacheOrName === "string" ? cache.name : nameOrOptions ?? cache.name ?? "default";
103
+ return addRegistration(cacheServiceToken(cacheName), {
104
+ lifetime: "singleton",
105
+ factory: null,
106
+ value: cache,
107
+ initialized: true,
108
+ });
109
+ },
110
+
111
+
112
+ addRedis(clientOrName, options = undefined) {
113
+ guard.assertMutable();
114
+
115
+ const client = typeof clientOrName === "string"
116
+ ? Redis.client(clientOrName, options ?? {})
117
+ : clientOrName;
118
+ const registration = client?.__sloppyRedisRegistration;
119
+ if (registration === undefined) {
120
+ throw new TypeError("Sloppy services.addRedis expects Redis.client or a client name with options.");
121
+ }
122
+
123
+ addRegistration(registration.token, {
124
+ lifetime: "singleton",
125
+ initialized: true,
126
+ value: client,
127
+ });
128
+ return services;
129
+ },
130
+ addTransient(token, factory) {
131
+ guard.assertMutable();
132
+
133
+ if (typeof factory !== "function") {
134
+ throw new TypeError("Sloppy transient service factory must be a function.");
135
+ }
136
+
137
+ return addRegistration(token, {
138
+ lifetime: "transient",
139
+ factory,
140
+ });
141
+ },
142
+
143
+ addScoped(token, factory) {
144
+ guard.assertMutable();
145
+
146
+ if (typeof factory !== "function") {
147
+ throw new TypeError("Sloppy scoped service factory must be a function.");
148
+ }
149
+
150
+ return addRegistration(token, {
151
+ lifetime: "scoped",
152
+ factory,
153
+ });
154
+ },
155
+
156
+ addHttpClient(clientOrName, options = undefined) {
157
+ guard.assertMutable();
158
+
159
+ const client = typeof clientOrName === "string"
160
+ ? Http.client(clientOrName, options ?? {})
161
+ : clientOrName;
162
+ const registration = client?.__sloppyHttpClientRegistration;
163
+ if (registration === undefined) {
164
+ throw new TypeError("Sloppy services.addHttpClient expects Http.client, Http.typedClient, or a client name with options.");
165
+ }
166
+
167
+ const namedToken = normalizeServiceToken(registration.namedToken ?? registration.token);
168
+ if (!registrations.has(namedToken)) {
169
+ addRegistration(namedToken, {
170
+ lifetime: "singleton",
171
+ initialized: false,
172
+ factory(scope) {
173
+ return registration.createNamed(scope.config);
174
+ },
175
+ });
176
+ } else if (registration.kind !== "typed") {
177
+ throw new Error(`Sloppy service '${serviceTokenDisplay(namedToken)}' is already registered.`);
178
+ }
179
+
180
+ if (registration.kind === "typed") {
181
+ addRegistration(registration.token, {
182
+ lifetime: "transient",
183
+ factory(scope) {
184
+ return registration.createTyped(scope.get(namedToken));
185
+ },
186
+ });
187
+ }
188
+
189
+ return services;
190
+ },
191
+
192
+ addWebhooks(descriptor) {
193
+ guard.assertMutable();
194
+
195
+ const registration = validateWebhooksDescriptor(descriptor);
196
+ return addRegistration(registration.token, {
197
+ lifetime: "singleton",
198
+ initialized: false,
199
+ factory(scope) {
200
+ return registration.createService(scope);
201
+ },
202
+ webhooks: typeof registration.__sloppyPlanMetadata === "function"
203
+ ? registration.__sloppyPlanMetadata()
204
+ : undefined,
205
+ });
206
+ },
207
+
208
+ __snapshot() {
209
+ return new Map(Array.from(registrations.entries(), ([token, registration]) => [
210
+ token,
211
+ { ...registration },
212
+ ]));
213
+ },
214
+
215
+ __runInModule(moduleName, callback) {
216
+ const previousModule = currentModule;
217
+ currentModule = moduleName;
218
+
219
+ try {
220
+ return callback(services);
221
+ } finally {
222
+ currentModule = previousModule;
223
+ }
224
+ },
225
+ };
226
+
227
+ return Object.freeze(services);
228
+ }
229
+
230
+
231
+ function combineCleanupErrors(primary, cleanup) {
232
+ return new AggregateError([primary, cleanup], "Sloppy cleanup failed after a handler error.");
233
+ }
234
+
235
+ function cleanupAfterSuccess(result, cleanup) {
236
+ const cleanupResult = cleanup();
237
+ if (isPromiseLike(cleanupResult)) {
238
+ return Promise.resolve(cleanupResult).then(() => result);
239
+ }
240
+ return result;
241
+ }
242
+
243
+ function cleanupAfterFailure(error, cleanup) {
244
+ try {
245
+ const cleanupResult = cleanup();
246
+ if (isPromiseLike(cleanupResult)) {
247
+ return Promise.resolve(cleanupResult).then(
248
+ () => {
249
+ throw error;
250
+ },
251
+ (cleanupError) => {
252
+ throw combineCleanupErrors(error, cleanupError);
253
+ },
254
+ );
255
+ }
256
+ } catch (cleanupError) {
257
+ throw combineCleanupErrors(error, cleanupError);
258
+ }
259
+ throw error;
260
+ }
261
+
262
+ function finishWithCleanup(result, cleanup) {
263
+ if (isPromiseLike(result)) {
264
+ return Promise.resolve(result).then(
265
+ (value) => cleanupAfterSuccess(value, cleanup),
266
+ (error) => cleanupAfterFailure(error, cleanup),
267
+ );
268
+ }
269
+ return cleanupAfterSuccess(result, cleanup);
270
+ }
271
+
272
+ function createServiceProvider(registrations, capabilities, config = undefined) {
273
+ const normalizedRegistrations = new Map();
274
+ const originalTokens = new Map();
275
+ for (const [token, registration] of registrations.entries()) {
276
+ const normalizedToken = normalizeServiceToken(token);
277
+ if (normalizedRegistrations.has(normalizedToken)) {
278
+ throw new Error(`Sloppy service '${serviceTokenDisplay(normalizedToken)}' is already registered; '${serviceTokenDisplay(token)}' conflicts with '${serviceTokenDisplay(originalTokens.get(normalizedToken))}'.`);
279
+ }
280
+ normalizedRegistrations.set(normalizedToken, registration);
281
+ originalTokens.set(normalizedToken, token);
282
+ }
283
+ registrations = normalizedRegistrations;
284
+ const singletonDisposables = [];
285
+ let providerDisposed = false;
286
+
287
+ function disposeValue(value) {
288
+ if (value === null || value === undefined) {
289
+ return undefined;
290
+ }
291
+ if (typeof value[Symbol.dispose] === "function") {
292
+ return value[Symbol.dispose]();
293
+ }
294
+ if (typeof value.dispose === "function") {
295
+ return value.dispose();
296
+ }
297
+ if (typeof value.close === "function") {
298
+ return value.close();
299
+ }
300
+ return undefined;
301
+ }
302
+
303
+ function disposalError(errors, message) {
304
+ if (errors.length === 1) {
305
+ return errors[0];
306
+ }
307
+ return new AggregateError(errors, message);
308
+ }
309
+
310
+ function disposeValues(values, message) {
311
+ const errors = [];
312
+ const pending = [];
313
+ for (const value of values) {
314
+ try {
315
+ const result = disposeValue(value);
316
+ if (isPromiseLike(result)) {
317
+ pending.push(Promise.resolve(result).catch((error) => {
318
+ errors.push(error);
319
+ }));
320
+ }
321
+ } catch (error) {
322
+ errors.push(error);
323
+ }
324
+ }
325
+
326
+ if (pending.length === 0) {
327
+ if (errors.length !== 0) {
328
+ throw disposalError(errors, message);
329
+ }
330
+ return undefined;
331
+ }
332
+
333
+ return Promise.all(pending).then(() => {
334
+ if (errors.length !== 0) {
335
+ throw disposalError(errors, message);
336
+ }
337
+ return undefined;
338
+ });
339
+ }
340
+
341
+ function createRootScope() {
342
+ const resolving = [];
343
+ const resolvingLifetimes = [];
344
+ const scope = Object.freeze({
345
+ capabilities,
346
+ config,
347
+ get(token) {
348
+ return resolve(scope, token);
349
+ },
350
+ tryGet(token) {
351
+ const normalizedToken = normalizeServiceToken(token);
352
+ if (providerDisposed) {
353
+ throw new Error("Sloppy service provider is disposed.");
354
+ }
355
+ if (!registrations.has(normalizedToken)) {
356
+ return undefined;
357
+ }
358
+ return resolve(scope, normalizedToken);
359
+ },
360
+ __disposed() {
361
+ return false;
362
+ },
363
+ __hasScoped() {
364
+ return false;
365
+ },
366
+ __getScoped() {
367
+ return undefined;
368
+ },
369
+ __setScoped() {
370
+ throw new Error("Sloppy root service scope cannot store scoped services.");
371
+ },
372
+ __trackTransient(value) {
373
+ singletonDisposables.push(value);
374
+ },
375
+ __resolving() {
376
+ return resolving;
377
+ },
378
+ __resolvingLifetimes() {
379
+ return resolvingLifetimes;
380
+ },
381
+ __pushResolving(token, lifetime) {
382
+ resolving.push(token);
383
+ resolvingLifetimes.push(lifetime);
384
+ },
385
+ __popResolving() {
386
+ resolving.pop();
387
+ resolvingLifetimes.pop();
388
+ },
389
+ });
390
+ return scope;
391
+ }
392
+
393
+ function resolve(scope, token) {
394
+ const normalizedToken = normalizeServiceToken(token);
395
+
396
+ if (providerDisposed) {
397
+ throw new Error("Sloppy service provider is disposed.");
398
+ }
399
+
400
+ if (scope.__disposed()) {
401
+ throw new Error("Sloppy service scope is disposed.");
402
+ }
403
+
404
+ if (!registrations.has(normalizedToken)) {
405
+ throw new Error(`Sloppy service '${serviceTokenDisplay(normalizedToken)}' is not registered.`);
406
+ }
407
+
408
+ const registration = registrations.get(normalizedToken);
409
+
410
+ if (scope.__resolving().includes(normalizedToken)) {
411
+ throw new Error(`Sloppy service circular dependency detected: ${[...scope.__resolving(), normalizedToken].map(serviceTokenDisplay).join(" -> ")}.`);
412
+ }
413
+
414
+ if (
415
+ registration.lifetime === "scoped" &&
416
+ scope.__resolvingLifetimes().includes("singleton")
417
+ ) {
418
+ throw new Error(`Sloppy singleton service cannot depend on scoped service '${serviceTokenDisplay(normalizedToken)}'.`);
419
+ }
420
+
421
+ if (registration.lifetime === "singleton") {
422
+ if (!registration.initialized) {
423
+ rootScope.__pushResolving(normalizedToken, "singleton");
424
+ try {
425
+ registration.value = registration.factory(rootScope);
426
+ singletonDisposables.push(registration.value);
427
+ } finally {
428
+ rootScope.__popResolving();
429
+ }
430
+ registration.initialized = true;
431
+ }
432
+
433
+ return registration.value;
434
+ }
435
+
436
+ if (registration.lifetime === "scoped") {
437
+ if (!scope.__hasScoped(normalizedToken)) {
438
+ scope.__pushResolving(normalizedToken, "scoped");
439
+ try {
440
+ scope.__setScoped(normalizedToken, registration.factory(scope));
441
+ } finally {
442
+ scope.__popResolving();
443
+ }
444
+ }
445
+ return scope.__getScoped(normalizedToken);
446
+ }
447
+
448
+ scope.__pushResolving(normalizedToken, "transient");
449
+ try {
450
+ const value = registration.factory(scope);
451
+ scope.__trackTransient(value);
452
+ return value;
453
+ } finally {
454
+ scope.__popResolving();
455
+ }
456
+ }
457
+
458
+ function createScope() {
459
+ const scopedValues = new Map();
460
+ const scopeOwnedValues = [];
461
+ const resolving = [];
462
+ const resolvingLifetimes = [];
463
+ let disposed = false;
464
+
465
+ const scope = Object.freeze({
466
+ capabilities,
467
+ config,
468
+ get(token) {
469
+ return resolve(scope, token);
470
+ },
471
+ tryGet(token) {
472
+ const normalizedToken = normalizeServiceToken(token);
473
+ if (providerDisposed) {
474
+ throw new Error("Sloppy service provider is disposed.");
475
+ }
476
+ if (disposed) {
477
+ throw new Error("Sloppy service scope is disposed.");
478
+ }
479
+ if (!registrations.has(normalizedToken)) {
480
+ return undefined;
481
+ }
482
+ return resolve(scope, normalizedToken);
483
+ },
484
+ dispose() {
485
+ if (disposed) {
486
+ return undefined;
487
+ }
488
+ disposed = true;
489
+ return disposeValues([...scopeOwnedValues].reverse(), "Sloppy service scope disposal failed.");
490
+ },
491
+ __disposed() {
492
+ return disposed;
493
+ },
494
+ __hasScoped(token) {
495
+ return scopedValues.has(token);
496
+ },
497
+ __getScoped(token) {
498
+ return scopedValues.get(token);
499
+ },
500
+ __setScoped(token, value) {
501
+ scopedValues.set(token, value);
502
+ scopeOwnedValues.push(value);
503
+ },
504
+ __trackTransient(value) {
505
+ scopeOwnedValues.push(value);
506
+ },
507
+ __resolving() {
508
+ return resolving;
509
+ },
510
+ __resolvingLifetimes() {
511
+ return resolvingLifetimes;
512
+ },
513
+ __pushResolving(token, lifetime) {
514
+ resolving.push(token);
515
+ resolvingLifetimes.push(lifetime);
516
+ },
517
+ __popResolving() {
518
+ resolving.pop();
519
+ resolvingLifetimes.pop();
520
+ },
521
+ });
522
+
523
+ return scope;
524
+ }
525
+
526
+ const rootScope = createRootScope();
527
+
528
+ function addHttpClient(clientOrName, options = undefined) {
529
+ if (providerDisposed) {
530
+ throw new Error("Sloppy service provider is disposed.");
531
+ }
532
+ const client = typeof clientOrName === "string"
533
+ ? Http.client(clientOrName, options ?? {})
534
+ : clientOrName;
535
+ const registration = client?.__sloppyHttpClientRegistration;
536
+ if (registration === undefined) {
537
+ throw new TypeError("Sloppy services.addHttpClient expects Http.client, Http.typedClient, or a client name with options.");
538
+ }
539
+
540
+ const namedToken = normalizeServiceToken(registration.namedToken ?? registration.token);
541
+ if (!registrations.has(namedToken)) {
542
+ registrations.set(namedToken, {
543
+ lifetime: "singleton",
544
+ initialized: false,
545
+ factory(scope) {
546
+ return registration.createNamed(scope.config);
547
+ },
548
+ });
549
+ } else if (registration.kind !== "typed") {
550
+ throw new Error(`Sloppy service '${serviceTokenDisplay(namedToken)}' is already registered.`);
551
+ }
552
+
553
+ if (registration.kind === "typed") {
554
+ const typedToken = normalizeServiceToken(registration.token);
555
+ if (registrations.has(typedToken)) {
556
+ throw new Error(`Sloppy service '${serviceTokenDisplay(typedToken)}' is already registered.`);
557
+ }
558
+ registrations.set(typedToken, {
559
+ lifetime: "transient",
560
+ factory(scope) {
561
+ return registration.createTyped(scope.get(namedToken));
562
+ },
563
+ });
564
+ }
565
+
566
+ return provider;
567
+ }
568
+
569
+ function addWebhooks(descriptor) {
570
+ if (providerDisposed) {
571
+ throw new Error("Sloppy service provider is disposed.");
572
+ }
573
+ const registration = validateWebhooksDescriptor(descriptor);
574
+ if (registrations.has(registration.token)) {
575
+ throw new Error(`Sloppy service '${registration.token}' is already registered.`);
576
+ }
577
+ registrations.set(registration.token, {
578
+ lifetime: "singleton",
579
+ initialized: false,
580
+ factory(scope) {
581
+ return registration.createService(scope);
582
+ },
583
+ webhooks: typeof registration.__sloppyPlanMetadata === "function"
584
+ ? registration.__sloppyPlanMetadata()
585
+ : undefined,
586
+ });
587
+ return provider;
588
+ }
589
+
590
+ function addRedis(clientOrName, options = undefined) {
591
+ if (providerDisposed) {
592
+ throw new Error("Sloppy service provider is disposed.");
593
+ }
594
+ const client = typeof clientOrName === "string"
595
+ ? Redis.client(clientOrName, options ?? {})
596
+ : clientOrName;
597
+ const registration = client?.__sloppyRedisRegistration;
598
+ if (registration === undefined) {
599
+ throw new TypeError("Sloppy services.addRedis expects Redis.client or a client name with options.");
600
+ }
601
+ const token = normalizeServiceToken(registration.token);
602
+ if (registrations.has(token)) {
603
+ throw new Error(`Sloppy service '${serviceTokenDisplay(token)}' is already registered.`);
604
+ }
605
+ registrations.set(token, {
606
+ lifetime: "singleton",
607
+ initialized: true,
608
+ value: client,
609
+ });
610
+ singletonDisposables.push(client);
611
+ return provider;
612
+ }
613
+
614
+ const provider = Object.freeze({
615
+ addHttpClient,
616
+ addWebhooks,
617
+ addRedis,
618
+ get(token) {
619
+ const normalizedToken = normalizeServiceToken(token);
620
+ if (providerDisposed) {
621
+ throw new Error("Sloppy service provider is disposed.");
622
+ }
623
+ const registration = registrations.get(normalizedToken);
624
+ if (registration === undefined) {
625
+ throw new Error(`Sloppy service '${serviceTokenDisplay(normalizedToken)}' is not registered.`);
626
+ }
627
+ if (registration.lifetime !== "singleton") {
628
+ throw new Error(`Sloppy root service resolution only supports singleton services; create a scope to resolve '${serviceTokenDisplay(normalizedToken)}'.`);
629
+ }
630
+ return resolve(rootScope, normalizedToken);
631
+ },
632
+
633
+ tryGet(token) {
634
+ const normalizedToken = normalizeServiceToken(token);
635
+ if (providerDisposed) {
636
+ throw new Error("Sloppy service provider is disposed.");
637
+ }
638
+ const registration = registrations.get(normalizedToken);
639
+ if (registration === undefined) {
640
+ return undefined;
641
+ }
642
+ if (registration.lifetime !== "singleton") {
643
+ throw new Error(`Sloppy root service resolution only supports singleton services; create a scope to resolve '${serviceTokenDisplay(normalizedToken)}'.`);
644
+ }
645
+ return resolve(rootScope, normalizedToken);
646
+ },
647
+
648
+ createScope,
649
+
650
+ addCache(cacheOrName, nameOrOptions = undefined) {
651
+ if (providerDisposed) {
652
+ throw new Error("Sloppy service provider is disposed.");
653
+ }
654
+ const cache = typeof cacheOrName === "string"
655
+ ? Cache.redis(cacheOrName, nameOrOptions ?? {})
656
+ : cacheOrName;
657
+ validateCacheInstance(cache);
658
+ const token = cacheServiceToken(typeof cacheOrName === "string" ? cache.name : nameOrOptions ?? cache.name ?? "default");
659
+ if (registrations.has(token)) {
660
+ throw new Error(`Sloppy service '${token}' is already registered.`);
661
+ }
662
+ registrations.set(token, {
663
+ lifetime: "singleton",
664
+ factory: null,
665
+ value: cache,
666
+ initialized: true,
667
+ });
668
+ singletonDisposables.push(cache);
669
+ return provider;
670
+ },
671
+
672
+ dispose() {
673
+ if (providerDisposed) {
674
+ return undefined;
675
+ }
676
+ providerDisposed = true;
677
+ return disposeValues(singletonDisposables.reverse(), "Sloppy service provider disposal failed.");
678
+ },
679
+ });
680
+
681
+ return provider;
682
+ }
683
+
684
+ export {
685
+ cleanupAfterFailure,
686
+ createServiceProvider,
687
+ createServicesBuilder,
688
+ finishWithCleanup,
689
+ validateServiceToken,
690
+ };