@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,90 @@
1
+ import {
2
+ Body,
3
+ Email,
4
+ NonEmptyString,
5
+ PositiveInt,
6
+ RequestContext,
7
+ Results,
8
+ Route,
9
+ Sloppy,
10
+ } from "sloppy";
11
+ import { Sqlite } from "sloppy/providers/sqlite";
12
+
13
+ type UserCreate = {
14
+ name: NonEmptyString;
15
+ email: Email;
16
+ };
17
+
18
+ type UserDto = {
19
+ id: number;
20
+ name: string;
21
+ email: string;
22
+ };
23
+
24
+ const app = Sloppy.create();
25
+
26
+ async function seedUsers(db, ctx) {
27
+ await db.exec(
28
+ "create table if not exists users (id integer primary key, name text not null, email text not null unique)",
29
+ [],
30
+ { signal: ctx.signal, deadline: ctx.deadline },
31
+ );
32
+ await db.exec(
33
+ "insert or ignore into users (id, name, email) values (?, ?, ?)",
34
+ [1, "Ada Lovelace", "ada@example.test"],
35
+ { signal: ctx.signal, deadline: ctx.deadline },
36
+ );
37
+ await db.exec(
38
+ "insert or ignore into users (id, name, email) values (?, ?, ?)",
39
+ [2, "Grace Hopper", "grace@example.test"],
40
+ { signal: ctx.signal, deadline: ctx.deadline },
41
+ );
42
+ }
43
+
44
+ app.get("/users", async (db: Sqlite<"main">, ctx: RequestContext) => {
45
+ await seedUsers(db, ctx);
46
+ const users = await db.query<UserDto>(
47
+ "select id, name, email from users order by id",
48
+ [],
49
+ { signal: ctx.signal, deadline: ctx.deadline },
50
+ );
51
+ return Results.ok(users);
52
+ }).withName("Users.List");
53
+
54
+ app.get("/users/{id:int}", async (
55
+ id: Route<PositiveInt>,
56
+ db: Sqlite<"main">,
57
+ ctx: RequestContext,
58
+ ) => {
59
+ await seedUsers(db, ctx);
60
+ const user = await db.queryOne<UserDto>(
61
+ "select id, name, email from users where id = ?",
62
+ [id],
63
+ { signal: ctx.signal, deadline: ctx.deadline },
64
+ );
65
+ return user === null ? Results.notFound() : Results.ok(user);
66
+ }).withName("Users.Get");
67
+
68
+ app.post("/users", async (
69
+ input: Body<UserCreate>,
70
+ db: Sqlite<"main">,
71
+ ctx: RequestContext,
72
+ ) => {
73
+ await seedUsers(db, ctx);
74
+ await db.exec(
75
+ "insert or ignore into users (name, email) values (?, ?)",
76
+ [input.name, input.email],
77
+ { signal: ctx.signal, deadline: ctx.deadline },
78
+ );
79
+ const user = await db.queryOne<UserDto>(
80
+ "select id, name, email from users where email = ?",
81
+ [input.email],
82
+ { signal: ctx.signal, deadline: ctx.deadline },
83
+ );
84
+ if (user === null) {
85
+ throw new Error("SQLite user insert did not return a row.");
86
+ }
87
+ return Results.created(`/users/${user.id}`, user);
88
+ }).withName("Users.Create");
89
+
90
+ export default app;
@@ -0,0 +1,11 @@
1
+ {
2
+ "Sloppy": {
3
+ "Providers": {
4
+ "sqlite": {
5
+ "main": {
6
+ "database": ":memory:"
7
+ }
8
+ }
9
+ }
10
+ }
11
+ }
@@ -0,0 +1,73 @@
1
+ # Framework SQL Server CRUD Example
2
+
3
+ ## What this shows
4
+
5
+ A users API backed by SQL Server:
6
+
7
+ - typed `Body<T>` and `Route<T>` handler parameters;
8
+ - `SqlServer<"main">` typed provider injection;
9
+ - SQL Server parameter placeholders (`?`);
10
+ - `output inserted...` for create responses;
11
+ - request `signal` and `deadline` passed to database calls.
12
+
13
+ ## Requirements
14
+
15
+ - A V8-enabled `sloppy` runtime.
16
+ - Microsoft ODBC Driver 18 or 17 for SQL Server.
17
+ - A SQL Server test database with a `users` table.
18
+ - `Sloppy__Providers__sqlserver__main__connectionString` set in the environment.
19
+
20
+ You do not need SQL Server or ODBC for normal Sloppy apps, the Quickstart,
21
+ Program Mode, SQLite, templates, or package support. Sloppy does not bundle
22
+ Microsoft's ODBC driver in the core alpha package; install it from Microsoft's
23
+ platform packages or through your organization's managed deployment.
24
+
25
+ Example table shape:
26
+
27
+ ```sql
28
+ create table users (
29
+ id int identity primary key,
30
+ name nvarchar(200) not null,
31
+ email nvarchar(320) not null unique
32
+ );
33
+ ```
34
+
35
+ ## Run
36
+
37
+ Set the connection string and run the SQL Server integration checks:
38
+
39
+ ```powershell
40
+ $env:Sloppy__Providers__sqlserver__main__connectionString = "Driver={ODBC Driver 18 for SQL Server};Server=tcp:127.0.0.1,1433;Database=sloppy_test;UID=<user>;PWD=<password>;Encrypt=yes;TrustServerCertificate=yes;"
41
+ .\tools\windows\test-live-sqlserver.ps1
42
+ ```
43
+
44
+ ## Expected result
45
+
46
+ The script runs the SQL Server native and bridge tests selected by:
47
+
48
+ ```powershell
49
+ ctest --test-dir build\windows-relwithdebinfo --output-on-failure -R "data\.sqlserver\.live_provider|conformance\.sqlserver\.(native_live|bridge_live)"
50
+ ```
51
+
52
+ With driver, database, and connection string configured, `GET /users` returns
53
+ JSON rows from SQL Server.
54
+
55
+ ## Files to look at
56
+
57
+ - `app.ts` — `SqlServer<"main">` injection and SQL Server statements.
58
+ - Generated `.sloppy/app.plan.json` — inferred `sqlserver/main` provider metadata.
59
+ - `docs/api/data.md` — SQL Server setup and unavailable driver cases.
60
+
61
+ ## Scope
62
+
63
+ Schema setup is manual for this example. It also depends on Microsoft ODBC
64
+ Driver 17 or 18 and available async SQL Server support. Migrations, ORM-style
65
+ modeling, deployment guidance is outside this example, and package dependency
66
+ behavior is covered by the package/dependency examples.
67
+
68
+ ## Related docs
69
+
70
+ - `docs/api/data.md`
71
+ - `docs/reference/providers.md`
72
+ - `docs/reference/framework.md`
73
+ - `docs/internals/provider-runtime.md`
@@ -0,0 +1,64 @@
1
+ import {
2
+ Body,
3
+ Email,
4
+ NonEmptyString,
5
+ PositiveInt,
6
+ RequestContext,
7
+ Results,
8
+ Route,
9
+ Sloppy,
10
+ } from "sloppy";
11
+ import { SqlServer } from "sloppy/providers/sqlserver";
12
+
13
+ type UserCreate = {
14
+ name: NonEmptyString;
15
+ email: Email;
16
+ };
17
+
18
+ type UserDto = {
19
+ id: number;
20
+ name: string;
21
+ email: string;
22
+ };
23
+
24
+ const app = Sloppy.create();
25
+
26
+ app.get("/users", async (db: SqlServer<"main">, ctx: RequestContext) => {
27
+ const users = await db.query<UserDto>(
28
+ "select id, name, email from users order by id",
29
+ [],
30
+ { signal: ctx.signal, deadline: ctx.deadline },
31
+ );
32
+ return Results.ok(users);
33
+ }).withName("Users.List");
34
+
35
+ app.get("/users/{id:int}", async (
36
+ id: Route<PositiveInt>,
37
+ db: SqlServer<"main">,
38
+ ctx: RequestContext,
39
+ ) => {
40
+ const user = await db.queryOne<UserDto>(
41
+ "select id, name, email from users where id = ?",
42
+ [id],
43
+ { signal: ctx.signal, deadline: ctx.deadline },
44
+ );
45
+ return user === null ? Results.notFound() : Results.ok(user);
46
+ }).withName("Users.Get");
47
+
48
+ app.post("/users", async (
49
+ input: Body<UserCreate>,
50
+ db: SqlServer<"main">,
51
+ ctx: RequestContext,
52
+ ) => {
53
+ const user = await db.queryOne<UserDto>(
54
+ "insert into users (name, email) output inserted.id, inserted.name, inserted.email values (?, ?)",
55
+ [input.name, input.email],
56
+ { signal: ctx.signal, deadline: ctx.deadline },
57
+ );
58
+ if (user === null) {
59
+ throw new Error("SQL Server user insert did not return a row.");
60
+ }
61
+ return Results.created(`/users/${user.id}`, user);
62
+ }).withName("Users.Create");
63
+
64
+ export default app;
@@ -0,0 +1,12 @@
1
+ # Framework Validation Errors Example
2
+
3
+ A compile-time validation example.
4
+
5
+ The handler keeps its request-body TypeScript shape visible to `sloppyc`, so the
6
+ generated Plan schema metadata can drive native request validation before the
7
+ handler is invoked.
8
+
9
+ ## Scope
10
+
11
+ Negative-path coverage lives in validation conformance tests. Unsupported body
12
+ formats are not covered here.
@@ -0,0 +1,16 @@
1
+ import { Sloppy, Results, Body } from "sloppy";
2
+
3
+ type UserCreate = {
4
+ name: string;
5
+ email: string;
6
+ };
7
+
8
+ const app = Sloppy.create();
9
+
10
+ app.post("/users", (
11
+ input: Body<UserCreate>,
12
+ ) => Results.created("/users/1", {
13
+ user: input,
14
+ })).withName("Users.Create");
15
+
16
+ export default app;
@@ -0,0 +1,24 @@
1
+ # Filesystem Basic Example
2
+
3
+ This filesystem source example documents the intended
4
+ `sloppy/fs` app-facing shape; full source-input execution remains gated by the V8 runtime
5
+ path and current compiler support.
6
+
7
+ This example uses project-relative paths for local development:
8
+
9
+ ```js
10
+ import { Directory, File } from "sloppy/fs";
11
+ import { Deadline } from "sloppy/time";
12
+
13
+ await Directory.create("./tmp", { recursive: true });
14
+ await File.writeJson("./tmp/users.json", [{ id: 1, name: "Ada" }], {
15
+ atomic: true,
16
+ indent: 2,
17
+ });
18
+ const deadline = Deadline.after(1000);
19
+ const users = await File.readJson("./tmp/users.json", { deadline });
20
+ ```
21
+
22
+ The read uses a Time deadline option. Deadline handling is cooperative; it does not
23
+ preempt in-flight native filesystem calls. This example also focuses on Sloppy APIs rather
24
+ than Node-style `fs` compatibility or sync APIs.
@@ -0,0 +1,12 @@
1
+ import { Directory, File } from "sloppy/fs";
2
+ import { Deadline } from "sloppy/time";
3
+
4
+ await Directory.create("./tmp", { recursive: true });
5
+ await File.writeJson("./tmp/users.json", [{ id: 1, name: "Ada" }], {
6
+ atomic: true,
7
+ indent: 2,
8
+ });
9
+
10
+ const deadline = Deadline.after(1000);
11
+ const users = await File.readJson("./tmp/users.json", { deadline });
12
+ await File.writeText("./tmp/summary.txt", `users=${users.length}`);
@@ -0,0 +1,14 @@
1
+ # Filesystem Roots And Policy Example
2
+
3
+ This is a filesystem policy example.
4
+ Named roots are the recommended Sloppy filesystem policy shape:
5
+
6
+ ```js
7
+ import { Directory, File } from "sloppy/fs";
8
+
9
+ await Directory.create("data:/exports", { recursive: true });
10
+ await File.writeText("data:/exports/report.txt", "ready", { atomic: true });
11
+ ```
12
+
13
+ Development mode may warn on absolute paths. Strict mode requires explicit policy for
14
+ absolute and risky operations such as delete, watch, and lock.
@@ -0,0 +1,4 @@
1
+ import { Directory, File } from "sloppy/fs";
2
+
3
+ await Directory.create("data:/exports", { recursive: true });
4
+ await File.writeText("data:/exports/report.txt", "ready", { atomic: true });
@@ -0,0 +1,18 @@
1
+ # Filesystem Streams Example
2
+
3
+ This filesystem example shows Sloppy-owned `FileHandle` async iteration helpers.
4
+ Node-style stream APIs are separate from this example.
5
+
6
+ ```js
7
+ import { Directory, File } from "sloppy/fs";
8
+
9
+ await Directory.create("./tmp", { recursive: true });
10
+ const file = await File.open("data:/large.log", { access: "read" });
11
+ try {
12
+ for await (const line of file.readLines()) {
13
+ await File.appendText("./tmp/filtered.log", `${line}\n`);
14
+ }
15
+ } finally {
16
+ await file.close();
17
+ }
18
+ ```
@@ -0,0 +1,11 @@
1
+ import { Directory, File } from "sloppy/fs";
2
+
3
+ await Directory.create("./tmp", { recursive: true });
4
+ const file = await File.open("data:/large.log", { access: "read" });
5
+ try {
6
+ for await (const line of file.readLines()) {
7
+ await File.appendText("./tmp/filtered.log", `${line}\n`);
8
+ }
9
+ } finally {
10
+ await file.close();
11
+ }
@@ -0,0 +1,19 @@
1
+ # Filesystem Watch Example
2
+
3
+ This is a filesystem watch example.
4
+ The current watch API is resource-backed, bounded, and non-recursive. It reports
5
+ create/modify/delete/overflow events while keeping Node `fs.watch` semantics separate:
6
+
7
+ ```js
8
+ import { Directory, File } from "sloppy/fs";
9
+
10
+ const watcher = await Directory.watch("./tmp", { queueCapacity: 16 });
11
+ try {
12
+ for await (const event of watcher) {
13
+ await File.appendText("./tmp/watch-events.log", `${event.kind}:${event.path}\n`);
14
+ break;
15
+ }
16
+ } finally {
17
+ await watcher.close();
18
+ }
19
+ ```
@@ -0,0 +1,11 @@
1
+ import { Directory, File } from "sloppy/fs";
2
+
3
+ const watcher = await Directory.watch("./tmp", { queueCapacity: 16 });
4
+ try {
5
+ for await (const event of watcher) {
6
+ await File.appendText("./tmp/watch-events.log", `${event.kind}:${event.path}\n`);
7
+ break;
8
+ }
9
+ } finally {
10
+ await watcher.close();
11
+ }
@@ -0,0 +1,63 @@
1
+ # Hello Example
2
+
3
+ Bootstrap app-host example.
4
+ This example shows the minimal app-host builder flow: config, logging, services, route
5
+ mapping, and a text result descriptor. Runtime notes follow after the code.
6
+
7
+ ```js
8
+ import { Sloppy, Results } from "sloppy";
9
+
10
+ const builder = Sloppy.createBuilder();
11
+
12
+ builder.config.addObject({
13
+ "app.name": "hello",
14
+ });
15
+
16
+ builder.logging.addMemorySink();
17
+ builder.services.addSingleton("message", () => "Hello from Sloppy");
18
+
19
+ const app = builder.build();
20
+
21
+ app.log.info("hello example configured", { example: "hello" });
22
+
23
+ app.mapGet("/", ({ services }) => Results.text(services.get("message")))
24
+ .withName("Hello.Index");
25
+
26
+ export default app;
27
+ ```
28
+
29
+ What to inspect:
30
+
31
+ - `Sloppy.createBuilder()` creates a bootstrap builder with config, logging, and services.
32
+ - `builder.config.addObject(...)` stores object-backed config values.
33
+ - `builder.logging.addMemorySink()` installs a deterministic in-memory log sink.
34
+ - `builder.services.addSingleton(...)` registers a string-token singleton service.
35
+ - `builder.build()` creates an in-memory app facade and freezes builder mutation.
36
+ - `app.log.info(...)` writes a structured application event into the configured sink.
37
+ - `app.mapGet("/", handler)` records a conceptual GET route.
38
+ - `.withName("Hello.Index")` stores the route name for the bootstrap shape.
39
+ - Route handlers can receive a minimal context with `services`, `config`, and `log`.
40
+ - `Results.text("Hello from Sloppy")` creates a frozen text result descriptor.
41
+ - CTest statically verifies this example imports the public Sloppy facade and uses the
42
+ expected public API shape.
43
+
44
+ Current product state:
45
+
46
+ - This source-stdlib example is a checked-in API-shape fixture.
47
+ - `sloppy run --artifacts` currently runs emitted artifacts such as
48
+ `examples/compiler-hello`.
49
+ - `sloppyc` route extraction and `app.plan.json` emission for this broader
50
+ builder shape are planned separately.
51
+ - `app.run` and `app.listen` belong to later app-host runtime work.
52
+ - Direct `../../stdlib` imports are reserved for internal bootstrap tests; public examples
53
+ use the Sloppy facade import shape that `sloppyc` recognizes.
54
+
55
+ Runtime Command:
56
+
57
+ ```powershell
58
+ sloppy run examples/hello/app.js
59
+ ```
60
+
61
+ That command documents the intended direct-source shape for this example. The
62
+ current emitted-artifact runtime path is `examples/compiler-hello/`. This is a
63
+ future user-facing shape for this example.
@@ -0,0 +1,19 @@
1
+ import { Sloppy, Results } from "sloppy";
2
+
3
+ const builder = Sloppy.createBuilder();
4
+
5
+ builder.config.addObject({
6
+ "app.name": "hello",
7
+ });
8
+
9
+ builder.logging.addMemorySink();
10
+ builder.services.addSingleton("message", () => "Hello from Sloppy");
11
+
12
+ const app = builder.build();
13
+
14
+ app.log.info("hello example configured", { example: "hello" });
15
+
16
+ app.mapGet("/", ({ services }) => Results.text(services.get("message")))
17
+ .withName("Hello.Index");
18
+
19
+ export default app;
@@ -0,0 +1,51 @@
1
+ # Hello Minimal Example
2
+
3
+ This example demonstrates the smallest useful Sloppy app: a health route and a
4
+ parameterized JSON route using the current framework subset.
5
+
6
+ ## Requirements
7
+
8
+ - A V8-enabled Sloppy build or package for handler execution.
9
+ - PowerShell examples below assume Windows paths.
10
+
11
+ ## Run
12
+
13
+ From this directory:
14
+
15
+ ```powershell
16
+ ..\..\build\windows-relwithdebinfo\sloppy.exe build
17
+ ..\..\build\windows-relwithdebinfo\sloppy.exe run --once GET /health
18
+ ..\..\build\windows-relwithdebinfo\sloppy.exe run --once GET /hello/Ada
19
+ ```
20
+
21
+ Run from the repository root:
22
+
23
+ ```powershell
24
+ .\build\windows-relwithdebinfo\sloppy.exe run examples/hello-minimal/src/main.ts --once GET /hello/Ada
25
+ ```
26
+
27
+ ## Expected Result
28
+
29
+ - `GET /health` returns `ok`.
30
+ - `GET /hello/Ada` returns `{"hello":"Ada"}`.
31
+
32
+ ## What To Inspect
33
+
34
+ - `sloppy.json`: the source-input configuration.
35
+ - `src/main.ts`: route binding and explicit `Results.text`/`Results.json`
36
+ helpers.
37
+ - `.sloppy/app.plan.json`: generated route and handler metadata after
38
+ `sloppy build`.
39
+
40
+ After building artifacts, inspect the generated app with:
41
+
42
+ ```powershell
43
+ ..\..\build\windows-relwithdebinfo\sloppy.exe routes --plan .sloppy\app.plan.json
44
+ ..\..\build\windows-relwithdebinfo\sloppy.exe doctor --plan .sloppy\app.plan.json
45
+ ..\..\build\windows-relwithdebinfo\sloppy.exe openapi --plan .sloppy\app.plan.json
46
+ ```
47
+
48
+ ## Current Limits
49
+
50
+ This example requires V8 for handler execution and covers only the two routes
51
+ shown above.
@@ -0,0 +1,5 @@
1
+ {
2
+ "entry": "src/main.ts",
3
+ "outDir": ".sloppy",
4
+ "environment": "Development"
5
+ }
@@ -0,0 +1,9 @@
1
+ import { Sloppy, Results } from "sloppy";
2
+
3
+ const app = Sloppy.create();
4
+
5
+ app.get("/health", () => Results.text("ok")).withName("Health.Get");
6
+ app.get("/hello/{name}", (ctx) => Results.json({ hello: ctx.route.name }))
7
+ .withName("Hello.Get");
8
+
9
+ export default app;
@@ -0,0 +1,11 @@
1
+ # HTTP Client Basic
2
+
3
+ This source example shows the outbound `HttpClient` API shape from `sloppy/net`: reusable
4
+ client creation, base URL joins, bounded response bodies, JSON helpers, redirect policy,
5
+ per-origin pooling, and strict outbound-network metadata.
6
+
7
+ ## Limitations
8
+
9
+ This example is limited to the outbound `HttpClient` API shape shown in source.
10
+ Live external network behavior, TLS policy, proxy policy, UDP, and WebSocket
11
+ behavior are separate examples or future runtime work.
@@ -0,0 +1,46 @@
1
+ import { HttpClient } from "sloppy/net";
2
+
3
+ const billing = HttpClient.create({
4
+ baseUrl: "https://billing.example.test",
5
+ timeoutMs: 5000,
6
+ maxResponseBytes: "4mb",
7
+ headers: {
8
+ "user-agent": "sloppy-http-client-example"
9
+ },
10
+ redirects: {
11
+ enabled: true,
12
+ max: 5,
13
+ crossOriginSensitiveHeaders: "strip"
14
+ },
15
+ pool: {
16
+ maxConnectionsPerOrigin: 8,
17
+ idleTimeoutMs: 30000
18
+ },
19
+ network: {
20
+ strict: true,
21
+ allow: ["https://billing.example.test"]
22
+ }
23
+ });
24
+
25
+ async function loadHealth() {
26
+ const response = await billing.get("/health", { timeoutMs: 2000 });
27
+ return await response.json();
28
+ }
29
+
30
+ async function createInvoice(customerId) {
31
+ const response = await billing.postJson("/invoices", { customerId });
32
+ if (response.status !== 201) {
33
+ throw new Error(`invoice create failed with status ${response.status}`);
34
+ }
35
+ return await response.json();
36
+ }
37
+
38
+ async function loadTextStatus() {
39
+ return await HttpClient.text("http://127.0.0.1:8080/status", {
40
+ timeoutMs: 1000,
41
+ redirects: { enabled: false },
42
+ maxResponseBytes: 4096
43
+ });
44
+ }
45
+
46
+ export { billing, createInvoice, loadHealth, loadTextStatus };
@@ -0,0 +1,22 @@
1
+ # Generated HTTP Client
2
+
3
+ This example shows the generated-client shape produced from a Sloppy OpenAPI
4
+ artifact. The generator returns JavaScript source that uses first-party
5
+ `Http.typedClient(...)` and `Config.required(...)`.
6
+
7
+ ```js
8
+ import { File } from "sloppy/fs";
9
+ import { Http } from "sloppy/http";
10
+
11
+ const document = await File.readJson("openapi.json");
12
+ const generated = Http.generateClientFromOpenApi(document, {
13
+ name: "Billing",
14
+ baseUrlConfigKey: "Billing:BaseUrl",
15
+ });
16
+
17
+ await File.writeText("billing.client.js", generated.source);
18
+ ```
19
+
20
+ `tests/bootstrap/test_http_client_factory.mjs` covers deterministic generated
21
+ output, importability, unsupported-schema warnings, and a generated client call
22
+ against `TestHttp.mock()`.
@@ -0,0 +1,45 @@
1
+ {
2
+ "openapi": "3.0.3",
3
+ "info": {
4
+ "title": "Billing",
5
+ "version": "1.0.0"
6
+ },
7
+ "paths": {
8
+ "/invoices/{id}": {
9
+ "get": {
10
+ "operationId": "getInvoice",
11
+ "parameters": [
12
+ {
13
+ "name": "id",
14
+ "in": "path",
15
+ "required": true,
16
+ "schema": { "type": "string" }
17
+ }
18
+ ],
19
+ "responses": {
20
+ "200": {
21
+ "description": "Invoice",
22
+ "content": {
23
+ "application/json": {
24
+ "schema": { "$ref": "#/components/schemas/Invoice" }
25
+ }
26
+ }
27
+ }
28
+ }
29
+ }
30
+ }
31
+ },
32
+ "components": {
33
+ "schemas": {
34
+ "Invoice": {
35
+ "type": "object",
36
+ "required": ["id", "status", "amount"],
37
+ "properties": {
38
+ "id": { "type": "string" },
39
+ "status": { "type": "string" },
40
+ "amount": { "type": "number" }
41
+ }
42
+ }
43
+ }
44
+ }
45
+ }