instant-cli 0.22.97 → 0.22.98
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/.turbo/turbo-build.log +1 -1
- package/dist/index.js +1041 -1146
- package/dist/index.js.map +1 -1
- package/dist/rename.js +58 -69
- package/dist/rename.js.map +1 -1
- package/dist/renderSchemaPlan.js +10 -22
- package/dist/renderSchemaPlan.js.map +1 -1
- package/dist/ui/index.js +115 -102
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/lib.js +29 -30
- package/dist/ui/lib.js.map +1 -1
- package/dist/util/fs.js +17 -30
- package/dist/util/fs.js.map +1 -1
- package/dist/util/isHeadlessEnvironment.js +1 -1
- package/dist/util/isHeadlessEnvironment.js.map +1 -1
- package/dist/util/loadConfig.js +32 -32
- package/dist/util/loadConfig.js.map +1 -1
- package/dist/util/packageManager.js +26 -37
- package/dist/util/packageManager.js.map +1 -1
- package/dist/util/projectDir.js +16 -27
- package/dist/util/projectDir.js.map +1 -1
- package/dist/util/promptOk.js +14 -21
- package/dist/util/promptOk.js.map +1 -1
- package/dist/util/renamePrompt.js +4 -2
- package/dist/util/renamePrompt.js.map +1 -1
- package/package.json +4 -4
package/dist/rename.js
CHANGED
|
@@ -1,12 +1,3 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
/**
|
|
11
2
|
* Build a function to resolve renames from cli rename flags
|
|
12
3
|
* The diffSchemas function takes a fixed amount of arguments so we
|
|
@@ -16,75 +7,73 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, ge
|
|
|
16
7
|
* @returns
|
|
17
8
|
*/
|
|
18
9
|
export function buildAutoRenameSelector(opts) {
|
|
19
|
-
return function (created, promptData, extraInfo) {
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
renameMap.set(to.trim(), from.trim());
|
|
32
|
-
}
|
|
10
|
+
return async function (created, promptData, extraInfo) {
|
|
11
|
+
if (!opts.rename || !Array.isArray(opts.rename)) {
|
|
12
|
+
return created;
|
|
13
|
+
}
|
|
14
|
+
// Parse rename options: format is "from:to"
|
|
15
|
+
// note that it saves backwards since we will be testing against the base
|
|
16
|
+
// case of a created attr
|
|
17
|
+
const renameMap = new Map();
|
|
18
|
+
for (const renameStr of opts.rename) {
|
|
19
|
+
const [from, to] = renameStr.split(':');
|
|
20
|
+
if (from && to) {
|
|
21
|
+
renameMap.set(to.trim(), from.trim());
|
|
33
22
|
}
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
23
|
+
}
|
|
24
|
+
let lookupNames = [];
|
|
25
|
+
if (extraInfo?.type === 'attribute' && extraInfo?.entityName) {
|
|
26
|
+
lookupNames = [`${extraInfo.entityName}.${created}`];
|
|
27
|
+
}
|
|
28
|
+
else if (extraInfo?.type === 'link') {
|
|
29
|
+
// Extract both forward and reverse parts
|
|
30
|
+
const parts = created.split('<->');
|
|
31
|
+
lookupNames = [parts[0], parts[1]];
|
|
32
|
+
}
|
|
33
|
+
else {
|
|
34
|
+
return created;
|
|
35
|
+
}
|
|
36
|
+
// Try to find a match in the rename map using the lookup names
|
|
37
|
+
let fromAttr = null;
|
|
38
|
+
for (const lookupName of lookupNames) {
|
|
39
|
+
if (renameMap.has(lookupName)) {
|
|
40
|
+
fromAttr = renameMap.get(lookupName);
|
|
41
|
+
break;
|
|
37
42
|
}
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
43
|
+
}
|
|
44
|
+
if (fromAttr) {
|
|
45
|
+
let fromValue;
|
|
46
|
+
if (extraInfo?.type === 'attribute') {
|
|
47
|
+
fromValue = fromAttr.split('.').pop();
|
|
42
48
|
}
|
|
43
49
|
else {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
if (
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
}
|
|
53
|
-
}
|
|
54
|
-
if (fromAttr) {
|
|
55
|
-
let fromValue;
|
|
56
|
-
if ((extraInfo === null || extraInfo === void 0 ? void 0 : extraInfo.type) === 'attribute') {
|
|
57
|
-
fromValue = fromAttr.split('.').pop();
|
|
50
|
+
const matchingItem = promptData.find((item) => {
|
|
51
|
+
const itemStr = typeof item === 'string' ? item : item.from;
|
|
52
|
+
const itemParts = itemStr.split('<->');
|
|
53
|
+
return itemParts[0] === fromAttr || itemParts[1] === fromAttr;
|
|
54
|
+
});
|
|
55
|
+
if (matchingItem) {
|
|
56
|
+
fromValue =
|
|
57
|
+
typeof matchingItem === 'string' ? matchingItem : matchingItem.from;
|
|
58
58
|
}
|
|
59
59
|
else {
|
|
60
|
-
|
|
61
|
-
const itemStr = typeof item === 'string' ? item : item.from;
|
|
62
|
-
const itemParts = itemStr.split('<->');
|
|
63
|
-
return itemParts[0] === fromAttr || itemParts[1] === fromAttr;
|
|
64
|
-
});
|
|
65
|
-
if (matchingItem) {
|
|
66
|
-
fromValue =
|
|
67
|
-
typeof matchingItem === 'string' ? matchingItem : matchingItem.from;
|
|
68
|
-
}
|
|
69
|
-
else {
|
|
70
|
-
return created;
|
|
71
|
-
}
|
|
60
|
+
return created;
|
|
72
61
|
}
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
return false;
|
|
81
|
-
});
|
|
82
|
-
if (hasMatch) {
|
|
83
|
-
return { from: fromValue, to: created };
|
|
62
|
+
}
|
|
63
|
+
const hasMatch = promptData.some((item) => {
|
|
64
|
+
if (typeof item === 'string') {
|
|
65
|
+
return item === fromValue;
|
|
66
|
+
}
|
|
67
|
+
else if (item.from) {
|
|
68
|
+
return item.from === fromValue;
|
|
84
69
|
}
|
|
70
|
+
return false;
|
|
71
|
+
});
|
|
72
|
+
if (hasMatch) {
|
|
73
|
+
return { from: fromValue, to: created };
|
|
85
74
|
}
|
|
86
|
-
|
|
87
|
-
|
|
75
|
+
}
|
|
76
|
+
return created;
|
|
88
77
|
};
|
|
89
78
|
}
|
|
90
79
|
//# sourceMappingURL=rename.js.map
|
package/dist/rename.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rename.js","sourceRoot":"","sources":["../src/rename.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"rename.js","sourceRoot":"","sources":["../src/rename.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAI;IAC1C,OAAO,KAAK,WAAW,OAAO,EAAE,UAAU,EAAE,SAAS;QACnD,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC;YAChD,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,4CAA4C;QAC5C,yEAAyE;QACzE,yBAAyB;QACzB,MAAM,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;QAC5B,KAAK,MAAM,SAAS,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YACpC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxC,IAAI,IAAI,IAAI,EAAE,EAAE,CAAC;gBACf,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;YACxC,CAAC;QACH,CAAC;QAED,IAAI,WAAW,GAAa,EAAE,CAAC;QAC/B,IAAI,SAAS,EAAE,IAAI,KAAK,WAAW,IAAI,SAAS,EAAE,UAAU,EAAE,CAAC;YAC7D,WAAW,GAAG,CAAC,GAAG,SAAS,CAAC,UAAU,IAAI,OAAO,EAAE,CAAC,CAAC;QACvD,CAAC;aAAM,IAAI,SAAS,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;YACtC,yCAAyC;YACzC,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACnC,WAAW,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,OAAO,OAAO,CAAC;QACjB,CAAC;QAED,+DAA+D;QAC/D,IAAI,QAAQ,GAAkB,IAAI,CAAC;QACnC,KAAK,MAAM,UAAU,IAAI,WAAW,EAAE,CAAC;YACrC,IAAI,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC9B,QAAQ,GAAG,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;gBACrC,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,EAAE,CAAC;YACb,IAAI,SAAS,CAAC;YACd,IAAI,SAAS,EAAE,IAAI,KAAK,WAAW,EAAE,CAAC;gBACpC,SAAS,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YACxC,CAAC;iBAAM,CAAC;gBACN,MAAM,YAAY,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;oBAC5C,MAAM,OAAO,GAAG,OAAO,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;oBAC5D,MAAM,SAAS,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;oBACvC,OAAO,SAAS,CAAC,CAAC,CAAC,KAAK,QAAQ,IAAI,SAAS,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC;gBAChE,CAAC,CAAC,CAAC;gBAEH,IAAI,YAAY,EAAE,CAAC;oBACjB,SAAS;wBACP,OAAO,YAAY,KAAK,QAAQ,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC;gBACxE,CAAC;qBAAM,CAAC;oBACN,OAAO,OAAO,CAAC;gBACjB,CAAC;YACH,CAAC;YAED,MAAM,QAAQ,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;gBACxC,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;oBAC7B,OAAO,IAAI,KAAK,SAAS,CAAC;gBAC5B,CAAC;qBAAM,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;oBACrB,OAAO,IAAI,CAAC,IAAI,KAAK,SAAS,CAAC;gBACjC,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC,CAAC,CAAC;YAEH,IAAI,QAAQ,EAAE,CAAC;gBACb,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,OAAO,EAAE,CAAC;YAC1C,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAC;IACjB,CAAC,CAAC;AACJ,CAAC","sourcesContent":["/**\n * Build a function to resolve renames from cli rename flags\n * The diffSchemas function takes a fixed amount of arguments so we\n * return a function from a function here\n * exported for tests only\n * @param {*} opts program arguments from commander\n * @returns\n */\nexport function buildAutoRenameSelector(opts) {\n return async function (created, promptData, extraInfo) {\n if (!opts.rename || !Array.isArray(opts.rename)) {\n return created;\n }\n\n // Parse rename options: format is \"from:to\"\n // note that it saves backwards since we will be testing against the base\n // case of a created attr\n const renameMap = new Map();\n for (const renameStr of opts.rename) {\n const [from, to] = renameStr.split(':');\n if (from && to) {\n renameMap.set(to.trim(), from.trim());\n }\n }\n\n let lookupNames: string[] = [];\n if (extraInfo?.type === 'attribute' && extraInfo?.entityName) {\n lookupNames = [`${extraInfo.entityName}.${created}`];\n } else if (extraInfo?.type === 'link') {\n // Extract both forward and reverse parts\n const parts = created.split('<->');\n lookupNames = [parts[0], parts[1]];\n } else {\n return created;\n }\n\n // Try to find a match in the rename map using the lookup names\n let fromAttr: string | null = null;\n for (const lookupName of lookupNames) {\n if (renameMap.has(lookupName)) {\n fromAttr = renameMap.get(lookupName);\n break;\n }\n }\n\n if (fromAttr) {\n let fromValue;\n if (extraInfo?.type === 'attribute') {\n fromValue = fromAttr.split('.').pop();\n } else {\n const matchingItem = promptData.find((item) => {\n const itemStr = typeof item === 'string' ? item : item.from;\n const itemParts = itemStr.split('<->');\n return itemParts[0] === fromAttr || itemParts[1] === fromAttr;\n });\n\n if (matchingItem) {\n fromValue =\n typeof matchingItem === 'string' ? matchingItem : matchingItem.from;\n } else {\n return created;\n }\n }\n\n const hasMatch = promptData.some((item) => {\n if (typeof item === 'string') {\n return item === fromValue;\n } else if (item.from) {\n return item.from === fromValue;\n }\n return false;\n });\n\n if (hasMatch) {\n return { from: fromValue, to: created };\n }\n }\n\n return created;\n };\n}\n"]}
|
package/dist/renderSchemaPlan.js
CHANGED
|
@@ -1,17 +1,7 @@
|
|
|
1
|
-
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
2
|
-
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
3
|
-
return new (P || (P = Promise))(function (resolve, reject) {
|
|
4
|
-
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
5
|
-
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
6
|
-
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
7
|
-
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
8
|
-
});
|
|
9
|
-
};
|
|
10
1
|
import chalk from 'chalk';
|
|
11
2
|
import stripAnsi from 'strip-ansi';
|
|
12
3
|
import { promptOk } from './util/promptOk.js';
|
|
13
4
|
const renderLinkUpdate = (tx, possiblePrevAttrs) => {
|
|
14
|
-
var _a, _b, _c;
|
|
15
5
|
if (tx.partialAttr['value-type'] !== 'ref') {
|
|
16
6
|
throw new Error('Invalid value type for link update');
|
|
17
7
|
}
|
|
@@ -22,7 +12,7 @@ const renderLinkUpdate = (tx, possiblePrevAttrs) => {
|
|
|
22
12
|
}) || null
|
|
23
13
|
: null;
|
|
24
14
|
let changeType = 'UPDATE';
|
|
25
|
-
if (
|
|
15
|
+
if (tx.partialAttr['forward-identity']?.attrName &&
|
|
26
16
|
tx.identifier.attrName !== tx.partialAttr['forward-identity'].attrName) {
|
|
27
17
|
changeType = 'RENAME';
|
|
28
18
|
}
|
|
@@ -30,8 +20,8 @@ const renderLinkUpdate = (tx, possiblePrevAttrs) => {
|
|
|
30
20
|
let reverseLabel = '';
|
|
31
21
|
if (oldAttr) {
|
|
32
22
|
// Check for reverse rename
|
|
33
|
-
if (
|
|
34
|
-
|
|
23
|
+
if (tx.partialAttr['reverse-identity']?.attrName &&
|
|
24
|
+
oldAttr['reverse-identity']?.[2] !==
|
|
35
25
|
tx.partialAttr['reverse-identity'].attrName) {
|
|
36
26
|
changeType = 'RENAME REVERSE';
|
|
37
27
|
}
|
|
@@ -120,10 +110,10 @@ export const groupSteps = (steps) => {
|
|
|
120
110
|
});
|
|
121
111
|
return [...collapsed, ...otherSteps];
|
|
122
112
|
};
|
|
123
|
-
export const confirmImportantSteps = (planSteps) =>
|
|
113
|
+
export const confirmImportantSteps = async (planSteps) => {
|
|
124
114
|
for (const step of planSteps) {
|
|
125
115
|
if (step.type === 'delete-namespace') {
|
|
126
|
-
const ok =
|
|
116
|
+
const ok = await promptOk({
|
|
127
117
|
promptText: `Are you sure you want to delete namespace ${step.namespace}?`,
|
|
128
118
|
});
|
|
129
119
|
if (!ok) {
|
|
@@ -131,17 +121,15 @@ export const confirmImportantSteps = (planSteps) => __awaiter(void 0, void 0, vo
|
|
|
131
121
|
}
|
|
132
122
|
}
|
|
133
123
|
}
|
|
134
|
-
}
|
|
124
|
+
};
|
|
135
125
|
const createDotName = (step) => {
|
|
136
126
|
return `${step.identifier.namespace}.${step.identifier.attrName}`;
|
|
137
127
|
};
|
|
138
128
|
const isRename = (step) => {
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
((_b = step.partialAttr['forward-identity']) === null || _b === void 0 ? void 0 : _b.attrName) !== step.identifier.attrName);
|
|
129
|
+
return (step.partialAttr['forward-identity']?.attrName &&
|
|
130
|
+
step.partialAttr['forward-identity']?.attrName !== step.identifier.attrName);
|
|
142
131
|
};
|
|
143
132
|
export const renderSchemaPlan = (planSteps, prevAttrs) => {
|
|
144
|
-
var _a, _b;
|
|
145
133
|
const result = [];
|
|
146
134
|
const addLine = (line) => {
|
|
147
135
|
result.push(line);
|
|
@@ -189,7 +177,7 @@ export const renderSchemaPlan = (planSteps, prevAttrs) => {
|
|
|
189
177
|
attr['forward-identity'][2] === step.identifier.attrName);
|
|
190
178
|
}) || null
|
|
191
179
|
: null;
|
|
192
|
-
if (
|
|
180
|
+
if (oldAttr?.['value-type'] === 'ref') {
|
|
193
181
|
addLine(`${chalk.bgRed(' - DELETE LINK ')} ${step.identifier.namespace}.${step.identifier.attrName}`);
|
|
194
182
|
break;
|
|
195
183
|
}
|
|
@@ -201,7 +189,7 @@ export const renderSchemaPlan = (planSteps, prevAttrs) => {
|
|
|
201
189
|
}
|
|
202
190
|
else {
|
|
203
191
|
if (isRename(step)) {
|
|
204
|
-
addLine(`${chalk.bgYellow.black(' * RENAME ATTR ')} ${createDotName(step)} -> ${
|
|
192
|
+
addLine(`${chalk.bgYellow.black(' * RENAME ATTR ')} ${createDotName(step)} -> ${step.partialAttr['forward-identity']?.['namespace']}.${step.partialAttr['forward-identity']?.['attrName']}`);
|
|
205
193
|
}
|
|
206
194
|
else {
|
|
207
195
|
addLine(`${chalk.bgYellow.black(' * UPDATE ATTR ')} ${createDotName(step)}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"renderSchemaPlan.js","sourceRoot":"","sources":["../src/renderSchemaPlan.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n convertTxSteps,\n MigrationTx,\n MigrationTxSpecific,\n MigrationTxTypes,\n} from '@instantdb/platform';\nimport chalk from 'chalk';\nimport stripAnsi from 'strip-ansi';\nimport { promptOk } from './util/promptOk.js';\n\n// Hack to prevent using @instantdb/core as a dependency for cli\ntype InstantDBAttr = Parameters<typeof convertTxSteps>[1][0];\n\nconst renderLinkUpdate = (\n tx: MigrationTxTypes['update-attr'],\n possiblePrevAttrs?: InstantDBAttr[],\n): string => {\n if (tx.partialAttr['value-type'] !== 'ref') {\n throw new Error('Invalid value type for link update');\n }\n\n const oldAttr = possiblePrevAttrs\n ? possiblePrevAttrs.find((attr) => {\n return (\n attr['forward-identity'][1] === tx.identifier.namespace &&\n attr['forward-identity'][2] === tx.identifier.attrName\n );\n }) || null\n : null;\n\n let changeType: 'UPDATE' | 'RENAME' | 'RENAME REVERSE' = 'UPDATE';\n\n if (\n tx.partialAttr['forward-identity']?.attrName &&\n tx.identifier.attrName !== tx.partialAttr['forward-identity'].attrName\n ) {\n changeType = 'RENAME';\n }\n\n const details: string[] = [];\n let reverseLabel = '';\n if (oldAttr) {\n // Check for reverse rename\n if (\n tx.partialAttr['reverse-identity']?.attrName &&\n oldAttr['reverse-identity']?.[2] !==\n tx.partialAttr['reverse-identity'].attrName\n ) {\n changeType = 'RENAME REVERSE';\n }\n\n reverseLabel = ` <-> ${oldAttr['reverse-identity']![1]}.${oldAttr['reverse-identity']![2]}`;\n\n if (!oldAttr['on-delete'] && tx.partialAttr['on-delete']) {\n details.push(\n `(SET ON DELETE ${oldAttr['reverse-identity']![1]} CASCADE DELETE ${oldAttr['forward-identity'][1]})`,\n );\n }\n if (!oldAttr['on-delete-reverse'] && tx.partialAttr['on-delete-reverse']) {\n details.push(\n `(SET ON DELETE ${oldAttr['forward-identity']![1]} CASCADE DELETE ${oldAttr['reverse-identity']![1]})`,\n );\n }\n if (oldAttr['on-delete'] && !oldAttr['on-delete-reverse']) {\n details.push(\n `(REMOVE CASCADE DELETE ON ${oldAttr['reverse-identity']![1]})`,\n );\n }\n if (oldAttr['on-delete-reverse'] && !oldAttr['on-delete-reverse']) {\n details.push(\n `(REMOVE REVERSE CASCADE DELETE ON ${oldAttr['forward-identity'][1]})`,\n );\n }\n }\n\n return `${chalk.bgYellow.black(` * ${changeType} ATTR `)} ${tx.identifier.namespace}.${tx.identifier.attrName}${reverseLabel} ${details.join(' ')}`;\n};\n\nexport class CancelSchemaError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'CancelSchemaError';\n }\n}\n\nconst getRelationship = (\n cardinality: 'one' | 'many',\n unique: boolean,\n): string[] => {\n if (cardinality === 'many' && !unique) return ['many', 'many'];\n if (cardinality === 'one' && unique) return ['one', 'one'];\n if (cardinality === 'many' && unique) return ['many', 'one'];\n if (cardinality === 'one' && !unique) return ['one', 'many'];\n throw new Error('Invalid relationship');\n};\n\ntype AddOrDeleteAttr =\n | MigrationTxSpecific<'add-attr'>\n | MigrationTxSpecific<'delete-attr'>;\n\ntype SuperMigrationTx =\n | MigrationTx\n | { type: 'create-namespace'; namespace: string; innerSteps: MigrationTx[] }\n | { type: 'delete-namespace'; namespace: string; innerSteps: MigrationTx[] };\n\nexport const groupSteps = (steps: MigrationTx[]): SuperMigrationTx[] => {\n const { addOrDelSteps, otherSteps } = steps.reduce(\n (acc, step) => {\n if (step.type === 'add-attr' || step.type === 'delete-attr') {\n acc.addOrDelSteps.push(step);\n } else {\n acc.otherSteps.push(step);\n }\n return acc;\n },\n { addOrDelSteps: [] as AddOrDeleteAttr[], otherSteps: [] as MigrationTx[] },\n );\n // Group by namespace\n const groupedAddOrDel = addOrDelSteps.reduce(\n (acc, step) => {\n const namespace = step.identifier.namespace;\n if (!acc[namespace]) {\n acc[namespace] = [];\n }\n acc[namespace].push(step);\n return acc;\n },\n {} as Record<string, MigrationTx[]>,\n );\n\n const collapsed: SuperMigrationTx[] = Object.values(groupedAddOrDel).flatMap(\n (namedGroup) => {\n const isWholeEntityBeingDeleted = namedGroup.some((step) => {\n if (step.type === 'delete-attr' && step.identifier.attrName === 'id') {\n return true;\n }\n });\n\n if (isWholeEntityBeingDeleted) {\n return [\n {\n type: 'delete-namespace',\n namespace: namedGroup[0].identifier.namespace,\n innerSteps: namedGroup,\n } satisfies SuperMigrationTx as SuperMigrationTx,\n ];\n }\n\n const isWholeEntityBeingCreated = namedGroup.some((step) => {\n if (step.type === 'add-attr' && step.identifier.attrName === 'id') {\n return true;\n }\n });\n\n if (isWholeEntityBeingCreated) {\n return [\n {\n type: 'create-namespace',\n namespace: namedGroup[0].identifier.namespace,\n innerSteps: namedGroup,\n } satisfies SuperMigrationTx as SuperMigrationTx,\n ];\n }\n\n return namedGroup;\n },\n );\n\n return [...collapsed, ...otherSteps];\n};\n\nexport const confirmImportantSteps = async (planSteps: SuperMigrationTx[]) => {\n for (const step of planSteps) {\n if (step.type === 'delete-namespace') {\n const ok = await promptOk({\n promptText: `Are you sure you want to delete namespace ${step.namespace}?`,\n });\n if (!ok) {\n throw new CancelSchemaError(`Deletion of namespace ${step.namespace}`);\n }\n }\n }\n};\n\nconst createDotName = (step: MigrationTx) => {\n return `${step.identifier.namespace}.${step.identifier.attrName}`;\n};\n\nconst isRename = (step: MigrationTxSpecific<'update-attr'>) => {\n return (\n step.partialAttr['forward-identity']?.attrName &&\n step.partialAttr['forward-identity']?.attrName !== step.identifier.attrName\n );\n};\n\nexport const renderSchemaPlan = (\n planSteps: SuperMigrationTx[],\n prevAttrs?: InstantDBAttr[],\n): string[] => {\n const result: string[] = [];\n\n const addLine = (line: string) => {\n result.push(line);\n };\n\n const addSecondaryLine = (line: string) => {\n addLine(` ${chalk.italic(chalk.gray(stripAnsi(line)))}`);\n };\n\n for (const step of planSteps) {\n switch (step.type) {\n case 'create-namespace':\n addLine(\n `${chalk.bgGreen.black(' + CREATE NAMESPACE ')} ${step.namespace}`,\n );\n renderSchemaPlan(step.innerSteps, prevAttrs).forEach((outputLine) =>\n addSecondaryLine(outputLine),\n );\n break;\n case 'delete-namespace':\n addLine(`${chalk.bgRed(' - DELETE NAMESPACE ')} ${step.namespace}`);\n break;\n case 'add-attr':\n if (step['value-type'] === 'ref' && step['reverse-identity']) {\n addLine(\n `${chalk.bgGreen.black(' + CREATE LINK ')} ${createDotName(step)} <-> ${step['reverse-identity'].namespace}.${step['reverse-identity'].attrName}`,\n );\n addSecondaryLine(\n ' ' +\n getRelationship(step.cardinality, step['unique?'])\n .join(' <-> ')\n .toUpperCase(),\n );\n } else {\n addLine(\n `${chalk.bgGreen.black(' + CREATE ATTR ')} ${createDotName(step)}`,\n );\n if (step['checked-data-type']) {\n addSecondaryLine(' DATA TYPE: ' + step['checked-data-type']);\n }\n if (step['unique?'] && step.identifier.attrName !== 'id') {\n addSecondaryLine(' UNIQUE');\n }\n if (!step['required?']) {\n addSecondaryLine(' OPTIONAL');\n }\n if (step['index?']) {\n addSecondaryLine(' INDEXED');\n }\n }\n break;\n case 'delete-attr':\n const oldAttr = prevAttrs\n ? prevAttrs.find((attr) => {\n return (\n attr['forward-identity'][1] === step.identifier.namespace &&\n attr['forward-identity'][2] === step.identifier.attrName\n );\n }) || null\n : null;\n\n if (oldAttr?.['value-type'] === 'ref') {\n addLine(\n `${chalk.bgRed(' - DELETE LINK ')} ${step.identifier.namespace}.${step.identifier.attrName}`,\n );\n break;\n }\n\n addLine(`${chalk.bgRed(' - DELETE ATTR ')} ${createDotName(step)}`);\n break;\n case 'update-attr':\n if (step.partialAttr['value-type'] === 'ref') {\n addLine(renderLinkUpdate(step, prevAttrs));\n } else {\n if (isRename(step)) {\n addLine(\n `${chalk.bgYellow.black(' * RENAME ATTR ')} ${createDotName(step)} -> ${step.partialAttr['forward-identity']?.['namespace']}.${step.partialAttr['forward-identity']?.['attrName']}`,\n );\n } else {\n addLine(\n `${chalk.bgYellow.black(' * UPDATE ATTR ')} ${createDotName(step)}`,\n );\n }\n }\n break;\n case 'index':\n addLine(\n `${chalk.bgBlue.black(' + CREATE INDEX ')} ${createDotName(step)}`,\n );\n break;\n case 'remove-index':\n addLine(\n `${chalk.bgBlue.black(' - DELETE INDEX ')} ${createDotName(step)}`,\n );\n break;\n case 'required':\n addLine(\n `${chalk.bgBlue.black(' + MAKE REQUIRED ')} ${createDotName(step)}`,\n );\n break;\n case 'unique':\n addLine(\n `${chalk.bgBlue.black(' * MAKE UNIQUE ')} ${createDotName(step)}`,\n );\n break;\n case 'remove-required':\n addLine(\n `${chalk.bgBlue.black(' - MAKE OPTIONAL ')} ${createDotName(step)}`,\n );\n break;\n case 'remove-unique':\n addLine(\n `${chalk.bgBlue.black(' - REMOVE UNIQUE CONSTRAINT')} ${createDotName(step)}`,\n );\n break;\n case 'check-data-type':\n addLine(\n `${chalk.bgBlue.black(' + SET DATA TYPE ')} ${createDotName(step)} ${chalk.dim(step['checked-data-type'])}`,\n );\n break;\n case 'remove-data-type':\n addLine(\n `${chalk.bgBlue.black(' - REMOVE DATA TYPE CONSTRAINT ')} ${createDotName(step)}`,\n );\n break;\n\n default:\n const unknownStep: never = step;\n }\n }\n\n return result;\n};\n"]}
|
|
1
|
+
{"version":3,"file":"renderSchemaPlan.js","sourceRoot":"","sources":["../src/renderSchemaPlan.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n convertTxSteps,\n MigrationTx,\n MigrationTxSpecific,\n MigrationTxTypes,\n} from '@instantdb/platform';\nimport chalk from 'chalk';\nimport stripAnsi from 'strip-ansi';\nimport { promptOk } from './util/promptOk.js';\n\n// Hack to prevent using @instantdb/core as a dependency for cli\ntype InstantDBAttr = Parameters<typeof convertTxSteps>[1][0];\n\nconst renderLinkUpdate = (\n tx: MigrationTxTypes['update-attr'],\n possiblePrevAttrs?: InstantDBAttr[],\n): string => {\n if (tx.partialAttr['value-type'] !== 'ref') {\n throw new Error('Invalid value type for link update');\n }\n\n const oldAttr = possiblePrevAttrs\n ? possiblePrevAttrs.find((attr) => {\n return (\n attr['forward-identity'][1] === tx.identifier.namespace &&\n attr['forward-identity'][2] === tx.identifier.attrName\n );\n }) || null\n : null;\n\n let changeType: 'UPDATE' | 'RENAME' | 'RENAME REVERSE' = 'UPDATE';\n\n if (\n tx.partialAttr['forward-identity']?.attrName &&\n tx.identifier.attrName !== tx.partialAttr['forward-identity'].attrName\n ) {\n changeType = 'RENAME';\n }\n\n const details: string[] = [];\n let reverseLabel = '';\n if (oldAttr) {\n // Check for reverse rename\n if (\n tx.partialAttr['reverse-identity']?.attrName &&\n oldAttr['reverse-identity']?.[2] !==\n tx.partialAttr['reverse-identity'].attrName\n ) {\n changeType = 'RENAME REVERSE';\n }\n\n reverseLabel = ` <-> ${oldAttr['reverse-identity']![1]}.${oldAttr['reverse-identity']![2]}`;\n\n if (!oldAttr['on-delete'] && tx.partialAttr['on-delete']) {\n details.push(\n `(SET ON DELETE ${oldAttr['reverse-identity']![1]} CASCADE DELETE ${oldAttr['forward-identity'][1]})`,\n );\n }\n if (!oldAttr['on-delete-reverse'] && tx.partialAttr['on-delete-reverse']) {\n details.push(\n `(SET ON DELETE ${oldAttr['forward-identity']![1]} CASCADE DELETE ${oldAttr['reverse-identity']![1]})`,\n );\n }\n if (oldAttr['on-delete'] && !oldAttr['on-delete-reverse']) {\n details.push(\n `(REMOVE CASCADE DELETE ON ${oldAttr['reverse-identity']![1]})`,\n );\n }\n if (oldAttr['on-delete-reverse'] && !oldAttr['on-delete-reverse']) {\n details.push(\n `(REMOVE REVERSE CASCADE DELETE ON ${oldAttr['forward-identity'][1]})`,\n );\n }\n }\n\n return `${chalk.bgYellow.black(` * ${changeType} ATTR `)} ${tx.identifier.namespace}.${tx.identifier.attrName}${reverseLabel} ${details.join(' ')}`;\n};\n\nexport class CancelSchemaError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'CancelSchemaError';\n }\n}\n\nconst getRelationship = (\n cardinality: 'one' | 'many',\n unique: boolean,\n): string[] => {\n if (cardinality === 'many' && !unique) return ['many', 'many'];\n if (cardinality === 'one' && unique) return ['one', 'one'];\n if (cardinality === 'many' && unique) return ['many', 'one'];\n if (cardinality === 'one' && !unique) return ['one', 'many'];\n throw new Error('Invalid relationship');\n};\n\ntype AddOrDeleteAttr =\n | MigrationTxSpecific<'add-attr'>\n | MigrationTxSpecific<'delete-attr'>;\n\ntype SuperMigrationTx =\n | MigrationTx\n | { type: 'create-namespace'; namespace: string; innerSteps: MigrationTx[] }\n | { type: 'delete-namespace'; namespace: string; innerSteps: MigrationTx[] };\n\nexport const groupSteps = (steps: MigrationTx[]): SuperMigrationTx[] => {\n const { addOrDelSteps, otherSteps } = steps.reduce(\n (acc, step) => {\n if (step.type === 'add-attr' || step.type === 'delete-attr') {\n acc.addOrDelSteps.push(step);\n } else {\n acc.otherSteps.push(step);\n }\n return acc;\n },\n { addOrDelSteps: [] as AddOrDeleteAttr[], otherSteps: [] as MigrationTx[] },\n );\n // Group by namespace\n const groupedAddOrDel = addOrDelSteps.reduce(\n (acc, step) => {\n const namespace = step.identifier.namespace;\n if (!acc[namespace]) {\n acc[namespace] = [];\n }\n acc[namespace].push(step);\n return acc;\n },\n {} as Record<string, MigrationTx[]>,\n );\n\n const collapsed: SuperMigrationTx[] = Object.values(groupedAddOrDel).flatMap(\n (namedGroup) => {\n const isWholeEntityBeingDeleted = namedGroup.some((step) => {\n if (step.type === 'delete-attr' && step.identifier.attrName === 'id') {\n return true;\n }\n });\n\n if (isWholeEntityBeingDeleted) {\n return [\n {\n type: 'delete-namespace',\n namespace: namedGroup[0].identifier.namespace,\n innerSteps: namedGroup,\n } satisfies SuperMigrationTx as SuperMigrationTx,\n ];\n }\n\n const isWholeEntityBeingCreated = namedGroup.some((step) => {\n if (step.type === 'add-attr' && step.identifier.attrName === 'id') {\n return true;\n }\n });\n\n if (isWholeEntityBeingCreated) {\n return [\n {\n type: 'create-namespace',\n namespace: namedGroup[0].identifier.namespace,\n innerSteps: namedGroup,\n } satisfies SuperMigrationTx as SuperMigrationTx,\n ];\n }\n\n return namedGroup;\n },\n );\n\n return [...collapsed, ...otherSteps];\n};\n\nexport const confirmImportantSteps = async (planSteps: SuperMigrationTx[]) => {\n for (const step of planSteps) {\n if (step.type === 'delete-namespace') {\n const ok = await promptOk({\n promptText: `Are you sure you want to delete namespace ${step.namespace}?`,\n });\n if (!ok) {\n throw new CancelSchemaError(`Deletion of namespace ${step.namespace}`);\n }\n }\n }\n};\n\nconst createDotName = (step: MigrationTx) => {\n return `${step.identifier.namespace}.${step.identifier.attrName}`;\n};\n\nconst isRename = (step: MigrationTxSpecific<'update-attr'>) => {\n return (\n step.partialAttr['forward-identity']?.attrName &&\n step.partialAttr['forward-identity']?.attrName !== step.identifier.attrName\n );\n};\n\nexport const renderSchemaPlan = (\n planSteps: SuperMigrationTx[],\n prevAttrs?: InstantDBAttr[],\n): string[] => {\n const result: string[] = [];\n\n const addLine = (line: string) => {\n result.push(line);\n };\n\n const addSecondaryLine = (line: string) => {\n addLine(` ${chalk.italic(chalk.gray(stripAnsi(line)))}`);\n };\n\n for (const step of planSteps) {\n switch (step.type) {\n case 'create-namespace':\n addLine(\n `${chalk.bgGreen.black(' + CREATE NAMESPACE ')} ${step.namespace}`,\n );\n renderSchemaPlan(step.innerSteps, prevAttrs).forEach((outputLine) =>\n addSecondaryLine(outputLine),\n );\n break;\n case 'delete-namespace':\n addLine(`${chalk.bgRed(' - DELETE NAMESPACE ')} ${step.namespace}`);\n break;\n case 'add-attr':\n if (step['value-type'] === 'ref' && step['reverse-identity']) {\n addLine(\n `${chalk.bgGreen.black(' + CREATE LINK ')} ${createDotName(step)} <-> ${step['reverse-identity'].namespace}.${step['reverse-identity'].attrName}`,\n );\n addSecondaryLine(\n ' ' +\n getRelationship(step.cardinality, step['unique?'])\n .join(' <-> ')\n .toUpperCase(),\n );\n } else {\n addLine(\n `${chalk.bgGreen.black(' + CREATE ATTR ')} ${createDotName(step)}`,\n );\n if (step['checked-data-type']) {\n addSecondaryLine(' DATA TYPE: ' + step['checked-data-type']);\n }\n if (step['unique?'] && step.identifier.attrName !== 'id') {\n addSecondaryLine(' UNIQUE');\n }\n if (!step['required?']) {\n addSecondaryLine(' OPTIONAL');\n }\n if (step['index?']) {\n addSecondaryLine(' INDEXED');\n }\n }\n break;\n case 'delete-attr':\n const oldAttr = prevAttrs\n ? prevAttrs.find((attr) => {\n return (\n attr['forward-identity'][1] === step.identifier.namespace &&\n attr['forward-identity'][2] === step.identifier.attrName\n );\n }) || null\n : null;\n\n if (oldAttr?.['value-type'] === 'ref') {\n addLine(\n `${chalk.bgRed(' - DELETE LINK ')} ${step.identifier.namespace}.${step.identifier.attrName}`,\n );\n break;\n }\n\n addLine(`${chalk.bgRed(' - DELETE ATTR ')} ${createDotName(step)}`);\n break;\n case 'update-attr':\n if (step.partialAttr['value-type'] === 'ref') {\n addLine(renderLinkUpdate(step, prevAttrs));\n } else {\n if (isRename(step)) {\n addLine(\n `${chalk.bgYellow.black(' * RENAME ATTR ')} ${createDotName(step)} -> ${step.partialAttr['forward-identity']?.['namespace']}.${step.partialAttr['forward-identity']?.['attrName']}`,\n );\n } else {\n addLine(\n `${chalk.bgYellow.black(' * UPDATE ATTR ')} ${createDotName(step)}`,\n );\n }\n }\n break;\n case 'index':\n addLine(\n `${chalk.bgBlue.black(' + CREATE INDEX ')} ${createDotName(step)}`,\n );\n break;\n case 'remove-index':\n addLine(\n `${chalk.bgBlue.black(' - DELETE INDEX ')} ${createDotName(step)}`,\n );\n break;\n case 'required':\n addLine(\n `${chalk.bgBlue.black(' + MAKE REQUIRED ')} ${createDotName(step)}`,\n );\n break;\n case 'unique':\n addLine(\n `${chalk.bgBlue.black(' * MAKE UNIQUE ')} ${createDotName(step)}`,\n );\n break;\n case 'remove-required':\n addLine(\n `${chalk.bgBlue.black(' - MAKE OPTIONAL ')} ${createDotName(step)}`,\n );\n break;\n case 'remove-unique':\n addLine(\n `${chalk.bgBlue.black(' - REMOVE UNIQUE CONSTRAINT')} ${createDotName(step)}`,\n );\n break;\n case 'check-data-type':\n addLine(\n `${chalk.bgBlue.black(' + SET DATA TYPE ')} ${createDotName(step)} ${chalk.dim(step['checked-data-type'])}`,\n );\n break;\n case 'remove-data-type':\n addLine(\n `${chalk.bgBlue.black(' - REMOVE DATA TYPE CONSTRAINT ')} ${createDotName(step)}`,\n );\n break;\n\n default:\n const unknownStep: never = step;\n }\n }\n\n return result;\n};\n"]}
|