@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
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
/* eslint-disable @typescript-eslint/no-require-imports */
|
|
4
|
+
|
|
5
|
+
import { spawn } from 'child_process';
|
|
6
|
+
import { globSync } from 'fs';
|
|
7
|
+
import { join, resolve } from 'path';
|
|
8
|
+
|
|
9
|
+
process.env.TZ = 'UTC';
|
|
10
|
+
process.env.APP_ENV = 'test';
|
|
11
|
+
|
|
12
|
+
const distDir = resolve('dist');
|
|
13
|
+
|
|
14
|
+
async function main() {
|
|
15
|
+
// Run global setup if available
|
|
16
|
+
let teardown: (() => Promise<void>) | undefined;
|
|
17
|
+
try {
|
|
18
|
+
const globalSetup = require(join(distDir, 'tests', 'shared', 'globalSetup'));
|
|
19
|
+
if (globalSetup.setup) {
|
|
20
|
+
await globalSetup.setup();
|
|
21
|
+
}
|
|
22
|
+
if (globalSetup.teardown) {
|
|
23
|
+
teardown = globalSetup.teardown;
|
|
24
|
+
}
|
|
25
|
+
} catch {
|
|
26
|
+
// No global setup found, continue
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Parse arguments
|
|
30
|
+
const args = process.argv.slice(2);
|
|
31
|
+
const nodeArgs: string[] = [];
|
|
32
|
+
const fileArgs: string[] = [];
|
|
33
|
+
|
|
34
|
+
for (const arg of args) {
|
|
35
|
+
if (arg.startsWith('-')) {
|
|
36
|
+
nodeArgs.push(arg);
|
|
37
|
+
} else {
|
|
38
|
+
fileArgs.push(arg);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Collect test files
|
|
43
|
+
const testFiles: string[] = [];
|
|
44
|
+
for (const f of fileArgs) {
|
|
45
|
+
const distPath = f.startsWith('dist/') ? f : f.replace(/^tests\//, 'dist/tests/').replace(/\.ts$/, '.js');
|
|
46
|
+
if (distPath.endsWith('/') || !distPath.includes('.')) {
|
|
47
|
+
testFiles.push(...globSync(join(distPath, '**/*.spec.js')));
|
|
48
|
+
} else {
|
|
49
|
+
testFiles.push(distPath);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
if (testFiles.length === 0) {
|
|
53
|
+
testFiles.push(...globSync(join(distDir, 'tests', '**/*.spec.js')));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// Run node --test
|
|
57
|
+
// Note: --test-timeout applies to describe() suites on Node 24+, so this must be high
|
|
58
|
+
// enough to cover DB setup in before() hooks under concurrent execution.
|
|
59
|
+
// Individual tests can override with { timeout } per-test if needed.
|
|
60
|
+
const child = spawn(
|
|
61
|
+
process.execPath,
|
|
62
|
+
['--enable-source-maps', '--test', '--test-force-exit', '--test-timeout=180000', ...nodeArgs, ...testFiles],
|
|
63
|
+
{
|
|
64
|
+
stdio: 'inherit',
|
|
65
|
+
env: { ...process.env, TZ: 'UTC' }
|
|
66
|
+
}
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
const exitCode = await new Promise<number | null>(resolve => {
|
|
70
|
+
child.on('close', resolve);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
// Run teardown
|
|
74
|
+
if (teardown) {
|
|
75
|
+
await teardown();
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
process.exit(exitCode ?? 1);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
main().catch(err => {
|
|
82
|
+
console.error('Test runner error:', err);
|
|
83
|
+
process.exit(1);
|
|
84
|
+
});
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { assert } from '@deepkit/type';
|
|
4
|
+
import { execSync } from 'child_process';
|
|
5
|
+
import { existsSync } from 'fs';
|
|
6
|
+
import { readFile, stat, writeFile } from 'fs/promises';
|
|
7
|
+
import glob from 'tiny-glob';
|
|
8
|
+
|
|
9
|
+
const packageJsonPath = `package.json`;
|
|
10
|
+
if (!existsSync(packageJsonPath)) {
|
|
11
|
+
console.log('No package.json found in current directory.');
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const latestDKSFInfoStr = execSync('npm info @zyno-io/dk-server-foundation@latest --json').toString();
|
|
16
|
+
const latestDKSFInfo = JSON.parse(latestDKSFInfoStr);
|
|
17
|
+
assert<{
|
|
18
|
+
'dist-tags': {
|
|
19
|
+
latest: string;
|
|
20
|
+
};
|
|
21
|
+
dependencies: {
|
|
22
|
+
[key: string]: string;
|
|
23
|
+
};
|
|
24
|
+
}>(latestDKSFInfo);
|
|
25
|
+
const latestVersion = latestDKSFInfo['dist-tags'].latest;
|
|
26
|
+
|
|
27
|
+
applyUpdates()
|
|
28
|
+
.then(() => process.exit(0))
|
|
29
|
+
.catch(err => {
|
|
30
|
+
console.error(err);
|
|
31
|
+
process.exit(1);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
////
|
|
35
|
+
|
|
36
|
+
async function applyUpdates() {
|
|
37
|
+
const rootPackageJson = await processPackageJson(packageJsonPath);
|
|
38
|
+
|
|
39
|
+
if (rootPackageJson.workspaces) {
|
|
40
|
+
for (const workspace of rootPackageJson.workspaces) {
|
|
41
|
+
const matches = await glob(workspace);
|
|
42
|
+
for (const match of matches) {
|
|
43
|
+
const matchState = await stat(match);
|
|
44
|
+
if (matchState.isDirectory()) {
|
|
45
|
+
const packageJsonPath = `${match}/package.json`;
|
|
46
|
+
if (existsSync(packageJsonPath)) {
|
|
47
|
+
await processPackageJson(packageJsonPath);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function processPackageJson(path: string) {
|
|
56
|
+
const packageJsonStr = await readFile(path, 'utf8');
|
|
57
|
+
const packageJson = JSON.parse(packageJsonStr);
|
|
58
|
+
assert<{
|
|
59
|
+
workspaces?: string[];
|
|
60
|
+
dependencies?: {
|
|
61
|
+
[key: string]: string;
|
|
62
|
+
};
|
|
63
|
+
}>(packageJson);
|
|
64
|
+
|
|
65
|
+
if (packageJson.dependencies) {
|
|
66
|
+
const currentVersion = packageJson.dependencies['@zyno-io/dk-server-foundation'];
|
|
67
|
+
if (!currentVersion) {
|
|
68
|
+
console.log(`${path}: No @zyno-io/dk-server-foundation dependency found in package.json.`);
|
|
69
|
+
return packageJson;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (currentVersion === latestVersion) {
|
|
73
|
+
console.log(`${path}: DKSF already up to date.`);
|
|
74
|
+
} else if (currentVersion === '*') {
|
|
75
|
+
console.log(`${path}: DKSF set to '*'`);
|
|
76
|
+
} else {
|
|
77
|
+
console.log(`${path}: Updating @zyno-io/dk-server-foundation from ${currentVersion} to ${latestVersion}.`);
|
|
78
|
+
packageJson.dependencies['@zyno-io/dk-server-foundation'] = latestVersion;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
for (const dependency in latestDKSFInfo.dependencies) {
|
|
82
|
+
if (dependency in packageJson.dependencies) {
|
|
83
|
+
if (packageJson.dependencies[dependency] === '*') {
|
|
84
|
+
console.log(`${path}: ${dependency} is set to '*'.`);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (packageJson.dependencies[dependency] !== latestDKSFInfo.dependencies[dependency]) {
|
|
88
|
+
console.log(
|
|
89
|
+
`${path}: Updating ${dependency} from ${packageJson.dependencies[dependency]} to ${latestDKSFInfo.dependencies[dependency]}.`
|
|
90
|
+
);
|
|
91
|
+
packageJson.dependencies[dependency] = latestDKSFInfo.dependencies[dependency];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const newPackageJsonStr = JSON.stringify(packageJson, undefined, 4);
|
|
97
|
+
await writeFile(path, `${newPackageJsonStr}\n`);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return packageJson;
|
|
101
|
+
}
|
|
@@ -0,0 +1,385 @@
|
|
|
1
|
+
import { AbstractClassType, ClassType, TypeAnnotation } from '@deepkit/core';
|
|
2
|
+
import { HttpNotFoundError } from '@deepkit/http';
|
|
3
|
+
import { ActiveRecord, ActiveRecordClassType, Database, DatabaseAdapter, DatabaseSession, FilterQuery, ItemNotFound, OrmEntity } from '@deepkit/orm';
|
|
4
|
+
import { sql, SQLDatabaseAdapter, SQLDatabaseQuery, SqlQuery } from '@deepkit/sql';
|
|
5
|
+
import { AutoIncrement, deserialize, ReceiveType, ReflectionClass, Type } from '@deepkit/type';
|
|
6
|
+
import { pick } from 'lodash';
|
|
7
|
+
|
|
8
|
+
import { flattenMutexKey, MutexKey } from '../helpers';
|
|
9
|
+
import { ObjectKeysMatching } from '../types';
|
|
10
|
+
import { getDialect } from './dialect';
|
|
11
|
+
|
|
12
|
+
const PreCommitHooksSymbol = Symbol('PreCommitHooks');
|
|
13
|
+
const PostCommitHooksSymbol = Symbol('PostCommitHooks');
|
|
14
|
+
|
|
15
|
+
declare module '@deepkit/orm' {
|
|
16
|
+
interface DatabaseSession {
|
|
17
|
+
[PreCommitHooksSymbol]?: (() => Promise<void>)[];
|
|
18
|
+
[PostCommitHooksSymbol]?: (() => Promise<void>)[];
|
|
19
|
+
addPreCommitHook(hook: () => Promise<void>): void;
|
|
20
|
+
addPostCommitHook(hook: () => Promise<void>): void;
|
|
21
|
+
acquireSessionLock(key: MutexKey | MutexKey[]): Promise<void>;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
DatabaseSession.prototype.addPreCommitHook = function (hook: () => Promise<void>) {
|
|
26
|
+
if (!this[PreCommitHooksSymbol]) this[PreCommitHooksSymbol] = [];
|
|
27
|
+
this[PreCommitHooksSymbol]!.push(hook);
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
DatabaseSession.prototype.addPostCommitHook = function (hook: () => Promise<void>) {
|
|
31
|
+
if (!this[PostCommitHooksSymbol]) this[PostCommitHooksSymbol] = [];
|
|
32
|
+
this[PostCommitHooksSymbol]!.push(hook);
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
DatabaseSession.prototype.acquireSessionLock = async function (key: MutexKey | MutexKey[]) {
|
|
36
|
+
const flattenedKey = flattenMutexKey(key);
|
|
37
|
+
const adapter = this.adapter as SQLDatabaseAdapter;
|
|
38
|
+
const dialect = getDialect(adapter);
|
|
39
|
+
|
|
40
|
+
if (dialect === 'postgres') {
|
|
41
|
+
// use a transaction-scoped advisory lock — automatically released on commit/rollback
|
|
42
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
43
|
+
const lockQuery = adapter.rawFactory(this as any).create(sql`SELECT pg_advisory_xact_lock(hashtext(${flattenedKey})::bigint)`);
|
|
44
|
+
await lockQuery.find();
|
|
45
|
+
} else {
|
|
46
|
+
// the idea here is to create a new row outside the transaction so that a primary key index lock isn't obtained
|
|
47
|
+
// then we can use an in-transaction row level update so that a row-level lock is acquired
|
|
48
|
+
// this will be automatically released when the transaction is committed or rolled back
|
|
49
|
+
|
|
50
|
+
// insert the lock row outside the transaction on a separate connection
|
|
51
|
+
const insertConn = await adapter.connectionPool.getConnection();
|
|
52
|
+
try {
|
|
53
|
+
await insertConn.run(`INSERT IGNORE INTO _locks (\`key\`) VALUES (?)`, [flattenedKey]);
|
|
54
|
+
} finally {
|
|
55
|
+
insertConn.release();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// update in-transaction to acquire row-level lock
|
|
59
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
60
|
+
const updateQuery = adapter.rawFactory(this as any).create(sql`UPDATE _locks SET lastTouched=NOW() WHERE \`key\` = ${flattenedKey}`);
|
|
61
|
+
await updateQuery.execute();
|
|
62
|
+
}
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
// todo: swapping DatabaseAdapter for SQLDatabaseAdapter, which exposes "platform", seems to break
|
|
66
|
+
// types for reasons TBD
|
|
67
|
+
type QueryClassType<T> = ReceiveType<T> | ClassType<T> | AbstractClassType<T> | ReflectionClass<T>;
|
|
68
|
+
export class BaseDatabase<A extends DatabaseAdapter = DatabaseAdapter> extends Database<A> {
|
|
69
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
70
|
+
constructor(adapter: A, schemas?: (Type | ClassType | ReflectionClass<any>)[]) {
|
|
71
|
+
super(adapter, schemas);
|
|
72
|
+
|
|
73
|
+
// we don't like the default "clone" behavior of the query builder
|
|
74
|
+
// todo: ideally we could keep .clone but only have it actually perform the clone if it's called from outside the lib
|
|
75
|
+
const originalQuery = this.query;
|
|
76
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
77
|
+
(this.query as any) = <T extends OrmEntity>(type: QueryClassType<T>, txn?: DatabaseSession<DatabaseAdapter>) => {
|
|
78
|
+
const result = txn ? txn.query(type) : (originalQuery.apply(this, [type]) as unknown as SQLDatabaseQuery<T>);
|
|
79
|
+
result.clone = () => result;
|
|
80
|
+
return result;
|
|
81
|
+
};
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
// override existing definition
|
|
85
|
+
declare query: <T extends OrmEntity>(type?: QueryClassType<T>, txn?: DatabaseSession<DatabaseAdapter>) => SQLDatabaseQuery<T>;
|
|
86
|
+
|
|
87
|
+
async transaction<T>(callback: (session: DatabaseSession<A>) => Promise<T>): Promise<T> {
|
|
88
|
+
let session_: DatabaseSession<DatabaseAdapter> | undefined;
|
|
89
|
+
const result = await super.transaction(async session => {
|
|
90
|
+
session_ = session;
|
|
91
|
+
session.withIdentityMap = false;
|
|
92
|
+
const result = await callback(session);
|
|
93
|
+
if (session[PreCommitHooksSymbol]) {
|
|
94
|
+
await session.flush();
|
|
95
|
+
for (const hook of session[PreCommitHooksSymbol]!) {
|
|
96
|
+
await hook();
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
return result;
|
|
100
|
+
});
|
|
101
|
+
if (session_?.[PostCommitHooksSymbol]) {
|
|
102
|
+
for (const hook of session_[PostCommitHooksSymbol]!) {
|
|
103
|
+
await hook();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
107
|
+
return result as any; // todo: types
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
async session<T>(worker: (session: DatabaseSession<A>) => Promise<T>): Promise<T> {
|
|
111
|
+
return super.session(async session => {
|
|
112
|
+
session.withIdentityMap = false;
|
|
113
|
+
return worker(session);
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
async withTransaction<R>(txn: DatabaseSession<A> | undefined, callback: (session: DatabaseSession<A>) => Promise<R>): Promise<R> {
|
|
118
|
+
if (txn) {
|
|
119
|
+
return await callback(txn);
|
|
120
|
+
} else {
|
|
121
|
+
return await this.transaction(async txn => callback(txn));
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
async withSession<R>(session: DatabaseSession<A> | undefined, callback: (session: DatabaseSession<A>) => Promise<R>): Promise<R> {
|
|
126
|
+
if (session) {
|
|
127
|
+
return await callback(session);
|
|
128
|
+
} else {
|
|
129
|
+
return await this.session(async session => callback(session));
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
async rawExecute(
|
|
134
|
+
sqlIn: SqlQuery | string,
|
|
135
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
136
|
+
existingSession?: DatabaseSession<any>
|
|
137
|
+
): Promise<{ affectedRows: number; insertId: number; warningStatus: number }> {
|
|
138
|
+
return this.withSession(existingSession, async session => {
|
|
139
|
+
if (!(session.adapter instanceof SQLDatabaseAdapter)) {
|
|
140
|
+
throw new Error('Cannot perform raw query on non-SQL database');
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
// raw queries executed against a session likely expect the data to already be written,
|
|
144
|
+
// so let's flush everything we have already queued up
|
|
145
|
+
if (existingSession) {
|
|
146
|
+
await session.flush();
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
const adapter = session.adapter as SQLDatabaseAdapter;
|
|
150
|
+
const sqlQuery = typeof sqlIn === 'string' ? new SqlQuery([sqlIn]) : sqlIn;
|
|
151
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
152
|
+
const rawQuery = adapter.rawFactory(session as any).create(sqlQuery);
|
|
153
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
154
|
+
return rawQuery.execute() as any;
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
async rawExecuteUnsafe(
|
|
159
|
+
sqlIn: string,
|
|
160
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
161
|
+
bindings: any[],
|
|
162
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
163
|
+
existingSession?: DatabaseSession<any>
|
|
164
|
+
): Promise<{ affectedRows: number; insertId: number; warningStatus: number }> {
|
|
165
|
+
return this.rawExecute(this.createSqlQuery(sqlIn, bindings), existingSession);
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
169
|
+
async rawQuery(sqlIn: SqlQuery | string, existingSession?: DatabaseSession<any>) {
|
|
170
|
+
return this.withSession(existingSession, async session => {
|
|
171
|
+
if (!(session.adapter instanceof SQLDatabaseAdapter)) {
|
|
172
|
+
throw new Error('Cannot perform raw query on non-SQL database');
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
// raw queries executed against a session likely expect the data to already be written,
|
|
176
|
+
// so let's flush everything we have already queued up
|
|
177
|
+
if (existingSession) {
|
|
178
|
+
await session.flush();
|
|
179
|
+
}
|
|
180
|
+
|
|
181
|
+
const adapter = session.adapter as SQLDatabaseAdapter;
|
|
182
|
+
const sqlQuery = typeof sqlIn === 'string' ? new SqlQuery([sqlIn]) : sqlIn;
|
|
183
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
184
|
+
const rawQuery = adapter.rawFactory(session as any).create(sqlQuery);
|
|
185
|
+
return await rawQuery.find();
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
190
|
+
async rawFind<T>(sqlIn: SqlQuery | string, existingSession?: DatabaseSession<any>, type?: ReceiveType<T>): Promise<T[]> {
|
|
191
|
+
const rows = await this.rawQuery(sqlIn, existingSession);
|
|
192
|
+
return type
|
|
193
|
+
? rows.map(row => deserialize<T>(row, undefined, (this.adapter as unknown as SQLDatabaseAdapter).platform.serializer, undefined, type))
|
|
194
|
+
: (rows as T[]);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
198
|
+
async rawFindUnsafe<T>(sqlIn: string, bindings: any[], existingSession?: DatabaseSession<any>, type?: ReceiveType<T>): Promise<T[]> {
|
|
199
|
+
return this.rawFind<T>(this.createSqlQuery(sqlIn, bindings), existingSession, type);
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
203
|
+
async rawFindOne<T>(sqlIn: SqlQuery | string, existingSession?: DatabaseSession<any>, type?: ReceiveType<T>): Promise<T | undefined> {
|
|
204
|
+
const rows = await this.rawFind<T>(sqlIn, existingSession, type);
|
|
205
|
+
return rows[0];
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
209
|
+
async rawFindOneUnsafe<T>(sqlIn: string, bindings: any[], existingSession?: DatabaseSession<any>, type?: ReceiveType<T>): Promise<T | undefined> {
|
|
210
|
+
return this.rawFindOne<T>(this.createSqlQuery(sqlIn, bindings), existingSession, type);
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
214
|
+
createSqlQuery(sqlIn: string, bindings: any[]): SqlQuery {
|
|
215
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
216
|
+
const sqlPieces: TemplateStringsArray = sqlIn.split('?') as any;
|
|
217
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
218
|
+
(sqlPieces as any).raw = sqlIn;
|
|
219
|
+
return sql(sqlPieces, ...bindings);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
type FieldsMatching<T, V> = {
|
|
224
|
+
// eslint-disable-next-line @typescript-eslint/no-unsafe-function-type
|
|
225
|
+
[K in keyof T]: T[K] extends V ? (T[K] extends Function ? never : K) : never;
|
|
226
|
+
}[keyof T];
|
|
227
|
+
export type DataTypes = string | number | boolean | Date | object | null;
|
|
228
|
+
export type EntityFieldKeys<T extends object> = FieldsMatching<T, DataTypes>;
|
|
229
|
+
export type EntityFields<T extends object> = Pick<T, EntityFieldKeys<T>>; // https://github.com/deepkit/deepkit-framework/issues/430
|
|
230
|
+
export type EntityClassFields<T extends ClassType> = Pick<InstanceType<T>, EntityFieldKeys<InstanceType<T>>>;
|
|
231
|
+
|
|
232
|
+
export declare type HasDefault = TypeAnnotation<'dksf:hasDefault'>;
|
|
233
|
+
export type OptionalKeys<T extends object> = ObjectKeysMatching<T, HasDefault> | ObjectKeysMatching<T, null> | ObjectKeysMatching<T, AutoIncrement>;
|
|
234
|
+
export type EntityOptionals<T extends object> = { [K in keyof Pick<T, OptionalKeys<T>>]?: T[K] } & { [K in keyof Omit<T, OptionalKeys<T>>]: T[K] };
|
|
235
|
+
export type NewEntityFields<T extends object> = EntityOptionals<EntityFields<T>>;
|
|
236
|
+
|
|
237
|
+
export function createEntity<D extends T, T extends ActiveRecord = ActiveRecord>(Entity: ClassType<T>, data: NewEntityFields<D>): T {
|
|
238
|
+
const entity = new Entity();
|
|
239
|
+
Object.assign(entity, data);
|
|
240
|
+
|
|
241
|
+
// fill in the nulls and auto-increments
|
|
242
|
+
const type = ReflectionClass.from(Entity);
|
|
243
|
+
for (const property of type.getProperties()) {
|
|
244
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
245
|
+
if ((data as any)[property.name] === undefined) {
|
|
246
|
+
if (property.isAutoIncrement()) {
|
|
247
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
248
|
+
(entity as any)[property.name] = 0;
|
|
249
|
+
} else if (property.isNullable()) {
|
|
250
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
251
|
+
(entity as any)[property.name] = null;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
return entity;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
export function createEntities<D extends T, T extends ActiveRecord = ActiveRecord>(Entity: ClassType<T>, data: NewEntityFields<D>[]): T[] {
|
|
260
|
+
return data.map(d => createEntity(Entity, d));
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
export function createQueuedEntity<D extends T, T extends ActiveRecord = ActiveRecord>(
|
|
264
|
+
Entity: ClassType<T>,
|
|
265
|
+
data: NewEntityFields<D>,
|
|
266
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
267
|
+
session: DatabaseSession<any>
|
|
268
|
+
): T {
|
|
269
|
+
const entity = createEntity(Entity, data);
|
|
270
|
+
session.add(entity);
|
|
271
|
+
return entity;
|
|
272
|
+
}
|
|
273
|
+
|
|
274
|
+
export function createQueuedEntities<D extends T, T extends ActiveRecord = ActiveRecord>(
|
|
275
|
+
Entity: ClassType<T>,
|
|
276
|
+
data: NewEntityFields<D>[],
|
|
277
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
278
|
+
session: DatabaseSession<any>
|
|
279
|
+
): T[] {
|
|
280
|
+
const entities = createEntities(Entity, data);
|
|
281
|
+
session.add(...entities);
|
|
282
|
+
return entities;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
286
|
+
export async function persistEntity<T extends ActiveRecord>(entity: T, session?: DatabaseSession<any>) {
|
|
287
|
+
return persistEntities([entity], session);
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
291
|
+
export async function persistEntities<T extends ActiveRecord>(entities: T[], session?: DatabaseSession<any>) {
|
|
292
|
+
if (session) {
|
|
293
|
+
session.add(...entities);
|
|
294
|
+
await session.flush();
|
|
295
|
+
} else {
|
|
296
|
+
for (const entity of entities) {
|
|
297
|
+
await entity.save();
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
export async function createPersistedEntity<D extends T, T extends ActiveRecord = ActiveRecord>(
|
|
303
|
+
Entity: ClassType<T>,
|
|
304
|
+
data: NewEntityFields<D>,
|
|
305
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
306
|
+
session?: DatabaseSession<any>
|
|
307
|
+
): Promise<T> {
|
|
308
|
+
const entity = createEntity(Entity, data);
|
|
309
|
+
await persistEntity(entity, session);
|
|
310
|
+
return entity;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
export async function createPersistedEntities<D extends T, T extends ActiveRecord = ActiveRecord>(
|
|
314
|
+
Entity: ClassType<T>,
|
|
315
|
+
data: NewEntityFields<D>[],
|
|
316
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
317
|
+
session?: DatabaseSession<any>
|
|
318
|
+
): Promise<T[]> {
|
|
319
|
+
const entities = createEntities(Entity, data);
|
|
320
|
+
await persistEntities(entities, session);
|
|
321
|
+
return entities;
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
const PKFieldCache = new WeakMap<ActiveRecordClassType, string>();
|
|
325
|
+
export function getPKFieldForEntity(EntityClass: ActiveRecordClassType) {
|
|
326
|
+
if (PKFieldCache.has(EntityClass)) return PKFieldCache.get(EntityClass)!;
|
|
327
|
+
const pkField = ReflectionClass.from(EntityClass).getPrimary().name;
|
|
328
|
+
PKFieldCache.set(EntityClass, pkField);
|
|
329
|
+
return pkField;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
333
|
+
export function getPKFieldForEntityInstance(entity: any) {
|
|
334
|
+
if (!(entity instanceof ActiveRecord)) {
|
|
335
|
+
if (typeof entity === 'object' && 'id' in entity) return 'id';
|
|
336
|
+
throw new Error('Entity does not extend ActiveRecord class and does not have "id" field');
|
|
337
|
+
}
|
|
338
|
+
return getPKFieldForEntity(entity.constructor as ActiveRecordClassType);
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
type EntityFilter<T extends ActiveRecordClassType> = FilterQuery<InstanceType<T>> | string | number;
|
|
342
|
+
|
|
343
|
+
function getEntityFilter<T extends ActiveRecordClassType>(EntityClass: T, filter: EntityFilter<T>): FilterQuery<InstanceType<T>> {
|
|
344
|
+
if (typeof filter === 'object') return filter;
|
|
345
|
+
const pkField = getPKFieldForEntity(EntityClass);
|
|
346
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
347
|
+
return { [pkField]: filter } as any;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
export async function getEntityOrUndefined<T extends ActiveRecordClassType>(
|
|
351
|
+
EntityClass: T,
|
|
352
|
+
filter: EntityFilter<T>
|
|
353
|
+
): Promise<InstanceType<T> | undefined> {
|
|
354
|
+
const query: SQLDatabaseQuery<InstanceType<T>> = EntityClass.query();
|
|
355
|
+
const resolvedFilter = getEntityFilter(EntityClass, filter);
|
|
356
|
+
return query.filter(resolvedFilter).findOneOrUndefined();
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
export async function getEntityOr404<T extends ActiveRecordClassType>(EntityClass: T, filter: EntityFilter<T>): Promise<InstanceType<T>> {
|
|
360
|
+
const entity = await getEntityOrUndefined(EntityClass, filter);
|
|
361
|
+
if (!entity) throw new HttpNotFoundError();
|
|
362
|
+
return entity;
|
|
363
|
+
}
|
|
364
|
+
|
|
365
|
+
export async function getEntity<T extends ActiveRecordClassType>(EntityClass: T, filter: EntityFilter<T>): Promise<InstanceType<T>> {
|
|
366
|
+
const entity = await getEntityOrUndefined(EntityClass, filter);
|
|
367
|
+
if (!entity) throw new ItemNotFound();
|
|
368
|
+
return entity;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
export async function entityExists<T extends ActiveRecordClassType>(EntityClass: T, filter: EntityFilter<T>): Promise<boolean> {
|
|
372
|
+
const query: SQLDatabaseQuery<InstanceType<T>> = EntityClass.query();
|
|
373
|
+
const resolvedFilter = getEntityFilter(EntityClass, filter);
|
|
374
|
+
return query.filter(resolvedFilter).has();
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
export function getEntityFields<T extends ActiveRecord>(entity: T): EntityFields<T> {
|
|
378
|
+
return pick(entity, Object.keys(entity)) as EntityFields<T>;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
382
|
+
export function logSql(sql: string, bindings: any[] = []) {
|
|
383
|
+
const logBindings = [...bindings];
|
|
384
|
+
console.log(sql.replace(/\?/g, () => JSON.stringify(logBindings.shift())));
|
|
385
|
+
}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { SQLDatabaseAdapter } from '@deepkit/sql';
|
|
2
|
+
|
|
3
|
+
export type Dialect = 'mysql' | 'postgres';
|
|
4
|
+
|
|
5
|
+
export function getDialect(adapter: SQLDatabaseAdapter): Dialect {
|
|
6
|
+
const name = adapter.getName();
|
|
7
|
+
if (name === 'mysql') return 'mysql';
|
|
8
|
+
if (name === 'postgres') return 'postgres';
|
|
9
|
+
throw new Error(`Unsupported database dialect: ${name}`);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export function quoteId(dialect: Dialect, name: string): string {
|
|
13
|
+
if (dialect === 'mysql') return `\`${name.replace(/`/g, '``')}\``;
|
|
14
|
+
return `"${name.replace(/"/g, '""')}"`;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
export function tableExistsSql(dialect: Dialect, tableName: string, schema = 'public'): string {
|
|
18
|
+
if (dialect === 'mysql') {
|
|
19
|
+
return `SHOW TABLES LIKE '${tableName}'`;
|
|
20
|
+
}
|
|
21
|
+
return `SELECT tablename FROM pg_tables WHERE schemaname = '${schema}' AND tablename = '${tableName}'`;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export function listTablesSql(dialect: Dialect, schema = 'public'): string {
|
|
25
|
+
if (dialect === 'mysql') {
|
|
26
|
+
return `SHOW TABLES`;
|
|
27
|
+
}
|
|
28
|
+
return `SELECT tablename FROM pg_tables WHERE schemaname = '${schema}'`;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function listDatabasesSql(dialect: Dialect): string {
|
|
32
|
+
if (dialect === 'mysql') {
|
|
33
|
+
return `SHOW DATABASES`;
|
|
34
|
+
}
|
|
35
|
+
return `SELECT datname AS "Database" FROM pg_database WHERE datistemplate = false`;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function currentDatabaseSql(dialect: Dialect): string {
|
|
39
|
+
if (dialect === 'mysql') {
|
|
40
|
+
return `SELECT DATABASE()`;
|
|
41
|
+
}
|
|
42
|
+
return `SELECT current_database()`;
|
|
43
|
+
}
|