@uql/core 3.1.0 → 3.1.2
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/CHANGELOG.md +134 -176
- package/README.md +413 -0
- package/package.json +31 -26
- package/dist/package.json +0 -131
- package/src/@types/index.d.ts +0 -1
- package/src/@types/jest.d.ts +0 -6
- package/src/browser/http/bus.spec.ts +0 -22
- package/src/browser/http/bus.ts +0 -17
- package/src/browser/http/http.spec.ts +0 -70
- package/src/browser/http/http.ts +0 -55
- package/src/browser/http/index.ts +0 -2
- package/src/browser/index.ts +0 -4
- package/src/browser/options.spec.ts +0 -37
- package/src/browser/options.ts +0 -18
- package/src/browser/querier/genericClientRepository.spec.ts +0 -105
- package/src/browser/querier/genericClientRepository.ts +0 -49
- package/src/browser/querier/httpQuerier.ts +0 -82
- package/src/browser/querier/index.ts +0 -3
- package/src/browser/querier/querier.util.spec.ts +0 -35
- package/src/browser/querier/querier.util.ts +0 -18
- package/src/browser/type/clientQuerier.ts +0 -45
- package/src/browser/type/clientQuerierPool.ts +0 -5
- package/src/browser/type/clientRepository.ts +0 -22
- package/src/browser/type/index.ts +0 -4
- package/src/browser/type/request.ts +0 -25
- package/src/dialect/abstractDialect.ts +0 -28
- package/src/dialect/abstractSqlDialect-spec.ts +0 -1309
- package/src/dialect/abstractSqlDialect.ts +0 -805
- package/src/dialect/index.ts +0 -3
- package/src/dialect/namingStrategy.spec.ts +0 -52
- package/src/dialect/queryContext.ts +0 -69
- package/src/entity/decorator/definition.spec.ts +0 -736
- package/src/entity/decorator/definition.ts +0 -265
- package/src/entity/decorator/entity.ts +0 -8
- package/src/entity/decorator/field.ts +0 -9
- package/src/entity/decorator/id.ts +0 -9
- package/src/entity/decorator/index.ts +0 -5
- package/src/entity/decorator/relation.spec.ts +0 -41
- package/src/entity/decorator/relation.ts +0 -34
- package/src/entity/index.ts +0 -1
- package/src/express/@types/express.d.ts +0 -8
- package/src/express/@types/index.d.ts +0 -1
- package/src/express/index.ts +0 -2
- package/src/express/querierMiddleware.ts +0 -217
- package/src/express/query.util.spec.ts +0 -40
- package/src/express/query.util.ts +0 -21
- package/src/index.ts +0 -9
- package/src/maria/index.ts +0 -3
- package/src/maria/mariaDialect.spec.ts +0 -207
- package/src/maria/mariaDialect.ts +0 -42
- package/src/maria/mariaQuerierPool.test.ts +0 -23
- package/src/maria/mariadbQuerier.test.ts +0 -23
- package/src/maria/mariadbQuerier.ts +0 -45
- package/src/maria/mariadbQuerierPool.ts +0 -21
- package/src/migrate/cli.ts +0 -301
- package/src/migrate/generator/index.ts +0 -4
- package/src/migrate/generator/mongoSchemaGenerator.spec.ts +0 -112
- package/src/migrate/generator/mongoSchemaGenerator.ts +0 -115
- package/src/migrate/generator/mysqlSchemaGenerator.spec.ts +0 -34
- package/src/migrate/generator/mysqlSchemaGenerator.ts +0 -92
- package/src/migrate/generator/postgresSchemaGenerator.spec.ts +0 -44
- package/src/migrate/generator/postgresSchemaGenerator.ts +0 -127
- package/src/migrate/generator/sqliteSchemaGenerator.spec.ts +0 -33
- package/src/migrate/generator/sqliteSchemaGenerator.ts +0 -81
- package/src/migrate/index.ts +0 -41
- package/src/migrate/introspection/index.ts +0 -4
- package/src/migrate/introspection/mongoIntrospector.spec.ts +0 -75
- package/src/migrate/introspection/mongoIntrospector.ts +0 -47
- package/src/migrate/introspection/mysqlIntrospector.spec.ts +0 -113
- package/src/migrate/introspection/mysqlIntrospector.ts +0 -278
- package/src/migrate/introspection/postgresIntrospector.spec.ts +0 -112
- package/src/migrate/introspection/postgresIntrospector.ts +0 -329
- package/src/migrate/introspection/sqliteIntrospector.spec.ts +0 -112
- package/src/migrate/introspection/sqliteIntrospector.ts +0 -296
- package/src/migrate/migrator-mongo.test.ts +0 -54
- package/src/migrate/migrator.spec.ts +0 -255
- package/src/migrate/migrator.test.ts +0 -94
- package/src/migrate/migrator.ts +0 -719
- package/src/migrate/namingStrategy.spec.ts +0 -22
- package/src/migrate/schemaGenerator-advanced.spec.ts +0 -138
- package/src/migrate/schemaGenerator.spec.ts +0 -190
- package/src/migrate/schemaGenerator.ts +0 -478
- package/src/migrate/storage/databaseStorage.spec.ts +0 -69
- package/src/migrate/storage/databaseStorage.ts +0 -100
- package/src/migrate/storage/index.ts +0 -2
- package/src/migrate/storage/jsonStorage.ts +0 -58
- package/src/migrate/type.ts +0 -1
- package/src/mongo/index.ts +0 -3
- package/src/mongo/mongoDialect.spec.ts +0 -251
- package/src/mongo/mongoDialect.ts +0 -238
- package/src/mongo/mongodbQuerier.test.ts +0 -45
- package/src/mongo/mongodbQuerier.ts +0 -256
- package/src/mongo/mongodbQuerierPool.test.ts +0 -25
- package/src/mongo/mongodbQuerierPool.ts +0 -24
- package/src/mysql/index.ts +0 -3
- package/src/mysql/mysql2Querier.test.ts +0 -20
- package/src/mysql/mysql2Querier.ts +0 -49
- package/src/mysql/mysql2QuerierPool.test.ts +0 -20
- package/src/mysql/mysql2QuerierPool.ts +0 -21
- package/src/mysql/mysqlDialect.spec.ts +0 -20
- package/src/mysql/mysqlDialect.ts +0 -16
- package/src/namingStrategy/defaultNamingStrategy.ts +0 -18
- package/src/namingStrategy/index.spec.ts +0 -36
- package/src/namingStrategy/index.ts +0 -2
- package/src/namingStrategy/snakeCaseNamingStrategy.ts +0 -15
- package/src/options.spec.ts +0 -41
- package/src/options.ts +0 -18
- package/src/postgres/index.ts +0 -3
- package/src/postgres/manual-types.d.ts +0 -4
- package/src/postgres/pgQuerier.test.ts +0 -25
- package/src/postgres/pgQuerier.ts +0 -45
- package/src/postgres/pgQuerierPool.test.ts +0 -28
- package/src/postgres/pgQuerierPool.ts +0 -21
- package/src/postgres/postgresDialect.spec.ts +0 -428
- package/src/postgres/postgresDialect.ts +0 -144
- package/src/querier/abstractQuerier-test.ts +0 -584
- package/src/querier/abstractQuerier.ts +0 -353
- package/src/querier/abstractQuerierPool-test.ts +0 -20
- package/src/querier/abstractQuerierPool.ts +0 -18
- package/src/querier/abstractSqlQuerier-spec.ts +0 -979
- package/src/querier/abstractSqlQuerier-test.ts +0 -21
- package/src/querier/abstractSqlQuerier.ts +0 -138
- package/src/querier/decorator/index.ts +0 -3
- package/src/querier/decorator/injectQuerier.spec.ts +0 -74
- package/src/querier/decorator/injectQuerier.ts +0 -45
- package/src/querier/decorator/serialized.spec.ts +0 -98
- package/src/querier/decorator/serialized.ts +0 -13
- package/src/querier/decorator/transactional.spec.ts +0 -240
- package/src/querier/decorator/transactional.ts +0 -56
- package/src/querier/index.ts +0 -4
- package/src/repository/genericRepository.spec.ts +0 -111
- package/src/repository/genericRepository.ts +0 -74
- package/src/repository/index.ts +0 -1
- package/src/sqlite/index.ts +0 -3
- package/src/sqlite/manual-types.d.ts +0 -4
- package/src/sqlite/sqliteDialect.spec.ts +0 -155
- package/src/sqlite/sqliteDialect.ts +0 -76
- package/src/sqlite/sqliteQuerier.spec.ts +0 -36
- package/src/sqlite/sqliteQuerier.test.ts +0 -21
- package/src/sqlite/sqliteQuerier.ts +0 -37
- package/src/sqlite/sqliteQuerierPool.test.ts +0 -12
- package/src/sqlite/sqliteQuerierPool.ts +0 -38
- package/src/test/entityMock.ts +0 -375
- package/src/test/index.ts +0 -3
- package/src/test/it.util.ts +0 -69
- package/src/test/spec.util.ts +0 -57
- package/src/type/entity.ts +0 -218
- package/src/type/index.ts +0 -9
- package/src/type/migration.ts +0 -241
- package/src/type/namingStrategy.ts +0 -17
- package/src/type/querier.ts +0 -143
- package/src/type/querierPool.ts +0 -26
- package/src/type/query.ts +0 -506
- package/src/type/repository.ts +0 -142
- package/src/type/universalQuerier.ts +0 -133
- package/src/type/utility.ts +0 -21
- package/src/util/dialect.util-extra.spec.ts +0 -96
- package/src/util/dialect.util.spec.ts +0 -23
- package/src/util/dialect.util.ts +0 -134
- package/src/util/index.ts +0 -5
- package/src/util/object.util.spec.ts +0 -29
- package/src/util/object.util.ts +0 -27
- package/src/util/raw.ts +0 -11
- package/src/util/sql.util-extra.spec.ts +0 -17
- package/src/util/sql.util.spec.ts +0 -208
- package/src/util/sql.util.ts +0 -104
- package/src/util/string.util.spec.ts +0 -46
- package/src/util/string.util.ts +0 -35
- package/tsconfig.build.json +0 -5
- package/tsconfig.json +0 -8
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'bun:test';
|
|
2
|
-
import { Entity, Field, Id } from '../entity/index.js';
|
|
3
|
-
import { SnakeCaseNamingStrategy } from '../index.js';
|
|
4
|
-
import { PostgresSchemaGenerator } from './generator/postgresSchemaGenerator.js';
|
|
5
|
-
|
|
6
|
-
@Entity()
|
|
7
|
-
class UserProfileMigrate {
|
|
8
|
-
@Id() id?: number;
|
|
9
|
-
@Field() firstName?: string;
|
|
10
|
-
@Field() lastName?: string;
|
|
11
|
-
}
|
|
12
|
-
|
|
13
|
-
describe('Schema Generator with Naming Strategy', () => {
|
|
14
|
-
it('should generate CREATE TABLE with translated names', () => {
|
|
15
|
-
const generator = new PostgresSchemaGenerator(new SnakeCaseNamingStrategy());
|
|
16
|
-
const sql = generator.generateCreateTable(UserProfileMigrate);
|
|
17
|
-
|
|
18
|
-
expect(sql).toContain('CREATE TABLE "user_profile_migrate"');
|
|
19
|
-
expect(sql).toContain('"first_name"');
|
|
20
|
-
expect(sql).toContain('"last_name"');
|
|
21
|
-
});
|
|
22
|
-
});
|
|
@@ -1,138 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'bun:test';
|
|
2
|
-
import { Entity, Field, Id } from '../entity/index.js';
|
|
3
|
-
import type { TableSchema } from '../type/index.js';
|
|
4
|
-
import { PostgresSchemaGenerator } from './generator/postgresSchemaGenerator.js';
|
|
5
|
-
|
|
6
|
-
@Entity()
|
|
7
|
-
class DiffUser {
|
|
8
|
-
@Id() id?: number;
|
|
9
|
-
@Field({ columnType: 'varchar', length: 255 }) name?: string;
|
|
10
|
-
@Field({ columnType: 'varchar', length: 100 }) email?: string;
|
|
11
|
-
@Field({ columnType: 'varchar', length: 255, index: true }) status?: string;
|
|
12
|
-
}
|
|
13
|
-
|
|
14
|
-
describe('AbstractSchemaGenerator (via Postgres)', () => {
|
|
15
|
-
const generator = new PostgresSchemaGenerator();
|
|
16
|
-
|
|
17
|
-
it('diffSchema should detect new columns', () => {
|
|
18
|
-
const currentSchema: TableSchema = {
|
|
19
|
-
name: 'DiffUser',
|
|
20
|
-
columns: [
|
|
21
|
-
{ name: 'id', type: 'INTEGER', nullable: false, isPrimaryKey: true, isAutoIncrement: true, isUnique: false },
|
|
22
|
-
{
|
|
23
|
-
name: 'name',
|
|
24
|
-
type: 'VARCHAR',
|
|
25
|
-
length: 255,
|
|
26
|
-
nullable: true,
|
|
27
|
-
isPrimaryKey: false,
|
|
28
|
-
isAutoIncrement: false,
|
|
29
|
-
isUnique: false,
|
|
30
|
-
},
|
|
31
|
-
],
|
|
32
|
-
};
|
|
33
|
-
|
|
34
|
-
const diff = generator.diffSchema(DiffUser, currentSchema);
|
|
35
|
-
|
|
36
|
-
expect(diff).toBeDefined();
|
|
37
|
-
expect(diff?.type).toBe('alter');
|
|
38
|
-
expect(diff?.columnsToAdd).toHaveLength(2);
|
|
39
|
-
expect(diff?.columnsToAdd?.[0].name).toBe('email');
|
|
40
|
-
expect(diff?.columnsToAdd?.[1].name).toBe('status');
|
|
41
|
-
});
|
|
42
|
-
|
|
43
|
-
it('diffSchema should detect altered columns (type change)', () => {
|
|
44
|
-
const currentSchema: TableSchema = {
|
|
45
|
-
name: 'DiffUser',
|
|
46
|
-
columns: [
|
|
47
|
-
{ name: 'id', type: 'BIGINT', nullable: false, isPrimaryKey: true, isAutoIncrement: true, isUnique: false },
|
|
48
|
-
{ name: 'name', type: 'TEXT', nullable: true, isPrimaryKey: false, isAutoIncrement: false, isUnique: false },
|
|
49
|
-
{
|
|
50
|
-
name: 'email',
|
|
51
|
-
type: 'VARCHAR',
|
|
52
|
-
length: 50,
|
|
53
|
-
nullable: true,
|
|
54
|
-
isPrimaryKey: false,
|
|
55
|
-
isAutoIncrement: false,
|
|
56
|
-
isUnique: false,
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
name: 'status',
|
|
60
|
-
type: 'VARCHAR',
|
|
61
|
-
length: 255,
|
|
62
|
-
nullable: true,
|
|
63
|
-
isPrimaryKey: false,
|
|
64
|
-
isAutoIncrement: false,
|
|
65
|
-
isUnique: false,
|
|
66
|
-
},
|
|
67
|
-
],
|
|
68
|
-
};
|
|
69
|
-
|
|
70
|
-
const diff = generator.diffSchema(DiffUser, currentSchema);
|
|
71
|
-
|
|
72
|
-
expect(diff).toBeDefined();
|
|
73
|
-
expect(diff?.type).toBe('alter');
|
|
74
|
-
expect(diff?.columnsToAlter).toHaveLength(3);
|
|
75
|
-
expect(diff?.columnsToAlter?.[0].to.name).toBe('name');
|
|
76
|
-
expect(diff?.columnsToAlter?.[1].to.name).toBe('email');
|
|
77
|
-
expect(diff?.columnsToAlter?.[2].to.name).toBe('status');
|
|
78
|
-
});
|
|
79
|
-
|
|
80
|
-
it('diffSchema should detect columns to drop', () => {
|
|
81
|
-
const currentSchema: TableSchema = {
|
|
82
|
-
name: 'DiffUser',
|
|
83
|
-
columns: [
|
|
84
|
-
{ name: 'id', type: 'INTEGER', nullable: false, isPrimaryKey: true, isAutoIncrement: true, isUnique: false },
|
|
85
|
-
{ name: 'name', type: 'VARCHAR', nullable: true, isPrimaryKey: false, isAutoIncrement: false, isUnique: false },
|
|
86
|
-
{
|
|
87
|
-
name: 'email',
|
|
88
|
-
type: 'VARCHAR',
|
|
89
|
-
length: 100,
|
|
90
|
-
nullable: true,
|
|
91
|
-
isPrimaryKey: false,
|
|
92
|
-
isAutoIncrement: false,
|
|
93
|
-
isUnique: false,
|
|
94
|
-
},
|
|
95
|
-
{
|
|
96
|
-
name: 'status',
|
|
97
|
-
type: 'VARCHAR',
|
|
98
|
-
nullable: true,
|
|
99
|
-
isPrimaryKey: false,
|
|
100
|
-
isAutoIncrement: false,
|
|
101
|
-
isUnique: false,
|
|
102
|
-
},
|
|
103
|
-
{
|
|
104
|
-
name: 'old_col',
|
|
105
|
-
type: 'VARCHAR',
|
|
106
|
-
nullable: true,
|
|
107
|
-
isPrimaryKey: false,
|
|
108
|
-
isAutoIncrement: false,
|
|
109
|
-
isUnique: false,
|
|
110
|
-
},
|
|
111
|
-
],
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
const diff = generator.diffSchema(DiffUser, currentSchema);
|
|
115
|
-
|
|
116
|
-
expect(diff).toBeDefined();
|
|
117
|
-
expect(diff?.type).toBe('alter');
|
|
118
|
-
expect(diff?.columnsToDrop).toEqual(['old_col']);
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
it('generateAlterTable should produce correct SQL', () => {
|
|
122
|
-
const sql = generator.generateAlterTable({
|
|
123
|
-
tableName: 'users',
|
|
124
|
-
type: 'alter',
|
|
125
|
-
columnsToAdd: [
|
|
126
|
-
{ name: 'age', type: 'INTEGER', nullable: true, isPrimaryKey: false, isAutoIncrement: false, isUnique: false },
|
|
127
|
-
],
|
|
128
|
-
columnsToDrop: ['old_name'],
|
|
129
|
-
indexesToAdd: [{ name: 'idx_age', columns: ['age'], unique: false }],
|
|
130
|
-
indexesToDrop: ['idx_old'],
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
expect(sql).toContain('ALTER TABLE "users" ADD COLUMN "age" INTEGER;');
|
|
134
|
-
expect(sql).toContain('ALTER TABLE "users" DROP COLUMN "old_name";');
|
|
135
|
-
expect(sql).toContain('CREATE INDEX "idx_age" ON "users" ("age");');
|
|
136
|
-
expect(sql).toContain('DROP INDEX IF EXISTS "idx_old";');
|
|
137
|
-
});
|
|
138
|
-
});
|
|
@@ -1,190 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from 'bun:test';
|
|
2
|
-
import { Entity, Field, Id, ManyToOne } from '../entity/index.js';
|
|
3
|
-
import { MysqlSchemaGenerator } from './generator/mysqlSchemaGenerator.js';
|
|
4
|
-
import { PostgresSchemaGenerator } from './generator/postgresSchemaGenerator.js';
|
|
5
|
-
import { SqliteSchemaGenerator } from './generator/sqliteSchemaGenerator.js';
|
|
6
|
-
|
|
7
|
-
// Test entities
|
|
8
|
-
@Entity()
|
|
9
|
-
class TestUser {
|
|
10
|
-
@Id()
|
|
11
|
-
id?: number;
|
|
12
|
-
|
|
13
|
-
@Field({ length: 100 })
|
|
14
|
-
name?: string;
|
|
15
|
-
|
|
16
|
-
@Field({ unique: true })
|
|
17
|
-
email?: string;
|
|
18
|
-
|
|
19
|
-
@Field({ nullable: false })
|
|
20
|
-
password?: string;
|
|
21
|
-
|
|
22
|
-
@Field({ onInsert: Date.now })
|
|
23
|
-
createdAt?: number;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
@Entity({ name: 'blog_posts' })
|
|
27
|
-
class TestPost {
|
|
28
|
-
@Id({ onInsert: () => crypto.randomUUID(), length: 36 })
|
|
29
|
-
id?: string;
|
|
30
|
-
|
|
31
|
-
@Field()
|
|
32
|
-
title?: string;
|
|
33
|
-
|
|
34
|
-
@Field({ columnType: 'text' })
|
|
35
|
-
content?: string;
|
|
36
|
-
|
|
37
|
-
@Field({ type: 'jsonb' })
|
|
38
|
-
metadata?: Record<string, unknown>;
|
|
39
|
-
|
|
40
|
-
@Field({ reference: () => TestUser })
|
|
41
|
-
authorId?: number;
|
|
42
|
-
|
|
43
|
-
@ManyToOne()
|
|
44
|
-
author?: TestUser;
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
describe('PostgresSchemaGenerator', () => {
|
|
48
|
-
const generator = new PostgresSchemaGenerator();
|
|
49
|
-
|
|
50
|
-
it('should generate CREATE TABLE for simple entity', () => {
|
|
51
|
-
const sql = generator.generateCreateTable(TestUser);
|
|
52
|
-
|
|
53
|
-
expect(sql).toContain('CREATE TABLE "TestUser"');
|
|
54
|
-
expect(sql).toContain('"id" SERIAL PRIMARY KEY');
|
|
55
|
-
expect(sql).toContain('"name" VARCHAR(100)');
|
|
56
|
-
expect(sql).toContain('"email" VARCHAR(255) UNIQUE');
|
|
57
|
-
expect(sql).toContain('"password" VARCHAR(255) NOT NULL');
|
|
58
|
-
expect(sql).toContain('"createdAt"');
|
|
59
|
-
});
|
|
60
|
-
|
|
61
|
-
it('should generate CREATE TABLE with UUID primary key', () => {
|
|
62
|
-
const sql = generator.generateCreateTable(TestPost);
|
|
63
|
-
|
|
64
|
-
expect(sql).toContain('CREATE TABLE "blog_posts"');
|
|
65
|
-
expect(sql).toContain('"id" VARCHAR(36) PRIMARY KEY');
|
|
66
|
-
expect(sql).toContain('"title" VARCHAR(255)');
|
|
67
|
-
expect(sql).toContain('"content" TEXT');
|
|
68
|
-
expect(sql).toContain('"metadata" JSONB');
|
|
69
|
-
expect(sql).toContain('"authorId"');
|
|
70
|
-
});
|
|
71
|
-
|
|
72
|
-
it('should generate DROP TABLE statement', () => {
|
|
73
|
-
const sql = generator.generateDropTable(TestUser);
|
|
74
|
-
|
|
75
|
-
expect(sql).toBe('DROP TABLE IF EXISTS "TestUser";');
|
|
76
|
-
});
|
|
77
|
-
|
|
78
|
-
it('should generate CREATE INDEX statement', () => {
|
|
79
|
-
const sql = generator.generateCreateIndex('users', {
|
|
80
|
-
name: 'idx_users_email',
|
|
81
|
-
columns: ['email'],
|
|
82
|
-
unique: true,
|
|
83
|
-
});
|
|
84
|
-
|
|
85
|
-
expect(sql).toBe('CREATE UNIQUE INDEX "idx_users_email" ON "users" ("email");');
|
|
86
|
-
});
|
|
87
|
-
|
|
88
|
-
it('should generate CREATE TABLE with IF NOT EXISTS', () => {
|
|
89
|
-
const sql = generator.generateCreateTable(TestUser, { ifNotExists: true });
|
|
90
|
-
expect(sql).toContain('CREATE TABLE IF NOT EXISTS "TestUser"');
|
|
91
|
-
});
|
|
92
|
-
|
|
93
|
-
it('should handle embedded quotes in table names', () => {
|
|
94
|
-
@Entity({ name: 'my"table' })
|
|
95
|
-
class TestEntity {
|
|
96
|
-
@Id()
|
|
97
|
-
id?: number;
|
|
98
|
-
}
|
|
99
|
-
const sql = generator.generateCreateTable(TestEntity);
|
|
100
|
-
expect(sql).toContain('CREATE TABLE "my""table"');
|
|
101
|
-
});
|
|
102
|
-
|
|
103
|
-
it('should handle already-typed column schemas', () => {
|
|
104
|
-
const sql = generator.generateAlterTable({
|
|
105
|
-
tableName: 'users',
|
|
106
|
-
type: 'alter',
|
|
107
|
-
columnsToAdd: [
|
|
108
|
-
{
|
|
109
|
-
name: 'profile_data',
|
|
110
|
-
type: 'JSONB',
|
|
111
|
-
nullable: true,
|
|
112
|
-
isPrimaryKey: false,
|
|
113
|
-
isAutoIncrement: false,
|
|
114
|
-
isUnique: false,
|
|
115
|
-
},
|
|
116
|
-
],
|
|
117
|
-
});
|
|
118
|
-
// Should NOT be JSONB(JSONB)
|
|
119
|
-
expect(sql[0]).toContain('ADD COLUMN "profile_data" JSONB');
|
|
120
|
-
expect(sql[0]).not.toContain('JSONB(');
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
it('should generate ALTER TABLE DOWN statements', () => {
|
|
124
|
-
const sql = generator.generateAlterTableDown({
|
|
125
|
-
tableName: 'users',
|
|
126
|
-
type: 'alter',
|
|
127
|
-
columnsToAdd: [
|
|
128
|
-
{
|
|
129
|
-
name: 'profile_data',
|
|
130
|
-
type: 'JSONB',
|
|
131
|
-
nullable: true,
|
|
132
|
-
isPrimaryKey: false,
|
|
133
|
-
isAutoIncrement: false,
|
|
134
|
-
isUnique: false,
|
|
135
|
-
},
|
|
136
|
-
],
|
|
137
|
-
});
|
|
138
|
-
expect(sql[0]).toBe('ALTER TABLE "users" DROP COLUMN "profile_data";');
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
|
|
142
|
-
describe('MysqlSchemaGenerator', () => {
|
|
143
|
-
const generator = new MysqlSchemaGenerator();
|
|
144
|
-
|
|
145
|
-
it('should generate CREATE TABLE for simple entity', () => {
|
|
146
|
-
const sql = generator.generateCreateTable(TestUser);
|
|
147
|
-
|
|
148
|
-
expect(sql).toContain('CREATE TABLE `TestUser`');
|
|
149
|
-
expect(sql).toContain('`id` INT AUTO_INCREMENT PRIMARY KEY');
|
|
150
|
-
expect(sql).toContain('`name` VARCHAR(100)');
|
|
151
|
-
expect(sql).toContain('`email` VARCHAR(255) UNIQUE');
|
|
152
|
-
expect(sql).toContain('ENGINE=InnoDB');
|
|
153
|
-
});
|
|
154
|
-
|
|
155
|
-
it('should generate boolean as TINYINT(1)', () => {
|
|
156
|
-
const boolType = generator.getSqlType({ type: Boolean }, Boolean);
|
|
157
|
-
expect(boolType).toBe('TINYINT(1)');
|
|
158
|
-
});
|
|
159
|
-
|
|
160
|
-
it('should generate DROP INDEX with ON table', () => {
|
|
161
|
-
const sql = generator.generateDropIndex('users', 'idx_email');
|
|
162
|
-
expect(sql).toBe('DROP INDEX `idx_email` ON `users`;');
|
|
163
|
-
});
|
|
164
|
-
});
|
|
165
|
-
|
|
166
|
-
describe('SqliteSchemaGenerator', () => {
|
|
167
|
-
const generator = new SqliteSchemaGenerator();
|
|
168
|
-
|
|
169
|
-
it('should generate CREATE TABLE for simple entity', () => {
|
|
170
|
-
const sql = generator.generateCreateTable(TestUser);
|
|
171
|
-
|
|
172
|
-
expect(sql).toContain('CREATE TABLE `TestUser`');
|
|
173
|
-
expect(sql).toContain('`id` INTEGER PRIMARY KEY AUTOINCREMENT');
|
|
174
|
-
// SQLite uses VARCHAR when length is specified, which is fine as SQLite has dynamic typing
|
|
175
|
-
expect(sql).toContain('`name` VARCHAR(100)');
|
|
176
|
-
expect(sql).toContain('`email` VARCHAR(255) UNIQUE');
|
|
177
|
-
});
|
|
178
|
-
|
|
179
|
-
it('should use TEXT for most types (SQLite dynamic typing)', () => {
|
|
180
|
-
expect(generator.getSqlType({ columnType: 'varchar' }, String)).toBe('TEXT');
|
|
181
|
-
expect(generator.getSqlType({ columnType: 'json' }, undefined)).toBe('TEXT');
|
|
182
|
-
expect(generator.getSqlType({ columnType: 'uuid' }, undefined)).toBe('TEXT');
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
it('should use INTEGER for numeric types', () => {
|
|
186
|
-
expect(generator.getSqlType({ columnType: 'int' }, undefined)).toBe('INTEGER');
|
|
187
|
-
expect(generator.getSqlType({ columnType: 'bigint' }, undefined)).toBe('INTEGER');
|
|
188
|
-
expect(generator.getSqlType({ type: Boolean }, Boolean)).toBe('INTEGER');
|
|
189
|
-
});
|
|
190
|
-
});
|