From f9abfb716860e72983ce40f78f1ba807d52f48ae Mon Sep 17 00:00:00 2001 From: marcus-sa <8391194+marcus-sa@users.noreply.github.com> Date: Tue, 17 Sep 2024 11:54:13 +0200 Subject: [PATCH 01/11] feat(sql): add database when path is provided to migration commands --- packages/core/src/core.ts | 10 ++++ packages/sql/src/cli/base-command.ts | 5 ++ .../sql/src/cli/migration-create-command.ts | 1 + .../sql/src/cli/migration-down-command.ts | 1 + .../sql/src/cli/migration-pending-command.ts | 1 + packages/sql/src/cli/migration-up-command.ts | 1 + .../sql/src/migration/migration-provider.ts | 59 +++++++++++++++---- 7 files changed, 68 insertions(+), 10 deletions(-) diff --git a/packages/core/src/core.ts b/packages/core/src/core.ts index 450951bfc..22625e766 100644 --- a/packages/core/src/core.ts +++ b/packages/core/src/core.ts @@ -889,3 +889,13 @@ export function assertDefined(value: T): asserts value is NonNullable { throw new Error(`Value is not defined`); } } + +export function isEsm(): boolean { + try { + // @ts-ignore + import.meta; + return true; + } catch { + return false; + } +} diff --git a/packages/sql/src/cli/base-command.ts b/packages/sql/src/cli/base-command.ts index 2bd371d80..9ca109d08 100644 --- a/packages/sql/src/cli/base-command.ts +++ b/packages/sql/src/cli/base-command.ts @@ -5,4 +5,9 @@ export class BaseCommand { * @description Sets the migration directory. */ protected migrationDir: string & Flag = ''; + + /** + * @description Sets the database path + */ + protected path?: string & Flag; } diff --git a/packages/sql/src/cli/migration-create-command.ts b/packages/sql/src/cli/migration-create-command.ts index 6d5470a74..b2791394b 100644 --- a/packages/sql/src/cli/migration-create-command.ts +++ b/packages/sql/src/cli/migration-create-command.ts @@ -51,6 +51,7 @@ export class MigrationCreateController extends BaseCommand implements Command { empty: boolean & Flag = false, ): Promise { if (this.migrationDir) this.provider.setMigrationDir(this.migrationDir); + if (this.path) await this.provider.addDatabase(this.path); if (!this.provider.databases.getDatabases().length) { this.logger.error('No databases detected. Use --path path/to/database.ts'); diff --git a/packages/sql/src/cli/migration-down-command.ts b/packages/sql/src/cli/migration-down-command.ts index a7d58fca4..c1e2f35ce 100644 --- a/packages/sql/src/cli/migration-down-command.ts +++ b/packages/sql/src/cli/migration-down-command.ts @@ -38,6 +38,7 @@ export class MigrationDownCommand extends BaseCommand { fake: boolean & Flag = false, ): Promise { if (this.migrationDir) this.provider.setMigrationDir(this.migrationDir); + if (this.path) await this.provider.addDatabase(this.path); const migrationsPerDatabase = await this.provider.getMigrationsPerDatabase(database); diff --git a/packages/sql/src/cli/migration-pending-command.ts b/packages/sql/src/cli/migration-pending-command.ts index c6d9c05bd..fa9a1fcb1 100644 --- a/packages/sql/src/cli/migration-pending-command.ts +++ b/packages/sql/src/cli/migration-pending-command.ts @@ -38,6 +38,7 @@ export class MigrationPendingCommand extends BaseCommand { database?: string & Flag<{ char: 'db' }>, ): Promise { if (this.migrationDir) this.provider.setMigrationDir(this.migrationDir); + if (this.path) await this.provider.addDatabase(this.path); const migrationsPerDatabase = await this.provider.getMigrationsPerDatabase(database); diff --git a/packages/sql/src/cli/migration-up-command.ts b/packages/sql/src/cli/migration-up-command.ts index bfbe344a4..3d70f88c2 100644 --- a/packages/sql/src/cli/migration-up-command.ts +++ b/packages/sql/src/cli/migration-up-command.ts @@ -44,6 +44,7 @@ export class MigrationUpCommand extends BaseCommand { all: boolean & Flag = false, ): Promise { if (this.migrationDir) this.provider.setMigrationDir(this.migrationDir); + if (this.path) await this.provider.addDatabase(this.path); const migrationsPerDatabase = await this.provider.getMigrationsPerDatabase(database); diff --git a/packages/sql/src/migration/migration-provider.ts b/packages/sql/src/migration/migration-provider.ts index 78d88167c..ebad15d32 100644 --- a/packages/sql/src/migration/migration-provider.ts +++ b/packages/sql/src/migration/migration-provider.ts @@ -8,7 +8,7 @@ * You should have received a copy of the MIT License along with this program. */ -import { ClassType } from '@deepkit/core'; +import { ClassType, isEsm } from '@deepkit/core'; import { Database, DatabaseRegistry } from '@deepkit/orm'; import glob from 'fast-glob'; import { basename, join } from 'path'; @@ -51,24 +51,63 @@ export class MigrationProvider { return migrationsPerDatabase; } - async getMigrations(migrationDir: string): Promise { - let migrations: Migration[] = []; - - const files = await glob('**/*.ts', { cwd: migrationDir }); - require('ts-node').register({ + private async registerTsNode() { + const esm = isEsm(); + const { register } = await import('ts-node'); + register({ + esm, compilerOptions: { experimentalDecorators: true, - module: 'undefined' !== typeof require ? 'CommonJS' : 'ESNext', + module: esm ? 'ESNext' : 'CommonJS', }, transpileOnly: true, }); + } + + async addDatabase(path: string): Promise { + await this.registerTsNode(); + + const exports = Object.values((await import(path) || {})); + if (!exports.length) { + throw new Error(`No database found in path ${path}`); + } + + let databaseInstance: Database | undefined; + let foundDatabaseClass: ClassType | undefined; + + for (const value of exports) { + if (value instanceof Database) { + databaseInstance = value; + break; + } + if (Object.getPrototypeOf(value) instanceof Database) { + foundDatabaseClass = value as ClassType; + } + } + + if (!databaseInstance) { + if (foundDatabaseClass) { + throw new Error(`Found database class ${foundDatabaseClass.name} in path ${path} but it has to be instantiated an exported. export const database = new ${foundDatabaseClass.name}(/* ... */);`); + } + throw new Error(`No database found in path ${path}`); + } + + this.databases.addDatabaseInstance(databaseInstance); + } + + async getMigrations(migrationDir: string): Promise { + let migrations: Migration[] = []; + + const files = await glob('**/*.ts', { cwd: migrationDir }); + + await this.registerTsNode(); for (const file of files) { const path = join(process.cwd(), migrationDir, file); const name = basename(file.replace('.ts', '')); - const migration = require(path); - if (migration && migration.SchemaMigration) { - const jo = new class extends (migration.SchemaMigration as ClassType) { + const { SchemaMigration } = (await import(path) || {}); + if (SchemaMigration) { + const jo = new class extends (SchemaMigration as ClassType) { constructor() { super(); if (!this.name) this.name = name; From 8d7ec6b70e2d23f733520dde3c396554e4b673e9 Mon Sep 17 00:00:00 2001 From: marcus-sa <8391194+marcus-sa@users.noreply.github.com> Date: Tue, 17 Sep 2024 12:19:40 +0200 Subject: [PATCH 02/11] fix(core): isEsm function --- packages/core/src/core.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/packages/core/src/core.ts b/packages/core/src/core.ts index 22625e766..51ae0f641 100644 --- a/packages/core/src/core.ts +++ b/packages/core/src/core.ts @@ -891,11 +891,5 @@ export function assertDefined(value: T): asserts value is NonNullable { } export function isEsm(): boolean { - try { - // @ts-ignore - import.meta; - return true; - } catch { - return false; - } + return typeof require === 'undefined'; } From 80948d8bab06028a74d6fde1bf0453f709a0bacf Mon Sep 17 00:00:00 2001 From: marcus-sa <8391194+marcus-sa@users.noreply.github.com> Date: Tue, 17 Sep 2024 13:04:54 +0200 Subject: [PATCH 03/11] fix(sql): use tsx instead of ts-node for ts runtime --- package.json | 1 + packages/sql/package.json | 3 +- .../sql/src/migration/migration-provider.ts | 25 +- yarn.lock | 278 ++++++++++++++++++ 4 files changed, 293 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 4ce415bd8..fe66d4a5f 100644 --- a/package.json +++ b/package.json @@ -48,6 +48,7 @@ "ts-jest": "^29.0.3", "ts-node": "^10.9.1", "ts-node-dev": "^2.0.0", + "tsx": "^4.19.1", "typedoc": "^0.23.17", "typescript": "~5.4.5" }, diff --git a/packages/sql/package.json b/packages/sql/package.json index 436045b43..afaac0624 100644 --- a/packages/sql/package.json +++ b/packages/sql/package.json @@ -39,7 +39,8 @@ "@deepkit/logger": "^1.0.1-alpha.13", "@deepkit/orm": "^1.0.1-alpha.13", "@deepkit/stopwatch": "^1.0.1-alpha.13", - "@deepkit/type": "^1.0.1-alpha.13" + "@deepkit/type": "^1.0.1-alpha.13", + "tsx": "4.19.1" }, "dependencies": { "@types/sqlstring": "^2.2.1", diff --git a/packages/sql/src/migration/migration-provider.ts b/packages/sql/src/migration/migration-provider.ts index ebad15d32..3ed0fd48f 100644 --- a/packages/sql/src/migration/migration-provider.ts +++ b/packages/sql/src/migration/migration-provider.ts @@ -51,23 +51,22 @@ export class MigrationProvider { return migrationsPerDatabase; } - private async registerTsNode() { + private async registerTsx() { const esm = isEsm(); - const { register } = await import('ts-node'); - register({ - esm, - compilerOptions: { - experimentalDecorators: true, - module: esm ? 'ESNext' : 'CommonJS', - }, - transpileOnly: true, - }); + if (esm) { + // @ts-ignore + const { register } = await import('tsx/esm/api'); + register(); + } else { + const { register } = require('tsx/cjs/api'); + register(); + } } async addDatabase(path: string): Promise { - await this.registerTsNode(); + await this.registerTsx(); - const exports = Object.values((await import(path) || {})); + const exports = Object.values((await import(join(process.cwd(), path)) || {})); if (!exports.length) { throw new Error(`No database found in path ${path}`); } @@ -100,7 +99,7 @@ export class MigrationProvider { const files = await glob('**/*.ts', { cwd: migrationDir }); - await this.registerTsNode(); + await this.registerTsx(); for (const file of files) { const path = join(process.cwd(), migrationDir, file); diff --git a/yarn.lock b/yarn.lock index 352cdec92..3e33b9a30 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4369,6 +4369,7 @@ __metadata: "@deepkit/orm": ^1.0.1-alpha.13 "@deepkit/stopwatch": ^1.0.1-alpha.13 "@deepkit/type": ^1.0.1-alpha.13 + tsx: 4.19.1 bin: deepkit-sql: ./bin/deepkit-sql.js languageName: unknown @@ -4660,6 +4661,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/aix-ppc64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/aix-ppc64@npm:0.23.1" + conditions: os=aix & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/android-arm64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/android-arm64@npm:0.18.20" @@ -4695,6 +4703,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/android-arm64@npm:0.23.1" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/android-arm@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/android-arm@npm:0.18.20" @@ -4730,6 +4745,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-arm@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/android-arm@npm:0.23.1" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + "@esbuild/android-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/android-x64@npm:0.18.20" @@ -4765,6 +4787,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/android-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/android-x64@npm:0.23.1" + conditions: os=android & cpu=x64 + languageName: node + linkType: hard + "@esbuild/darwin-arm64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/darwin-arm64@npm:0.18.20" @@ -4800,6 +4829,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-arm64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/darwin-arm64@npm:0.23.1" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/darwin-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/darwin-x64@npm:0.18.20" @@ -4835,6 +4871,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/darwin-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/darwin-x64@npm:0.23.1" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + "@esbuild/freebsd-arm64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/freebsd-arm64@npm:0.18.20" @@ -4870,6 +4913,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-arm64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/freebsd-arm64@npm:0.23.1" + conditions: os=freebsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/freebsd-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/freebsd-x64@npm:0.18.20" @@ -4905,6 +4955,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/freebsd-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/freebsd-x64@npm:0.23.1" + conditions: os=freebsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/linux-arm64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-arm64@npm:0.18.20" @@ -4940,6 +4997,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-arm64@npm:0.23.1" + conditions: os=linux & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/linux-arm@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-arm@npm:0.18.20" @@ -4975,6 +5039,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-arm@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-arm@npm:0.23.1" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + "@esbuild/linux-ia32@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-ia32@npm:0.18.20" @@ -5010,6 +5081,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ia32@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-ia32@npm:0.23.1" + conditions: os=linux & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/linux-loong64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-loong64@npm:0.18.20" @@ -5045,6 +5123,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-loong64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-loong64@npm:0.23.1" + conditions: os=linux & cpu=loong64 + languageName: node + linkType: hard + "@esbuild/linux-mips64el@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-mips64el@npm:0.18.20" @@ -5080,6 +5165,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-mips64el@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-mips64el@npm:0.23.1" + conditions: os=linux & cpu=mips64el + languageName: node + linkType: hard + "@esbuild/linux-ppc64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-ppc64@npm:0.18.20" @@ -5115,6 +5207,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-ppc64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-ppc64@npm:0.23.1" + conditions: os=linux & cpu=ppc64 + languageName: node + linkType: hard + "@esbuild/linux-riscv64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-riscv64@npm:0.18.20" @@ -5150,6 +5249,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-riscv64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-riscv64@npm:0.23.1" + conditions: os=linux & cpu=riscv64 + languageName: node + linkType: hard + "@esbuild/linux-s390x@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-s390x@npm:0.18.20" @@ -5185,6 +5291,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-s390x@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-s390x@npm:0.23.1" + conditions: os=linux & cpu=s390x + languageName: node + linkType: hard + "@esbuild/linux-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/linux-x64@npm:0.18.20" @@ -5220,6 +5333,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/linux-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/linux-x64@npm:0.23.1" + conditions: os=linux & cpu=x64 + languageName: node + linkType: hard + "@esbuild/netbsd-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/netbsd-x64@npm:0.18.20" @@ -5255,6 +5375,20 @@ __metadata: languageName: node linkType: hard +"@esbuild/netbsd-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/netbsd-x64@npm:0.23.1" + conditions: os=netbsd & cpu=x64 + languageName: node + linkType: hard + +"@esbuild/openbsd-arm64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/openbsd-arm64@npm:0.23.1" + conditions: os=openbsd & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/openbsd-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/openbsd-x64@npm:0.18.20" @@ -5290,6 +5424,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/openbsd-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/openbsd-x64@npm:0.23.1" + conditions: os=openbsd & cpu=x64 + languageName: node + linkType: hard + "@esbuild/sunos-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/sunos-x64@npm:0.18.20" @@ -5325,6 +5466,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/sunos-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/sunos-x64@npm:0.23.1" + conditions: os=sunos & cpu=x64 + languageName: node + linkType: hard + "@esbuild/win32-arm64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/win32-arm64@npm:0.18.20" @@ -5360,6 +5508,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-arm64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/win32-arm64@npm:0.23.1" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + "@esbuild/win32-ia32@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/win32-ia32@npm:0.18.20" @@ -5395,6 +5550,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-ia32@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/win32-ia32@npm:0.23.1" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + "@esbuild/win32-x64@npm:0.18.20": version: 0.18.20 resolution: "@esbuild/win32-x64@npm:0.18.20" @@ -5430,6 +5592,13 @@ __metadata: languageName: node linkType: hard +"@esbuild/win32-x64@npm:0.23.1": + version: 0.23.1 + resolution: "@esbuild/win32-x64@npm:0.23.1" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@gar/promisify@npm:^1.1.3": version: 1.1.3 resolution: "@gar/promisify@npm:1.1.3" @@ -13689,6 +13858,89 @@ __metadata: languageName: node linkType: hard +"esbuild@npm:~0.23.0": + version: 0.23.1 + resolution: "esbuild@npm:0.23.1" + dependencies: + "@esbuild/aix-ppc64": "npm:0.23.1" + "@esbuild/android-arm": "npm:0.23.1" + "@esbuild/android-arm64": "npm:0.23.1" + "@esbuild/android-x64": "npm:0.23.1" + "@esbuild/darwin-arm64": "npm:0.23.1" + "@esbuild/darwin-x64": "npm:0.23.1" + "@esbuild/freebsd-arm64": "npm:0.23.1" + "@esbuild/freebsd-x64": "npm:0.23.1" + "@esbuild/linux-arm": "npm:0.23.1" + "@esbuild/linux-arm64": "npm:0.23.1" + "@esbuild/linux-ia32": "npm:0.23.1" + "@esbuild/linux-loong64": "npm:0.23.1" + "@esbuild/linux-mips64el": "npm:0.23.1" + "@esbuild/linux-ppc64": "npm:0.23.1" + "@esbuild/linux-riscv64": "npm:0.23.1" + "@esbuild/linux-s390x": "npm:0.23.1" + "@esbuild/linux-x64": "npm:0.23.1" + "@esbuild/netbsd-x64": "npm:0.23.1" + "@esbuild/openbsd-arm64": "npm:0.23.1" + "@esbuild/openbsd-x64": "npm:0.23.1" + "@esbuild/sunos-x64": "npm:0.23.1" + "@esbuild/win32-arm64": "npm:0.23.1" + "@esbuild/win32-ia32": "npm:0.23.1" + "@esbuild/win32-x64": "npm:0.23.1" + dependenciesMeta: + "@esbuild/aix-ppc64": + optional: true + "@esbuild/android-arm": + optional: true + "@esbuild/android-arm64": + optional: true + "@esbuild/android-x64": + optional: true + "@esbuild/darwin-arm64": + optional: true + "@esbuild/darwin-x64": + optional: true + "@esbuild/freebsd-arm64": + optional: true + "@esbuild/freebsd-x64": + optional: true + "@esbuild/linux-arm": + optional: true + "@esbuild/linux-arm64": + optional: true + "@esbuild/linux-ia32": + optional: true + "@esbuild/linux-loong64": + optional: true + "@esbuild/linux-mips64el": + optional: true + "@esbuild/linux-ppc64": + optional: true + "@esbuild/linux-riscv64": + optional: true + "@esbuild/linux-s390x": + optional: true + "@esbuild/linux-x64": + optional: true + "@esbuild/netbsd-x64": + optional: true + "@esbuild/openbsd-arm64": + optional: true + "@esbuild/openbsd-x64": + optional: true + "@esbuild/sunos-x64": + optional: true + "@esbuild/win32-arm64": + optional: true + "@esbuild/win32-ia32": + optional: true + "@esbuild/win32-x64": + optional: true + bin: + esbuild: bin/esbuild + checksum: 08c2ed1105cc3c5e3a24a771e35532fe6089dd24a39c10097899072cef4a99f20860e41e9294e000d86380f353b04d8c50af482483d7f69f5208481cce61eec7 + languageName: node + linkType: hard + "escalade@npm:^3.1.1, escalade@npm:^3.1.2": version: 3.1.2 resolution: "escalade@npm:3.1.2" @@ -14688,6 +14940,15 @@ __metadata: languageName: node linkType: hard +"get-tsconfig@npm:^4.7.5": + version: 4.8.1 + resolution: "get-tsconfig@npm:4.8.1" + dependencies: + resolve-pkg-maps: "npm:^1.0.0" + checksum: 536ee85d202f604f4b5fb6be81bcd6e6d9a96846811e83e9acc6de4a04fb49506edea0e1b8cf1d5ee7af33e469916ec2809d4c5445ab8ae015a7a51fbd1572f9 + languageName: node + linkType: hard + "getpass@npm:^0.1.1": version: 0.1.7 resolution: "getpass@npm:0.1.7" @@ -22745,6 +23006,7 @@ __metadata: ts-jest: "npm:^29.0.3" ts-node: "npm:^10.9.1" ts-node-dev: "npm:^2.0.0" + tsx: "npm:^4.19.1" typedoc: "npm:^0.23.17" typescript: "npm:~5.4.5" languageName: unknown @@ -24722,6 +24984,22 @@ __metadata: languageName: node linkType: hard +"tsx@npm:^4.19.1": + version: 4.19.1 + resolution: "tsx@npm:4.19.1" + dependencies: + esbuild: "npm:~0.23.0" + fsevents: "npm:~2.3.3" + get-tsconfig: "npm:^4.7.5" + dependenciesMeta: + fsevents: + optional: true + bin: + tsx: dist/cli.mjs + checksum: cbea9baf57e7406fa0ecc2c03b9bb2501ee740dc28c938f949180a646a28e5d65e7cccbfba340508923bfd45e90320ef9eef7f815cae4515b6ef2ee429edc7ee + languageName: node + linkType: hard + "ttf2woff@npm:^2.0.1": version: 2.0.2 resolution: "ttf2woff@npm:2.0.2" From 58753c867f7416518242a9d08cf7efafa4ca28fd Mon Sep 17 00:00:00 2001 From: marcus-sa <8391194+marcus-sa@users.noreply.github.com> Date: Tue, 17 Sep 2024 13:31:30 +0200 Subject: [PATCH 04/11] docs(orm): update sql migrations --- website/src/pages/documentation/orm/migrations.md | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/website/src/pages/documentation/orm/migrations.md b/website/src/pages/documentation/orm/migrations.md index d4adc1974..d4389e10a 100644 --- a/website/src/pages/documentation/orm/migrations.md +++ b/website/src/pages/documentation/orm/migrations.md @@ -24,11 +24,14 @@ import { SQLiteDatabaseAdapter } from '@deepkit/sqlite'; import { User } from './models'; export class SQLiteDatabase extends Database { - name = 'default'; - constructor() { - super(new SQLiteDatabaseAdapter('/tmp/myapp.sqlite'), [User]); - } + name = 'default'; + + constructor() { + super(new SQLiteDatabaseAdapter('/tmp/myapp.sqlite'), [User]); + } } + +export const database = new SQLiteDatabase(); ``` ```sh From bbb981b4d989ebcedec4a8db6d5805496491824a Mon Sep 17 00:00:00 2001 From: marcus-sa <8391194+marcus-sa@users.noreply.github.com> Date: Tue, 17 Sep 2024 13:36:30 +0200 Subject: [PATCH 05/11] fix(sql): import date-fns --- packages/sql/src/cli/migration-create-command.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/sql/src/cli/migration-create-command.ts b/packages/sql/src/cli/migration-create-command.ts index b2791394b..96fb13335 100644 --- a/packages/sql/src/cli/migration-create-command.ts +++ b/packages/sql/src/cli/migration-create-command.ts @@ -106,7 +106,7 @@ export class MigrationCreateController extends BaseCommand implements Command { let migrationName = ''; const date = new Date; - const { format } = require('date-fns'); + const { format } = await import('date-fns'); for (let i = 1; i < 100; i++) { migrationName = format(date, 'yyyyMMdd-HHmm'); if (i > 1) migrationName += '_' + i; From ce94ee581c36f88340b0b42230c330a1a23dd480 Mon Sep 17 00:00:00 2001 From: marcus-sa <8391194+marcus-sa@users.noreply.github.com> Date: Tue, 17 Sep 2024 15:33:25 +0200 Subject: [PATCH 06/11] revert(sql): use ts-node instead of tsx tsx uses esbuild under the hood --- .../sql/src/migration/migration-provider.ts | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/packages/sql/src/migration/migration-provider.ts b/packages/sql/src/migration/migration-provider.ts index 3ed0fd48f..adc2d583b 100644 --- a/packages/sql/src/migration/migration-provider.ts +++ b/packages/sql/src/migration/migration-provider.ts @@ -51,16 +51,20 @@ export class MigrationProvider { return migrationsPerDatabase; } - private async registerTsx() { + // FIXME: esm imports doesn't work + private async registerTsNode() { const esm = isEsm(); - if (esm) { - // @ts-ignore - const { register } = await import('tsx/esm/api'); - register(); - } else { - const { register } = require('tsx/cjs/api'); - register(); - } + const { register } = await import('ts-node'); + register({ + esm, + preferTsExts: true, + experimentalTsImportSpecifiers: true, + compilerOptions: { + experimentalDecorators: true, + module: esm ? 'ESNext' : 'CommonJS', + }, + transpileOnly: true, + }); } async addDatabase(path: string): Promise { From da1044bca8f982d5ad12ff3677064128ff8483c3 Mon Sep 17 00:00:00 2001 From: marcus-sa <8391194+marcus-sa@users.noreply.github.com> Date: Tue, 17 Sep 2024 15:33:46 +0200 Subject: [PATCH 07/11] feat(sql): support migration of js files --- packages/sql/src/migration/migration-provider.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/packages/sql/src/migration/migration-provider.ts b/packages/sql/src/migration/migration-provider.ts index adc2d583b..b74ff1ad8 100644 --- a/packages/sql/src/migration/migration-provider.ts +++ b/packages/sql/src/migration/migration-provider.ts @@ -68,7 +68,7 @@ export class MigrationProvider { } async addDatabase(path: string): Promise { - await this.registerTsx(); + if (path.endsWith('.ts')) await this.registerTsNode(); const exports = Object.values((await import(join(process.cwd(), path)) || {})); if (!exports.length) { @@ -101,13 +101,16 @@ export class MigrationProvider { async getMigrations(migrationDir: string): Promise { let migrations: Migration[] = []; - const files = await glob('**/*.ts', { cwd: migrationDir }); - - await this.registerTsx(); + let files = await glob('**/!(*.d).ts', { cwd: migrationDir }); + if (files.length) { + await this.registerTsNode(); + } else { + files = await glob('**/*.js', { cwd: migrationDir }); + } for (const file of files) { const path = join(process.cwd(), migrationDir, file); - const name = basename(file.replace('.ts', '')); + const name = basename(file.replace('.ts', '').replace('.js', '')); const { SchemaMigration } = (await import(path) || {}); if (SchemaMigration) { const jo = new class extends (SchemaMigration as ClassType) { From c22a65aeb71068eeae45a8585b346f1c0da2f51e Mon Sep 17 00:00:00 2001 From: marcus-sa Date: Mon, 21 Apr 2025 20:47:26 +0200 Subject: [PATCH 08/11] feat(sql): replace ts-node with jiti for runtime transpilation Switched from ts-node to jiti to improve ESM handling and simplify runtime imports. Updated migration-provider to utilize jiti for dynamic TypeScript/JavaScript imports, removing the need for explicit ts-node registration. Refactored related code for cleaner implementation and reduced overhead. --- package.json | 2 +- packages/sql/package.json | 2 +- .../sql/src/migration/migration-provider.ts | 52 +++++++------------ 3 files changed, 22 insertions(+), 34 deletions(-) diff --git a/package.json b/package.json index fe66d4a5f..413935f2e 100644 --- a/package.json +++ b/package.json @@ -48,7 +48,7 @@ "ts-jest": "^29.0.3", "ts-node": "^10.9.1", "ts-node-dev": "^2.0.0", - "tsx": "^4.19.1", + "jiti": "^2.4.2", "typedoc": "^0.23.17", "typescript": "~5.4.5" }, diff --git a/packages/sql/package.json b/packages/sql/package.json index afaac0624..267393d4f 100644 --- a/packages/sql/package.json +++ b/packages/sql/package.json @@ -40,7 +40,7 @@ "@deepkit/orm": "^1.0.1-alpha.13", "@deepkit/stopwatch": "^1.0.1-alpha.13", "@deepkit/type": "^1.0.1-alpha.13", - "tsx": "4.19.1" + "jiti": "^2.4.2" }, "dependencies": { "@types/sqlstring": "^2.2.1", diff --git a/packages/sql/src/migration/migration-provider.ts b/packages/sql/src/migration/migration-provider.ts index b74ff1ad8..534511d09 100644 --- a/packages/sql/src/migration/migration-provider.ts +++ b/packages/sql/src/migration/migration-provider.ts @@ -7,7 +7,6 @@ * * You should have received a copy of the MIT License along with this program. */ - import { ClassType, isEsm } from '@deepkit/core'; import { Database, DatabaseRegistry } from '@deepkit/orm'; import glob from 'fast-glob'; @@ -18,10 +17,7 @@ export class MigrationProvider { protected databaseMap = new Map>(); protected migrationDir: string = 'migrations/'; - constructor( - public databases: DatabaseRegistry, - ) { - } + constructor(public databases: DatabaseRegistry) {} getMigrationDir(): string { return this.migrationDir; @@ -51,26 +47,20 @@ export class MigrationProvider { return migrationsPerDatabase; } - // FIXME: esm imports doesn't work - private async registerTsNode() { + private async createJiti() { const esm = isEsm(); - const { register } = await import('ts-node'); - register({ - esm, - preferTsExts: true, - experimentalTsImportSpecifiers: true, - compilerOptions: { - experimentalDecorators: true, - module: esm ? 'ESNext' : 'CommonJS', - }, - transpileOnly: true, - }); + const { createJiti } = await import('jiti'); + return createJiti( + esm + ? // @ts-expect-error esm only + import.meta.url + : __filename, + ); } async addDatabase(path: string): Promise { - if (path.endsWith('.ts')) await this.registerTsNode(); - - const exports = Object.values((await import(join(process.cwd(), path)) || {})); + const jiti = await this.createJiti(); + const exports = Object.values((await jiti.import(join(process.cwd(), path))) || {}); if (!exports.length) { throw new Error(`No database found in path ${path}`); } @@ -90,7 +80,9 @@ export class MigrationProvider { if (!databaseInstance) { if (foundDatabaseClass) { - throw new Error(`Found database class ${foundDatabaseClass.name} in path ${path} but it has to be instantiated an exported. export const database = new ${foundDatabaseClass.name}(/* ... */);`); + throw new Error( + `Found database class ${foundDatabaseClass.name} in path ${path} but it has to be instantiated an exported. export const database = new ${foundDatabaseClass.name}(/* ... */);`, + ); } throw new Error(`No database found in path ${path}`); } @@ -99,26 +91,22 @@ export class MigrationProvider { } async getMigrations(migrationDir: string): Promise { - let migrations: Migration[] = []; + const jiti = await this.createJiti(); - let files = await glob('**/!(*.d).ts', { cwd: migrationDir }); - if (files.length) { - await this.registerTsNode(); - } else { - files = await glob('**/*.js', { cwd: migrationDir }); - } + const files = await glob('**/!(*.d).+(ts|js)', { cwd: migrationDir }); + let migrations: Migration[] = []; for (const file of files) { const path = join(process.cwd(), migrationDir, file); const name = basename(file.replace('.ts', '').replace('.js', '')); - const { SchemaMigration } = (await import(path) || {}); + const { SchemaMigration } = (await jiti.import<{ SchemaMigration?: ClassType }>(path)) || {}; if (SchemaMigration) { - const jo = new class extends (SchemaMigration as ClassType) { + const jo = new (class extends (SchemaMigration as ClassType) { constructor() { super(); if (!this.name) this.name = name; } - }; + })(); migrations.push(jo); } } From 010a040628847f3871893b582b72113758bba2b6 Mon Sep 17 00:00:00 2001 From: marcus-sa Date: Thu, 1 May 2025 07:54:02 +0200 Subject: [PATCH 09/11] chore(deps): update yarn.lock --- package.json | 2 +- yarn.lock | 37 +++++++++++-------------------------- 2 files changed, 12 insertions(+), 27 deletions(-) diff --git a/package.json b/package.json index 4d2e8d102..e61a7a013 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "commitlint": "^18.4.3", "coveralls": "^3.0.3", "jest": "^29.2.1", + "jiti": "^2.4.2", "lefthook": "^1.5.5", "lerna": "^7.4.2", "madge": "^4.0.0", @@ -48,7 +49,6 @@ "ts-jest": "^29.0.3", "ts-node": "^10.9.1", "ts-node-dev": "^2.0.0", - "jiti": "^2.4.2", "typedoc": "^0.23.17", "typescript": "~5.7.3" }, diff --git a/yarn.lock b/yarn.lock index 8d82c2502..27d821824 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3774,6 +3774,7 @@ __metadata: "@deepkit/orm": ^1.0.1 "@deepkit/stopwatch": ^1.0.1 "@deepkit/type": ^1.0.1 + jiti: ^2.4.2 bin: deepkit-sql: ./bin/deepkit-sql.js languageName: unknown @@ -14213,15 +14214,6 @@ __metadata: languageName: node linkType: hard -"get-tsconfig@npm:^4.7.5": - version: 4.8.1 - resolution: "get-tsconfig@npm:4.8.1" - dependencies: - resolve-pkg-maps: "npm:^1.0.0" - checksum: 536ee85d202f604f4b5fb6be81bcd6e6d9a96846811e83e9acc6de4a04fb49506edea0e1b8cf1d5ee7af33e469916ec2809d4c5445ab8ae015a7a51fbd1572f9 - languageName: node - linkType: hard - "getpass@npm:^0.1.1": version: 0.1.7 resolution: "getpass@npm:0.1.7" @@ -16612,6 +16604,15 @@ __metadata: languageName: node linkType: hard +"jiti@npm:^2.4.2": + version: 2.4.2 + resolution: "jiti@npm:2.4.2" + bin: + jiti: lib/jiti-cli.mjs + checksum: 4ceac133a08c8faff7eac84aabb917e85e8257f5ad659e843004ce76e981c457c390a220881748ac67ba1b940b9b729b30fb85cbaf6e7989f04b6002c94da331 + languageName: node + linkType: hard + "jpeg-js@npm:^0.4.4": version: 0.4.4 resolution: "jpeg-js@npm:0.4.4" @@ -22309,6 +22310,7 @@ __metadata: commitlint: "npm:^18.4.3" coveralls: "npm:^3.0.3" jest: "npm:^29.2.1" + jiti: "npm:^2.4.2" lefthook: "npm:^1.5.5" lerna: "npm:^7.4.2" madge: "npm:^4.0.0" @@ -22316,7 +22318,6 @@ __metadata: ts-jest: "npm:^29.0.3" ts-node: "npm:^10.9.1" ts-node-dev: "npm:^2.0.0" - tsx: "npm:^4.19.1" typedoc: "npm:^0.23.17" typescript: "npm:~5.7.3" languageName: unknown @@ -24401,22 +24402,6 @@ __metadata: languageName: node linkType: hard -"tsx@npm:^4.19.1": - version: 4.19.1 - resolution: "tsx@npm:4.19.1" - dependencies: - esbuild: "npm:~0.23.0" - fsevents: "npm:~2.3.3" - get-tsconfig: "npm:^4.7.5" - dependenciesMeta: - fsevents: - optional: true - bin: - tsx: dist/cli.mjs - checksum: cbea9baf57e7406fa0ecc2c03b9bb2501ee740dc28c938f949180a646a28e5d65e7cccbfba340508923bfd45e90320ef9eef7f815cae4515b6ef2ee429edc7ee - languageName: node - linkType: hard - "ttf2woff@npm:^2.0.1": version: 2.0.2 resolution: "ttf2woff@npm:2.0.2" From cfa365327c1d609fab4e4dff9b321437e6fa56ef Mon Sep 17 00:00:00 2001 From: "Marcus S. Abildskov" Date: Fri, 16 May 2025 09:46:03 +0200 Subject: [PATCH 10/11] ci: update setup action Signed-off-by: Marcus S. Abildskov --- .github/actions/setup/action.yml | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index 73a5f968c..f277ed0d0 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -12,6 +12,4 @@ runs: - name: Run yarn install shell: bash - run: yarn --frozen-lockfile - env: - CI: 'true' + run: yarn --immutable From c405b316ccf8a23c11a618810aeb314a0bad5135 Mon Sep 17 00:00:00 2001 From: "Marcus S. Abildskov" Date: Fri, 16 May 2025 09:46:38 +0200 Subject: [PATCH 11/11] ci: update node action version Signed-off-by: Marcus S. Abildskov --- .github/actions/setup/action.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/actions/setup/action.yml b/.github/actions/setup/action.yml index f277ed0d0..8a0804666 100644 --- a/.github/actions/setup/action.yml +++ b/.github/actions/setup/action.yml @@ -5,7 +5,7 @@ runs: using: 'composite' steps: - name: Setup node - uses: actions/setup-node@v4 + uses: actions/setup-node@v4.4.0 with: node-version: 20.10.0 cache: yarn