drizzle-kit 0.9.2 → 0.9.3
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/{dist/drizzle.js → drizzle.js} +0 -0
- package/{dist/drizzle.js.map → drizzle.js.map} +0 -0
- package/package.json +1 -1
- package/.eslintrc +0 -21
- package/config.yml +0 -4
- package/data/_prev/multi.ts +0 -43
- package/data/_prev/tables/authOtpTable.ts +0 -22
- package/data/_prev/tables/cityTable.ts +0 -17
- package/data/_prev/tables/usersTable.ts +0 -18
- package/data/_prev/types/types.ts +0 -11
- package/data/v1/tables/authOtpTable.ts +0 -18
- package/data/v1/tables/deletedTable.ts +0 -9
- package/data/v1/tables/usersTable.ts +0 -15
- package/data/v1/types/types.ts +0 -6
- package/data/v2/tables/authOtpTable.ts +0 -22
- package/data/v2/tables/cityTable.ts +0 -10
- package/data/v2/tables/usersTable.ts +0 -19
- package/data/v2/types/types.ts +0 -11
- package/data/v3/tables/authOtpTable.ts +0 -21
- package/data/v3/tables/cityTable.ts +0 -17
- package/data/v3/tables/usersTable.ts +0 -18
- package/data/v3/types/types.ts +0 -11
- package/dist/package.json +0 -85
- package/factory.ts +0 -224
- package/fstest.ts +0 -50
- package/index.ts +0 -16
- package/readme.md +0 -9
- package/serializer.ts +0 -139
- package/src/cli/commands/migration/index.tsx +0 -10
- package/src/cli/commands/migration/migrate/index.tsx +0 -164
- package/src/cli/components-api/ComponentsList.tsx +0 -20
- package/src/cli/components-api/CreateApp.tsx +0 -19
- package/src/cli/components-api/components/PromptColumnsConflicts.tsx +0 -171
- package/src/cli/components-api/components/PromptTablesConflicts.tsx +0 -180
- package/src/cli/components-api/components/Task.tsx +0 -85
- package/src/cli/components-api/index.tsx +0 -76
- package/src/cli/enq.ts +0 -41
- package/src/cli/index.tsx +0 -8
- package/src/cli/machines/resolveColumnsMachine.ts +0 -179
- package/src/cli/machines/resolveTablesMachine.ts +0 -169
- package/src/cli/utils/formatDataForTable.ts +0 -36
- package/src/cli/utils/valuesForPrompts.ts +0 -35
- package/src/diff.ts +0 -272
- package/src/differ.js +0 -135
- package/src/jsonStatements.js +0 -176
- package/src/migrationPreparator.ts +0 -47
- package/src/serilizer/factory.ts +0 -340
- package/src/serilizer/index.ts +0 -25
- package/src/simulator.ts +0 -85
- package/src/sqlgenerator.js +0 -373
- package/test-build.js +0 -26
- package/test.ts +0 -57
- package/testFactory.js +0 -3
- package/testFactory.ts +0 -26
- package/tsconfig.json +0 -28
- package/webpack.config.js +0 -53
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
import { assign, createMachine, send } from 'xstate';
|
|
2
|
-
import { Named, RenamedObject } from 'cli/commands/migration/migrate';
|
|
3
|
-
|
|
4
|
-
type Event =
|
|
5
|
-
| { type: 'CHOICE_ITEM', itemIndex: number }
|
|
6
|
-
| { type: 'DELETE' }
|
|
7
|
-
| { type: 'RENAME' }
|
|
8
|
-
| { type: 'CANCEL' }
|
|
9
|
-
| { type: 'CONFIRM' }
|
|
10
|
-
| { type: 'NEXT' }
|
|
11
|
-
| { type: 'CHOICE_NEW_ITEM'; itemIndex: number };
|
|
12
|
-
|
|
13
|
-
interface Context extends Props {
|
|
14
|
-
missingItemIndex: number,
|
|
15
|
-
newItemIndex: number,
|
|
16
|
-
createdTables: Named[];
|
|
17
|
-
renamedTables: RenamedObject<Named>[];
|
|
18
|
-
deletedTables: Named[];
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
interface Props {
|
|
22
|
-
missingTables: Named[],
|
|
23
|
-
newTables: Named[],
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
const createResolveTablesMachine = (props: Props) => (
|
|
27
|
-
createMachine<Context, Event>({
|
|
28
|
-
id: 'resolveTables',
|
|
29
|
-
initial: 'table',
|
|
30
|
-
context: {
|
|
31
|
-
...props,
|
|
32
|
-
missingItemIndex: 0,
|
|
33
|
-
newItemIndex: 0,
|
|
34
|
-
createdTables: [],
|
|
35
|
-
renamedTables: [],
|
|
36
|
-
deletedTables: [],
|
|
37
|
-
},
|
|
38
|
-
states: {
|
|
39
|
-
table: {
|
|
40
|
-
entry: send({ type: 'NEXT' }),
|
|
41
|
-
on: {
|
|
42
|
-
NEXT: [
|
|
43
|
-
{
|
|
44
|
-
target: 'done',
|
|
45
|
-
cond: 'isMissingTablesResolved',
|
|
46
|
-
actions: ['resolveRemaining'],
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
target: 'done',
|
|
50
|
-
cond: 'isNewTablesResolved',
|
|
51
|
-
actions: ['resolveMissing'],
|
|
52
|
-
},
|
|
53
|
-
],
|
|
54
|
-
CHOICE_ITEM: { target: 'action', actions: ['choseItem'] },
|
|
55
|
-
},
|
|
56
|
-
},
|
|
57
|
-
action: {
|
|
58
|
-
initial: 'actionChoice',
|
|
59
|
-
states: {
|
|
60
|
-
actionChoice: {
|
|
61
|
-
on: { DELETE: '#resolveTables.confirmationDelete', RENAME: 'rename' },
|
|
62
|
-
},
|
|
63
|
-
rename: {
|
|
64
|
-
on: {
|
|
65
|
-
CHOICE_NEW_ITEM: { target: '#resolveTables.confirmationRename', actions: ['choseNewItem'] },
|
|
66
|
-
},
|
|
67
|
-
},
|
|
68
|
-
},
|
|
69
|
-
},
|
|
70
|
-
confirmationDelete: {
|
|
71
|
-
on: {
|
|
72
|
-
CANCEL: 'action.actionChoice',
|
|
73
|
-
CONFIRM: [
|
|
74
|
-
{ target: 'final', actions: ['delete'] },
|
|
75
|
-
],
|
|
76
|
-
},
|
|
77
|
-
},
|
|
78
|
-
confirmationRename: {
|
|
79
|
-
on: {
|
|
80
|
-
CANCEL: 'action.actionChoice',
|
|
81
|
-
CONFIRM: [
|
|
82
|
-
{ target: 'final', actions: ['rename'] },
|
|
83
|
-
],
|
|
84
|
-
},
|
|
85
|
-
},
|
|
86
|
-
final: {
|
|
87
|
-
entry: send({ type: 'NEXT' }),
|
|
88
|
-
on: {
|
|
89
|
-
NEXT: [
|
|
90
|
-
{
|
|
91
|
-
target: 'done',
|
|
92
|
-
cond: 'isMissingTablesResolved',
|
|
93
|
-
actions: ['resolveRemaining'],
|
|
94
|
-
},
|
|
95
|
-
{
|
|
96
|
-
target: 'table',
|
|
97
|
-
},
|
|
98
|
-
],
|
|
99
|
-
},
|
|
100
|
-
},
|
|
101
|
-
done: {},
|
|
102
|
-
},
|
|
103
|
-
},
|
|
104
|
-
{
|
|
105
|
-
guards: {
|
|
106
|
-
isMissingTablesResolved: ({ missingTables }) => !missingTables.length,
|
|
107
|
-
isNewTablesResolved: ({ newTables }) => !newTables.length,
|
|
108
|
-
},
|
|
109
|
-
actions: {
|
|
110
|
-
choseItem: assign({
|
|
111
|
-
missingItemIndex: (context, event) => (event.type === 'CHOICE_ITEM' ? event.itemIndex : 0),
|
|
112
|
-
}),
|
|
113
|
-
|
|
114
|
-
choseNewItem: assign({
|
|
115
|
-
newItemIndex: (context, event) => (event.type === 'CHOICE_NEW_ITEM' ? event.itemIndex : 0),
|
|
116
|
-
}),
|
|
117
|
-
|
|
118
|
-
delete: assign({
|
|
119
|
-
deletedTables: ({
|
|
120
|
-
missingItemIndex,
|
|
121
|
-
deletedTables,
|
|
122
|
-
missingTables,
|
|
123
|
-
}) => [...deletedTables, missingTables[missingItemIndex]],
|
|
124
|
-
missingTables: ({
|
|
125
|
-
missingItemIndex,
|
|
126
|
-
missingTables,
|
|
127
|
-
}) => missingTables.filter((_, index) => index !== missingItemIndex),
|
|
128
|
-
}),
|
|
129
|
-
|
|
130
|
-
rename: assign({
|
|
131
|
-
renamedTables: ({
|
|
132
|
-
missingItemIndex,
|
|
133
|
-
newItemIndex,
|
|
134
|
-
renamedTables,
|
|
135
|
-
newTables,
|
|
136
|
-
missingTables,
|
|
137
|
-
}) => [
|
|
138
|
-
...renamedTables,
|
|
139
|
-
{ old: missingTables[missingItemIndex], new: newTables[newItemIndex] },
|
|
140
|
-
],
|
|
141
|
-
missingTables: ({
|
|
142
|
-
missingItemIndex,
|
|
143
|
-
missingTables,
|
|
144
|
-
}) => missingTables.filter((_, index) => index !== missingItemIndex),
|
|
145
|
-
newTables: ({
|
|
146
|
-
newItemIndex,
|
|
147
|
-
newTables,
|
|
148
|
-
}) => newTables.filter((_, index) => index !== newItemIndex),
|
|
149
|
-
}),
|
|
150
|
-
|
|
151
|
-
resolveRemaining: assign({
|
|
152
|
-
createdTables: ({
|
|
153
|
-
newTables,
|
|
154
|
-
createdTables,
|
|
155
|
-
}) => [...createdTables, ...newTables],
|
|
156
|
-
newTables: (context) => [],
|
|
157
|
-
}),
|
|
158
|
-
|
|
159
|
-
resolveMissing: assign({
|
|
160
|
-
deletedTables: ({
|
|
161
|
-
missingTables,
|
|
162
|
-
deletedTables,
|
|
163
|
-
}) => [...deletedTables, ...missingTables],
|
|
164
|
-
missingTables: (context) => [],
|
|
165
|
-
}),
|
|
166
|
-
},
|
|
167
|
-
}));
|
|
168
|
-
|
|
169
|
-
export default createResolveTablesMachine;
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
import { Named, RenamedObject } from 'cli/commands/migration/migrate';
|
|
2
|
-
|
|
3
|
-
interface ScalarDict {
|
|
4
|
-
[key: string]: string
|
|
5
|
-
}
|
|
6
|
-
|
|
7
|
-
export default (
|
|
8
|
-
data: {
|
|
9
|
-
title: string;
|
|
10
|
-
values: Named[] | RenamedObject<Named>[]
|
|
11
|
-
}[],
|
|
12
|
-
): ScalarDict[] => {
|
|
13
|
-
const array: ScalarDict[] = [];
|
|
14
|
-
|
|
15
|
-
array.length = data.reduce((acc: number, { values }) => {
|
|
16
|
-
if (acc < values.length) {
|
|
17
|
-
return values.length;
|
|
18
|
-
}
|
|
19
|
-
return acc;
|
|
20
|
-
},
|
|
21
|
-
0);
|
|
22
|
-
|
|
23
|
-
array.fill({ '': '' });
|
|
24
|
-
|
|
25
|
-
return array.map((_, i) => {
|
|
26
|
-
const temp = {} as ScalarDict;
|
|
27
|
-
|
|
28
|
-
data.forEach((item: any, ind: number) => {
|
|
29
|
-
temp[data[ind].title] = item.values[i]?.old?.name
|
|
30
|
-
? `${item.values[i]?.old?.name} -> ${item.values[i]?.new?.name}`
|
|
31
|
-
: item.values[i]?.name || '';
|
|
32
|
-
});
|
|
33
|
-
|
|
34
|
-
return temp as ScalarDict;
|
|
35
|
-
});
|
|
36
|
-
};
|
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
export enum Action {
|
|
2
|
-
RENAME = 'RENAME',
|
|
3
|
-
DELETE = 'DELETE'
|
|
4
|
-
}
|
|
5
|
-
|
|
6
|
-
export enum Confirmation {
|
|
7
|
-
CANCEL = 'CANCEL',
|
|
8
|
-
CONFIRM = 'CONFIRM'
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export const actions = [
|
|
12
|
-
{
|
|
13
|
-
key: Action.RENAME,
|
|
14
|
-
label: 'Renamed',
|
|
15
|
-
value: Action.RENAME,
|
|
16
|
-
},
|
|
17
|
-
{
|
|
18
|
-
key: Action.DELETE,
|
|
19
|
-
label: 'Deleted',
|
|
20
|
-
value: Action.DELETE,
|
|
21
|
-
},
|
|
22
|
-
];
|
|
23
|
-
|
|
24
|
-
export const confirmations = [
|
|
25
|
-
{
|
|
26
|
-
key: Confirmation.CONFIRM,
|
|
27
|
-
label: 'Yes',
|
|
28
|
-
value: Confirmation.CONFIRM,
|
|
29
|
-
},
|
|
30
|
-
{
|
|
31
|
-
key: Confirmation.CANCEL,
|
|
32
|
-
label: 'No',
|
|
33
|
-
value: Confirmation.CANCEL,
|
|
34
|
-
},
|
|
35
|
-
];
|
package/src/diff.ts
DELETED
|
@@ -1,272 +0,0 @@
|
|
|
1
|
-
import { fromJson } from "./sqlgenerator";
|
|
2
|
-
import resolveTables from "./simulator";
|
|
3
|
-
import { differ, diffForRenamed } from "./differ";
|
|
4
|
-
import fs from 'fs'
|
|
5
|
-
import { prepareAddValuesToEnumJson, prepareAlterTableColumnsJson, prepareCreateEnumJson, prepareCreateIndexesJson, prepareCreateTableJson, prepareDropIndexesJson, prepareDropTableJson, prepareRenameTableJson } from "./jsonStatements";
|
|
6
|
-
|
|
7
|
-
const json1 = {
|
|
8
|
-
tables: {
|
|
9
|
-
items: {
|
|
10
|
-
name: "items",
|
|
11
|
-
columns: {
|
|
12
|
-
id: {
|
|
13
|
-
name: "id",
|
|
14
|
-
type: "int",
|
|
15
|
-
primaryKey: true,
|
|
16
|
-
autoincrement: true,
|
|
17
|
-
},
|
|
18
|
-
name: {
|
|
19
|
-
name: "name",
|
|
20
|
-
type: "character varying(256)",
|
|
21
|
-
defaultValue: "Vetal",
|
|
22
|
-
notNull: true,
|
|
23
|
-
},
|
|
24
|
-
unused: {
|
|
25
|
-
name: "unused",
|
|
26
|
-
type: "character varying(256)",
|
|
27
|
-
},
|
|
28
|
-
unused2: {
|
|
29
|
-
name: "unused2",
|
|
30
|
-
type: "character varying(256)",
|
|
31
|
-
},
|
|
32
|
-
},
|
|
33
|
-
indexes: {
|
|
34
|
-
index_to_be_deleted: {
|
|
35
|
-
name: "index_to_be_deleted",
|
|
36
|
-
columns: {
|
|
37
|
-
phone: {
|
|
38
|
-
name: "phone",
|
|
39
|
-
},
|
|
40
|
-
},
|
|
41
|
-
},
|
|
42
|
-
},
|
|
43
|
-
},
|
|
44
|
-
oldItems: {
|
|
45
|
-
name: "old_items",
|
|
46
|
-
columns: {},
|
|
47
|
-
},
|
|
48
|
-
items2: {
|
|
49
|
-
name: "items2",
|
|
50
|
-
columns: {},
|
|
51
|
-
},
|
|
52
|
-
},
|
|
53
|
-
enums: {
|
|
54
|
-
enum0: {
|
|
55
|
-
name: "enum0",
|
|
56
|
-
values: {
|
|
57
|
-
value0: "value0",
|
|
58
|
-
value1: "value1",
|
|
59
|
-
value2: "value2",
|
|
60
|
-
},
|
|
61
|
-
},
|
|
62
|
-
enum2: {
|
|
63
|
-
name: "enum2",
|
|
64
|
-
values: {
|
|
65
|
-
value1: "value1",
|
|
66
|
-
value2: "value2",
|
|
67
|
-
},
|
|
68
|
-
},
|
|
69
|
-
},
|
|
70
|
-
};
|
|
71
|
-
|
|
72
|
-
const json2 = {
|
|
73
|
-
tables: {
|
|
74
|
-
items: {
|
|
75
|
-
name: "items",
|
|
76
|
-
columns: {
|
|
77
|
-
id: {
|
|
78
|
-
name: "id",
|
|
79
|
-
type: "int",
|
|
80
|
-
primaryKey: true,
|
|
81
|
-
autoincrement: true,
|
|
82
|
-
},
|
|
83
|
-
name: {
|
|
84
|
-
name: "name",
|
|
85
|
-
type: "character varying(512)",
|
|
86
|
-
},
|
|
87
|
-
secondName: {
|
|
88
|
-
name: "secondName",
|
|
89
|
-
type: "character varying(512)",
|
|
90
|
-
defaultValue: "Vitalik",
|
|
91
|
-
},
|
|
92
|
-
ownerId: {
|
|
93
|
-
name: "owner_id",
|
|
94
|
-
type: "int",
|
|
95
|
-
notNull: true,
|
|
96
|
-
defaultValue: 10,
|
|
97
|
-
},
|
|
98
|
-
},
|
|
99
|
-
indexes: {
|
|
100
|
-
users_phone_full_name_index: {
|
|
101
|
-
name: "users_phone_full_name_index",
|
|
102
|
-
columns: {
|
|
103
|
-
phone: {
|
|
104
|
-
name: "phone",
|
|
105
|
-
},
|
|
106
|
-
full_name: {
|
|
107
|
-
name: "full_name",
|
|
108
|
-
},
|
|
109
|
-
},
|
|
110
|
-
},
|
|
111
|
-
users_phone_index: {
|
|
112
|
-
name: "users_phone_index",
|
|
113
|
-
columns: {
|
|
114
|
-
phone: {
|
|
115
|
-
name: "phone",
|
|
116
|
-
},
|
|
117
|
-
},
|
|
118
|
-
},
|
|
119
|
-
},
|
|
120
|
-
},
|
|
121
|
-
items3: {
|
|
122
|
-
name: "items3",
|
|
123
|
-
columns: {
|
|
124
|
-
id: {
|
|
125
|
-
name: "id",
|
|
126
|
-
type: "int",
|
|
127
|
-
primaryKey: true,
|
|
128
|
-
autoincrement: true,
|
|
129
|
-
},
|
|
130
|
-
name: {
|
|
131
|
-
name: "name",
|
|
132
|
-
type: "character varying(512)",
|
|
133
|
-
notNull: true,
|
|
134
|
-
defaultValue: "defaultValue",
|
|
135
|
-
},
|
|
136
|
-
ownerId: {
|
|
137
|
-
name: "owner_id",
|
|
138
|
-
type: "int",
|
|
139
|
-
},
|
|
140
|
-
},
|
|
141
|
-
},
|
|
142
|
-
items22: {
|
|
143
|
-
name: "items22",
|
|
144
|
-
columns: {},
|
|
145
|
-
},
|
|
146
|
-
},
|
|
147
|
-
enums: {
|
|
148
|
-
enum0: {
|
|
149
|
-
name: "enum0",
|
|
150
|
-
values: {
|
|
151
|
-
value1: "value1",
|
|
152
|
-
value2: "value2",
|
|
153
|
-
value3: "value3",
|
|
154
|
-
},
|
|
155
|
-
},
|
|
156
|
-
enum1: {
|
|
157
|
-
name: "enum1",
|
|
158
|
-
values: {
|
|
159
|
-
value1: "value1",
|
|
160
|
-
value2: "value2",
|
|
161
|
-
},
|
|
162
|
-
},
|
|
163
|
-
},
|
|
164
|
-
};
|
|
165
|
-
|
|
166
|
-
const dry = {
|
|
167
|
-
version: "1",
|
|
168
|
-
tables: {},
|
|
169
|
-
enums: {}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// TODO: read snapshots from folder
|
|
173
|
-
|
|
174
|
-
// const j1 = JSON.parse(fs.readFileSync('./out/v1_1634546745488.json', 'utf8'))
|
|
175
|
-
const j1 = dry
|
|
176
|
-
const j2 = JSON.parse(fs.readFileSync('./out/v2_1634549601361.json', 'utf8'))
|
|
177
|
-
// const j3 = JSON.parse(fs.readFileSync('./out/1634215063491.json', 'utf8'))
|
|
178
|
-
const result = differ(j1, j2)
|
|
179
|
-
|
|
180
|
-
const { created, deleted, renamed } = resolveTables(result.addedTables, result.deletedTables)
|
|
181
|
-
|
|
182
|
-
const jsonStatements: any[] = []
|
|
183
|
-
|
|
184
|
-
const jsonCreateTables = created.map(it => {
|
|
185
|
-
return prepareCreateTableJson(it)
|
|
186
|
-
})
|
|
187
|
-
|
|
188
|
-
const jsonCreateIndexesForCreatedTables = created.map(it => {
|
|
189
|
-
return prepareCreateIndexesJson(it.name, it.indexes)
|
|
190
|
-
}).flat()
|
|
191
|
-
|
|
192
|
-
const jsonDropTables = deleted.map(it => {
|
|
193
|
-
return prepareDropTableJson(it)
|
|
194
|
-
})
|
|
195
|
-
|
|
196
|
-
const jsonRenameTables = renamed.map(it => {
|
|
197
|
-
return prepareRenameTableJson(it.from, it.to)
|
|
198
|
-
})
|
|
199
|
-
|
|
200
|
-
// const createNewTables = created.map(it => {
|
|
201
|
-
// return prepareCreateTable(it)
|
|
202
|
-
// })
|
|
203
|
-
// console.log(createNewTables.join('\n').trim())
|
|
204
|
-
|
|
205
|
-
// const deleteTables = deleted.map(it => {
|
|
206
|
-
// return prepareDropTable(it)
|
|
207
|
-
// })
|
|
208
|
-
// console.log(deleteTables.join('\n').trim())
|
|
209
|
-
|
|
210
|
-
const renamedWithAlternations = diffForRenamed(renamed)
|
|
211
|
-
const allAltered = result.alteredTablesWithColumns.concat(renamedWithAlternations)
|
|
212
|
-
|
|
213
|
-
// const renameTables = renamed.map(it => {
|
|
214
|
-
// return prepareRenameTable(it.from, it.to)
|
|
215
|
-
// })
|
|
216
|
-
// console.log(renameTables.join('\n').trim())
|
|
217
|
-
|
|
218
|
-
const jsonAlterTables = allAltered.map(it => {
|
|
219
|
-
return prepareAlterTableColumnsJson(it)
|
|
220
|
-
}).flat()
|
|
221
|
-
|
|
222
|
-
const jsonCreateIndexesForAllAlteredTables = allAltered.map(it => {
|
|
223
|
-
return prepareCreateIndexesJson(it.name, it.addedIndexes || {})
|
|
224
|
-
}).flat()
|
|
225
|
-
|
|
226
|
-
const jsonDropIndexesForAllAlteredTables = allAltered.map(it => {
|
|
227
|
-
return prepareDropIndexesJson(it.name, it.deletedIndexes || {})
|
|
228
|
-
}).flat()
|
|
229
|
-
|
|
230
|
-
// // Enums:
|
|
231
|
-
// // - создание енама ✅
|
|
232
|
-
// // - переименование енама (пока не делаю)⏳
|
|
233
|
-
// // - добавление вэлью к енаму ✅
|
|
234
|
-
// // - ренейм вейлью у енама (пока не делаю, это надо запрашивать опять же через слай)⏳
|
|
235
|
-
// // - удаление енама -> чекать не используется ли где-то енам и сначала ранить миграции и в самом конце удаление енама⏳
|
|
236
|
-
// // - удаление вэлью из енама -> блок ❌
|
|
237
|
-
// const enums = result.addedEnums.map(it => {
|
|
238
|
-
// return prepareCreateEnum(it.name, it.values)
|
|
239
|
-
// })
|
|
240
|
-
|
|
241
|
-
const createEnums = result.addedEnums.map(it => {
|
|
242
|
-
return prepareCreateEnumJson(it.name, it.values)
|
|
243
|
-
})
|
|
244
|
-
|
|
245
|
-
//todo: block enum rename, enum value rename and enun deletion for now
|
|
246
|
-
const jsonAlterEnumsWithAddedValues = result.alteredEnums.map(it => {
|
|
247
|
-
return prepareAddValuesToEnumJson(it.name, it.addedValues)
|
|
248
|
-
}).flat()
|
|
249
|
-
|
|
250
|
-
jsonStatements.push(...createEnums)
|
|
251
|
-
jsonStatements.push(...jsonAlterEnumsWithAddedValues)
|
|
252
|
-
jsonStatements.push(...jsonCreateTables)
|
|
253
|
-
jsonStatements.push(...jsonCreateIndexesForCreatedTables)
|
|
254
|
-
jsonStatements.push(...jsonDropTables)
|
|
255
|
-
jsonStatements.push(...jsonRenameTables)
|
|
256
|
-
jsonStatements.push(...jsonAlterTables)
|
|
257
|
-
jsonStatements.push(...jsonCreateIndexesForAllAlteredTables)
|
|
258
|
-
jsonStatements.push(...jsonDropIndexesForAllAlteredTables)
|
|
259
|
-
|
|
260
|
-
// console.log(JSON.stringify(jsonStatements, null, 2))
|
|
261
|
-
console.log(jsonStatements)
|
|
262
|
-
|
|
263
|
-
const sqlStatements = fromJson(jsonStatements)
|
|
264
|
-
console.log(sqlStatements.join('\n'))
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
// console.log(enums.join('\n').trim())
|
|
268
|
-
// console.log(alteredEnums.join('\n').trim())
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
// explicitely ask if tables were renamed, if yes - add those to altered tables, otherwise - deleted
|
|
272
|
-
// double check if user wants to delete particular table and warn him on data loss
|
package/src/differ.js
DELETED
|
@@ -1,135 +0,0 @@
|
|
|
1
|
-
'use-strict';
|
|
2
|
-
|
|
3
|
-
import { diff } from 'json-diff'
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
export function diffForRenamed(pairs) {
|
|
7
|
-
// raname table1 to name of table2, so we can apply diffs
|
|
8
|
-
const renamed = pairs.map(it => {
|
|
9
|
-
const from = it.from || it.old
|
|
10
|
-
const to = it.to || it.new
|
|
11
|
-
const newFrom = { ...from, name: to.name }
|
|
12
|
-
return [newFrom, to]
|
|
13
|
-
})
|
|
14
|
-
|
|
15
|
-
// find any alternations made to a renamed table
|
|
16
|
-
const altered = renamed.map(pair => {
|
|
17
|
-
const diffed = diff(pair[0], pair[1]);
|
|
18
|
-
diffed.name = pair[0].name
|
|
19
|
-
|
|
20
|
-
return findAlternationsInTable(diffed)
|
|
21
|
-
})
|
|
22
|
-
|
|
23
|
-
return altered
|
|
24
|
-
}
|
|
25
|
-
export function differ(json1, json2) {
|
|
26
|
-
const difference = diff(json1, json2);
|
|
27
|
-
|
|
28
|
-
difference.tables = difference.tables ? difference.tables : {}
|
|
29
|
-
difference.enums = difference.enums ? difference.enums : {}
|
|
30
|
-
|
|
31
|
-
const tableEntries = Object.entries(difference.tables)
|
|
32
|
-
const addedTables = tableEntries.filter(it => it[0].includes('__added'))
|
|
33
|
-
.map(it => it[1])
|
|
34
|
-
.map(it => {
|
|
35
|
-
// console.log(it)
|
|
36
|
-
return {
|
|
37
|
-
...it, indexes: Object.entries(it.indexes).map(indexEntry => {
|
|
38
|
-
const idx = indexEntry[1]
|
|
39
|
-
const name = idx['name']
|
|
40
|
-
const columns = Object.values(idx['columns']).map(it => it['name'])
|
|
41
|
-
return { name, columns }
|
|
42
|
-
})
|
|
43
|
-
}
|
|
44
|
-
})
|
|
45
|
-
const deletedTables = tableEntries.filter(it => it[0].includes('__deleted')).map(it => it[1])
|
|
46
|
-
|
|
47
|
-
const enumsEntries = Object.entries(difference.enums)
|
|
48
|
-
|
|
49
|
-
const addedEnums = enumsEntries.filter(it => it[0].includes('__added'))
|
|
50
|
-
.map(it => it[1])
|
|
51
|
-
.map(it => {
|
|
52
|
-
// values: { val1: 'val1', val2: 'val2' } => values: ['val1', 'val2']
|
|
53
|
-
const values = Object.entries(it.values).map(ve => ve[1])
|
|
54
|
-
return { name: it.name, values: values }
|
|
55
|
-
})
|
|
56
|
-
const deletedEnums = enumsEntries.filter(it => it[0].includes('__deleted'))
|
|
57
|
-
.map(it => it[1])
|
|
58
|
-
.map(it => {
|
|
59
|
-
|
|
60
|
-
// values: { val1: 'val1', val2: 'val2' } => values: ['val1', 'val2']
|
|
61
|
-
const values = Object.entries(it.values).map(ve => ve[1])
|
|
62
|
-
return { name: it.name, values: values }
|
|
63
|
-
})
|
|
64
|
-
const alteredEnums = enumsEntries.filter(it => !(it[0].includes('__added') || it[0].includes('__deleted')))
|
|
65
|
-
.map(it => {
|
|
66
|
-
const vals = it[1].values
|
|
67
|
-
const addedValues = Object.entries(vals).filter(val => val[0].includes('__added')).map(val => val[1])
|
|
68
|
-
const deletedValues = Object.entries(vals).filter(val => val[0].includes('__deleted')).map(val => val[1])
|
|
69
|
-
// console.log('values: ', it[1].values)
|
|
70
|
-
return { name: it[0], addedValues, deletedValues, }
|
|
71
|
-
})
|
|
72
|
-
|
|
73
|
-
const alteredTables = Object.keys(difference.tables)
|
|
74
|
-
.filter(it => !(it.includes('__added') || it.includes('__deleted')))
|
|
75
|
-
.map(it => {
|
|
76
|
-
return { name: it, ...difference.tables[it] }
|
|
77
|
-
})
|
|
78
|
-
|
|
79
|
-
const alteredTablesWithColumns = alteredTables.map(table => findAlternationsInTable(table))
|
|
80
|
-
|
|
81
|
-
return {
|
|
82
|
-
addedTables,
|
|
83
|
-
deletedTables,
|
|
84
|
-
alteredTablesWithColumns,
|
|
85
|
-
addedEnums,
|
|
86
|
-
deletedEnums,
|
|
87
|
-
alteredEnums,
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
|
|
91
|
-
const findAlternationsInTable = (table) => {
|
|
92
|
-
// map each table to have altered, deleted or renamed columns
|
|
93
|
-
const columns = table.columns; //in case no columns were altered, but indexes were
|
|
94
|
-
|
|
95
|
-
const added = Object.keys(columns).filter(it => it.includes('__added')).map(it => {
|
|
96
|
-
return { ...columns[it] }
|
|
97
|
-
})
|
|
98
|
-
const deleted = Object.keys(columns).filter(it => it.includes('__deleted')).map(it => {
|
|
99
|
-
return { ...columns[it] }
|
|
100
|
-
})
|
|
101
|
-
const altered = Object.keys(columns)
|
|
102
|
-
.filter(it => !(it.includes('__deleted') || it.includes('__added')))
|
|
103
|
-
.map(it => {
|
|
104
|
-
return { name: it, ...columns[it] }
|
|
105
|
-
})
|
|
106
|
-
|
|
107
|
-
const deletedIndexes = Object.values(table.indexes__deleted || {}).map(it => {
|
|
108
|
-
const name = it['name']
|
|
109
|
-
const columns = Object.values(it['columns']).map(it => it['name'])
|
|
110
|
-
return { name, columns }
|
|
111
|
-
}).concat(
|
|
112
|
-
Object.keys(table.indexes || {}).filter(it => it.includes('__deleted'))
|
|
113
|
-
.map(it => {
|
|
114
|
-
const idx = table.indexes[it]
|
|
115
|
-
const name = idx['name']
|
|
116
|
-
const columns = Object.values(idx['columns']).map(it => it['name'])
|
|
117
|
-
return { name, columns }
|
|
118
|
-
})
|
|
119
|
-
);
|
|
120
|
-
|
|
121
|
-
const addedIndexes = Object.values(table.indexes__added || {}).map(it => {
|
|
122
|
-
const name = it['name']
|
|
123
|
-
const columns = Object.values(it['columns']).map(it => it['name'])
|
|
124
|
-
return { name, columns }
|
|
125
|
-
}).concat(
|
|
126
|
-
Object.keys(table.indexes || {}).filter(it => it.includes('__added'))
|
|
127
|
-
.map(it => {
|
|
128
|
-
const idx = table.indexes[it]
|
|
129
|
-
const name = idx['name']
|
|
130
|
-
const columns = Object.values(idx['columns']).map(it => it['name'])
|
|
131
|
-
return { name, columns }
|
|
132
|
-
})
|
|
133
|
-
);
|
|
134
|
-
return { name: table.name, deleted, added, altered, addedIndexes, deletedIndexes }
|
|
135
|
-
}
|