@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.
- package/LICENSE +201 -0
- package/README.md +5 -0
- package/bin/sloppy +0 -0
- package/bin/sloppyc +0 -0
- package/docs/KNOWN_LIMITATIONS.md +16 -0
- package/docs/LICENSES.md +6 -0
- package/docs/NOTICE.md +8 -0
- package/examples/README.md +140 -0
- package/examples/auth-api/README.md +20 -0
- package/examples/auth-api/app.js +61 -0
- package/examples/auth-api/appsettings.json +7 -0
- package/examples/auth-api/sloppy.json +5 -0
- package/examples/cache-basic/README.md +9 -0
- package/examples/cache-basic/app.js +32 -0
- package/examples/cache-hybrid-postgres/README.md +10 -0
- package/examples/cache-hybrid-postgres/app.js +27 -0
- package/examples/cache-output-api/README.md +10 -0
- package/examples/cache-output-api/app.js +35 -0
- package/examples/codec-base64-hex/README.md +14 -0
- package/examples/codec-base64-hex/app.js +15 -0
- package/examples/codec-checksums/README.md +15 -0
- package/examples/codec-checksums/app.js +8 -0
- package/examples/codec-compression/README.md +13 -0
- package/examples/codec-compression/app.js +9 -0
- package/examples/codec-streaming-compression/README.md +19 -0
- package/examples/codec-streaming-compression/app.js +16 -0
- package/examples/codec-text-binary/README.md +16 -0
- package/examples/codec-text-binary/app.js +17 -0
- package/examples/compiler-hello/README.md +71 -0
- package/examples/compiler-hello/app.js +7 -0
- package/examples/compiler-hello/expected/app.js +8 -0
- package/examples/compiler-hello/expected/app.js.map +53 -0
- package/examples/compiler-hello/expected/app.plan.json +229 -0
- package/examples/compiler-hello/expected/routes.slrt +0 -0
- package/examples/config-basic/README.md +13 -0
- package/examples/config-basic/app.js +13 -0
- package/examples/config-basic/appsettings.json +7 -0
- package/examples/config-secrets-redaction/README.md +9 -0
- package/examples/config-secrets-redaction/app.js +9 -0
- package/examples/config-secrets-redaction/appsettings.json +5 -0
- package/examples/config-strict-mode/README.md +7 -0
- package/examples/config-strict-mode/app.js +10 -0
- package/examples/config-strict-mode/appsettings.json +7 -0
- package/examples/configured-api/README.md +38 -0
- package/examples/configured-api/app.js +12 -0
- package/examples/configured-api/appsettings.Development.json +5 -0
- package/examples/configured-api/appsettings.json +6 -0
- package/examples/configured-api/sloppy.json +5 -0
- package/examples/core-config-secrets/README.md +10 -0
- package/examples/core-config-secrets/app.js +15 -0
- package/examples/core-fs-time-codec/README.md +9 -0
- package/examples/core-fs-time-codec/app.js +8 -0
- package/examples/core-network-time-codec/README.md +11 -0
- package/examples/core-network-time-codec/app.js +20 -0
- package/examples/core-policy-audit/README.md +7 -0
- package/examples/core-policy-audit/app.js +22 -0
- package/examples/core-process-time-codec/README.md +8 -0
- package/examples/core-process-time-codec/app.js +28 -0
- package/examples/core-worker-time/README.md +8 -0
- package/examples/core-worker-time/app.js +17 -0
- package/examples/crypto-hash-hmac/README.md +17 -0
- package/examples/crypto-hash-hmac/app.js +29 -0
- package/examples/crypto-password/README.md +21 -0
- package/examples/crypto-password/app.js +12 -0
- package/examples/crypto-random-token/README.md +16 -0
- package/examples/crypto-random-token/app.js +12 -0
- package/examples/crypto-secret-constant-time/README.md +21 -0
- package/examples/crypto-secret-constant-time/app.js +15 -0
- package/examples/data-foundation/README.md +39 -0
- package/examples/data-foundation/app.js +63 -0
- package/examples/dependency-graph/README.md +19 -0
- package/examples/dependency-graph/fixtures/graph-helper/index.js +3 -0
- package/examples/dependency-graph/fixtures/graph-helper/package.json +6 -0
- package/examples/dependency-graph/package.json +7 -0
- package/examples/dependency-graph/public/message.txt +1 -0
- package/examples/dependency-graph/sloppy.json +9 -0
- package/examples/dependency-graph/src/main.ts +8 -0
- package/examples/dogfood/README.md +23 -0
- package/examples/dogfood/dogfood.json +136 -0
- package/examples/dynamic-module-include/README.md +20 -0
- package/examples/dynamic-module-include/public/readme.txt +1 -0
- package/examples/dynamic-module-include/sloppy.json +12 -0
- package/examples/dynamic-module-include/src/main.ts +6 -0
- package/examples/dynamic-module-include/src/plugins/alpha.js +3 -0
- package/examples/dynamic-module-include/src/plugins/beta.js +3 -0
- package/examples/ergonomics/README.md +42 -0
- package/examples/ergonomics/app.js +38 -0
- package/examples/framework-controller/README.md +12 -0
- package/examples/framework-controller/app.js +31 -0
- package/examples/framework-di-services/README.md +17 -0
- package/examples/framework-di-services/app.ts +40 -0
- package/examples/framework-explicit-binding/README.md +12 -0
- package/examples/framework-explicit-binding/app.ts +34 -0
- package/examples/framework-hello/README.md +16 -0
- package/examples/framework-hello/app.ts +16 -0
- package/examples/framework-postgres-crud/README.md +73 -0
- package/examples/framework-postgres-crud/app.ts +64 -0
- package/examples/framework-sqlite-crud/README.md +52 -0
- package/examples/framework-sqlite-crud/app.ts +90 -0
- package/examples/framework-sqlite-crud/appsettings.json +11 -0
- package/examples/framework-sqlserver-crud/README.md +73 -0
- package/examples/framework-sqlserver-crud/app.ts +64 -0
- package/examples/framework-validation-errors/README.md +12 -0
- package/examples/framework-validation-errors/app.ts +16 -0
- package/examples/fs-basic/README.md +24 -0
- package/examples/fs-basic/app.js +12 -0
- package/examples/fs-roots-policy/README.md +14 -0
- package/examples/fs-roots-policy/app.js +4 -0
- package/examples/fs-streams/README.md +18 -0
- package/examples/fs-streams/app.js +11 -0
- package/examples/fs-watch/README.md +19 -0
- package/examples/fs-watch/app.js +11 -0
- package/examples/hello/README.md +63 -0
- package/examples/hello/app.js +19 -0
- package/examples/hello-minimal/README.md +51 -0
- package/examples/hello-minimal/sloppy.json +5 -0
- package/examples/hello-minimal/src/main.ts +9 -0
- package/examples/http-client-basic/README.md +11 -0
- package/examples/http-client-basic/app.js +46 -0
- package/examples/http-client-generated/README.md +22 -0
- package/examples/http-client-generated/openapi.json +45 -0
- package/examples/http-client-resilience/README.md +4 -0
- package/examples/http-client-resilience/app.js +38 -0
- package/examples/http-client-runtime-loopback/README.md +24 -0
- package/examples/http-client-testhost/README.md +4 -0
- package/examples/http-client-testhost/app.js +27 -0
- package/examples/http-client-testhost-package-mock/README.md +26 -0
- package/examples/http-client-typed/README.md +5 -0
- package/examples/http-client-typed/app.js +33 -0
- package/examples/modules-api/README.md +30 -0
- package/examples/modules-api/app.js +9 -0
- package/examples/modules-api/modules/routes.js +16 -0
- package/examples/modules-api/sloppy.json +5 -0
- package/examples/modules-basic/README.md +32 -0
- package/examples/modules-basic/app.js +41 -0
- package/examples/net-deadline-cancel/README.md +13 -0
- package/examples/net-deadline-cancel/app.js +34 -0
- package/examples/net-local-ipc/README.md +12 -0
- package/examples/net-local-ipc/app.js +46 -0
- package/examples/net-policy-strict/README.md +12 -0
- package/examples/net-policy-strict/app.js +34 -0
- package/examples/net-tcp-client/README.md +10 -0
- package/examples/net-tcp-client/app.js +23 -0
- package/examples/net-tcp-echo/README.md +11 -0
- package/examples/net-tcp-echo/app.js +45 -0
- package/examples/net-tcp-server/README.md +10 -0
- package/examples/net-tcp-server/app.js +28 -0
- package/examples/node-compat-path-events/README.md +15 -0
- package/examples/node-compat-path-events/sloppy.json +6 -0
- package/examples/node-compat-path-events/src/main.ts +15 -0
- package/examples/ops-compiler/README.md +9 -0
- package/examples/ops-compiler/app.js +26 -0
- package/examples/ops-health-metrics-management/README.md +14 -0
- package/examples/ops-health-metrics-management/app.js +24 -0
- package/examples/orm-basic/README.md +17 -0
- package/examples/orm-basic/app.js +82 -0
- package/examples/orm-cursor-export/README.md +16 -0
- package/examples/orm-cursor-export/app.js +28 -0
- package/examples/orm-migrations/README.md +14 -0
- package/examples/orm-migrations/migrations/.gitkeep +1 -0
- package/examples/orm-migrations/sloppy.json +9 -0
- package/examples/orm-migrations/src/app.ts +34 -0
- package/examples/orm-relations-includes/README.md +10 -0
- package/examples/orm-relations-includes/app.js +47 -0
- package/examples/orm-testservices/README.md +37 -0
- package/examples/orm-testservices/test.mjs +32 -0
- package/examples/os-runtime-api/README.md +11 -0
- package/examples/os-runtime-api/app.js +44 -0
- package/examples/package-zod-like/README.md +28 -0
- package/examples/package-zod-like/fixtures/zod-like/index.js +48 -0
- package/examples/package-zod-like/fixtures/zod-like/package.json +12 -0
- package/examples/package-zod-like/package.json +7 -0
- package/examples/package-zod-like/sloppy.json +6 -0
- package/examples/package-zod-like/src/main.ts +16 -0
- package/examples/postgres-basic/README.md +31 -0
- package/examples/postgres-basic/app.js +50 -0
- package/examples/prealpha-control-plane/README.md +50 -0
- package/examples/prealpha-control-plane/appsettings.Development.json +11 -0
- package/examples/prealpha-control-plane/appsettings.json +15 -0
- package/examples/prealpha-control-plane/sloppy.json +5 -0
- package/examples/prealpha-control-plane/src/db/schema.js +7 -0
- package/examples/prealpha-control-plane/src/db/seed.js +6 -0
- package/examples/prealpha-control-plane/src/main.js +21 -0
- package/examples/prealpha-control-plane/src/routes/apps.js +34 -0
- package/examples/prealpha-control-plane/src/routes/builds.js +25 -0
- package/examples/prealpha-control-plane/src/routes/deployments.js +19 -0
- package/examples/prealpha-control-plane/src/routes/diagnostics.js +11 -0
- package/examples/prealpha-control-plane/src/routes/health.js +27 -0
- package/examples/prealpha-control-plane/src/routes/projects.js +38 -0
- package/examples/prealpha-control-plane/src/services/diagnosticsSink.js +11 -0
- package/examples/prealpha-control-plane/src/services/repositories.js +9 -0
- package/examples/prealpha-control-plane/src/validation/schemas.js +6 -0
- package/examples/program-fs-process/README.md +31 -0
- package/examples/program-fs-process/sloppy.json +9 -0
- package/examples/program-fs-process/src/main.ts +27 -0
- package/examples/program-hello/README.md +32 -0
- package/examples/program-hello/main.ts +8 -0
- package/examples/program-hello/message.ts +1 -0
- package/examples/program-hello/sloppy.json +5 -0
- package/examples/rate-limit-auth/README.md +3 -0
- package/examples/rate-limit-auth/app.js +14 -0
- package/examples/rate-limit-basic/README.md +3 -0
- package/examples/rate-limit-basic/app.js +13 -0
- package/examples/rate-limit-redis/README.md +5 -0
- package/examples/rate-limit-redis/app.js +20 -0
- package/examples/rate-limit-testhost/README.md +4 -0
- package/examples/rate-limit-testhost/app.js +13 -0
- package/examples/rate-limit-websocket/README.md +3 -0
- package/examples/rate-limit-websocket/app.js +16 -0
- package/examples/realtime-auth/README.md +8 -0
- package/examples/realtime-auth/app.js +25 -0
- package/examples/realtime-auth/test.mjs +43 -0
- package/examples/realtime-chat/README.md +8 -0
- package/examples/realtime-chat/app.js +32 -0
- package/examples/realtime-chat/test.mjs +52 -0
- package/examples/realtime-dashboard/README.md +20 -0
- package/examples/realtime-dashboard/app.js +37 -0
- package/examples/realtime-presence/README.md +8 -0
- package/examples/realtime-presence/app.js +32 -0
- package/examples/realtime-presence/test.mjs +50 -0
- package/examples/realtime-testhost/README.md +8 -0
- package/examples/realtime-testhost/test.mjs +31 -0
- package/examples/redis-basic/README.md +17 -0
- package/examples/redis-basic/app.js +39 -0
- package/examples/redis-cache/README.md +14 -0
- package/examples/redis-cache/app.js +36 -0
- package/examples/redis-locks/README.md +13 -0
- package/examples/redis-locks/app.js +49 -0
- package/examples/request-context/README.md +32 -0
- package/examples/request-context/app.js +15 -0
- package/examples/sqlite-basic/README.md +52 -0
- package/examples/sqlite-basic/app.js +56 -0
- package/examples/sqlserver-basic/README.md +36 -0
- package/examples/sqlserver-basic/app.js +59 -0
- package/examples/static-files-basic/README.md +11 -0
- package/examples/static-files-basic/app.js +12 -0
- package/examples/static-files-basic/public/app.js +1 -0
- package/examples/static-files-basic/public/site.css +3 -0
- package/examples/static-files-package/README.md +12 -0
- package/examples/static-files-package/app.js +10 -0
- package/examples/static-files-package/public/index.html +2 -0
- package/examples/static-files-precompressed/README.md +12 -0
- package/examples/static-files-precompressed/app.js +11 -0
- package/examples/static-files-precompressed/public/app.js +1 -0
- package/examples/static-files-precompressed/public/app.js.br +0 -0
- package/examples/static-files-precompressed/public/app.js.gz +0 -0
- package/examples/static-files-spa/README.md +12 -0
- package/examples/static-files-spa/app.js +16 -0
- package/examples/static-files-spa/dist/assets/app.js +1 -0
- package/examples/static-files-spa/dist/index.html +4 -0
- package/examples/static-files-testhost/README.md +8 -0
- package/examples/static-files-testhost/app.js +13 -0
- package/examples/static-files-testhost/public/app.js +1 -0
- package/examples/static-files-testhost/public/app.js.gz +0 -0
- package/examples/static-files-testhost/test.mjs +38 -0
- package/examples/testhost-basic/README.md +26 -0
- package/examples/testhost-db/README.md +31 -0
- package/examples/testservices-postgres/README.md +68 -0
- package/examples/testservices-redis/README.md +71 -0
- package/examples/testservices-sqlserver/README.md +75 -0
- package/examples/time-basic/README.md +18 -0
- package/examples/time-basic/app.js +12 -0
- package/examples/time-deadline-cancellation/README.md +11 -0
- package/examples/time-deadline-cancellation/app.js +27 -0
- package/examples/time-fake-clock/README.md +14 -0
- package/examples/time-fake-clock/app.js +25 -0
- package/examples/time-interval-schedule/README.md +13 -0
- package/examples/time-interval-schedule/app.js +60 -0
- package/examples/users-api-sqlite/README.md +74 -0
- package/examples/users-api-sqlite/app.js +11 -0
- package/examples/users-api-sqlite/appsettings.Development.json +11 -0
- package/examples/users-api-sqlite/appsettings.json +11 -0
- package/examples/users-api-sqlite/modules/users.js +40 -0
- package/examples/users-api-sqlite/sloppy.json +5 -0
- package/examples/validation-errors/README.md +36 -0
- package/examples/validation-errors/app.js +14 -0
- package/examples/validation-errors/invalid-user.http +6 -0
- package/examples/validation-errors/sloppy.json +5 -0
- package/examples/web-dynamic-routes/README.md +17 -0
- package/examples/web-dynamic-routes/app.ts +27 -0
- package/examples/webhooks-basic/README.md +11 -0
- package/examples/webhooks-basic/app.js +48 -0
- package/examples/websocket-auth/README.md +8 -0
- package/examples/websocket-auth/app.js +16 -0
- package/examples/websocket-echo/README.md +9 -0
- package/examples/websocket-echo/app.js +36 -0
- package/examples/websocket-json-schema/README.md +5 -0
- package/examples/websocket-json-schema/app.js +25 -0
- package/examples/websocket-testhost/README.md +11 -0
- package/examples/websocket-testhost/test.mjs +49 -0
- package/examples/workers-background-service/README.md +7 -0
- package/examples/workers-background-service/app.js +16 -0
- package/examples/workers-js-isolate/README.md +8 -0
- package/examples/workers-js-isolate/app.js +19 -0
- package/examples/workers-js-isolate/workers/parser.ts +11 -0
- package/examples/workers-shutdown/README.md +6 -0
- package/examples/workers-shutdown/app.js +26 -0
- package/examples/workers-workerpool/README.md +6 -0
- package/examples/workers-workerpool/app.js +23 -0
- package/examples/workers-workqueue/README.md +8 -0
- package/examples/workers-workqueue/app.js +24 -0
- package/manifest.json +59 -0
- package/package.json +34 -0
- package/stdlib/sloppy/README.md +177 -0
- package/stdlib/sloppy/app.js +2142 -0
- package/stdlib/sloppy/auth.js +1813 -0
- package/stdlib/sloppy/bootstrap.manifest.json +83 -0
- package/stdlib/sloppy/cache.js +1542 -0
- package/stdlib/sloppy/codec.js +1153 -0
- package/stdlib/sloppy/config.js +61 -0
- package/stdlib/sloppy/crypto.js +312 -0
- package/stdlib/sloppy/data.js +2945 -0
- package/stdlib/sloppy/ffi.js +185 -0
- package/stdlib/sloppy/fs.js +795 -0
- package/stdlib/sloppy/health.js +603 -0
- package/stdlib/sloppy/http.js +1595 -0
- package/stdlib/sloppy/index.js +59 -0
- package/stdlib/sloppy/internal/bytes.js +31 -0
- package/stdlib/sloppy/internal/capabilities.js +155 -0
- package/stdlib/sloppy/internal/config.js +640 -0
- package/stdlib/sloppy/internal/disposable.js +31 -0
- package/stdlib/sloppy/internal/headers.js +63 -0
- package/stdlib/sloppy/internal/intrinsics.js +2 -0
- package/stdlib/sloppy/internal/json.js +20 -0
- package/stdlib/sloppy/internal/logging.js +278 -0
- package/stdlib/sloppy/internal/modules.js +405 -0
- package/stdlib/sloppy/internal/redaction.js +87 -0
- package/stdlib/sloppy/internal/routes.js +2279 -0
- package/stdlib/sloppy/internal/runtime-classic.js +19837 -0
- package/stdlib/sloppy/internal/services.js +690 -0
- package/stdlib/sloppy/internal/shared.js +32 -0
- package/stdlib/sloppy/internal/testhost-diagnostics.js +88 -0
- package/stdlib/sloppy/internal/testhost-http-server.js +238 -0
- package/stdlib/sloppy/internal/testhost-http.js +118 -0
- package/stdlib/sloppy/internal/testhost-loopback.js +50 -0
- package/stdlib/sloppy/internal/testservices-docker.js +154 -0
- package/stdlib/sloppy/internal/validation.js +117 -0
- package/stdlib/sloppy/metrics.js +427 -0
- package/stdlib/sloppy/net.js +5208 -0
- package/stdlib/sloppy/node/assert/strict.js +39 -0
- package/stdlib/sloppy/node/assert.js +228 -0
- package/stdlib/sloppy/node/buffer.js +247 -0
- package/stdlib/sloppy/node/console.js +33 -0
- package/stdlib/sloppy/node/constants.js +9 -0
- package/stdlib/sloppy/node/crypto.js +89 -0
- package/stdlib/sloppy/node/diagnostics_channel.js +41 -0
- package/stdlib/sloppy/node/events.js +113 -0
- package/stdlib/sloppy/node/fs/promises.js +27 -0
- package/stdlib/sloppy/node/fs.js +280 -0
- package/stdlib/sloppy/node/http.js +11 -0
- package/stdlib/sloppy/node/https.js +11 -0
- package/stdlib/sloppy/node/module.js +40 -0
- package/stdlib/sloppy/node/os.js +22 -0
- package/stdlib/sloppy/node/path.js +78 -0
- package/stdlib/sloppy/node/perf_hooks.js +12 -0
- package/stdlib/sloppy/node/process.js +129 -0
- package/stdlib/sloppy/node/querystring.js +21 -0
- package/stdlib/sloppy/node/stream/promises.js +3 -0
- package/stdlib/sloppy/node/stream.js +132 -0
- package/stdlib/sloppy/node/string_decoder.js +23 -0
- package/stdlib/sloppy/node/timers.js +26 -0
- package/stdlib/sloppy/node/tty.js +18 -0
- package/stdlib/sloppy/node/url.js +17 -0
- package/stdlib/sloppy/node/util.js +95 -0
- package/stdlib/sloppy/node/zlib.js +72 -0
- package/stdlib/sloppy/orm.js +2188 -0
- package/stdlib/sloppy/os.js +580 -0
- package/stdlib/sloppy/problem-details.js +29 -0
- package/stdlib/sloppy/providers/sqlite.js +26 -0
- package/stdlib/sloppy/rate-limit.js +856 -0
- package/stdlib/sloppy/realtime.js +1508 -0
- package/stdlib/sloppy/redis.js +1272 -0
- package/stdlib/sloppy/request-id.js +184 -0
- package/stdlib/sloppy/request-logging.js +101 -0
- package/stdlib/sloppy/results.js +933 -0
- package/stdlib/sloppy/schema.js +546 -0
- package/stdlib/sloppy/testing.js +4081 -0
- package/stdlib/sloppy/testservices.js +1041 -0
- package/stdlib/sloppy/time.js +894 -0
- package/stdlib/sloppy/webhooks.js +1330 -0
- package/stdlib/sloppy/workers.js +986 -0
- package/templates/api/README.md +82 -0
- package/templates/api/appsettings.Development.json +14 -0
- package/templates/api/appsettings.json +13 -0
- package/templates/api/data/.gitkeep +1 -0
- package/templates/api/gitignore +4 -0
- package/templates/api/migrations/0001_create_users.sql +1 -0
- package/templates/api/package.json +16 -0
- package/templates/api/public/hello.txt +1 -0
- package/templates/api/sloppy.json +14 -0
- package/templates/api/src/config.ts +1 -0
- package/templates/api/src/db/migrate.ts +14 -0
- package/templates/api/src/db/schema.ts +4 -0
- package/templates/api/src/db/usersRepository.ts +23 -0
- package/templates/api/src/main.ts +18 -0
- package/templates/api/src/models/user.ts +7 -0
- package/templates/api/src/routes/health.ts +20 -0
- package/templates/api/src/routes/users.ts +40 -0
- package/templates/api/src/services/usersService.ts +21 -0
- package/templates/api/tsconfig.json +15 -0
- package/templates/cli/README.md +16 -0
- package/templates/cli/gitignore +2 -0
- package/templates/cli/package.json +13 -0
- package/templates/cli/sloppy.json +6 -0
- package/templates/cli/src/commands/echo.ts +9 -0
- package/templates/cli/src/commands/inspect.ts +20 -0
- package/templates/cli/src/main.ts +50 -0
- package/templates/cli/tsconfig.json +15 -0
- package/templates/minimal-api/README.md +14 -0
- package/templates/minimal-api/gitignore +3 -0
- package/templates/minimal-api/package.json +14 -0
- package/templates/minimal-api/sloppy.json +5 -0
- package/templates/minimal-api/src/main.ts +9 -0
- package/templates/minimal-api/tsconfig.json +15 -0
- package/templates/node-compat/README.md +40 -0
- package/templates/node-compat/gitignore +2 -0
- package/templates/node-compat/package.json +11 -0
- package/templates/node-compat/sloppy.json +6 -0
- package/templates/node-compat/src/main.ts +40 -0
- package/templates/package-api/README.md +44 -0
- package/templates/package-api/fixtures/validator-lite/index.js +7 -0
- package/templates/package-api/fixtures/validator-lite/package.json +6 -0
- package/templates/package-api/gitignore +3 -0
- package/templates/package-api/package.json +17 -0
- package/templates/package-api/sloppy.json +5 -0
- package/templates/package-api/src/main.ts +10 -0
- package/templates/package-api/src/routes/health.ts +5 -0
- package/templates/package-api/src/routes/users.ts +12 -0
- package/templates/package-api/tsconfig.json +15 -0
- package/templates/program/README.md +12 -0
- package/templates/program/gitignore +1 -0
- package/templates/program/package.json +10 -0
- package/templates/program/sloppy.json +6 -0
- 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,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,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,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
|
+
}
|