@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,285 @@
|
|
|
1
|
+
import { getClassTypeFromInstance } from '@deepkit/core';
|
|
2
|
+
import {
|
|
3
|
+
ActiveRecord,
|
|
4
|
+
ActiveRecordClassType,
|
|
5
|
+
Database,
|
|
6
|
+
DatabaseAdapter,
|
|
7
|
+
DatabaseSession,
|
|
8
|
+
FilterQuery,
|
|
9
|
+
getClassState,
|
|
10
|
+
getInstanceState,
|
|
11
|
+
getInstanceStateFromItem
|
|
12
|
+
} from '@deepkit/orm';
|
|
13
|
+
import { SQLDatabaseAdapter } from '@deepkit/sql';
|
|
14
|
+
import { ReflectionClass } from '@deepkit/type';
|
|
15
|
+
import { compact, groupBy, keyBy, uniq } from 'lodash';
|
|
16
|
+
|
|
17
|
+
import { EntityClassFields, EntityFields, getPKFieldForEntity, getPKFieldForEntityInstance } from './common';
|
|
18
|
+
|
|
19
|
+
export function getDirtyDetails<T extends ActiveRecord, K extends keyof T>(entity: T): Record<K, { original: T[K]; current: T[K] }> {
|
|
20
|
+
const classState = getClassState(ReflectionClass.from(getClassTypeFromInstance(entity)));
|
|
21
|
+
const instanceState = getInstanceState(classState, entity);
|
|
22
|
+
const lastSnapshot = instanceState.getSnapshot();
|
|
23
|
+
const currentSnapshot = classState.snapshot(entity);
|
|
24
|
+
const changeSet = classState.changeDetector(lastSnapshot, currentSnapshot, entity);
|
|
25
|
+
const changedFields = Object.keys(changeSet?.$set || {});
|
|
26
|
+
return Object.fromEntries(
|
|
27
|
+
changedFields.map(f => [
|
|
28
|
+
f,
|
|
29
|
+
{
|
|
30
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
31
|
+
original: (lastSnapshot as any)[f],
|
|
32
|
+
current: currentSnapshot[f]
|
|
33
|
+
}
|
|
34
|
+
])
|
|
35
|
+
) as Record<K, { original: T[K]; current: T[K] }>;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function revertDirtyEntity(entity: ActiveRecord) {
|
|
39
|
+
const original = getEntityOriginal(entity);
|
|
40
|
+
for (const [field, value] of Object.entries(original)) {
|
|
41
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
42
|
+
(entity as any)[field] = value;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export function getDirtyFields<T extends ActiveRecord>(entity: T): (keyof T)[] {
|
|
47
|
+
return Object.keys(getDirtyDetails(entity)) as (keyof T)[];
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
export function isEntityDirty(entity: ActiveRecord) {
|
|
51
|
+
return getDirtyFields(entity).length > 0;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function isFieldDirty<T extends ActiveRecord>(entity: T, field: keyof T) {
|
|
55
|
+
return getDirtyFields(entity).includes(field);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function getFieldOriginal<T extends ActiveRecord, K extends keyof T>(entity: T, field: K): T[K] | undefined {
|
|
59
|
+
const dirtyDetails = getDirtyDetails(entity);
|
|
60
|
+
const fieldDetails = dirtyDetails[field] as { original: T[K]; current: T[K] } | undefined;
|
|
61
|
+
return fieldDetails?.original;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export function getEntityOriginal<T extends ActiveRecord>(entity: T): EntityFields<T> {
|
|
65
|
+
return getInstanceStateFromItem(entity).getSnapshot() as EntityFields<T>;
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
export class BaseEntity extends ActiveRecord {}
|
|
69
|
+
|
|
70
|
+
export type EntityPick<T extends ActiveRecord, K extends keyof EntityFields<T>> = ActiveRecord & Pick<T, K>;
|
|
71
|
+
|
|
72
|
+
interface IGetEntityOptions<Schema extends ActiveRecordClassType, Field extends keyof EntityClassFields<Schema>> {
|
|
73
|
+
schema: Schema;
|
|
74
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
75
|
+
ids: any[];
|
|
76
|
+
keyField?: Field;
|
|
77
|
+
fields?: Field[];
|
|
78
|
+
filter?: FilterQuery<InstanceType<Schema>>;
|
|
79
|
+
txn?: DatabaseSession<DatabaseAdapter>;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export async function getKeyedEntities<Schema extends ActiveRecordClassType, Fields extends keyof EntityClassFields<Schema>>(
|
|
83
|
+
options: IGetEntityOptions<Schema, Fields>
|
|
84
|
+
) {
|
|
85
|
+
const { keyField, entities } = await getEntitiesByIdWithKeyName(options);
|
|
86
|
+
return keyBy(entities, keyField);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export async function getKeyedGroupedEntities<Schema extends ActiveRecordClassType, Fields extends keyof EntityClassFields<Schema>>(
|
|
90
|
+
options: IGetEntityOptions<Schema, Fields>
|
|
91
|
+
) {
|
|
92
|
+
const { keyField, entities } = await getEntitiesByIdWithKeyName(options);
|
|
93
|
+
return groupBy(entities, keyField);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
export async function getEntitiesById<Schema extends ActiveRecordClassType, Fields extends keyof EntityClassFields<Schema>>(
|
|
97
|
+
options: IGetEntityOptions<Schema, Fields>
|
|
98
|
+
) {
|
|
99
|
+
const { entities } = await getEntitiesByIdWithKeyName(options);
|
|
100
|
+
return entities;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
export async function getEntitiesByIdWithKeyName<Schema extends ActiveRecordClassType, Fields extends keyof EntityClassFields<Schema>>({
|
|
104
|
+
schema,
|
|
105
|
+
ids,
|
|
106
|
+
keyField,
|
|
107
|
+
fields,
|
|
108
|
+
filter,
|
|
109
|
+
txn
|
|
110
|
+
}: IGetEntityOptions<Schema, Fields>) {
|
|
111
|
+
type ReturnType = typeof fields extends undefined ? InstanceType<Schema> : EntityPick<InstanceType<Schema>, Fields>;
|
|
112
|
+
|
|
113
|
+
const db: Database<SQLDatabaseAdapter> = schema.getDatabase();
|
|
114
|
+
const resolvedKeyField = keyField ?? getPKFieldForEntity(schema);
|
|
115
|
+
|
|
116
|
+
ids = uniq(compact(ids));
|
|
117
|
+
if (!ids.length) {
|
|
118
|
+
return {
|
|
119
|
+
keyField: resolvedKeyField,
|
|
120
|
+
entities: [] as ReturnType[]
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
const query = txn ? txn.query(schema) : db.query(schema);
|
|
125
|
+
|
|
126
|
+
const entities = fields
|
|
127
|
+
? await query
|
|
128
|
+
.filter({ [resolvedKeyField]: { $in: ids }, ...filter })
|
|
129
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
130
|
+
.select(...(fields as any))
|
|
131
|
+
.find()
|
|
132
|
+
: await query.filter({ [resolvedKeyField]: { $in: ids }, ...filter }).find();
|
|
133
|
+
|
|
134
|
+
return {
|
|
135
|
+
keyField: resolvedKeyField,
|
|
136
|
+
entities: entities as ReturnType[]
|
|
137
|
+
};
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
interface IResolveRelatedOptions<
|
|
141
|
+
Schema extends ActiveRecord,
|
|
142
|
+
IdKey extends keyof EntityFields<Schema>,
|
|
143
|
+
RelatedSchema extends ActiveRecordClassType,
|
|
144
|
+
RelatedKey extends string,
|
|
145
|
+
RelatedFields extends keyof EntityClassFields<RelatedSchema>
|
|
146
|
+
> {
|
|
147
|
+
src: Schema[];
|
|
148
|
+
srcIdField: IdKey;
|
|
149
|
+
targetField: RelatedKey;
|
|
150
|
+
targetSchema: RelatedSchema;
|
|
151
|
+
targetFields?: RelatedFields[];
|
|
152
|
+
txn?: DatabaseSession<DatabaseAdapter>;
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
export async function resolveRelated<
|
|
156
|
+
Schema extends ActiveRecord,
|
|
157
|
+
IdKey extends keyof EntityFields<Schema>,
|
|
158
|
+
RelatedSchema extends ActiveRecordClassType,
|
|
159
|
+
RelatedKey extends string,
|
|
160
|
+
RelatedFields extends keyof EntityClassFields<RelatedSchema>
|
|
161
|
+
>(options: IResolveRelatedOptions<Schema, IdKey, RelatedSchema, RelatedKey, RelatedFields>) {
|
|
162
|
+
const { src, srcIdField, targetField, targetSchema, targetFields } = options;
|
|
163
|
+
|
|
164
|
+
type RelatedType = typeof targetFields extends undefined ? InstanceType<RelatedSchema> : EntityPick<InstanceType<RelatedSchema>, RelatedFields>;
|
|
165
|
+
type RelatedFieldType = null extends Schema[IdKey] ? { [K in RelatedKey]?: RelatedType } : { [K in RelatedKey]: RelatedType };
|
|
166
|
+
type ReturnType = Omit<Schema, IdKey> & RelatedFieldType;
|
|
167
|
+
|
|
168
|
+
if (!src.length) {
|
|
169
|
+
return [] as ReturnType[];
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
const subentitiesById = await getKeyedEntities({
|
|
173
|
+
ids: src.map(e => e[srcIdField]),
|
|
174
|
+
schema: targetSchema,
|
|
175
|
+
fields: targetFields,
|
|
176
|
+
txn: options.txn
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
src.forEach(e => {
|
|
180
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
181
|
+
(e as any)[targetField] = subentitiesById[e[srcIdField] as any];
|
|
182
|
+
});
|
|
183
|
+
|
|
184
|
+
return src as ReturnType[];
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
interface IResolveRelatedByPivotOptions<
|
|
188
|
+
Schema extends object,
|
|
189
|
+
SrcIdField extends keyof EntityFields<Schema>,
|
|
190
|
+
PivotSchema extends ActiveRecordClassType,
|
|
191
|
+
PivotIdKey extends keyof EntityClassFields<PivotSchema>,
|
|
192
|
+
PivotRelatedKey extends keyof EntityClassFields<PivotSchema>,
|
|
193
|
+
RelatedSchema extends ActiveRecordClassType,
|
|
194
|
+
RelatedKey extends string,
|
|
195
|
+
RelatedFields extends keyof EntityClassFields<RelatedSchema>
|
|
196
|
+
> {
|
|
197
|
+
src: Schema[];
|
|
198
|
+
srcIdField?: SrcIdField;
|
|
199
|
+
pivotSchema: PivotSchema;
|
|
200
|
+
pivotIdKey: PivotIdKey;
|
|
201
|
+
pivotRelatedKey: PivotRelatedKey;
|
|
202
|
+
pivotFilter?: FilterQuery<InstanceType<PivotSchema>>;
|
|
203
|
+
targetField: RelatedKey;
|
|
204
|
+
targetSchema: RelatedSchema;
|
|
205
|
+
targetFields?: RelatedFields[];
|
|
206
|
+
txn?: DatabaseSession<DatabaseAdapter>;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
export async function resolveRelatedByPivot<
|
|
210
|
+
Schema extends object,
|
|
211
|
+
SrcIdField extends keyof EntityFields<Schema>,
|
|
212
|
+
PivotSchema extends ActiveRecordClassType,
|
|
213
|
+
PivotIdKey extends keyof EntityClassFields<PivotSchema>,
|
|
214
|
+
PivotRelatedKey extends keyof EntityClassFields<PivotSchema>,
|
|
215
|
+
RelatedSchema extends ActiveRecordClassType,
|
|
216
|
+
RelatedKey extends string,
|
|
217
|
+
RelatedFields extends keyof EntityClassFields<RelatedSchema>
|
|
218
|
+
>(options: IResolveRelatedByPivotOptions<Schema, SrcIdField, PivotSchema, PivotIdKey, PivotRelatedKey, RelatedSchema, RelatedKey, RelatedFields>) {
|
|
219
|
+
const { src, srcIdField, pivotSchema, pivotIdKey, pivotRelatedKey, pivotFilter, targetField, targetSchema, targetFields } = options;
|
|
220
|
+
|
|
221
|
+
type RelatedType = typeof targetFields extends undefined ? InstanceType<RelatedSchema> : EntityPick<InstanceType<RelatedSchema>, RelatedFields>;
|
|
222
|
+
type RelatedTypeWithPivot = RelatedType & { pivot: InstanceType<PivotSchema> };
|
|
223
|
+
type RelatedFieldType = { [K in RelatedKey]: RelatedTypeWithPivot[] };
|
|
224
|
+
type ReturnType = Schema & RelatedFieldType;
|
|
225
|
+
|
|
226
|
+
if (!src.length) {
|
|
227
|
+
return [] as ReturnType[];
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const sourcePkField = srcIdField ?? getPKFieldForEntityInstance(src[0]);
|
|
231
|
+
const pivotEntitiesBySourceId = await getKeyedGroupedEntities({
|
|
232
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
233
|
+
ids: src.map(e => (e as any)[sourcePkField as any]),
|
|
234
|
+
schema: pivotSchema,
|
|
235
|
+
keyField: pivotIdKey,
|
|
236
|
+
filter: pivotFilter,
|
|
237
|
+
txn: options.txn
|
|
238
|
+
});
|
|
239
|
+
|
|
240
|
+
const relatedEntitiesById = await getKeyedEntities({
|
|
241
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
242
|
+
ids: Object.values(pivotEntitiesBySourceId).flatMap(p => p.map(p => (p as any)[pivotRelatedKey])),
|
|
243
|
+
schema: targetSchema,
|
|
244
|
+
fields: targetFields,
|
|
245
|
+
txn: options.txn
|
|
246
|
+
});
|
|
247
|
+
|
|
248
|
+
src.forEach(e => {
|
|
249
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
250
|
+
(e as any)[targetField] =
|
|
251
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
252
|
+
pivotEntitiesBySourceId[(e as any)[sourcePkField as any]]?.map(p => ({
|
|
253
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
254
|
+
...relatedEntitiesById[(p as any)[pivotRelatedKey]],
|
|
255
|
+
pivot: p
|
|
256
|
+
})) ?? [];
|
|
257
|
+
});
|
|
258
|
+
|
|
259
|
+
return src as ReturnType[];
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
export async function resolveRelatedByPivotForOne<
|
|
263
|
+
Schema extends object,
|
|
264
|
+
SrcIdField extends keyof EntityFields<Schema>,
|
|
265
|
+
PivotSchema extends ActiveRecordClassType,
|
|
266
|
+
PivotIdKey extends keyof EntityClassFields<PivotSchema>,
|
|
267
|
+
PivotRelatedKey extends keyof EntityClassFields<PivotSchema>,
|
|
268
|
+
RelatedSchema extends ActiveRecordClassType,
|
|
269
|
+
RelatedKey extends string,
|
|
270
|
+
RelatedFields extends keyof EntityClassFields<RelatedSchema>
|
|
271
|
+
>(
|
|
272
|
+
options: Omit<
|
|
273
|
+
IResolveRelatedByPivotOptions<Schema, SrcIdField, PivotSchema, PivotIdKey, PivotRelatedKey, RelatedSchema, RelatedKey, RelatedFields>,
|
|
274
|
+
'src'
|
|
275
|
+
> & {
|
|
276
|
+
src: Schema;
|
|
277
|
+
}
|
|
278
|
+
) {
|
|
279
|
+
return (
|
|
280
|
+
await resolveRelatedByPivot({
|
|
281
|
+
...options,
|
|
282
|
+
src: [options.src]
|
|
283
|
+
})
|
|
284
|
+
)[0];
|
|
285
|
+
}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import { cli } from '@deepkit/app';
|
|
2
|
+
import { SQLDatabaseAdapter } from '@deepkit/sql';
|
|
3
|
+
import { existsSync, mkdirSync, readdirSync, unlinkSync, writeFileSync } from 'fs';
|
|
4
|
+
import path from 'path';
|
|
5
|
+
|
|
6
|
+
import { DBProvider } from '../../app/state';
|
|
7
|
+
import { getAppConfig } from '../../app/resolver';
|
|
8
|
+
import { createLogger } from '../../services';
|
|
9
|
+
import { getDialect } from '../dialect';
|
|
10
|
+
import { getSourceMigrationsDir } from './helpers';
|
|
11
|
+
import { readEntitiesSchema } from './create/entity-reader';
|
|
12
|
+
import { generateDDL } from './create/ddl-generator';
|
|
13
|
+
import { buildFileContent } from './create/file-generator';
|
|
14
|
+
import { SchemaDiff } from './create/schema-model';
|
|
15
|
+
|
|
16
|
+
@cli.controller('migration:reset')
|
|
17
|
+
export class MigrationResetCommand {
|
|
18
|
+
private logger = createLogger('MigrationReset');
|
|
19
|
+
private migrationsDir = getSourceMigrationsDir();
|
|
20
|
+
|
|
21
|
+
constructor(private dbProvider: DBProvider) {}
|
|
22
|
+
|
|
23
|
+
async execute() {
|
|
24
|
+
// Step 1: Ensure migrations directory exists
|
|
25
|
+
if (!existsSync(this.migrationsDir)) {
|
|
26
|
+
this.logger.info(`Creating migrations directory: ${this.migrationsDir}`);
|
|
27
|
+
mkdirSync(this.migrationsDir, { recursive: true });
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Step 2: Remove all .ts files from migrations directory
|
|
31
|
+
const files = readdirSync(this.migrationsDir).filter(f => f.endsWith('.ts'));
|
|
32
|
+
this.logger.info(`Removing ${files.length} migration file(s)`);
|
|
33
|
+
for (const file of files) {
|
|
34
|
+
const filePath = path.join(this.migrationsDir, file);
|
|
35
|
+
unlinkSync(filePath);
|
|
36
|
+
this.logger.info(`Removed ${file}`);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Step 3: Read entity schema from code definitions
|
|
40
|
+
const db = this.dbProvider.db;
|
|
41
|
+
const dialect = getDialect(db.adapter as SQLDatabaseAdapter);
|
|
42
|
+
const pgSchema = dialect === 'postgres' ? (getAppConfig().PG_SCHEMA ?? 'public') : 'public';
|
|
43
|
+
|
|
44
|
+
this.logger.info('Reading entity definitions...');
|
|
45
|
+
const entitySchema = readEntitiesSchema(db, dialect);
|
|
46
|
+
const tables = Array.from(entitySchema.values());
|
|
47
|
+
this.logger.info(`Found ${tables.length} entity table(s)`);
|
|
48
|
+
|
|
49
|
+
// Step 4: Generate DDL by treating all entity tables as "added"
|
|
50
|
+
const diff: SchemaDiff = {
|
|
51
|
+
dialect,
|
|
52
|
+
pgSchema: dialect === 'postgres' ? pgSchema : undefined,
|
|
53
|
+
addedTables: tables,
|
|
54
|
+
removedTables: [],
|
|
55
|
+
modifiedTables: []
|
|
56
|
+
};
|
|
57
|
+
const statements = generateDDL(diff);
|
|
58
|
+
|
|
59
|
+
if (statements.length === 0) {
|
|
60
|
+
this.logger.info('No tables found to generate base migration.');
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Step 6: Write migration file
|
|
65
|
+
const migrationContent = buildFileContent(statements);
|
|
66
|
+
const migrationPath = path.join(this.migrationsDir, '00000000_000000_base.ts');
|
|
67
|
+
|
|
68
|
+
writeFileSync(migrationPath, migrationContent, 'utf8');
|
|
69
|
+
this.logger.info(`Created initial migration: ${migrationPath}`);
|
|
70
|
+
this.logger.info(`Migration reset complete with ${tables.length} table(s)`);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
import { cli } from '@deepkit/app';
|
|
2
|
+
import { SQLDatabaseAdapter } from '@deepkit/sql';
|
|
3
|
+
import { existsSync, readdirSync } from 'fs';
|
|
4
|
+
import { difference } from 'lodash';
|
|
5
|
+
import path from 'path';
|
|
6
|
+
|
|
7
|
+
import { DBProvider, globalState } from '../../app/state';
|
|
8
|
+
import { createLogger } from '../../services';
|
|
9
|
+
import { WorkerQueueRegistry } from '../../services/worker/queue';
|
|
10
|
+
import { createPersistedEntity } from '../common';
|
|
11
|
+
import { getDialect, tableExistsSql } from '../dialect';
|
|
12
|
+
import { getMigrationsDir } from './helpers';
|
|
13
|
+
import { MigrationEntity } from './migration.entity';
|
|
14
|
+
|
|
15
|
+
@cli.controller('migration:run')
|
|
16
|
+
export class MigrationRunCommand {
|
|
17
|
+
private logger = createLogger('Migrator');
|
|
18
|
+
private migrationsDir = getMigrationsDir();
|
|
19
|
+
|
|
20
|
+
constructor(private dbProvider: DBProvider) {}
|
|
21
|
+
|
|
22
|
+
async execute() {
|
|
23
|
+
if (!existsSync(this.migrationsDir)) {
|
|
24
|
+
throw new Error('Migrations directory does not exist');
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
const migrations = readdirSync(this.migrationsDir)
|
|
28
|
+
.filter(f => /\.[jt]s$/.test(f))
|
|
29
|
+
.map(f => f.replace(/\.[jt]s$/, ''));
|
|
30
|
+
migrations.sort();
|
|
31
|
+
this.logger.info(`${migrations.length} migrations found in package`);
|
|
32
|
+
|
|
33
|
+
await this.createMigrationsTableIfNotExists();
|
|
34
|
+
|
|
35
|
+
this.dbProvider.db.registerEntity(MigrationEntity);
|
|
36
|
+
|
|
37
|
+
const executedMigrations = await MigrationEntity.query().select('name').findField('name');
|
|
38
|
+
const unexecutedMigrations = difference(migrations, executedMigrations);
|
|
39
|
+
this.logger.info(`${executedMigrations.length} migrations previously executed`);
|
|
40
|
+
this.logger.info(`${unexecutedMigrations.length} migrations to run`);
|
|
41
|
+
|
|
42
|
+
const executedAt = new Date();
|
|
43
|
+
|
|
44
|
+
for (const migration of unexecutedMigrations) {
|
|
45
|
+
const startTs = Date.now();
|
|
46
|
+
this.logger.info(`Running migration: ${migration}`);
|
|
47
|
+
|
|
48
|
+
await this.runCodeMigration(migration);
|
|
49
|
+
|
|
50
|
+
this.logger.info(`Completed migration: ${migration}`);
|
|
51
|
+
await createPersistedEntity(MigrationEntity, {
|
|
52
|
+
executedAt,
|
|
53
|
+
name: migration,
|
|
54
|
+
durationMs: Date.now() - startTs
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// this may seem out of place but it makes sense to do during a migration, since
|
|
59
|
+
// the application is about to start and will re-register all jobs with the new schedule
|
|
60
|
+
if (globalState.enableWorker) {
|
|
61
|
+
const queue = WorkerQueueRegistry.getDefaultQueue();
|
|
62
|
+
const repeatableJobs = await queue.getRepeatableJobs();
|
|
63
|
+
for (const job of repeatableJobs) {
|
|
64
|
+
this.logger.info('Removing repeatable job', { job: { name: job.name, key: job.key } });
|
|
65
|
+
await queue.removeRepeatableByKey(job.key);
|
|
66
|
+
}
|
|
67
|
+
await WorkerQueueRegistry.closeQueues();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
async createMigrationsTableIfNotExists() {
|
|
72
|
+
const dialect = getDialect(this.dbProvider.db.adapter as SQLDatabaseAdapter);
|
|
73
|
+
const tableInfoRows = await this.dbProvider.db.rawQuery(tableExistsSql(dialect, '_migrations'));
|
|
74
|
+
if (tableInfoRows.length) return;
|
|
75
|
+
|
|
76
|
+
if (dialect === 'postgres') {
|
|
77
|
+
await this.dbProvider.db.rawQuery(`
|
|
78
|
+
CREATE TABLE "_migrations" (
|
|
79
|
+
"name" varchar(255) NOT NULL PRIMARY KEY,
|
|
80
|
+
"executedAt" timestamp NOT NULL,
|
|
81
|
+
"durationMs" integer NOT NULL
|
|
82
|
+
)
|
|
83
|
+
`);
|
|
84
|
+
} else {
|
|
85
|
+
await this.dbProvider.db.rawQuery(`
|
|
86
|
+
CREATE TABLE _migrations (
|
|
87
|
+
name varchar(255) NOT NULL,
|
|
88
|
+
executedAt datetime NOT NULL,
|
|
89
|
+
durationMs int unsigned NOT NULL,
|
|
90
|
+
PRIMARY KEY (name)
|
|
91
|
+
) ENGINE=InnoDB
|
|
92
|
+
`);
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
async runCodeMigration(file: string) {
|
|
97
|
+
let migrationModule;
|
|
98
|
+
|
|
99
|
+
try {
|
|
100
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
101
|
+
migrationModule = require(path.join(process.cwd(), this.migrationsDir, file));
|
|
102
|
+
} catch (err) {
|
|
103
|
+
this.logger.error('Failed to load migration', { file });
|
|
104
|
+
throw err;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
if (!('default' in migrationModule) || typeof migrationModule.default !== 'function') {
|
|
108
|
+
throw new Error(`Migration ${file} does not export a function`);
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
try {
|
|
112
|
+
await migrationModule.default(this.dbProvider.db);
|
|
113
|
+
} catch (err) {
|
|
114
|
+
this.logger.error('Migration function failed to execute', err, { file });
|
|
115
|
+
throw err;
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { cli } from '@deepkit/app';
|
|
2
|
+
import { SQLDatabaseAdapter } from '@deepkit/sql';
|
|
3
|
+
|
|
4
|
+
import { DBProvider } from '../../app/state';
|
|
5
|
+
import { BaseDatabase } from '../common';
|
|
6
|
+
import { getDialect } from '../dialect';
|
|
7
|
+
|
|
8
|
+
interface ICollationOptions {
|
|
9
|
+
charset?: string;
|
|
10
|
+
collation?: string;
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
const DEFAULT_CHARSET = 'utf8mb4';
|
|
14
|
+
const DEFAULT_COLLATION = 'utf8mb4_0900_ai_ci';
|
|
15
|
+
|
|
16
|
+
export async function standardizeDbCollation(db: BaseDatabase, options?: ICollationOptions) {
|
|
17
|
+
const dialect = getDialect(db.adapter as SQLDatabaseAdapter);
|
|
18
|
+
if (dialect === 'postgres') {
|
|
19
|
+
console.warn('standardizeDbCollation is not applicable to PostgreSQL — skipping');
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
const charset = options?.charset ?? DEFAULT_CHARSET;
|
|
24
|
+
const collation = options?.collation ?? DEFAULT_COLLATION;
|
|
25
|
+
|
|
26
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
27
|
+
const dbNameResult: any[] = await db.rawQuery('SELECT DATABASE()');
|
|
28
|
+
const dbName = Object.values(dbNameResult[0])[0];
|
|
29
|
+
|
|
30
|
+
await db.rawQuery(`ALTER DATABASE ${dbName} CHARACTER SET = ${charset} COLLATE = ${collation}`);
|
|
31
|
+
|
|
32
|
+
const tablesResult = await db.rawQuery('SHOW TABLES');
|
|
33
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
34
|
+
const tables = tablesResult.map((row: any) => Object.values(row)[0]);
|
|
35
|
+
|
|
36
|
+
for (const table of tables) {
|
|
37
|
+
await db.rawQuery(`ALTER TABLE ${table} CONVERT TO CHARACTER SET ${charset} COLLATE ${collation}`);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
@cli.controller('migration:characters')
|
|
42
|
+
export class MigrationCharactersCommand {
|
|
43
|
+
constructor(private dbProvider: DBProvider) {}
|
|
44
|
+
|
|
45
|
+
async execute(charset: string = DEFAULT_CHARSET, collation: string = DEFAULT_COLLATION) {
|
|
46
|
+
const dialect = getDialect(this.dbProvider.db.adapter as SQLDatabaseAdapter);
|
|
47
|
+
if (dialect === 'postgres') {
|
|
48
|
+
console.warn('Character set standardization is not applicable to PostgreSQL');
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
await standardizeDbCollation(this.dbProvider.db, { charset, collation });
|
|
52
|
+
}
|
|
53
|
+
}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { cli, Flag } from '@deepkit/app';
|
|
2
|
+
import { SQLDatabaseAdapter } from '@deepkit/sql';
|
|
3
|
+
|
|
4
|
+
import { DBProvider } from '../../../app/state';
|
|
5
|
+
import { getAppConfig } from '../../../app/resolver';
|
|
6
|
+
import { createLogger, pinoLogger } from '../../../services';
|
|
7
|
+
import { getDialect } from '../../dialect';
|
|
8
|
+
import { readEntitiesSchema } from './entity-reader';
|
|
9
|
+
import { readAllTableNames, readDatabaseSchema } from './db-reader';
|
|
10
|
+
import { compareSchemas } from './comparator';
|
|
11
|
+
import { generateDDL } from './ddl-generator';
|
|
12
|
+
import { generateMigrationFile } from './file-generator';
|
|
13
|
+
import { promptMigrationDescription, setNonInteractive } from './prompt';
|
|
14
|
+
import { INTERNAL_TABLES } from './schema-model';
|
|
15
|
+
|
|
16
|
+
@cli.controller('migration:create')
|
|
17
|
+
export class MigrationCreateCommand {
|
|
18
|
+
private logger = createLogger('MigrationCreate');
|
|
19
|
+
|
|
20
|
+
constructor(private dbProvider: DBProvider) {}
|
|
21
|
+
|
|
22
|
+
async execute(nonInteractive: boolean & Flag<{ description: 'Skip interactive prompts' }> = false) {
|
|
23
|
+
if (nonInteractive) {
|
|
24
|
+
setNonInteractive(true);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
try {
|
|
28
|
+
const db = this.dbProvider.db;
|
|
29
|
+
const dialect = getDialect(db.adapter as SQLDatabaseAdapter);
|
|
30
|
+
const pgSchema = dialect === 'postgres' ? (getAppConfig().PG_SCHEMA ?? 'public') : 'public';
|
|
31
|
+
|
|
32
|
+
this.logger.info(`Dialect: ${dialect}`);
|
|
33
|
+
|
|
34
|
+
// Step 1: Read entity schema
|
|
35
|
+
this.logger.info('Reading entity definitions...');
|
|
36
|
+
const entitySchema = readEntitiesSchema(db, dialect);
|
|
37
|
+
const entityTableNames = Array.from(entitySchema.keys());
|
|
38
|
+
this.logger.info(`Found ${entityTableNames.length} entity table(s): ${entityTableNames.join(', ')}`);
|
|
39
|
+
|
|
40
|
+
// Step 2: Discover all DB tables and union with entity table names
|
|
41
|
+
const allDbTableNames = await readAllTableNames(db, dialect, pgSchema);
|
|
42
|
+
const dbOnlyTables = allDbTableNames.filter(n => !entitySchema.has(n) && !INTERNAL_TABLES.has(n));
|
|
43
|
+
const tableNames = [...entityTableNames, ...dbOnlyTables];
|
|
44
|
+
|
|
45
|
+
// Step 3: Read database schema
|
|
46
|
+
this.logger.info('Reading database schema...');
|
|
47
|
+
const dbSchema = await readDatabaseSchema(db, dialect, tableNames, pgSchema);
|
|
48
|
+
|
|
49
|
+
// Step 4: Compare schemas
|
|
50
|
+
this.logger.info('Comparing schemas...');
|
|
51
|
+
const diff = await compareSchemas(entitySchema, dbSchema, dialect, !nonInteractive, pgSchema);
|
|
52
|
+
|
|
53
|
+
// Step 5: Generate DDL
|
|
54
|
+
const statements = generateDDL(diff);
|
|
55
|
+
|
|
56
|
+
if (statements.length === 0) {
|
|
57
|
+
this.logger.info('No schema changes detected.');
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
// Step 6: Show summary
|
|
62
|
+
this.logger.info(`\nChanges detected:`);
|
|
63
|
+
if (diff.addedTables.length > 0) {
|
|
64
|
+
this.logger.info(` Added tables: ${diff.addedTables.map(t => t.name).join(', ')}`);
|
|
65
|
+
}
|
|
66
|
+
if (diff.removedTables.length > 0) {
|
|
67
|
+
this.logger.info(` Removed tables: ${diff.removedTables.map(t => t.name).join(', ')}`);
|
|
68
|
+
}
|
|
69
|
+
for (const table of diff.modifiedTables) {
|
|
70
|
+
const changes: string[] = [];
|
|
71
|
+
if (table.addedColumns.length > 0) changes.push(`+${table.addedColumns.length} cols`);
|
|
72
|
+
if (table.removedColumns.length > 0) changes.push(`-${table.removedColumns.length} cols`);
|
|
73
|
+
if (table.modifiedColumns.length > 0) changes.push(`~${table.modifiedColumns.length} cols`);
|
|
74
|
+
if (table.renamedColumns.length > 0) changes.push(`${table.renamedColumns.length} renamed`);
|
|
75
|
+
if (table.addedIndexes.length > 0) changes.push(`+${table.addedIndexes.length} idx`);
|
|
76
|
+
if (table.removedIndexes.length > 0) changes.push(`-${table.removedIndexes.length} idx`);
|
|
77
|
+
if (table.primaryKeyChanged) changes.push('PK changed');
|
|
78
|
+
this.logger.info(` ${table.tableName}: ${changes.join(', ')}`);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
this.logger.info(`\nDDL statements (${statements.length}):`);
|
|
82
|
+
for (const stmt of statements) {
|
|
83
|
+
this.logger.info(` ${stmt}`);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
// Step 7: Prompt for description and generate file
|
|
87
|
+
pinoLogger.flush();
|
|
88
|
+
await new Promise(resolve => setTimeout(resolve, 100));
|
|
89
|
+
const description = await promptMigrationDescription();
|
|
90
|
+
const filePath = generateMigrationFile(statements, description);
|
|
91
|
+
this.logger.info(`\nMigration file created: ${filePath}`);
|
|
92
|
+
} finally {
|
|
93
|
+
setNonInteractive(false);
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
}
|