drizzle-kit 0.9.1 → 0.9.5

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 (55) hide show
  1. package/drizzle.js +4 -0
  2. package/drizzle.js.map +1 -0
  3. package/package.json +5 -2
  4. package/.eslintrc +0 -21
  5. package/config.yml +0 -4
  6. package/data/_prev/multi.ts +0 -43
  7. package/data/_prev/tables/authOtpTable.ts +0 -22
  8. package/data/_prev/tables/cityTable.ts +0 -17
  9. package/data/_prev/tables/usersTable.ts +0 -18
  10. package/data/_prev/types/types.ts +0 -11
  11. package/data/v1/tables/authOtpTable.ts +0 -18
  12. package/data/v1/tables/deletedTable.ts +0 -9
  13. package/data/v1/tables/usersTable.ts +0 -15
  14. package/data/v1/types/types.ts +0 -6
  15. package/data/v2/tables/authOtpTable.ts +0 -22
  16. package/data/v2/tables/cityTable.ts +0 -10
  17. package/data/v2/tables/usersTable.ts +0 -19
  18. package/data/v2/types/types.ts +0 -11
  19. package/data/v3/tables/authOtpTable.ts +0 -21
  20. package/data/v3/tables/cityTable.ts +0 -17
  21. package/data/v3/tables/usersTable.ts +0 -18
  22. package/data/v3/types/types.ts +0 -11
  23. package/factory.ts +0 -224
  24. package/fstest.ts +0 -50
  25. package/index.ts +0 -16
  26. package/readme.md +0 -9
  27. package/serializer.ts +0 -139
  28. package/src/cli/commands/migration/index.tsx +0 -10
  29. package/src/cli/commands/migration/migrate/index.tsx +0 -164
  30. package/src/cli/components-api/ComponentsList.tsx +0 -20
  31. package/src/cli/components-api/CreateApp.tsx +0 -19
  32. package/src/cli/components-api/components/PromptColumnsConflicts.tsx +0 -171
  33. package/src/cli/components-api/components/PromptTablesConflicts.tsx +0 -180
  34. package/src/cli/components-api/components/Task.tsx +0 -85
  35. package/src/cli/components-api/index.tsx +0 -76
  36. package/src/cli/enq.ts +0 -41
  37. package/src/cli/index.tsx +0 -8
  38. package/src/cli/machines/resolveColumnsMachine.ts +0 -179
  39. package/src/cli/machines/resolveTablesMachine.ts +0 -169
  40. package/src/cli/utils/formatDataForTable.ts +0 -36
  41. package/src/cli/utils/valuesForPrompts.ts +0 -35
  42. package/src/diff.ts +0 -272
  43. package/src/differ.js +0 -135
  44. package/src/jsonStatements.js +0 -176
  45. package/src/migrationPreparator.ts +0 -47
  46. package/src/serilizer/factory.ts +0 -340
  47. package/src/serilizer/index.ts +0 -25
  48. package/src/simulator.ts +0 -85
  49. package/src/sqlgenerator.js +0 -373
  50. package/test-build.js +0 -26
  51. package/test.ts +0 -57
  52. package/testFactory.js +0 -3
  53. package/testFactory.ts +0 -26
  54. package/tsconfig.json +0 -28
  55. package/webpack.config.js +0 -53
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
- }
@@ -1,176 +0,0 @@
1
- export class Types {
2
- static createTable = 'create_table'
3
- static dropTable = 'drop_table'
4
- static renameTable = 'rename_table'
5
- static alterTableDropColumn = 'alter_table_drop_column'
6
- static alterTableAddColumn = 'alter_table_add_column'
7
- static alterTableAlterColumnSetType = 'alter_table_alter_column_set_type'
8
- static alterTableAlterColumnSetDefault = 'alter_table_alter_column_set_default'
9
- static alterTableAlterColumnDropDefault = 'alter_table_alter_column_drop_default'
10
- static alterTableAlterColumnSetNotNull = 'alter_table_alter_column_set_notnull'
11
- static alterTableAlterColumnDropNotNull = 'alter_table_alter_column_drop_notnull'
12
- static createIndex = 'create_index'
13
- static dropIndex = 'drop_index'
14
- static createTypeEnum = 'create_type_enum'
15
- static alterTypeAddValue = 'alter_type_add_value'
16
- }
17
-
18
- export const prepareCreateTableJson = (table) => {
19
- const { name, columns } = table
20
- const mappedColumns = Object.keys(columns)
21
- .map(it => {
22
- return { ...columns[it] }
23
- })
24
-
25
- return {
26
- type: Types.createTable,
27
- tableName: name,
28
- columns: mappedColumns
29
- };
30
- }
31
-
32
- export const prepareDropTableJson = (table) => {
33
- return {
34
- type: Types.dropTable,
35
- tableName: table.name
36
- }
37
- }
38
-
39
- export const prepareRenameTableJson = (tableFrom, tableTo) => {
40
- return {
41
- type: Types.renameTable,
42
- from: tableFrom.name,
43
- to: tableTo.name
44
- }
45
- }
46
-
47
- export const prepareCreateEnumJson = (name, values) => {
48
- return {
49
- type: Types.createTypeEnum,
50
- enumName: name,
51
- values
52
- }
53
- }
54
-
55
- // https://blog.yo1.dog/updating-enum-values-in-postgresql-the-safe-and-easy-way/
56
- export const prepareAddValuesToEnumJson = (name, values) => {
57
- return values.map(it => {
58
- return {
59
- type: Types.alterTypeAddValue,
60
- enumName: name,
61
- enumValue: it
62
- }
63
- })
64
- }
65
-
66
- export const prepareAlterTableColumnsJson = (table) => {
67
- const tableName = table['name'];
68
- const statements = []
69
-
70
- const dropColumns = _prepareDropColumns(tableName, table.deleted)
71
- const addColumns = _prepareAddColumns(tableName, table.added)
72
- const alterColumns = _prepareAlterColumns(tableName, table.altered)
73
-
74
-
75
- statements.push(...dropColumns)
76
- statements.push(...addColumns)
77
- statements.push(...alterColumns)
78
-
79
- return statements;
80
- }
81
-
82
- const _prepareDropColumns = (taleName, columns) => {
83
- return columns.map(it => {
84
- return {
85
- type: Types.alterTableDropColumn,
86
- tableName: taleName,
87
- columnName: it.name
88
- }
89
- })
90
- }
91
-
92
- const _prepareAddColumns = (tableName, columns) => {
93
-
94
- return columns.map(it => {
95
- return {
96
- type: Types.alterTableAddColumn,
97
- tableName,
98
- column: it
99
- }
100
- })
101
- }
102
-
103
- const _prepareAlterColumns = (tableName, columns) => {
104
- let statements = []
105
-
106
- for (const column of columns) {
107
- const columnName = column.name;
108
-
109
- if (column['type']) {
110
- const { __new } = column.type
111
-
112
- statements.push({
113
- type: Types.alterTableAlterColumnSetType,
114
- tableName,
115
- columnName,
116
- newDataType: __new
117
- })
118
- }
119
-
120
- if (column['defaultValue'] || column['defaultValue__added']) {
121
- const newDefaultValue = column.defaultValue.__new | column.defaultValue__added
122
- statements.push({
123
- type: Types.alterTableAlterColumnSetDefault,
124
- tableName,
125
- columnName,
126
- newDefault: newDefaultValue
127
- })
128
- }
129
-
130
- if (column['defaultValue__deleted']) {
131
- statements.push({
132
- type: Types.alterTableAlterColumnDropDefault,
133
- tableName,
134
- columnName,
135
- })
136
- }
137
-
138
- if (column['notNull__added'] || (column['notNull'] && column['notNull']['__new'])) {
139
- statements.push({
140
- type: Types.alterTableAlterColumnSetNotNull,
141
- tableName,
142
- columnName
143
- })
144
- }
145
-
146
- if (column['notNull__deleted'] || (column['notNull'] && !column['notNull']['__new'])) {
147
- statements.push({
148
- type: Types.alterTableAlterColumnDropNotNull,
149
- tableName,
150
- columnName
151
- })
152
- }
153
- }
154
-
155
- return statements
156
- }
157
-
158
- export const prepareCreateIndexesJson = (tableName, indexes) => {
159
- return indexes.map(index => {
160
- return {
161
- type: Types.createIndex,
162
- tableName,
163
- indexName: index.name,
164
- indexValue: index.columns.join(', ')
165
- }
166
- })
167
- }
168
- export const prepareDropIndexesJson = (tableName, indexes) => {
169
- return indexes.map(index => {
170
- return {
171
- type: Types.dropIndex,
172
- tableName,
173
- indexName: index.name,
174
- }
175
- })
176
- }
@@ -1,47 +0,0 @@
1
- import fs from 'fs'
2
- import serialize from 'serilizer'
3
-
4
- // TODO: export as a function w
5
-
6
- const dry = {
7
- version: "1",
8
- tables: {},
9
- enums: {}
10
- }
11
-
12
- const prepareMigration = (
13
- migrationRootFolderName: string = 'drizzle',
14
- dataFolderPath: string
15
- ): { prev: any, cur: any } => {
16
- const root = migrationRootFolderName
17
- const files = fs.readdirSync('./')
18
- const drizzleFolder = files.find((it) => {
19
- return it === root
20
- })
21
-
22
- if (!drizzleFolder) {
23
- fs.mkdirSync(root)
24
- }
25
-
26
- const migrationFolders = fs.readdirSync(`./${root}`)
27
-
28
- let prevSnapshot;
29
-
30
- if (migrationFolders.length === 0) {
31
- prevSnapshot = dry
32
- } else {
33
- migrationFolders.sort()
34
- const lastSnapshotFolder = migrationFolders[migrationFolders.length - 1]
35
- console.log(lastSnapshotFolder)
36
- prevSnapshot = JSON.parse(fs.readFileSync(`./${root}/${lastSnapshotFolder}/snapshot.json`).toString())
37
- }
38
-
39
- const tbls = `${dataFolderPath}/tables/`
40
- const tps = `${dataFolderPath}/types/`
41
-
42
- const result = serialize(tbls, tps)
43
-
44
- return { prev: prevSnapshot, cur: result }
45
- }
46
-
47
- export default prepareMigration;