@slopware/sloppy-darwin-arm64 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,546 @@
1
+ import { isPlainObject } from "./internal/validation.js";
2
+ function issue(path, code, message) {
3
+ return Object.freeze({
4
+ path: Object.freeze([...path]),
5
+ code,
6
+ message,
7
+ });
8
+ }
9
+
10
+ function success(value) {
11
+ return Object.freeze({
12
+ ok: true,
13
+ value,
14
+ });
15
+ }
16
+
17
+ function failure(issues) {
18
+ return Object.freeze({
19
+ ok: false,
20
+ issues: Object.freeze(issues),
21
+ });
22
+ }
23
+
24
+ class SloppyValidationError extends Error {
25
+ constructor(issues) {
26
+ super("Sloppy request validation failed.");
27
+ this.name = "SloppyValidationError";
28
+ this.issues = Object.freeze([...issues]);
29
+ this.__sloppyValidationError = true;
30
+ }
31
+ }
32
+
33
+ function validationProblem(issues) {
34
+ return Object.freeze({
35
+ type: "https://sloppy.dev/problems/validation",
36
+ title: "Validation failed",
37
+ status: 400,
38
+ code: "SLOPPY_E_VALIDATION_FAILED",
39
+ errors: Object.freeze(issues.map((current) => Object.freeze({
40
+ path: Object.freeze([...current.path]),
41
+ code: current.code,
42
+ message: current.message,
43
+ }))),
44
+ });
45
+ }
46
+
47
+ function isValidationError(error) {
48
+ return error !== null && typeof error === "object" && error.__sloppyValidationError === true;
49
+ }
50
+
51
+ function throwValidationError(issues) {
52
+ throw new SloppyValidationError(issues);
53
+ }
54
+
55
+ function isSchema(value) {
56
+ return value !== null &&
57
+ typeof value === "object" &&
58
+ typeof value.validate === "function" &&
59
+ typeof value.__validateAtPath === "function";
60
+ }
61
+
62
+ const MODIFIERS = Symbol("SloppySchemaModifiers");
63
+
64
+ function withModifiers(schema) {
65
+ const modifiers = schema[MODIFIERS] ?? Object.freeze([]);
66
+ const wrapped = {
67
+ ...schema,
68
+ optional() {
69
+ return createOptionalSchema(schema);
70
+ },
71
+ nullable() {
72
+ return createNullableSchema(schema);
73
+ },
74
+ default(value) {
75
+ return createDefaultSchema(schema, value);
76
+ },
77
+ };
78
+
79
+ for (const [key, value] of Object.entries(schema)) {
80
+ if (["validate", "__validateAtPath", "optional", "nullable", "default"].includes(key) ||
81
+ typeof value !== "function") {
82
+ continue;
83
+ }
84
+ wrapped[key] = (...args) => {
85
+ const next = value(...args);
86
+ return isSchema(next) ? applySchemaModifiers(next, modifiers) : next;
87
+ };
88
+ }
89
+
90
+ Object.defineProperty(wrapped, MODIFIERS, {
91
+ value: modifiers,
92
+ });
93
+ return Object.freeze(wrapped);
94
+ }
95
+
96
+ function applySchemaModifiers(schema, modifiers) {
97
+ let current = schema;
98
+ for (const modifier of modifiers) {
99
+ if (modifier.kind === "optional") {
100
+ current = createOptionalSchema(current);
101
+ } else if (modifier.kind === "nullable") {
102
+ current = createNullableSchema(current);
103
+ } else if (modifier.kind === "default") {
104
+ current = createDefaultSchema(current, modifier.value);
105
+ }
106
+ }
107
+ return current;
108
+ }
109
+
110
+ function createOptionalSchema(inner) {
111
+ function validateAtPath(value, path) {
112
+ if (value === undefined) {
113
+ return success(undefined);
114
+ }
115
+
116
+ return inner.__validateAtPath(value, path);
117
+ }
118
+
119
+ return withModifiers({
120
+ ...inner,
121
+ kind: inner.kind,
122
+ metadata: Object.freeze({
123
+ ...inner.metadata,
124
+ optional: true,
125
+ }),
126
+ validate(value) {
127
+ return validateAtPath(value, []);
128
+ },
129
+ __validateAtPath: validateAtPath,
130
+ [MODIFIERS]: Object.freeze([...(inner[MODIFIERS] ?? []), Object.freeze({ kind: "optional" })]),
131
+ });
132
+ }
133
+
134
+ function createNullableSchema(inner) {
135
+ function validateAtPath(value, path) {
136
+ if (value === null) {
137
+ return success(null);
138
+ }
139
+
140
+ return inner.__validateAtPath(value, path);
141
+ }
142
+
143
+ return withModifiers({
144
+ ...inner,
145
+ kind: inner.kind,
146
+ metadata: Object.freeze({
147
+ ...inner.metadata,
148
+ nullable: true,
149
+ }),
150
+ validate(value) {
151
+ return validateAtPath(value, []);
152
+ },
153
+ __validateAtPath: validateAtPath,
154
+ [MODIFIERS]: Object.freeze([...(inner[MODIFIERS] ?? []), Object.freeze({ kind: "nullable" })]),
155
+ });
156
+ }
157
+
158
+ function createDefaultSchema(inner, defaultValue) {
159
+ const defaultResult = inner.__validateAtPath(defaultValue, []);
160
+ if (!defaultResult.ok) {
161
+ throw new TypeError("Sloppy schema default value must satisfy the wrapped schema.");
162
+ }
163
+ const protectedDefault = protectDefaultValue(defaultResult.value);
164
+
165
+ function validateAtPath(value, path) {
166
+ if (value === undefined) {
167
+ return success(protectedDefault);
168
+ }
169
+
170
+ return inner.__validateAtPath(value, path);
171
+ }
172
+
173
+ return withModifiers({
174
+ ...inner,
175
+ kind: inner.kind,
176
+ metadata: Object.freeze({
177
+ ...inner.metadata,
178
+ default: protectedDefault,
179
+ }),
180
+ validate(value) {
181
+ return validateAtPath(value, []);
182
+ },
183
+ __validateAtPath: validateAtPath,
184
+ [MODIFIERS]: Object.freeze([...(inner[MODIFIERS] ?? []), Object.freeze({ kind: "default", value: protectedDefault })]),
185
+ });
186
+ }
187
+
188
+ function protectDefaultValue(value) {
189
+ if (value === null || typeof value !== "object") {
190
+ return value;
191
+ }
192
+ if (Array.isArray(value)) {
193
+ return Object.freeze(value.map((item) => protectDefaultValue(item)));
194
+ }
195
+ if (!isPlainObject(value)) {
196
+ throw new TypeError("Sloppy schema default object values must be plain JSON-compatible objects.");
197
+ }
198
+ return Object.freeze(Object.fromEntries(
199
+ Object.entries(value).map(([key, item]) => [key, protectDefaultValue(item)]),
200
+ ));
201
+ }
202
+
203
+ function normalizeStringRuleValue(value, name) {
204
+ if (!Number.isInteger(value) || value < 0) {
205
+ throw new TypeError(`Sloppy schema.string().${name} length must be a non-negative integer.`);
206
+ }
207
+ return value;
208
+ }
209
+
210
+ function createStringSchema(rules = []) {
211
+ function validateAtPath(value, path) {
212
+ const issues = [];
213
+
214
+ if (typeof value !== "string") {
215
+ issues.push(issue(path, "type", "Expected a string."));
216
+ return failure(issues);
217
+ }
218
+
219
+ for (const rule of rules) {
220
+ if ((rule.kind === "min" || rule.kind === "minLength") && value.length < rule.value) {
221
+ issues.push(issue(path, "string.min", `Expected at least ${rule.value} character(s).`));
222
+ }
223
+
224
+ if ((rule.kind === "max" || rule.kind === "maxLength") && value.length > rule.value) {
225
+ issues.push(issue(path, "string.max", `Expected at most ${rule.value} character(s).`));
226
+ }
227
+
228
+ if (rule.kind === "email" && !/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) {
229
+ issues.push(issue(path, "string.email", "Expected an email address."));
230
+ }
231
+
232
+ if (rule.kind === "uuid" &&
233
+ !/^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/iu.test(value)) {
234
+ issues.push(issue(path, "string.uuid", "Expected a UUID."));
235
+ }
236
+
237
+ if (rule.kind === "pattern" && !rule.value.test(value)) {
238
+ issues.push(issue(path, "string.pattern", rule.message ?? "Expected string to match pattern."));
239
+ }
240
+ }
241
+
242
+ return issues.length === 0 ? success(value) : failure(issues);
243
+ }
244
+
245
+ const schema = {
246
+ kind: "string",
247
+ metadata: Object.freeze({
248
+ kind: "string",
249
+ rules: Object.freeze(rules.map((rule) => Object.freeze({ ...rule }))),
250
+ }),
251
+ min(length) {
252
+ return createStringSchema([...rules, Object.freeze({ kind: "min", value: normalizeStringRuleValue(length, "min") })]);
253
+ },
254
+ max(length) {
255
+ return createStringSchema([...rules, Object.freeze({ kind: "max", value: normalizeStringRuleValue(length, "max") })]);
256
+ },
257
+ minLength(length) {
258
+ return createStringSchema([...rules, Object.freeze({ kind: "minLength", value: normalizeStringRuleValue(length, "minLength") })]);
259
+ },
260
+ maxLength(length) {
261
+ return createStringSchema([...rules, Object.freeze({ kind: "maxLength", value: normalizeStringRuleValue(length, "maxLength") })]);
262
+ },
263
+ email() {
264
+ return createStringSchema([...rules, Object.freeze({ kind: "email" })]);
265
+ },
266
+ uuid() {
267
+ return createStringSchema([...rules, Object.freeze({ kind: "uuid" })]);
268
+ },
269
+ pattern(pattern, message) {
270
+ if (!(pattern instanceof RegExp)) {
271
+ throw new TypeError("Sloppy schema.string().pattern expects a RegExp.");
272
+ }
273
+ if (message !== undefined && typeof message !== "string") {
274
+ throw new TypeError("Sloppy schema.string().pattern message must be a string.");
275
+ }
276
+ const normalizedPattern = new RegExp(pattern.source, pattern.flags.replace(/[gy]/gu, ""));
277
+ return createStringSchema([...rules, Object.freeze({ kind: "pattern", value: normalizedPattern, message })]);
278
+ },
279
+ validate(value) {
280
+ return validateAtPath(value, []);
281
+ },
282
+ __validateAtPath: validateAtPath,
283
+ };
284
+
285
+ return withModifiers(schema);
286
+ }
287
+
288
+ function createNumberSchema(kind, integer, rules = []) {
289
+ function validateAtPath(value, path) {
290
+ if (typeof value !== "number" || !Number.isFinite(value) || (integer && !Number.isInteger(value))) {
291
+ return failure([issue(path, "type", integer ? "Expected an integer." : "Expected a finite number.")]);
292
+ }
293
+
294
+ const issues = [];
295
+ for (const rule of rules) {
296
+ if (rule.kind === "min" && value < rule.value) {
297
+ issues.push(issue(path, "number.min", `Expected a value greater than or equal to ${rule.value}.`));
298
+ }
299
+ if (rule.kind === "max" && value > rule.value) {
300
+ issues.push(issue(path, "number.max", `Expected a value less than or equal to ${rule.value}.`));
301
+ }
302
+ }
303
+
304
+ return issues.length === 0 ? success(value) : failure(issues);
305
+ }
306
+
307
+ return withModifiers({
308
+ kind,
309
+ metadata: Object.freeze({
310
+ kind,
311
+ rules: Object.freeze(rules.map((rule) => Object.freeze({ ...rule }))),
312
+ }),
313
+ min(value) {
314
+ if (typeof value !== "number" || !Number.isFinite(value)) {
315
+ throw new TypeError(`Sloppy schema.${kind}().min value must be a finite number.`);
316
+ }
317
+ return createNumberSchema(kind, integer, [...rules, Object.freeze({ kind: "min", value })]);
318
+ },
319
+ max(value) {
320
+ if (typeof value !== "number" || !Number.isFinite(value)) {
321
+ throw new TypeError(`Sloppy schema.${kind}().max value must be a finite number.`);
322
+ }
323
+ return createNumberSchema(kind, integer, [...rules, Object.freeze({ kind: "max", value })]);
324
+ },
325
+ validate(value) {
326
+ return validateAtPath(value, []);
327
+ },
328
+ __validateAtPath: validateAtPath,
329
+ });
330
+ }
331
+
332
+ function createPrimitiveSchema(kind, predicate, expected) {
333
+ function validateAtPath(value, path) {
334
+ if (!predicate(value)) {
335
+ return failure([issue(path, "type", `Expected ${expected}.`)]);
336
+ }
337
+
338
+ return success(value);
339
+ }
340
+
341
+ return withModifiers({
342
+ kind,
343
+ metadata: Object.freeze({ kind }),
344
+ validate(value) {
345
+ return validateAtPath(value, []);
346
+ },
347
+ __validateAtPath: validateAtPath,
348
+ });
349
+ }
350
+
351
+ function createArraySchema(itemSchema) {
352
+ if (!isSchema(itemSchema)) {
353
+ throw new TypeError("Sloppy schema.array item must be a schema.");
354
+ }
355
+
356
+ function validateAtPath(value, path) {
357
+ if (!Array.isArray(value)) {
358
+ return failure([issue(path, "type", "Expected an array.")]);
359
+ }
360
+
361
+ const issues = [];
362
+ const output = [];
363
+ for (let index = 0; index < value.length; index += 1) {
364
+ const itemResult = itemSchema.__validateAtPath(value[index], [...path, index]);
365
+ if (!itemResult.ok) {
366
+ issues.push(...itemResult.issues);
367
+ } else {
368
+ output.push(itemResult.value);
369
+ }
370
+ }
371
+
372
+ return issues.length === 0 ? success(output) : failure(issues);
373
+ }
374
+
375
+ return withModifiers({
376
+ kind: "array",
377
+ metadata: Object.freeze({
378
+ kind: "array",
379
+ item: itemSchema.metadata,
380
+ }),
381
+ item: itemSchema,
382
+ validate(value) {
383
+ return validateAtPath(value, []);
384
+ },
385
+ __validateAtPath: validateAtPath,
386
+ });
387
+ }
388
+
389
+ function literal(value) {
390
+ if (!isJsonLiteral(value)) {
391
+ throw new TypeError("Sloppy schema.literal expects a string, finite number, boolean, or null.");
392
+ }
393
+
394
+ function validateAtPath(input, path) {
395
+ return Object.is(input, value)
396
+ ? success(input)
397
+ : failure([issue(path, "literal", "Expected literal value.")]);
398
+ }
399
+
400
+ return withModifiers({
401
+ kind: "literal",
402
+ metadata: Object.freeze({ kind: "literal", value }),
403
+ validate(input) {
404
+ return validateAtPath(input, []);
405
+ },
406
+ __validateAtPath: validateAtPath,
407
+ });
408
+ }
409
+
410
+ function oneOf(values) {
411
+ if (!Array.isArray(values) || values.length === 0 || !values.every(isJsonLiteral)) {
412
+ throw new TypeError("Sloppy schema.enum expects a non-empty array of string, finite number, boolean, or null values.");
413
+ }
414
+ const variants = Object.freeze([...values]);
415
+
416
+ function validateAtPath(input, path) {
417
+ return variants.some((value) => Object.is(value, input))
418
+ ? success(input)
419
+ : failure([issue(path, "enum", "Expected one of the allowed values.")]);
420
+ }
421
+
422
+ return withModifiers({
423
+ kind: "enum",
424
+ metadata: Object.freeze({ kind: "enum", values: variants }),
425
+ validate(input) {
426
+ return validateAtPath(input, []);
427
+ },
428
+ __validateAtPath: validateAtPath,
429
+ });
430
+ }
431
+
432
+ function isJsonLiteral(value) {
433
+ return value === null ||
434
+ typeof value === "string" ||
435
+ typeof value === "boolean" ||
436
+ (typeof value === "number" && Number.isFinite(value));
437
+ }
438
+
439
+ function validateShape(shape) {
440
+ if (!isPlainObject(shape)) {
441
+ throw new TypeError("Sloppy schema.object shape must be a plain object.");
442
+ }
443
+
444
+ for (const [key, value] of Object.entries(shape)) {
445
+ if (typeof key !== "string" || key.length === 0) {
446
+ throw new TypeError("Sloppy schema.object keys must be non-empty strings.");
447
+ }
448
+
449
+ if (!isSchema(value)) {
450
+ throw new TypeError(`Sloppy schema.object field '${key}' must be a schema.`);
451
+ }
452
+ }
453
+ }
454
+
455
+ function object(shape) {
456
+ validateShape(shape);
457
+
458
+ const fields = Object.freeze({ ...shape });
459
+ const metadata = Object.freeze({
460
+ kind: "object",
461
+ shape: Object.freeze(Object.fromEntries(
462
+ Object.entries(fields).map(([key, value]) => [key, value.metadata]),
463
+ )),
464
+ });
465
+
466
+ function validateAtPath(value, path) {
467
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
468
+ return failure([issue(path, "type", "Expected an object.")]);
469
+ }
470
+
471
+ const issues = [];
472
+ const output = {};
473
+
474
+ for (const [key, fieldSchema] of Object.entries(fields)) {
475
+ const fieldResult = fieldSchema.__validateAtPath(value[key], [...path, key]);
476
+
477
+ if (!fieldResult.ok) {
478
+ issues.push(...fieldResult.issues);
479
+ } else if (fieldResult.value !== undefined || Object.prototype.hasOwnProperty.call(value, key)) {
480
+ output[key] = fieldResult.value;
481
+ }
482
+ }
483
+
484
+ return issues.length === 0 ? success(output) : failure(issues);
485
+ }
486
+
487
+ return withModifiers({
488
+ kind: "object",
489
+ metadata,
490
+ shape: fields,
491
+ validate(value) {
492
+ return validateAtPath(value, []);
493
+ },
494
+ __validateAtPath: validateAtPath,
495
+ });
496
+ }
497
+
498
+ function validate(value, schemaValue) {
499
+ if (!isSchema(schemaValue)) {
500
+ throw new TypeError("Sloppy Schema.validate expects a schema.");
501
+ }
502
+ const result = schemaValue.validate(value);
503
+ if (!result.ok) {
504
+ throwValidationError(result.issues);
505
+ }
506
+ return result.value;
507
+ }
508
+
509
+ const schemaApi = Object.freeze({
510
+ string() {
511
+ return createStringSchema();
512
+ },
513
+ number() {
514
+ return createNumberSchema("number", false);
515
+ },
516
+ int() {
517
+ return createNumberSchema("int", true);
518
+ },
519
+ integer() {
520
+ return createNumberSchema("int", true);
521
+ },
522
+ boolean() {
523
+ return createPrimitiveSchema("boolean", (value) => typeof value === "boolean", "a boolean");
524
+ },
525
+ bool() {
526
+ return createPrimitiveSchema("boolean", (value) => typeof value === "boolean", "a boolean");
527
+ },
528
+ array(itemSchema) {
529
+ return createArraySchema(itemSchema);
530
+ },
531
+ enum(values) {
532
+ return oneOf(values);
533
+ },
534
+ literal(value) {
535
+ return literal(value);
536
+ },
537
+ object,
538
+ validate,
539
+ isSchema,
540
+ validationProblem,
541
+ isValidationError,
542
+ });
543
+
544
+ export const schema = schemaApi;
545
+ export const Schema = schemaApi;
546
+ export { SloppyValidationError, isSchema, isValidationError, validationProblem };