instant-cli 0.22.95-experimental.surgical.20386874544.1 → 0.22.95-experimental.surgical.20386947966.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
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
|
|
2
|
-
> instant-cli@0.22.95-experimental.surgical.
|
|
2
|
+
> instant-cli@0.22.95-experimental.surgical.20386947966.1 build /home/runner/work/instant/instant/client/packages/cli
|
|
3
3
|
> rm -rf dist; tsc -p tsconfig.json
|
|
4
4
|
|
|
@@ -62,18 +62,28 @@ export default _schema;
|
|
|
62
62
|
});
|
|
63
63
|
|
|
64
64
|
test('preserves type params across chained calls', async () => {
|
|
65
|
-
const oldFile =
|
|
66
|
-
|
|
65
|
+
const oldFile = `
|
|
66
|
+
import { i } from '@instantdb/core';
|
|
67
|
+
import { Label } from './types';
|
|
68
|
+
|
|
69
|
+
const _schema = i.schema({
|
|
70
|
+
entities: {
|
|
71
|
+
todos: i.entity({
|
|
67
72
|
title: i.string(),
|
|
68
73
|
status: i.string<'todo' | 'done'>().optional().indexed(),
|
|
69
74
|
labels: i.json<Label[]>(),
|
|
70
75
|
}),
|
|
71
76
|
users: i.entity({
|
|
72
77
|
email: i.string(),
|
|
73
|
-
})
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
78
|
+
}),
|
|
79
|
+
},
|
|
80
|
+
links: {
|
|
81
|
+
},
|
|
82
|
+
rooms: {},
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
export default _schema;
|
|
86
|
+
`;
|
|
77
87
|
const serverSchema = i.schema({
|
|
78
88
|
entities: {
|
|
79
89
|
todos: i.entity({
|
|
@@ -95,13 +105,23 @@ test('preserves type params across chained calls', async () => {
|
|
|
95
105
|
});
|
|
96
106
|
|
|
97
107
|
test('drops constraints removed by server', async () => {
|
|
98
|
-
const oldFile =
|
|
99
|
-
|
|
108
|
+
const oldFile = `
|
|
109
|
+
import { i } from '@instantdb/core';
|
|
110
|
+
|
|
111
|
+
const _schema = i.schema({
|
|
112
|
+
entities: {
|
|
113
|
+
todos: i.entity({
|
|
100
114
|
title: i.string().unique().indexed().optional(),
|
|
101
115
|
done: i.boolean().optional(),
|
|
102
|
-
})
|
|
103
|
-
|
|
104
|
-
|
|
116
|
+
}),
|
|
117
|
+
},
|
|
118
|
+
links: {
|
|
119
|
+
},
|
|
120
|
+
rooms: {},
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
export default _schema;
|
|
124
|
+
`;
|
|
105
125
|
const serverSchema = i.schema({
|
|
106
126
|
entities: {
|
|
107
127
|
todos: i.entity({
|
|
@@ -118,18 +138,29 @@ test('drops constraints removed by server', async () => {
|
|
|
118
138
|
});
|
|
119
139
|
|
|
120
140
|
test('updates link details', async () => {
|
|
121
|
-
const oldFile =
|
|
122
|
-
|
|
141
|
+
const oldFile = `
|
|
142
|
+
import { i } from '@instantdb/core';
|
|
143
|
+
|
|
144
|
+
const _schema = i.schema({
|
|
145
|
+
entities: {
|
|
146
|
+
todos: i.entity({
|
|
123
147
|
title: i.string(),
|
|
124
148
|
}),
|
|
125
149
|
users: i.entity({
|
|
126
150
|
email: i.string(),
|
|
127
|
-
})
|
|
128
|
-
|
|
151
|
+
}),
|
|
152
|
+
},
|
|
153
|
+
links: {
|
|
154
|
+
todoOwner: {
|
|
129
155
|
forward: { on: 'todos', has: 'one', label: 'owner' },
|
|
130
156
|
reverse: { on: 'users', has: 'many', label: 'todos' },
|
|
131
|
-
}
|
|
132
|
-
|
|
157
|
+
},
|
|
158
|
+
},
|
|
159
|
+
rooms: {},
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
export default _schema;
|
|
163
|
+
`;
|
|
133
164
|
const serverSchema = i.schema({
|
|
134
165
|
entities: {
|
|
135
166
|
todos: i.entity({ title: i.string() }),
|
|
@@ -160,8 +191,12 @@ test('updates link details', async () => {
|
|
|
160
191
|
});
|
|
161
192
|
|
|
162
193
|
test('removes a link with surrounding comments and commas', async () => {
|
|
163
|
-
const oldFile =
|
|
164
|
-
|
|
194
|
+
const oldFile = `
|
|
195
|
+
import { i } from '@instantdb/core';
|
|
196
|
+
|
|
197
|
+
const _schema = i.schema({
|
|
198
|
+
entities: {
|
|
199
|
+
todos: i.entity({
|
|
165
200
|
title: i.string(),
|
|
166
201
|
}),
|
|
167
202
|
users: i.entity({
|
|
@@ -169,8 +204,10 @@ test('removes a link with surrounding comments and commas', async () => {
|
|
|
169
204
|
}),
|
|
170
205
|
projects: i.entity({
|
|
171
206
|
name: i.string(),
|
|
172
|
-
})
|
|
173
|
-
|
|
207
|
+
}),
|
|
208
|
+
},
|
|
209
|
+
links: {
|
|
210
|
+
// owner link
|
|
174
211
|
todoOwner: {
|
|
175
212
|
forward: { on: 'todos', has: 'one', label: 'owner' },
|
|
176
213
|
reverse: { on: 'users', has: 'many', label: 'todos' },
|
|
@@ -179,8 +216,13 @@ test('removes a link with surrounding comments and commas', async () => {
|
|
|
179
216
|
projectTodos: {
|
|
180
217
|
forward: { on: 'projects', has: 'many', label: 'todos' },
|
|
181
218
|
reverse: { on: 'todos', has: 'one', label: 'project' },
|
|
182
|
-
}
|
|
183
|
-
|
|
219
|
+
},
|
|
220
|
+
},
|
|
221
|
+
rooms: {},
|
|
222
|
+
});
|
|
223
|
+
|
|
224
|
+
export default _schema;
|
|
225
|
+
`;
|
|
184
226
|
const serverSchema = i.schema({
|
|
185
227
|
entities: {
|
|
186
228
|
todos: i.entity({ title: i.string() }),
|
|
@@ -201,13 +243,23 @@ test('removes a link with surrounding comments and commas', async () => {
|
|
|
201
243
|
});
|
|
202
244
|
|
|
203
245
|
test('updates single-line entity in place', async () => {
|
|
204
|
-
const oldFile =
|
|
205
|
-
|
|
246
|
+
const oldFile = `
|
|
247
|
+
import { i } from '@instantdb/core';
|
|
248
|
+
|
|
249
|
+
const _schema = i.schema({
|
|
250
|
+
entities: {
|
|
251
|
+
projects: i.entity({ name: i.string() }),
|
|
206
252
|
todos: i.entity({
|
|
207
253
|
title: i.string(),
|
|
208
|
-
})
|
|
209
|
-
|
|
210
|
-
|
|
254
|
+
}),
|
|
255
|
+
},
|
|
256
|
+
links: {
|
|
257
|
+
},
|
|
258
|
+
rooms: {},
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
export default _schema;
|
|
262
|
+
`;
|
|
211
263
|
const serverSchema = i.schema({
|
|
212
264
|
entities: {
|
|
213
265
|
projects: i.entity({
|
|
@@ -227,13 +279,23 @@ test('updates single-line entity in place', async () => {
|
|
|
227
279
|
});
|
|
228
280
|
|
|
229
281
|
test('inserts attrs into multi-line entities with indentation', async () => {
|
|
230
|
-
const oldFile =
|
|
231
|
-
|
|
282
|
+
const oldFile = `
|
|
283
|
+
import { i } from '@instantdb/core';
|
|
284
|
+
|
|
285
|
+
const _schema = i.schema({
|
|
286
|
+
entities: {
|
|
287
|
+
todos: i.entity({
|
|
232
288
|
title: i.string(),
|
|
233
289
|
done: i.boolean().optional(),
|
|
234
|
-
})
|
|
235
|
-
|
|
236
|
-
|
|
290
|
+
}),
|
|
291
|
+
},
|
|
292
|
+
links: {
|
|
293
|
+
},
|
|
294
|
+
rooms: {},
|
|
295
|
+
});
|
|
296
|
+
|
|
297
|
+
export default _schema;
|
|
298
|
+
`;
|
|
237
299
|
const serverSchema = i.schema({
|
|
238
300
|
entities: {
|
|
239
301
|
todos: i.entity({
|
|
@@ -251,8 +313,12 @@ test('inserts attrs into multi-line entities with indentation', async () => {
|
|
|
251
313
|
});
|
|
252
314
|
|
|
253
315
|
test('handles quoted keys for entities, attrs, and links', async () => {
|
|
254
|
-
const oldFile =
|
|
255
|
-
|
|
316
|
+
const oldFile = `
|
|
317
|
+
import { i } from '@instantdb/core';
|
|
318
|
+
|
|
319
|
+
const _schema = i.schema({
|
|
320
|
+
entities: {
|
|
321
|
+
todos: i.entity({
|
|
256
322
|
title: i.string(),
|
|
257
323
|
}),
|
|
258
324
|
users: i.entity({
|
|
@@ -260,9 +326,15 @@ test('handles quoted keys for entities, attrs, and links', async () => {
|
|
|
260
326
|
}),
|
|
261
327
|
'user-profiles': i.entity({
|
|
262
328
|
'display-name': i.string(),
|
|
263
|
-
})
|
|
264
|
-
|
|
265
|
-
|
|
329
|
+
}),
|
|
330
|
+
},
|
|
331
|
+
links: {
|
|
332
|
+
},
|
|
333
|
+
rooms: {},
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
export default _schema;
|
|
337
|
+
`;
|
|
266
338
|
const serverSchema = i.schema({
|
|
267
339
|
entities: {
|
|
268
340
|
todos: i.entity({ title: i.string() }),
|
|
@@ -286,15 +358,25 @@ test('handles quoted keys for entities, attrs, and links', async () => {
|
|
|
286
358
|
});
|
|
287
359
|
|
|
288
360
|
test('adds a link when links object is empty', async () => {
|
|
289
|
-
const oldFile =
|
|
290
|
-
|
|
361
|
+
const oldFile = `
|
|
362
|
+
import { i } from '@instantdb/core';
|
|
363
|
+
|
|
364
|
+
const _schema = i.schema({
|
|
365
|
+
entities: {
|
|
366
|
+
todos: i.entity({
|
|
291
367
|
title: i.string(),
|
|
292
368
|
}),
|
|
293
369
|
users: i.entity({
|
|
294
370
|
email: i.string(),
|
|
295
|
-
})
|
|
296
|
-
|
|
297
|
-
|
|
371
|
+
}),
|
|
372
|
+
},
|
|
373
|
+
links: {
|
|
374
|
+
},
|
|
375
|
+
rooms: {},
|
|
376
|
+
});
|
|
377
|
+
|
|
378
|
+
export default _schema;
|
|
379
|
+
`;
|
|
298
380
|
const serverSchema = i.schema({
|
|
299
381
|
entities: {
|
|
300
382
|
todos: i.entity({ title: i.string() }),
|
|
@@ -314,18 +396,29 @@ test('adds a link when links object is empty', async () => {
|
|
|
314
396
|
});
|
|
315
397
|
|
|
316
398
|
test('removes the last link cleanly', async () => {
|
|
317
|
-
const oldFile =
|
|
318
|
-
|
|
399
|
+
const oldFile = `
|
|
400
|
+
import { i } from '@instantdb/core';
|
|
401
|
+
|
|
402
|
+
const _schema = i.schema({
|
|
403
|
+
entities: {
|
|
404
|
+
todos: i.entity({
|
|
319
405
|
title: i.string(),
|
|
320
406
|
}),
|
|
321
407
|
users: i.entity({
|
|
322
408
|
email: i.string(),
|
|
323
|
-
})
|
|
324
|
-
|
|
409
|
+
}),
|
|
410
|
+
},
|
|
411
|
+
links: {
|
|
412
|
+
todoOwner: {
|
|
325
413
|
forward: { on: 'todos', has: 'one', label: 'owner' },
|
|
326
414
|
reverse: { on: 'users', has: 'many', label: 'todos' },
|
|
327
|
-
}
|
|
328
|
-
|
|
415
|
+
},
|
|
416
|
+
},
|
|
417
|
+
rooms: {},
|
|
418
|
+
});
|
|
419
|
+
|
|
420
|
+
export default _schema;
|
|
421
|
+
`;
|
|
329
422
|
const serverSchema = i.schema({
|
|
330
423
|
entities: {
|
|
331
424
|
todos: i.entity({ title: i.string() }),
|
|
@@ -339,28 +432,6 @@ test('removes the last link cleanly', async () => {
|
|
|
339
432
|
expect(result).toMatchSnapshot();
|
|
340
433
|
});
|
|
341
434
|
|
|
342
|
-
function schemaStr(
|
|
343
|
-
entitiesBlock: string,
|
|
344
|
-
linksBlock: string,
|
|
345
|
-
extraImports = '',
|
|
346
|
-
) {
|
|
347
|
-
const linksSection = linksBlock ? `${linksBlock}\n` : '';
|
|
348
|
-
return `
|
|
349
|
-
import { i } from '@instantdb/core';
|
|
350
|
-
${extraImports ? `${extraImports}\n` : ''}
|
|
351
|
-
const _schema = i.schema({
|
|
352
|
-
entities: {
|
|
353
|
-
${entitiesBlock}
|
|
354
|
-
},
|
|
355
|
-
links: {
|
|
356
|
-
${linksSection} },
|
|
357
|
-
rooms: {},
|
|
358
|
-
});
|
|
359
|
-
|
|
360
|
-
export default _schema;
|
|
361
|
-
`;
|
|
362
|
-
}
|
|
363
|
-
|
|
364
435
|
async function update(oldFile: string, serverSchema: any) {
|
|
365
436
|
const localSchema = schemaTypescriptFileToInstantSchema(oldFile);
|
|
366
437
|
return updateSchemaFile(oldFile, localSchema, serverSchema);
|
|
@@ -127,9 +127,7 @@ function collectEntityEdits(content, entitiesObj, entitiesByName, changeBuckets,
|
|
|
127
127
|
if (!attrDef)
|
|
128
128
|
continue;
|
|
129
129
|
const propText = renderAttrProperty(attrName, attrDef);
|
|
130
|
-
edits.push(
|
|
131
|
-
preferMultiline: true,
|
|
132
|
-
}));
|
|
130
|
+
edits.push(insertPropertyExpandingSingleLine(content, entity.attrsObj, propText, indent));
|
|
133
131
|
}
|
|
134
132
|
}
|
|
135
133
|
for (const [entityName, attrs] of changeBuckets.updateAttrs) {
|
|
@@ -430,12 +428,11 @@ function getLineIndent(source, pos) {
|
|
|
430
428
|
const match = source.slice(lineStart, pos).match(/^[\t ]*/);
|
|
431
429
|
return match ? match[0] : '';
|
|
432
430
|
}
|
|
433
|
-
function insertProperty(source, obj, propText, indent
|
|
431
|
+
function insertProperty(source, obj, propText, indent) {
|
|
434
432
|
const props = obj.properties.filter(isProperty);
|
|
435
433
|
const closingBrace = obj.end - 1;
|
|
436
434
|
const propTextWithIndent = indentLines(propText, indent);
|
|
437
435
|
const propTextSingleLine = propText.trim();
|
|
438
|
-
const objSource = source.slice(obj.start, obj.end);
|
|
439
436
|
const innerStart = obj.start + 1;
|
|
440
437
|
const innerEnd = closingBrace;
|
|
441
438
|
const innerContent = source.slice(innerStart, innerEnd);
|
|
@@ -464,14 +461,6 @@ function insertProperty(source, obj, propText, indent, options = {}) {
|
|
|
464
461
|
text: `\n${propTextWithIndent},\n${closingIndent}`,
|
|
465
462
|
};
|
|
466
463
|
}
|
|
467
|
-
if (options.preferMultiline && !objSource.includes('\n')) {
|
|
468
|
-
const closingIndent = getLineIndent(source, closingBrace);
|
|
469
|
-
const innerIndent = closingIndent + DEFAULT_INDENT;
|
|
470
|
-
const propTexts = props.map((prop) => source.slice(prop.start, prop.end).trim());
|
|
471
|
-
const lines = [...propTexts, propTextSingleLine].map((prop) => `${innerIndent}${prop},`);
|
|
472
|
-
const nextObject = `{\n${lines.join('\n')}\n${closingIndent}}`;
|
|
473
|
-
return { start: obj.start, end: obj.end, text: nextObject };
|
|
474
|
-
}
|
|
475
464
|
const lastProp = props[props.length - 1];
|
|
476
465
|
const multiline = source.slice(lastProp.end, closingBrace).includes('\n') ||
|
|
477
466
|
propText.includes('\n');
|
|
@@ -530,6 +519,23 @@ function indentValueAfterFirstLine(value, indent) {
|
|
|
530
519
|
...lines.slice(1).map((line) => (line ? indent + line : line)),
|
|
531
520
|
].join('\n');
|
|
532
521
|
}
|
|
522
|
+
function insertPropertyExpandingSingleLine(source, obj, propText, indent) {
|
|
523
|
+
const props = obj.properties.filter(isProperty);
|
|
524
|
+
if (!props.length) {
|
|
525
|
+
return insertProperty(source, obj, propText, indent);
|
|
526
|
+
}
|
|
527
|
+
const objSource = source.slice(obj.start, obj.end);
|
|
528
|
+
if (objSource.includes('\n') || propText.includes('\n')) {
|
|
529
|
+
return insertProperty(source, obj, propText, indent);
|
|
530
|
+
}
|
|
531
|
+
const closingBrace = obj.end - 1;
|
|
532
|
+
const closingIndent = getLineIndent(source, closingBrace);
|
|
533
|
+
const innerIndent = closingIndent + DEFAULT_INDENT;
|
|
534
|
+
const propTexts = props.map((prop) => source.slice(prop.start, prop.end).trim());
|
|
535
|
+
const lines = [...propTexts, propText.trim()].map((prop) => `${innerIndent}${prop},`);
|
|
536
|
+
const nextObject = `{\n${lines.join('\n')}\n${closingIndent}}`;
|
|
537
|
+
return { start: obj.start, end: obj.end, text: nextObject };
|
|
538
|
+
}
|
|
533
539
|
function normalizeEmptyLinksObject(content) {
|
|
534
540
|
let ast;
|
|
535
541
|
try {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"updateSchemaFile.js","sourceRoot":"","sources":["../../src/util/updateSchemaFile.ts"],"names":[],"mappings":"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","sourcesContent":["import * as acorn from 'acorn';\nimport { tsPlugin } from 'acorn-typescript';\nimport {\n diffSchemas,\n renderAttrCall,\n renderAttrProperty,\n renderEntityProperty,\n renderLinkProperty,\n renderLinkValue,\n type MigrationTx,\n} from '@instantdb/platform';\nimport type { DataAttrDef, InstantSchemaDef } from '@instantdb/core';\n\nconst parser = (acorn.Parser as any).extend(tsPlugin({ dts: false }) as any);\nconst DEFAULT_INDENT = ' ';\n\nexport async function updateSchemaFile(\n existingFileContent: string,\n localSchema: InstantSchemaDef<any, any, any>,\n serverSchema: InstantSchemaDef<any, any, any>,\n): Promise<string> {\n const ast = parseFile(existingFileContent);\n const schemaObj = findSchemaObject(ast);\n if (!schemaObj) {\n throw new Error('Could not find i.schema(...) in schema file.');\n }\n\n const { entitiesObj, linksObj } = getSchemaSections(schemaObj);\n const diff = await diffSchemas(\n localSchema,\n serverSchema,\n async (created) => created,\n {},\n );\n if (diff.length === 0) {\n return existingFileContent;\n }\n\n const { entitiesByName } = buildEntitiesIndex(entitiesObj);\n\n const { localLinksByForward, serverLinksByForward } = buildLinkMaps(\n localSchema.links || {},\n serverSchema.links || {},\n );\n const changeBuckets = collectChanges(\n diff,\n localLinksByForward,\n serverLinksByForward,\n );\n\n const edits: Edit[] = [];\n edits.push(\n ...collectEntityEdits(\n existingFileContent,\n entitiesObj,\n entitiesByName,\n changeBuckets,\n serverSchema,\n ),\n );\n edits.push(\n ...collectLinkEdits(\n existingFileContent,\n linksObj,\n changeBuckets,\n localLinksByForward,\n serverLinksByForward,\n ),\n );\n\n const updated = applyEdits(existingFileContent, edits);\n return normalizeEmptyLinksObject(updated);\n}\n\ntype ObjectExpression = {\n type: 'ObjectExpression';\n start: number;\n end: number;\n properties: any[];\n};\n\ntype PropertyNode = {\n type: 'Property';\n start: number;\n end: number;\n key: any;\n value: any;\n};\n\ntype EntityInfo = {\n prop: PropertyNode;\n attrsObj: ObjectExpression;\n attrsByName: Map<string, PropertyNode>;\n};\n\ntype Edit = { start: number; end: number; text: string };\n\ntype ChangeBuckets = {\n createEntities: Set<string>;\n deleteEntities: Set<string>;\n addAttrs: Map<string, Set<string>>;\n deleteAttrs: Map<string, Set<string>>;\n updateAttrs: Map<string, Set<string>>;\n addLinks: Set<string>;\n deleteLinks: Set<string>;\n updateLinks: Set<string>;\n};\n\ntype LinkMap = Map<string, { name: string; link: any }>;\n\nfunction parseFile(content: string) {\n return parser.parse(content, {\n sourceType: 'module',\n ecmaVersion: 'latest',\n });\n}\n\nfunction getSchemaSections(schemaObj: ObjectExpression) {\n const entitiesProp = findObjectProperty(schemaObj, 'entities');\n if (!entitiesProp || !isObjectExpression(entitiesProp.value)) {\n throw new Error('Could not find entities object in schema file.');\n }\n const linksProp = findObjectProperty(schemaObj, 'links');\n if (!linksProp || !isObjectExpression(linksProp.value)) {\n throw new Error('Could not find links object in schema file.');\n }\n\n return {\n entitiesObj: entitiesProp.value,\n linksObj: linksProp.value,\n };\n}\n\nfunction buildEntitiesIndex(entitiesObj: ObjectExpression) {\n const entitiesByName = new Map<string, EntityInfo>();\n\n for (const prop of entitiesObj.properties) {\n if (!isProperty(prop)) continue;\n const name = getPropName(prop);\n if (!name) continue;\n const attrsObj = getEntityAttrsObject(prop.value);\n if (!attrsObj) continue;\n\n const attrsByName = new Map<string, PropertyNode>();\n for (const attrProp of attrsObj.properties) {\n if (!isProperty(attrProp)) continue;\n const attrName = getPropName(attrProp);\n if (!attrName) continue;\n attrsByName.set(attrName, attrProp);\n }\n\n entitiesByName.set(name, { prop, attrsObj, attrsByName });\n }\n\n return { entitiesByName };\n}\n\nfunction buildLinkMaps(\n localLinks: Record<string, any>,\n serverLinks: Record<string, any>,\n) {\n return {\n localLinksByForward: buildLinkForwardMap(localLinks),\n serverLinksByForward: buildLinkForwardMap(serverLinks),\n };\n}\n\nfunction collectEntityEdits(\n content: string,\n entitiesObj: ObjectExpression,\n entitiesByName: Map<string, EntityInfo>,\n changeBuckets: ChangeBuckets,\n serverSchema: InstantSchemaDef<any, any, any>,\n): Edit[] {\n const edits: Edit[] = [];\n\n for (const entityName of changeBuckets.deleteEntities) {\n const entity = entitiesByName.get(entityName);\n if (!entity) continue;\n edits.push(removeProperty(content, entitiesObj, entity.prop));\n }\n\n for (const entityName of changeBuckets.createEntities) {\n if (entitiesByName.has(entityName)) continue;\n const entityDef = serverSchema.entities?.[entityName];\n if (!entityDef) continue;\n const propText = renderEntityProperty(entityName, entityDef.attrs);\n const indent = getObjectPropIndent(content, entitiesObj);\n edits.push(insertProperty(content, entitiesObj, propText, indent));\n }\n\n for (const [entityName, attrs] of changeBuckets.deleteAttrs) {\n const entity = entitiesByName.get(entityName);\n if (!entity) continue;\n for (const attrName of attrs) {\n const attrProp = entity.attrsByName.get(attrName);\n if (!attrProp) continue;\n edits.push(removeProperty(content, entity.attrsObj, attrProp));\n }\n }\n\n for (const [entityName, attrs] of changeBuckets.addAttrs) {\n const entity = entitiesByName.get(entityName);\n if (!entity) continue;\n const entityDef = serverSchema.entities?.[entityName];\n if (!entityDef) continue;\n const indent = getObjectPropIndent(content, entity.attrsObj);\n for (const attrName of attrs) {\n const attrDef = entityDef.attrs?.[attrName];\n if (!attrDef) continue;\n const propText = renderAttrProperty(attrName, attrDef);\n edits.push(\n insertProperty(content, entity.attrsObj, propText, indent, {\n preferMultiline: true,\n }),\n );\n }\n }\n\n for (const [entityName, attrs] of changeBuckets.updateAttrs) {\n const entity = entitiesByName.get(entityName);\n if (!entity) continue;\n const entityDef = serverSchema.entities?.[entityName];\n if (!entityDef) continue;\n for (const attrName of attrs) {\n const attrProp = entity.attrsByName.get(attrName);\n const attrDef = entityDef.attrs?.[attrName];\n if (!attrProp || !attrDef) continue;\n edits.push(updateAttrEdit(content, attrProp, attrDef));\n }\n }\n\n return edits;\n}\n\nfunction collectLinkEdits(\n content: string,\n linksObj: ObjectExpression,\n changeBuckets: ChangeBuckets,\n localLinksByForward: LinkMap,\n serverLinksByForward: LinkMap,\n): Edit[] {\n const edits: Edit[] = [];\n\n for (const forwardKey of changeBuckets.deleteLinks) {\n const localLink = localLinksByForward.get(forwardKey);\n if (!localLink) continue;\n const linkProp = findObjectProperty(linksObj, localLink.name);\n if (!linkProp) continue;\n edits.push(removeProperty(content, linksObj, linkProp));\n }\n\n for (const forwardKey of changeBuckets.addLinks) {\n const serverLink = serverLinksByForward.get(forwardKey);\n if (!serverLink) continue;\n const linkName = serverLink.name;\n if (findObjectProperty(linksObj, linkName)) continue;\n const propText = renderLinkProperty(linkName, serverLink.link);\n const indent = getObjectPropIndent(content, linksObj);\n edits.push(insertProperty(content, linksObj, propText, indent));\n }\n\n for (const forwardKey of changeBuckets.updateLinks) {\n const serverLink = serverLinksByForward.get(forwardKey);\n const localLink = localLinksByForward.get(forwardKey);\n if (!serverLink || !localLink) continue;\n const linkProp = findObjectProperty(linksObj, localLink.name);\n if (!linkProp) continue;\n const nextValue = renderLinkValue(serverLink.link);\n const propIndent = getLineIndent(content, linkProp.start);\n edits.push({\n start: linkProp.value.start,\n end: linkProp.value.end,\n text: indentValueAfterFirstLine(nextValue, propIndent),\n });\n }\n\n return edits;\n}\n\nfunction updateAttrEdit(\n content: string,\n attrProp: PropertyNode,\n attrDef: DataAttrDef<string, boolean, boolean>,\n): Edit {\n const { typeParams } = analyzeChain(attrProp.value);\n const typeParamsText = typeParams\n ? content.slice(typeParams.start, typeParams.end)\n : null;\n const nextValue = renderAttrCall(attrDef, typeParamsText);\n return {\n start: attrProp.value.start,\n end: attrProp.value.end,\n text: nextValue,\n };\n}\n\nfunction applyEdits(content: string, edits: Edit[]) {\n if (edits.length === 0) {\n return content;\n }\n const sorted = [...edits].sort((a, b) => b.start - a.start);\n let output = content;\n for (const edit of sorted) {\n output = output.slice(0, edit.start) + edit.text + output.slice(edit.end);\n }\n return output;\n}\n\nfunction collectChanges(\n steps: MigrationTx[],\n localLinksByForward: LinkMap,\n serverLinksByForward: LinkMap,\n): ChangeBuckets {\n const buckets: ChangeBuckets = {\n createEntities: new Set(),\n deleteEntities: new Set(),\n addAttrs: new Map(),\n deleteAttrs: new Map(),\n updateAttrs: new Map(),\n addLinks: new Set(),\n deleteLinks: new Set(),\n updateLinks: new Set(),\n };\n\n for (const step of steps) {\n const namespace = step.identifier.namespace;\n const attrName = step.identifier.attrName;\n const forwardKey = `${namespace}.${attrName}`;\n\n switch (step.type) {\n case 'add-attr': {\n if (attrName === 'id') {\n buckets.createEntities.add(namespace);\n break;\n }\n if (step['value-type'] === 'ref') {\n buckets.addLinks.add(forwardKey);\n break;\n }\n ensureSet(buckets.addAttrs, namespace).add(attrName);\n break;\n }\n case 'delete-attr': {\n if (attrName === 'id') {\n buckets.deleteEntities.add(namespace);\n break;\n }\n if (localLinksByForward.has(forwardKey)) {\n buckets.deleteLinks.add(forwardKey);\n break;\n }\n ensureSet(buckets.deleteAttrs, namespace).add(attrName);\n break;\n }\n case 'update-attr': {\n if (step.partialAttr?.['value-type'] === 'ref') {\n buckets.updateLinks.add(forwardKey);\n break;\n }\n ensureSet(buckets.updateAttrs, namespace).add(attrName);\n break;\n }\n case 'index':\n case 'remove-index':\n case 'unique':\n case 'remove-unique':\n case 'required':\n case 'remove-required':\n case 'check-data-type':\n case 'remove-data-type': {\n if (serverLinksByForward.has(forwardKey)) {\n buckets.updateLinks.add(forwardKey);\n break;\n }\n ensureSet(buckets.updateAttrs, namespace).add(attrName);\n break;\n }\n default: {\n assertNever(step);\n }\n }\n }\n\n pruneNamespaceBuckets(buckets);\n return buckets;\n}\n\nfunction ensureSet(map: Map<string, Set<string>>, key: string) {\n if (!map.has(key)) map.set(key, new Set());\n return map.get(key)!;\n}\n\nfunction pruneNamespaceBuckets(buckets: ChangeBuckets) {\n const namespaces = new Set<string>([\n ...buckets.createEntities,\n ...buckets.deleteEntities,\n ]);\n\n for (const namespace of namespaces) {\n buckets.addAttrs.delete(namespace);\n buckets.deleteAttrs.delete(namespace);\n buckets.updateAttrs.delete(namespace);\n removeNamespaceLinks(buckets.addLinks, namespace);\n removeNamespaceLinks(buckets.deleteLinks, namespace);\n removeNamespaceLinks(buckets.updateLinks, namespace);\n }\n}\n\nfunction removeNamespaceLinks(set: Set<string>, namespace: string) {\n const prefix = `${namespace}.`;\n for (const key of Array.from(set)) {\n if (key.startsWith(prefix)) {\n set.delete(key);\n }\n }\n}\n\nfunction assertNever(value: never): never {\n throw new Error(`Unhandled migration step: ${JSON.stringify(value)}`);\n}\n\nfunction analyzeChain(node: any): { typeParams: acorn.Node | null } {\n let curr = node;\n let typeParams: acorn.Node | null = null;\n\n while (curr?.type === 'CallExpression') {\n if (curr.typeParameters) {\n typeParams = curr.typeParameters;\n }\n if (curr.callee?.type === 'MemberExpression') {\n curr = curr.callee.object;\n } else {\n break;\n }\n }\n return { typeParams };\n}\n\nfunction findSchemaObject(ast: any): ObjectExpression | null {\n let schemaObj: ObjectExpression | null = null;\n const walk = (node: any) => {\n if (!node || schemaObj) return;\n if (\n node.type === 'CallExpression' &&\n node.callee?.type === 'MemberExpression' &&\n node.callee.object?.type === 'Identifier' &&\n node.callee.object.name === 'i' &&\n node.callee.property?.name === 'schema' &&\n node.arguments?.length > 0\n ) {\n const arg = node.arguments[0];\n if (isObjectExpression(arg)) {\n schemaObj = arg;\n }\n return;\n }\n for (const key in node) {\n if (key === 'loc' || key === 'start' || key === 'end') continue;\n const value = node[key];\n if (!value || typeof value !== 'object') continue;\n if (Array.isArray(value)) {\n value.forEach(walk);\n } else {\n walk(value);\n }\n }\n };\n walk(ast);\n return schemaObj;\n}\n\nfunction findObjectProperty(\n obj: ObjectExpression,\n name: string,\n): PropertyNode | null {\n for (const prop of obj.properties) {\n if (!isProperty(prop)) continue;\n const propName = getPropName(prop);\n if (propName === name) return prop;\n }\n return null;\n}\n\nfunction getEntityAttrsObject(value: any): ObjectExpression | null {\n if (\n value?.type !== 'CallExpression' ||\n value.callee?.type !== 'MemberExpression' ||\n value.callee.object?.type !== 'Identifier' ||\n value.callee.object.name !== 'i' ||\n value.callee.property?.name !== 'entity'\n ) {\n return null;\n }\n const attrsObj = value.arguments?.[0];\n return isObjectExpression(attrsObj) ? attrsObj : null;\n}\n\nfunction buildLinkForwardMap(links: Record<string, any>) {\n const map = new Map<string, { name: string; link: any }>();\n for (const [name, link] of Object.entries(links || {})) {\n map.set(linkForwardKey(link), { name, link });\n }\n return map;\n}\n\nfunction linkForwardKey(link: any) {\n return `${link.forward.on}.${link.forward.label}`;\n}\n\nfunction isObjectExpression(node: any): node is ObjectExpression {\n return node?.type === 'ObjectExpression';\n}\n\nfunction isProperty(node: any): node is PropertyNode {\n return node?.type === 'Property';\n}\n\nfunction getPropName(prop: PropertyNode) {\n if (prop.key.type === 'Identifier') return prop.key.name;\n if (prop.key.type === 'Literal') return String(prop.key.value);\n return null;\n}\n\nfunction indentLines(text: string, indent: string) {\n return text\n .split('\\n')\n .map((line) => (line.length ? indent + line : line))\n .join('\\n');\n}\n\nfunction getObjectPropIndent(source: string, obj: ObjectExpression) {\n const props = obj.properties.filter(isProperty);\n if (props.length > 0) {\n return getLineIndent(source, props[0].start);\n }\n const closingIndent = getLineIndent(source, obj.end - 1);\n return closingIndent + DEFAULT_INDENT;\n}\n\nfunction getLineIndent(source: string, pos: number) {\n const lineStart = source.lastIndexOf('\\n', pos - 1) + 1;\n const match = source.slice(lineStart, pos).match(/^[\\t ]*/);\n return match ? match[0] : '';\n}\n\nfunction insertProperty(\n source: string,\n obj: ObjectExpression,\n propText: string,\n indent: string,\n options: { preferMultiline?: boolean } = {},\n) {\n const props = obj.properties.filter(isProperty);\n const closingBrace = obj.end - 1;\n const propTextWithIndent = indentLines(propText, indent);\n const propTextSingleLine = propText.trim();\n const objSource = source.slice(obj.start, obj.end);\n const innerStart = obj.start + 1;\n const innerEnd = closingBrace;\n const innerContent = source.slice(innerStart, innerEnd);\n const innerWhitespaceOnly = /^[\\s]*$/.test(innerContent);\n\n if (props.length === 0) {\n const objSource = source.slice(obj.start, obj.end);\n const multiline = objSource.includes('\\n') || propText.includes('\\n');\n if (!multiline) {\n return {\n start: closingBrace,\n end: closingBrace,\n text: ` ${propTextSingleLine} `,\n };\n }\n const closingIndent = getLineIndent(source, closingBrace);\n if (innerWhitespaceOnly) {\n return {\n start: innerStart,\n end: innerEnd,\n text: `\\n${propTextWithIndent},\\n${closingIndent}`,\n };\n }\n return {\n start: closingBrace,\n end: closingBrace,\n text: `\\n${propTextWithIndent},\\n${closingIndent}`,\n };\n }\n\n if (options.preferMultiline && !objSource.includes('\\n')) {\n const closingIndent = getLineIndent(source, closingBrace);\n const innerIndent = closingIndent + DEFAULT_INDENT;\n const propTexts = props.map((prop) =>\n source.slice(prop.start, prop.end).trim(),\n );\n const lines = [...propTexts, propTextSingleLine].map(\n (prop) => `${innerIndent}${prop},`,\n );\n const nextObject = `{\\n${lines.join('\\n')}\\n${closingIndent}}`;\n return { start: obj.start, end: obj.end, text: nextObject };\n }\n\n const lastProp = props[props.length - 1];\n const multiline =\n source.slice(lastProp.end, closingBrace).includes('\\n') ||\n propText.includes('\\n');\n const needsComma = !hasTrailingComma(source, lastProp.end, obj.end);\n\n if (!multiline) {\n let insertPos = closingBrace;\n while (insertPos > lastProp.end && /\\s/.test(source[insertPos - 1])) {\n insertPos -= 1;\n }\n return {\n start: insertPos,\n end: insertPos,\n text: `${needsComma ? ',' : ''} ${propTextSingleLine}`,\n };\n }\n\n const lineStart = source.lastIndexOf('\\n', closingBrace);\n return {\n start: lineStart,\n end: lineStart,\n text: `${needsComma ? ',' : ''}\\n${propTextWithIndent},`,\n };\n}\n\nfunction removeProperty(\n source: string,\n obj: ObjectExpression,\n prop: PropertyNode,\n) {\n let start = prop.start;\n let end = prop.end;\n const lineStart = source.lastIndexOf('\\n', start - 1) + 1;\n let shouldTrimLineEnd = false;\n if (/^[\\t ]*$/.test(source.slice(lineStart, start))) {\n start = lineStart;\n shouldTrimLineEnd = true;\n }\n const after = skipWhitespaceAndComments(source, end, obj.end);\n if (source[after] === ',') {\n end = after + 1;\n } else {\n const before = skipWhitespaceAndCommentsBackward(source, start, obj.start);\n if (source[before] === ',') {\n start = before;\n }\n }\n if (shouldTrimLineEnd) {\n const lineEnd = source.indexOf('\\n', end);\n if (lineEnd !== -1 && /^[\\t ]*$/.test(source.slice(end, lineEnd))) {\n end = lineEnd + 1;\n }\n }\n return { start, end, text: '' };\n}\n\nfunction indentValueAfterFirstLine(value: string, indent: string) {\n const lines = value.split('\\n');\n if (lines.length <= 1) return value;\n return [\n lines[0],\n ...lines.slice(1).map((line) => (line ? indent + line : line)),\n ].join('\\n');\n}\n\nfunction normalizeEmptyLinksObject(content: string) {\n let ast: any;\n try {\n ast = parseFile(content);\n } catch {\n return content;\n }\n const schemaObj = findSchemaObject(ast);\n if (!schemaObj) return content;\n const linksProp = findObjectProperty(schemaObj, 'links');\n if (!linksProp || !isObjectExpression(linksProp.value)) return content;\n if (linksProp.value.properties.some(isProperty)) return content;\n const inner = content.slice(\n linksProp.value.start + 1,\n linksProp.value.end - 1,\n );\n if (!/^[\\s]*$/.test(inner)) return content;\n return (\n content.slice(0, linksProp.value.start) +\n '{}' +\n content.slice(linksProp.value.end)\n );\n}\n\nfunction hasTrailingComma(source: string, afterPos: number, endPos: number) {\n const next = skipWhitespaceAndComments(source, afterPos, endPos);\n return source[next] === ',';\n}\n\nfunction skipWhitespaceAndComments(source: string, start: number, end: number) {\n let i = start;\n while (i < end) {\n const ch = source[i];\n if (/\\s/.test(ch)) {\n i += 1;\n continue;\n }\n if (ch === '/' && source[i + 1] === '/') {\n const nextLine = source.indexOf('\\n', i + 2);\n i = nextLine === -1 ? end : nextLine + 1;\n continue;\n }\n if (ch === '/' && source[i + 1] === '*') {\n const close = source.indexOf('*/', i + 2);\n i = close === -1 ? end : close + 2;\n continue;\n }\n break;\n }\n return i;\n}\n\nfunction skipWhitespaceAndCommentsBackward(\n source: string,\n start: number,\n end: number,\n) {\n let i = start - 1;\n while (i >= end) {\n const ch = source[i];\n if (/\\s/.test(ch)) {\n i -= 1;\n continue;\n }\n if (ch === '/' && source[i - 1] === '/') {\n const prevLine = source.lastIndexOf('\\n', i - 2);\n i = prevLine === -1 ? end - 1 : prevLine - 1;\n continue;\n }\n if (ch === '/' && source[i - 1] === '*') {\n const open = source.lastIndexOf('/*', i - 2);\n i = open === -1 ? end - 1 : open - 1;\n continue;\n }\n break;\n }\n return i;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"updateSchemaFile.js","sourceRoot":"","sources":["../../src/util/updateSchemaFile.ts"],"names":[],"mappings":"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","sourcesContent":["import * as acorn from 'acorn';\nimport { tsPlugin } from 'acorn-typescript';\nimport {\n diffSchemas,\n renderAttrCall,\n renderAttrProperty,\n renderEntityProperty,\n renderLinkProperty,\n renderLinkValue,\n type MigrationTx,\n} from '@instantdb/platform';\nimport type { DataAttrDef, InstantSchemaDef } from '@instantdb/core';\n\nconst parser = (acorn.Parser as any).extend(tsPlugin({ dts: false }) as any);\nconst DEFAULT_INDENT = ' ';\n\nexport async function updateSchemaFile(\n existingFileContent: string,\n localSchema: InstantSchemaDef<any, any, any>,\n serverSchema: InstantSchemaDef<any, any, any>,\n): Promise<string> {\n const ast = parseFile(existingFileContent);\n const schemaObj = findSchemaObject(ast);\n if (!schemaObj) {\n throw new Error('Could not find i.schema(...) in schema file.');\n }\n\n const { entitiesObj, linksObj } = getSchemaSections(schemaObj);\n const diff = await diffSchemas(\n localSchema,\n serverSchema,\n async (created) => created,\n {},\n );\n if (diff.length === 0) {\n return existingFileContent;\n }\n\n const { entitiesByName } = buildEntitiesIndex(entitiesObj);\n\n const { localLinksByForward, serverLinksByForward } = buildLinkMaps(\n localSchema.links || {},\n serverSchema.links || {},\n );\n const changeBuckets = collectChanges(\n diff,\n localLinksByForward,\n serverLinksByForward,\n );\n\n const edits: Edit[] = [];\n edits.push(\n ...collectEntityEdits(\n existingFileContent,\n entitiesObj,\n entitiesByName,\n changeBuckets,\n serverSchema,\n ),\n );\n edits.push(\n ...collectLinkEdits(\n existingFileContent,\n linksObj,\n changeBuckets,\n localLinksByForward,\n serverLinksByForward,\n ),\n );\n\n const updated = applyEdits(existingFileContent, edits);\n return normalizeEmptyLinksObject(updated);\n}\n\ntype ObjectExpression = {\n type: 'ObjectExpression';\n start: number;\n end: number;\n properties: any[];\n};\n\ntype PropertyNode = {\n type: 'Property';\n start: number;\n end: number;\n key: any;\n value: any;\n};\n\ntype EntityInfo = {\n prop: PropertyNode;\n attrsObj: ObjectExpression;\n attrsByName: Map<string, PropertyNode>;\n};\n\ntype Edit = { start: number; end: number; text: string };\n\ntype ChangeBuckets = {\n createEntities: Set<string>;\n deleteEntities: Set<string>;\n addAttrs: Map<string, Set<string>>;\n deleteAttrs: Map<string, Set<string>>;\n updateAttrs: Map<string, Set<string>>;\n addLinks: Set<string>;\n deleteLinks: Set<string>;\n updateLinks: Set<string>;\n};\n\ntype LinkMap = Map<string, { name: string; link: any }>;\n\nfunction parseFile(content: string) {\n return parser.parse(content, {\n sourceType: 'module',\n ecmaVersion: 'latest',\n });\n}\n\nfunction getSchemaSections(schemaObj: ObjectExpression) {\n const entitiesProp = findObjectProperty(schemaObj, 'entities');\n if (!entitiesProp || !isObjectExpression(entitiesProp.value)) {\n throw new Error('Could not find entities object in schema file.');\n }\n const linksProp = findObjectProperty(schemaObj, 'links');\n if (!linksProp || !isObjectExpression(linksProp.value)) {\n throw new Error('Could not find links object in schema file.');\n }\n\n return {\n entitiesObj: entitiesProp.value,\n linksObj: linksProp.value,\n };\n}\n\nfunction buildEntitiesIndex(entitiesObj: ObjectExpression) {\n const entitiesByName = new Map<string, EntityInfo>();\n\n for (const prop of entitiesObj.properties) {\n if (!isProperty(prop)) continue;\n const name = getPropName(prop);\n if (!name) continue;\n const attrsObj = getEntityAttrsObject(prop.value);\n if (!attrsObj) continue;\n\n const attrsByName = new Map<string, PropertyNode>();\n for (const attrProp of attrsObj.properties) {\n if (!isProperty(attrProp)) continue;\n const attrName = getPropName(attrProp);\n if (!attrName) continue;\n attrsByName.set(attrName, attrProp);\n }\n\n entitiesByName.set(name, { prop, attrsObj, attrsByName });\n }\n\n return { entitiesByName };\n}\n\nfunction buildLinkMaps(\n localLinks: Record<string, any>,\n serverLinks: Record<string, any>,\n) {\n return {\n localLinksByForward: buildLinkForwardMap(localLinks),\n serverLinksByForward: buildLinkForwardMap(serverLinks),\n };\n}\n\nfunction collectEntityEdits(\n content: string,\n entitiesObj: ObjectExpression,\n entitiesByName: Map<string, EntityInfo>,\n changeBuckets: ChangeBuckets,\n serverSchema: InstantSchemaDef<any, any, any>,\n): Edit[] {\n const edits: Edit[] = [];\n\n for (const entityName of changeBuckets.deleteEntities) {\n const entity = entitiesByName.get(entityName);\n if (!entity) continue;\n edits.push(removeProperty(content, entitiesObj, entity.prop));\n }\n\n for (const entityName of changeBuckets.createEntities) {\n if (entitiesByName.has(entityName)) continue;\n const entityDef = serverSchema.entities?.[entityName];\n if (!entityDef) continue;\n const propText = renderEntityProperty(entityName, entityDef.attrs);\n const indent = getObjectPropIndent(content, entitiesObj);\n edits.push(insertProperty(content, entitiesObj, propText, indent));\n }\n\n for (const [entityName, attrs] of changeBuckets.deleteAttrs) {\n const entity = entitiesByName.get(entityName);\n if (!entity) continue;\n for (const attrName of attrs) {\n const attrProp = entity.attrsByName.get(attrName);\n if (!attrProp) continue;\n edits.push(removeProperty(content, entity.attrsObj, attrProp));\n }\n }\n\n for (const [entityName, attrs] of changeBuckets.addAttrs) {\n const entity = entitiesByName.get(entityName);\n if (!entity) continue;\n const entityDef = serverSchema.entities?.[entityName];\n if (!entityDef) continue;\n const indent = getObjectPropIndent(content, entity.attrsObj);\n for (const attrName of attrs) {\n const attrDef = entityDef.attrs?.[attrName];\n if (!attrDef) continue;\n const propText = renderAttrProperty(attrName, attrDef);\n edits.push(\n insertPropertyExpandingSingleLine(\n content,\n entity.attrsObj,\n propText,\n indent,\n ),\n );\n }\n }\n\n for (const [entityName, attrs] of changeBuckets.updateAttrs) {\n const entity = entitiesByName.get(entityName);\n if (!entity) continue;\n const entityDef = serverSchema.entities?.[entityName];\n if (!entityDef) continue;\n for (const attrName of attrs) {\n const attrProp = entity.attrsByName.get(attrName);\n const attrDef = entityDef.attrs?.[attrName];\n if (!attrProp || !attrDef) continue;\n edits.push(updateAttrEdit(content, attrProp, attrDef));\n }\n }\n\n return edits;\n}\n\nfunction collectLinkEdits(\n content: string,\n linksObj: ObjectExpression,\n changeBuckets: ChangeBuckets,\n localLinksByForward: LinkMap,\n serverLinksByForward: LinkMap,\n): Edit[] {\n const edits: Edit[] = [];\n\n for (const forwardKey of changeBuckets.deleteLinks) {\n const localLink = localLinksByForward.get(forwardKey);\n if (!localLink) continue;\n const linkProp = findObjectProperty(linksObj, localLink.name);\n if (!linkProp) continue;\n edits.push(removeProperty(content, linksObj, linkProp));\n }\n\n for (const forwardKey of changeBuckets.addLinks) {\n const serverLink = serverLinksByForward.get(forwardKey);\n if (!serverLink) continue;\n const linkName = serverLink.name;\n if (findObjectProperty(linksObj, linkName)) continue;\n const propText = renderLinkProperty(linkName, serverLink.link);\n const indent = getObjectPropIndent(content, linksObj);\n edits.push(insertProperty(content, linksObj, propText, indent));\n }\n\n for (const forwardKey of changeBuckets.updateLinks) {\n const serverLink = serverLinksByForward.get(forwardKey);\n const localLink = localLinksByForward.get(forwardKey);\n if (!serverLink || !localLink) continue;\n const linkProp = findObjectProperty(linksObj, localLink.name);\n if (!linkProp) continue;\n const nextValue = renderLinkValue(serverLink.link);\n const propIndent = getLineIndent(content, linkProp.start);\n edits.push({\n start: linkProp.value.start,\n end: linkProp.value.end,\n text: indentValueAfterFirstLine(nextValue, propIndent),\n });\n }\n\n return edits;\n}\n\nfunction updateAttrEdit(\n content: string,\n attrProp: PropertyNode,\n attrDef: DataAttrDef<string, boolean, boolean>,\n): Edit {\n const { typeParams } = analyzeChain(attrProp.value);\n const typeParamsText = typeParams\n ? content.slice(typeParams.start, typeParams.end)\n : null;\n const nextValue = renderAttrCall(attrDef, typeParamsText);\n return {\n start: attrProp.value.start,\n end: attrProp.value.end,\n text: nextValue,\n };\n}\n\nfunction applyEdits(content: string, edits: Edit[]) {\n if (edits.length === 0) {\n return content;\n }\n const sorted = [...edits].sort((a, b) => b.start - a.start);\n let output = content;\n for (const edit of sorted) {\n output = output.slice(0, edit.start) + edit.text + output.slice(edit.end);\n }\n return output;\n}\n\nfunction collectChanges(\n steps: MigrationTx[],\n localLinksByForward: LinkMap,\n serverLinksByForward: LinkMap,\n): ChangeBuckets {\n const buckets: ChangeBuckets = {\n createEntities: new Set(),\n deleteEntities: new Set(),\n addAttrs: new Map(),\n deleteAttrs: new Map(),\n updateAttrs: new Map(),\n addLinks: new Set(),\n deleteLinks: new Set(),\n updateLinks: new Set(),\n };\n\n for (const step of steps) {\n const namespace = step.identifier.namespace;\n const attrName = step.identifier.attrName;\n const forwardKey = `${namespace}.${attrName}`;\n\n switch (step.type) {\n case 'add-attr': {\n if (attrName === 'id') {\n buckets.createEntities.add(namespace);\n break;\n }\n if (step['value-type'] === 'ref') {\n buckets.addLinks.add(forwardKey);\n break;\n }\n ensureSet(buckets.addAttrs, namespace).add(attrName);\n break;\n }\n case 'delete-attr': {\n if (attrName === 'id') {\n buckets.deleteEntities.add(namespace);\n break;\n }\n if (localLinksByForward.has(forwardKey)) {\n buckets.deleteLinks.add(forwardKey);\n break;\n }\n ensureSet(buckets.deleteAttrs, namespace).add(attrName);\n break;\n }\n case 'update-attr': {\n if (step.partialAttr?.['value-type'] === 'ref') {\n buckets.updateLinks.add(forwardKey);\n break;\n }\n ensureSet(buckets.updateAttrs, namespace).add(attrName);\n break;\n }\n case 'index':\n case 'remove-index':\n case 'unique':\n case 'remove-unique':\n case 'required':\n case 'remove-required':\n case 'check-data-type':\n case 'remove-data-type': {\n if (serverLinksByForward.has(forwardKey)) {\n buckets.updateLinks.add(forwardKey);\n break;\n }\n ensureSet(buckets.updateAttrs, namespace).add(attrName);\n break;\n }\n default: {\n assertNever(step);\n }\n }\n }\n\n pruneNamespaceBuckets(buckets);\n return buckets;\n}\n\nfunction ensureSet(map: Map<string, Set<string>>, key: string) {\n if (!map.has(key)) map.set(key, new Set());\n return map.get(key)!;\n}\n\nfunction pruneNamespaceBuckets(buckets: ChangeBuckets) {\n const namespaces = new Set<string>([\n ...buckets.createEntities,\n ...buckets.deleteEntities,\n ]);\n\n for (const namespace of namespaces) {\n buckets.addAttrs.delete(namespace);\n buckets.deleteAttrs.delete(namespace);\n buckets.updateAttrs.delete(namespace);\n removeNamespaceLinks(buckets.addLinks, namespace);\n removeNamespaceLinks(buckets.deleteLinks, namespace);\n removeNamespaceLinks(buckets.updateLinks, namespace);\n }\n}\n\nfunction removeNamespaceLinks(set: Set<string>, namespace: string) {\n const prefix = `${namespace}.`;\n for (const key of Array.from(set)) {\n if (key.startsWith(prefix)) {\n set.delete(key);\n }\n }\n}\n\nfunction assertNever(value: never): never {\n throw new Error(`Unhandled migration step: ${JSON.stringify(value)}`);\n}\n\nfunction analyzeChain(node: any): { typeParams: acorn.Node | null } {\n let curr = node;\n let typeParams: acorn.Node | null = null;\n\n while (curr?.type === 'CallExpression') {\n if (curr.typeParameters) {\n typeParams = curr.typeParameters;\n }\n if (curr.callee?.type === 'MemberExpression') {\n curr = curr.callee.object;\n } else {\n break;\n }\n }\n return { typeParams };\n}\n\nfunction findSchemaObject(ast: any): ObjectExpression | null {\n let schemaObj: ObjectExpression | null = null;\n const walk = (node: any) => {\n if (!node || schemaObj) return;\n if (\n node.type === 'CallExpression' &&\n node.callee?.type === 'MemberExpression' &&\n node.callee.object?.type === 'Identifier' &&\n node.callee.object.name === 'i' &&\n node.callee.property?.name === 'schema' &&\n node.arguments?.length > 0\n ) {\n const arg = node.arguments[0];\n if (isObjectExpression(arg)) {\n schemaObj = arg;\n }\n return;\n }\n for (const key in node) {\n if (key === 'loc' || key === 'start' || key === 'end') continue;\n const value = node[key];\n if (!value || typeof value !== 'object') continue;\n if (Array.isArray(value)) {\n value.forEach(walk);\n } else {\n walk(value);\n }\n }\n };\n walk(ast);\n return schemaObj;\n}\n\nfunction findObjectProperty(\n obj: ObjectExpression,\n name: string,\n): PropertyNode | null {\n for (const prop of obj.properties) {\n if (!isProperty(prop)) continue;\n const propName = getPropName(prop);\n if (propName === name) return prop;\n }\n return null;\n}\n\nfunction getEntityAttrsObject(value: any): ObjectExpression | null {\n if (\n value?.type !== 'CallExpression' ||\n value.callee?.type !== 'MemberExpression' ||\n value.callee.object?.type !== 'Identifier' ||\n value.callee.object.name !== 'i' ||\n value.callee.property?.name !== 'entity'\n ) {\n return null;\n }\n const attrsObj = value.arguments?.[0];\n return isObjectExpression(attrsObj) ? attrsObj : null;\n}\n\nfunction buildLinkForwardMap(links: Record<string, any>) {\n const map = new Map<string, { name: string; link: any }>();\n for (const [name, link] of Object.entries(links || {})) {\n map.set(linkForwardKey(link), { name, link });\n }\n return map;\n}\n\nfunction linkForwardKey(link: any) {\n return `${link.forward.on}.${link.forward.label}`;\n}\n\nfunction isObjectExpression(node: any): node is ObjectExpression {\n return node?.type === 'ObjectExpression';\n}\n\nfunction isProperty(node: any): node is PropertyNode {\n return node?.type === 'Property';\n}\n\nfunction getPropName(prop: PropertyNode) {\n if (prop.key.type === 'Identifier') return prop.key.name;\n if (prop.key.type === 'Literal') return String(prop.key.value);\n return null;\n}\n\nfunction indentLines(text: string, indent: string) {\n return text\n .split('\\n')\n .map((line) => (line.length ? indent + line : line))\n .join('\\n');\n}\n\nfunction getObjectPropIndent(source: string, obj: ObjectExpression) {\n const props = obj.properties.filter(isProperty);\n if (props.length > 0) {\n return getLineIndent(source, props[0].start);\n }\n const closingIndent = getLineIndent(source, obj.end - 1);\n return closingIndent + DEFAULT_INDENT;\n}\n\nfunction getLineIndent(source: string, pos: number) {\n const lineStart = source.lastIndexOf('\\n', pos - 1) + 1;\n const match = source.slice(lineStart, pos).match(/^[\\t ]*/);\n return match ? match[0] : '';\n}\n\nfunction insertProperty(\n source: string,\n obj: ObjectExpression,\n propText: string,\n indent: string,\n) {\n const props = obj.properties.filter(isProperty);\n const closingBrace = obj.end - 1;\n const propTextWithIndent = indentLines(propText, indent);\n const propTextSingleLine = propText.trim();\n const innerStart = obj.start + 1;\n const innerEnd = closingBrace;\n const innerContent = source.slice(innerStart, innerEnd);\n const innerWhitespaceOnly = /^[\\s]*$/.test(innerContent);\n\n if (props.length === 0) {\n const objSource = source.slice(obj.start, obj.end);\n const multiline = objSource.includes('\\n') || propText.includes('\\n');\n if (!multiline) {\n return {\n start: closingBrace,\n end: closingBrace,\n text: ` ${propTextSingleLine} `,\n };\n }\n const closingIndent = getLineIndent(source, closingBrace);\n if (innerWhitespaceOnly) {\n return {\n start: innerStart,\n end: innerEnd,\n text: `\\n${propTextWithIndent},\\n${closingIndent}`,\n };\n }\n return {\n start: closingBrace,\n end: closingBrace,\n text: `\\n${propTextWithIndent},\\n${closingIndent}`,\n };\n }\n\n const lastProp = props[props.length - 1];\n const multiline =\n source.slice(lastProp.end, closingBrace).includes('\\n') ||\n propText.includes('\\n');\n const needsComma = !hasTrailingComma(source, lastProp.end, obj.end);\n\n if (!multiline) {\n let insertPos = closingBrace;\n while (insertPos > lastProp.end && /\\s/.test(source[insertPos - 1])) {\n insertPos -= 1;\n }\n return {\n start: insertPos,\n end: insertPos,\n text: `${needsComma ? ',' : ''} ${propTextSingleLine}`,\n };\n }\n\n const lineStart = source.lastIndexOf('\\n', closingBrace);\n return {\n start: lineStart,\n end: lineStart,\n text: `${needsComma ? ',' : ''}\\n${propTextWithIndent},`,\n };\n}\n\nfunction removeProperty(\n source: string,\n obj: ObjectExpression,\n prop: PropertyNode,\n) {\n let start = prop.start;\n let end = prop.end;\n const lineStart = source.lastIndexOf('\\n', start - 1) + 1;\n let shouldTrimLineEnd = false;\n if (/^[\\t ]*$/.test(source.slice(lineStart, start))) {\n start = lineStart;\n shouldTrimLineEnd = true;\n }\n const after = skipWhitespaceAndComments(source, end, obj.end);\n if (source[after] === ',') {\n end = after + 1;\n } else {\n const before = skipWhitespaceAndCommentsBackward(source, start, obj.start);\n if (source[before] === ',') {\n start = before;\n }\n }\n if (shouldTrimLineEnd) {\n const lineEnd = source.indexOf('\\n', end);\n if (lineEnd !== -1 && /^[\\t ]*$/.test(source.slice(end, lineEnd))) {\n end = lineEnd + 1;\n }\n }\n return { start, end, text: '' };\n}\n\nfunction indentValueAfterFirstLine(value: string, indent: string) {\n const lines = value.split('\\n');\n if (lines.length <= 1) return value;\n return [\n lines[0],\n ...lines.slice(1).map((line) => (line ? indent + line : line)),\n ].join('\\n');\n}\n\nfunction insertPropertyExpandingSingleLine(\n source: string,\n obj: ObjectExpression,\n propText: string,\n indent: string,\n) {\n const props = obj.properties.filter(isProperty);\n if (!props.length) {\n return insertProperty(source, obj, propText, indent);\n }\n const objSource = source.slice(obj.start, obj.end);\n if (objSource.includes('\\n') || propText.includes('\\n')) {\n return insertProperty(source, obj, propText, indent);\n }\n const closingBrace = obj.end - 1;\n const closingIndent = getLineIndent(source, closingBrace);\n const innerIndent = closingIndent + DEFAULT_INDENT;\n const propTexts = props.map((prop) =>\n source.slice(prop.start, prop.end).trim(),\n );\n const lines = [...propTexts, propText.trim()].map(\n (prop) => `${innerIndent}${prop},`,\n );\n const nextObject = `{\\n${lines.join('\\n')}\\n${closingIndent}}`;\n return { start: obj.start, end: obj.end, text: nextObject };\n}\n\nfunction normalizeEmptyLinksObject(content: string) {\n let ast: any;\n try {\n ast = parseFile(content);\n } catch {\n return content;\n }\n const schemaObj = findSchemaObject(ast);\n if (!schemaObj) return content;\n const linksProp = findObjectProperty(schemaObj, 'links');\n if (!linksProp || !isObjectExpression(linksProp.value)) return content;\n if (linksProp.value.properties.some(isProperty)) return content;\n const inner = content.slice(\n linksProp.value.start + 1,\n linksProp.value.end - 1,\n );\n if (!/^[\\s]*$/.test(inner)) return content;\n return (\n content.slice(0, linksProp.value.start) +\n '{}' +\n content.slice(linksProp.value.end)\n );\n}\n\nfunction hasTrailingComma(source: string, afterPos: number, endPos: number) {\n const next = skipWhitespaceAndComments(source, afterPos, endPos);\n return source[next] === ',';\n}\n\nfunction skipWhitespaceAndComments(source: string, start: number, end: number) {\n let i = start;\n while (i < end) {\n const ch = source[i];\n if (/\\s/.test(ch)) {\n i += 1;\n continue;\n }\n if (ch === '/' && source[i + 1] === '/') {\n const nextLine = source.indexOf('\\n', i + 2);\n i = nextLine === -1 ? end : nextLine + 1;\n continue;\n }\n if (ch === '/' && source[i + 1] === '*') {\n const close = source.indexOf('*/', i + 2);\n i = close === -1 ? end : close + 2;\n continue;\n }\n break;\n }\n return i;\n}\n\nfunction skipWhitespaceAndCommentsBackward(\n source: string,\n start: number,\n end: number,\n) {\n let i = start - 1;\n while (i >= end) {\n const ch = source[i];\n if (/\\s/.test(ch)) {\n i -= 1;\n continue;\n }\n if (ch === '/' && source[i - 1] === '/') {\n const prevLine = source.lastIndexOf('\\n', i - 2);\n i = prevLine === -1 ? end - 1 : prevLine - 1;\n continue;\n }\n if (ch === '/' && source[i - 1] === '*') {\n const open = source.lastIndexOf('/*', i - 2);\n i = open === -1 ? end - 1 : open - 1;\n continue;\n }\n break;\n }\n return i;\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "instant-cli",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "0.22.95-experimental.surgical.
|
|
4
|
+
"version": "0.22.95-experimental.surgical.20386947966.1",
|
|
5
5
|
"description": "Instant's CLI",
|
|
6
6
|
"homepage": "https://github.com/instantdb/instant/tree/main/client/packages/cli",
|
|
7
7
|
"repository": {
|
|
@@ -41,9 +41,9 @@
|
|
|
41
41
|
"strip-ansi": "^7.1.2",
|
|
42
42
|
"terminal-link": "^3.0.0",
|
|
43
43
|
"unconfig": "^0.5.5",
|
|
44
|
-
"@instantdb/
|
|
45
|
-
"@instantdb/
|
|
46
|
-
"@instantdb/
|
|
44
|
+
"@instantdb/version": "0.22.95-experimental.surgical.20386947966.1",
|
|
45
|
+
"@instantdb/core": "0.22.95-experimental.surgical.20386947966.1",
|
|
46
|
+
"@instantdb/platform": "0.22.95-experimental.surgical.20386947966.1"
|
|
47
47
|
},
|
|
48
48
|
"devDependencies": {
|
|
49
49
|
"@babel/core": "^7.17.9",
|
|
@@ -210,9 +210,12 @@ function collectEntityEdits(
|
|
|
210
210
|
if (!attrDef) continue;
|
|
211
211
|
const propText = renderAttrProperty(attrName, attrDef);
|
|
212
212
|
edits.push(
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
213
|
+
insertPropertyExpandingSingleLine(
|
|
214
|
+
content,
|
|
215
|
+
entity.attrsObj,
|
|
216
|
+
propText,
|
|
217
|
+
indent,
|
|
218
|
+
),
|
|
216
219
|
);
|
|
217
220
|
}
|
|
218
221
|
}
|
|
@@ -549,13 +552,11 @@ function insertProperty(
|
|
|
549
552
|
obj: ObjectExpression,
|
|
550
553
|
propText: string,
|
|
551
554
|
indent: string,
|
|
552
|
-
options: { preferMultiline?: boolean } = {},
|
|
553
555
|
) {
|
|
554
556
|
const props = obj.properties.filter(isProperty);
|
|
555
557
|
const closingBrace = obj.end - 1;
|
|
556
558
|
const propTextWithIndent = indentLines(propText, indent);
|
|
557
559
|
const propTextSingleLine = propText.trim();
|
|
558
|
-
const objSource = source.slice(obj.start, obj.end);
|
|
559
560
|
const innerStart = obj.start + 1;
|
|
560
561
|
const innerEnd = closingBrace;
|
|
561
562
|
const innerContent = source.slice(innerStart, innerEnd);
|
|
@@ -586,19 +587,6 @@ function insertProperty(
|
|
|
586
587
|
};
|
|
587
588
|
}
|
|
588
589
|
|
|
589
|
-
if (options.preferMultiline && !objSource.includes('\n')) {
|
|
590
|
-
const closingIndent = getLineIndent(source, closingBrace);
|
|
591
|
-
const innerIndent = closingIndent + DEFAULT_INDENT;
|
|
592
|
-
const propTexts = props.map((prop) =>
|
|
593
|
-
source.slice(prop.start, prop.end).trim(),
|
|
594
|
-
);
|
|
595
|
-
const lines = [...propTexts, propTextSingleLine].map(
|
|
596
|
-
(prop) => `${innerIndent}${prop},`,
|
|
597
|
-
);
|
|
598
|
-
const nextObject = `{\n${lines.join('\n')}\n${closingIndent}}`;
|
|
599
|
-
return { start: obj.start, end: obj.end, text: nextObject };
|
|
600
|
-
}
|
|
601
|
-
|
|
602
590
|
const lastProp = props[props.length - 1];
|
|
603
591
|
const multiline =
|
|
604
592
|
source.slice(lastProp.end, closingBrace).includes('\n') ||
|
|
@@ -665,6 +653,33 @@ function indentValueAfterFirstLine(value: string, indent: string) {
|
|
|
665
653
|
].join('\n');
|
|
666
654
|
}
|
|
667
655
|
|
|
656
|
+
function insertPropertyExpandingSingleLine(
|
|
657
|
+
source: string,
|
|
658
|
+
obj: ObjectExpression,
|
|
659
|
+
propText: string,
|
|
660
|
+
indent: string,
|
|
661
|
+
) {
|
|
662
|
+
const props = obj.properties.filter(isProperty);
|
|
663
|
+
if (!props.length) {
|
|
664
|
+
return insertProperty(source, obj, propText, indent);
|
|
665
|
+
}
|
|
666
|
+
const objSource = source.slice(obj.start, obj.end);
|
|
667
|
+
if (objSource.includes('\n') || propText.includes('\n')) {
|
|
668
|
+
return insertProperty(source, obj, propText, indent);
|
|
669
|
+
}
|
|
670
|
+
const closingBrace = obj.end - 1;
|
|
671
|
+
const closingIndent = getLineIndent(source, closingBrace);
|
|
672
|
+
const innerIndent = closingIndent + DEFAULT_INDENT;
|
|
673
|
+
const propTexts = props.map((prop) =>
|
|
674
|
+
source.slice(prop.start, prop.end).trim(),
|
|
675
|
+
);
|
|
676
|
+
const lines = [...propTexts, propText.trim()].map(
|
|
677
|
+
(prop) => `${innerIndent}${prop},`,
|
|
678
|
+
);
|
|
679
|
+
const nextObject = `{\n${lines.join('\n')}\n${closingIndent}}`;
|
|
680
|
+
return { start: obj.start, end: obj.end, text: nextObject };
|
|
681
|
+
}
|
|
682
|
+
|
|
668
683
|
function normalizeEmptyLinksObject(content: string) {
|
|
669
684
|
let ast: any;
|
|
670
685
|
try {
|