@zyno-io/dk-server-foundation 26.216.430
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 +21 -0
- package/README.md +458 -0
- package/dist/devconsole/assets/index-CKF3C3kv.css +1 -0
- package/dist/devconsole/assets/index-CsHdomhM.js +27 -0
- package/dist/devconsole/index.html +13 -0
- package/dist/resources/proto/generated/devconsole/devconsole.d.ts +320 -0
- package/dist/resources/proto/generated/devconsole/devconsole.d.ts.map +1 -0
- package/dist/resources/proto/generated/devconsole/devconsole.js +3751 -0
- package/dist/resources/proto/generated/devconsole/devconsole.js.map +1 -0
- package/dist/src/app/base.d.ts +36 -0
- package/dist/src/app/base.d.ts.map +1 -0
- package/dist/src/app/base.js +240 -0
- package/dist/src/app/base.js.map +1 -0
- package/dist/src/app/config.d.ts +90 -0
- package/dist/src/app/config.d.ts.map +1 -0
- package/dist/src/app/config.js +33 -0
- package/dist/src/app/config.js.map +1 -0
- package/dist/src/app/config.loader.d.ts +14 -0
- package/dist/src/app/config.loader.d.ts.map +1 -0
- package/dist/src/app/config.loader.js +67 -0
- package/dist/src/app/config.loader.js.map +1 -0
- package/dist/src/app/const.d.ts +3 -0
- package/dist/src/app/const.d.ts.map +1 -0
- package/dist/src/app/const.js +6 -0
- package/dist/src/app/const.js.map +1 -0
- package/dist/src/app/dev.d.ts +7 -0
- package/dist/src/app/dev.d.ts.map +1 -0
- package/dist/src/app/dev.js +105 -0
- package/dist/src/app/dev.js.map +1 -0
- package/dist/src/app/index.d.ts +7 -0
- package/dist/src/app/index.d.ts.map +1 -0
- package/dist/src/app/index.js +12 -0
- package/dist/src/app/index.js.map +1 -0
- package/dist/src/app/openapi.d.ts +4 -0
- package/dist/src/app/openapi.d.ts.map +1 -0
- package/dist/src/app/openapi.js +6 -0
- package/dist/src/app/openapi.js.map +1 -0
- package/dist/src/app/resolver.d.ts +11 -0
- package/dist/src/app/resolver.d.ts.map +1 -0
- package/dist/src/app/resolver.js +60 -0
- package/dist/src/app/resolver.js.map +1 -0
- package/dist/src/app/shutdown.d.ts +12 -0
- package/dist/src/app/shutdown.d.ts.map +1 -0
- package/dist/src/app/shutdown.js +63 -0
- package/dist/src/app/shutdown.js.map +1 -0
- package/dist/src/app/state.d.ts +16 -0
- package/dist/src/app/state.d.ts.map +1 -0
- package/dist/src/app/state.js +12 -0
- package/dist/src/app/state.js.map +1 -0
- package/dist/src/auth/index.d.ts +3 -0
- package/dist/src/auth/index.d.ts.map +1 -0
- package/dist/src/auth/index.js +6 -0
- package/dist/src/auth/index.js.map +1 -0
- package/dist/src/auth/jwt.d.ts +76 -0
- package/dist/src/auth/jwt.d.ts.map +1 -0
- package/dist/src/auth/jwt.js +218 -0
- package/dist/src/auth/jwt.js.map +1 -0
- package/dist/src/auth/provider.d.ts +15 -0
- package/dist/src/auth/provider.d.ts.map +1 -0
- package/dist/src/auth/provider.js +50 -0
- package/dist/src/auth/provider.js.map +1 -0
- package/dist/src/cli/dksf-dev.d.ts +3 -0
- package/dist/src/cli/dksf-dev.d.ts.map +1 -0
- package/dist/src/cli/dksf-dev.js +408 -0
- package/dist/src/cli/dksf-dev.js.map +1 -0
- package/dist/src/cli/dksf-gen-proto.d.ts +3 -0
- package/dist/src/cli/dksf-gen-proto.d.ts.map +1 -0
- package/dist/src/cli/dksf-gen-proto.js +164 -0
- package/dist/src/cli/dksf-gen-proto.js.map +1 -0
- package/dist/src/cli/dksf-install.d.ts +3 -0
- package/dist/src/cli/dksf-install.d.ts.map +1 -0
- package/dist/src/cli/dksf-install.js +10 -0
- package/dist/src/cli/dksf-install.js.map +1 -0
- package/dist/src/cli/dksf-test.d.ts +3 -0
- package/dist/src/cli/dksf-test.d.ts.map +1 -0
- package/dist/src/cli/dksf-test.js +78 -0
- package/dist/src/cli/dksf-test.js.map +1 -0
- package/dist/src/cli/dksf-update.d.ts +3 -0
- package/dist/src/cli/dksf-update.d.ts.map +1 -0
- package/dist/src/cli/dksf-update.js +86 -0
- package/dist/src/cli/dksf-update.js.map +1 -0
- package/dist/src/database/common.d.ts +84 -0
- package/dist/src/database/common.d.ts.map +1 -0
- package/dist/src/database/common.js +380 -0
- package/dist/src/database/common.js.map +1 -0
- package/dist/src/database/dialect.d.ts +10 -0
- package/dist/src/database/dialect.d.ts.map +1 -0
- package/dist/src/database/dialect.js +56 -0
- package/dist/src/database/dialect.js.map +1 -0
- package/dist/src/database/entity.d.ts +62 -0
- package/dist/src/database/entity.d.ts.map +1 -0
- package/dist/src/database/entity.js +198 -0
- package/dist/src/database/entity.js.map +1 -0
- package/dist/src/database/index.d.ts +8 -0
- package/dist/src/database/index.d.ts.map +1 -0
- package/dist/src/database/index.js +15 -0
- package/dist/src/database/index.js.map +1 -0
- package/dist/src/database/migration/MigrationResetCommand.d.ts +9 -0
- package/dist/src/database/migration/MigrationResetCommand.d.ts.map +1 -0
- package/dist/src/database/migration/MigrationResetCommand.js +75 -0
- package/dist/src/database/migration/MigrationResetCommand.js.map +1 -0
- package/dist/src/database/migration/MigrationRunCommand.d.ts +11 -0
- package/dist/src/database/migration/MigrationRunCommand.d.ts.map +1 -0
- package/dist/src/database/migration/MigrationRunCommand.js +118 -0
- package/dist/src/database/migration/MigrationRunCommand.js.map +1 -0
- package/dist/src/database/migration/characters.d.ts +14 -0
- package/dist/src/database/migration/characters.d.ts.map +1 -0
- package/dist/src/database/migration/characters.js +56 -0
- package/dist/src/database/migration/characters.js.map +1 -0
- package/dist/src/database/migration/create/MigrationCreateCommand.d.ts +11 -0
- package/dist/src/database/migration/create/MigrationCreateCommand.d.ts.map +1 -0
- package/dist/src/database/migration/create/MigrationCreateCommand.js +106 -0
- package/dist/src/database/migration/create/MigrationCreateCommand.js.map +1 -0
- package/dist/src/database/migration/create/comparator.d.ts +3 -0
- package/dist/src/database/migration/create/comparator.d.ts.map +1 -0
- package/dist/src/database/migration/create/comparator.js +408 -0
- package/dist/src/database/migration/create/comparator.js.map +1 -0
- package/dist/src/database/migration/create/db-reader.d.ts +5 -0
- package/dist/src/database/migration/create/db-reader.d.ts.map +1 -0
- package/dist/src/database/migration/create/db-reader.js +473 -0
- package/dist/src/database/migration/create/db-reader.js.map +1 -0
- package/dist/src/database/migration/create/ddl-generator.d.ts +3 -0
- package/dist/src/database/migration/create/ddl-generator.d.ts.map +1 -0
- package/dist/src/database/migration/create/ddl-generator.js +725 -0
- package/dist/src/database/migration/create/ddl-generator.js.map +1 -0
- package/dist/src/database/migration/create/entity-reader.d.ts +4 -0
- package/dist/src/database/migration/create/entity-reader.d.ts.map +1 -0
- package/dist/src/database/migration/create/entity-reader.js +417 -0
- package/dist/src/database/migration/create/entity-reader.js.map +1 -0
- package/dist/src/database/migration/create/file-generator.d.ts +3 -0
- package/dist/src/database/migration/create/file-generator.d.ts.map +1 -0
- package/dist/src/database/migration/create/file-generator.js +62 -0
- package/dist/src/database/migration/create/file-generator.js.map +1 -0
- package/dist/src/database/migration/create/prompt.d.ts +4 -0
- package/dist/src/database/migration/create/prompt.d.ts.map +1 -0
- package/dist/src/database/migration/create/prompt.js +55 -0
- package/dist/src/database/migration/create/prompt.js.map +1 -0
- package/dist/src/database/migration/create/schema-model.d.ts +109 -0
- package/dist/src/database/migration/create/schema-model.d.ts.map +1 -0
- package/dist/src/database/migration/create/schema-model.js +24 -0
- package/dist/src/database/migration/create/schema-model.js.map +1 -0
- package/dist/src/database/migration/helpers.d.ts +3 -0
- package/dist/src/database/migration/helpers.d.ts.map +1 -0
- package/dist/src/database/migration/helpers.js +13 -0
- package/dist/src/database/migration/helpers.js.map +1 -0
- package/dist/src/database/migration/index.d.ts +9 -0
- package/dist/src/database/migration/index.d.ts.map +1 -0
- package/dist/src/database/migration/index.js +43 -0
- package/dist/src/database/migration/index.js.map +1 -0
- package/dist/src/database/migration/migration.entity.d.ts +8 -0
- package/dist/src/database/migration/migration.entity.d.ts.map +1 -0
- package/dist/src/database/migration/migration.entity.js +16 -0
- package/dist/src/database/migration/migration.entity.js.map +1 -0
- package/dist/src/database/mysql.d.ts +16 -0
- package/dist/src/database/mysql.d.ts.map +1 -0
- package/dist/src/database/mysql.js +140 -0
- package/dist/src/database/mysql.js.map +1 -0
- package/dist/src/database/postgres.d.ts +16 -0
- package/dist/src/database/postgres.d.ts.map +1 -0
- package/dist/src/database/postgres.js +91 -0
- package/dist/src/database/postgres.js.map +1 -0
- package/dist/src/database/types.d.ts +21 -0
- package/dist/src/database/types.d.ts.map +1 -0
- package/dist/src/database/types.js +27 -0
- package/dist/src/database/types.js.map +1 -0
- package/dist/src/devconsole/devconsole.controller.d.ts +7 -0
- package/dist/src/devconsole/devconsole.controller.d.ts.map +1 -0
- package/dist/src/devconsole/devconsole.controller.js +82 -0
- package/dist/src/devconsole/devconsole.controller.js.map +1 -0
- package/dist/src/devconsole/devconsole.middleware.d.ts +12 -0
- package/dist/src/devconsole/devconsole.middleware.d.ts.map +1 -0
- package/dist/src/devconsole/devconsole.middleware.js +28 -0
- package/dist/src/devconsole/devconsole.middleware.js.map +1 -0
- package/dist/src/devconsole/devconsole.srpc.d.ts +14 -0
- package/dist/src/devconsole/devconsole.srpc.d.ts.map +1 -0
- package/dist/src/devconsole/devconsole.srpc.js +94 -0
- package/dist/src/devconsole/devconsole.srpc.js.map +1 -0
- package/dist/src/devconsole/devconsole.store.d.ts +101 -0
- package/dist/src/devconsole/devconsole.store.d.ts.map +1 -0
- package/dist/src/devconsole/devconsole.store.js +125 -0
- package/dist/src/devconsole/devconsole.store.js.map +1 -0
- package/dist/src/devconsole/devconsole.ws.d.ts +18 -0
- package/dist/src/devconsole/devconsole.ws.d.ts.map +1 -0
- package/dist/src/devconsole/devconsole.ws.js +470 -0
- package/dist/src/devconsole/devconsole.ws.js.map +1 -0
- package/dist/src/devconsole/index.d.ts +2 -0
- package/dist/src/devconsole/index.d.ts.map +1 -0
- package/dist/src/devconsole/index.js +6 -0
- package/dist/src/devconsole/index.js.map +1 -0
- package/dist/src/devconsole/patches.d.ts +6 -0
- package/dist/src/devconsole/patches.d.ts.map +1 -0
- package/dist/src/devconsole/patches.js +397 -0
- package/dist/src/devconsole/patches.js.map +1 -0
- package/dist/src/health/health.module.d.ts +6 -0
- package/dist/src/health/health.module.d.ts.map +1 -0
- package/dist/src/health/health.module.js +32 -0
- package/dist/src/health/health.module.js.map +1 -0
- package/dist/src/health/healthcheck.controller.d.ts +10 -0
- package/dist/src/health/healthcheck.controller.d.ts.map +1 -0
- package/dist/src/health/healthcheck.controller.js +30 -0
- package/dist/src/health/healthcheck.controller.js.map +1 -0
- package/dist/src/health/healthcheck.service.d.ts +13 -0
- package/dist/src/health/healthcheck.service.d.ts.map +1 -0
- package/dist/src/health/healthcheck.service.js +33 -0
- package/dist/src/health/healthcheck.service.js.map +1 -0
- package/dist/src/health/index.d.ts +3 -0
- package/dist/src/health/index.d.ts.map +1 -0
- package/dist/src/health/index.js +6 -0
- package/dist/src/health/index.js.map +1 -0
- package/dist/src/helpers/async/context.d.ts +11 -0
- package/dist/src/helpers/async/context.d.ts.map +1 -0
- package/dist/src/helpers/async/context.js +75 -0
- package/dist/src/helpers/async/context.js.map +1 -0
- package/dist/src/helpers/async/process.d.ts +16 -0
- package/dist/src/helpers/async/process.d.ts.map +1 -0
- package/dist/src/helpers/async/process.js +44 -0
- package/dist/src/helpers/async/process.js.map +1 -0
- package/dist/src/helpers/async/promise.d.ts +5 -0
- package/dist/src/helpers/async/promise.d.ts.map +1 -0
- package/dist/src/helpers/async/promise.js +27 -0
- package/dist/src/helpers/async/promise.js.map +1 -0
- package/dist/src/helpers/data/array.d.ts +3 -0
- package/dist/src/helpers/data/array.d.ts.map +1 -0
- package/dist/src/helpers/data/array.js +17 -0
- package/dist/src/helpers/data/array.js.map +1 -0
- package/dist/src/helpers/data/objects.d.ts +12 -0
- package/dist/src/helpers/data/objects.d.ts.map +1 -0
- package/dist/src/helpers/data/objects.js +75 -0
- package/dist/src/helpers/data/objects.js.map +1 -0
- package/dist/src/helpers/data/serialization.d.ts +4 -0
- package/dist/src/helpers/data/serialization.d.ts.map +1 -0
- package/dist/src/helpers/data/serialization.js +15 -0
- package/dist/src/helpers/data/serialization.js.map +1 -0
- package/dist/src/helpers/data/transformer.d.ts +13 -0
- package/dist/src/helpers/data/transformer.d.ts.map +1 -0
- package/dist/src/helpers/data/transformer.js +55 -0
- package/dist/src/helpers/data/transformer.js.map +1 -0
- package/dist/src/helpers/framework/decorators.d.ts +5 -0
- package/dist/src/helpers/framework/decorators.d.ts.map +1 -0
- package/dist/src/helpers/framework/decorators.js +39 -0
- package/dist/src/helpers/framework/decorators.js.map +1 -0
- package/dist/src/helpers/framework/event.d.ts +3 -0
- package/dist/src/helpers/framework/event.d.ts.map +1 -0
- package/dist/src/helpers/framework/event.js +20 -0
- package/dist/src/helpers/framework/event.js.map +1 -0
- package/dist/src/helpers/framework/injection.d.ts +7 -0
- package/dist/src/helpers/framework/injection.d.ts.map +1 -0
- package/dist/src/helpers/framework/injection.js +52 -0
- package/dist/src/helpers/framework/injection.js.map +1 -0
- package/dist/src/helpers/index.d.ts +22 -0
- package/dist/src/helpers/index.d.ts.map +1 -0
- package/dist/src/helpers/index.js +32 -0
- package/dist/src/helpers/index.js.map +1 -0
- package/dist/src/helpers/io/package.d.ts +5 -0
- package/dist/src/helpers/io/package.d.ts.map +1 -0
- package/dist/src/helpers/io/package.js +31 -0
- package/dist/src/helpers/io/package.js.map +1 -0
- package/dist/src/helpers/io/stream.d.ts +18 -0
- package/dist/src/helpers/io/stream.d.ts.map +1 -0
- package/dist/src/helpers/io/stream.js +91 -0
- package/dist/src/helpers/io/stream.js.map +1 -0
- package/dist/src/helpers/redis/broadcast.d.ts +13 -0
- package/dist/src/helpers/redis/broadcast.d.ts.map +1 -0
- package/dist/src/helpers/redis/broadcast.js +100 -0
- package/dist/src/helpers/redis/broadcast.js.map +1 -0
- package/dist/src/helpers/redis/cache.d.ts +7 -0
- package/dist/src/helpers/redis/cache.d.ts.map +1 -0
- package/dist/src/helpers/redis/cache.js +28 -0
- package/dist/src/helpers/redis/cache.js.map +1 -0
- package/dist/src/helpers/redis/mutex.d.ts +24 -0
- package/dist/src/helpers/redis/mutex.d.ts.map +1 -0
- package/dist/src/helpers/redis/mutex.js +240 -0
- package/dist/src/helpers/redis/mutex.js.map +1 -0
- package/dist/src/helpers/redis/redis.d.ts +11 -0
- package/dist/src/helpers/redis/redis.d.ts.map +1 -0
- package/dist/src/helpers/redis/redis.js +59 -0
- package/dist/src/helpers/redis/redis.js.map +1 -0
- package/dist/src/helpers/security/crypto.d.ts +26 -0
- package/dist/src/helpers/security/crypto.d.ts.map +1 -0
- package/dist/src/helpers/security/crypto.js +121 -0
- package/dist/src/helpers/security/crypto.js.map +1 -0
- package/dist/src/helpers/security/validation.d.ts +4 -0
- package/dist/src/helpers/security/validation.d.ts.map +1 -0
- package/dist/src/helpers/security/validation.js +25 -0
- package/dist/src/helpers/security/validation.js.map +1 -0
- package/dist/src/helpers/utils/date.d.ts +4 -0
- package/dist/src/helpers/utils/date.d.ts.map +1 -0
- package/dist/src/helpers/utils/date.js +23 -0
- package/dist/src/helpers/utils/date.js.map +1 -0
- package/dist/src/helpers/utils/error.d.ts +24 -0
- package/dist/src/helpers/utils/error.d.ts.map +1 -0
- package/dist/src/helpers/utils/error.js +168 -0
- package/dist/src/helpers/utils/error.js.map +1 -0
- package/dist/src/helpers/utils/jsx.d.ts +3 -0
- package/dist/src/helpers/utils/jsx.d.ts.map +1 -0
- package/dist/src/helpers/utils/jsx.js +13 -0
- package/dist/src/helpers/utils/jsx.js.map +1 -0
- package/dist/src/helpers/utils/uuid.d.ts +3 -0
- package/dist/src/helpers/utils/uuid.d.ts.map +1 -0
- package/dist/src/helpers/utils/uuid.js +14 -0
- package/dist/src/helpers/utils/uuid.js.map +1 -0
- package/dist/src/http/auth.d.ts +46 -0
- package/dist/src/http/auth.d.ts.map +1 -0
- package/dist/src/http/auth.js +162 -0
- package/dist/src/http/auth.js.map +1 -0
- package/dist/src/http/context.d.ts +5 -0
- package/dist/src/http/context.d.ts.map +1 -0
- package/dist/src/http/context.js +22 -0
- package/dist/src/http/context.js.map +1 -0
- package/dist/src/http/cors.d.ts +36 -0
- package/dist/src/http/cors.d.ts.map +1 -0
- package/dist/src/http/cors.js +171 -0
- package/dist/src/http/cors.js.map +1 -0
- package/dist/src/http/errors.d.ts +3 -0
- package/dist/src/http/errors.d.ts.map +1 -0
- package/dist/src/http/errors.js +10 -0
- package/dist/src/http/errors.js.map +1 -0
- package/dist/src/http/index.d.ts +24 -0
- package/dist/src/http/index.d.ts.map +1 -0
- package/dist/src/http/index.js +25 -0
- package/dist/src/http/index.js.map +1 -0
- package/dist/src/http/kernel.d.ts +17 -0
- package/dist/src/http/kernel.d.ts.map +1 -0
- package/dist/src/http/kernel.js +133 -0
- package/dist/src/http/kernel.js.map +1 -0
- package/dist/src/http/middleware.d.ts +12 -0
- package/dist/src/http/middleware.d.ts.map +1 -0
- package/dist/src/http/middleware.js +61 -0
- package/dist/src/http/middleware.js.map +1 -0
- package/dist/src/http/overrides.d.ts +2 -0
- package/dist/src/http/overrides.d.ts.map +1 -0
- package/dist/src/http/overrides.js +19 -0
- package/dist/src/http/overrides.js.map +1 -0
- package/dist/src/http/store.d.ts +33 -0
- package/dist/src/http/store.d.ts.map +1 -0
- package/dist/src/http/store.js +102 -0
- package/dist/src/http/store.js.map +1 -0
- package/dist/src/http/uploads.d.ts +7 -0
- package/dist/src/http/uploads.d.ts.map +1 -0
- package/dist/src/http/uploads.js +8 -0
- package/dist/src/http/uploads.js.map +1 -0
- package/dist/src/http/workflow.d.ts +18 -0
- package/dist/src/http/workflow.d.ts.map +1 -0
- package/dist/src/http/workflow.js +181 -0
- package/dist/src/http/workflow.js.map +1 -0
- package/dist/src/index.d.ts +13 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +25 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/services/cli/invoke.d.ts +5 -0
- package/dist/src/services/cli/invoke.d.ts.map +1 -0
- package/dist/src/services/cli/invoke.js +45 -0
- package/dist/src/services/cli/invoke.js.map +1 -0
- package/dist/src/services/cli/repl-context.d.ts +13 -0
- package/dist/src/services/cli/repl-context.d.ts.map +1 -0
- package/dist/src/services/cli/repl-context.js +60 -0
- package/dist/src/services/cli/repl-context.js.map +1 -0
- package/dist/src/services/cli/repl.d.ts +5 -0
- package/dist/src/services/cli/repl.d.ts.map +1 -0
- package/dist/src/services/cli/repl.js +32 -0
- package/dist/src/services/cli/repl.js.map +1 -0
- package/dist/src/services/cli.d.ts +12 -0
- package/dist/src/services/cli.d.ts.map +1 -0
- package/dist/src/services/cli.js +76 -0
- package/dist/src/services/cli.js.map +1 -0
- package/dist/src/services/index.d.ts +7 -0
- package/dist/src/services/index.d.ts.map +1 -0
- package/dist/src/services/index.js +10 -0
- package/dist/src/services/index.js.map +1 -0
- package/dist/src/services/leader.d.ts +32 -0
- package/dist/src/services/leader.d.ts.map +1 -0
- package/dist/src/services/leader.js +174 -0
- package/dist/src/services/leader.js.map +1 -0
- package/dist/src/services/logger.d.ts +35 -0
- package/dist/src/services/logger.d.ts.map +1 -0
- package/dist/src/services/logger.js +245 -0
- package/dist/src/services/logger.js.map +1 -0
- package/dist/src/services/mail/index.d.ts +61 -0
- package/dist/src/services/mail/index.d.ts.map +1 -0
- package/dist/src/services/mail/index.js +90 -0
- package/dist/src/services/mail/index.js.map +1 -0
- package/dist/src/services/mail/postmark.d.ts +11 -0
- package/dist/src/services/mail/postmark.d.ts.map +1 -0
- package/dist/src/services/mail/postmark.js +42 -0
- package/dist/src/services/mail/postmark.js.map +1 -0
- package/dist/src/services/mail/smtp.d.ts +11 -0
- package/dist/src/services/mail/smtp.d.ts.map +1 -0
- package/dist/src/services/mail/smtp.js +61 -0
- package/dist/src/services/mail/smtp.js.map +1 -0
- package/dist/src/services/mesh.d.ts +65 -0
- package/dist/src/services/mesh.d.ts.map +1 -0
- package/dist/src/services/mesh.js +422 -0
- package/dist/src/services/mesh.js.map +1 -0
- package/dist/src/services/worker/bootstrap.d.ts +3 -0
- package/dist/src/services/worker/bootstrap.d.ts.map +1 -0
- package/dist/src/services/worker/bootstrap.js +64 -0
- package/dist/src/services/worker/bootstrap.js.map +1 -0
- package/dist/src/services/worker/cli.d.ts +11 -0
- package/dist/src/services/worker/cli.d.ts.map +1 -0
- package/dist/src/services/worker/cli.js +43 -0
- package/dist/src/services/worker/cli.js.map +1 -0
- package/dist/src/services/worker/entity.d.ts +18 -0
- package/dist/src/services/worker/entity.d.ts.map +1 -0
- package/dist/src/services/worker/entity.js +16 -0
- package/dist/src/services/worker/entity.js.map +1 -0
- package/dist/src/services/worker/index.d.ts +9 -0
- package/dist/src/services/worker/index.d.ts.map +1 -0
- package/dist/src/services/worker/index.js +40 -0
- package/dist/src/services/worker/index.js.map +1 -0
- package/dist/src/services/worker/queue.d.ts +8 -0
- package/dist/src/services/worker/queue.d.ts.map +1 -0
- package/dist/src/services/worker/queue.js +32 -0
- package/dist/src/services/worker/queue.js.map +1 -0
- package/dist/src/services/worker/recorder.d.ts +16 -0
- package/dist/src/services/worker/recorder.d.ts.map +1 -0
- package/dist/src/services/worker/recorder.js +168 -0
- package/dist/src/services/worker/recorder.js.map +1 -0
- package/dist/src/services/worker/runner.d.ts +21 -0
- package/dist/src/services/worker/runner.d.ts.map +1 -0
- package/dist/src/services/worker/runner.js +156 -0
- package/dist/src/services/worker/runner.js.map +1 -0
- package/dist/src/services/worker/types.d.ts +26 -0
- package/dist/src/services/worker/types.d.ts.map +1 -0
- package/dist/src/services/worker/types.js +29 -0
- package/dist/src/services/worker/types.js.map +1 -0
- package/dist/src/srpc/SrpcByteStream.d.ts +67 -0
- package/dist/src/srpc/SrpcByteStream.d.ts.map +1 -0
- package/dist/src/srpc/SrpcByteStream.js +319 -0
- package/dist/src/srpc/SrpcByteStream.js.map +1 -0
- package/dist/src/srpc/SrpcClient.d.ts +75 -0
- package/dist/src/srpc/SrpcClient.d.ts.map +1 -0
- package/dist/src/srpc/SrpcClient.js +445 -0
- package/dist/src/srpc/SrpcClient.js.map +1 -0
- package/dist/src/srpc/SrpcServer.d.ts +80 -0
- package/dist/src/srpc/SrpcServer.d.ts.map +1 -0
- package/dist/src/srpc/SrpcServer.js +561 -0
- package/dist/src/srpc/SrpcServer.js.map +1 -0
- package/dist/src/srpc/index.d.ts +7 -0
- package/dist/src/srpc/index.d.ts.map +1 -0
- package/dist/src/srpc/index.js +12 -0
- package/dist/src/srpc/index.js.map +1 -0
- package/dist/src/srpc/types.d.ts +131 -0
- package/dist/src/srpc/types.d.ts.map +1 -0
- package/dist/src/srpc/types.js +65 -0
- package/dist/src/srpc/types.js.map +1 -0
- package/dist/src/telemetry/index.d.ts +2 -0
- package/dist/src/telemetry/index.d.ts.map +1 -0
- package/dist/src/telemetry/index.js +5 -0
- package/dist/src/telemetry/index.js.map +1 -0
- package/dist/src/telemetry/otel/MariaDBInstrumentation.d.ts +22 -0
- package/dist/src/telemetry/otel/MariaDBInstrumentation.d.ts.map +1 -0
- package/dist/src/telemetry/otel/MariaDBInstrumentation.js +248 -0
- package/dist/src/telemetry/otel/MariaDBInstrumentation.js.map +1 -0
- package/dist/src/telemetry/otel/helpers.d.ts +27 -0
- package/dist/src/telemetry/otel/helpers.d.ts.map +1 -0
- package/dist/src/telemetry/otel/helpers.js +126 -0
- package/dist/src/telemetry/otel/helpers.js.map +1 -0
- package/dist/src/telemetry/otel/index.d.ts +14 -0
- package/dist/src/telemetry/otel/index.d.ts.map +1 -0
- package/dist/src/telemetry/otel/index.js +132 -0
- package/dist/src/telemetry/otel/index.js.map +1 -0
- package/dist/src/telemetry/otel/metrics.controller.d.ts +6 -0
- package/dist/src/telemetry/otel/metrics.controller.d.ts.map +1 -0
- package/dist/src/telemetry/otel/metrics.controller.js +63 -0
- package/dist/src/telemetry/otel/metrics.controller.js.map +1 -0
- package/dist/src/telemetry/sentry.d.ts +9 -0
- package/dist/src/telemetry/sentry.d.ts.map +1 -0
- package/dist/src/telemetry/sentry.js +62 -0
- package/dist/src/telemetry/sentry.js.map +1 -0
- package/dist/src/testing/expect.d.ts +25 -0
- package/dist/src/testing/expect.d.ts.map +1 -0
- package/dist/src/testing/expect.js +151 -0
- package/dist/src/testing/expect.js.map +1 -0
- package/dist/src/testing/fixtures.d.ts +19 -0
- package/dist/src/testing/fixtures.d.ts.map +1 -0
- package/dist/src/testing/fixtures.js +69 -0
- package/dist/src/testing/fixtures.js.map +1 -0
- package/dist/src/testing/index.d.ts +260 -0
- package/dist/src/testing/index.d.ts.map +1 -0
- package/dist/src/testing/index.js +345 -0
- package/dist/src/testing/index.js.map +1 -0
- package/dist/src/testing/requests.d.ts +10 -0
- package/dist/src/testing/requests.d.ts.map +1 -0
- package/dist/src/testing/requests.js +56 -0
- package/dist/src/testing/requests.js.map +1 -0
- package/dist/src/testing/sql.d.ts +11 -0
- package/dist/src/testing/sql.d.ts.map +1 -0
- package/dist/src/testing/sql.js +55 -0
- package/dist/src/testing/sql.js.map +1 -0
- package/dist/src/types/index.d.ts +57 -0
- package/dist/src/types/index.d.ts.map +1 -0
- package/dist/src/types/index.js +73 -0
- package/dist/src/types/index.js.map +1 -0
- package/dist/src/types/phone.d.ts +11 -0
- package/dist/src/types/phone.d.ts.map +1 -0
- package/dist/src/types/phone.js +73 -0
- package/dist/src/types/phone.js.map +1 -0
- package/docs/.vitepress/config.mts +79 -0
- package/docs/.yarnrc.yml +1 -0
- package/docs/content/CONTRIBUTING.md +140 -0
- package/docs/content/README-DEV.md +142 -0
- package/docs/content/README.md +39 -0
- package/docs/content/authentication.md +215 -0
- package/docs/content/cli.md +335 -0
- package/docs/content/configuration.md +175 -0
- package/docs/content/database.md +422 -0
- package/docs/content/devconsole.md +123 -0
- package/docs/content/getting-started.md +154 -0
- package/docs/content/guides/test-migration-guide.md +351 -0
- package/docs/content/health.md +54 -0
- package/docs/content/helpers.md +322 -0
- package/docs/content/http.md +253 -0
- package/docs/content/index.md +147 -0
- package/docs/content/leader-service.md +98 -0
- package/docs/content/logging.md +150 -0
- package/docs/content/mail.md +161 -0
- package/docs/content/mesh-service.md +204 -0
- package/docs/content/public/images/devconsole/01-dashboard.png +0 -0
- package/docs/content/public/images/devconsole/02-routes.png +0 -0
- package/docs/content/public/images/devconsole/03-openapi.png +0 -0
- package/docs/content/public/images/devconsole/04-requests.png +0 -0
- package/docs/content/public/images/devconsole/05-srpc.png +0 -0
- package/docs/content/public/images/devconsole/06-database.png +0 -0
- package/docs/content/public/images/devconsole/07-health.png +0 -0
- package/docs/content/public/images/devconsole/08-mutex.png +0 -0
- package/docs/content/public/images/devconsole/09-repl.png +0 -0
- package/docs/content/public/images/devconsole/10-workers.png +0 -0
- package/docs/content/redis.md +168 -0
- package/docs/content/srpc.md +261 -0
- package/docs/content/telemetry.md +166 -0
- package/docs/content/testing.md +222 -0
- package/docs/content/types.md +215 -0
- package/docs/content/worker.md +177 -0
- package/docs/package.json +16 -0
- package/docs/scripts/README-SCREENSHOTS.md +145 -0
- package/docs/scripts/capture-devconsole-screenshots.js +184 -0
- package/docs/yarn.lock +2408 -0
- package/package.json +144 -0
- package/patches/@deepkit+type+1.0.19.patch +38 -0
- package/patches/deepkit-openapi-core+0.0.9.patch +62 -0
- package/src/app/base.ts +253 -0
- package/src/app/config.loader.ts +66 -0
- package/src/app/config.ts +119 -0
- package/src/app/const.ts +4 -0
- package/src/app/dev.ts +92 -0
- package/src/app/index.ts +6 -0
- package/src/app/openapi.ts +3 -0
- package/src/app/resolver.ts +49 -0
- package/src/app/shutdown.ts +55 -0
- package/src/app/state.ts +19 -0
- package/src/auth/index.ts +2 -0
- package/src/auth/jwt.ts +275 -0
- package/src/auth/provider.ts +57 -0
- package/src/cli/dksf-dev.ts +416 -0
- package/src/cli/dksf-gen-proto.ts +176 -0
- package/src/cli/dksf-install.ts +11 -0
- package/src/cli/dksf-test.ts +84 -0
- package/src/cli/dksf-update.ts +101 -0
- package/src/database/common.ts +385 -0
- package/src/database/dialect.ts +43 -0
- package/src/database/entity.ts +285 -0
- package/src/database/index.ts +7 -0
- package/src/database/migration/MigrationResetCommand.ts +72 -0
- package/src/database/migration/MigrationRunCommand.ts +118 -0
- package/src/database/migration/characters.ts +53 -0
- package/src/database/migration/create/MigrationCreateCommand.ts +96 -0
- package/src/database/migration/create/comparator.ts +467 -0
- package/src/database/migration/create/db-reader.ts +510 -0
- package/src/database/migration/create/ddl-generator.ts +755 -0
- package/src/database/migration/create/entity-reader.ts +471 -0
- package/src/database/migration/create/file-generator.ts +57 -0
- package/src/database/migration/create/prompt.ts +49 -0
- package/src/database/migration/create/schema-model.ts +102 -0
- package/src/database/migration/helpers.ts +7 -0
- package/src/database/migration/index.ts +35 -0
- package/src/database/migration/migration.entity.ts +10 -0
- package/src/database/mysql.ts +140 -0
- package/src/database/postgres.ts +97 -0
- package/src/database/types.ts +18 -0
- package/src/devconsole/devconsole.controller.ts +59 -0
- package/src/devconsole/devconsole.middleware.ts +23 -0
- package/src/devconsole/devconsole.srpc.ts +94 -0
- package/src/devconsole/devconsole.store.ts +190 -0
- package/src/devconsole/devconsole.ws.ts +491 -0
- package/src/devconsole/index.ts +1 -0
- package/src/devconsole/patches.ts +428 -0
- package/src/health/health.module.ts +30 -0
- package/src/health/healthcheck.controller.ts +17 -0
- package/src/health/healthcheck.service.ts +28 -0
- package/src/health/index.ts +2 -0
- package/src/helpers/async/context.ts +67 -0
- package/src/helpers/async/process.ts +49 -0
- package/src/helpers/async/promise.ts +16 -0
- package/src/helpers/data/array.ts +11 -0
- package/src/helpers/data/objects.ts +64 -0
- package/src/helpers/data/serialization.ts +11 -0
- package/src/helpers/data/transformer.ts +54 -0
- package/src/helpers/framework/decorators.ts +27 -0
- package/src/helpers/framework/event.ts +11 -0
- package/src/helpers/framework/injection.ts +47 -0
- package/src/helpers/index.ts +34 -0
- package/src/helpers/io/package.ts +26 -0
- package/src/helpers/io/stream.ts +79 -0
- package/src/helpers/redis/broadcast.ts +96 -0
- package/src/helpers/redis/cache.ts +28 -0
- package/src/helpers/redis/mutex.ts +260 -0
- package/src/helpers/redis/redis.ts +60 -0
- package/src/helpers/security/crypto.ts +133 -0
- package/src/helpers/security/validation.ts +16 -0
- package/src/helpers/utils/date.ts +13 -0
- package/src/helpers/utils/error.ts +155 -0
- package/src/helpers/utils/jsx.ts +8 -0
- package/src/helpers/utils/uuid.ts +8 -0
- package/src/http/auth.ts +156 -0
- package/src/http/context.ts +15 -0
- package/src/http/cors.ts +159 -0
- package/src/http/errors.ts +9 -0
- package/src/http/index.ts +19 -0
- package/src/http/kernel.ts +138 -0
- package/src/http/middleware.ts +59 -0
- package/src/http/overrides.ts +20 -0
- package/src/http/store.ts +86 -0
- package/src/http/uploads.ts +6 -0
- package/src/http/workflow.ts +167 -0
- package/src/index.ts +19 -0
- package/src/services/cli/invoke.ts +39 -0
- package/src/services/cli/repl-context.ts +63 -0
- package/src/services/cli/repl.ts +22 -0
- package/src/services/cli.ts +74 -0
- package/src/services/index.ts +6 -0
- package/src/services/leader.ts +201 -0
- package/src/services/logger.ts +258 -0
- package/src/services/mail/index.ts +117 -0
- package/src/services/mail/postmark.ts +37 -0
- package/src/services/mail/smtp.ts +46 -0
- package/src/services/mesh.ts +508 -0
- package/src/services/worker/bootstrap.ts +53 -0
- package/src/services/worker/cli.ts +32 -0
- package/src/services/worker/entity.ts +22 -0
- package/src/services/worker/index.ts +30 -0
- package/src/services/worker/queue.ts +35 -0
- package/src/services/worker/recorder.ts +172 -0
- package/src/services/worker/runner.ts +179 -0
- package/src/services/worker/types.ts +32 -0
- package/src/srpc/SrpcByteStream.ts +382 -0
- package/src/srpc/SrpcClient.ts +512 -0
- package/src/srpc/SrpcServer.ts +681 -0
- package/src/srpc/index.ts +15 -0
- package/src/srpc/types.ts +146 -0
- package/src/telemetry/index.ts +1 -0
- package/src/telemetry/otel/MariaDBInstrumentation.ts +297 -0
- package/src/telemetry/otel/helpers.ts +117 -0
- package/src/telemetry/otel/index.ts +150 -0
- package/src/telemetry/otel/metrics.controller.ts +50 -0
- package/src/telemetry/sentry.ts +58 -0
- package/src/testing/expect.ts +148 -0
- package/src/testing/fixtures.ts +62 -0
- package/src/testing/index.ts +355 -0
- package/src/testing/requests.ts +68 -0
- package/src/testing/sql.ts +50 -0
- package/src/types/index.ts +64 -0
- package/src/types/phone.ts +64 -0
- package/types.d.ts +20 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2026 Signal24 LLC dba Zyno Consulting
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,458 @@
|
|
|
1
|
+
# @zyno-io/dk-server-foundation
|
|
2
|
+
|
|
3
|
+
A TypeScript foundation library built on top of the [Deepkit framework](https://deepkit.io) for building server applications. Provides opinionated abstractions and utilities for database management, HTTP handling, authentication, background jobs, RPC, distributed systems, and observability.
|
|
4
|
+
|
|
5
|
+
📚 **[Documentation Site](https://zyno-io.github.io/dk-server-foundation/)** | 🚀 **[Getting Started](./docs/getting-started.md)**
|
|
6
|
+
|
|
7
|
+
## Install
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npm install @zyno-io/dk-server-foundation
|
|
11
|
+
# or
|
|
12
|
+
yarn add @zyno-io/dk-server-foundation
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
The postinstall script runs `deepkit-type-install` and `patch-package` automatically.
|
|
16
|
+
|
|
17
|
+
> **Requirement:** TypeScript with `experimentalDecorators: true` and Deepkit's `"reflection": true` in tsconfig.json.
|
|
18
|
+
|
|
19
|
+
## Quick Start
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
import { createApp, BaseAppConfig, createMySQLDatabase } from '@zyno-io/dk-server-foundation';
|
|
23
|
+
|
|
24
|
+
class AppConfig extends BaseAppConfig {
|
|
25
|
+
MY_SETTING!: string;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
class MyDB extends createMySQLDatabase({}, [UserEntity]) {}
|
|
29
|
+
|
|
30
|
+
const app = createApp({
|
|
31
|
+
config: AppConfig,
|
|
32
|
+
db: MyDB,
|
|
33
|
+
cors: config => ({ hosts: ['https://example.com'], credentials: true }),
|
|
34
|
+
controllers: [UserController],
|
|
35
|
+
providers: [UserService]
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
app.run();
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
This gives you an HTTP server on port 3000 with health checks, CORS, database, logging, and OpenAPI docs (in development).
|
|
42
|
+
|
|
43
|
+
## Modules
|
|
44
|
+
|
|
45
|
+
| Module | Description | Docs |
|
|
46
|
+
| --------------------------------------- | ---------------------------------------------------------- | -------------------------------------------- |
|
|
47
|
+
| [Application](#application) | App factory, config, DI resolution | [Getting Started](./docs/getting-started.md) |
|
|
48
|
+
| [Graceful Shutdown](#graceful-shutdown) | Pre-shutdown event for async cleanup | |
|
|
49
|
+
| [Configuration](#configuration) | Environment-based config with secrets support | [Configuration](./docs/configuration.md) |
|
|
50
|
+
| [Database](#database) | MySQL/MariaDB ORM with transactions, hooks, and migrations | [Database](./docs/database.md) |
|
|
51
|
+
| [HTTP](#http) | Custom HTTP kernel, middleware, uploads, CORS | [HTTP](./docs/http.md) |
|
|
52
|
+
| [Authentication](#authentication) | JWT and Basic Auth with entity resolution | [Authentication](./docs/authentication.md) |
|
|
53
|
+
| [Workers](#workers) | BullMQ background job processing | [Workers](./docs/worker.md) |
|
|
54
|
+
| [SRPC](#srpc) | Bidirectional WebSocket RPC with binary streams | [SRPC](./docs/srpc.md) |
|
|
55
|
+
| [Leader Election](#leader-election) | Redis-based distributed leader election | [Leader Service](./docs/leader-service.md) |
|
|
56
|
+
| [Mesh Networking](#mesh-networking) | Typed RPC between distributed instances | [Mesh Service](./docs/mesh-service.md) |
|
|
57
|
+
| [Mail](#mail) | Email via Postmark or SMTP with templates | [Mail](./docs/mail.md) |
|
|
58
|
+
| [Telemetry](#telemetry) | OpenTelemetry and Sentry integration | [Telemetry](./docs/telemetry.md) |
|
|
59
|
+
| [Health Checks](#health-checks) | Liveness endpoint with pluggable checks | [Health](./docs/health.md) |
|
|
60
|
+
| [Helpers](#helpers) | Async context, Redis cache/mutex, crypto, and more | [Helpers](./docs/helpers.md) |
|
|
61
|
+
| [Testing](#testing) | Test facades, fixtures, and request mocking | [Testing](./docs/testing.md) |
|
|
62
|
+
| [Types](#types) | Phone numbers, dates, coordinates, and utility types | [Types](./docs/types.md) |
|
|
63
|
+
| [Logging](#logging) | Scoped Pino logger with context tracking | [Logging](./docs/logging.md) |
|
|
64
|
+
| [DevConsole](#devconsole) | Built-in web dashboard for development monitoring | [DevConsole](./docs/devconsole.md) |
|
|
65
|
+
| [CLI Tools](#cli-tools) | REPL, provider invoke, migrations, proto generation | [CLI](./docs/cli.md) |
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Application
|
|
70
|
+
|
|
71
|
+
Applications are created with `createApp()`, which sets up a Deepkit app with opinionated defaults: custom HTTP kernel, health checks, config loading from environment variables, CORS, and optional worker/RPC support.
|
|
72
|
+
|
|
73
|
+
```typescript
|
|
74
|
+
const app = createApp({
|
|
75
|
+
config: MyConfig,
|
|
76
|
+
db: MyDB,
|
|
77
|
+
enableWorker: true,
|
|
78
|
+
cors: config => ({ hosts: [config.CORS_ORIGIN], credentials: true })
|
|
79
|
+
});
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
Services decorated with `@AutoStart()` are instantiated at startup for establishing connections or background processes.
|
|
83
|
+
|
|
84
|
+
Use `resolve()` (or its alias `r()`) to access any provider from the DI container outside of constructor injection:
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
import { r } from '@zyno-io/dk-server-foundation';
|
|
88
|
+
const db = r(MyDatabase);
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## Graceful Shutdown
|
|
92
|
+
|
|
93
|
+
`createApp()` automatically installs a `ShutdownListener` that intercepts SIGTERM/SIGINT and dispatches an `onServerShutdownRequested` event before forwarding to Deepkit's built-in shutdown. This lets you perform async cleanup (drain connections, finish in-flight work) before the framework tears down.
|
|
94
|
+
|
|
95
|
+
```typescript
|
|
96
|
+
import { eventDispatcher } from '@deepkit/event';
|
|
97
|
+
import { onServerShutdownRequested } from '@zyno-io/dk-server-foundation';
|
|
98
|
+
|
|
99
|
+
class MyShutdownHandler {
|
|
100
|
+
@eventDispatcher.listen(onServerShutdownRequested)
|
|
101
|
+
async onShutdownRequested() {
|
|
102
|
+
// Async cleanup here — this handler is awaited before
|
|
103
|
+
// Deepkit's onServerShutdown fires.
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
```
|
|
107
|
+
|
|
108
|
+
Register your handler as a listener in `createApp()`:
|
|
109
|
+
|
|
110
|
+
```typescript
|
|
111
|
+
const app = createApp({
|
|
112
|
+
config: AppConfig,
|
|
113
|
+
listeners: [MyShutdownHandler]
|
|
114
|
+
});
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
## Configuration
|
|
118
|
+
|
|
119
|
+
Extend `BaseAppConfig` to define application settings. All properties are loaded from environment variables via `@zyno-io/config`. Properties ending in `_SECRET` are treated as secrets.
|
|
120
|
+
|
|
121
|
+
```typescript
|
|
122
|
+
class AppConfig extends BaseAppConfig {
|
|
123
|
+
STRIPE_API_KEY_SECRET!: string;
|
|
124
|
+
MAX_UPLOAD_SIZE: number = 10_000_000;
|
|
125
|
+
}
|
|
126
|
+
```
|
|
127
|
+
|
|
128
|
+
See [Configuration](./docs/configuration.md) for the full list of built-in settings.
|
|
129
|
+
|
|
130
|
+
## Database
|
|
131
|
+
|
|
132
|
+
Extends Deepkit's ORM with support for both **MySQL** and **PostgreSQL**: transaction hooks, session locks, raw query helpers, and entity creation utilities.
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
class MyDB extends createMySQLDatabase({}, [User, Post]) {}
|
|
136
|
+
// or
|
|
137
|
+
class MyDB extends createPostgresDatabase({}, [User, Post]) {}
|
|
138
|
+
|
|
139
|
+
// Entity creation
|
|
140
|
+
const user = await createPersistedEntity(User, { email: 'a@b.com', name: 'Alice' }, session);
|
|
141
|
+
|
|
142
|
+
// Transaction with hooks
|
|
143
|
+
await db.transaction(async session => {
|
|
144
|
+
session.addPostCommitHook(async () => {
|
|
145
|
+
await notifyUser(user);
|
|
146
|
+
});
|
|
147
|
+
await session.flush();
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
// Session locks (MySQL: _locks table, PostgreSQL: pg_advisory_xact_lock)
|
|
151
|
+
await db.transaction(async session => {
|
|
152
|
+
await session.acquireSessionLock(['wallet', walletId]);
|
|
153
|
+
// Lock held until commit/rollback
|
|
154
|
+
});
|
|
155
|
+
```
|
|
156
|
+
|
|
157
|
+
### Migrations
|
|
158
|
+
|
|
159
|
+
Generate migrations by diffing entity definitions against the live database:
|
|
160
|
+
|
|
161
|
+
```bash
|
|
162
|
+
# Interactive mode (prompts for column renames)
|
|
163
|
+
ts-node app.ts migration:create
|
|
164
|
+
|
|
165
|
+
# Non-interactive (CI-safe, treats ambiguous changes as drop+add)
|
|
166
|
+
ts-node app.ts migration:create --non-interactive
|
|
167
|
+
|
|
168
|
+
# Run pending migrations
|
|
169
|
+
ts-node app.ts migration:run
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
The `migration:create` command reads entity metadata via Deepkit reflection, introspects the database schema, and generates dialect-appropriate DDL covering: table creation/removal, column additions/removals/modifications/renames, index and foreign key changes, primary key changes, and PostgreSQL enum type management. Migration files use the `createMigration()` format:
|
|
173
|
+
|
|
174
|
+
```typescript
|
|
175
|
+
import { createMigration } from '@zyno-io/dk-server-foundation';
|
|
176
|
+
|
|
177
|
+
export default createMigration(async db => {
|
|
178
|
+
await db.rawExecute(`ALTER TABLE \`users\` ADD COLUMN \`bio\` varchar(500) NULL AFTER \`email\``);
|
|
179
|
+
});
|
|
180
|
+
```
|
|
181
|
+
|
|
182
|
+
## HTTP
|
|
183
|
+
|
|
184
|
+
Custom HTTP kernel with configurable request logging, middleware that preserves HTTP error codes, file uploads, and multi-origin CORS support.
|
|
185
|
+
|
|
186
|
+
```typescript
|
|
187
|
+
// Custom middleware
|
|
188
|
+
class RateLimitMiddleware extends HttpMiddleware {
|
|
189
|
+
async handle(request: HttpRequest, response: HttpResponse) {
|
|
190
|
+
// Rate limiting logic; throw HttpError to reject
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
Response type helpers (`OkResponse`, `RedirectResponse`, `EmptyResponse`, `AnyResponse`) are used as return type annotations on controller methods.
|
|
196
|
+
|
|
197
|
+
## Authentication
|
|
198
|
+
|
|
199
|
+
JWT (HS256/EdDSA) and HTTP Basic Auth with request-scoped caching and entity resolution.
|
|
200
|
+
|
|
201
|
+
```typescript
|
|
202
|
+
// Create auth middleware that validates JWT and checks entity existence
|
|
203
|
+
const authMiddleware = createAuthMiddleware(User);
|
|
204
|
+
|
|
205
|
+
// Use as route middleware
|
|
206
|
+
@http.GET('/me').use(authMiddleware)
|
|
207
|
+
async getMe(/* ... */) {
|
|
208
|
+
// JWT is validated; use getEntityFromRequestJwt to load the entity
|
|
209
|
+
}
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
## Workers
|
|
213
|
+
|
|
214
|
+
BullMQ-based background job processing. Define jobs with `@WorkerJob()` and queue them via `WorkerService`.
|
|
215
|
+
|
|
216
|
+
```typescript
|
|
217
|
+
@WorkerJob()
|
|
218
|
+
class SendEmailJob extends BaseJob<{ to: string; body: string }, void> {
|
|
219
|
+
async handle(data: { to: string; body: string }) {
|
|
220
|
+
await sendEmail(data.to, data.body);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
// Queue a job
|
|
225
|
+
await workerService.queueJob(SendEmailJob, { to: 'user@example.com', body: 'Hello' });
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
Enable with `enableWorker: true` in `createApp()`. Jobs are automatically discovered and registered.
|
|
229
|
+
|
|
230
|
+
## SRPC
|
|
231
|
+
|
|
232
|
+
Bidirectional RPC over WebSocket with HMAC authentication, ts-proto code generation, and multiplexed binary streams.
|
|
233
|
+
|
|
234
|
+
```typescript
|
|
235
|
+
// Server
|
|
236
|
+
const server = new SrpcServer({ logger, clientMessage, serverMessage, wsPath: '/rpc' });
|
|
237
|
+
server.registerMessageHandler('uEcho', async (stream, data) => {
|
|
238
|
+
return { message: data.message };
|
|
239
|
+
});
|
|
240
|
+
|
|
241
|
+
// Client
|
|
242
|
+
const client = new SrpcClient(logger, 'wss://host/rpc', clientMessage, serverMessage, 'client-1');
|
|
243
|
+
const result = client.invoke('uEcho', { message: 'hello' });
|
|
244
|
+
```
|
|
245
|
+
|
|
246
|
+
Generate TypeScript types from `.proto` files:
|
|
247
|
+
|
|
248
|
+
```bash
|
|
249
|
+
dksf-gen-proto input.proto output/
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
## Leader Election
|
|
253
|
+
|
|
254
|
+
Distributed leader election using Redis. Exactly one instance holds leadership at a time, with automatic renewal and failover.
|
|
255
|
+
|
|
256
|
+
```typescript
|
|
257
|
+
const leader = new LeaderService('my-task');
|
|
258
|
+
leader.setBecameLeaderCallback(async () => {
|
|
259
|
+
/* start leader-only work */
|
|
260
|
+
});
|
|
261
|
+
leader.start();
|
|
262
|
+
```
|
|
263
|
+
|
|
264
|
+
See [Leader Service](./docs/leader-service.md) for full API documentation.
|
|
265
|
+
|
|
266
|
+
## Mesh Networking
|
|
267
|
+
|
|
268
|
+
Typed RPC between distributed application instances. Nodes get unique IDs and can invoke handlers on any other node with full type safety.
|
|
269
|
+
|
|
270
|
+
```typescript
|
|
271
|
+
type Messages = {
|
|
272
|
+
getStatus: { request: {}; response: { status: string } };
|
|
273
|
+
};
|
|
274
|
+
|
|
275
|
+
const mesh = new MeshService<Messages>('my-app');
|
|
276
|
+
mesh.registerHandler('getStatus', async () => ({ status: 'ok' }));
|
|
277
|
+
await mesh.start();
|
|
278
|
+
```
|
|
279
|
+
|
|
280
|
+
See [Mesh Service](./docs/mesh-service.md) for full API documentation.
|
|
281
|
+
|
|
282
|
+
## Mail
|
|
283
|
+
|
|
284
|
+
Email sending via Postmark or SMTP with a template system.
|
|
285
|
+
|
|
286
|
+
```typescript
|
|
287
|
+
class WelcomeEmail extends MailTemplate<{ name: string }> {
|
|
288
|
+
subject = 'Welcome!';
|
|
289
|
+
generateHtml() {
|
|
290
|
+
return `<h1>Hello ${this.data.name}</h1>`;
|
|
291
|
+
}
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
await mailService.sendFromTemplate({
|
|
295
|
+
to: { address: 'user@example.com' },
|
|
296
|
+
template: WelcomeEmail,
|
|
297
|
+
data: { name: 'Alice' }
|
|
298
|
+
});
|
|
299
|
+
```
|
|
300
|
+
|
|
301
|
+
## Telemetry
|
|
302
|
+
|
|
303
|
+
OpenTelemetry auto-instrumentation for HTTP, database, Redis, DNS, and BullMQ. Optional Sentry integration.
|
|
304
|
+
|
|
305
|
+
```typescript
|
|
306
|
+
// Call before other imports
|
|
307
|
+
import { init } from '@zyno-io/dk-server-foundation/telemetry/otel';
|
|
308
|
+
init();
|
|
309
|
+
|
|
310
|
+
// Manual spans
|
|
311
|
+
import { withSpan } from '@zyno-io/dk-server-foundation';
|
|
312
|
+
await withSpan('processOrder', async () => {
|
|
313
|
+
// traced operation
|
|
314
|
+
});
|
|
315
|
+
```
|
|
316
|
+
|
|
317
|
+
## Health Checks
|
|
318
|
+
|
|
319
|
+
A `/healthz` endpoint is automatically registered by `createApp()`. Register additional checks via `HealthcheckService.register()`. When a database is configured, a connectivity check is added automatically.
|
|
320
|
+
|
|
321
|
+
```typescript
|
|
322
|
+
class MyService {
|
|
323
|
+
constructor(private hcSvc: HealthcheckService) {
|
|
324
|
+
hcSvc.register(async () => {
|
|
325
|
+
// Throw to indicate unhealthy
|
|
326
|
+
await checkExternalDependency();
|
|
327
|
+
}, 'External API');
|
|
328
|
+
}
|
|
329
|
+
}
|
|
330
|
+
```
|
|
331
|
+
|
|
332
|
+
Use `checkIndividual()` for per-check status results (used by DevConsole's Health view).
|
|
333
|
+
|
|
334
|
+
## Helpers
|
|
335
|
+
|
|
336
|
+
Organized utility functions for common patterns:
|
|
337
|
+
|
|
338
|
+
- **Async**: `AsyncContext`, semaphores, child process execution
|
|
339
|
+
- **Redis**: Cache with TTL, distributed mutex, pub/sub broadcast channels
|
|
340
|
+
- **Crypto**: AES-256-GCM encryption, random string generation
|
|
341
|
+
- **Data**: Array/object manipulation, chainable `Transformer` pipelines
|
|
342
|
+
- **Framework**: Deepkit decorator utilities, event handler inheritance
|
|
343
|
+
|
|
344
|
+
```typescript
|
|
345
|
+
// Distributed mutex
|
|
346
|
+
await withMutex({
|
|
347
|
+
key: 'user:123',
|
|
348
|
+
fn: async () => {
|
|
349
|
+
/* critical section */
|
|
350
|
+
}
|
|
351
|
+
});
|
|
352
|
+
|
|
353
|
+
// Redis cache
|
|
354
|
+
await Cache.setObj('key', data, 3600);
|
|
355
|
+
const data = await Cache.getObj<MyType>('key');
|
|
356
|
+
|
|
357
|
+
// Broadcast
|
|
358
|
+
const channel = createBroadcastChannel<MyEvent>('events');
|
|
359
|
+
channel.subscribe(data => handleEvent(data));
|
|
360
|
+
channel.publish({ type: 'update' });
|
|
361
|
+
```
|
|
362
|
+
|
|
363
|
+
## Testing
|
|
364
|
+
|
|
365
|
+
Test facades with per-test database isolation, entity fixtures, and request mocking.
|
|
366
|
+
|
|
367
|
+
```typescript
|
|
368
|
+
const tf = TestingHelpers.createTestingFacade(app, {
|
|
369
|
+
enableDatabase: true,
|
|
370
|
+
seedData: async facade => {
|
|
371
|
+
await loadEntityFixtures([fixtures.user1, fixtures.user2]);
|
|
372
|
+
}
|
|
373
|
+
});
|
|
374
|
+
|
|
375
|
+
TestingHelpers.installStandardHooks(tf);
|
|
376
|
+
|
|
377
|
+
it('should return user', async () => {
|
|
378
|
+
const res = await makeMockRequest(tf, 'GET', '/api/users/1', {});
|
|
379
|
+
expect(res.statusCode).toBe(200);
|
|
380
|
+
});
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
## Types
|
|
384
|
+
|
|
385
|
+
Custom validated types for common patterns:
|
|
386
|
+
|
|
387
|
+
- `DateString` -- MySQL DATE field (`YYYY-MM-DD`)
|
|
388
|
+
- `PhoneNumber` / `PhoneNumberNANP` -- Validated phone numbers via libphonenumber
|
|
389
|
+
- `Coordinate` -- MySQL POINT geometry
|
|
390
|
+
- `EmailAddress` -- Regex-validated email
|
|
391
|
+
- `TrimmedString` / `NonEmptyTrimmedString` -- Auto-trimmed during deserialization
|
|
392
|
+
- `ValidDate` -- Date that rejects `Invalid Date`
|
|
393
|
+
|
|
394
|
+
## Logging
|
|
395
|
+
|
|
396
|
+
Scoped Pino logger with async context tracking and error reporting.
|
|
397
|
+
|
|
398
|
+
```typescript
|
|
399
|
+
const logger = createLogger(this); // or createLogger('MyService')
|
|
400
|
+
logger.info('Processing order', { orderId: 123 });
|
|
401
|
+
logger.error('Failed to process', err);
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
## CLI Tools
|
|
405
|
+
|
|
406
|
+
| Command | Description |
|
|
407
|
+
| -------------------------------------------- | -------------------------------------------------------- |
|
|
408
|
+
| `dksf-dev <cmd>` | Dev workflow: clean, build, run, migrate, repl, test |
|
|
409
|
+
| `dksf-gen-proto <input> <output>` | Generate TypeScript types from .proto files |
|
|
410
|
+
| `dksf-install` | Postinstall setup (patch-package + deepkit-type-install) |
|
|
411
|
+
| `dksf-update` | Update utility |
|
|
412
|
+
| `repl` | Interactive REPL with access to all providers |
|
|
413
|
+
| `provider:invoke <provider> <method> [args]` | Invoke any provider method from CLI |
|
|
414
|
+
| `worker:start` | Start the job runner (with leader-elected recorder) |
|
|
415
|
+
| `worker:queue <jobName> [data]` | Queue a job by name |
|
|
416
|
+
| `migration:create` | Generate migration from entity/DB schema diff |
|
|
417
|
+
| `migration:run` | Run pending database migrations |
|
|
418
|
+
| `migration:reset` | Reset migrations to a single base migration |
|
|
419
|
+
| `migration:characters [charset] [collation]` | Standardize database character set |
|
|
420
|
+
|
|
421
|
+
## DevConsole
|
|
422
|
+
|
|
423
|
+
A built-in web dashboard for development-time monitoring and debugging, automatically enabled when `APP_ENV !== 'production'`. Access it at `http://localhost:{PORT}/_devconsole/` — no setup required.
|
|
424
|
+
|
|
425
|
+
Features include an HTTP request inspector, SRPC connection monitor, database entity browser with SQL editor, worker job inspector, Redis mutex monitor, health check viewer, environment config display, OpenAPI schema viewer, and a live REPL with access to the DI container.
|
|
426
|
+
|
|
427
|
+
DevConsole is localhost-only and communicates over SRPC/WebSocket for real-time updates. See [DevConsole](./docs/devconsole.md) for details.
|
|
428
|
+
|
|
429
|
+
A demo app showcasing all features is included:
|
|
430
|
+
|
|
431
|
+
```bash
|
|
432
|
+
yarn demoapp
|
|
433
|
+
# then open http://localhost:3000/_devconsole/
|
|
434
|
+
```
|
|
435
|
+
|
|
436
|
+
## Important Notes
|
|
437
|
+
|
|
438
|
+
- **Timezone**: The server enforces UTC. The entry point throws if `TZ !== UTC`.
|
|
439
|
+
- **Identity Maps**: Disabled by default in database sessions for predictable behavior.
|
|
440
|
+
- **Development Mode**: When `APP_ENV !== 'production'`, DevConsole is enabled at `/_devconsole/`, connection pools are smaller, and the worker runner auto-starts.
|
|
441
|
+
|
|
442
|
+
## Commands
|
|
443
|
+
|
|
444
|
+
```bash
|
|
445
|
+
yarn build # Clean build
|
|
446
|
+
yarn build:dirty # Quick rebuild
|
|
447
|
+
yarn dev # Watch mode
|
|
448
|
+
yarn test # Run all tests
|
|
449
|
+
yarn format # Lint with oxlint + format with Prettier
|
|
450
|
+
```
|
|
451
|
+
|
|
452
|
+
## Versioning
|
|
453
|
+
|
|
454
|
+
This library uses **calendar versioning** in the format `YY.MMDD.HHmm` (e.g. `25.0214.1830`). Versions are generated automatically from the CI pipeline timestamp. There are no stability guarantees between releases — pin to a specific version if you need predictability.
|
|
455
|
+
|
|
456
|
+
## License
|
|
457
|
+
|
|
458
|
+
MIT. See [LICENSE](./LICENSE) for details.
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
.sidebar[data-v-d720e473]{width:200px;background:#161b22;border-right:1px solid #21262d;min-height:100vh;flex-shrink:0;display:flex;flex-direction:column}.sidebar-header[data-v-d720e473]{padding:16px;border-bottom:1px solid #21262d;display:flex;align-items:center;gap:8px}.logo[data-v-d720e473]{font-weight:700;font-size:16px;color:#f0f6fc}.conn-dot[data-v-d720e473]{width:8px;height:8px;border-radius:50%;flex-shrink:0}.conn-on[data-v-d720e473]{background:#3fb950;box-shadow:0 0 4px #3fb95088}.conn-off[data-v-d720e473]{background:#f85149;box-shadow:0 0 4px #f8514988}.nav-list[data-v-d720e473]{list-style:none;padding:8px;flex:1}.nav-list li a[data-v-d720e473]{display:block;padding:8px 12px;border-radius:6px;color:#8b949e;text-decoration:none;font-size:14px}.nav-list li a[data-v-d720e473]:hover{color:#e1e4e8;background:#21262d;text-decoration:none}.nav-list li a.active[data-v-d720e473]{color:#f0f6fc;background:#1f6feb33}.sidebar-status[data-v-d720e473]{padding:12px;border-top:1px solid #21262d;font-size:12px}.status-row[data-v-d720e473]{display:flex;justify-content:space-between;padding:2px 0}.status-label[data-v-d720e473]{color:#484f58}.status-value[data-v-d720e473]{color:#8b949e}*{margin:0;padding:0;box-sizing:border-box}body{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif;background:#0f1117;color:#e1e4e8;font-size:14px}.app{display:flex;min-height:100vh}.main{flex:1;overflow-x:auto}.view-padding{padding:24px}a{color:#58a6ff;text-decoration:none}a:hover{text-decoration:underline}table{width:100%;border-collapse:collapse}th,td{text-align:left;padding:8px 12px;border-bottom:1px solid #21262d}th{color:#8b949e;font-weight:600;font-size:12px;text-transform:uppercase;letter-spacing:.5px}tr:hover{background:#161b22}pre{background:#161b22;border:1px solid #21262d;border-radius:6px;padding:12px;overflow-x:auto;font-size:13px}code{font-family:SF Mono,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace}.card{background:#161b22;border:1px solid #21262d;border-radius:8px;padding:16px;margin-bottom:16px}.page-title{font-size:20px;font-weight:600;margin-bottom:16px}.badge{display:inline-block;padding:2px 8px;border-radius:12px;font-size:12px;font-weight:600}.badge-green{background:#0d4429;color:#3fb950}.badge-red{background:#490d0d;color:#f85149}.badge-yellow{background:#4a3b0d;color:#d29922}.badge-blue{background:#0d2d4a;color:#58a6ff}.badge-gray{background:#21262d;color:#8b949e}.mono{font-family:SF Mono,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace}.text-muted{color:#8b949e}.loading{color:#8b949e;padding:24px}.error{color:#f85149;padding:24px}.stats-grid[data-v-4cdf1468]{display:grid;grid-template-columns:repeat(auto-fill,minmax(200px,1fr));gap:16px;margin-bottom:16px}.stat-card[data-v-4cdf1468]{text-align:center}.stat-label[data-v-4cdf1468]{font-size:12px;color:#8b949e;text-transform:uppercase;letter-spacing:.5px;margin-bottom:8px}.stat-value[data-v-4cdf1468]{font-size:24px;font-weight:600;color:#f0f6fc}.stat-detail[data-v-4cdf1468]{font-size:13px;color:#8b949e;margin-top:4px}.section-title[data-v-4cdf1468]{font-size:16px;font-weight:600;margin:16px 0 8px}.info-columns[data-v-4cdf1468]{display:grid;grid-template-columns:1fr 1fr;gap:16px}.db-layout[data-v-5ca2be79]{display:flex;height:100vh}.db-sidebar[data-v-5ca2be79]{width:220px;flex-shrink:0;border-right:1px solid #21262d;overflow-y:auto;background:#0f1117}.sidebar-title[data-v-5ca2be79]{font-size:14px;font-weight:600;color:#8b949e;padding:16px 12px 8px;text-transform:uppercase;letter-spacing:.5px}.entity-list[data-v-5ca2be79]{list-style:none;padding:0 4px}.entity-item[data-v-5ca2be79]{display:flex;flex-direction:column;padding:6px 10px;border-radius:6px;cursor:pointer;margin-bottom:1px}.entity-item[data-v-5ca2be79]:hover{background:#21262d}.entity-active[data-v-5ca2be79]{background:#1f6feb33!important}.entity-name[data-v-5ca2be79]{font-size:13px;color:#e1e4e8;font-weight:500}.entity-table[data-v-5ca2be79]{font-size:11px}.db-main[data-v-5ca2be79]{flex:1;display:flex;flex-direction:column;min-width:0;overflow:hidden}.query-bar[data-v-5ca2be79]{padding:12px 16px;border-bottom:1px solid #21262d;background:#161b22;flex-shrink:0}.query-input[data-v-5ca2be79]{width:100%;background:#0d1117;border:1px solid #30363d;border-radius:6px;color:#e1e4e8;padding:8px 10px;font-size:13px;resize:vertical;outline:none}.query-input[data-v-5ca2be79]:focus{border-color:#58a6ff}.query-actions[data-v-5ca2be79]{display:flex;align-items:center;gap:12px;margin-top:8px}.run-btn[data-v-5ca2be79]{background:#238636;color:#fff;border:none;border-radius:6px;padding:6px 16px;font-size:13px;font-weight:600;cursor:pointer}.run-btn[data-v-5ca2be79]:hover:not(:disabled){background:#2ea043}.run-btn[data-v-5ca2be79]:disabled{opacity:.6;cursor:not-allowed}.query-hint[data-v-5ca2be79]{font-size:12px}.query-error[data-v-5ca2be79]{padding:12px 16px;background:#3d1114;color:#f85149;font-size:13px;font-family:SF Mono,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;white-space:pre-wrap;word-break:break-word}.results-area[data-v-5ca2be79]{flex:1;display:flex;flex-direction:column;min-height:0;overflow:hidden}.results-meta[data-v-5ca2be79]{padding:6px 16px;font-size:12px;border-bottom:1px solid #21262d;flex-shrink:0}.results-table-wrap[data-v-5ca2be79]{flex:1;overflow:auto}.results-table-wrap table[data-v-5ca2be79]{min-width:100%}.results-table-wrap th[data-v-5ca2be79]{text-transform:none}.results-table-wrap td[data-v-5ca2be79]{font-size:13px;white-space:pre-wrap;word-break:break-word;max-width:400px;vertical-align:top}.empty-state[data-v-5ca2be79]{flex:1;display:flex;align-items:center;justify-content:center;font-size:14px}.page-header[data-v-655778ae]{display:flex;align-items:center;justify-content:space-between;margin-bottom:16px}.page-header .page-title[data-v-655778ae]{margin-bottom:0}.btn[data-v-655778ae]{background:#21262d;color:#c9d1d9;border:1px solid #30363d;border-radius:6px;padding:6px 16px;font-size:13px;cursor:pointer}.btn[data-v-655778ae]:hover:not(:disabled){background:#30363d;border-color:#8b949e}.btn[data-v-655778ae]:disabled{opacity:.5;cursor:not-allowed}.section-title[data-v-3c2c86ac]{font-size:14px;font-weight:600;color:#8b949e;margin:20px 0 8px}.section-title[data-v-3c2c86ac]:first-of-type{margin-top:0}.repl-layout[data-v-2e6f5e45]{display:flex;flex-direction:column;height:100vh}.repl-output[data-v-2e6f5e45]{flex:1;overflow-y:auto;padding:16px}.repl-entry[data-v-2e6f5e45]{margin-bottom:12px}.repl-input-line[data-v-2e6f5e45]{display:flex;gap:8px;align-items:flex-start}.repl-prompt[data-v-2e6f5e45]{color:#58a6ff;font-weight:700;font-family:SF Mono,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:13px;flex-shrink:0;line-height:1.5;-webkit-user-select:none;user-select:none}.repl-code[data-v-2e6f5e45]{color:#e1e4e8;font-size:13px;margin:0;background:none;border:none;padding:0;white-space:pre-wrap;word-break:break-word}.repl-result[data-v-2e6f5e45]{color:#8b949e;font-size:13px;margin:2px 0 0 18px;background:none;border:none;padding:0;white-space:pre-wrap;word-break:break-word}.repl-error[data-v-2e6f5e45]{color:#f85149;font-size:13px;margin:2px 0 0 18px;background:none;border:none;padding:0;white-space:pre-wrap;word-break:break-word}.repl-running[data-v-2e6f5e45]{margin-left:18px;font-size:13px}.repl-input-bar[data-v-2e6f5e45]{display:flex;align-items:flex-start;gap:8px;padding:12px 16px;border-top:1px solid #21262d;background:#161b22;flex-shrink:0}.repl-input-wrap[data-v-2e6f5e45]{flex:1;position:relative}.repl-input[data-v-2e6f5e45]{width:100%;background:#0d1117;border:1px solid #30363d;border-radius:6px;color:#e1e4e8;padding:6px 10px;font-size:13px;resize:none;outline:none;line-height:1.5;overflow:hidden}.repl-input[data-v-2e6f5e45]:focus{border-color:#58a6ff}.run-btn[data-v-2e6f5e45]{background:#238636;color:#fff;border:none;border-radius:6px;padding:6px 14px;font-size:13px;font-weight:600;cursor:pointer;flex-shrink:0;align-self:flex-end}.run-btn[data-v-2e6f5e45]:hover:not(:disabled){background:#2ea043}.run-btn[data-v-2e6f5e45]:disabled{opacity:.6;cursor:not-allowed}.ac-popup[data-v-2e6f5e45]{position:absolute;bottom:100%;left:0;margin-bottom:4px;background:#1c2128;border:1px solid #30363d;border-radius:6px;max-height:240px;overflow-y:auto;min-width:220px;max-width:400px;z-index:100;box-shadow:0 4px 12px #0006}.ac-item[data-v-2e6f5e45]{display:flex;align-items:center;gap:8px;padding:4px 10px;cursor:pointer;font-size:13px}.ac-item[data-v-2e6f5e45]:hover{background:#21262d}.ac-selected[data-v-2e6f5e45]{background:#1f6feb44!important}.ac-kind[data-v-2e6f5e45]{width:18px;height:18px;border-radius:3px;display:flex;align-items:center;justify-content:center;font-size:11px;font-weight:700;flex-shrink:0}.ac-kind-method[data-v-2e6f5e45]{background:#3d2d6b;color:#b392f0}.ac-kind-property[data-v-2e6f5e45]{background:#0d3d5e;color:#79c0ff}.ac-kind-accessor[data-v-2e6f5e45]{background:#3d3d0d;color:#d2a822}.ac-kind-global[data-v-2e6f5e45]{background:#1a3d1a;color:#7ee787}.ac-label[data-v-2e6f5e45]{color:#e1e4e8;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.json-viewer[data-v-a57320a5]{position:relative}.toggle[data-v-a57320a5]{background:#21262d;border:1px solid #30363d;color:#8b949e;border-radius:4px;padding:4px 8px;font-size:12px;cursor:pointer;margin-bottom:8px}.toggle[data-v-a57320a5]:hover{color:#e1e4e8}.requests-layout[data-v-b0b359e7]{display:flex;flex-direction:column;height:100vh}.requests-list[data-v-b0b359e7]{flex:1;overflow-y:auto;min-height:0;padding:24px}.requests-list.has-detail[data-v-b0b359e7]{flex:1}.clickable-row[data-v-b0b359e7]{cursor:pointer;border-left:2px solid transparent}.clickable-row[data-v-b0b359e7]:hover{background:#1c2128}.selected-row[data-v-b0b359e7]{background:#1c2128!important;border-left-color:#58a6ff}.resize-handle[data-v-b0b359e7]{flex-shrink:0;height:4px;background:#30363d;cursor:row-resize}.resize-handle[data-v-b0b359e7]:hover{background:#58a6ff}.detail-panel[data-v-b0b359e7]{flex-shrink:0;min-height:150px;background:#161b22;display:flex;flex-direction:column}.detail-panel-header[data-v-b0b359e7]{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;border-bottom:1px solid #21262d;background:#1c2128;flex-shrink:0}.detail-panel-title[data-v-b0b359e7]{display:flex;align-items:center;gap:8px;font-size:13px;min-width:0;overflow:hidden;white-space:nowrap}.header-sep[data-v-b0b359e7]{width:1px;height:14px;background:#30363d;flex-shrink:0}.detail-controls[data-v-b0b359e7]{display:flex;align-items:center;gap:12px;flex-shrink:0}.pretty-toggle[data-v-b0b359e7]{display:flex;align-items:center;gap:4px;font-size:12px;color:#8b949e;cursor:pointer;-webkit-user-select:none;user-select:none}.pretty-toggle input[data-v-b0b359e7]{cursor:pointer}.detail-close[data-v-b0b359e7]{background:none;border:none;color:#8b949e;font-size:20px;cursor:pointer;padding:0 4px;line-height:1}.detail-close[data-v-b0b359e7]:hover{color:#e1e4e8}.detail-panel-body[data-v-b0b359e7]{flex:1;overflow:hidden}.detail-split[data-v-b0b359e7]{display:flex;height:100%}.detail-pane[data-v-b0b359e7]{flex:1;min-width:0;overflow-y:auto;padding:12px}.detail-pane+.detail-pane[data-v-b0b359e7]{border-left:1px solid #21262d}.detail-pane pre[data-v-b0b359e7]{margin:0}.detail-error[data-v-b0b359e7]{color:#f85149;font-size:12px;margin:0;white-space:pre-wrap;word-break:break-word}.error-details[data-v-b0b359e7]{margin-top:4px;font-size:12px}.subsection-title[data-v-b0b359e7]{font-size:11px;font-weight:600;color:#8b949e;text-transform:uppercase;letter-spacing:.5px;margin:12px 0 4px}.subsection-title[data-v-b0b359e7]:first-of-type{margin-top:0}.srpc-layout[data-v-ccb881e5]{display:flex;flex-direction:column;height:100vh}.srpc-top[data-v-ccb881e5]{flex:1;overflow-y:auto;min-height:0;padding:24px}.section-title[data-v-ccb881e5]{font-size:16px;font-weight:600;margin:16px 0 8px}.clickable-row[data-v-ccb881e5]{cursor:pointer;border-left:2px solid transparent}.clickable-row[data-v-ccb881e5]:hover{background:#1c2128}.selected-row[data-v-ccb881e5]{background:#1c2128!important;border-left-color:#58a6ff}.resize-handle[data-v-ccb881e5]{flex-shrink:0;height:4px;background:#30363d;cursor:row-resize}.resize-handle[data-v-ccb881e5]:hover{background:#58a6ff}.detail-panel[data-v-ccb881e5]{flex-shrink:0;min-height:150px;background:#161b22;display:flex;flex-direction:column}.detail-panel-header[data-v-ccb881e5]{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;border-bottom:1px solid #21262d;background:#1c2128;flex-shrink:0}.detail-panel-title[data-v-ccb881e5]{display:flex;align-items:center;gap:8px;font-size:13px}.detail-close[data-v-ccb881e5]{background:none;border:none;color:#8b949e;font-size:20px;cursor:pointer;padding:0 4px;line-height:1;flex-shrink:0}.detail-close[data-v-ccb881e5]:hover{color:#e1e4e8}.detail-panel-body[data-v-ccb881e5]{flex:1;overflow:hidden}.messages-and-detail[data-v-ccb881e5]{display:flex;height:100%}.messages-list[data-v-ccb881e5]{width:45%;min-width:300px;overflow-y:auto;border-right:1px solid #21262d}.message-detail[data-v-ccb881e5]{flex:1;min-width:0;overflow-y:auto}.detail-split[data-v-ccb881e5]{display:flex;height:100%}.detail-pane[data-v-ccb881e5]{flex:1;min-width:0;overflow-y:auto;padding:12px}.detail-pane+.detail-pane[data-v-ccb881e5]{border-left:1px solid #21262d}.detail-pane pre[data-v-ccb881e5]{margin:0;font-size:12px}.pane-title[data-v-ccb881e5]{font-size:13px;font-weight:600;margin-bottom:8px;color:#e1e4e8}.msg-meta[data-v-ccb881e5]{display:flex;align-items:center;gap:8px;font-size:12px;margin-bottom:8px}.msg-error[data-v-ccb881e5]{color:#f85149;font-size:13px;margin-bottom:8px}.sortable[data-v-4881b228]{cursor:pointer;-webkit-user-select:none;user-select:none}.sortable[data-v-4881b228]:hover{text-decoration:underline}.sort-indicator[data-v-4881b228]{font-size:.75em}.workers-layout[data-v-4cf93eca]{display:flex;flex-direction:column;height:100vh}.workers-list[data-v-4cf93eca]{flex:1;overflow-y:auto;min-height:0;padding:24px}.workers-list.has-detail[data-v-4cf93eca]{flex:1}.queue-summary[data-v-4cf93eca]{display:flex;flex-wrap:wrap;gap:8px;margin-bottom:16px}.queue-chip[data-v-4cf93eca]{display:flex;align-items:center;gap:8px;background:#161b22;border:1px solid #21262d;border-radius:6px;padding:6px 12px;font-size:13px}.queue-chip-name[data-v-4cf93eca]{font-weight:600;color:#f0f6fc}.queue-chip-stat[data-v-4cf93eca]{color:#8b949e;font-size:12px}.queue-chip-stat strong[data-v-4cf93eca]{color:#e1e4e8}.clickable-row[data-v-4cf93eca]{cursor:pointer;border-left:2px solid transparent}.clickable-row[data-v-4cf93eca]:hover{background:#1c2128}.selected-row[data-v-4cf93eca]{background:#1c2128!important;border-left-color:#58a6ff}.resize-handle[data-v-4cf93eca]{flex-shrink:0;height:4px;background:#30363d;cursor:row-resize}.resize-handle[data-v-4cf93eca]:hover{background:#58a6ff}.detail-panel[data-v-4cf93eca]{flex-shrink:0;min-height:150px;background:#161b22;display:flex;flex-direction:column}.detail-panel-header[data-v-4cf93eca]{display:flex;align-items:center;justify-content:space-between;padding:8px 16px;border-bottom:1px solid #21262d;background:#1c2128;flex-shrink:0}.detail-panel-title[data-v-4cf93eca]{display:flex;align-items:center;gap:8px;font-size:13px;min-width:0;overflow:hidden;white-space:nowrap}.header-sep[data-v-4cf93eca]{width:1px;height:14px;background:#30363d;flex-shrink:0}.detail-close[data-v-4cf93eca]{background:none;border:none;color:#8b949e;font-size:20px;cursor:pointer;padding:0 4px;line-height:1}.detail-close[data-v-4cf93eca]:hover{color:#e1e4e8}.detail-panel-body[data-v-4cf93eca]{flex:1;overflow:hidden}.detail-split[data-v-4cf93eca]{display:flex;height:100%}.detail-pane[data-v-4cf93eca]{flex:1;min-width:0;overflow-y:auto;padding:12px}.detail-pane+.detail-pane[data-v-4cf93eca]{border-left:1px solid #21262d}.detail-pane pre[data-v-4cf93eca]{margin:0}.subsection-title[data-v-4cf93eca]{font-size:11px;font-weight:600;color:#8b949e;text-transform:uppercase;letter-spacing:.5px;margin:12px 0 4px}.subsection-title[data-v-4cf93eca]:first-of-type{margin-top:0}.timestamps-table[data-v-4cf93eca]{font-size:13px}.timestamps-table td[data-v-4cf93eca]{padding:4px 12px 4px 0;border:none}.timestamps-table tr[data-v-4cf93eca]:hover{background:none}.openapi-view[data-v-8a5d400c]{height:100vh;overflow-y:auto}.swagger-container[data-v-8a5d400c]{padding:0 24px 24px}.swagger-container *{margin:revert;padding:revert;box-sizing:revert}.swagger-container .swagger-ui,.swagger-container .swagger-ui div,.swagger-container .swagger-ui section,.swagger-container .swagger-ui header,.swagger-container .swagger-ui span,.swagger-container .swagger-ui small,.swagger-container .swagger-ui td,.swagger-container .swagger-ui th,.swagger-container .swagger-ui tr,.swagger-container .swagger-ui table,.swagger-container .swagger-ui ul,.swagger-container .swagger-ui li,.swagger-container .swagger-ui p,.swagger-container .swagger-ui label,.swagger-container .swagger-ui h1,.swagger-container .swagger-ui h2,.swagger-container .swagger-ui h3,.swagger-container .swagger-ui h4,.swagger-container .swagger-ui h5,.swagger-container .swagger-ui hgroup{background-color:transparent!important;background:transparent!important}.swagger-container .swagger-ui{font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif!important;font-size:14px;color:#e1e4e8}.swagger-container .swagger-ui *{border-color:#21262d!important}.swagger-container .swagger-ui svg:not(.opblock-summary-method svg){fill:#8b949e}.swagger-container .swagger-ui a{color:#58a6ff}.swagger-container .swagger-ui .wrapper{padding:0;max-width:none}.swagger-container .swagger-ui .info{margin:20px 0 12px}.swagger-container .swagger-ui .info .title{color:#f0f6fc;font-size:20px;font-weight:600}.swagger-container .swagger-ui .info .title small{background:#21262d!important;color:#8b949e!important;border:none!important;font-size:11px;padding:2px 8px!important;border-radius:12px;font-weight:600;vertical-align:middle;top:0;position:relative}.swagger-container .swagger-ui .info .title small pre{color:#8b949e;padding:0!important;font-family:inherit;font-size:inherit;border:none!important}.swagger-container .swagger-ui .info .base-url{color:#484f58;font-size:12px}.swagger-container .swagger-ui .info p,.swagger-container .swagger-ui .info li,.swagger-container .swagger-ui .info table td,.swagger-container .swagger-ui .info table th,.swagger-container .swagger-ui .info h1,.swagger-container .swagger-ui .info h2,.swagger-container .swagger-ui .info h3,.swagger-container .swagger-ui .info h4{color:#8b949e}.swagger-container .swagger-ui .info a{color:#58a6ff}.swagger-container .swagger-ui .scheme-container{box-shadow:none;padding:12px 0}.swagger-container .swagger-ui .scheme-container label{color:#8b949e;font-size:12px}.swagger-container .swagger-ui .filter-container{margin:0;padding:12px 0}.swagger-container .swagger-ui .filter-container .operation-filter-input{background:#161b22!important;border:1px solid #30363d!important;color:#e1e4e8;border-radius:6px;padding:8px 12px;font-size:13px}.swagger-container .swagger-ui .opblock-tag{color:#e1e4e8;font-size:16px;font-weight:600;padding:12px 0}.swagger-container .swagger-ui .opblock-tag small{color:#484f58;font-size:12px}.swagger-container .swagger-ui .opblock-tag a{color:inherit}.swagger-container .swagger-ui .opblock-tag svg{fill:#484f58}.swagger-container .swagger-ui .opblock{margin:0 0 4px;border-radius:6px;border:1px solid!important;box-shadow:none}.swagger-container .swagger-ui .opblock .opblock-summary{padding:8px 12px}.swagger-container .swagger-ui .opblock .opblock-summary-method{font-size:11px!important;font-weight:700;padding:3px 0!important;min-width:62px;border-radius:12px!important;text-align:center;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,sans-serif}.swagger-container .swagger-ui .opblock .opblock-summary-path,.swagger-container .swagger-ui .opblock .opblock-summary-path span,.swagger-container .swagger-ui .opblock .opblock-summary-path a{color:#e1e4e8!important;font-family:SF Mono,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:13px}.swagger-container .swagger-ui .opblock .opblock-summary-description{color:#484f58;font-size:13px}.swagger-container .swagger-ui .opblock .opblock-summary-control svg{fill:#484f58}.swagger-container .swagger-ui .opblock.opblock-get{background:#0d2d4a33!important;border-color:#58a6ff26!important}.swagger-container .swagger-ui .opblock.opblock-get .opblock-summary-method{background:#0d2d4a!important;color:#58a6ff!important}.swagger-container .swagger-ui .opblock.opblock-post{background:#0d442933!important;border-color:#3fb95026!important}.swagger-container .swagger-ui .opblock.opblock-post .opblock-summary-method{background:#0d4429!important;color:#3fb950!important}.swagger-container .swagger-ui .opblock.opblock-put{background:#4a3b0d33!important;border-color:#d2992226!important}.swagger-container .swagger-ui .opblock.opblock-put .opblock-summary-method{background:#4a3b0d!important;color:#d29922!important}.swagger-container .swagger-ui .opblock.opblock-delete{background:#490d0d33!important;border-color:#f8514926!important}.swagger-container .swagger-ui .opblock.opblock-delete .opblock-summary-method{background:#490d0d!important;color:#f85149!important}.swagger-container .swagger-ui .opblock.opblock-patch{background:#2d1a4e33!important;border-color:#a371f726!important}.swagger-container .swagger-ui .opblock.opblock-patch .opblock-summary-method{background:#2d1a4e!important;color:#a371f7!important}.swagger-container .swagger-ui .opblock.opblock-options,.swagger-container .swagger-ui .opblock.opblock-head{background:#21262d33!important;border-color:#21262d!important}.swagger-container .swagger-ui .opblock.opblock-options .opblock-summary-method,.swagger-container .swagger-ui .opblock.opblock-head .opblock-summary-method{background:#21262d!important;color:#8b949e!important}.swagger-container .swagger-ui .opblock.opblock-deprecated{opacity:.6;background:#21262d33!important;border-color:#21262d!important}.swagger-container .swagger-ui .opblock.opblock-deprecated .opblock-summary-method{background:#21262d!important;color:#8b949e!important}.swagger-container .swagger-ui .opblock-section-header{box-shadow:none}.swagger-container .swagger-ui .opblock-section-header h4{color:#e1e4e8;font-size:13px;font-weight:600}.swagger-container .swagger-ui .opblock-section-header label,.swagger-container .swagger-ui .opblock-description-wrapper p,.swagger-container .swagger-ui .opblock-external-docs-wrapper p{color:#8b949e}.swagger-container .swagger-ui pre,.swagger-container .swagger-ui pre.microlight,.swagger-container .swagger-ui .highlight-code .microlight,.swagger-container .swagger-ui .microlight{background:#0d1117!important;color:#e1e4e8!important;border:1px solid #21262d!important;border-radius:6px;padding:12px;font-family:SF Mono,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:12px}.swagger-container .swagger-ui .request-url pre{background:#0d1117!important;color:#e1e4e8!important}.swagger-container .swagger-ui .parameters-col_description p,.swagger-container .swagger-ui table thead tr td,.swagger-container .swagger-ui table thead tr th{color:#8b949e}.swagger-container .swagger-ui .parameter__name{color:#e1e4e8;font-family:SF Mono,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:13px}.swagger-container .swagger-ui .parameter__name.required:after{color:#f85149}.swagger-container .swagger-ui .parameter__type,.swagger-container .swagger-ui .parameter__deprecated,.swagger-container .swagger-ui .parameter__in{color:#484f58;font-size:12px}.swagger-container .swagger-ui input[type=text],.swagger-container .swagger-ui input[type=search],.swagger-container .swagger-ui input[type=email],.swagger-container .swagger-ui input[type=file],.swagger-container .swagger-ui input[type=password],.swagger-container .swagger-ui textarea{background:#0d1117!important;border:1px solid #30363d!important;color:#e1e4e8!important;border-radius:6px;font-family:SF Mono,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:13px}.swagger-container .swagger-ui input:focus,.swagger-container .swagger-ui textarea:focus{border-color:#58a6ff!important;outline:none;box-shadow:0 0 0 2px #58a6ff33}.swagger-container .swagger-ui select{background:#161b22!important;border:1px solid #30363d!important;color:#e1e4e8!important;border-radius:6px;font-size:13px}.swagger-container .swagger-ui .btn{border-radius:6px;font-size:13px;font-weight:600}.swagger-container .swagger-ui .btn.execute{background:#1f6feb!important;border-color:#1f6feb!important;color:#fff!important}.swagger-container .swagger-ui .btn.cancel{background:transparent!important;border:1px solid #f85149!important;color:#f85149!important}.swagger-container .swagger-ui .btn.authorize{border-color:#3fb950!important;color:#3fb950!important}.swagger-container .swagger-ui .btn.authorize svg{fill:#3fb950}.swagger-container .swagger-ui .try-out__btn{border-color:#30363d!important;color:#8b949e!important}.swagger-container .swagger-ui .try-out__btn:hover{color:#e1e4e8!important;border-color:#8b949e!important}.swagger-container .swagger-ui .responses-inner h4,.swagger-container .swagger-ui .responses-inner h5{color:#e1e4e8;font-size:13px}.swagger-container .swagger-ui .response-col_status{color:#e1e4e8;font-family:SF Mono,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:13px}.swagger-container .swagger-ui .response-col_description,.swagger-container .swagger-ui .response-col_description__inner p,.swagger-container .swagger-ui .response-col_links{color:#8b949e}.swagger-container .swagger-ui .tab li{color:#484f58}.swagger-container .swagger-ui .tab li:hover{color:#8b949e}.swagger-container .swagger-ui .tab li.active{color:#e1e4e8}.swagger-container .swagger-ui section.models{border:1px solid #21262d!important;border-radius:8px;background:#161b22!important;margin-top:16px}.swagger-container .swagger-ui section.models h4{color:#e1e4e8;font-size:14px;font-weight:600}.swagger-container .swagger-ui section.models h4 svg{fill:#484f58}.swagger-container .swagger-ui section.models .model-container{margin:0}.swagger-container .swagger-ui .model{color:#8b949e}.swagger-container .swagger-ui .model-title,.swagger-container .swagger-ui span.model-title__text{color:#e1e4e8;font-family:SF Mono,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace;font-size:13px}.swagger-container .swagger-ui .model .property{color:#e1e4e8}.swagger-container .swagger-ui .model .property.primitive{color:#58a6ff}.swagger-container .swagger-ui .model-toggle:after{filter:invert(.6)}.swagger-container .swagger-ui .markdown p,.swagger-container .swagger-ui .markdown li,.swagger-container .swagger-ui .renderedMarkdown p{color:#8b949e}.swagger-container .swagger-ui .markdown code,.swagger-container .swagger-ui .renderedMarkdown code{background:#0d1117!important;color:#e1e4e8;border-radius:4px;padding:2px 6px;font-size:12px;font-family:SF Mono,SFMono-Regular,Consolas,Liberation Mono,Menlo,monospace}.swagger-container .swagger-ui .dialog-ux .modal-ux{background:#161b22!important;border:1px solid #30363d!important;border-radius:8px;box-shadow:0 16px 48px #0006}.swagger-container .swagger-ui .dialog-ux .modal-ux-header h3{color:#e1e4e8}.swagger-container .swagger-ui .dialog-ux .modal-ux-content p,.swagger-container .swagger-ui .dialog-ux .modal-ux-content label{color:#8b949e}.swagger-container .swagger-ui .dialog-ux .modal-ux-content h4{color:#e1e4e8}.swagger-container .swagger-ui .dialog-ux .backdrop-ux{background:#0009!important}.swagger-container .swagger-ui .copy-to-clipboard{background:#21262d!important;border-radius:6px}.swagger-container .swagger-ui .opblock-body p,.swagger-container .swagger-ui .opblock-body small,.swagger-container .swagger-ui .opblock-body label{color:#8b949e}.swagger-container .swagger-ui .loading-container .loading:after{color:#8b949e}.swagger-container .swagger-ui svg.arrow{fill:#484f58}.openapi-view::-webkit-scrollbar{width:8px}.openapi-view::-webkit-scrollbar-track{background:transparent}.openapi-view::-webkit-scrollbar-thumb{background:#30363d;border-radius:4px}.openapi-view::-webkit-scrollbar-thumb:hover{background:#484f58}
|