@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,117 @@
1
+ import { isPlainObject } from "./shared.js";
2
+
3
+ const HTTP_TOKEN_PATTERN = /^[!#$%&'*+\-.^_`|~0-9A-Za-z]+$/u;
4
+
5
+ function requirePlainObject(value, message) {
6
+ if (!isPlainObject(value)) {
7
+ throw new TypeError(message);
8
+ }
9
+ return value;
10
+ }
11
+
12
+ function requireNonEmptyString(value, message) {
13
+ if (typeof value !== "string" || value.length === 0) {
14
+ throw new TypeError(message);
15
+ }
16
+ return value;
17
+ }
18
+
19
+ function optionalBoolean(value, message, defaultValue) {
20
+ if (value === undefined) {
21
+ return defaultValue;
22
+ }
23
+ if (typeof value !== "boolean") {
24
+ throw new TypeError(message);
25
+ }
26
+ return value;
27
+ }
28
+
29
+ function optionalInteger(value, message, defaultValue = undefined) {
30
+ if (value === undefined) {
31
+ return defaultValue;
32
+ }
33
+ if (!Number.isInteger(value)) {
34
+ throw new TypeError(message);
35
+ }
36
+ return value;
37
+ }
38
+
39
+ function optionalPositiveInteger(value, message, defaultValue = undefined) {
40
+ if (value === undefined) {
41
+ return defaultValue;
42
+ }
43
+ if (!Number.isInteger(value) || value <= 0) {
44
+ throw new TypeError(message);
45
+ }
46
+ return value;
47
+ }
48
+
49
+ function optionalNonNegativeInteger(value, message, defaultValue = undefined) {
50
+ if (value === undefined) {
51
+ return defaultValue;
52
+ }
53
+ if (!Number.isInteger(value) || value < 0) {
54
+ throw new TypeError(message);
55
+ }
56
+ return value;
57
+ }
58
+
59
+ function requirePositiveFiniteNumber(value, message) {
60
+ if (!Number.isFinite(value) || value < 1) {
61
+ throw new TypeError(message);
62
+ }
63
+ return Math.ceil(value);
64
+ }
65
+
66
+ function isHttpToken(value) {
67
+ return typeof value === "string" && HTTP_TOKEN_PATTERN.test(value);
68
+ }
69
+
70
+ function requireHttpToken(value, message) {
71
+ if (!isHttpToken(value)) {
72
+ throw new TypeError(message);
73
+ }
74
+ return value;
75
+ }
76
+
77
+ function validateSqliteProviderOptions(options, { requireDatabase = false } = {}) {
78
+ if (!isPlainObject(options)) {
79
+ throw new TypeError("Sloppy sqlite provider options must be a plain object.");
80
+ }
81
+ const allowedKeys = new Set(["database", "queueCapacity"]);
82
+ for (const key of Object.keys(options)) {
83
+ if (!allowedKeys.has(key)) {
84
+ throw new TypeError(`Sloppy sqlite provider option '${key}' is not supported.`);
85
+ }
86
+ }
87
+ if (requireDatabase && (typeof options.database !== "string" || options.database.length === 0)) {
88
+ throw new TypeError("Sloppy sqlite provider database option must be a non-empty string.");
89
+ }
90
+ if (
91
+ Object.prototype.hasOwnProperty.call(options, "database") &&
92
+ (typeof options.database !== "string" || options.database.includes("\0"))
93
+ ) {
94
+ throw new TypeError("Sloppy sqlite provider database option must be a string without NUL.");
95
+ }
96
+ if (
97
+ Object.prototype.hasOwnProperty.call(options, "queueCapacity") &&
98
+ (!Number.isInteger(options.queueCapacity) || options.queueCapacity < 1 || options.queueCapacity > 1_000_000)
99
+ ) {
100
+ throw new TypeError("Sloppy sqlite provider queueCapacity option must be a positive integer.");
101
+ }
102
+ return Object.freeze({ ...options });
103
+ }
104
+
105
+ export {
106
+ isHttpToken,
107
+ isPlainObject,
108
+ optionalBoolean,
109
+ optionalInteger,
110
+ optionalNonNegativeInteger,
111
+ optionalPositiveInteger,
112
+ requireHttpToken,
113
+ requireNonEmptyString,
114
+ requirePlainObject,
115
+ requirePositiveFiniteNumber,
116
+ validateSqliteProviderOptions,
117
+ };
@@ -0,0 +1,427 @@
1
+ import { isPlainObject } from "./internal/validation.js";
2
+ const METRIC_NAME_PATTERN = /^[A-Za-z_:][A-Za-z0-9_:.-]*$/u;
3
+ const LABEL_NAME_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/u;
4
+ const DEFAULT_HISTOGRAM_BUCKETS = Object.freeze([1, 5, 10, 25, 50, 100, 250, 500, 1000, 2500, 5000]);
5
+ const DEFAULT_MAX_LABELSETS = 128;
6
+
7
+ function assertMetricName(name) {
8
+ if (typeof name !== "string" || !METRIC_NAME_PATTERN.test(name)) {
9
+ throw new TypeError("Sloppy metric name must match [A-Za-z_:][A-Za-z0-9_:.-]*.");
10
+ }
11
+ }
12
+
13
+ function assertLabelName(name) {
14
+ if (typeof name !== "string" || !LABEL_NAME_PATTERN.test(name)) {
15
+ throw new TypeError("Sloppy metric label names must match [A-Za-z_][A-Za-z0-9_]*.");
16
+ }
17
+ }
18
+
19
+ function assertFiniteNumber(value, subject) {
20
+ if (typeof value !== "number" || !Number.isFinite(value)) {
21
+ throw new TypeError(`Sloppy metric ${subject} must be a finite number.`);
22
+ }
23
+ }
24
+
25
+ function normalizeDescription(description) {
26
+ if (description === undefined) {
27
+ return "";
28
+ }
29
+ if (typeof description !== "string") {
30
+ throw new TypeError("Sloppy metric description must be a string.");
31
+ }
32
+ return description;
33
+ }
34
+
35
+ function normalizeLabels(labels = undefined) {
36
+ if (labels === undefined || labels === null) {
37
+ return Object.freeze({});
38
+ }
39
+ if (!isPlainObject(labels)) {
40
+ throw new TypeError("Sloppy metric labels must be a plain object.");
41
+ }
42
+ const normalized = {};
43
+ for (const [name, value] of Object.entries(labels).sort(([left], [right]) => left.localeCompare(right))) {
44
+ assertLabelName(name);
45
+ if (value === undefined || value === null) {
46
+ normalized[name] = "";
47
+ } else if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
48
+ normalized[name] = String(value);
49
+ } else {
50
+ throw new TypeError("Sloppy metric label values must be strings, numbers, booleans, null, or undefined.");
51
+ }
52
+ if (normalized[name].length > 256) {
53
+ throw new TypeError("Sloppy metric label values must be at most 256 characters.");
54
+ }
55
+ }
56
+ return Object.freeze(normalized);
57
+ }
58
+
59
+ function labelKey(labels) {
60
+ const entries = Object.entries(labels);
61
+ return entries.length === 0 ? "" : JSON.stringify(entries);
62
+ }
63
+
64
+ function normalizeMetricOptions(options = undefined) {
65
+ if (options === undefined) {
66
+ return Object.freeze({
67
+ description: "",
68
+ maxLabelSets: DEFAULT_MAX_LABELSETS,
69
+ });
70
+ }
71
+ if (!isPlainObject(options)) {
72
+ throw new TypeError("Sloppy metric options must be a plain object.");
73
+ }
74
+ const maxLabelSets = options.maxLabelSets ?? DEFAULT_MAX_LABELSETS;
75
+ if (!Number.isInteger(maxLabelSets) || maxLabelSets < 1 || maxLabelSets > 100000) {
76
+ throw new TypeError("Sloppy metric maxLabelSets must be an integer from 1 to 100000.");
77
+ }
78
+ return Object.freeze({
79
+ description: normalizeDescription(options.description ?? options.help),
80
+ maxLabelSets,
81
+ });
82
+ }
83
+
84
+ function normalizeHistogramOptions(options = undefined) {
85
+ const base = normalizeMetricOptions(options);
86
+ const sourceBuckets = options?.buckets ?? DEFAULT_HISTOGRAM_BUCKETS;
87
+ if (!Array.isArray(sourceBuckets) || sourceBuckets.length === 0) {
88
+ throw new TypeError("Sloppy histogram buckets must be a non-empty number array.");
89
+ }
90
+ const buckets = [...sourceBuckets].map((bucket) => {
91
+ assertFiniteNumber(bucket, "bucket");
92
+ if (bucket <= 0) {
93
+ throw new TypeError("Sloppy histogram buckets must be positive.");
94
+ }
95
+ return bucket;
96
+ }).sort((left, right) => left - right);
97
+ for (let index = 1; index < buckets.length; index += 1) {
98
+ if (buckets[index] === buckets[index - 1]) {
99
+ throw new TypeError("Sloppy histogram buckets must be unique.");
100
+ }
101
+ }
102
+ return Object.freeze({
103
+ ...base,
104
+ buckets: Object.freeze(buckets),
105
+ });
106
+ }
107
+
108
+ function escapePrometheusText(text) {
109
+ return String(text).replace(/\\/gu, "\\\\").replace(/\n/gu, "\\n").replace(/"/gu, "\\\"");
110
+ }
111
+
112
+ function metricTypeName(type) {
113
+ return type === "histogram" ? "histogram" : type;
114
+ }
115
+
116
+ function prometheusMetricName(name) {
117
+ return name.replace(/[.-]/gu, "_");
118
+ }
119
+
120
+ class MetricHandle {
121
+ constructor(registry, name, type, options) {
122
+ this.registry = registry;
123
+ this.name = name;
124
+ this.type = type;
125
+ this.description = options.description;
126
+ this.maxLabelSets = options.maxLabelSets;
127
+ this.buckets = options.buckets ?? undefined;
128
+ this.series = new Map();
129
+ Object.seal(this);
130
+ }
131
+
132
+ _series(labels = undefined) {
133
+ const normalizedLabels = normalizeLabels(labels);
134
+ const key = labelKey(normalizedLabels);
135
+ let series = this.series.get(key);
136
+ if (series !== undefined) {
137
+ return series;
138
+ }
139
+ if (this.series.size >= this.maxLabelSets) {
140
+ this.registry._cardinalityDrop();
141
+ return undefined;
142
+ }
143
+ series = this.type === "histogram"
144
+ ? {
145
+ labels: normalizedLabels,
146
+ count: 0,
147
+ sum: 0,
148
+ buckets: this.buckets.map((le) => ({ le, count: 0 })),
149
+ }
150
+ : {
151
+ labels: normalizedLabels,
152
+ value: 0,
153
+ };
154
+ this.series.set(key, series);
155
+ return series;
156
+ }
157
+
158
+ inc(labelsOrValue = undefined, maybeValue = undefined) {
159
+ if (this.type !== "counter" && this.type !== "gauge") {
160
+ throw new TypeError("Sloppy metric inc is only available on counters and gauges.");
161
+ }
162
+ const labels = typeof labelsOrValue === "number" ? undefined : labelsOrValue;
163
+ const amount = typeof labelsOrValue === "number" ? labelsOrValue : maybeValue ?? 1;
164
+ assertFiniteNumber(amount, "increment");
165
+ if (this.type === "counter" && amount < 0) {
166
+ throw new TypeError("Sloppy counter increments must be non-negative.");
167
+ }
168
+ const series = this._series(labels);
169
+ if (series !== undefined) {
170
+ series.value += amount;
171
+ }
172
+ return this;
173
+ }
174
+
175
+ dec(labelsOrValue = undefined, maybeValue = undefined) {
176
+ if (this.type !== "gauge") {
177
+ throw new TypeError("Sloppy metric dec is only available on gauges.");
178
+ }
179
+ const labels = typeof labelsOrValue === "number" ? undefined : labelsOrValue;
180
+ const amount = typeof labelsOrValue === "number" ? labelsOrValue : maybeValue ?? 1;
181
+ assertFiniteNumber(amount, "decrement");
182
+ const series = this._series(labels);
183
+ if (series !== undefined) {
184
+ series.value -= amount;
185
+ }
186
+ return this;
187
+ }
188
+
189
+ set(labelsOrValue, maybeValue = undefined) {
190
+ if (this.type !== "gauge") {
191
+ throw new TypeError("Sloppy metric set is only available on gauges.");
192
+ }
193
+ const labels = typeof labelsOrValue === "number" ? undefined : labelsOrValue;
194
+ const value = typeof labelsOrValue === "number" ? labelsOrValue : maybeValue;
195
+ assertFiniteNumber(value, "value");
196
+ const series = this._series(labels);
197
+ if (series !== undefined) {
198
+ series.value = value;
199
+ }
200
+ return this;
201
+ }
202
+
203
+ observe(labelsOrValue, maybeValue = undefined) {
204
+ if (this.type !== "histogram") {
205
+ throw new TypeError("Sloppy metric observe is only available on histograms.");
206
+ }
207
+ const labels = typeof labelsOrValue === "number" ? undefined : labelsOrValue;
208
+ const value = typeof labelsOrValue === "number" ? labelsOrValue : maybeValue;
209
+ assertFiniteNumber(value, "observation");
210
+ if (value < 0) {
211
+ throw new TypeError("Sloppy histogram observations must be non-negative.");
212
+ }
213
+ const series = this._series(labels);
214
+ if (series !== undefined) {
215
+ series.count += 1;
216
+ series.sum += value;
217
+ for (const bucket of series.buckets) {
218
+ if (value <= bucket.le) {
219
+ bucket.count += 1;
220
+ }
221
+ }
222
+ }
223
+ return this;
224
+ }
225
+
226
+ timer(labels = undefined) {
227
+ const started = nowMs();
228
+ let stopped = false;
229
+ return () => {
230
+ if (stopped) {
231
+ return 0;
232
+ }
233
+ stopped = true;
234
+ const elapsed = Math.max(0, nowMs() - started);
235
+ this.observe(labels, elapsed);
236
+ return elapsed;
237
+ };
238
+ }
239
+
240
+ async measure(callback, labels = undefined) {
241
+ if (typeof callback !== "function") {
242
+ throw new TypeError("Sloppy histogram measure requires a callback.");
243
+ }
244
+ const stop = this.timer(labels);
245
+ try {
246
+ return await callback();
247
+ } finally {
248
+ stop();
249
+ }
250
+ }
251
+
252
+ reset() {
253
+ this.series.clear();
254
+ }
255
+
256
+ snapshot() {
257
+ const series = [...this.series.values()].map((entry) => {
258
+ if (this.type === "histogram") {
259
+ return Object.freeze({
260
+ labels: entry.labels,
261
+ count: entry.count,
262
+ sum: entry.sum,
263
+ buckets: Object.freeze(entry.buckets.map((bucket) => Object.freeze({ ...bucket }))),
264
+ });
265
+ }
266
+ return Object.freeze({
267
+ labels: entry.labels,
268
+ value: entry.value,
269
+ });
270
+ }).sort((left, right) => labelKey(left.labels).localeCompare(labelKey(right.labels)));
271
+ return Object.freeze({
272
+ name: this.name,
273
+ type: this.type,
274
+ description: this.description,
275
+ buckets: this.buckets,
276
+ series: Object.freeze(series),
277
+ });
278
+ }
279
+ }
280
+
281
+ function nowMs() {
282
+ if (globalThis.performance !== undefined && typeof globalThis.performance.now === "function") {
283
+ return globalThis.performance.now();
284
+ }
285
+ return Date.now();
286
+ }
287
+
288
+ function metricLabelsText(labels, extra = undefined) {
289
+ const entries = Object.entries({ ...labels, ...(extra ?? {}) });
290
+ if (entries.length === 0) {
291
+ return "";
292
+ }
293
+ return `{${entries.map(([name, value]) => `${name}="${escapePrometheusText(value)}"`).join(",")}}`;
294
+ }
295
+
296
+ function renderPrometheusMetric(metric) {
297
+ const lines = [];
298
+ const name = prometheusMetricName(metric.name);
299
+ lines.push(`# HELP ${name} ${escapePrometheusText(metric.description || metric.name)}`);
300
+ lines.push(`# TYPE ${name} ${metricTypeName(metric.type)}`);
301
+ for (const series of metric.series) {
302
+ if (metric.type === "histogram") {
303
+ for (const bucket of series.buckets) {
304
+ lines.push(`${name}_bucket${metricLabelsText(series.labels, { le: String(bucket.le) })} ${bucket.count}`);
305
+ }
306
+ lines.push(`${name}_bucket${metricLabelsText(series.labels, { le: "+Inf" })} ${series.count}`);
307
+ lines.push(`${name}_sum${metricLabelsText(series.labels)} ${series.sum}`);
308
+ lines.push(`${name}_count${metricLabelsText(series.labels)} ${series.count}`);
309
+ } else {
310
+ lines.push(`${name}${metricLabelsText(series.labels)} ${series.value}`);
311
+ }
312
+ }
313
+ return lines;
314
+ }
315
+
316
+ function createMetricsRegistry(options = undefined) {
317
+ if (options !== undefined && !isPlainObject(options)) {
318
+ throw new TypeError("Sloppy Metrics registry options must be a plain object.");
319
+ }
320
+ const metrics = new Map();
321
+ let cardinalityDrops = 0;
322
+ const registry = {
323
+ _cardinalityDrop() {
324
+ cardinalityDrops += 1;
325
+ },
326
+ counter(name, metricOptions = undefined) {
327
+ return registerMetric(registry, metrics, name, "counter", normalizeMetricOptions(metricOptions));
328
+ },
329
+ gauge(name, metricOptions = undefined) {
330
+ return registerMetric(registry, metrics, name, "gauge", normalizeMetricOptions(metricOptions));
331
+ },
332
+ histogram(name, metricOptions = undefined) {
333
+ return registerMetric(registry, metrics, name, "histogram", normalizeHistogramOptions(metricOptions));
334
+ },
335
+ timer(name, metricOptions = undefined) {
336
+ return registry.histogram(name, metricOptions);
337
+ },
338
+ get(name) {
339
+ return metrics.get(name);
340
+ },
341
+ snapshot() {
342
+ const snapshot = [...metrics.values()].map((metric) => metric.snapshot())
343
+ .sort((left, right) => left.name.localeCompare(right.name));
344
+ const output = {
345
+ metrics: Object.freeze(snapshot),
346
+ cardinalityDrops,
347
+ };
348
+ return Object.freeze(output);
349
+ },
350
+ reset() {
351
+ for (const metric of metrics.values()) {
352
+ metric.reset();
353
+ }
354
+ cardinalityDrops = 0;
355
+ },
356
+ toJSON() {
357
+ return registry.snapshot();
358
+ },
359
+ renderJson() {
360
+ return JSON.stringify(registry.snapshot(), null, 2);
361
+ },
362
+ renderPrometheus() {
363
+ return renderPrometheus(registry.snapshot());
364
+ },
365
+ };
366
+ return Object.freeze(registry);
367
+ }
368
+
369
+ function registerMetric(registry, metrics, name, type, options) {
370
+ assertMetricName(name);
371
+ const existing = metrics.get(name);
372
+ if (existing !== undefined) {
373
+ if (existing.type !== type) {
374
+ throw new TypeError(`Sloppy metric '${name}' is already registered as ${existing.type}.`);
375
+ }
376
+ return existing;
377
+ }
378
+ const metric = new MetricHandle(registry, name, type, options);
379
+ metrics.set(name, metric);
380
+ return metric;
381
+ }
382
+
383
+ function renderPrometheus(snapshot) {
384
+ const lines = [];
385
+ for (const metric of snapshot.metrics) {
386
+ lines.push(...renderPrometheusMetric(metric));
387
+ }
388
+ lines.push("# HELP sloppy_metrics_cardinality_drops_total Dropped metric labelsets rejected by cardinality guards.");
389
+ lines.push("# TYPE sloppy_metrics_cardinality_drops_total counter");
390
+ lines.push(`sloppy_metrics_cardinality_drops_total ${snapshot.cardinalityDrops}`);
391
+ return `${lines.join("\n")}\n`;
392
+ }
393
+
394
+ const defaultRegistry = createMetricsRegistry();
395
+
396
+ const Metrics = Object.freeze({
397
+ createRegistry: createMetricsRegistry,
398
+ get defaultRegistry() {
399
+ return defaultRegistry;
400
+ },
401
+ counter(name, options = undefined) {
402
+ return defaultRegistry.counter(name, options);
403
+ },
404
+ gauge(name, options = undefined) {
405
+ return defaultRegistry.gauge(name, options);
406
+ },
407
+ histogram(name, options = undefined) {
408
+ return defaultRegistry.histogram(name, options);
409
+ },
410
+ timer(name, options = undefined) {
411
+ return defaultRegistry.timer(name, options);
412
+ },
413
+ snapshot() {
414
+ return defaultRegistry.snapshot();
415
+ },
416
+ reset() {
417
+ defaultRegistry.reset();
418
+ },
419
+ renderJson(registry = defaultRegistry) {
420
+ return registry.renderJson();
421
+ },
422
+ renderPrometheus(registry = defaultRegistry) {
423
+ return registry.renderPrometheus();
424
+ },
425
+ });
426
+
427
+ export { Metrics, createMetricsRegistry, escapePrometheusText, renderPrometheus };