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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "orchid-orm",
3
- "version": "1.4.22",
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.8.5"
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.5",
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.2.6"
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', expression: 123 }], { name: 'indexName' }),
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
- const key = name.escapedText.toString();
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
- const value = getColumnMethodArgs(to, key as Key);
277
- if (value) {
278
- const code = [`${key}(`];
279
- addCode(code, value);
280
- addCode(code, ')');
281
- changes.replace(name.pos, item.end, codeToString(code, '', ' ').trim());
282
- } else {
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 value = getColumnMethodArgs(to, key as Key);
294
- if (value !== undefined) {
295
- const code = [`.${key}(`];
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
- return singleQuote(value as string);
381
+ addCode(code, singleQuote(value as string));
359
382
  } else if (key === 'default') {
360
- return columnDefaultArgumentToCode(value);
361
- } else if (key === 'nullable' || key === 'primaryKey') {
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 = (