instant-cli 0.22.96-experimental.drewh-ts-target.20761590091.1 → 0.22.96-experimental.surgical.20765817844.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/.turbo/turbo-build.log +1 -1
- package/__tests__/__snapshots__/updateSchemaFile.test.ts.snap +248 -0
- package/__tests__/updateSchemaFile.test.ts +557 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1152 -1044
- package/dist/index.js.map +1 -1
- package/dist/rename.js +69 -58
- package/dist/rename.js.map +1 -1
- package/dist/renderSchemaPlan.js +22 -10
- package/dist/renderSchemaPlan.js.map +1 -1
- package/dist/ui/index.js +102 -115
- package/dist/ui/index.js.map +1 -1
- package/dist/ui/lib.js +30 -29
- package/dist/ui/lib.js.map +1 -1
- package/dist/util/fs.js +30 -17
- 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 +37 -26
- package/dist/util/packageManager.js.map +1 -1
- package/dist/util/projectDir.js +27 -16
- package/dist/util/projectDir.js.map +1 -1
- package/dist/util/promptOk.js +21 -14
- package/dist/util/promptOk.js.map +1 -1
- package/dist/util/renamePrompt.js +2 -4
- package/dist/util/renamePrompt.js.map +1 -1
- package/dist/util/updateSchemaFile.d.ts +3 -0
- package/dist/util/updateSchemaFile.d.ts.map +1 -0
- package/dist/util/updateSchemaFile.js +610 -0
- package/dist/util/updateSchemaFile.js.map +1 -0
- package/package.json +4 -4
- package/src/index.js +19 -10
- package/src/util/updateSchemaFile.ts +760 -0
- package/__tests__/mergeSchema.test.ts +0 -197
- package/dist/util/mergeSchema.d.ts +0 -2
- package/dist/util/mergeSchema.d.ts.map +0 -1
- package/dist/util/mergeSchema.js +0 -334
- package/dist/util/mergeSchema.js.map +0 -1
- package/src/util/mergeSchema.js +0 -364
package/dist/rename.js
CHANGED
|
@@ -1,3 +1,12 @@
|
|
|
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
|
+
};
|
|
1
10
|
/**
|
|
2
11
|
* Build a function to resolve renames from cli rename flags
|
|
3
12
|
* The diffSchemas function takes a fixed amount of arguments so we
|
|
@@ -7,73 +16,75 @@
|
|
|
7
16
|
* @returns
|
|
8
17
|
*/
|
|
9
18
|
export function buildAutoRenameSelector(opts) {
|
|
10
|
-
return
|
|
11
|
-
|
|
12
|
-
|
|
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());
|
|
19
|
+
return function (created, promptData, extraInfo) {
|
|
20
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
21
|
+
if (!opts.rename || !Array.isArray(opts.rename)) {
|
|
22
|
+
return created;
|
|
22
23
|
}
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
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;
|
|
24
|
+
// Parse rename options: format is "from:to"
|
|
25
|
+
// note that it saves backwards since we will be testing against the base
|
|
26
|
+
// case of a created attr
|
|
27
|
+
const renameMap = new Map();
|
|
28
|
+
for (const renameStr of opts.rename) {
|
|
29
|
+
const [from, to] = renameStr.split(':');
|
|
30
|
+
if (from && to) {
|
|
31
|
+
renameMap.set(to.trim(), from.trim());
|
|
32
|
+
}
|
|
42
33
|
}
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
34
|
+
let lookupNames = [];
|
|
35
|
+
if ((extraInfo === null || extraInfo === void 0 ? void 0 : extraInfo.type) === 'attribute' && (extraInfo === null || extraInfo === void 0 ? void 0 : extraInfo.entityName)) {
|
|
36
|
+
lookupNames = [`${extraInfo.entityName}.${created}`];
|
|
37
|
+
}
|
|
38
|
+
else if ((extraInfo === null || extraInfo === void 0 ? void 0 : extraInfo.type) === 'link') {
|
|
39
|
+
// Extract both forward and reverse parts
|
|
40
|
+
const parts = created.split('<->');
|
|
41
|
+
lookupNames = [parts[0], parts[1]];
|
|
48
42
|
}
|
|
49
43
|
else {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
if (
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
}
|
|
59
|
-
else {
|
|
60
|
-
return created;
|
|
44
|
+
return created;
|
|
45
|
+
}
|
|
46
|
+
// Try to find a match in the rename map using the lookup names
|
|
47
|
+
let fromAttr = null;
|
|
48
|
+
for (const lookupName of lookupNames) {
|
|
49
|
+
if (renameMap.has(lookupName)) {
|
|
50
|
+
fromAttr = renameMap.get(lookupName);
|
|
51
|
+
break;
|
|
61
52
|
}
|
|
62
53
|
}
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
54
|
+
if (fromAttr) {
|
|
55
|
+
let fromValue;
|
|
56
|
+
if ((extraInfo === null || extraInfo === void 0 ? void 0 : extraInfo.type) === 'attribute') {
|
|
57
|
+
fromValue = fromAttr.split('.').pop();
|
|
58
|
+
}
|
|
59
|
+
else {
|
|
60
|
+
const matchingItem = promptData.find((item) => {
|
|
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
|
+
}
|
|
66
72
|
}
|
|
67
|
-
|
|
68
|
-
|
|
73
|
+
const hasMatch = promptData.some((item) => {
|
|
74
|
+
if (typeof item === 'string') {
|
|
75
|
+
return item === fromValue;
|
|
76
|
+
}
|
|
77
|
+
else if (item.from) {
|
|
78
|
+
return item.from === fromValue;
|
|
79
|
+
}
|
|
80
|
+
return false;
|
|
81
|
+
});
|
|
82
|
+
if (hasMatch) {
|
|
83
|
+
return { from: fromValue, to: created };
|
|
69
84
|
}
|
|
70
|
-
return false;
|
|
71
|
-
});
|
|
72
|
-
if (hasMatch) {
|
|
73
|
-
return { from: fromValue, to: created };
|
|
74
85
|
}
|
|
75
|
-
|
|
76
|
-
|
|
86
|
+
return created;
|
|
87
|
+
});
|
|
77
88
|
};
|
|
78
89
|
}
|
|
79
90
|
//# 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":"AAAA;;;;;;;GAOG;AACH,MAAM,UAAU,uBAAuB,CAAC,IAAI;IAC1C,OAAO,
|
|
1
|
+
{"version":3,"file":"rename.js","sourceRoot":"","sources":["../src/rename.ts"],"names":[],"mappings":"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","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,7 +1,17 @@
|
|
|
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
|
+
};
|
|
1
10
|
import chalk from 'chalk';
|
|
2
11
|
import stripAnsi from 'strip-ansi';
|
|
3
12
|
import { promptOk } from './util/promptOk.js';
|
|
4
13
|
const renderLinkUpdate = (tx, possiblePrevAttrs) => {
|
|
14
|
+
var _a, _b, _c;
|
|
5
15
|
if (tx.partialAttr['value-type'] !== 'ref') {
|
|
6
16
|
throw new Error('Invalid value type for link update');
|
|
7
17
|
}
|
|
@@ -12,7 +22,7 @@ const renderLinkUpdate = (tx, possiblePrevAttrs) => {
|
|
|
12
22
|
}) || null
|
|
13
23
|
: null;
|
|
14
24
|
let changeType = 'UPDATE';
|
|
15
|
-
if (tx.partialAttr['forward-identity']
|
|
25
|
+
if (((_a = tx.partialAttr['forward-identity']) === null || _a === void 0 ? void 0 : _a.attrName) &&
|
|
16
26
|
tx.identifier.attrName !== tx.partialAttr['forward-identity'].attrName) {
|
|
17
27
|
changeType = 'RENAME';
|
|
18
28
|
}
|
|
@@ -20,8 +30,8 @@ const renderLinkUpdate = (tx, possiblePrevAttrs) => {
|
|
|
20
30
|
let reverseLabel = '';
|
|
21
31
|
if (oldAttr) {
|
|
22
32
|
// Check for reverse rename
|
|
23
|
-
if (tx.partialAttr['reverse-identity']
|
|
24
|
-
oldAttr['reverse-identity']
|
|
33
|
+
if (((_b = tx.partialAttr['reverse-identity']) === null || _b === void 0 ? void 0 : _b.attrName) &&
|
|
34
|
+
((_c = oldAttr['reverse-identity']) === null || _c === void 0 ? void 0 : _c[2]) !==
|
|
25
35
|
tx.partialAttr['reverse-identity'].attrName) {
|
|
26
36
|
changeType = 'RENAME REVERSE';
|
|
27
37
|
}
|
|
@@ -110,10 +120,10 @@ export const groupSteps = (steps) => {
|
|
|
110
120
|
});
|
|
111
121
|
return [...collapsed, ...otherSteps];
|
|
112
122
|
};
|
|
113
|
-
export const confirmImportantSteps =
|
|
123
|
+
export const confirmImportantSteps = (planSteps) => __awaiter(void 0, void 0, void 0, function* () {
|
|
114
124
|
for (const step of planSteps) {
|
|
115
125
|
if (step.type === 'delete-namespace') {
|
|
116
|
-
const ok =
|
|
126
|
+
const ok = yield promptOk({
|
|
117
127
|
promptText: `Are you sure you want to delete namespace ${step.namespace}?`,
|
|
118
128
|
});
|
|
119
129
|
if (!ok) {
|
|
@@ -121,15 +131,17 @@ export const confirmImportantSteps = async (planSteps) => {
|
|
|
121
131
|
}
|
|
122
132
|
}
|
|
123
133
|
}
|
|
124
|
-
};
|
|
134
|
+
});
|
|
125
135
|
const createDotName = (step) => {
|
|
126
136
|
return `${step.identifier.namespace}.${step.identifier.attrName}`;
|
|
127
137
|
};
|
|
128
138
|
const isRename = (step) => {
|
|
129
|
-
|
|
130
|
-
|
|
139
|
+
var _a, _b;
|
|
140
|
+
return (((_a = step.partialAttr['forward-identity']) === null || _a === void 0 ? void 0 : _a.attrName) &&
|
|
141
|
+
((_b = step.partialAttr['forward-identity']) === null || _b === void 0 ? void 0 : _b.attrName) !== step.identifier.attrName);
|
|
131
142
|
};
|
|
132
143
|
export const renderSchemaPlan = (planSteps, prevAttrs) => {
|
|
144
|
+
var _a, _b;
|
|
133
145
|
const result = [];
|
|
134
146
|
const addLine = (line) => {
|
|
135
147
|
result.push(line);
|
|
@@ -177,7 +189,7 @@ export const renderSchemaPlan = (planSteps, prevAttrs) => {
|
|
|
177
189
|
attr['forward-identity'][2] === step.identifier.attrName);
|
|
178
190
|
}) || null
|
|
179
191
|
: null;
|
|
180
|
-
if (oldAttr
|
|
192
|
+
if ((oldAttr === null || oldAttr === void 0 ? void 0 : oldAttr['value-type']) === 'ref') {
|
|
181
193
|
addLine(`${chalk.bgRed(' - DELETE LINK ')} ${step.identifier.namespace}.${step.identifier.attrName}`);
|
|
182
194
|
break;
|
|
183
195
|
}
|
|
@@ -189,7 +201,7 @@ export const renderSchemaPlan = (planSteps, prevAttrs) => {
|
|
|
189
201
|
}
|
|
190
202
|
else {
|
|
191
203
|
if (isRename(step)) {
|
|
192
|
-
addLine(`${chalk.bgYellow.black(' * RENAME ATTR ')} ${createDotName(step)} -> ${step.partialAttr['forward-identity']
|
|
204
|
+
addLine(`${chalk.bgYellow.black(' * RENAME ATTR ')} ${createDotName(step)} -> ${(_a = step.partialAttr['forward-identity']) === null || _a === void 0 ? void 0 : _a['namespace']}.${(_b = step.partialAttr['forward-identity']) === null || _b === void 0 ? void 0 : _b['attrName']}`);
|
|
193
205
|
}
|
|
194
206
|
else {
|
|
195
207
|
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"]}
|