@signal24/dk-server-foundation 26.213.615
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/.gitattributes +2 -0
- package/.gitlab-ci.yml +49 -0
- package/.oxlintrc.json +40 -0
- package/.prettierignore +3 -0
- package/.prettierrc.json +15 -0
- package/.serena/project.yml +111 -0
- package/.vscode/launch.json +15 -0
- package/.vscode/settings.json +12 -0
- package/.yarnrc.yml +5 -0
- package/CLAUDE.md +279 -0
- package/LICENSE +21 -0
- package/README.md +439 -0
- package/TEST_MIGRATION_GUIDE.md +348 -0
- package/dist/resources/proto/generated/test/test.d.ts +224 -0
- package/dist/resources/proto/generated/test/test.d.ts.map +1 -0
- package/dist/resources/proto/generated/test/test.js +2376 -0
- package/dist/resources/proto/generated/test/test.js.map +1 -0
- package/dist/src/app/base.d.ts +37 -0
- package/dist/src/app/base.d.ts.map +1 -0
- package/dist/src/app/base.js +244 -0
- package/dist/src/app/base.js.map +1 -0
- package/dist/src/app/config.d.ts +91 -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 +6 -0
- package/dist/src/app/dev.d.ts.map +1 -0
- package/dist/src/app/dev.js +78 -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 +359 -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 +91 -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 +11 -0
- package/dist/src/database/migration/MigrationResetCommand.d.ts.map +1 -0
- package/dist/src/database/migration/MigrationResetCommand.js +149 -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 +104 -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 +408 -0
- package/dist/src/database/migration/create/entity-reader.js.map +1 -0
- package/dist/src/database/migration/create/file-generator.d.ts +2 -0
- package/dist/src/database/migration/create/file-generator.d.ts.map +1 -0
- package/dist/src/database/migration/create/file-generator.js +55 -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 +2 -0
- package/dist/src/database/migration/helpers.d.ts.map +1 -0
- package/dist/src/database/migration/helpers.js +8 -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/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 +8 -0
- package/dist/src/health/healthcheck.service.d.ts.map +1 -0
- package/dist/src/health/healthcheck.service.js +20 -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 +12 -0
- package/dist/src/helpers/redis/broadcast.d.ts.map +1 -0
- package/dist/src/helpers/redis/broadcast.js +99 -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.d.ts +5 -0
- package/dist/src/services/cli/repl.d.ts.map +1 -0
- package/dist/src/services/cli/repl.js +71 -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 +70 -0
- package/dist/src/services/worker/bootstrap.js.map +1 -0
- package/dist/src/services/worker/cli.d.ts +23 -0
- package/dist/src/services/worker/cli.d.ts.map +1 -0
- package/dist/src/services/worker/cli.js +81 -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/observer.d.ts +18 -0
- package/dist/src/services/worker/observer.d.ts.map +1 -0
- package/dist/src/services/worker/observer.js +172 -0
- package/dist/src/services/worker/observer.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 +31 -0
- package/dist/src/services/worker/queue.js.map +1 -0
- package/dist/src/services/worker/runner.d.ts +17 -0
- package/dist/src/services/worker/runner.d.ts.map +1 -0
- package/dist/src/services/worker/runner.js +131 -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 +54 -0
- package/dist/src/srpc/SrpcServer.d.ts.map +1 -0
- package/dist/src/srpc/SrpcServer.js +456 -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 +129 -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/testapp/bootstrap.d.ts +1 -0
- package/dist/src/testapp/bootstrap.d.ts.map +1 -0
- package/dist/src/testapp/bootstrap.js +18 -0
- package/dist/src/testapp/bootstrap.js.map +1 -0
- package/dist/src/testapp/sample.d.ts +6 -0
- package/dist/src/testapp/sample.d.ts.map +1 -0
- package/dist/src/testapp/sample.js +228 -0
- package/dist/src/testapp/sample.js.map +1 -0
- package/dist/src/testapp/srpc-test.d.ts +27 -0
- package/dist/src/testapp/srpc-test.d.ts.map +1 -0
- package/dist/src/testapp/srpc-test.js +570 -0
- package/dist/src/testapp/srpc-test.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/dist/tsconfig.tsbuildinfo +1 -0
- package/docs/README.md +38 -0
- package/docs/authentication.md +215 -0
- package/docs/cli.md +302 -0
- package/docs/configuration.md +176 -0
- package/docs/database.md +422 -0
- package/docs/getting-started.md +154 -0
- package/docs/health.md +53 -0
- package/docs/helpers.md +436 -0
- package/docs/http.md +253 -0
- package/docs/leader-service.md +98 -0
- package/docs/logging.md +150 -0
- package/docs/mail.md +161 -0
- package/docs/mesh-service.md +204 -0
- package/docs/srpc.md +261 -0
- package/docs/telemetry.md +166 -0
- package/docs/testing.md +222 -0
- package/docs/types.md +215 -0
- package/docs/worker.md +174 -0
- package/lefthook.yml +12 -0
- package/openapi.yaml +109 -0
- package/package.json +133 -0
- package/patches/@deepkit+type+1.0.19.patch +38 -0
- package/resources/proto/generated/test/test.ts +2721 -0
- package/resources/proto/sample.proto +85 -0
- package/resources/proto/test.proto +178 -0
- package/src/app/base.ts +257 -0
- package/src/app/config.loader.ts +66 -0
- package/src/app/config.ts +120 -0
- package/src/app/const.ts +4 -0
- package/src/app/dev.ts +70 -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 +363 -0
- package/src/cli/dksf-gen-proto.ts +176 -0
- package/src/cli/dksf-install.ts +11 -0
- package/src/cli/dksf-test.ts +95 -0
- package/src/cli/dksf-update.ts +101 -0
- package/src/database/CLAUDE.md +390 -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 +152 -0
- package/src/database/migration/MigrationRunCommand.ts +118 -0
- package/src/database/migration/characters.ts +53 -0
- package/src/database/migration/create/MigrationCreateCommand.ts +94 -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 +462 -0
- package/src/database/migration/create/file-generator.ts +52 -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 +3 -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/health/health.module.ts +30 -0
- package/src/health/healthcheck.controller.ts +17 -0
- package/src/health/healthcheck.service.ts +15 -0
- package/src/health/index.ts +2 -0
- package/src/helpers/CLAUDE.md +71 -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 +94 -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.ts +67 -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/CLAUDE.md +77 -0
- package/src/services/worker/bootstrap.ts +58 -0
- package/src/services/worker/cli.ts +63 -0
- package/src/services/worker/entity.ts +22 -0
- package/src/services/worker/index.ts +30 -0
- package/src/services/worker/observer.ts +180 -0
- package/src/services/worker/queue.ts +34 -0
- package/src/services/worker/runner.ts +146 -0
- package/src/services/worker/types.ts +32 -0
- package/src/srpc/CLAUDE.md +194 -0
- package/src/srpc/SRPC_MIGRATION_GUIDE.md +348 -0
- package/src/srpc/SrpcByteStream.ts +382 -0
- package/src/srpc/SrpcClient.ts +512 -0
- package/src/srpc/SrpcServer.ts +575 -0
- package/src/srpc/index.ts +15 -0
- package/src/srpc/types.ts +144 -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/testapp/bootstrap.ts +17 -0
- package/src/testapp/sample.ts +220 -0
- package/src/testapp/srpc-test.ts +684 -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/tests/app/app.spec.ts +53 -0
- package/tests/app/type.spec.ts +22 -0
- package/tests/auth/jwt.spec.ts +90 -0
- package/tests/database/entity.spec.ts +382 -0
- package/tests/database/locks.spec.ts +142 -0
- package/tests/database/migration-create-integration.spec.ts +234 -0
- package/tests/database/migration-create-unit.spec.ts +3896 -0
- package/tests/helpers/array.spec.ts +80 -0
- package/tests/helpers/cache.spec.ts +202 -0
- package/tests/helpers/crypto.spec.ts +236 -0
- package/tests/helpers/date.spec.ts +94 -0
- package/tests/helpers/error.spec.ts +233 -0
- package/tests/helpers/mutex.spec.ts +354 -0
- package/tests/helpers/objects.spec.ts +212 -0
- package/tests/helpers/package.spec.ts +90 -0
- package/tests/helpers/promise.spec.ts +119 -0
- package/tests/helpers/redis.spec.ts +50 -0
- package/tests/helpers/serialization.spec.ts +150 -0
- package/tests/helpers/stream.spec.ts +225 -0
- package/tests/helpers/validation.spec.ts +133 -0
- package/tests/services/leader.spec.ts +257 -0
- package/tests/services/logger.spec.ts +269 -0
- package/tests/services/mesh.spec.ts +814 -0
- package/tests/shared/db.ts +105 -0
- package/tests/shared/globalSetup.ts +48 -0
- package/tests/shared/helpers.ts +40 -0
- package/tests/srpc/SrpcByteStream.spec.ts +542 -0
- package/tests/tsconfig.json +4 -0
- package/tests/types/index.spec.ts +60 -0
- package/tests/types/phone.spec.ts +140 -0
- package/tsconfig.json +106 -0
- package/tsconfig.test.json +8 -0
- package/types.d.ts +6 -0
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MigrationCharactersCommand = void 0;
|
|
4
|
+
exports.standardizeDbCollation = standardizeDbCollation;
|
|
5
|
+
const tslib_1 = require("tslib");
|
|
6
|
+
function __assignType(fn, args) {
|
|
7
|
+
fn.__type = args;
|
|
8
|
+
return fn;
|
|
9
|
+
}
|
|
10
|
+
const app_1 = require("@deepkit/app");
|
|
11
|
+
const state_1 = require("../../app/state");
|
|
12
|
+
const common_1 = require("../common");
|
|
13
|
+
const dialect_1 = require("../dialect");
|
|
14
|
+
const __ΩICollationOptions = ['charset', 'collation', 'ICollationOptions', 'P&4!8&4"8Mw#y'];
|
|
15
|
+
const DEFAULT_CHARSET = 'utf8mb4';
|
|
16
|
+
const DEFAULT_COLLATION = 'utf8mb4_0900_ai_ci';
|
|
17
|
+
async function standardizeDbCollation(db, options) {
|
|
18
|
+
const dialect = (0, dialect_1.getDialect)(db.adapter);
|
|
19
|
+
if (dialect === 'postgres') {
|
|
20
|
+
console.warn('standardizeDbCollation is not applicable to PostgreSQL — skipping');
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
const charset = options?.charset ?? DEFAULT_CHARSET;
|
|
24
|
+
const collation = options?.collation ?? DEFAULT_COLLATION;
|
|
25
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
26
|
+
const dbNameResult = await db.rawQuery('SELECT DATABASE()');
|
|
27
|
+
const dbName = Object.values(dbNameResult[0])[0];
|
|
28
|
+
await db.rawQuery(`ALTER DATABASE ${dbName} CHARACTER SET = ${charset} COLLATE = ${collation}`);
|
|
29
|
+
const tablesResult = await db.rawQuery('SHOW TABLES');
|
|
30
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
31
|
+
const tables = tablesResult.map(__assignType((row) => Object.values(row)[0], ['row', '', 'P"2!"/"']));
|
|
32
|
+
for (const table of tables) {
|
|
33
|
+
await db.rawQuery(`ALTER TABLE ${table} CONVERT TO CHARACTER SET ${charset} COLLATE ${collation}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
standardizeDbCollation.__type = [() => common_1.BaseDatabase, 'db', () => __ΩICollationOptions, 'options', 'standardizeDbCollation', 'PP7!2"n#2$8"/%'];
|
|
37
|
+
let MigrationCharactersCommand = class MigrationCharactersCommand {
|
|
38
|
+
constructor(dbProvider) {
|
|
39
|
+
this.dbProvider = dbProvider;
|
|
40
|
+
}
|
|
41
|
+
async execute(charset = DEFAULT_CHARSET, collation = DEFAULT_COLLATION) {
|
|
42
|
+
const dialect = (0, dialect_1.getDialect)(this.dbProvider.db.adapter);
|
|
43
|
+
if (dialect === 'postgres') {
|
|
44
|
+
console.warn('Character set standardization is not applicable to PostgreSQL');
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
await standardizeDbCollation(this.dbProvider.db, { charset, collation });
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
exports.MigrationCharactersCommand = MigrationCharactersCommand;
|
|
51
|
+
MigrationCharactersCommand.__type = [() => state_1.DBProvider, 'dbProvider', 'constructor', 'charset', () => DEFAULT_CHARSET, 'collation', () => DEFAULT_COLLATION, 'execute', 'MigrationCharactersCommand', 'PP7!2";"0#P&2$>%&2&>\'"0(5w)'];
|
|
52
|
+
exports.MigrationCharactersCommand = MigrationCharactersCommand = tslib_1.__decorate([
|
|
53
|
+
app_1.cli.controller('migration:characters'),
|
|
54
|
+
tslib_1.__metadata("design:paramtypes", [state_1.DBProvider])
|
|
55
|
+
], MigrationCharactersCommand);
|
|
56
|
+
//# sourceMappingURL=characters.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"characters.js","sourceRoot":"","sources":["../../../../src/database/migration/characters.ts"],"names":[],"mappings":";;;AAeA,wDAuBC;;;;;;AAtCD,sCAAmC;AAGnC,2CAA6C;AAC7C,sCAAyC;AACzC,wCAAwC;;AAOxC,MAAM,eAAe,GAAG,SAAS,CAAC;AAClC,MAAM,iBAAiB,GAAG,oBAAoB,CAAC;AAExC,KAAK,UAAU,sBAAsB,CAAC,EAAgB,EAAE,OAA2B;IACtF,MAAM,OAAO,GAAG,IAAA,oBAAU,EAAC,EAAE,CAAC,OAA6B,CAAC,CAAC;IAC7D,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;QAClF,OAAO;IACX,CAAC;IAED,MAAM,OAAO,GAAG,OAAO,EAAE,OAAO,IAAI,eAAe,CAAC;IACpD,MAAM,SAAS,GAAG,OAAO,EAAE,SAAS,IAAI,iBAAiB,CAAC;IAE1D,8DAA8D;IAC9D,MAAM,YAAY,GAAU,MAAM,EAAE,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IACnE,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAEjD,MAAM,EAAE,CAAC,QAAQ,CAAC,kBAAkB,MAAM,oBAAoB,OAAO,cAAc,SAAS,EAAE,CAAC,CAAC;IAEhG,MAAM,YAAY,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IACtD,8DAA8D;IAC9D,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,cAAC,CAAC,GAAQ,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,0BAAC,CAAC;IAErE,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QACzB,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,KAAK,6BAA6B,OAAO,YAAY,SAAS,EAAE,CAAC,CAAC;IACvG,CAAC;AACL,CAAC;;AAGM,IAAM,0BAA0B,GAAhC,MAAM,0BAA0B;IACnC,YAAoB,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;IAAG,CAAC;IAE9C,KAAK,CAAC,OAAO,CAAC,UAAkB,eAAe,EAAE,YAAoB,iBAAiB;QAClF,MAAM,OAAO,GAAG,IAAA,oBAAU,EAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,OAA6B,CAAC,CAAC;QAC7E,IAAI,OAAO,KAAK,UAAU,EAAE,CAAC;YACzB,OAAO,CAAC,IAAI,CAAC,+DAA+D,CAAC,CAAC;YAC9E,OAAO;QACX,CAAC;QACD,MAAM,sBAAsB,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC;IAC7E,CAAC;;AAVQ,gEAA0B;;qCAA1B,0BAA0B;IADtC,SAAG,CAAC,UAAU,CAAC,sBAAsB,CAAC;6CAEH,kBAAU;GADjC,0BAA0B,CAWtC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { Flag } from '@deepkit/app';
|
|
2
|
+
import { DBProvider } from '../../../app/state';
|
|
3
|
+
export declare class MigrationCreateCommand {
|
|
4
|
+
private dbProvider;
|
|
5
|
+
private logger;
|
|
6
|
+
constructor(dbProvider: DBProvider);
|
|
7
|
+
execute(nonInteractive?: boolean & Flag<{
|
|
8
|
+
description: 'Skip interactive prompts';
|
|
9
|
+
}>): Promise<void>;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=MigrationCreateCommand.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MigrationCreateCommand.d.ts","sourceRoot":"","sources":["../../../../../src/database/migration/create/MigrationCreateCommand.ts"],"names":[],"mappings":"AAAA,OAAO,EAAO,IAAI,EAAE,MAAM,cAAc,CAAC;AAGzC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAYhD,qBACa,sBAAsB;IAGnB,OAAO,CAAC,UAAU;IAF9B,OAAO,CAAC,MAAM,CAAmC;gBAE7B,UAAU,EAAE,UAAU;IAEpC,OAAO,CAAC,cAAc,GAAE,OAAO,GAAG,IAAI,CAAC;QAAE,WAAW,EAAE,0BAA0B,CAAA;KAAE,CAAS;CAwEpG"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.MigrationCreateCommand = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
function __assignType(fn, args) {
|
|
6
|
+
fn.__type = args;
|
|
7
|
+
return fn;
|
|
8
|
+
}
|
|
9
|
+
/*@ts-ignore*/
|
|
10
|
+
var { __ΩFlag } = require('@deepkit/app');
|
|
11
|
+
const app_1 = require("@deepkit/app");
|
|
12
|
+
const state_1 = require("../../../app/state");
|
|
13
|
+
const resolver_1 = require("../../../app/resolver");
|
|
14
|
+
const services_1 = require("../../../services");
|
|
15
|
+
const dialect_1 = require("../../dialect");
|
|
16
|
+
const entity_reader_1 = require("./entity-reader");
|
|
17
|
+
const db_reader_1 = require("./db-reader");
|
|
18
|
+
const comparator_1 = require("./comparator");
|
|
19
|
+
const ddl_generator_1 = require("./ddl-generator");
|
|
20
|
+
const file_generator_1 = require("./file-generator");
|
|
21
|
+
const prompt_1 = require("./prompt");
|
|
22
|
+
const schema_model_1 = require("./schema-model");
|
|
23
|
+
let MigrationCreateCommand = class MigrationCreateCommand {
|
|
24
|
+
constructor(dbProvider) {
|
|
25
|
+
this.dbProvider = dbProvider;
|
|
26
|
+
this.logger = (0, services_1.createLogger)('MigrationCreate');
|
|
27
|
+
}
|
|
28
|
+
async execute(nonInteractive = false) {
|
|
29
|
+
if (nonInteractive) {
|
|
30
|
+
(0, prompt_1.setNonInteractive)(true);
|
|
31
|
+
}
|
|
32
|
+
try {
|
|
33
|
+
const db = this.dbProvider.db;
|
|
34
|
+
const dialect = (0, dialect_1.getDialect)(db.adapter);
|
|
35
|
+
const pgSchema = dialect === 'postgres' ? ((0, resolver_1.getAppConfig)().PG_SCHEMA ?? 'public') : 'public';
|
|
36
|
+
this.logger.info(`Dialect: ${dialect}`);
|
|
37
|
+
// Step 1: Read entity schema
|
|
38
|
+
this.logger.info('Reading entity definitions...');
|
|
39
|
+
const entitySchema = (0, entity_reader_1.readEntitiesSchema)(db, dialect);
|
|
40
|
+
const entityTableNames = Array.from(entitySchema.keys());
|
|
41
|
+
this.logger.info(`Found ${entityTableNames.length} entity table(s): ${entityTableNames.join(', ')}`);
|
|
42
|
+
// Step 2: Discover all DB tables and union with entity table names
|
|
43
|
+
const allDbTableNames = await (0, db_reader_1.readAllTableNames)(db, dialect, pgSchema);
|
|
44
|
+
const dbOnlyTables = allDbTableNames.filter(__assignType(n => !entitySchema.has(n) && !schema_model_1.INTERNAL_TABLES.has(n), ['n', '', 'P"2!"/"']));
|
|
45
|
+
const tableNames = [...entityTableNames, ...dbOnlyTables];
|
|
46
|
+
// Step 3: Read database schema
|
|
47
|
+
this.logger.info('Reading database schema...');
|
|
48
|
+
const dbSchema = await (0, db_reader_1.readDatabaseSchema)(db, dialect, tableNames, pgSchema);
|
|
49
|
+
// Step 4: Compare schemas
|
|
50
|
+
this.logger.info('Comparing schemas...');
|
|
51
|
+
const diff = await (0, comparator_1.compareSchemas)(entitySchema, dbSchema, dialect, !nonInteractive, pgSchema);
|
|
52
|
+
// Step 5: Generate DDL
|
|
53
|
+
const statements = (0, ddl_generator_1.generateDDL)(diff);
|
|
54
|
+
if (statements.length === 0) {
|
|
55
|
+
this.logger.info('No schema changes detected.');
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
// Step 6: Show summary
|
|
59
|
+
this.logger.info(`\nChanges detected:`);
|
|
60
|
+
if (diff.addedTables.length > 0) {
|
|
61
|
+
this.logger.info(` Added tables: ${diff.addedTables.map(__assignType(t => t.name, ['t', '', 'P"2!"/"'])).join(', ')}`);
|
|
62
|
+
}
|
|
63
|
+
if (diff.removedTables.length > 0) {
|
|
64
|
+
this.logger.info(` Removed tables: ${diff.removedTables.map(__assignType(t => t.name, ['t', '', 'P"2!"/"'])).join(', ')}`);
|
|
65
|
+
}
|
|
66
|
+
for (const table of diff.modifiedTables) {
|
|
67
|
+
const changes = [];
|
|
68
|
+
if (table.addedColumns.length > 0)
|
|
69
|
+
changes.push(`+${table.addedColumns.length} cols`);
|
|
70
|
+
if (table.removedColumns.length > 0)
|
|
71
|
+
changes.push(`-${table.removedColumns.length} cols`);
|
|
72
|
+
if (table.modifiedColumns.length > 0)
|
|
73
|
+
changes.push(`~${table.modifiedColumns.length} cols`);
|
|
74
|
+
if (table.renamedColumns.length > 0)
|
|
75
|
+
changes.push(`${table.renamedColumns.length} renamed`);
|
|
76
|
+
if (table.addedIndexes.length > 0)
|
|
77
|
+
changes.push(`+${table.addedIndexes.length} idx`);
|
|
78
|
+
if (table.removedIndexes.length > 0)
|
|
79
|
+
changes.push(`-${table.removedIndexes.length} idx`);
|
|
80
|
+
if (table.primaryKeyChanged)
|
|
81
|
+
changes.push('PK changed');
|
|
82
|
+
this.logger.info(` ${table.tableName}: ${changes.join(', ')}`);
|
|
83
|
+
}
|
|
84
|
+
this.logger.info(`\nDDL statements (${statements.length}):`);
|
|
85
|
+
for (const stmt of statements) {
|
|
86
|
+
this.logger.info(` ${stmt}`);
|
|
87
|
+
}
|
|
88
|
+
// Step 7: Prompt for description and generate file
|
|
89
|
+
const description = await (0, prompt_1.promptMigrationDescription)();
|
|
90
|
+
const filePath = (0, file_generator_1.generateMigrationFile)(statements, description);
|
|
91
|
+
this.logger.info(`\nMigration file created: ${filePath}`);
|
|
92
|
+
}
|
|
93
|
+
finally {
|
|
94
|
+
(0, prompt_1.setNonInteractive)(false);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
};
|
|
98
|
+
exports.MigrationCreateCommand = MigrationCreateCommand;
|
|
99
|
+
MigrationCreateCommand.__type = ['logger', function () { return (0, services_1.createLogger)('MigrationCreate'); }, () => state_1.DBProvider, 'dbProvider', 'constructor', () => __ΩFlag, "Skip interactive prompts", 'description', 'nonInteractive', () => false, 'execute', 'MigrationCreateCommand', '!3!;>"PP7#2$;"0%PP)P.\'4(Mo&"K2)>*"0+5w,'];
|
|
100
|
+
exports.MigrationCreateCommand = MigrationCreateCommand = tslib_1.__decorate([
|
|
101
|
+
app_1.cli.controller('migration:create'),
|
|
102
|
+
tslib_1.__metadata("design:paramtypes", [state_1.DBProvider])
|
|
103
|
+
], MigrationCreateCommand);
|
|
104
|
+
//# sourceMappingURL=MigrationCreateCommand.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MigrationCreateCommand.js","sourceRoot":"","sources":["../../../../../src/database/migration/create/MigrationCreateCommand.ts"],"names":[],"mappings":";;;;;;;;;0BAA0B,cAAc;AAAxC,sCAAyC;AAGzC,8CAAgD;AAChD,oDAAqD;AACrD,gDAAiD;AACjD,2CAA2C;AAC3C,mDAAqD;AACrD,2CAAoE;AACpE,6CAA8C;AAC9C,mDAA8C;AAC9C,qDAAyD;AACzD,qCAAyE;AACzE,iDAAiD;AAG1C,IAAM,sBAAsB,GAA5B,MAAM,sBAAsB;IAG/B,YAAoB,UAAsB;QAAtB,eAAU,GAAV,UAAU,CAAY;QAFlC,WAAM,GAAG,IAAA,uBAAY,EAAC,iBAAiB,CAAC,CAAC;IAEJ,CAAC;IAE9C,KAAK,CAAC,OAAO,CAAC,iBAA8E,KAAK;QAC7F,IAAI,cAAc,EAAE,CAAC;YACjB,IAAA,0BAAiB,EAAC,IAAI,CAAC,CAAC;QAC5B,CAAC;QAED,IAAI,CAAC;YACD,MAAM,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9B,MAAM,OAAO,GAAG,IAAA,oBAAU,EAAC,EAAE,CAAC,OAA6B,CAAC,CAAC;YAC7D,MAAM,QAAQ,GAAG,OAAO,KAAK,UAAU,CAAC,CAAC,CAAC,CAAC,IAAA,uBAAY,GAAE,CAAC,SAAS,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;YAE5F,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,YAAY,OAAO,EAAE,CAAC,CAAC;YAExC,6BAA6B;YAC7B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;YAClD,MAAM,YAAY,GAAG,IAAA,kCAAkB,EAAC,EAAE,EAAE,OAAO,CAAC,CAAC;YACrD,MAAM,gBAAgB,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,CAAC,CAAC;YACzD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,gBAAgB,CAAC,MAAM,qBAAqB,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAErG,mEAAmE;YACnE,MAAM,eAAe,GAAG,MAAM,IAAA,6BAAiB,EAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;YACvE,MAAM,YAAY,GAAG,eAAe,CAAC,MAAM,cAAC,CAAC,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,8BAAe,CAAC,GAAG,CAAC,CAAC,CAAC,wBAAC,CAAC;YAClG,MAAM,UAAU,GAAG,CAAC,GAAG,gBAAgB,EAAE,GAAG,YAAY,CAAC,CAAC;YAE1D,+BAA+B;YAC/B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,4BAA4B,CAAC,CAAC;YAC/C,MAAM,QAAQ,GAAG,MAAM,IAAA,8BAAkB,EAAC,EAAE,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,CAAC,CAAC;YAE7E,0BAA0B;YAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YACzC,MAAM,IAAI,GAAG,MAAM,IAAA,2BAAc,EAAC,YAAY,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,cAAc,EAAE,QAAQ,CAAC,CAAC;YAE9F,uBAAuB;YACvB,MAAM,UAAU,GAAG,IAAA,2BAAW,EAAC,IAAI,CAAC,CAAC;YAErC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,CAAC,CAAC;gBAChD,OAAO;YACX,CAAC;YAED,uBAAuB;YACvB,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;YACxC,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,WAAW,CAAC,GAAG,cAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,wBAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACxF,CAAC;YACD,IAAI,IAAI,CAAC,aAAa,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAChC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,aAAa,CAAC,GAAG,cAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,wBAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YAC5F,CAAC;YACD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;gBACtC,MAAM,OAAO,GAAa,EAAE,CAAC;gBAC7B,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,OAAO,CAAC,CAAC;gBACtF,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,OAAO,CAAC,CAAC;gBAC1F,IAAI,KAAK,CAAC,eAAe,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,eAAe,CAAC,MAAM,OAAO,CAAC,CAAC;gBAC5F,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,cAAc,CAAC,MAAM,UAAU,CAAC,CAAC;gBAC5F,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,YAAY,CAAC,MAAM,MAAM,CAAC,CAAC;gBACrF,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,CAAC;oBAAE,OAAO,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,cAAc,CAAC,MAAM,MAAM,CAAC,CAAC;gBACzF,IAAI,KAAK,CAAC,iBAAiB;oBAAE,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;gBACxD,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,KAAK,CAAC,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACpE,CAAC;YAED,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,qBAAqB,UAAU,CAAC,MAAM,IAAI,CAAC,CAAC;YAC7D,KAAK,MAAM,IAAI,IAAI,UAAU,EAAE,CAAC;gBAC5B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,KAAK,IAAI,EAAE,CAAC,CAAC;YAClC,CAAC;YAED,mDAAmD;YACnD,MAAM,WAAW,GAAG,MAAM,IAAA,mCAA0B,GAAE,CAAC;YACvD,MAAM,QAAQ,GAAG,IAAA,sCAAqB,EAAC,UAAU,EAAE,WAAW,CAAC,CAAC;YAChE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,6BAA6B,QAAQ,EAAE,CAAC,CAAC;QAC9D,CAAC;gBAAS,CAAC;YACP,IAAA,0BAAiB,EAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;IACL,CAAC;;AA5EQ,wDAAsB;gEACd,IAAA,uBAAY,EAAC,iBAAiB,CAAC;iCADvC,sBAAsB;IADlC,SAAG,CAAC,UAAU,CAAC,kBAAkB,CAAC;6CAIC,kBAAU;GAHjC,sBAAsB,CA6ElC"}
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import { DatabaseSchema, Dialect, SchemaDiff } from './schema-model';
|
|
2
|
+
export declare function compareSchemas(entitySchema: DatabaseSchema, dbSchema: DatabaseSchema, dialect: Dialect, interactive: boolean, pgSchema?: string): Promise<SchemaDiff>;
|
|
3
|
+
//# sourceMappingURL=comparator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"comparator.d.ts","sourceRoot":"","sources":["../../../../../src/database/migration/create/comparator.ts"],"names":[],"mappings":"AAAA,OAAO,EAGH,cAAc,EACd,OAAO,EAGP,UAAU,EAGb,MAAM,gBAAgB,CAAC;AAGxB,wBAAsB,cAAc,CAChC,YAAY,EAAE,cAAc,EAC5B,QAAQ,EAAE,cAAc,EACxB,OAAO,EAAE,OAAO,EAChB,WAAW,EAAE,OAAO,EACpB,QAAQ,CAAC,EAAE,MAAM,GAClB,OAAO,CAAC,UAAU,CAAC,CA4CrB"}
|
|
@@ -0,0 +1,408 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.compareSchemas = compareSchemas;
|
|
4
|
+
function __assignType(fn, args) {
|
|
5
|
+
fn.__type = args;
|
|
6
|
+
return fn;
|
|
7
|
+
}
|
|
8
|
+
/*@ts-ignore*/
|
|
9
|
+
var { __ΩDatabaseSchema, __ΩDialect, __ΩSchemaDiff, __ΩTableSchema, __ΩTableDiff, __ΩColumnSchema, __ΩColumnModification, __ΩIndexSchema, __ΩForeignKeySchema } = require('./schema-model');
|
|
10
|
+
const prompt_1 = require("./prompt");
|
|
11
|
+
async function compareSchemas(entitySchema, dbSchema, dialect, interactive, pgSchema) {
|
|
12
|
+
const addedTables = [];
|
|
13
|
+
const removedTables = [];
|
|
14
|
+
const modifiedTables = [];
|
|
15
|
+
// Find added tables (in entities but not in DB)
|
|
16
|
+
for (const [name, table] of entitySchema) {
|
|
17
|
+
if (!dbSchema.has(name)) {
|
|
18
|
+
addedTables.push(table);
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
// Find removed tables (in DB but not in entities)
|
|
22
|
+
for (const [name, table] of dbSchema) {
|
|
23
|
+
if (!entitySchema.has(name)) {
|
|
24
|
+
removedTables.push(table);
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
// Compare matching tables
|
|
28
|
+
for (const [name, entityTable] of entitySchema) {
|
|
29
|
+
const dbTable = dbSchema.get(name);
|
|
30
|
+
if (!dbTable)
|
|
31
|
+
continue;
|
|
32
|
+
const diff = await compareTable(entityTable, dbTable, dialect, interactive);
|
|
33
|
+
if (diff) {
|
|
34
|
+
modifiedTables.push(diff);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
// Collect all enum type names from entity tables (for safe PG DROP TYPE filtering)
|
|
38
|
+
let entityEnumTypes;
|
|
39
|
+
if (dialect === 'postgres') {
|
|
40
|
+
entityEnumTypes = (Set.Ω = [['&']], new Set());
|
|
41
|
+
for (const table of entitySchema.values()) {
|
|
42
|
+
for (const col of table.columns) {
|
|
43
|
+
if (col.type === 'enum' && col.enumTypeName) {
|
|
44
|
+
entityEnumTypes.add(col.enumTypeName);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
return { dialect, pgSchema, addedTables, removedTables, modifiedTables, entityEnumTypes };
|
|
50
|
+
}
|
|
51
|
+
compareSchemas.__type = [() => __ΩDatabaseSchema, 'entitySchema', () => __ΩDatabaseSchema, 'dbSchema', () => __ΩDialect, 'dialect', 'interactive', 'pgSchema', () => __ΩSchemaDiff, 'compareSchemas', 'Pn!2"n#2$n%2&)2\'&2(8n)`/*'];
|
|
52
|
+
async function compareTable(entityTable, dbTable, dialect, interactive) {
|
|
53
|
+
const diff = {
|
|
54
|
+
tableName: entityTable.name,
|
|
55
|
+
addedColumns: [],
|
|
56
|
+
removedColumns: [],
|
|
57
|
+
modifiedColumns: [],
|
|
58
|
+
renamedColumns: [],
|
|
59
|
+
reorderedColumns: [],
|
|
60
|
+
addedIndexes: [],
|
|
61
|
+
removedIndexes: [],
|
|
62
|
+
addedForeignKeys: [],
|
|
63
|
+
removedForeignKeys: [],
|
|
64
|
+
primaryKeyChanged: false,
|
|
65
|
+
addedEnumTypes: [],
|
|
66
|
+
removedEnumTypes: [],
|
|
67
|
+
modifiedEnumTypes: [],
|
|
68
|
+
entityColumns: entityTable.columns
|
|
69
|
+
};
|
|
70
|
+
// --- Columns ---
|
|
71
|
+
const entityColMap = new Map(entityTable.columns.map(__assignType(c => [c.name, c], ['c', '', 'P"2!"/"'])));
|
|
72
|
+
const dbColMap = new Map(dbTable.columns.map(__assignType(c => [c.name, c], ['c', '', 'P"2!"/"'])));
|
|
73
|
+
let candidateAdds = entityTable.columns.filter(__assignType(c => !dbColMap.has(c.name), ['c', '', 'P"2!"/"']));
|
|
74
|
+
let candidateDrops = dbTable.columns.filter(__assignType(c => !entityColMap.has(c.name) && !entityTable.skippedColumns?.has(c.name), ['c', '', 'P"2!"/"']));
|
|
75
|
+
// Rename detection
|
|
76
|
+
if (candidateAdds.length > 0 && candidateDrops.length > 0) {
|
|
77
|
+
if (interactive) {
|
|
78
|
+
const renames = await detectRenames(entityTable.name, candidateAdds, candidateDrops);
|
|
79
|
+
for (const rename of renames) {
|
|
80
|
+
diff.renamedColumns.push(rename);
|
|
81
|
+
candidateAdds = candidateAdds.filter(__assignType(c => c.name !== rename.to, ['c', '', 'P"2!"/"']));
|
|
82
|
+
candidateDrops = candidateDrops.filter(__assignType(c => c.name !== rename.from, ['c', '', 'P"2!"/"']));
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
console.warn(`Warning: Table \`${entityTable.name}\` has columns added (${candidateAdds.map(__assignType(c => c.name, ['c', '', 'P"2!"/"'])).join(', ')}) ` +
|
|
87
|
+
`and removed (${candidateDrops.map(__assignType(c => c.name, ['c', '', 'P"2!"/"'])).join(', ')}). ` +
|
|
88
|
+
`In non-interactive mode, these are treated as separate DROP/ADD operations (potential data loss). ` +
|
|
89
|
+
`Run without --non-interactive to detect renames.`);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
diff.addedColumns = candidateAdds;
|
|
93
|
+
diff.removedColumns = candidateDrops;
|
|
94
|
+
// Modified columns (present in both by same name)
|
|
95
|
+
for (const [name, entityCol] of entityColMap) {
|
|
96
|
+
const dbCol = dbColMap.get(name);
|
|
97
|
+
if (!dbCol)
|
|
98
|
+
continue;
|
|
99
|
+
const mod = compareColumn(entityCol, dbCol);
|
|
100
|
+
if (mod)
|
|
101
|
+
diff.modifiedColumns.push(mod);
|
|
102
|
+
}
|
|
103
|
+
// Renamed columns may also have property changes (type, nullable, default, etc.)
|
|
104
|
+
// For MySQL, CHANGE COLUMN already includes the full new definition so these are handled.
|
|
105
|
+
// For PG, RENAME COLUMN only renames — separate ALTER COLUMN statements are needed.
|
|
106
|
+
for (const rename of diff.renamedColumns) {
|
|
107
|
+
const dbCol = dbColMap.get(rename.from);
|
|
108
|
+
if (!dbCol)
|
|
109
|
+
continue;
|
|
110
|
+
const mod = compareColumn(rename.column, dbCol);
|
|
111
|
+
if (mod)
|
|
112
|
+
diff.modifiedColumns.push(mod);
|
|
113
|
+
}
|
|
114
|
+
// Column reordering (MySQL only)
|
|
115
|
+
if (dialect === 'mysql') {
|
|
116
|
+
diff.reorderedColumns = detectReorderingMySQL(entityTable, dbTable, diff);
|
|
117
|
+
}
|
|
118
|
+
// --- Primary Key ---
|
|
119
|
+
const entityPK = entityTable.columns.filter(__assignType(c => c.isPrimaryKey, ['c', '', 'P"2!"/"'])).map(__assignType(c => c.name, ['c', '', 'P"2!"/"']));
|
|
120
|
+
const rawDbPK = dbTable.columns.filter(__assignType(c => c.isPrimaryKey, ['c', '', 'P"2!"/"'])).map(__assignType(c => c.name, ['c', '', 'P"2!"/"']));
|
|
121
|
+
// Apply rename mappings to DB PK names so that pure PK column renames
|
|
122
|
+
// are not falsely detected as PK changes
|
|
123
|
+
const renamedFromToMap = new Map(diff.renamedColumns.map(__assignType(r => [r.from, r.to], ['r', '', 'P"2!"/"'])));
|
|
124
|
+
const dbPK = rawDbPK.map(__assignType(name => renamedFromToMap.get(name) ?? name, ['name', '', 'P"2!"/"']));
|
|
125
|
+
if (!arraysEqual(entityPK, dbPK)) {
|
|
126
|
+
diff.primaryKeyChanged = true;
|
|
127
|
+
diff.newPrimaryKey = entityPK;
|
|
128
|
+
// Store the raw DB column names (before rename mapping) so that DDL generation
|
|
129
|
+
// can reference columns by their current DB names when stripping AUTO_INCREMENT
|
|
130
|
+
// before DROP PRIMARY KEY (which happens before CHANGE COLUMN renames).
|
|
131
|
+
diff.oldPrimaryKey = rawDbPK;
|
|
132
|
+
diff.oldPrimaryKeyConstraintName = dbTable.primaryKeyConstraintName;
|
|
133
|
+
}
|
|
134
|
+
// --- Indexes ---
|
|
135
|
+
const { added: addedIdx, removed: removedIdx } = compareIndexes(entityTable.indexes, dbTable.indexes);
|
|
136
|
+
diff.addedIndexes = addedIdx;
|
|
137
|
+
diff.removedIndexes = removedIdx;
|
|
138
|
+
// --- Foreign Keys ---
|
|
139
|
+
const { added: addedFK, removed: removedFK } = compareForeignKeys(entityTable.foreignKeys, dbTable.foreignKeys);
|
|
140
|
+
diff.addedForeignKeys = addedFK;
|
|
141
|
+
diff.removedForeignKeys = removedFK;
|
|
142
|
+
// --- Enum types (PG only) ---
|
|
143
|
+
if (dialect === 'postgres') {
|
|
144
|
+
detectEnumChanges(diff, entityTable, dbTable);
|
|
145
|
+
}
|
|
146
|
+
// Check if there are any actual changes
|
|
147
|
+
if (diff.addedColumns.length === 0 &&
|
|
148
|
+
diff.removedColumns.length === 0 &&
|
|
149
|
+
diff.modifiedColumns.length === 0 &&
|
|
150
|
+
diff.renamedColumns.length === 0 &&
|
|
151
|
+
diff.reorderedColumns.length === 0 &&
|
|
152
|
+
diff.addedIndexes.length === 0 &&
|
|
153
|
+
diff.removedIndexes.length === 0 &&
|
|
154
|
+
diff.addedForeignKeys.length === 0 &&
|
|
155
|
+
diff.removedForeignKeys.length === 0 &&
|
|
156
|
+
!diff.primaryKeyChanged &&
|
|
157
|
+
diff.addedEnumTypes.length === 0 &&
|
|
158
|
+
diff.removedEnumTypes.length === 0 &&
|
|
159
|
+
diff.modifiedEnumTypes.length === 0) {
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
return diff;
|
|
163
|
+
}
|
|
164
|
+
compareTable.__type = [() => __ΩTableSchema, 'entityTable', () => __ΩTableSchema, 'dbTable', () => __ΩDialect, 'dialect', 'interactive', () => __ΩTableDiff, 'compareTable', 'Pn!2"n#2$n%2&)2\'Pn(,J`/)'];
|
|
165
|
+
function compareColumn(entityCol, dbCol) {
|
|
166
|
+
const typeChanged = !typesMatch(entityCol, dbCol);
|
|
167
|
+
const nullableChanged = entityCol.nullable !== dbCol.nullable;
|
|
168
|
+
const defaultChanged = !defaultsMatch(entityCol, dbCol);
|
|
169
|
+
const autoIncrementChanged = entityCol.autoIncrement !== dbCol.autoIncrement;
|
|
170
|
+
// ON UPDATE expression (MySQL only). If entity side has no onUpdateExpression, treat as "remove it".
|
|
171
|
+
const onUpdateChanged = (entityCol.onUpdateExpression || '') !== (dbCol.onUpdateExpression || '');
|
|
172
|
+
if (!typeChanged && !nullableChanged && !defaultChanged && !autoIncrementChanged && !onUpdateChanged) {
|
|
173
|
+
return null;
|
|
174
|
+
}
|
|
175
|
+
return {
|
|
176
|
+
name: entityCol.name,
|
|
177
|
+
oldColumn: dbCol,
|
|
178
|
+
newColumn: entityCol,
|
|
179
|
+
typeChanged,
|
|
180
|
+
nullableChanged,
|
|
181
|
+
defaultChanged,
|
|
182
|
+
autoIncrementChanged,
|
|
183
|
+
onUpdateChanged
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
compareColumn.__type = [() => __ΩColumnSchema, 'entityCol', () => __ΩColumnSchema, 'dbCol', () => __ΩColumnModification, 'compareColumn', 'Pn!2"n#2$Pn%,J/&'];
|
|
187
|
+
function normalizeTypeAlias(type) {
|
|
188
|
+
switch (type) {
|
|
189
|
+
case 'integer':
|
|
190
|
+
return 'int';
|
|
191
|
+
case 'numeric':
|
|
192
|
+
return 'decimal';
|
|
193
|
+
default:
|
|
194
|
+
return type;
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
normalizeTypeAlias.__type = ['type', 'normalizeTypeAlias', 'P&2!&/"'];
|
|
198
|
+
function typesMatch(a, b) {
|
|
199
|
+
if (normalizeTypeAlias(a.type) !== normalizeTypeAlias(b.type))
|
|
200
|
+
return false;
|
|
201
|
+
// Compare size when relevant
|
|
202
|
+
if (a.size !== undefined || b.size !== undefined) {
|
|
203
|
+
if (a.size !== b.size)
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
// Compare scale
|
|
207
|
+
if (a.scale !== undefined || b.scale !== undefined) {
|
|
208
|
+
if (a.scale !== b.scale)
|
|
209
|
+
return false;
|
|
210
|
+
}
|
|
211
|
+
// Compare unsigned
|
|
212
|
+
if (a.unsigned !== b.unsigned)
|
|
213
|
+
return false;
|
|
214
|
+
// Compare enum type name (PG)
|
|
215
|
+
if (a.enumTypeName || b.enumTypeName) {
|
|
216
|
+
if (a.enumTypeName !== b.enumTypeName)
|
|
217
|
+
return false;
|
|
218
|
+
}
|
|
219
|
+
// Compare enum values (sorted to ignore order-only differences)
|
|
220
|
+
if (a.enumValues || b.enumValues) {
|
|
221
|
+
const aVals = [...(a.enumValues || [])].sort();
|
|
222
|
+
const bVals = [...(b.enumValues || [])].sort();
|
|
223
|
+
if (!arraysEqual(aVals, bVals))
|
|
224
|
+
return false;
|
|
225
|
+
}
|
|
226
|
+
return true;
|
|
227
|
+
}
|
|
228
|
+
typesMatch.__type = [() => __ΩColumnSchema, 'a', () => __ΩColumnSchema, 'b', 'typesMatch', 'Pn!2"n#2$)/%'];
|
|
229
|
+
function normalizeDefaultExpression(expr) {
|
|
230
|
+
let s = expr.toUpperCase().trim();
|
|
231
|
+
// Normalize now() and CURRENT_TIMESTAMP() variants to CURRENT_TIMESTAMP (no parens)
|
|
232
|
+
s = s.replace(/\bNOW\s*\(\)/g, 'CURRENT_TIMESTAMP');
|
|
233
|
+
s = s.replace(/\bCURRENT_TIMESTAMP\s*\(\)/g, 'CURRENT_TIMESTAMP');
|
|
234
|
+
return s;
|
|
235
|
+
}
|
|
236
|
+
normalizeDefaultExpression.__type = ['expr', 'normalizeDefaultExpression', 'P&2!&/"'];
|
|
237
|
+
function defaultsMatch(a, b) {
|
|
238
|
+
// Skip default comparison for auto-increment columns
|
|
239
|
+
if (a.autoIncrement || b.autoIncrement)
|
|
240
|
+
return true;
|
|
241
|
+
// If entity side has no default info at all, treat as "unspecified" and skip comparison.
|
|
242
|
+
// The entity reader does not populate default values from Deepkit metadata.
|
|
243
|
+
if (a.defaultValue === undefined && a.defaultExpression === undefined)
|
|
244
|
+
return true;
|
|
245
|
+
// Both have expression defaults
|
|
246
|
+
if (a.defaultExpression && b.defaultExpression) {
|
|
247
|
+
return normalizeDefaultExpression(a.defaultExpression) === normalizeDefaultExpression(b.defaultExpression);
|
|
248
|
+
}
|
|
249
|
+
// One has expression, other doesn't
|
|
250
|
+
if (a.defaultExpression !== b.defaultExpression) {
|
|
251
|
+
if ((a.defaultExpression && !b.defaultExpression) || (!a.defaultExpression && b.defaultExpression)) {
|
|
252
|
+
return false;
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
// Compare values
|
|
256
|
+
if (a.defaultValue === undefined && b.defaultValue === undefined)
|
|
257
|
+
return true;
|
|
258
|
+
if (a.defaultValue === undefined || b.defaultValue === undefined)
|
|
259
|
+
return false;
|
|
260
|
+
return String(a.defaultValue) === String(b.defaultValue);
|
|
261
|
+
}
|
|
262
|
+
defaultsMatch.__type = [() => __ΩColumnSchema, 'a', () => __ΩColumnSchema, 'b', 'defaultsMatch', 'Pn!2"n#2$)/%'];
|
|
263
|
+
async function detectRenames(tableName, candidateAdds, candidateDrops) {
|
|
264
|
+
const renames = [];
|
|
265
|
+
let remainingDrops = [...candidateDrops];
|
|
266
|
+
for (const added of candidateAdds) {
|
|
267
|
+
// Prefer exact type matches
|
|
268
|
+
let compatibleDrops = remainingDrops.filter(__assignType(d => typesMatch(added, d), ['d', '', 'P"2!"/"']));
|
|
269
|
+
// Fall back to all remaining drops (type differs — prompt will warn)
|
|
270
|
+
if (compatibleDrops.length === 0 && remainingDrops.length > 0) {
|
|
271
|
+
compatibleDrops = remainingDrops;
|
|
272
|
+
}
|
|
273
|
+
if (compatibleDrops.length === 0)
|
|
274
|
+
continue;
|
|
275
|
+
const result = await (0, prompt_1.promptRename)(tableName, added.name, compatibleDrops.map(__assignType(d => d.name, ['d', '', 'P"2!"/"'])));
|
|
276
|
+
if (result) {
|
|
277
|
+
renames.push({ from: result, to: added.name, column: added });
|
|
278
|
+
remainingDrops = remainingDrops.filter(__assignType(d => d.name !== result, ['d', '', 'P"2!"/"']));
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
return renames;
|
|
282
|
+
}
|
|
283
|
+
detectRenames.__type = ['tableName', () => __ΩColumnSchema, 'candidateAdds', () => __ΩColumnSchema, 'candidateDrops', 'from', 'to', () => __ΩColumnSchema, 'column', 'detectRenames', 'P&2!n"F2#n$F2%P&4&&4\'n(4)MF`/*'];
|
|
284
|
+
function detectReorderingMySQL(entityTable, dbTable, diff) {
|
|
285
|
+
// Build the expected column order from the entity
|
|
286
|
+
const entityOrder = entityTable.columns.map(__assignType(c => c.name, ['c', '', 'P"2!"/"']));
|
|
287
|
+
// Build the current DB order, accounting for adds/drops/renames
|
|
288
|
+
const renamedFrom = new Map(diff.renamedColumns.map(__assignType(r => [r.from, r.to], ['r', '', 'P"2!"/"'])));
|
|
289
|
+
const removedNames = new Set(diff.removedColumns.map(__assignType(c => c.name, ['c', '', 'P"2!"/"'])));
|
|
290
|
+
const addedNames = new Set(diff.addedColumns.map(__assignType(c => c.name, ['c', '', 'P"2!"/"'])));
|
|
291
|
+
// Current DB order with renames applied and removals excluded
|
|
292
|
+
const dbOrder = dbTable.columns.map(__assignType(c => renamedFrom.get(c.name) || c.name, ['c', '', 'P"2!"/"'])).filter(__assignType(name => !removedNames.has(name), ['name', '', 'P"2!"/"']));
|
|
293
|
+
// Entity order without new additions (the columns that should be in DB order)
|
|
294
|
+
const existingEntityOrder = entityOrder.filter(__assignType(name => !addedNames.has(name), ['name', '', 'P"2!"/"']));
|
|
295
|
+
// Check if the existing columns are in the same relative order
|
|
296
|
+
if (arraysEqual(existingEntityOrder, dbOrder)) {
|
|
297
|
+
return [];
|
|
298
|
+
}
|
|
299
|
+
// Compute which columns need MODIFY with AFTER
|
|
300
|
+
const reorders = [];
|
|
301
|
+
for (let i = 0; i < existingEntityOrder.length; i++) {
|
|
302
|
+
if (existingEntityOrder[i] !== dbOrder[i]) {
|
|
303
|
+
const after = i === 0 ? null : existingEntityOrder[i - 1];
|
|
304
|
+
reorders.push({ name: existingEntityOrder[i], after });
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return reorders;
|
|
308
|
+
}
|
|
309
|
+
detectReorderingMySQL.__type = [() => __ΩTableSchema, 'entityTable', () => __ΩTableSchema, 'dbTable', () => __ΩTableDiff, 'diff', 'name', 'after', 'detectReorderingMySQL', 'Pn!2"n#2$n%2&P&4\'P&,J4(MF/)'];
|
|
310
|
+
function compareIndexes(entityIndexes, dbIndexes) {
|
|
311
|
+
// Match by column set + uniqueness + spatial, not by name
|
|
312
|
+
const indexKey = __assignType((idx) => `${idx.columns.join(',')}:${idx.unique}:${idx.spatial}`, [() => __ΩIndexSchema, 'idx', '', 'Pn!2""/#']);
|
|
313
|
+
const entityKeys = new Map(entityIndexes.map(__assignType(i => [indexKey(i), i], ['i', '', 'P"2!"/"'])));
|
|
314
|
+
const dbKeys = new Map(dbIndexes.map(__assignType(i => [indexKey(i), i], ['i', '', 'P"2!"/"'])));
|
|
315
|
+
const added = entityIndexes.filter(__assignType(i => !dbKeys.has(indexKey(i)), ['i', '', 'P"2!"/"']));
|
|
316
|
+
const removed = dbIndexes.filter(__assignType(i => !entityKeys.has(indexKey(i)), ['i', '', 'P"2!"/"']));
|
|
317
|
+
return { added, removed };
|
|
318
|
+
}
|
|
319
|
+
compareIndexes.__type = [() => __ΩIndexSchema, 'entityIndexes', () => __ΩIndexSchema, 'dbIndexes', () => __ΩIndexSchema, 'added', () => __ΩIndexSchema, 'removed', 'compareIndexes', 'Pn!F2"n#F2$Pn%F4&n\'F4(M/)'];
|
|
320
|
+
function normalizeFkAction(action) {
|
|
321
|
+
const upper = action.toUpperCase();
|
|
322
|
+
// NO ACTION and RESTRICT are semantically equivalent for comparison
|
|
323
|
+
return upper === 'NO ACTION' ? 'RESTRICT' : upper;
|
|
324
|
+
}
|
|
325
|
+
normalizeFkAction.__type = ['action', 'normalizeFkAction', 'P&2!&/"'];
|
|
326
|
+
function compareForeignKeys(entityFKs, dbFKs) {
|
|
327
|
+
// Match by structure including actions, not by name
|
|
328
|
+
// NO ACTION and RESTRICT are treated as equivalent to avoid diff churn
|
|
329
|
+
const fkKey = __assignType((fk) => `${fk.columns.join(',')}→${fk.referencedTable}(${fk.referencedColumns.join(',')})/${normalizeFkAction(fk.onDelete)}/${normalizeFkAction(fk.onUpdate)}`, [() => __ΩForeignKeySchema, 'fk', '', 'Pn!2""/#']);
|
|
330
|
+
const entityKeys = new Map(entityFKs.map(__assignType(fk => [fkKey(fk), fk], ['fk', '', 'P"2!"/"'])));
|
|
331
|
+
const dbKeys = new Map(dbFKs.map(__assignType(fk => [fkKey(fk), fk], ['fk', '', 'P"2!"/"'])));
|
|
332
|
+
const added = entityFKs.filter(__assignType(fk => !dbKeys.has(fkKey(fk)), ['fk', '', 'P"2!"/"']));
|
|
333
|
+
const removed = dbFKs.filter(__assignType(fk => !entityKeys.has(fkKey(fk)), ['fk', '', 'P"2!"/"']));
|
|
334
|
+
return { added, removed };
|
|
335
|
+
}
|
|
336
|
+
compareForeignKeys.__type = [() => __ΩForeignKeySchema, 'entityFKs', () => __ΩForeignKeySchema, 'dbFKs', () => __ΩForeignKeySchema, 'added', () => __ΩForeignKeySchema, 'removed', 'compareForeignKeys', 'Pn!F2"n#F2$Pn%F4&n\'F4(M/)'];
|
|
337
|
+
function detectEnumChanges(diff, entityTable, dbTable) {
|
|
338
|
+
const dbColMap = new Map(dbTable.columns.map(__assignType(c => [c.name, c], ['c', '', 'P"2!"/"'])));
|
|
339
|
+
for (const col of entityTable.columns) {
|
|
340
|
+
if (col.type !== 'enum' || !col.enumValues || !col.enumTypeName)
|
|
341
|
+
continue;
|
|
342
|
+
const dbCol = dbColMap.get(col.name);
|
|
343
|
+
// New enum type for new columns
|
|
344
|
+
if (!dbCol) {
|
|
345
|
+
diff.addedEnumTypes.push({
|
|
346
|
+
typeName: col.enumTypeName,
|
|
347
|
+
values: col.enumValues
|
|
348
|
+
});
|
|
349
|
+
continue;
|
|
350
|
+
}
|
|
351
|
+
// Existing column: non-enum → enum requires CREATE TYPE
|
|
352
|
+
if (dbCol.type !== 'enum') {
|
|
353
|
+
diff.addedEnumTypes.push({
|
|
354
|
+
typeName: col.enumTypeName,
|
|
355
|
+
values: col.enumValues
|
|
356
|
+
});
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
// Enum type name changed — need to create the new type and drop the old one
|
|
360
|
+
if (dbCol.enumTypeName && dbCol.enumTypeName !== col.enumTypeName) {
|
|
361
|
+
diff.addedEnumTypes.push({
|
|
362
|
+
typeName: col.enumTypeName,
|
|
363
|
+
values: col.enumValues
|
|
364
|
+
});
|
|
365
|
+
diff.removedEnumTypes.push(dbCol.enumTypeName);
|
|
366
|
+
// The type change will be picked up by compareColumn() → typesMatch() → enumTypeName comparison
|
|
367
|
+
continue;
|
|
368
|
+
}
|
|
369
|
+
// Existing column with enum value changes (same type name)
|
|
370
|
+
if (dbCol.enumValues) {
|
|
371
|
+
const added = col.enumValues.filter(__assignType(v => !dbCol.enumValues.includes(v), ['v', '', 'P"2!"/"']));
|
|
372
|
+
const removed = dbCol.enumValues.filter(__assignType(v => !col.enumValues.includes(v), ['v', '', 'P"2!"/"']));
|
|
373
|
+
if (added.length > 0 || removed.length > 0) {
|
|
374
|
+
diff.modifiedEnumTypes.push({
|
|
375
|
+
typeName: col.enumTypeName,
|
|
376
|
+
added,
|
|
377
|
+
removed,
|
|
378
|
+
newValues: col.enumValues,
|
|
379
|
+
tableName: diff.tableName,
|
|
380
|
+
columnName: col.name
|
|
381
|
+
});
|
|
382
|
+
}
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
// Detect orphaned enum types from removed columns or enum→non-enum changes
|
|
386
|
+
const entityColMap = new Map(entityTable.columns.map(__assignType(c => [c.name, c], ['c', '', 'P"2!"/"'])));
|
|
387
|
+
for (const dbCol of dbTable.columns) {
|
|
388
|
+
if (dbCol.type !== 'enum' || !dbCol.enumTypeName)
|
|
389
|
+
continue;
|
|
390
|
+
const entityCol = entityColMap.get(dbCol.name);
|
|
391
|
+
// Column removed entirely — its enum type may be orphaned
|
|
392
|
+
// Column changed from enum to non-enum — old type may be orphaned
|
|
393
|
+
if (!entityCol || entityCol.type !== 'enum' || entityCol.enumTypeName !== dbCol.enumTypeName) {
|
|
394
|
+
// Only schedule drop if not already handled above (type-name change already pushes to removedEnumTypes)
|
|
395
|
+
if (!diff.removedEnumTypes.includes(dbCol.enumTypeName)) {
|
|
396
|
+
diff.removedEnumTypes.push(dbCol.enumTypeName);
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
}
|
|
401
|
+
detectEnumChanges.__type = [() => __ΩTableDiff, 'diff', () => __ΩTableSchema, 'entityTable', () => __ΩTableSchema, 'dbTable', 'detectEnumChanges', 'Pn!2"n#2$n%2&$/\''];
|
|
402
|
+
function arraysEqual(a, b) {
|
|
403
|
+
if (a.length !== b.length)
|
|
404
|
+
return false;
|
|
405
|
+
return a.every(__assignType((v, i) => v === b[i], ['v', 'i', '', 'P"2!"2""/#']));
|
|
406
|
+
}
|
|
407
|
+
arraysEqual.__type = ['a', 'b', 'arraysEqual', 'P"F2!"F2")/#'];
|
|
408
|
+
//# sourceMappingURL=comparator.js.map
|