@slopware/sloppy-linux-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 +34 -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,640 @@
1
+ import { isPlainObject } from "./shared.js";
2
+
3
+ const CONFIG_SECRET_INSPECT = Symbol.for("nodejs.util.inspect.custom");
4
+ const CONFIG_BIND_TYPES = Object.freeze([
5
+ "array",
6
+ "bool",
7
+ "boolean",
8
+ "bytes",
9
+ "duration",
10
+ "int",
11
+ "integer",
12
+ "number",
13
+ "object",
14
+ "secret",
15
+ "size",
16
+ "string",
17
+ ]);
18
+ const DISALLOWED_CONFIG_SEGMENTS = new Set(["__proto__", "prototype", "constructor"]);
19
+
20
+ function createConfigContainer() {
21
+ return Object.create(null);
22
+ }
23
+
24
+ function validateConfigKey(key) {
25
+ if (typeof key !== "string" || key.length === 0 || key.includes("\0")) {
26
+ throw new TypeError("Sloppy config key must be a non-empty string without NUL.");
27
+ }
28
+ }
29
+
30
+ function assertSupportedConfigSegment(segment) {
31
+ if (DISALLOWED_CONFIG_SEGMENTS.has(segment)) {
32
+ throw new TypeError(`Sloppy config key segment '${segment}' is not supported.`);
33
+ }
34
+ }
35
+
36
+ function normalizeConfigKey(key) {
37
+ validateConfigKey(key);
38
+ const segments = key.split(":");
39
+ if (segments.some((segment) => segment.length === 0)) {
40
+ throw new TypeError("Sloppy config key must not contain empty segments.");
41
+ }
42
+ return key
43
+ .split(":")
44
+ .map((segment) => segment.toUpperCase())
45
+ .join(":");
46
+ }
47
+
48
+ function providerConfigPrefix(key) {
49
+ validateConfigKey(key);
50
+ if (/^[A-Za-z][A-Za-z0-9.-]*:[A-Za-z0-9_.-]+$/u.test(key) && !key.startsWith("Sloppy:")) {
51
+ const [provider, name] = key.split(":");
52
+ return `Sloppy:Providers:${provider}:${name}`;
53
+ }
54
+ return key;
55
+ }
56
+
57
+ function setConfigPath(target, segments, value) {
58
+ let cursor = target;
59
+ for (let index = 0; index < segments.length - 1; index += 1) {
60
+ const segment = segments[index];
61
+ assertSupportedConfigSegment(segment);
62
+ const next = cursor[segment];
63
+ if (next !== undefined && !isPlainObject(next)) {
64
+ throw new Error(`Sloppy config bind cannot merge scalar and object at '${segments.slice(0, index + 1).join(":")}'.`);
65
+ }
66
+ cursor[segment] = next ?? createConfigContainer();
67
+ cursor = cursor[segment];
68
+ }
69
+ const leaf = segments[segments.length - 1];
70
+ assertSupportedConfigSegment(leaf);
71
+ cursor[leaf] = value;
72
+ }
73
+
74
+ function flattenConfigObject(values, object, prefix = []) {
75
+ for (const [key, value] of Object.entries(object)) {
76
+ validateConfigKey(key);
77
+ const segments = [...prefix, key];
78
+ if (isPlainObject(value)) {
79
+ flattenConfigObject(values, value, segments);
80
+ } else {
81
+ values[normalizeConfigKey(segments.join(":"))] = value;
82
+ }
83
+ }
84
+ }
85
+
86
+ function getConfigValue(values, key, fallback) {
87
+ const normalized = normalizeConfigKey(key);
88
+ return Object.prototype.hasOwnProperty.call(values, normalized) ? values[normalized] : fallback;
89
+ }
90
+
91
+ function requireConfigValue(values, key) {
92
+ const normalized = normalizeConfigKey(key);
93
+ if (!Object.prototype.hasOwnProperty.call(values, normalized)) {
94
+ throw new Error(`Sloppy config key '${key}' is required but was not provided.`);
95
+ }
96
+ return values[normalized];
97
+ }
98
+
99
+ function hasConfigValue(values, key) {
100
+ return Object.prototype.hasOwnProperty.call(values, normalizeConfigKey(key));
101
+ }
102
+
103
+ function getConfigObjectValue(values, key, fallback, required) {
104
+ const normalized = normalizeConfigKey(key);
105
+ if (Object.prototype.hasOwnProperty.call(values, normalized)) {
106
+ return values[normalized];
107
+ }
108
+ const result = createConfigContainer();
109
+ let found = false;
110
+ for (const [entryKey, value] of Object.entries(values)) {
111
+ if (!entryKey.startsWith(`${normalized}:`)) {
112
+ continue;
113
+ }
114
+ found = true;
115
+ setConfigPath(
116
+ result,
117
+ entryKey.slice(normalized.length + 1).split(":").map(configBindSegmentName),
118
+ value,
119
+ );
120
+ }
121
+ if (found) {
122
+ return result;
123
+ }
124
+ if (!required) {
125
+ return fallback;
126
+ }
127
+ throw new Error(`Sloppy config key '${key}' is required but was not provided.`);
128
+ }
129
+
130
+ function coerceConfigString(value, key) {
131
+ if (typeof value !== "string") {
132
+ throw new TypeError(`Sloppy config key '${key}' must be a string.`);
133
+ }
134
+ return value;
135
+ }
136
+
137
+ function coerceConfigNumber(value, key) {
138
+ const parsed = typeof value === "string" && value.trim() !== "" ? Number(value) : value;
139
+ if (typeof parsed !== "number" || !Number.isFinite(parsed)) {
140
+ throw new TypeError(`Sloppy config key '${key}' must be a number.`);
141
+ }
142
+ return parsed;
143
+ }
144
+
145
+ function coerceConfigInt(value, key) {
146
+ const parsed = coerceConfigNumber(value, key);
147
+ if (!Number.isInteger(parsed)) {
148
+ throw new TypeError(`Sloppy config key '${key}' must be an integer.`);
149
+ }
150
+ return parsed;
151
+ }
152
+
153
+ function coerceConfigBool(value, key) {
154
+ if (typeof value === "boolean") {
155
+ return value;
156
+ }
157
+ if (typeof value === "string") {
158
+ if (value.toLowerCase() === "true") {
159
+ return true;
160
+ }
161
+ if (value.toLowerCase() === "false") {
162
+ return false;
163
+ }
164
+ }
165
+ throw new TypeError(`Sloppy config key '${key}' must be a boolean.`);
166
+ }
167
+
168
+ const CONFIG_SECRET_VALUES = new WeakMap();
169
+
170
+ class ConfigSecretValue {
171
+ constructor(value) {
172
+ CONFIG_SECRET_VALUES.set(this, coerceConfigString(value, "secret"));
173
+ Object.freeze(this);
174
+ }
175
+
176
+ value() {
177
+ return CONFIG_SECRET_VALUES.get(this);
178
+ }
179
+
180
+ toString() {
181
+ return "[Secret redacted]";
182
+ }
183
+
184
+ toJSON() {
185
+ return "[Secret redacted]";
186
+ }
187
+
188
+ [CONFIG_SECRET_INSPECT]() {
189
+ return "[Secret redacted]";
190
+ }
191
+ }
192
+
193
+ function coerceConfigSecret(value, key) {
194
+ if (value instanceof ConfigSecretValue) {
195
+ return value;
196
+ }
197
+ return new ConfigSecretValue(coerceConfigString(value, key));
198
+ }
199
+
200
+ function coerceConfigArray(value, key) {
201
+ if (!Array.isArray(value)) {
202
+ throw new TypeError(`Sloppy config key '${key}' must be an array.`);
203
+ }
204
+ return Object.freeze([...value]);
205
+ }
206
+
207
+ function coerceConfigObject(value, key) {
208
+ if (!isPlainObject(value)) {
209
+ throw new TypeError(`Sloppy config key '${key}' must be an object.`);
210
+ }
211
+ return Object.freeze({ ...value });
212
+ }
213
+
214
+ function coerceConfigDuration(value, key) {
215
+ if (typeof value === "number" && Number.isFinite(value) && value >= 0) {
216
+ return value;
217
+ }
218
+ if (typeof value === "string") {
219
+ const match = value.trim().match(/^(\d+(?:\.\d+)?)\s*(ms|s|m|h)$/iu);
220
+ if (match !== null) {
221
+ const amount = Number(match[1]);
222
+ const unit = match[2].toLowerCase();
223
+ const factors = {
224
+ ms: 1,
225
+ s: 1000,
226
+ m: 60 * 1000,
227
+ h: 60 * 60 * 1000,
228
+ };
229
+ return amount * factors[unit];
230
+ }
231
+ }
232
+ throw new TypeError(`Sloppy config key '${key}' must be a duration in ms, s, m, or h.`);
233
+ }
234
+
235
+ function coerceConfigSize(value, key) {
236
+ if (typeof value === "number" && Number.isInteger(value) && value >= 0) {
237
+ return value;
238
+ }
239
+ if (typeof value === "string") {
240
+ const match = value.trim().match(/^(\d+)\s*(b|kb|mb|gb|kib|mib|gib)$/iu);
241
+ if (match !== null) {
242
+ const amount = Number(match[1]);
243
+ const unit = match[2].toLowerCase();
244
+ const factors = {
245
+ b: 1,
246
+ kb: 1000,
247
+ mb: 1000 * 1000,
248
+ gb: 1000 * 1000 * 1000,
249
+ kib: 1024,
250
+ mib: 1024 * 1024,
251
+ gib: 1024 * 1024 * 1024,
252
+ };
253
+ return amount * factors[unit];
254
+ }
255
+ }
256
+ throw new TypeError(`Sloppy config key '${key}' must be a byte size.`);
257
+ }
258
+
259
+ function coerceConfigByType(value, key, type) {
260
+ switch (type) {
261
+ case "array":
262
+ return coerceConfigArray(value, key);
263
+ case "bool":
264
+ case "boolean":
265
+ return coerceConfigBool(value, key);
266
+ case "bytes":
267
+ case "size":
268
+ return coerceConfigSize(value, key);
269
+ case "duration":
270
+ return coerceConfigDuration(value, key);
271
+ case "int":
272
+ case "integer":
273
+ return coerceConfigInt(value, key);
274
+ case "number":
275
+ return coerceConfigNumber(value, key);
276
+ case "object":
277
+ return coerceConfigObject(value, key);
278
+ case "secret":
279
+ return coerceConfigSecret(value, key);
280
+ case "string":
281
+ return coerceConfigString(value, key);
282
+ default:
283
+ throw new TypeError(`Sloppy config bind descriptor has unsupported type '${type}'.`);
284
+ }
285
+ }
286
+
287
+ function isConfigBindType(value) {
288
+ return typeof value === "string" && CONFIG_BIND_TYPES.includes(value);
289
+ }
290
+
291
+ function isDescriptorObject(value) {
292
+ return (
293
+ isPlainObject(value) &&
294
+ ("type" in value ||
295
+ "default" in value ||
296
+ "required" in value ||
297
+ "enum" in value ||
298
+ "values" in value ||
299
+ "min" in value ||
300
+ "max" in value ||
301
+ "secret" in value)
302
+ );
303
+ }
304
+
305
+ function schemaIsDescriptorMap(schema) {
306
+ return Object.values(schema).some((value) => isConfigBindType(value) || isDescriptorObject(value));
307
+ }
308
+
309
+ function configDescriptorSegmentName(property) {
310
+ if (property.includes(":")) {
311
+ return property;
312
+ }
313
+ return property.charAt(0).toUpperCase() + property.slice(1);
314
+ }
315
+
316
+ function normalizeConfigDescriptor(property, descriptor) {
317
+ if (isConfigBindType(descriptor)) {
318
+ return {
319
+ key: configDescriptorSegmentName(property),
320
+ type: descriptor,
321
+ required: true,
322
+ };
323
+ }
324
+ if (!isDescriptorObject(descriptor)) {
325
+ return {
326
+ key: configDescriptorSegmentName(property),
327
+ type: inferConfigDescriptorType(descriptor),
328
+ default: descriptor,
329
+ required: false,
330
+ };
331
+ }
332
+ const type = descriptor.secret === true ? "secret" : (descriptor.type ?? inferConfigDescriptorType(descriptor.default));
333
+ if (!isConfigBindType(type)) {
334
+ throw new TypeError(`Sloppy config bind descriptor for '${property}' has unsupported type '${type}'.`);
335
+ }
336
+ if (type === "secret" && Object.prototype.hasOwnProperty.call(descriptor, "default")) {
337
+ throw new TypeError(`Sloppy secret config key '${property}' must not declare a literal default.`);
338
+ }
339
+ const normalized = {
340
+ key: descriptor.key ?? configDescriptorSegmentName(property),
341
+ type,
342
+ required: Object.prototype.hasOwnProperty.call(descriptor, "required")
343
+ ? descriptor.required === true
344
+ : !Object.prototype.hasOwnProperty.call(descriptor, "default"),
345
+ allowed: descriptor.enum ?? descriptor.values,
346
+ min: descriptor.min,
347
+ max: descriptor.max,
348
+ };
349
+ if (Object.prototype.hasOwnProperty.call(descriptor, "default")) {
350
+ normalized.default = descriptor.default;
351
+ }
352
+ return normalized;
353
+ }
354
+
355
+ function inferConfigDescriptorType(value) {
356
+ switch (typeof value) {
357
+ case "boolean":
358
+ return "boolean";
359
+ case "number":
360
+ return "number";
361
+ case "string":
362
+ return "string";
363
+ default:
364
+ if (Array.isArray(value)) {
365
+ return "array";
366
+ }
367
+ if (isPlainObject(value)) {
368
+ return "object";
369
+ }
370
+ return "string";
371
+ }
372
+ }
373
+
374
+ function bindConfigDescriptor(values, logicalPrefix, property, descriptor) {
375
+ const normalized = normalizeConfigDescriptor(property, descriptor);
376
+ const fullKey = normalized.key.includes(":")
377
+ ? `${logicalPrefix}:${normalized.key}`
378
+ : `${logicalPrefix}:${normalized.key}`;
379
+ const normalizedKey = normalizeConfigKey(fullKey);
380
+ const hasValue = Object.prototype.hasOwnProperty.call(values, normalizedKey);
381
+ let rawValue;
382
+ if (hasValue) {
383
+ rawValue = values[normalizedKey];
384
+ } else if (Object.prototype.hasOwnProperty.call(normalized, "default")) {
385
+ rawValue = normalized.default;
386
+ } else if (normalized.required) {
387
+ const kind = normalized.type === "secret" ? "secret config key" : "config key";
388
+ throw new Error(`Sloppy ${kind} '${fullKey}' is required but was not provided.`);
389
+ } else {
390
+ return undefined;
391
+ }
392
+
393
+ const coerced = coerceConfigByType(rawValue, fullKey, normalized.type);
394
+ if (Array.isArray(normalized.allowed) && !normalized.allowed.some((value) => Object.is(value, coerced))) {
395
+ throw new TypeError(`Sloppy config key '${fullKey}' must match one of the declared values.`);
396
+ }
397
+ if (normalized.min !== undefined && typeof coerced === "number" && coerced < normalized.min) {
398
+ throw new RangeError(`Sloppy config key '${fullKey}' is below the declared minimum.`);
399
+ }
400
+ if (normalized.max !== undefined && typeof coerced === "number" && coerced > normalized.max) {
401
+ throw new RangeError(`Sloppy config key '${fullKey}' is above the declared maximum.`);
402
+ }
403
+ return coerced;
404
+ }
405
+
406
+ function bindConfigValues(values, prefix, schema) {
407
+ const logicalPrefix = providerConfigPrefix(prefix);
408
+ const normalizedPrefix = normalizeConfigKey(logicalPrefix);
409
+ const result = createConfigContainer();
410
+
411
+ for (const [key, value] of Object.entries(values)) {
412
+ if (key === normalizedPrefix || !key.startsWith(`${normalizedPrefix}:`)) {
413
+ continue;
414
+ }
415
+ const segments = key.slice(normalizedPrefix.length + 1).split(":");
416
+ setConfigPath(
417
+ result,
418
+ segments.map(configBindSegmentName),
419
+ value,
420
+ );
421
+ }
422
+
423
+ if (schema === undefined || schema === null) {
424
+ return Object.freeze(result);
425
+ }
426
+ if (typeof schema === "function") {
427
+ if (typeof schema.bindConfig === "function") {
428
+ return schema.bindConfig(Object.freeze({ ...result }), Object.freeze({ key: logicalPrefix }));
429
+ }
430
+ if (/^[A-Z]/u.test(schema.name)) {
431
+ return new schema(Object.freeze({ ...result }));
432
+ }
433
+ return schema(Object.freeze({ ...result }));
434
+ }
435
+ if (isPlainObject(schema)) {
436
+ if (schemaIsDescriptorMap(schema)) {
437
+ const bound = {};
438
+ for (const [property, descriptor] of Object.entries(schema)) {
439
+ const value = bindConfigDescriptor(values, logicalPrefix, property, descriptor);
440
+ if (value !== undefined) {
441
+ bound[property] = value;
442
+ }
443
+ }
444
+ return Object.freeze(bound);
445
+ }
446
+ return Object.freeze({ ...schema, ...result });
447
+ }
448
+ throw new TypeError("Sloppy config.bind schema must be a function, plain object, or omitted.");
449
+ }
450
+
451
+ function configBindSegmentName(segment) {
452
+ switch (segment) {
453
+ case "DATABASE":
454
+ return "database";
455
+ case "HOST":
456
+ return "host";
457
+ case "MAXCONNECTIONS":
458
+ return "maxConnections";
459
+ case "MAXREQUESTBODYBYTES":
460
+ return "maxRequestBodyBytes";
461
+ case "PORT":
462
+ return "port";
463
+ case "QUEUECAPACITY":
464
+ return "queueCapacity";
465
+ case "REQUESTTIMEOUTMS":
466
+ return "requestTimeoutMs";
467
+ case "V8MICROTASKDRAINLIMIT":
468
+ return "v8MicrotaskDrainLimit";
469
+ default:
470
+ return segment.charAt(0).toLowerCase() + segment.slice(1).toLowerCase();
471
+ }
472
+ }
473
+
474
+ function createConfigBuilder(guard) {
475
+ const values = Object.create(null);
476
+
477
+ const config = {
478
+ addObject(object) {
479
+ guard.assertMutable();
480
+
481
+ if (!isPlainObject(object)) {
482
+ throw new TypeError("Sloppy config.addObject value must be a plain object.");
483
+ }
484
+
485
+ flattenConfigObject(values, object);
486
+
487
+ return config;
488
+ },
489
+
490
+ get(key, fallback) {
491
+ return getConfigValue(values, key, fallback);
492
+ },
493
+
494
+ has(key) {
495
+ return hasConfigValue(values, key);
496
+ },
497
+
498
+ require(key) {
499
+ return requireConfigValue(values, key);
500
+ },
501
+
502
+ getString(key, fallback) {
503
+ const value = fallback === undefined ? requireConfigValue(values, key) : getConfigValue(values, key, fallback);
504
+ return coerceConfigString(value, key);
505
+ },
506
+
507
+ getInt(key, fallback) {
508
+ const value = fallback === undefined ? requireConfigValue(values, key) : getConfigValue(values, key, fallback);
509
+ return coerceConfigInt(value, key);
510
+ },
511
+
512
+ getNumber(key, fallback) {
513
+ const value = fallback === undefined ? requireConfigValue(values, key) : getConfigValue(values, key, fallback);
514
+ return coerceConfigNumber(value, key);
515
+ },
516
+
517
+ getBool(key, fallback) {
518
+ const value = fallback === undefined ? requireConfigValue(values, key) : getConfigValue(values, key, fallback);
519
+ return coerceConfigBool(value, key);
520
+ },
521
+
522
+ getBoolean(key, fallback) {
523
+ return config.getBool(key, fallback);
524
+ },
525
+
526
+ getDuration(key, fallback) {
527
+ const value = fallback === undefined ? requireConfigValue(values, key) : getConfigValue(values, key, fallback);
528
+ return coerceConfigDuration(value, key);
529
+ },
530
+
531
+ getSize(key, fallback) {
532
+ const value = fallback === undefined ? requireConfigValue(values, key) : getConfigValue(values, key, fallback);
533
+ return coerceConfigSize(value, key);
534
+ },
535
+
536
+ getBytes(key, fallback) {
537
+ return config.getSize(key, fallback);
538
+ },
539
+
540
+ getArray(key, fallback) {
541
+ const value = fallback === undefined ? requireConfigValue(values, key) : getConfigValue(values, key, fallback);
542
+ return coerceConfigArray(value, key);
543
+ },
544
+
545
+ getObject(key, fallback) {
546
+ const value = getConfigObjectValue(values, key, fallback, fallback === undefined);
547
+ return coerceConfigObject(value, key);
548
+ },
549
+
550
+ getSecret(key) {
551
+ return coerceConfigSecret(requireConfigValue(values, key), key);
552
+ },
553
+
554
+ bind(prefix, schema) {
555
+ return bindConfigValues(values, prefix, schema);
556
+ },
557
+
558
+ __snapshot() {
559
+ return Object.freeze({ ...values });
560
+ },
561
+ };
562
+
563
+ return Object.freeze(config);
564
+ }
565
+
566
+ function createConfigProvider(snapshot) {
567
+ return Object.freeze({
568
+ get(key, fallback) {
569
+ return getConfigValue(snapshot, key, fallback);
570
+ },
571
+
572
+ has(key) {
573
+ return hasConfigValue(snapshot, key);
574
+ },
575
+
576
+ require(key) {
577
+ return requireConfigValue(snapshot, key);
578
+ },
579
+
580
+ getString(key, fallback) {
581
+ const value = fallback === undefined ? requireConfigValue(snapshot, key) : getConfigValue(snapshot, key, fallback);
582
+ return coerceConfigString(value, key);
583
+ },
584
+
585
+ getInt(key, fallback) {
586
+ const value = fallback === undefined ? requireConfigValue(snapshot, key) : getConfigValue(snapshot, key, fallback);
587
+ return coerceConfigInt(value, key);
588
+ },
589
+
590
+ getNumber(key, fallback) {
591
+ const value = fallback === undefined ? requireConfigValue(snapshot, key) : getConfigValue(snapshot, key, fallback);
592
+ return coerceConfigNumber(value, key);
593
+ },
594
+
595
+ getBool(key, fallback) {
596
+ const value = fallback === undefined ? requireConfigValue(snapshot, key) : getConfigValue(snapshot, key, fallback);
597
+ return coerceConfigBool(value, key);
598
+ },
599
+
600
+ getBoolean(key, fallback) {
601
+ const value = fallback === undefined ? requireConfigValue(snapshot, key) : getConfigValue(snapshot, key, fallback);
602
+ return coerceConfigBool(value, key);
603
+ },
604
+
605
+ getDuration(key, fallback) {
606
+ const value = fallback === undefined ? requireConfigValue(snapshot, key) : getConfigValue(snapshot, key, fallback);
607
+ return coerceConfigDuration(value, key);
608
+ },
609
+
610
+ getSize(key, fallback) {
611
+ const value = fallback === undefined ? requireConfigValue(snapshot, key) : getConfigValue(snapshot, key, fallback);
612
+ return coerceConfigSize(value, key);
613
+ },
614
+
615
+ getBytes(key, fallback) {
616
+ const value = fallback === undefined ? requireConfigValue(snapshot, key) : getConfigValue(snapshot, key, fallback);
617
+ return coerceConfigSize(value, key);
618
+ },
619
+
620
+ getArray(key, fallback) {
621
+ const value = fallback === undefined ? requireConfigValue(snapshot, key) : getConfigValue(snapshot, key, fallback);
622
+ return coerceConfigArray(value, key);
623
+ },
624
+
625
+ getObject(key, fallback) {
626
+ const value = getConfigObjectValue(snapshot, key, fallback, fallback === undefined);
627
+ return coerceConfigObject(value, key);
628
+ },
629
+
630
+ getSecret(key) {
631
+ return coerceConfigSecret(requireConfigValue(snapshot, key), key);
632
+ },
633
+
634
+ bind(prefix, schema) {
635
+ return bindConfigValues(snapshot, prefix, schema);
636
+ },
637
+ });
638
+ }
639
+
640
+ export { createConfigBuilder, createConfigProvider };
@@ -0,0 +1,31 @@
1
+ async function disposeAll(values) {
2
+ const errors = [];
3
+ for (const value of values) {
4
+ if (value === undefined || value === null) {
5
+ continue;
6
+ }
7
+ try {
8
+ await value.dispose?.();
9
+ } catch (error) {
10
+ errors.push(error);
11
+ }
12
+ }
13
+ if (errors.length === 1) {
14
+ throw errors[0];
15
+ }
16
+ if (errors.length > 1) {
17
+ throw new AggregateError(errors, "Multiple Sloppy cleanup operations failed.");
18
+ }
19
+ }
20
+
21
+ function onceAsync(fn) {
22
+ let promise = undefined;
23
+ return () => {
24
+ if (promise === undefined) {
25
+ promise = Promise.resolve().then(fn).then(() => undefined);
26
+ }
27
+ return promise;
28
+ };
29
+ }
30
+
31
+ export { disposeAll, onceAsync };