instant-cli 0.22.95-experimental.surgical.20386736818.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.
@@ -1,4 +1,4 @@
1
1
 
2
- > instant-cli@0.22.95-experimental.surgical.20386736818.1 build /home/runner/work/instant/instant/client/packages/cli
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
 
@@ -122,6 +122,7 @@ const _schema = i.schema({
122
122
  title: i.string(),
123
123
  status: i.string<'todo' | 'done'>().unique().indexed(),
124
124
  labels: i.json<Label[]>(),
125
+ metadata: i.json(),
125
126
  }),
126
127
  users: i.entity({
127
128
  email: i.string().unique(),
@@ -187,7 +188,7 @@ export default _schema;
187
188
  "
188
189
  `;
189
190
 
190
- exports[`updates link details by forward key 1`] = `
191
+ exports[`updates link details 1`] = `
191
192
  "
192
193
  import { i } from '@instantdb/core';
193
194
 
@@ -230,7 +231,10 @@ import { i } from '@instantdb/core';
230
231
 
231
232
  const _schema = i.schema({
232
233
  entities: {
233
- projects: i.entity({ name: i.string(), status: i.string() }),
234
+ projects: i.entity({
235
+ name: i.string(),
236
+ status: i.string(),
237
+ }),
234
238
  todos: i.entity({
235
239
  title: i.string(),
236
240
  }),
@@ -2,33 +2,6 @@ import { test, expect } from 'vitest';
2
2
  import { i, schemaTypescriptFileToInstantSchema } from '@instantdb/platform';
3
3
  import { updateSchemaFile } from '../src/util/updateSchemaFile';
4
4
 
5
- function schemaStr(
6
- entitiesBlock: string,
7
- linksBlock: string,
8
- extraImports = '',
9
- ) {
10
- const linksSection = linksBlock ? `${linksBlock}\n` : '';
11
- return `
12
- import { i } from '@instantdb/core';
13
- ${extraImports ? `${extraImports}\n` : ''}
14
- const _schema = i.schema({
15
- entities: {
16
- ${entitiesBlock}
17
- },
18
- links: {
19
- ${linksSection} },
20
- rooms: {},
21
- });
22
-
23
- export default _schema;
24
- `;
25
- }
26
-
27
- async function runUpdate(oldFile: string, serverSchema: any) {
28
- const localSchema = schemaTypescriptFileToInstantSchema(oldFile);
29
- return updateSchemaFile(oldFile, localSchema, serverSchema);
30
- }
31
-
32
5
  test('throws when schema call is missing', async () => {
33
6
  const oldFile = `
34
7
  import { i } from '@instantdb/core';
@@ -89,24 +62,35 @@ export default _schema;
89
62
  });
90
63
 
91
64
  test('preserves type params across chained calls', async () => {
92
- const oldFile = schemaStr(
93
- ` todos: i.entity({
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({
94
72
  title: i.string(),
95
73
  status: i.string<'todo' | 'done'>().optional().indexed(),
96
74
  labels: i.json<Label[]>(),
97
75
  }),
98
76
  users: i.entity({
99
77
  email: i.string(),
100
- }),`,
101
- '',
102
- "import { Label } from './types';",
103
- );
78
+ }),
79
+ },
80
+ links: {
81
+ },
82
+ rooms: {},
83
+ });
84
+
85
+ export default _schema;
86
+ `;
104
87
  const serverSchema = i.schema({
105
88
  entities: {
106
89
  todos: i.entity({
107
90
  title: i.string(),
108
91
  status: i.string().unique().indexed(),
109
92
  labels: i.json(),
93
+ metadata: i.json(),
110
94
  }),
111
95
  users: i.entity({
112
96
  email: i.string().unique(),
@@ -115,19 +99,29 @@ test('preserves type params across chained calls', async () => {
115
99
  links: {},
116
100
  });
117
101
 
118
- const result = await runUpdate(oldFile, serverSchema);
102
+ const result = await update(oldFile, serverSchema);
119
103
 
120
104
  expect(result).toMatchSnapshot();
121
105
  });
122
106
 
123
107
  test('drops constraints removed by server', async () => {
124
- const oldFile = schemaStr(
125
- ` todos: i.entity({
108
+ const oldFile = `
109
+ import { i } from '@instantdb/core';
110
+
111
+ const _schema = i.schema({
112
+ entities: {
113
+ todos: i.entity({
126
114
  title: i.string().unique().indexed().optional(),
127
115
  done: i.boolean().optional(),
128
- }),`,
129
- '',
130
- );
116
+ }),
117
+ },
118
+ links: {
119
+ },
120
+ rooms: {},
121
+ });
122
+
123
+ export default _schema;
124
+ `;
131
125
  const serverSchema = i.schema({
132
126
  entities: {
133
127
  todos: i.entity({
@@ -138,24 +132,35 @@ test('drops constraints removed by server', async () => {
138
132
  links: {},
139
133
  });
140
134
 
141
- const result = await runUpdate(oldFile, serverSchema);
135
+ const result = await update(oldFile, serverSchema);
142
136
 
143
137
  expect(result).toMatchSnapshot();
144
138
  });
145
139
 
146
- test('updates link details by forward key', async () => {
147
- const oldFile = schemaStr(
148
- ` todos: i.entity({
140
+ test('updates link details', async () => {
141
+ const oldFile = `
142
+ import { i } from '@instantdb/core';
143
+
144
+ const _schema = i.schema({
145
+ entities: {
146
+ todos: i.entity({
149
147
  title: i.string(),
150
148
  }),
151
149
  users: i.entity({
152
150
  email: i.string(),
153
- }),`,
154
- ` todoOwner: {
151
+ }),
152
+ },
153
+ links: {
154
+ todoOwner: {
155
155
  forward: { on: 'todos', has: 'one', label: 'owner' },
156
156
  reverse: { on: 'users', has: 'many', label: 'todos' },
157
- },`,
158
- );
157
+ },
158
+ },
159
+ rooms: {},
160
+ });
161
+
162
+ export default _schema;
163
+ `;
159
164
  const serverSchema = i.schema({
160
165
  entities: {
161
166
  todos: i.entity({ title: i.string() }),
@@ -180,14 +185,18 @@ test('updates link details by forward key', async () => {
180
185
  },
181
186
  });
182
187
 
183
- const result = await runUpdate(oldFile, serverSchema);
188
+ const result = await update(oldFile, serverSchema);
184
189
 
185
190
  expect(result).toMatchSnapshot();
186
191
  });
187
192
 
188
193
  test('removes a link with surrounding comments and commas', async () => {
189
- const oldFile = schemaStr(
190
- ` todos: i.entity({
194
+ const oldFile = `
195
+ import { i } from '@instantdb/core';
196
+
197
+ const _schema = i.schema({
198
+ entities: {
199
+ todos: i.entity({
191
200
  title: i.string(),
192
201
  }),
193
202
  users: i.entity({
@@ -195,8 +204,10 @@ test('removes a link with surrounding comments and commas', async () => {
195
204
  }),
196
205
  projects: i.entity({
197
206
  name: i.string(),
198
- }),`,
199
- ` // owner link
207
+ }),
208
+ },
209
+ links: {
210
+ // owner link
200
211
  todoOwner: {
201
212
  forward: { on: 'todos', has: 'one', label: 'owner' },
202
213
  reverse: { on: 'users', has: 'many', label: 'todos' },
@@ -205,8 +216,13 @@ test('removes a link with surrounding comments and commas', async () => {
205
216
  projectTodos: {
206
217
  forward: { on: 'projects', has: 'many', label: 'todos' },
207
218
  reverse: { on: 'todos', has: 'one', label: 'project' },
208
- },`,
209
- );
219
+ },
220
+ },
221
+ rooms: {},
222
+ });
223
+
224
+ export default _schema;
225
+ `;
210
226
  const serverSchema = i.schema({
211
227
  entities: {
212
228
  todos: i.entity({ title: i.string() }),
@@ -221,19 +237,29 @@ test('removes a link with surrounding comments and commas', async () => {
221
237
  },
222
238
  });
223
239
 
224
- const result = await runUpdate(oldFile, serverSchema);
240
+ const result = await update(oldFile, serverSchema);
225
241
 
226
242
  expect(result).toMatchSnapshot();
227
243
  });
228
244
 
229
245
  test('updates single-line entity in place', async () => {
230
- const oldFile = schemaStr(
231
- ` projects: i.entity({ name: i.string() }),
246
+ const oldFile = `
247
+ import { i } from '@instantdb/core';
248
+
249
+ const _schema = i.schema({
250
+ entities: {
251
+ projects: i.entity({ name: i.string() }),
232
252
  todos: i.entity({
233
253
  title: i.string(),
234
- }),`,
235
- '',
236
- );
254
+ }),
255
+ },
256
+ links: {
257
+ },
258
+ rooms: {},
259
+ });
260
+
261
+ export default _schema;
262
+ `;
237
263
  const serverSchema = i.schema({
238
264
  entities: {
239
265
  projects: i.entity({
@@ -247,19 +273,29 @@ test('updates single-line entity in place', async () => {
247
273
  links: {},
248
274
  });
249
275
 
250
- const result = await runUpdate(oldFile, serverSchema);
276
+ const result = await update(oldFile, serverSchema);
251
277
 
252
278
  expect(result).toMatchSnapshot();
253
279
  });
254
280
 
255
281
  test('inserts attrs into multi-line entities with indentation', async () => {
256
- const oldFile = schemaStr(
257
- ` todos: i.entity({
282
+ const oldFile = `
283
+ import { i } from '@instantdb/core';
284
+
285
+ const _schema = i.schema({
286
+ entities: {
287
+ todos: i.entity({
258
288
  title: i.string(),
259
289
  done: i.boolean().optional(),
260
- }),`,
261
- '',
262
- );
290
+ }),
291
+ },
292
+ links: {
293
+ },
294
+ rooms: {},
295
+ });
296
+
297
+ export default _schema;
298
+ `;
263
299
  const serverSchema = i.schema({
264
300
  entities: {
265
301
  todos: i.entity({
@@ -271,14 +307,18 @@ test('inserts attrs into multi-line entities with indentation', async () => {
271
307
  links: {},
272
308
  });
273
309
 
274
- const result = await runUpdate(oldFile, serverSchema);
310
+ const result = await update(oldFile, serverSchema);
275
311
 
276
312
  expect(result).toMatchSnapshot();
277
313
  });
278
314
 
279
315
  test('handles quoted keys for entities, attrs, and links', async () => {
280
- const oldFile = schemaStr(
281
- ` todos: i.entity({
316
+ const oldFile = `
317
+ import { i } from '@instantdb/core';
318
+
319
+ const _schema = i.schema({
320
+ entities: {
321
+ todos: i.entity({
282
322
  title: i.string(),
283
323
  }),
284
324
  users: i.entity({
@@ -286,9 +326,15 @@ test('handles quoted keys for entities, attrs, and links', async () => {
286
326
  }),
287
327
  'user-profiles': i.entity({
288
328
  'display-name': i.string(),
289
- }),`,
290
- '',
291
- );
329
+ }),
330
+ },
331
+ links: {
332
+ },
333
+ rooms: {},
334
+ });
335
+
336
+ export default _schema;
337
+ `;
292
338
  const serverSchema = i.schema({
293
339
  entities: {
294
340
  todos: i.entity({ title: i.string() }),
@@ -306,21 +352,31 @@ test('handles quoted keys for entities, attrs, and links', async () => {
306
352
  },
307
353
  });
308
354
 
309
- const result = await runUpdate(oldFile, serverSchema);
355
+ const result = await update(oldFile, serverSchema);
310
356
 
311
357
  expect(result).toMatchSnapshot();
312
358
  });
313
359
 
314
360
  test('adds a link when links object is empty', async () => {
315
- const oldFile = schemaStr(
316
- ` todos: i.entity({
361
+ const oldFile = `
362
+ import { i } from '@instantdb/core';
363
+
364
+ const _schema = i.schema({
365
+ entities: {
366
+ todos: i.entity({
317
367
  title: i.string(),
318
368
  }),
319
369
  users: i.entity({
320
370
  email: i.string(),
321
- }),`,
322
- '',
323
- );
371
+ }),
372
+ },
373
+ links: {
374
+ },
375
+ rooms: {},
376
+ });
377
+
378
+ export default _schema;
379
+ `;
324
380
  const serverSchema = i.schema({
325
381
  entities: {
326
382
  todos: i.entity({ title: i.string() }),
@@ -334,24 +390,35 @@ test('adds a link when links object is empty', async () => {
334
390
  },
335
391
  });
336
392
 
337
- const result = await runUpdate(oldFile, serverSchema);
393
+ const result = await update(oldFile, serverSchema);
338
394
 
339
395
  expect(result).toMatchSnapshot();
340
396
  });
341
397
 
342
398
  test('removes the last link cleanly', async () => {
343
- const oldFile = schemaStr(
344
- ` todos: i.entity({
399
+ const oldFile = `
400
+ import { i } from '@instantdb/core';
401
+
402
+ const _schema = i.schema({
403
+ entities: {
404
+ todos: i.entity({
345
405
  title: i.string(),
346
406
  }),
347
407
  users: i.entity({
348
408
  email: i.string(),
349
- }),`,
350
- ` todoOwner: {
409
+ }),
410
+ },
411
+ links: {
412
+ todoOwner: {
351
413
  forward: { on: 'todos', has: 'one', label: 'owner' },
352
414
  reverse: { on: 'users', has: 'many', label: 'todos' },
353
- },`,
354
- );
415
+ },
416
+ },
417
+ rooms: {},
418
+ });
419
+
420
+ export default _schema;
421
+ `;
355
422
  const serverSchema = i.schema({
356
423
  entities: {
357
424
  todos: i.entity({ title: i.string() }),
@@ -360,7 +427,12 @@ test('removes the last link cleanly', async () => {
360
427
  links: {},
361
428
  });
362
429
 
363
- const result = await runUpdate(oldFile, serverSchema);
430
+ const result = await update(oldFile, serverSchema);
364
431
 
365
432
  expect(result).toMatchSnapshot();
366
433
  });
434
+
435
+ async function update(oldFile: string, serverSchema: any) {
436
+ const localSchema = schemaTypescriptFileToInstantSchema(oldFile);
437
+ return updateSchemaFile(oldFile, localSchema, serverSchema);
438
+ }
@@ -127,7 +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(insertProperty(content, entity.attrsObj, propText, indent));
130
+ edits.push(insertPropertyExpandingSingleLine(content, entity.attrsObj, propText, indent));
131
131
  }
132
132
  }
133
133
  for (const [entityName, attrs] of changeBuckets.updateAttrs) {
@@ -519,6 +519,23 @@ function indentValueAfterFirstLine(value, indent) {
519
519
  ...lines.slice(1).map((line) => (line ? indent + line : line)),
520
520
  ].join('\n');
521
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
+ }
522
539
  function normalizeEmptyLinksObject(content) {
523
540
  let ast;
524
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(insertProperty(content, entity.attrsObj, propText, indent));\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 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.20386736818.1",
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/core": "0.22.95-experimental.surgical.20386736818.1",
45
- "@instantdb/platform": "0.22.95-experimental.surgical.20386736818.1",
46
- "@instantdb/version": "0.22.95-experimental.surgical.20386736818.1"
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",
@@ -209,7 +209,14 @@ function collectEntityEdits(
209
209
  const attrDef = entityDef.attrs?.[attrName];
210
210
  if (!attrDef) continue;
211
211
  const propText = renderAttrProperty(attrName, attrDef);
212
- edits.push(insertProperty(content, entity.attrsObj, propText, indent));
212
+ edits.push(
213
+ insertPropertyExpandingSingleLine(
214
+ content,
215
+ entity.attrsObj,
216
+ propText,
217
+ indent,
218
+ ),
219
+ );
213
220
  }
214
221
  }
215
222
 
@@ -646,6 +653,33 @@ function indentValueAfterFirstLine(value: string, indent: string) {
646
653
  ].join('\n');
647
654
  }
648
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
+
649
683
  function normalizeEmptyLinksObject(content: string) {
650
684
  let ast: any;
651
685
  try {