orchid-orm 1.4.22 → 1.5.1
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 +20 -0
- package/dist/index.esm.js +36 -20
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +35 -19
- package/dist/index.js.map +1 -1
- package/package.json +4 -4
- package/src/codegen/updateTableFile/changeTable.test.ts +166 -10
- package/src/codegen/updateTableFile/changeTable.ts +44 -20
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "orchid-orm",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.1",
|
|
4
4
|
"description": "Postgres ORM",
|
|
5
5
|
"homepage": "https://orchid-orm.netlify.app/guide/orm-setup-and-overview.html",
|
|
6
6
|
"repository": {
|
|
@@ -31,14 +31,14 @@
|
|
|
31
31
|
"author": "Roman Kushyn",
|
|
32
32
|
"license": "ISC",
|
|
33
33
|
"dependencies": {
|
|
34
|
-
"pqb": "0.
|
|
34
|
+
"pqb": "0.9.1"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@swc/core": "^1.3.19",
|
|
38
38
|
"rollup": "^2.79.0",
|
|
39
39
|
"rollup-plugin-dts": "^4.2.2",
|
|
40
40
|
"rollup-plugin-esbuild": "^4.10.1",
|
|
41
|
-
"orchid-orm-schema-to-zod": "0.2.
|
|
41
|
+
"orchid-orm-schema-to-zod": "0.2.7",
|
|
42
42
|
"@swc/jest": "^0.2.21",
|
|
43
43
|
"@types/jest": "^28.1.2",
|
|
44
44
|
"@types/node": "^18.0.1",
|
|
@@ -50,7 +50,7 @@
|
|
|
50
50
|
"rimraf": "^3.0.2",
|
|
51
51
|
"tslib": "^2.4.0",
|
|
52
52
|
"typescript": "^4.7.4",
|
|
53
|
-
"rake-db": "2.
|
|
53
|
+
"rake-db": "2.3.1"
|
|
54
54
|
},
|
|
55
55
|
"peerDependencies": {
|
|
56
56
|
"typescript": "*"
|
|
@@ -401,6 +401,84 @@ export class Table extends BaseTable {
|
|
|
401
401
|
});
|
|
402
402
|
|
|
403
403
|
describe('indexes', () => {
|
|
404
|
+
it('should change column indexes', async () => {
|
|
405
|
+
asMock(fs.readFile)
|
|
406
|
+
.mockResolvedValue(`import { BaseTable } from '../baseTable';
|
|
407
|
+
|
|
408
|
+
export class Table extends BaseTable {
|
|
409
|
+
table = 'table';
|
|
410
|
+
columns = this.setColumns((t) => ({
|
|
411
|
+
name: t.text().index({ order: 'one' }).index({ collate: 'en_US' })
|
|
412
|
+
}));
|
|
413
|
+
}`);
|
|
414
|
+
|
|
415
|
+
await updateTableFile({
|
|
416
|
+
...params,
|
|
417
|
+
ast: {
|
|
418
|
+
...ast.changeTable,
|
|
419
|
+
shape: {
|
|
420
|
+
name: {
|
|
421
|
+
type: 'change',
|
|
422
|
+
from: { indexes: [{ order: 'one' }, { collate: 'en_US' }] },
|
|
423
|
+
to: { indexes: [{ order: 'two' }, { collate: 'en_UK' }] },
|
|
424
|
+
},
|
|
425
|
+
},
|
|
426
|
+
},
|
|
427
|
+
});
|
|
428
|
+
|
|
429
|
+
testWritten(`import { BaseTable } from '../baseTable';
|
|
430
|
+
|
|
431
|
+
export class Table extends BaseTable {
|
|
432
|
+
table = 'table';
|
|
433
|
+
columns = this.setColumns((t) => ({
|
|
434
|
+
name: t.text().index({
|
|
435
|
+
order: 'two',
|
|
436
|
+
}).index({
|
|
437
|
+
collate: 'en_UK',
|
|
438
|
+
}),
|
|
439
|
+
}));
|
|
440
|
+
}`);
|
|
441
|
+
});
|
|
442
|
+
|
|
443
|
+
it('should add column indexes', async () => {
|
|
444
|
+
asMock(fs.readFile)
|
|
445
|
+
.mockResolvedValue(`import { BaseTable } from '../baseTable';
|
|
446
|
+
|
|
447
|
+
export class Table extends BaseTable {
|
|
448
|
+
table = 'table';
|
|
449
|
+
columns = this.setColumns((t) => ({
|
|
450
|
+
name: t.text(),
|
|
451
|
+
}));
|
|
452
|
+
}`);
|
|
453
|
+
|
|
454
|
+
await updateTableFile({
|
|
455
|
+
...params,
|
|
456
|
+
ast: {
|
|
457
|
+
...ast.changeTable,
|
|
458
|
+
shape: {
|
|
459
|
+
name: {
|
|
460
|
+
type: 'change',
|
|
461
|
+
from: {},
|
|
462
|
+
to: { indexes: [{ order: 'two' }, { collate: 'fr_FR' }] },
|
|
463
|
+
},
|
|
464
|
+
},
|
|
465
|
+
},
|
|
466
|
+
});
|
|
467
|
+
|
|
468
|
+
testWritten(`import { BaseTable } from '../baseTable';
|
|
469
|
+
|
|
470
|
+
export class Table extends BaseTable {
|
|
471
|
+
table = 'table';
|
|
472
|
+
columns = this.setColumns((t) => ({
|
|
473
|
+
name: t.text().index({
|
|
474
|
+
order: 'two',
|
|
475
|
+
}).index({
|
|
476
|
+
collate: 'fr_FR',
|
|
477
|
+
}),
|
|
478
|
+
}));
|
|
479
|
+
}`);
|
|
480
|
+
});
|
|
481
|
+
|
|
404
482
|
const result = `import { BaseTable } from '../baseTable';
|
|
405
483
|
|
|
406
484
|
export class Table extends BaseTable {
|
|
@@ -413,7 +491,6 @@ export class Table extends BaseTable {
|
|
|
413
491
|
'9',
|
|
414
492
|
{
|
|
415
493
|
column: '10',
|
|
416
|
-
expression: 321,
|
|
417
494
|
order: 'new',
|
|
418
495
|
},
|
|
419
496
|
],
|
|
@@ -436,10 +513,7 @@ export class Table extends BaseTable {
|
|
|
436
513
|
options: {},
|
|
437
514
|
},
|
|
438
515
|
{
|
|
439
|
-
columns: [
|
|
440
|
-
{ column: '9' },
|
|
441
|
-
{ column: '10', order: 'new', expression: 321 },
|
|
442
|
-
],
|
|
516
|
+
columns: [{ column: '9' }, { column: '10', order: 'new' }],
|
|
443
517
|
options: { name: 'newName' },
|
|
444
518
|
},
|
|
445
519
|
],
|
|
@@ -454,7 +528,7 @@ export class Table extends BaseTable {
|
|
|
454
528
|
columns = this.setColumns((t) => ({
|
|
455
529
|
...t.index('1'),
|
|
456
530
|
...t.index(['2', '3']),
|
|
457
|
-
...t.index(['4', { column: '5', order: 'order'
|
|
531
|
+
...t.index(['4', { column: '5', order: 'order' }], { name: 'indexName' }),
|
|
458
532
|
}));
|
|
459
533
|
}`);
|
|
460
534
|
|
|
@@ -474,10 +548,7 @@ export class Table extends BaseTable {
|
|
|
474
548
|
options: {},
|
|
475
549
|
},
|
|
476
550
|
{
|
|
477
|
-
columns: [
|
|
478
|
-
{ column: '4' },
|
|
479
|
-
{ column: '5', order: 'order', expression: 123 },
|
|
480
|
-
],
|
|
551
|
+
columns: [{ column: '4' }, { column: '5', order: 'order' }],
|
|
481
552
|
options: { name: 'indexName' },
|
|
482
553
|
},
|
|
483
554
|
],
|
|
@@ -512,6 +583,91 @@ export class Table extends BaseTable {
|
|
|
512
583
|
});
|
|
513
584
|
|
|
514
585
|
describe('foreignKeys', () => {
|
|
586
|
+
it('should change column foreignKeys', async () => {
|
|
587
|
+
asMock(fs.readFile)
|
|
588
|
+
.mockResolvedValue(`import { BaseTable } from '../baseTable';
|
|
589
|
+
|
|
590
|
+
export class Table extends BaseTable {
|
|
591
|
+
table = 'table';
|
|
592
|
+
columns = this.setColumns((t) => ({
|
|
593
|
+
name: t.text().foreignKey('a', 'b').foreignKey('c', 'd')
|
|
594
|
+
}));
|
|
595
|
+
}`);
|
|
596
|
+
|
|
597
|
+
await updateTableFile({
|
|
598
|
+
...params,
|
|
599
|
+
ast: {
|
|
600
|
+
...ast.changeTable,
|
|
601
|
+
shape: {
|
|
602
|
+
name: {
|
|
603
|
+
type: 'change',
|
|
604
|
+
from: {
|
|
605
|
+
foreignKeys: [
|
|
606
|
+
{ table: 'a', columns: ['b'] },
|
|
607
|
+
{ table: 'c', columns: ['d'] },
|
|
608
|
+
],
|
|
609
|
+
},
|
|
610
|
+
to: {
|
|
611
|
+
foreignKeys: [
|
|
612
|
+
{ table: 'e', columns: ['f'] },
|
|
613
|
+
{ table: 'g', columns: ['h'] },
|
|
614
|
+
],
|
|
615
|
+
},
|
|
616
|
+
},
|
|
617
|
+
},
|
|
618
|
+
},
|
|
619
|
+
});
|
|
620
|
+
|
|
621
|
+
testWritten(`import { BaseTable } from '../baseTable';
|
|
622
|
+
|
|
623
|
+
export class Table extends BaseTable {
|
|
624
|
+
table = 'table';
|
|
625
|
+
columns = this.setColumns((t) => ({
|
|
626
|
+
name: t.text().foreignKey('e', 'f').foreignKey('g', 'h'),
|
|
627
|
+
}));
|
|
628
|
+
}`);
|
|
629
|
+
});
|
|
630
|
+
|
|
631
|
+
it('should add column indexes', async () => {
|
|
632
|
+
asMock(fs.readFile)
|
|
633
|
+
.mockResolvedValue(`import { BaseTable } from '../baseTable';
|
|
634
|
+
|
|
635
|
+
export class Table extends BaseTable {
|
|
636
|
+
table = 'table';
|
|
637
|
+
columns = this.setColumns((t) => ({
|
|
638
|
+
name: t.text(),
|
|
639
|
+
}));
|
|
640
|
+
}`);
|
|
641
|
+
|
|
642
|
+
await updateTableFile({
|
|
643
|
+
...params,
|
|
644
|
+
ast: {
|
|
645
|
+
...ast.changeTable,
|
|
646
|
+
shape: {
|
|
647
|
+
name: {
|
|
648
|
+
type: 'change',
|
|
649
|
+
from: {},
|
|
650
|
+
to: {
|
|
651
|
+
foreignKeys: [
|
|
652
|
+
{ table: 'e', columns: ['f'] },
|
|
653
|
+
{ table: 'g', columns: ['h'] },
|
|
654
|
+
],
|
|
655
|
+
},
|
|
656
|
+
},
|
|
657
|
+
},
|
|
658
|
+
},
|
|
659
|
+
});
|
|
660
|
+
|
|
661
|
+
testWritten(`import { BaseTable } from '../baseTable';
|
|
662
|
+
|
|
663
|
+
export class Table extends BaseTable {
|
|
664
|
+
table = 'table';
|
|
665
|
+
columns = this.setColumns((t) => ({
|
|
666
|
+
name: t.text().foreignKey('e', 'f').foreignKey('g', 'h'),
|
|
667
|
+
}));
|
|
668
|
+
}`);
|
|
669
|
+
});
|
|
670
|
+
|
|
515
671
|
const result = `import { BaseTable } from '../baseTable';
|
|
516
672
|
|
|
517
673
|
export class Table extends BaseTable {
|
|
@@ -17,8 +17,12 @@ import {
|
|
|
17
17
|
Code,
|
|
18
18
|
codeToString,
|
|
19
19
|
columnDefaultArgumentToCode,
|
|
20
|
+
columnForeignKeysToCode,
|
|
21
|
+
columnIndexesToCode,
|
|
20
22
|
ColumnType,
|
|
23
|
+
ForeignKey,
|
|
21
24
|
foreignKeyToCode,
|
|
25
|
+
IndexColumnOptions,
|
|
22
26
|
indexToCode,
|
|
23
27
|
primaryKeyToCode,
|
|
24
28
|
quoteObjectKey,
|
|
@@ -266,20 +270,32 @@ const changeColumn = (
|
|
|
266
270
|
}
|
|
267
271
|
|
|
268
272
|
const changedProps: Partial<Record<Key, true>> = {};
|
|
273
|
+
const replaced: Record<string, true> = {};
|
|
269
274
|
for (const item of items.reverse()) {
|
|
270
275
|
if (!ts.is.propertyAccess(item.expression)) continue;
|
|
271
276
|
|
|
272
277
|
const { name } = item.expression;
|
|
273
|
-
|
|
278
|
+
let key = name.escapedText.toString();
|
|
279
|
+
if (key === 'index') key = 'indexes';
|
|
280
|
+
else if (key === 'foreignKey') key = 'foreignKeys';
|
|
281
|
+
|
|
274
282
|
if (!propsToChange[key as Key]) continue;
|
|
275
283
|
|
|
276
|
-
|
|
277
|
-
if (
|
|
278
|
-
const code =
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
284
|
+
let remove = true;
|
|
285
|
+
if (!replaced[key]) {
|
|
286
|
+
const code = getColumnMethodArgs(to, key as Key);
|
|
287
|
+
if (code) {
|
|
288
|
+
changes.replace(
|
|
289
|
+
item.expression.expression.end,
|
|
290
|
+
item.end,
|
|
291
|
+
codeToString(code, spaces + ' ', ' ').trim(),
|
|
292
|
+
);
|
|
293
|
+
replaced[key] = true;
|
|
294
|
+
remove = false;
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
if (remove) {
|
|
283
299
|
changes.remove(item.expression.expression.end, item.end);
|
|
284
300
|
}
|
|
285
301
|
|
|
@@ -290,12 +306,9 @@ const changeColumn = (
|
|
|
290
306
|
for (const key in propsToChange) {
|
|
291
307
|
if (changedProps[key as Key]) continue;
|
|
292
308
|
|
|
293
|
-
const
|
|
294
|
-
if (
|
|
295
|
-
|
|
296
|
-
addCode(code, value);
|
|
297
|
-
addCode(code, ')');
|
|
298
|
-
append += codeToString(code, '', ' ').trim();
|
|
309
|
+
const code = getColumnMethodArgs(to, key as Key);
|
|
310
|
+
if (code) {
|
|
311
|
+
append += codeToString(code, spaces + ' ', ' ').trim();
|
|
299
312
|
}
|
|
300
313
|
}
|
|
301
314
|
|
|
@@ -350,19 +363,30 @@ const addTableData = ({ add, changes, object, t, spaces }: ChangeContext) => {
|
|
|
350
363
|
const getColumnMethodArgs = (
|
|
351
364
|
to: RakeDbAst.ChangeTableItem.Change['to'],
|
|
352
365
|
key: keyof RakeDbAst.ChangeTableItem.Change['to'],
|
|
353
|
-
): Code | undefined => {
|
|
366
|
+
): Code[] | undefined => {
|
|
354
367
|
const value = to[key];
|
|
355
368
|
if (!value) return;
|
|
356
369
|
|
|
370
|
+
if (key === 'indexes') {
|
|
371
|
+
return columnIndexesToCode(value as IndexColumnOptions[]);
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
if (key === 'foreignKeys') {
|
|
375
|
+
return columnForeignKeysToCode(value as ForeignKey<string, string[]>[]);
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
const code = [`.${key}(`];
|
|
379
|
+
|
|
357
380
|
if (key === 'collate' || key === 'compression') {
|
|
358
|
-
|
|
381
|
+
addCode(code, singleQuote(value as string));
|
|
359
382
|
} else if (key === 'default') {
|
|
360
|
-
|
|
361
|
-
} else if (key
|
|
362
|
-
return '';
|
|
363
|
-
} else {
|
|
383
|
+
addCode(code, columnDefaultArgumentToCode(value));
|
|
384
|
+
} else if (key !== 'nullable' && key !== 'primaryKey') {
|
|
364
385
|
return;
|
|
365
386
|
}
|
|
387
|
+
|
|
388
|
+
addCode(code, ')');
|
|
389
|
+
return code;
|
|
366
390
|
};
|
|
367
391
|
|
|
368
392
|
const dropMatchingIndexes = (
|