@proteinjs/db 1.0.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.
Files changed (165) hide show
  1. package/CHANGELOG.md +16 -0
  2. package/LICENSE +21 -0
  3. package/dist/generated/index.d.ts +11 -0
  4. package/dist/generated/index.d.ts.map +1 -0
  5. package/dist/generated/index.js +59 -0
  6. package/dist/generated/index.js.map +1 -0
  7. package/dist/index.d.ts +21 -0
  8. package/dist/index.d.ts.map +1 -0
  9. package/dist/index.js +37 -0
  10. package/dist/index.js.map +1 -0
  11. package/dist/src/Columns.d.ts +100 -0
  12. package/dist/src/Columns.d.ts.map +1 -0
  13. package/dist/src/Columns.js +381 -0
  14. package/dist/src/Columns.js.map +1 -0
  15. package/dist/src/Db.d.ts +46 -0
  16. package/dist/src/Db.d.ts.map +1 -0
  17. package/dist/src/Db.js +393 -0
  18. package/dist/src/Db.js.map +1 -0
  19. package/dist/src/MigrationRunner.d.ts +10 -0
  20. package/dist/src/MigrationRunner.d.ts.map +1 -0
  21. package/dist/src/MigrationRunner.js +124 -0
  22. package/dist/src/MigrationRunner.js.map +1 -0
  23. package/dist/src/QueryBuilderFactory.d.ts +8 -0
  24. package/dist/src/QueryBuilderFactory.d.ts.map +1 -0
  25. package/dist/src/QueryBuilderFactory.js +21 -0
  26. package/dist/src/QueryBuilderFactory.js.map +1 -0
  27. package/dist/src/Record.d.ts +38 -0
  28. package/dist/src/Record.d.ts.map +1 -0
  29. package/dist/src/Record.js +209 -0
  30. package/dist/src/Record.js.map +1 -0
  31. package/dist/src/RecordIterator.d.ts +13 -0
  32. package/dist/src/RecordIterator.d.ts.map +1 -0
  33. package/dist/src/RecordIterator.js +98 -0
  34. package/dist/src/RecordIterator.js.map +1 -0
  35. package/dist/src/StatementConfigFactory.d.ts +11 -0
  36. package/dist/src/StatementConfigFactory.d.ts.map +1 -0
  37. package/dist/src/StatementConfigFactory.js +31 -0
  38. package/dist/src/StatementConfigFactory.js.map +1 -0
  39. package/dist/src/Table.d.ts +98 -0
  40. package/dist/src/Table.d.ts.map +1 -0
  41. package/dist/src/Table.js +56 -0
  42. package/dist/src/Table.js.map +1 -0
  43. package/dist/src/auth/TableAuth.d.ts +29 -0
  44. package/dist/src/auth/TableAuth.d.ts.map +1 -0
  45. package/dist/src/auth/TableAuth.js +45 -0
  46. package/dist/src/auth/TableAuth.js.map +1 -0
  47. package/dist/src/auth/TableServiceAuth.d.ts +5 -0
  48. package/dist/src/auth/TableServiceAuth.d.ts.map +1 -0
  49. package/dist/src/auth/TableServiceAuth.js +37 -0
  50. package/dist/src/auth/TableServiceAuth.js.map +1 -0
  51. package/dist/src/opt/moment.d.ts +4 -0
  52. package/dist/src/opt/moment.d.ts.map +1 -0
  53. package/dist/src/opt/moment.js +9 -0
  54. package/dist/src/opt/moment.js.map +1 -0
  55. package/dist/src/reference/Reference.d.ts +26 -0
  56. package/dist/src/reference/Reference.d.ts.map +1 -0
  57. package/dist/src/reference/Reference.js +90 -0
  58. package/dist/src/reference/Reference.js.map +1 -0
  59. package/dist/src/reference/ReferenceArray.d.ts +29 -0
  60. package/dist/src/reference/ReferenceArray.d.ts.map +1 -0
  61. package/dist/src/reference/ReferenceArray.js +101 -0
  62. package/dist/src/reference/ReferenceArray.js.map +1 -0
  63. package/dist/src/schema/SchemaMetadata.d.ts +27 -0
  64. package/dist/src/schema/SchemaMetadata.d.ts.map +1 -0
  65. package/dist/src/schema/SchemaMetadata.js +227 -0
  66. package/dist/src/schema/SchemaMetadata.js.map +1 -0
  67. package/dist/src/schema/SchemaOperations.d.ts +40 -0
  68. package/dist/src/schema/SchemaOperations.d.ts.map +1 -0
  69. package/dist/src/schema/SchemaOperations.js +3 -0
  70. package/dist/src/schema/SchemaOperations.js.map +1 -0
  71. package/dist/src/schema/TableManager.d.ts +21 -0
  72. package/dist/src/schema/TableManager.d.ts.map +1 -0
  73. package/dist/src/schema/TableManager.js +254 -0
  74. package/dist/src/schema/TableManager.js.map +1 -0
  75. package/dist/src/serializers/GraphSerializer.d.ts +13 -0
  76. package/dist/src/serializers/GraphSerializer.d.ts.map +1 -0
  77. package/dist/src/serializers/GraphSerializer.js +21 -0
  78. package/dist/src/serializers/GraphSerializer.js.map +1 -0
  79. package/dist/src/serializers/QueryBuilderSerializer.d.ts +19 -0
  80. package/dist/src/serializers/QueryBuilderSerializer.d.ts.map +1 -0
  81. package/dist/src/serializers/QueryBuilderSerializer.js +32 -0
  82. package/dist/src/serializers/QueryBuilderSerializer.js.map +1 -0
  83. package/dist/src/serializers/ReferenceArraySerializer.d.ts +15 -0
  84. package/dist/src/serializers/ReferenceArraySerializer.d.ts.map +1 -0
  85. package/dist/src/serializers/ReferenceArraySerializer.js +23 -0
  86. package/dist/src/serializers/ReferenceArraySerializer.js.map +1 -0
  87. package/dist/src/serializers/ReferenceSerializer.d.ts +15 -0
  88. package/dist/src/serializers/ReferenceSerializer.d.ts.map +1 -0
  89. package/dist/src/serializers/ReferenceSerializer.js +23 -0
  90. package/dist/src/serializers/ReferenceSerializer.js.map +1 -0
  91. package/dist/src/serializers/TableSerializer.d.ts +13 -0
  92. package/dist/src/serializers/TableSerializer.d.ts.map +1 -0
  93. package/dist/src/serializers/TableSerializer.js +19 -0
  94. package/dist/src/serializers/TableSerializer.js.map +1 -0
  95. package/dist/src/services/DbService.d.ts +19 -0
  96. package/dist/src/services/DbService.d.ts.map +1 -0
  97. package/dist/src/services/DbService.js +6 -0
  98. package/dist/src/services/DbService.js.map +1 -0
  99. package/dist/src/services/MigrationRunnerService.d.ts +6 -0
  100. package/dist/src/services/MigrationRunnerService.d.ts.map +1 -0
  101. package/dist/src/services/MigrationRunnerService.js +6 -0
  102. package/dist/src/services/MigrationRunnerService.js.map +1 -0
  103. package/dist/src/source/SourceRecord.d.ts +44 -0
  104. package/dist/src/source/SourceRecord.d.ts.map +1 -0
  105. package/dist/src/source/SourceRecord.js +49 -0
  106. package/dist/src/source/SourceRecord.js.map +1 -0
  107. package/dist/src/source/SourceRecordLoader.d.ts +6 -0
  108. package/dist/src/source/SourceRecordLoader.d.ts.map +1 -0
  109. package/dist/src/source/SourceRecordLoader.js +156 -0
  110. package/dist/src/source/SourceRecordLoader.js.map +1 -0
  111. package/dist/src/source/SourceRecordRepo.d.ts +8 -0
  112. package/dist/src/source/SourceRecordRepo.d.ts.map +1 -0
  113. package/dist/src/source/SourceRecordRepo.js +20 -0
  114. package/dist/src/source/SourceRecordRepo.js.map +1 -0
  115. package/dist/src/tables/MigrationTable.d.ts +41 -0
  116. package/dist/src/tables/MigrationTable.d.ts.map +1 -0
  117. package/dist/src/tables/MigrationTable.js +86 -0
  118. package/dist/src/tables/MigrationTable.js.map +1 -0
  119. package/dist/src/tables/tables.d.ts +6 -0
  120. package/dist/src/tables/tables.d.ts.map +1 -0
  121. package/dist/src/tables/tables.js +8 -0
  122. package/dist/src/tables/tables.js.map +1 -0
  123. package/dist/test/CrudTests.d.ts +20 -0
  124. package/dist/test/CrudTests.d.ts.map +1 -0
  125. package/dist/test/CrudTests.js +251 -0
  126. package/dist/test/CrudTests.js.map +1 -0
  127. package/dist/test/TableManagerTests.d.ts +8 -0
  128. package/dist/test/TableManagerTests.d.ts.map +1 -0
  129. package/dist/test/TableManagerTests.js +687 -0
  130. package/dist/test/TableManagerTests.js.map +1 -0
  131. package/generated/index.ts +55 -0
  132. package/index.ts +25 -0
  133. package/jest.config.js +18 -0
  134. package/package.json +45 -0
  135. package/src/Columns.ts +257 -0
  136. package/src/Db.ts +195 -0
  137. package/src/MigrationRunner.ts +62 -0
  138. package/src/QueryBuilderFactory.ts +18 -0
  139. package/src/Record.ts +113 -0
  140. package/src/RecordIterator.ts +44 -0
  141. package/src/StatementConfigFactory.ts +36 -0
  142. package/src/Table.ts +124 -0
  143. package/src/auth/TableAuth.ts +60 -0
  144. package/src/auth/TableServiceAuth.ts +32 -0
  145. package/src/opt/moment.ts +4 -0
  146. package/src/reference/Reference.ts +45 -0
  147. package/src/reference/ReferenceArray.ts +56 -0
  148. package/src/schema/SchemaMetadata.ts +115 -0
  149. package/src/schema/SchemaOperations.ts +44 -0
  150. package/src/schema/TableManager.ts +198 -0
  151. package/src/serializers/GraphSerializer.ts +22 -0
  152. package/src/serializers/QueryBuilderSerializer.ts +39 -0
  153. package/src/serializers/ReferenceArraySerializer.ts +26 -0
  154. package/src/serializers/ReferenceSerializer.ts +26 -0
  155. package/src/serializers/TableSerializer.ts +20 -0
  156. package/src/services/DbService.ts +19 -0
  157. package/src/services/MigrationRunnerService.ts +7 -0
  158. package/src/source/SourceRecord.ts +75 -0
  159. package/src/source/SourceRecordLoader.ts +68 -0
  160. package/src/source/SourceRecordRepo.ts +17 -0
  161. package/src/tables/MigrationTable.ts +36 -0
  162. package/src/tables/tables.ts +6 -0
  163. package/test/CrudTests.ts +110 -0
  164. package/test/TableManagerTests.ts +382 -0
  165. package/tsconfig.json +23 -0
@@ -0,0 +1,382 @@
1
+ import { BinaryColumn, BooleanColumn, DateColumn, DateTimeColumn, DecimalColumn, FloatColumn, IntegerColumn, ObjectColumn, StringColumn, UuidColumn } from '../src/Columns'
2
+ import { DbDriver } from '../src/Db'
3
+ import { Record, withRecordColumns } from '../src/Record'
4
+ import { Column, Table } from '../src/Table'
5
+
6
+ interface User extends Record {
7
+ name: string,
8
+ email: string,
9
+ active: boolean,
10
+ };
11
+
12
+ class UserTable extends Table<User> {
13
+ name = 'db_test_user';
14
+ columns = withRecordColumns<User>({
15
+ name: new StringColumn('name'),
16
+ email: new StringColumn('email'),
17
+ active: new BooleanColumn('active'),
18
+ });
19
+ indexes = [
20
+ { name: 'db_test_user_email_index', columns: ['email'] as (keyof User)[] },
21
+ { name: 'db_test_user_active_email_index', columns: ['active', 'email'] as (keyof User)[] },
22
+ ]
23
+ };
24
+
25
+ interface ColumnTypes extends Record {
26
+ integer: number;
27
+ bigInteger: number;
28
+ text: string;
29
+ string: string;
30
+ float: number;
31
+ decimal: number;
32
+ boolean: boolean;
33
+ date: Date;
34
+ dateTime: moment.Moment;
35
+ binary: boolean;
36
+ object: any;
37
+ uuid: string;
38
+ }
39
+
40
+ class ColumnTypesTable extends Table<ColumnTypes> {
41
+ name = 'db_test_column_types';
42
+ columns = withRecordColumns<ColumnTypes>({
43
+ integer: new IntegerColumn('integer', { nullable: true }),
44
+ bigInteger: new IntegerColumn('big_integer', { nullable: false }, true),
45
+ string: new StringColumn('string', { references: { table: 'db_test_user' } }),
46
+ text: new StringColumn('text', undefined, 'MAX'),
47
+ float: new FloatColumn('float', { defaultValue: async () => 0.5 }),
48
+ decimal: new DecimalColumn('decimal'),
49
+ boolean: new BooleanColumn('boolean'),
50
+ date: new DateColumn('date'),
51
+ dateTime: new DateTimeColumn('date_time'),
52
+ binary: new BinaryColumn('binary'),
53
+ object: new ObjectColumn('object'),
54
+ uuid: new UuidColumn('uuid', { unique: { unique: true } })
55
+ });
56
+ }
57
+
58
+ export const tableManagerTests = (
59
+ driver: DbDriver,
60
+ dropTable: (table: Table<any>) => Promise<void>,
61
+ getColumnType: (column: Column<any, any>) => string,
62
+ excludedTests?: {
63
+ alterColumnName?: boolean,
64
+ alterColumnTypes?: boolean,
65
+ alterNullableConstraint?: boolean,
66
+ }
67
+ ) => {
68
+ return () => {
69
+ const tableManager = driver.getTableManager();
70
+
71
+ beforeAll(async () => {
72
+ if (driver.start)
73
+ await driver.start();
74
+ })
75
+
76
+ afterEach(async () => {
77
+ await dropTable(new ColumnTypesTable());
78
+ await dropTable(new UserTable());
79
+ })
80
+
81
+ afterAll(async () => {
82
+ if (driver.stop)
83
+ await driver.stop();
84
+ });
85
+
86
+ test('create primary key', async () => {
87
+ const userTable = new UserTable();
88
+ await tableManager.loadTable(userTable);
89
+ expect(await tableManager.tableExists(userTable)).toBeTruthy();
90
+ const primaryKey = await tableManager.schemaMetadata.getPrimaryKey(userTable);
91
+ expect(primaryKey[0]).toBe('id');
92
+ expect(primaryKey.length).toBe(1);
93
+ });
94
+
95
+ test('create columns', async () => {
96
+ const userTable = new UserTable();
97
+ await tableManager.loadTable(userTable);
98
+ expect(await tableManager.tableExists(userTable)).toBeTruthy();
99
+ expect(await tableManager.schemaMetadata.columnExists(userTable.columns.name.name, userTable)).toBeTruthy();
100
+ expect(await tableManager.schemaMetadata.columnExists(userTable.columns.email.name, userTable)).toBeTruthy();
101
+ expect(await tableManager.schemaMetadata.columnExists(userTable.columns.active.name, userTable)).toBeTruthy();
102
+ });
103
+
104
+ test('add column via alter', async () => {
105
+ const userTable = new UserTable();
106
+ const dataColumn = new ObjectColumn('data');
107
+ await tableManager.loadTable(userTable);
108
+ expect(await tableManager.tableExists(userTable)).toBeTruthy();
109
+ expect(await tableManager.schemaMetadata.columnExists(userTable.columns.name.name, userTable)).toBeTruthy();
110
+ expect(await tableManager.schemaMetadata.columnExists(userTable.columns.email.name, userTable)).toBeTruthy();
111
+ expect(await tableManager.schemaMetadata.columnExists(userTable.columns.active.name, userTable)).toBeTruthy();
112
+ expect(await tableManager.schemaMetadata.columnExists(dataColumn.name, userTable)).toBeFalsy();
113
+ (userTable as Table<any>).columns['data'] = dataColumn;
114
+ await tableManager.loadTable(userTable);
115
+ expect(await tableManager.tableExists(userTable)).toBeTruthy();
116
+ expect(await tableManager.schemaMetadata.columnExists(userTable.columns.name.name, userTable)).toBeTruthy();
117
+ expect(await tableManager.schemaMetadata.columnExists(userTable.columns.email.name, userTable)).toBeTruthy();
118
+ expect(await tableManager.schemaMetadata.columnExists(userTable.columns.active.name, userTable)).toBeTruthy();
119
+ expect(await tableManager.schemaMetadata.columnExists(dataColumn.name, userTable)).toBeTruthy();
120
+ });
121
+
122
+ test('columns created with correct types', async () => {
123
+ const userTable = new UserTable();
124
+ const columnTypesTable = new ColumnTypesTable();
125
+ await tableManager.loadTable(userTable);
126
+ await tableManager.loadTable(columnTypesTable);
127
+ expect(await tableManager.tableExists(columnTypesTable)).toBeTruthy();
128
+ const columnMetadata = await tableManager.schemaMetadata.getColumnMetadata(columnTypesTable);
129
+ expect(columnMetadata[columnTypesTable.columns.integer.name].type).toBe(getColumnType(columnTypesTable.columns.integer));
130
+ expect(columnMetadata[columnTypesTable.columns.bigInteger.name].type).toBe(getColumnType(columnTypesTable.columns.bigInteger));
131
+ expect(columnMetadata[columnTypesTable.columns.text.name].type).toBe(getColumnType(columnTypesTable.columns.text));
132
+ expect(columnMetadata[columnTypesTable.columns.string.name].type).toBe(getColumnType(columnTypesTable.columns.string));
133
+ expect(columnMetadata[columnTypesTable.columns.float.name].type).toBe(getColumnType(columnTypesTable.columns.float));
134
+ expect(columnMetadata[columnTypesTable.columns.decimal.name].type).toBe(getColumnType(columnTypesTable.columns.decimal));
135
+ expect(columnMetadata[columnTypesTable.columns.boolean.name].type).toBe(getColumnType(columnTypesTable.columns.boolean));
136
+ expect(columnMetadata[columnTypesTable.columns.date.name].type).toBe(getColumnType(columnTypesTable.columns.date));
137
+ expect(columnMetadata[columnTypesTable.columns.dateTime.name].type).toBe(getColumnType(columnTypesTable.columns.dateTime));
138
+ expect(columnMetadata[columnTypesTable.columns.binary.name].type).toBe(getColumnType(columnTypesTable.columns.binary));
139
+ expect(columnMetadata[columnTypesTable.columns.object.name].type).toBe(getColumnType(columnTypesTable.columns.object));
140
+ expect(columnMetadata[columnTypesTable.columns.uuid.name].type).toBe(getColumnType(columnTypesTable.columns.uuid));
141
+ });
142
+
143
+ test('columns created with correct options', async () => {
144
+ const userTable = new UserTable();
145
+ const columnTypesTable = new ColumnTypesTable();
146
+ await tableManager.loadTable(userTable);
147
+ await tableManager.loadTable(columnTypesTable);
148
+ expect(await tableManager.tableExists(userTable)).toBeTruthy();
149
+ expect(await tableManager.tableExists(columnTypesTable)).toBeTruthy();
150
+
151
+ const columnMetadata = await tableManager.schemaMetadata.getColumnMetadata(columnTypesTable);
152
+ expect(columnMetadata[columnTypesTable.columns.integer.name].isNullable).toBeTruthy();
153
+ expect(columnMetadata[columnTypesTable.columns.bigInteger.name].isNullable).toBeFalsy();
154
+ // expect(parseFloat(columnMetadata[TestColumnTypesTable.columns.float.name]['COLUMN_DEFAULT'])).toBe(0.5);
155
+
156
+ const foreignKeys = await tableManager.schemaMetadata.getForeignKeys(columnTypesTable);
157
+ expect(foreignKeys[columnTypesTable.columns.string.name].referencedTableName).toBe(userTable.name);
158
+ expect(foreignKeys[columnTypesTable.columns.string.name].referencedColumnName).toBe('id');
159
+
160
+ const uniqueColumns = await tableManager.schemaMetadata.getUniqueColumns(columnTypesTable);
161
+ expect(uniqueColumns.includes(columnTypesTable.columns.uuid.name)).toBeTruthy();
162
+ });
163
+
164
+ test('alter column name', async () => {
165
+ if (excludedTests?.alterColumnName)
166
+ return;
167
+
168
+ const userTable = new UserTable();
169
+ await tableManager.loadTable(userTable);
170
+ expect(await tableManager.tableExists(userTable)).toBeTruthy();
171
+ expect(await tableManager.schemaMetadata.columnExists(userTable.columns.name.name, userTable)).toBeTruthy();
172
+ userTable.columns.name.oldName = 'name';
173
+ userTable.columns.name.name = 'namo';
174
+ await tableManager.loadTable(userTable);
175
+ expect(await tableManager.schemaMetadata.columnExists('namo', userTable)).toBeTruthy();
176
+ expect(await tableManager.schemaMetadata.columnExists('name', userTable)).toBeFalsy();
177
+ });
178
+
179
+ test('alter column types', async () => {
180
+ if (excludedTests?.alterColumnTypes)
181
+ return;
182
+
183
+ const userTable = new UserTable();
184
+ const columnTypesTable = new ColumnTypesTable();
185
+ await tableManager.loadTable(userTable);
186
+ await tableManager.loadTable(columnTypesTable);
187
+ // const columnTypesTableIndexes = await tableManager.schemaMetadata.getIndexes(columnTypesTable);
188
+ // console.log(`columnTypesTableIndexes:\n${JSON.stringify(columnTypesTableIndexes, null, 2)}`)
189
+ expect(await tableManager.tableExists(userTable)).toBeTruthy();
190
+ expect(await tableManager.tableExists(columnTypesTable)).toBeTruthy();
191
+ columnTypesTable.columns.integer = new IntegerColumn('integer', { nullable: true }, true);
192
+ columnTypesTable.columns.bigInteger = new IntegerColumn('big_integer', { nullable: false });
193
+ columnTypesTable.columns.text = new StringColumn('text');
194
+ // TestColumnTypesTable.columns.string = new UuidColumn('string', { references: { table: 'user', column: 'id' } });
195
+ columnTypesTable.columns.float = new DecimalColumn('float', { defaultValue: async () => 0.5 });
196
+ columnTypesTable.columns.decimal = new FloatColumn('decimal');
197
+ columnTypesTable.columns.boolean = new IntegerColumn('boolean');
198
+ (columnTypesTable as Table<any>).columns.date = new DateTimeColumn('date');
199
+ columnTypesTable.columns.dateTime = new DateColumn('date_time');
200
+ columnTypesTable.columns.binary = new StringColumn('binary');
201
+ columnTypesTable.columns.uuid = new StringColumn('uuid', { unique: { unique: true } });
202
+ await tableManager.loadTable(columnTypesTable);
203
+ const columnMetadata = await tableManager.schemaMetadata.getColumnMetadata(columnTypesTable);
204
+ expect(columnMetadata[columnTypesTable.columns.integer.name].type).toBe(getColumnType(columnTypesTable.columns.integer));
205
+ expect(columnMetadata[columnTypesTable.columns.bigInteger.name].type).toBe(getColumnType(columnTypesTable.columns.bigInteger));
206
+ expect(columnMetadata[columnTypesTable.columns.text.name].type).toBe(getColumnType(columnTypesTable.columns.text));
207
+ expect(columnMetadata[columnTypesTable.columns.string.name].type).toBe(getColumnType(columnTypesTable.columns.string));
208
+ expect(columnMetadata[columnTypesTable.columns.float.name].type).toBe(getColumnType(columnTypesTable.columns.float));
209
+ expect(columnMetadata[columnTypesTable.columns.decimal.name].type).toBe(getColumnType(columnTypesTable.columns.decimal));
210
+ expect(columnMetadata[columnTypesTable.columns.boolean.name].type).toBe(getColumnType(columnTypesTable.columns.boolean));
211
+ expect(columnMetadata[columnTypesTable.columns.date.name].type).toBe(getColumnType(columnTypesTable.columns.date));
212
+ expect(columnMetadata[columnTypesTable.columns.dateTime.name].type).toBe(getColumnType(columnTypesTable.columns.dateTime));
213
+ expect(columnMetadata[columnTypesTable.columns.binary.name].type).toBe(getColumnType(columnTypesTable.columns.binary));
214
+ expect(columnMetadata[columnTypesTable.columns.object.name].type).toBe(getColumnType(columnTypesTable.columns.object));
215
+ expect(columnMetadata[columnTypesTable.columns.uuid.name].type).toBe(getColumnType(columnTypesTable.columns.uuid));
216
+ const foreignKeys = await tableManager.schemaMetadata.getForeignKeys(columnTypesTable);
217
+ const uniqueColumns = await tableManager.schemaMetadata.getUniqueColumns(columnTypesTable);
218
+ expect(columnMetadata[columnTypesTable.columns.integer.name].isNullable).toBeTruthy();
219
+ expect(columnMetadata[columnTypesTable.columns.bigInteger.name].isNullable).toBeFalsy();
220
+ // expect(parseFloat(columnMetadata[TestColumnTypesTable.columns.float.name]['COLUMN_DEFAULT'])).toBe(0.5);
221
+ expect(foreignKeys[columnTypesTable.columns.string.name].referencedTableName).toBe(userTable.name);
222
+ expect(foreignKeys[columnTypesTable.columns.string.name].referencedColumnName).toBe('id');
223
+ expect(uniqueColumns.includes(columnTypesTable.columns.uuid.name)).toBeTruthy();
224
+ });
225
+
226
+ test('alter unique constraint', async () => {
227
+ const userTable = new UserTable();
228
+ const columnTypesTable = new ColumnTypesTable();
229
+ await tableManager.loadTable(userTable);
230
+ columnTypesTable.columns.text.options = { defaultValue: async () => 'asdf' };
231
+ (columnTypesTable as Table<any>).columns['string2'] = new StringColumn('string2', { references: { table: userTable.name } });
232
+ await tableManager.loadTable(columnTypesTable);
233
+ expect(await tableManager.tableExists(userTable)).toBeTruthy();
234
+ expect(await tableManager.tableExists(columnTypesTable)).toBeTruthy();
235
+ let columnMetadata = await tableManager.schemaMetadata.getColumnMetadata(columnTypesTable);
236
+ expect(columnMetadata[columnTypesTable.columns.integer.name].type).toBe(getColumnType(columnTypesTable.columns.integer));
237
+ expect(columnMetadata[columnTypesTable.columns.bigInteger.name].type).toBe(getColumnType(columnTypesTable.columns.bigInteger));
238
+ expect(columnMetadata[columnTypesTable.columns.text.name].type).toBe(getColumnType(columnTypesTable.columns.text));
239
+ expect(columnMetadata[columnTypesTable.columns.string.name].type).toBe(getColumnType(columnTypesTable.columns.string));
240
+ expect(columnMetadata[columnTypesTable.columns.float.name].type).toBe(getColumnType(columnTypesTable.columns.float));
241
+ expect(columnMetadata[columnTypesTable.columns.decimal.name].type).toBe(getColumnType(columnTypesTable.columns.decimal));
242
+ expect(columnMetadata[columnTypesTable.columns.boolean.name].type).toBe(getColumnType(columnTypesTable.columns.boolean));
243
+ expect(columnMetadata[columnTypesTable.columns.date.name].type).toBe(getColumnType(columnTypesTable.columns.date));
244
+ expect(columnMetadata[columnTypesTable.columns.dateTime.name].type).toBe(getColumnType(columnTypesTable.columns.dateTime));
245
+ expect(columnMetadata[columnTypesTable.columns.binary.name].type).toBe(getColumnType(columnTypesTable.columns.binary));
246
+ expect(columnMetadata[columnTypesTable.columns.object.name].type).toBe(getColumnType(columnTypesTable.columns.object));
247
+ expect(columnMetadata[columnTypesTable.columns.uuid.name].type).toBe(getColumnType(columnTypesTable.columns.uuid));
248
+ expect(columnMetadata[(columnTypesTable as Table<any>).columns.string2.name].type).toBe(getColumnType((columnTypesTable as Table<any>).columns.string2));
249
+ let foreignKeys = await tableManager.schemaMetadata.getForeignKeys(columnTypesTable);
250
+ let uniqueColumns = await tableManager.schemaMetadata.getUniqueColumns(columnTypesTable);
251
+ expect(columnMetadata[columnTypesTable.columns.integer.name].isNullable).toBeTruthy();
252
+ expect(columnMetadata[columnTypesTable.columns.bigInteger.name].isNullable).toBeFalsy();
253
+ // expect(parseFloat(columnMetadata[TestColumnTypesTable.columns.float.name]['COLUMN_DEFAULT'])).toBe(0.5);
254
+ expect(foreignKeys[columnTypesTable.columns.string.name].referencedTableName).toBe(userTable.name);
255
+ expect(foreignKeys[columnTypesTable.columns.string.name].referencedColumnName).toBe('id');
256
+ expect(uniqueColumns.includes(columnTypesTable.columns.uuid.name)).toBeTruthy();
257
+ // columnTypesTable.columns.text = new TextColumn('text', { references: { table: userTable.name, column: 'id' } });
258
+ delete columnTypesTable.columns.string.options?.references;
259
+ // ((columnTypesTable as Table<any>).columns.string2.options as any).references = { table: userTable.name, column: 'name' };
260
+ columnTypesTable.columns.float = new FloatColumn('float', { defaultValue: async () => 1.5 });
261
+ columnTypesTable.columns.decimal = new DecimalColumn('decimal', { defaultValue: async () => 0 });
262
+ columnTypesTable.columns.uuid = new UuidColumn('uuid', { unique: { unique: false } });
263
+ await tableManager.loadTable(columnTypesTable);
264
+ columnMetadata = await tableManager.schemaMetadata.getColumnMetadata(columnTypesTable);
265
+ expect(columnMetadata[columnTypesTable.columns.integer.name].type).toBe(getColumnType(columnTypesTable.columns.integer));
266
+ expect(columnMetadata[columnTypesTable.columns.bigInteger.name].type).toBe(getColumnType(columnTypesTable.columns.bigInteger));
267
+ expect(columnMetadata[columnTypesTable.columns.text.name].type).toBe(getColumnType(columnTypesTable.columns.text));
268
+ expect(columnMetadata[columnTypesTable.columns.string.name].type).toBe(getColumnType(columnTypesTable.columns.string));
269
+ expect(columnMetadata[columnTypesTable.columns.float.name].type).toBe(getColumnType(columnTypesTable.columns.float));
270
+ expect(columnMetadata[columnTypesTable.columns.decimal.name].type).toBe(getColumnType(columnTypesTable.columns.decimal));
271
+ expect(columnMetadata[columnTypesTable.columns.boolean.name].type).toBe(getColumnType(columnTypesTable.columns.boolean));
272
+ expect(columnMetadata[columnTypesTable.columns.date.name].type).toBe(getColumnType(columnTypesTable.columns.date));
273
+ expect(columnMetadata[columnTypesTable.columns.dateTime.name].type).toBe(getColumnType(columnTypesTable.columns.dateTime));
274
+ expect(columnMetadata[columnTypesTable.columns.binary.name].type).toBe(getColumnType(columnTypesTable.columns.binary));
275
+ expect(columnMetadata[columnTypesTable.columns.object.name].type).toBe(getColumnType(columnTypesTable.columns.object));
276
+ expect(columnMetadata[columnTypesTable.columns.uuid.name].type).toBe(getColumnType(columnTypesTable.columns.uuid));
277
+ expect(columnMetadata[(columnTypesTable as Table<any>).columns.string2.name].type).toBe(getColumnType((columnTypesTable as Table<any>).columns.string2));
278
+ // expect(parseFloat(columnMetadata[TestColumnTypesTable.columns.float.name]['COLUMN_DEFAULT'])).toBe(1.5);
279
+ // expect(parseFloat(columnMetadata[TestColumnTypesTable.columns.decimal.name]['COLUMN_DEFAULT'])).toBe(0);
280
+ // foreignKeys = await tableManager.schemaMetadata.getForeignKeys(columnTypesTable);
281
+ // expect(foreignKeys[TestColumnTypesTable.columns.string.name]).toBeFalsy();
282
+ // expect(foreignKeys[TestColumnTypesTable.columns.string2.name]['REFERENCED_TABLE_NAME']).toBe('user');
283
+ // expect(foreignKeys[TestColumnTypesTable.columns.string2.name]['REFERENCED_COLUMN_NAME']).toBe('name');
284
+ // expect(foreignKeys[TestColumnTypesTable.columns.text.name]['REFERENCED_TABLE_NAME']).toBe('user');
285
+ // expect(foreignKeys[TestColumnTypesTable.columns.text.name]['REFERENCED_COLUMN_NAME']).toBe('id');
286
+ uniqueColumns = await tableManager.schemaMetadata.getUniqueColumns(columnTypesTable);
287
+ expect(uniqueColumns.includes(columnTypesTable.columns.uuid.name)).toBeFalsy();
288
+ });
289
+
290
+ test('alter column nullable constraint', async () => {
291
+ if (excludedTests?.alterNullableConstraint)
292
+ return;
293
+
294
+ const userTable = new UserTable();
295
+ const columnTypesTable = new ColumnTypesTable();
296
+ await tableManager.loadTable(userTable);
297
+ columnTypesTable.columns.text.options = { defaultValue: async () => 'asdf' };
298
+ (columnTypesTable as Table<any>).columns['string2'] = new StringColumn('string2', { references: { table: userTable.name } });
299
+ await tableManager.loadTable(columnTypesTable);
300
+ expect(await tableManager.tableExists(userTable)).toBeTruthy();
301
+ expect(await tableManager.tableExists(columnTypesTable)).toBeTruthy();
302
+ let columnMetadata = await tableManager.schemaMetadata.getColumnMetadata(columnTypesTable);
303
+ expect(columnMetadata[columnTypesTable.columns.integer.name].type).toBe(getColumnType(columnTypesTable.columns.integer));
304
+ expect(columnMetadata[columnTypesTable.columns.bigInteger.name].type).toBe(getColumnType(columnTypesTable.columns.bigInteger));
305
+ expect(columnMetadata[columnTypesTable.columns.text.name].type).toBe(getColumnType(columnTypesTable.columns.text));
306
+ expect(columnMetadata[columnTypesTable.columns.string.name].type).toBe(getColumnType(columnTypesTable.columns.string));
307
+ expect(columnMetadata[columnTypesTable.columns.float.name].type).toBe(getColumnType(columnTypesTable.columns.float));
308
+ expect(columnMetadata[columnTypesTable.columns.decimal.name].type).toBe(getColumnType(columnTypesTable.columns.decimal));
309
+ expect(columnMetadata[columnTypesTable.columns.boolean.name].type).toBe(getColumnType(columnTypesTable.columns.boolean));
310
+ expect(columnMetadata[columnTypesTable.columns.date.name].type).toBe(getColumnType(columnTypesTable.columns.date));
311
+ expect(columnMetadata[columnTypesTable.columns.dateTime.name].type).toBe(getColumnType(columnTypesTable.columns.dateTime));
312
+ expect(columnMetadata[columnTypesTable.columns.binary.name].type).toBe(getColumnType(columnTypesTable.columns.binary));
313
+ expect(columnMetadata[columnTypesTable.columns.object.name].type).toBe(getColumnType(columnTypesTable.columns.object));
314
+ expect(columnMetadata[columnTypesTable.columns.uuid.name].type).toBe(getColumnType(columnTypesTable.columns.uuid));
315
+ expect(columnMetadata[(columnTypesTable as Table<any>).columns.string2.name].type).toBe(getColumnType((columnTypesTable as Table<any>).columns.string2));
316
+ let foreignKeys = await tableManager.schemaMetadata.getForeignKeys(columnTypesTable);
317
+ let uniqueColumns = await tableManager.schemaMetadata.getUniqueColumns(columnTypesTable);
318
+ expect(columnMetadata[columnTypesTable.columns.integer.name].isNullable).toBeTruthy();
319
+ expect(columnMetadata[columnTypesTable.columns.bigInteger.name].isNullable).toBeFalsy();
320
+ // expect(parseFloat(columnMetadata[TestColumnTypesTable.columns.float.name]['COLUMN_DEFAULT'])).toBe(0.5);
321
+ expect(foreignKeys[columnTypesTable.columns.string.name].referencedTableName).toBe(userTable.name);
322
+ expect(foreignKeys[columnTypesTable.columns.string.name].referencedColumnName).toBe('id');
323
+ expect(uniqueColumns.includes(columnTypesTable.columns.uuid.name)).toBeTruthy();
324
+ columnTypesTable.columns.integer = new IntegerColumn('integer', { nullable: false });
325
+ columnTypesTable.columns.bigInteger = new IntegerColumn('big_integer', { nullable: true }, true);
326
+ // columnTypesTable.columns.text = new TextColumn('text', { references: { table: userTable.name, column: 'id' } });
327
+ delete columnTypesTable.columns.string.options?.references;
328
+ // ((columnTypesTable as Table<any>).columns.string2.options as any).references = { table: userTable.name, column: 'name' };
329
+ columnTypesTable.columns.float = new FloatColumn('float', { defaultValue: async () => 1.5 });
330
+ columnTypesTable.columns.decimal = new DecimalColumn('decimal', { defaultValue: async () => 0 });
331
+ await tableManager.loadTable(columnTypesTable);
332
+ columnMetadata = await tableManager.schemaMetadata.getColumnMetadata(columnTypesTable);
333
+ expect(columnMetadata[columnTypesTable.columns.integer.name].type).toBe(getColumnType(columnTypesTable.columns.integer));
334
+ expect(columnMetadata[columnTypesTable.columns.bigInteger.name].type).toBe(getColumnType(columnTypesTable.columns.bigInteger));
335
+ expect(columnMetadata[columnTypesTable.columns.text.name].type).toBe(getColumnType(columnTypesTable.columns.text));
336
+ expect(columnMetadata[columnTypesTable.columns.string.name].type).toBe(getColumnType(columnTypesTable.columns.string));
337
+ expect(columnMetadata[columnTypesTable.columns.float.name].type).toBe(getColumnType(columnTypesTable.columns.float));
338
+ expect(columnMetadata[columnTypesTable.columns.decimal.name].type).toBe(getColumnType(columnTypesTable.columns.decimal));
339
+ expect(columnMetadata[columnTypesTable.columns.boolean.name].type).toBe(getColumnType(columnTypesTable.columns.boolean));
340
+ expect(columnMetadata[columnTypesTable.columns.date.name].type).toBe(getColumnType(columnTypesTable.columns.date));
341
+ expect(columnMetadata[columnTypesTable.columns.dateTime.name].type).toBe(getColumnType(columnTypesTable.columns.dateTime));
342
+ expect(columnMetadata[columnTypesTable.columns.binary.name].type).toBe(getColumnType(columnTypesTable.columns.binary));
343
+ expect(columnMetadata[columnTypesTable.columns.object.name].type).toBe(getColumnType(columnTypesTable.columns.object));
344
+ expect(columnMetadata[columnTypesTable.columns.uuid.name].type).toBe(getColumnType(columnTypesTable.columns.uuid));
345
+ expect(columnMetadata[(columnTypesTable as Table<any>).columns.string2.name].type).toBe(getColumnType((columnTypesTable as Table<any>).columns.string2));
346
+ expect(columnMetadata[columnTypesTable.columns.integer.name].isNullable).toBeFalsy();
347
+ expect(columnMetadata[columnTypesTable.columns.bigInteger.name].isNullable).toBeTruthy();
348
+ // expect(parseFloat(columnMetadata[TestColumnTypesTable.columns.float.name]['COLUMN_DEFAULT'])).toBe(1.5);
349
+ // expect(parseFloat(columnMetadata[TestColumnTypesTable.columns.decimal.name]['COLUMN_DEFAULT'])).toBe(0);
350
+ // foreignKeys = await tableManager.schemaMetadata.getForeignKeys(columnTypesTable);
351
+ // expect(foreignKeys[TestColumnTypesTable.columns.string.name]).toBeFalsy();
352
+ // expect(foreignKeys[TestColumnTypesTable.columns.string2.name]['REFERENCED_TABLE_NAME']).toBe('user');
353
+ // expect(foreignKeys[TestColumnTypesTable.columns.string2.name]['REFERENCED_COLUMN_NAME']).toBe('name');
354
+ // expect(foreignKeys[TestColumnTypesTable.columns.text.name]['REFERENCED_TABLE_NAME']).toBe('user');
355
+ // expect(foreignKeys[TestColumnTypesTable.columns.text.name]['REFERENCED_COLUMN_NAME']).toBe('id');
356
+ });
357
+
358
+ test('create index', async () => {
359
+ const userTable = new UserTable();
360
+ await tableManager.loadTable(userTable);
361
+ expect(await tableManager.tableExists(userTable)).toBeTruthy();
362
+ const indexes = await tableManager.schemaMetadata.getIndexes(userTable);
363
+ expect(JSON.stringify(indexes['db_test_user_email_index'])).toBe(JSON.stringify(['email']));
364
+ expect(JSON.stringify(indexes['db_test_user_active_email_index'])).toBe(JSON.stringify(['active', 'email']));
365
+ });
366
+
367
+ test('alter index', async () => {
368
+ const userTable = new UserTable();
369
+ await tableManager.loadTable(userTable);
370
+ expect(await tableManager.tableExists(userTable)).toBeTruthy();
371
+ let indexes = await tableManager.schemaMetadata.getIndexes(userTable);
372
+ expect(JSON.stringify(indexes['db_test_user_email_index'])).toBe(JSON.stringify(['email']));
373
+ expect(JSON.stringify(indexes['db_test_user_active_email_index'])).toBe(JSON.stringify(['active', 'email']));
374
+ userTable.indexes = [{ name: 'db_test_user_email_index', columns: ['email'] }, { name: 'db_test_user_active_name_index', columns: ['active', 'name'] }];
375
+ await tableManager.loadTable(userTable);
376
+ indexes = await tableManager.schemaMetadata.getIndexes(userTable);
377
+ expect(JSON.stringify(indexes['db_test_user_email_index'])).toBe(JSON.stringify(['email']));
378
+ expect(JSON.stringify(indexes['db_test_user_active_name_index'])).toBe(JSON.stringify(['active', 'name']));
379
+ expect(JSON.stringify(indexes['db_test_user_active_email_index'])).toBeFalsy();
380
+ });
381
+ };
382
+ }
package/tsconfig.json ADDED
@@ -0,0 +1,23 @@
1
+ {
2
+ "compilerOptions": {
3
+ "rootDir": "./",
4
+ "target": "es5",
5
+ "module": "commonjs",
6
+ "declaration": true,
7
+ "declarationMap": true,
8
+ "sourceMap": true,
9
+ "outDir": "./dist/",
10
+ "strict": true,
11
+ "noImplicitAny": true,
12
+ "esModuleInterop": true,
13
+ "skipLibCheck": true,
14
+ "forceConsistentCasingInFileNames": true,
15
+ "resolveJsonModule": true,
16
+ "typeRoots": [
17
+ "./node_modules/@types"
18
+ ],
19
+ "types": [
20
+ "node", "jest"
21
+ ]
22
+ }
23
+ }