@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,59 @@
1
+ import { Sloppy, data, sql } from "sloppy";
2
+ import { Environment } from "sloppy/os";
3
+
4
+ function requireEnvironment(name) {
5
+ const value = Environment.get(name);
6
+ if (value === undefined || value === "") {
7
+ throw new Error(`Missing required environment value: ${name}`);
8
+ }
9
+ return value;
10
+ }
11
+
12
+ const SqlServerModule = Sloppy.module("data.sqlserver")
13
+ .capabilities((caps) => {
14
+ caps.addDatabase("data.main", {
15
+ provider: "sqlserver",
16
+ configKey: "SLOPPY_SQLSERVER_TEST_CONNECTION_STRING",
17
+ access: "readwrite",
18
+ });
19
+ })
20
+ .services((services) => {
21
+ services.addSingleton("data.main", () => data.sqlserver.open({
22
+ connectionString: requireEnvironment("SLOPPY_SQLSERVER_TEST_CONNECTION_STRING"),
23
+ maxConnections: 2,
24
+ }));
25
+ });
26
+
27
+ const app = Sloppy.createBuilder()
28
+ .addModule(SqlServerModule)
29
+ .build();
30
+
31
+ const lowered = sql.lower(["select id, name from users where name = ", ""], ["Ada"], {
32
+ placeholderStyle: data.sqlserver.placeholderStyle,
33
+ });
34
+
35
+ const doctor = data.sqlserver.doctor({
36
+ connectionString: requireEnvironment("SLOPPY_SQLSERVER_TEST_CONNECTION_STRING"),
37
+ });
38
+
39
+ async function insertUser(db, name) {
40
+ await db.exec`
41
+ insert into users (name)
42
+ values (${name})
43
+ `;
44
+
45
+ return db.queryOne`
46
+ select id, name
47
+ from users
48
+ where name = ${name}
49
+ `;
50
+ }
51
+
52
+ async function renameUser(db, id, name) {
53
+ return db.transaction(async (tx) => {
54
+ await tx.exec`update users set name = ${name} where id = ${id}`;
55
+ return tx.queryOne`select id, name from users where id = ${id}`;
56
+ });
57
+ }
58
+
59
+ export { app, doctor, insertUser, lowered, renameUser };
@@ -0,0 +1,11 @@
1
+ # Static Files Basic
2
+
3
+ Serves a project-local `public/` directory through `app.staticFiles`.
4
+
5
+ ```powershell
6
+ sloppy build examples/static-files-basic/app.js --out .sloppy-static-basic
7
+ sloppy run .sloppy-static-basic --once GET /assets/app.js
8
+ ```
9
+
10
+ Static assets are captured at build time. Rebuild after changing files under
11
+ `public/`.
@@ -0,0 +1,12 @@
1
+ import { Sloppy, Results } from "sloppy";
2
+
3
+ const app = Sloppy.create();
4
+
5
+ app.get("/health", () => Results.text("ok"));
6
+
7
+ app.staticFiles("/assets", {
8
+ root: "public",
9
+ cacheControl: "public, max-age=3600",
10
+ });
11
+
12
+ export default app;
@@ -0,0 +1 @@
1
+ globalThis.sloppyStaticBasic = true;
@@ -0,0 +1,3 @@
1
+ body {
2
+ color: #123456;
3
+ }
@@ -0,0 +1,12 @@
1
+ # Static Files Package
2
+
3
+ Shows the package path for static assets. `sloppy package` copies dependency
4
+ graph assets into `artifacts/assets/` so the package carries the static files.
5
+
6
+ ```powershell
7
+ sloppy package examples/static-files-package/app.js --out .sloppy-static-package
8
+ sloppy run .sloppy-static-package/package --once GET /public/index.html
9
+ ```
10
+
11
+ The package is still an alpha local app package, not a production release
12
+ archive.
@@ -0,0 +1,10 @@
1
+ import { Sloppy } from "sloppy";
2
+
3
+ const app = Sloppy.create();
4
+
5
+ app.staticFiles("/public", {
6
+ root: "public",
7
+ cacheControl: "public, max-age=3600",
8
+ });
9
+
10
+ export default app;
@@ -0,0 +1,2 @@
1
+ <!doctype html>
2
+ <title>Packaged Static File</title>
@@ -0,0 +1,12 @@
1
+ # Static Files Precompressed
2
+
3
+ Shows precompressed variant registration. Requests that allow `br` or `gzip`
4
+ can receive `app.js.br` or `app.js.gz` when the files exist.
5
+
6
+ ```powershell
7
+ sloppy build examples/static-files-precompressed/app.js --out .sloppy-static-precompressed
8
+ sloppy run .sloppy-static-precompressed --header "accept-encoding: br" --once GET /assets/app.js
9
+ ```
10
+
11
+ The `.br` and `.gz` files are real compressed variants of `public/app.js`.
12
+ Regenerate them from the source asset whenever the JavaScript changes.
@@ -0,0 +1,11 @@
1
+ import { Sloppy } from "sloppy";
2
+
3
+ const app = Sloppy.create();
4
+
5
+ app.staticFiles("/assets", {
6
+ root: "public",
7
+ cacheControl: "public, max-age=31536000, immutable",
8
+ precompressed: ["br", "gzip"],
9
+ });
10
+
11
+ export default app;
@@ -0,0 +1 @@
1
+ globalThis.sloppyPrecompressed = true;
@@ -0,0 +1,12 @@
1
+ # Static Files SPA
2
+
3
+ Hosts a built browser app with `app.spa`. Concrete API routes still win before
4
+ the SPA fallback.
5
+
6
+ ```powershell
7
+ sloppy build examples/static-files-spa/app.js --out .sloppy-static-spa
8
+ sloppy run .sloppy-static-spa --once GET /dashboard
9
+ ```
10
+
11
+ `/dashboard` returns `dist/index.html`. Missing asset-looking paths such as
12
+ `/missing.js` return `404`.
@@ -0,0 +1,16 @@
1
+ import { Sloppy, Results } from "sloppy";
2
+
3
+ const app = Sloppy.create();
4
+
5
+ app.get("/api/health", () => Results.json({ ok: true }));
6
+
7
+ app.spa("/", {
8
+ root: "dist",
9
+ fallback: "index.html",
10
+ cacheControl: {
11
+ html: "no-cache",
12
+ assets: "public, max-age=31536000, immutable",
13
+ },
14
+ });
15
+
16
+ export default app;
@@ -0,0 +1 @@
1
+ globalThis.sloppySpaLoaded = true;
@@ -0,0 +1,4 @@
1
+ <!doctype html>
2
+ <title>Sloppy SPA</title>
3
+ <main id="app">Sloppy SPA fallback</main>
4
+ <script src="/assets/app.js"></script>
@@ -0,0 +1,8 @@
1
+ # Static Files TestHost
2
+
3
+ Shows static files through `TestHost.create(app)`. This mode exercises the
4
+ in-process path safety, headers, precompressed selection, `HEAD`, and route
5
+ precedence behavior without building artifacts.
6
+
7
+ This example is covered by the repository bootstrap TestHost checks. It is not
8
+ a `sloppy run` runtime example.
@@ -0,0 +1,13 @@
1
+ import { Sloppy, Results } from "sloppy";
2
+
3
+ const app = Sloppy.create();
4
+
5
+ app.get("/api/status", () => Results.json({ ok: true }));
6
+
7
+ app.staticFiles("/assets", {
8
+ root: "public",
9
+ dotfiles: "deny",
10
+ precompressed: true,
11
+ });
12
+
13
+ export default app;
@@ -0,0 +1 @@
1
+ globalThis.sloppyTestHost = true;
@@ -0,0 +1,38 @@
1
+ import { strict as assert } from "node:assert";
2
+ import { dirname } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { gunzipSync } from "node:zlib";
5
+ import { Sloppy, Results, TestHost } from "../../stdlib/sloppy/index.js";
6
+
7
+ const app = Sloppy.create();
8
+
9
+ app.get("/api/status", () => Results.json({ ok: true }));
10
+ app.staticFiles("/assets", {
11
+ root: "public",
12
+ dotfiles: "deny",
13
+ precompressed: true,
14
+ });
15
+
16
+ const host = await TestHost.create(app);
17
+ const previousCwd = process.cwd();
18
+
19
+ try {
20
+ process.chdir(dirname(fileURLToPath(import.meta.url)));
21
+
22
+ const status = await host.get("/api/status");
23
+ status.expectStatus(200).expectJson({ ok: true });
24
+
25
+ const response = await host
26
+ .get("/assets/app.js", { headers: { "accept-encoding": "gzip" } });
27
+ response.expectStatus(200).expectHeader("content-encoding", "gzip");
28
+
29
+ assert.equal(gunzipSync(response.bytes()).toString("utf8"), "globalThis.sloppyTestHost = true;\n");
30
+
31
+ const head = await host.head("/assets/app.js");
32
+ head.expectStatus(200).expectNoBody();
33
+ const traversal = await host.get("/assets/%2e%2e/secret.txt");
34
+ traversal.expectStatus(403);
35
+ } finally {
36
+ process.chdir(previousCwd);
37
+ await host.close();
38
+ }
@@ -0,0 +1,26 @@
1
+ # TestHost Basic
2
+
3
+ ```js
4
+ import assert from "node:assert/strict";
5
+ import test from "node:test";
6
+ import { Results, Sloppy, TestHost } from "sloppy";
7
+
8
+ test("creates a user", async () => {
9
+ const app = Sloppy.create();
10
+
11
+ app.post("/users", (ctx) => Results.json({
12
+ email: ctx.request.json().email,
13
+ }, { status: 201 }));
14
+
15
+ await using host = await TestHost.create(app);
16
+
17
+ await host
18
+ .post("/users")
19
+ .json({ email: "ada@example.com" })
20
+ .expectStatus(201)
21
+ .then((response) => response.expectJson({ email: "ada@example.com" }));
22
+ });
23
+ ```
24
+
25
+ Use `TestHost.fromArtifacts(".sloppy")` when the test must exercise compiled
26
+ artifacts and the native runtime path.
@@ -0,0 +1,31 @@
1
+ # TestHost DB
2
+
3
+ ```js
4
+ import { Sloppy, TestData, TestHost, data, Results } from "sloppy";
5
+
6
+ const db = TestData.sqliteMemory({
7
+ migrations: "migrations/*.sql",
8
+ seed: async (connection) => {
9
+ await connection.exec("insert into users (email) values (?)", ["ada@example.com"]);
10
+ },
11
+ });
12
+
13
+ const app = Sloppy.create();
14
+
15
+ app.get("/users", async () => {
16
+ const connection = await db.open();
17
+ try {
18
+ return Results.json(await connection.query("select email from users", []));
19
+ } finally {
20
+ await connection.close?.();
21
+ }
22
+ });
23
+
24
+ await using host = await TestHost.create(app);
25
+
26
+ await host.get("/users").expectStatus(200);
27
+ ```
28
+
29
+ SQLite native bridge support depends on the active Sloppy runtime lane. For
30
+ compiled app tests, prefer `TestHost.fromArtifacts(".sloppy")` with the same
31
+ provider configuration used by `sloppy run`.
@@ -0,0 +1,68 @@
1
+ # TestServices PostgreSQL
2
+
3
+ This experimental example shows the recommended shape for a PostgreSQL-backed
4
+ integration test with `TestServices` and `TestHost`.
5
+
6
+ Requirements:
7
+
8
+ - Docker CLI on `PATH`
9
+ - reachable Docker daemon
10
+ - V8/native PostgreSQL provider bridge
11
+ - opt-in test gate, for example `SLOPPY_TESTSERVICES=1`
12
+
13
+ The test harness or CI job should perform skip/exit behavior when the opt-in
14
+ gate or Docker probe is unavailable. Keep the application snippet runtime
15
+ neutral.
16
+
17
+ ```ts
18
+ import { Results, Sloppy, TestHost, TestServices, sql } from "sloppy";
19
+
20
+ const docker = await TestServices.docker.available();
21
+ if (!docker.ok) {
22
+ throw new Error(`Docker unavailable for TestServices: ${docker.reason}`);
23
+ }
24
+
25
+ await using pg = await TestServices.postgres({
26
+ database: "app_test",
27
+ });
28
+
29
+ await pg.migrate("migrations/postgres/*.sql");
30
+ await pg.seed((db) =>
31
+ db.exec("insert into users (email) values ($1)", ["ada@example.com"]));
32
+
33
+ const app = Sloppy.create();
34
+ app.post("/users", async (ctx) => {
35
+ const db = ctx.services.get("data.main");
36
+ const input = await ctx.request.json();
37
+ await db.exec(sql`insert into users (email) values (${input.email})`);
38
+ return Results.created("/users/1", { email: input.email });
39
+ });
40
+
41
+ await using host = await TestHost.create(app, {
42
+ providers: {
43
+ main: pg.provider(),
44
+ },
45
+ config: {
46
+ DATABASE_URL: pg.connectionString,
47
+ },
48
+ });
49
+
50
+ await host.post("/users")
51
+ .json({ email: "grace@example.com" })
52
+ .expectStatus(201);
53
+
54
+ await pg.reset({ migrate: true });
55
+ ```
56
+
57
+ For artifact/package mode, pass environment instead of an app-host provider:
58
+
59
+ ```ts
60
+ await using host = await TestHost.fromArtifacts(".sloppy", {
61
+ env: pg.env(),
62
+ });
63
+
64
+ await host.get("/health/ready").expectStatus(200);
65
+ ```
66
+
67
+ Cleanup is automatic with `await using`; without it, call `host.dispose()` and
68
+ then `pg.dispose()`.
@@ -0,0 +1,71 @@
1
+ # TestServices Redis
2
+
3
+ This experimental example shows the recommended shape for a Redis-backed
4
+ integration test with `TestServices` and `TestHost`.
5
+
6
+ Requirements:
7
+
8
+ - Docker CLI on `PATH`
9
+ - reachable Docker daemon
10
+ - Sloppy outbound network bridge
11
+ - opt-in test gate, for example `SLOPPY_TESTSERVICES=1`
12
+
13
+ The test harness or CI job should skip when the opt-in gate, Docker probe, or
14
+ network bridge is unavailable. Keep the application snippet runtime neutral.
15
+
16
+ ```ts
17
+ import { Cache, Results, Sloppy, TestHost, TestServices } from "sloppy";
18
+
19
+ function skip(reason) {
20
+ console.log(`SKIPPED: ${reason}`);
21
+ process.exit(0);
22
+ }
23
+
24
+ if (process.env.SLOPPY_TESTSERVICES !== "1") {
25
+ skip("set SLOPPY_TESTSERVICES=1 to run TestServices Redis coverage");
26
+ }
27
+
28
+ if (globalThis.__sloppy?.net === undefined) {
29
+ skip("Sloppy outbound network bridge is unavailable");
30
+ }
31
+
32
+ const docker = await TestServices.docker.available();
33
+ if (!docker.ok) {
34
+ skip(`Docker unavailable for TestServices: ${docker.reason}`);
35
+ }
36
+
37
+ await using redis = await TestServices.redis();
38
+ await using cache = Cache.redis(redis.client("cache"), {
39
+ name: "default",
40
+ ttlMs: 60_000,
41
+ });
42
+
43
+ const app = Sloppy.create();
44
+ app.services.addCache(cache);
45
+ app.get("/settings", async (ctx) => {
46
+ const provider = ctx.services.get("cache.default");
47
+ const value = await provider.getOrCreate("settings", async () => ({
48
+ enabled: true,
49
+ }));
50
+ return Results.json(value);
51
+ });
52
+
53
+ await using host = await TestHost.create(app, {
54
+ config: redis.env(),
55
+ });
56
+
57
+ await host.get("/settings").expectStatus(200);
58
+ await redis.reset();
59
+ ```
60
+
61
+ For artifact/package mode, pass environment instead of app-host services:
62
+
63
+ ```ts
64
+ await using host = await TestHost.fromPackage("./dist/app", {
65
+ mode: "loopback",
66
+ env: redis.env(),
67
+ });
68
+ ```
69
+
70
+ Cleanup is automatic with `await using`; without it, call `host.dispose()` and
71
+ then `redis.dispose()`.
@@ -0,0 +1,75 @@
1
+ # TestServices SQL Server
2
+
3
+ This experimental example shows the recommended shape for a SQL Server-backed
4
+ integration test with `TestServices` and `TestHost`.
5
+
6
+ Requirements:
7
+
8
+ - Docker CLI on `PATH`
9
+ - reachable Docker daemon
10
+ - V8/native SQL Server provider bridge
11
+ - Microsoft ODBC Driver 17 or 18
12
+ - opt-in test gate, for example `SLOPPY_TESTSERVICES=1`
13
+
14
+ The test harness or CI job should perform skip/exit behavior when the opt-in
15
+ gate or Docker probe is unavailable. Keep the application snippet runtime
16
+ neutral.
17
+
18
+ ```ts
19
+ import { Results, Sloppy, TestHost, TestServices, sql } from "sloppy";
20
+
21
+ const docker = await TestServices.docker.available();
22
+ if (!docker.ok) {
23
+ throw new Error(`Docker unavailable for TestServices: ${docker.reason}`);
24
+ }
25
+
26
+ await using sqlServer = await TestServices.sqlServer({
27
+ database: "app_test",
28
+ driver: "ODBC Driver 17 for SQL Server",
29
+ username: "sa",
30
+ password: "Strong_test_password_123!",
31
+ });
32
+
33
+ await sqlServer.migrate("migrations/sqlserver/*.sql");
34
+ await sqlServer.seed((db) =>
35
+ db.exec("insert into dbo.Users (Email) values (?)", ["ada@example.com"]));
36
+
37
+ const app = Sloppy.create();
38
+ app.post("/users", async (ctx) => {
39
+ const db = ctx.services.get("data.main");
40
+ const input = await ctx.request.json();
41
+ await db.exec(sql`insert into dbo.Users (Email) values (${input.email})`);
42
+ return Results.created("/users/1", { email: input.email });
43
+ });
44
+
45
+ await using host = await TestHost.create(app, {
46
+ providers: {
47
+ main: sqlServer.provider(),
48
+ },
49
+ config: {
50
+ SQLSERVER_CONNECTION_STRING: sqlServer.connectionString,
51
+ },
52
+ });
53
+
54
+ await host.post("/users")
55
+ .json({ email: "grace@example.com" })
56
+ .expectStatus(201);
57
+
58
+ await sqlServer.reset({ migrate: true });
59
+ ```
60
+
61
+ For artifact/package mode, pass environment instead of an app-host provider:
62
+
63
+ ```ts
64
+ await using host = await TestHost.fromPackage("./dist/app", {
65
+ mode: "loopback",
66
+ env: sqlServer.env(),
67
+ });
68
+
69
+ await host.get("/health/ready").expectStatus(200);
70
+ ```
71
+
72
+ SQL Server image startup is heavier than PostgreSQL startup. Increase
73
+ `startupTimeoutMs` on cold machines instead of adding sleeps to tests.
74
+ This API currently supports only the built-in `sa` login; custom SQL Server
75
+ logins are not provisioned by TestServices.
@@ -0,0 +1,18 @@
1
+ # Time Basic Example
2
+
3
+ This example documents the intended `sloppy/time`
4
+ delay and timeout shape; execution depends on the same runtime setup as the other app-host examples.
5
+
6
+ ```js
7
+ import { Time } from "sloppy/time";
8
+
9
+ await Time.delay(250);
10
+ const summary = await Time.timeout((signal) => loadUserSummary({ signal }), { afterMs: 1000 });
11
+ ```
12
+
13
+ The Time API is async-first and Promise-friendly.
14
+
15
+ ## Limitations
16
+
17
+ This example is limited to delay and timeout behavior. Cron-style scheduling is
18
+ covered separately.
@@ -0,0 +1,12 @@
1
+ import { Time } from "sloppy/time";
2
+
3
+ async function loadUserSummary({ signal } = {}) {
4
+ await Time.yield({ signal });
5
+ return { count: 1, source: "cache" };
6
+ }
7
+
8
+ await Time.delay(250);
9
+
10
+ const summary = await Time.timeout((signal) => loadUserSummary({ signal }), { afterMs: 1000 });
11
+
12
+ export default summary;
@@ -0,0 +1,11 @@
1
+ # Time Deadline and Cancellation Example
2
+
3
+ This example shows the app-facing shape for shared
4
+ deadlines and caller cancellation.
5
+
6
+ `Deadline.after` carries a reusable time budget into filesystem work. `Time.timeout`
7
+ accepts the function-with-signal form so cancellation can be propagated into cooperative
8
+ work. `CancellationController` carries the caller's explicit reason.
9
+
10
+ Cancellation and deadlines are cooperative API contracts with stable error classes. They do
11
+ not preempt arbitrary in-flight work such as native filesystem operations.
@@ -0,0 +1,27 @@
1
+ import { File } from "sloppy/fs";
2
+ import { CancellationController, Deadline, Time } from "sloppy/time";
3
+
4
+ async function loadUsers({ signal, deadline }) {
5
+ if (signal.aborted) {
6
+ throw signal.reason;
7
+ }
8
+ const text = await File.readText("data:/users.json", { deadline });
9
+ return JSON.parse(text);
10
+ }
11
+
12
+ const deadline = Deadline.after(5000);
13
+ const controller = new CancellationController();
14
+
15
+ const users = await Time.timeout(
16
+ async (signal) => {
17
+ return loadUsers({ signal, deadline });
18
+ },
19
+ {
20
+ afterMs: deadline.remainingMs(),
21
+ signal: controller.signal,
22
+ },
23
+ );
24
+
25
+ controller.cancel("request aborted");
26
+
27
+ export default users;
@@ -0,0 +1,14 @@
1
+ # Time Fake Clock Example
2
+
3
+ This example documents deterministic tests that
4
+ inject a clock explicitly.
5
+
6
+ `Time.fakeClock()` creates an explicit test-scoped provider. Passing `{ clock }` to
7
+ `Time.delay` or `Time.timeout` lets tests advance time deterministically with
8
+ `clock.advanceBy(ms)`.
9
+
10
+ Fake clocks do not mutate global timers for ordinary apps.
11
+
12
+ ## Limitations
13
+
14
+ This example focuses on deterministic fake-clock behavior for tests.
@@ -0,0 +1,25 @@
1
+ import { Time } from "sloppy/time";
2
+
3
+ const clock = Time.fakeClock({ now: new Date("2026-01-01T00:00:00.000Z") });
4
+ const completed = [];
5
+
6
+ const delay = Time.delay(1000, { clock }).then(() => {
7
+ completed.push("delay");
8
+ });
9
+
10
+ const timeout = Time.timeout(new Promise(() => {}), {
11
+ afterMs: 500,
12
+ clock,
13
+ }).catch((error) => {
14
+ completed.push(error.name);
15
+ });
16
+
17
+ clock.advanceBy(500);
18
+ await timeout;
19
+
20
+ clock.advanceBy(1000);
21
+ await delay;
22
+
23
+ clock.dispose();
24
+
25
+ export default completed;
@@ -0,0 +1,13 @@
1
+ # Time Interval and Schedule Example
2
+
3
+ This example documents async iterable intervals and
4
+ interval-based scheduled jobs.
5
+
6
+ `Time.interval` is consumed with `for await`. `Time.every` is interval-based and is not a
7
+ cron parser. Jobs use no-overlap behavior by default, and the documented missed-run policy
8
+ is `"skip"` so the runtime avoids unbounded catch-up storms.
9
+
10
+ ## Limitations
11
+
12
+ This example is interval-based. Cron parsing and benchmark work are outside this
13
+ example.