@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,101 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { assert } from '@deepkit/type';
|
|
4
|
+
import { execSync } from 'child_process';
|
|
5
|
+
import { existsSync } from 'fs';
|
|
6
|
+
import { readFile, stat, writeFile } from 'fs/promises';
|
|
7
|
+
import glob from 'tiny-glob';
|
|
8
|
+
|
|
9
|
+
const packageJsonPath = `package.json`;
|
|
10
|
+
if (!existsSync(packageJsonPath)) {
|
|
11
|
+
console.log('No package.json found in current directory.');
|
|
12
|
+
process.exit(1);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
const latestDKSFInfoStr = execSync('npm info @signal24/dk-server-foundation@latest --json').toString();
|
|
16
|
+
const latestDKSFInfo = JSON.parse(latestDKSFInfoStr);
|
|
17
|
+
assert<{
|
|
18
|
+
'dist-tags': {
|
|
19
|
+
latest: string;
|
|
20
|
+
};
|
|
21
|
+
dependencies: {
|
|
22
|
+
[key: string]: string;
|
|
23
|
+
};
|
|
24
|
+
}>(latestDKSFInfo);
|
|
25
|
+
const latestVersion = latestDKSFInfo['dist-tags'].latest;
|
|
26
|
+
|
|
27
|
+
applyUpdates()
|
|
28
|
+
.then(() => process.exit(0))
|
|
29
|
+
.catch(err => {
|
|
30
|
+
console.error(err);
|
|
31
|
+
process.exit(1);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
////
|
|
35
|
+
|
|
36
|
+
async function applyUpdates() {
|
|
37
|
+
const rootPackageJson = await processPackageJson(packageJsonPath);
|
|
38
|
+
|
|
39
|
+
if (rootPackageJson.workspaces) {
|
|
40
|
+
for (const workspace of rootPackageJson.workspaces) {
|
|
41
|
+
const matches = await glob(workspace);
|
|
42
|
+
for (const match of matches) {
|
|
43
|
+
const matchState = await stat(match);
|
|
44
|
+
if (matchState.isDirectory()) {
|
|
45
|
+
const packageJsonPath = `${match}/package.json`;
|
|
46
|
+
if (existsSync(packageJsonPath)) {
|
|
47
|
+
await processPackageJson(packageJsonPath);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
async function processPackageJson(path: string) {
|
|
56
|
+
const packageJsonStr = await readFile(path, 'utf8');
|
|
57
|
+
const packageJson = JSON.parse(packageJsonStr);
|
|
58
|
+
assert<{
|
|
59
|
+
workspaces?: string[];
|
|
60
|
+
dependencies?: {
|
|
61
|
+
[key: string]: string;
|
|
62
|
+
};
|
|
63
|
+
}>(packageJson);
|
|
64
|
+
|
|
65
|
+
if (packageJson.dependencies) {
|
|
66
|
+
const currentVersion = packageJson.dependencies['@signal24/dk-server-foundation'];
|
|
67
|
+
if (!currentVersion) {
|
|
68
|
+
console.log(`${path}: No @signal24/dk-server-foundation dependency found in package.json.`);
|
|
69
|
+
return packageJson;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
if (currentVersion === latestVersion) {
|
|
73
|
+
console.log(`${path}: DKSF already up to date.`);
|
|
74
|
+
} else if (currentVersion === '*') {
|
|
75
|
+
console.log(`${path}: DKSF set to '*'`);
|
|
76
|
+
} else {
|
|
77
|
+
console.log(`${path}: Updating @signal24/dk-server-foundation from ${currentVersion} to ${latestVersion}.`);
|
|
78
|
+
packageJson.dependencies['@signal24/dk-server-foundation'] = latestVersion;
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
for (const dependency in latestDKSFInfo.dependencies) {
|
|
82
|
+
if (dependency in packageJson.dependencies) {
|
|
83
|
+
if (packageJson.dependencies[dependency] === '*') {
|
|
84
|
+
console.log(`${path}: ${dependency} is set to '*'.`);
|
|
85
|
+
continue;
|
|
86
|
+
}
|
|
87
|
+
if (packageJson.dependencies[dependency] !== latestDKSFInfo.dependencies[dependency]) {
|
|
88
|
+
console.log(
|
|
89
|
+
`${path}: Updating ${dependency} from ${packageJson.dependencies[dependency]} to ${latestDKSFInfo.dependencies[dependency]}.`
|
|
90
|
+
);
|
|
91
|
+
packageJson.dependencies[dependency] = latestDKSFInfo.dependencies[dependency];
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
const newPackageJsonStr = JSON.stringify(packageJson, undefined, 4);
|
|
97
|
+
await writeFile(path, `${newPackageJsonStr}\n`);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
return packageJson;
|
|
101
|
+
}
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
# Database Layer
|
|
2
|
+
|
|
3
|
+
This directory provides MySQL and PostgreSQL database abstractions built on Deepkit ORM with additional features for transactions, locking, and entity management.
|
|
4
|
+
|
|
5
|
+
## Core Components
|
|
6
|
+
|
|
7
|
+
### BaseDatabase (common.ts)
|
|
8
|
+
|
|
9
|
+
The foundation class that all database instances should extend. Key features:
|
|
10
|
+
|
|
11
|
+
**Transaction Hooks**
|
|
12
|
+
|
|
13
|
+
```typescript
|
|
14
|
+
await db.transaction(async txn => {
|
|
15
|
+
// Pre-commit hooks run after txn.flush() but before commit
|
|
16
|
+
txn.addPreCommitHook(async () => {
|
|
17
|
+
// e.g., validate data, trigger side effects
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
// Post-commit hooks run after successful commit
|
|
21
|
+
txn.addPostCommitHook(async () => {
|
|
22
|
+
// e.g., send notifications, queue jobs
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
// Do work
|
|
26
|
+
const entity = createQueuedEntity(MyEntity, { field: 'value' }, txn);
|
|
27
|
+
});
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
**Session-Level Locks**
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
await db.transaction(async txn => {
|
|
34
|
+
// Acquire row-level lock for the duration of the transaction
|
|
35
|
+
await txn.acquireSessionLock('user:123');
|
|
36
|
+
await txn.acquireSessionLock(['resource', 'type', id]);
|
|
37
|
+
|
|
38
|
+
// Lock is held until commit/rollback
|
|
39
|
+
const user = await txn.query(User).filter({ id: 123 }).findOne();
|
|
40
|
+
user.balance -= 100;
|
|
41
|
+
});
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
On MySQL, the lock system uses a `_locks` table with row-level locking to prevent concurrent modifications (more flexible than MySQL's `GET_LOCK()` function). On PostgreSQL, it uses `pg_advisory_xact_lock` for transaction-scoped advisory locks.
|
|
45
|
+
|
|
46
|
+
**Raw Query Helpers**
|
|
47
|
+
|
|
48
|
+
```typescript
|
|
49
|
+
// Execute raw SQL
|
|
50
|
+
await db.rawExecute(sql`UPDATE users SET active = ${true} WHERE id = ${userId}`);
|
|
51
|
+
|
|
52
|
+
// Query and get results
|
|
53
|
+
const rows = await db.rawFind<User>(
|
|
54
|
+
sql`SELECT * FROM users WHERE active = ${true}`,
|
|
55
|
+
session, // optional
|
|
56
|
+
typeOf<User>() // optional type for deserialization
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
// Query and get single result
|
|
60
|
+
const user = await db.rawFindOne<User>(sql`SELECT * FROM users WHERE id = ${id}`);
|
|
61
|
+
|
|
62
|
+
// Unsafe versions with string interpolation (be careful!)
|
|
63
|
+
await db.rawExecuteUnsafe('UPDATE users SET active = ? WHERE id = ?', [true, userId]);
|
|
64
|
+
```
|
|
65
|
+
|
|
66
|
+
**Session and Transaction Management**
|
|
67
|
+
|
|
68
|
+
```typescript
|
|
69
|
+
// Wrap work in transaction
|
|
70
|
+
await db.withTransaction(existingSession, async session => {
|
|
71
|
+
// If existingSession is provided, reuses it
|
|
72
|
+
// Otherwise creates new transaction
|
|
73
|
+
});
|
|
74
|
+
|
|
75
|
+
// Wrap work in session (no transaction)
|
|
76
|
+
await db.withSession(existingSession, async session => {
|
|
77
|
+
// Useful for batch operations
|
|
78
|
+
});
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
### MySQLDatabaseAdapter (mysql.ts)
|
|
82
|
+
|
|
83
|
+
Custom Deepkit adapter with type transformations:
|
|
84
|
+
|
|
85
|
+
**Coordinate Type (POINT)** _(MySQL-only)_
|
|
86
|
+
|
|
87
|
+
```typescript
|
|
88
|
+
import { Coordinate } from './database';
|
|
89
|
+
|
|
90
|
+
@entity.name('location')
|
|
91
|
+
class Location {
|
|
92
|
+
@entity.column
|
|
93
|
+
position!: Coordinate; // Maps to MySQL POINT type
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// Usage
|
|
97
|
+
const loc = new Location();
|
|
98
|
+
loc.position = { x: -122.4194, y: 37.7749 }; // San Francisco
|
|
99
|
+
await loc.save();
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
**DateString Type**
|
|
103
|
+
|
|
104
|
+
```typescript
|
|
105
|
+
import { DateString } from './types';
|
|
106
|
+
|
|
107
|
+
@entity.name('event')
|
|
108
|
+
class Event {
|
|
109
|
+
@entity.column
|
|
110
|
+
date!: DateString; // Stores as DATE (not DATETIME)
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
// Usage
|
|
114
|
+
event.date = new Date('2024-01-15'); // Stored as '2024-01-15'
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
**Test Date Mocking**
|
|
118
|
+
Both adapters include special handling in test environments (`process.env.APP_ENV === 'test'`), allowing date mocking to work correctly with Deepkit's type system.
|
|
119
|
+
|
|
120
|
+
### PostgresDatabaseAdapter (postgres.ts)
|
|
121
|
+
|
|
122
|
+
Custom Deepkit adapter with type transformations for `any`, `DateString`, and test date mocking. Same as MySQL adapter but without Coordinate/POINT support. Uses `pg_advisory_xact_lock` for session locks instead of the `_locks` table.
|
|
123
|
+
|
|
124
|
+
### Dialect Helpers (dialect.ts)
|
|
125
|
+
|
|
126
|
+
Centralizes dialect-specific SQL fragments:
|
|
127
|
+
|
|
128
|
+
- `getDialect(adapter)` — returns `'mysql'` or `'postgres'`
|
|
129
|
+
- `quoteId(dialect, name)` — backticks for MySQL, double-quotes for PostgreSQL
|
|
130
|
+
- `tableExistsSql()`, `listTablesSql()`, `listDatabasesSql()`, `currentDatabaseSql()`
|
|
131
|
+
|
|
132
|
+
### Creating a Database
|
|
133
|
+
|
|
134
|
+
```typescript
|
|
135
|
+
import { createMySQLDatabase, createPostgresDatabase } from './database';
|
|
136
|
+
import { User, Post, Comment } from './entities';
|
|
137
|
+
|
|
138
|
+
// MySQL
|
|
139
|
+
class MyDatabase extends createMySQLDatabase(
|
|
140
|
+
{
|
|
141
|
+
// Additional PoolConfig options (mariadb)
|
|
142
|
+
connectionLimit: 20,
|
|
143
|
+
minimumIdle: 5
|
|
144
|
+
},
|
|
145
|
+
[User, Post, Comment] // Entity classes
|
|
146
|
+
) {}
|
|
147
|
+
|
|
148
|
+
// MySQL reads config from BaseAppConfig:
|
|
149
|
+
// - MYSQL_HOST, MYSQL_PORT, MYSQL_USER
|
|
150
|
+
// - MYSQL_PASSWORD_SECRET, MYSQL_DATABASE
|
|
151
|
+
// - MYSQL_CONNECTION_LIMIT, MYSQL_MIN_IDLE_CONNECTIONS
|
|
152
|
+
// - MYSQL_IDLE_TIMEOUT_SECONDS
|
|
153
|
+
|
|
154
|
+
// PostgreSQL
|
|
155
|
+
class MyDatabase extends createPostgresDatabase(
|
|
156
|
+
{
|
|
157
|
+
// Additional PoolConfig options (pg)
|
|
158
|
+
max: 20
|
|
159
|
+
},
|
|
160
|
+
[User, Post, Comment]
|
|
161
|
+
) {}
|
|
162
|
+
|
|
163
|
+
// PostgreSQL reads config from BaseAppConfig:
|
|
164
|
+
// - PG_HOST, PG_PORT, PG_USER
|
|
165
|
+
// - PG_PASSWORD_SECRET, PG_DATABASE, PG_SCHEMA
|
|
166
|
+
// - PG_CONNECTION_LIMIT, PG_IDLE_TIMEOUT_SECONDS
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
## Entity Management (entity.ts)
|
|
170
|
+
|
|
171
|
+
### Type-Safe Entity Creation
|
|
172
|
+
|
|
173
|
+
```typescript
|
|
174
|
+
import { createEntity, createPersistedEntity } from './database';
|
|
175
|
+
|
|
176
|
+
// Create entity without saving
|
|
177
|
+
const user = createEntity(User, {
|
|
178
|
+
email: 'user@example.com',
|
|
179
|
+
name: 'John'
|
|
180
|
+
// id and createdAt are optional (AutoIncrement and nullable fields)
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
// Create and save immediately
|
|
184
|
+
const user = await createPersistedEntity(User, {
|
|
185
|
+
email: 'user@example.com',
|
|
186
|
+
name: 'John'
|
|
187
|
+
});
|
|
188
|
+
|
|
189
|
+
// Within a transaction
|
|
190
|
+
await db.transaction(async txn => {
|
|
191
|
+
const user = await createPersistedEntity(User, { email: 'user@example.com' }, txn);
|
|
192
|
+
});
|
|
193
|
+
```
|
|
194
|
+
|
|
195
|
+
The `createEntity()` function uses TypeScript types to infer which fields are optional:
|
|
196
|
+
|
|
197
|
+
- `AutoIncrement` fields (like `id`)
|
|
198
|
+
- Nullable fields (marked with `| null`)
|
|
199
|
+
- Fields with `HasDefault` annotation
|
|
200
|
+
|
|
201
|
+
### Queued Entities (for batch operations)
|
|
202
|
+
|
|
203
|
+
```typescript
|
|
204
|
+
await db.transaction(async txn => {
|
|
205
|
+
// Queue entities for batch insert
|
|
206
|
+
const users = createQueuedEntities(User, [{ email: 'user1@example.com' }, { email: 'user2@example.com' }, { email: 'user3@example.com' }], txn);
|
|
207
|
+
|
|
208
|
+
// All inserted on flush
|
|
209
|
+
await txn.flush();
|
|
210
|
+
});
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Entity Retrieval Helpers
|
|
214
|
+
|
|
215
|
+
```typescript
|
|
216
|
+
import { getEntity, getEntityOr404, getEntityOrUndefined, entityExists } from './database';
|
|
217
|
+
|
|
218
|
+
// Get entity or throw ItemNotFound
|
|
219
|
+
const user = await getEntity(User, 123);
|
|
220
|
+
const user = await getEntity(User, { email: 'user@example.com' });
|
|
221
|
+
|
|
222
|
+
// Get entity or throw HttpNotFoundError (for HTTP handlers)
|
|
223
|
+
const user = await getEntityOr404(User, 123);
|
|
224
|
+
|
|
225
|
+
// Get entity or undefined
|
|
226
|
+
const user = await getEntityOrUndefined(User, 123);
|
|
227
|
+
|
|
228
|
+
// Check existence
|
|
229
|
+
if (await entityExists(User, { email })) {
|
|
230
|
+
// User exists
|
|
231
|
+
}
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
### Entity Field Extraction
|
|
235
|
+
|
|
236
|
+
```typescript
|
|
237
|
+
import { getEntityFields } from './database';
|
|
238
|
+
|
|
239
|
+
// Extract only data fields (excludes methods, etc.)
|
|
240
|
+
const fields: EntityFields<User> = getEntityFields(user);
|
|
241
|
+
// Returns: { id: 1, email: '...', name: '...', createdAt: Date }
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
## Query Builder Customization
|
|
245
|
+
|
|
246
|
+
BaseDatabase modifies Deepkit's query builder behavior:
|
|
247
|
+
|
|
248
|
+
```typescript
|
|
249
|
+
// In BaseDatabase, .clone() returns the same instance (not a copy)
|
|
250
|
+
// This improves performance but means queries are not reusable
|
|
251
|
+
const query = db.query(User).filter({ active: true });
|
|
252
|
+
const result1 = await query.limit(10).find();
|
|
253
|
+
// query is now modified! Don't reuse it
|
|
254
|
+
|
|
255
|
+
// If you need a reusable base query, create a function:
|
|
256
|
+
const getActiveUsersQuery = () => db.query(User).filter({ active: true });
|
|
257
|
+
const result1 = await getActiveUsersQuery().limit(10).find();
|
|
258
|
+
const result2 = await getActiveUsersQuery().orderBy('createdAt', 'desc').find();
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
## Migration System (migration/)
|
|
262
|
+
|
|
263
|
+
### Running Migrations
|
|
264
|
+
|
|
265
|
+
```typescript
|
|
266
|
+
import { runMigrations } from './database';
|
|
267
|
+
|
|
268
|
+
// Run all pending migrations using the application's configured database
|
|
269
|
+
await runMigrations();
|
|
270
|
+
|
|
271
|
+
// Migrations live in the directory returned by getMigrationsDir()
|
|
272
|
+
// Migration state is tracked in the database's migration table
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
### Creating Migrations
|
|
276
|
+
|
|
277
|
+
```typescript
|
|
278
|
+
import { createMigration } from './database';
|
|
279
|
+
|
|
280
|
+
// Define a migration (exported from a file under src/database/migration/**)
|
|
281
|
+
export default createMigration(async db => {
|
|
282
|
+
await db.rawExecute(/* ... */);
|
|
283
|
+
});
|
|
284
|
+
```
|
|
285
|
+
|
|
286
|
+
### Character Set Standardization (MySQL-only)
|
|
287
|
+
|
|
288
|
+
```typescript
|
|
289
|
+
import { standardizeDbCollation } from './database';
|
|
290
|
+
|
|
291
|
+
// Ensure all tables use utf8mb4_0900_ai_ci collation (MySQL-only, no-ops on PostgreSQL)
|
|
292
|
+
await standardizeDbCollation(db);
|
|
293
|
+
```
|
|
294
|
+
|
|
295
|
+
## Best Practices
|
|
296
|
+
|
|
297
|
+
1. **Always use transactions for multi-step operations**
|
|
298
|
+
|
|
299
|
+
```typescript
|
|
300
|
+
await db.transaction(async session => {
|
|
301
|
+
const user = await createPersistedEntity(User, data, session);
|
|
302
|
+
const profile = await createPersistedEntity(Profile, { userId: user.id }, session);
|
|
303
|
+
});
|
|
304
|
+
```
|
|
305
|
+
|
|
306
|
+
2. **Use session locks to prevent race conditions**
|
|
307
|
+
|
|
308
|
+
```typescript
|
|
309
|
+
await db.transaction(async session => {
|
|
310
|
+
await session.acquireSessionLock(['wallet', walletId]);
|
|
311
|
+
// Now safe to read-modify-write
|
|
312
|
+
});
|
|
313
|
+
```
|
|
314
|
+
|
|
315
|
+
3. **Leverage pre/post commit hooks for side effects**
|
|
316
|
+
|
|
317
|
+
```typescript
|
|
318
|
+
session.addPostCommitHook(async () => {
|
|
319
|
+
// Queue job, send notification, etc.
|
|
320
|
+
// Only runs if transaction succeeds
|
|
321
|
+
});
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
4. **Use type-safe entity creation helpers**
|
|
325
|
+
|
|
326
|
+
```typescript
|
|
327
|
+
// Good: Type-safe, handles optionals
|
|
328
|
+
const user = createEntity(User, { email, name });
|
|
329
|
+
|
|
330
|
+
// Avoid: Manual instantiation loses type safety
|
|
331
|
+
const user = new User();
|
|
332
|
+
user.email = email;
|
|
333
|
+
user.name = name;
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
5. **Disable identity maps** (already done by BaseDatabase)
|
|
337
|
+
- Identity maps are disabled (`session.withIdentityMap = false`) to prevent stale data issues
|
|
338
|
+
- Each query returns fresh data from the database
|
|
339
|
+
|
|
340
|
+
## Common Patterns
|
|
341
|
+
|
|
342
|
+
### Optimistic Locking with Version Field
|
|
343
|
+
|
|
344
|
+
```typescript
|
|
345
|
+
@entity.name('document')
|
|
346
|
+
class Document {
|
|
347
|
+
@entity.column
|
|
348
|
+
version: number = 0;
|
|
349
|
+
|
|
350
|
+
@entity.column
|
|
351
|
+
content!: string;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
await db.transaction(async session => {
|
|
355
|
+
const doc = await session.query(Document).filter({ id }).findOne();
|
|
356
|
+
const originalVersion = doc.version;
|
|
357
|
+
|
|
358
|
+
doc.content = newContent;
|
|
359
|
+
doc.version++;
|
|
360
|
+
|
|
361
|
+
const updated = await db.rawExecute(
|
|
362
|
+
sql`UPDATE documents SET content = ${doc.content}, version = ${doc.version}
|
|
363
|
+
WHERE id = ${doc.id} AND version = ${originalVersion}`,
|
|
364
|
+
session
|
|
365
|
+
);
|
|
366
|
+
|
|
367
|
+
if (updated.affectedRows === 0) {
|
|
368
|
+
throw new Error('Document was modified by another process');
|
|
369
|
+
}
|
|
370
|
+
});
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
### Bulk Operations with Raw SQL
|
|
374
|
+
|
|
375
|
+
```typescript
|
|
376
|
+
// Bulk insert
|
|
377
|
+
await db.rawExecute(sql`
|
|
378
|
+
INSERT INTO users (email, name)
|
|
379
|
+
VALUES
|
|
380
|
+
${'user1@example.com'}, ${'User 1'},
|
|
381
|
+
${'user2@example.com'}, ${'User 2'}
|
|
382
|
+
`);
|
|
383
|
+
|
|
384
|
+
// Bulk update
|
|
385
|
+
await db.rawExecute(sql`
|
|
386
|
+
UPDATE users
|
|
387
|
+
SET active = ${false}
|
|
388
|
+
WHERE lastLoginAt < ${cutoffDate}
|
|
389
|
+
`);
|
|
390
|
+
```
|