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