mapples 0.2.0-beta.1 → 0.2.0-beta.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (168) hide show
  1. package/README.md +133 -22
  2. package/dist/adopt/scan.d.ts +8 -2
  3. package/dist/adopt/scan.js +31 -13
  4. package/dist/adopt/scan.js.map +1 -1
  5. package/dist/api/agent.d.ts +85 -0
  6. package/dist/api/agent.js +92 -0
  7. package/dist/api/agent.js.map +1 -0
  8. package/dist/api/client.d.ts +12 -1
  9. package/dist/api/client.js +23 -2
  10. package/dist/api/client.js.map +1 -1
  11. package/dist/api/commit.d.ts +9 -0
  12. package/dist/api/commit.js +33 -2
  13. package/dist/api/commit.js.map +1 -1
  14. package/dist/api/errors.js +12 -2
  15. package/dist/api/errors.js.map +1 -1
  16. package/dist/api/objects.d.ts +36 -5
  17. package/dist/api/objects.js +176 -10
  18. package/dist/api/objects.js.map +1 -1
  19. package/dist/api/poll.d.ts +5 -3
  20. package/dist/api/poll.js +17 -6
  21. package/dist/api/poll.js.map +1 -1
  22. package/dist/api/txPlan.d.ts +15 -0
  23. package/dist/api/txPlan.js +196 -0
  24. package/dist/api/txPlan.js.map +1 -0
  25. package/dist/assets/assets.d.ts +9 -0
  26. package/dist/assets/assets.js +33 -4
  27. package/dist/assets/assets.js.map +1 -1
  28. package/dist/codegen/emit.d.ts +4 -7
  29. package/dist/codegen/emit.js +10 -29
  30. package/dist/codegen/emit.js.map +1 -1
  31. package/dist/codegen/imports.d.ts +8 -15
  32. package/dist/codegen/imports.js +27 -72
  33. package/dist/codegen/imports.js.map +1 -1
  34. package/dist/codegen/instances.d.ts +5 -0
  35. package/dist/codegen/instances.js +30 -0
  36. package/dist/codegen/instances.js.map +1 -0
  37. package/dist/codegen/styles.d.ts +1 -0
  38. package/dist/codegen/styles.js +3 -0
  39. package/dist/codegen/styles.js.map +1 -0
  40. package/dist/commands/agent.d.ts +2 -0
  41. package/dist/commands/agent.js +87 -0
  42. package/dist/commands/agent.js.map +1 -0
  43. package/dist/commands/create.js +1 -0
  44. package/dist/commands/create.js.map +1 -1
  45. package/dist/commands/impl/adoptImpl.js +3 -0
  46. package/dist/commands/impl/adoptImpl.js.map +1 -1
  47. package/dist/commands/impl/agentImpl.d.ts +23 -0
  48. package/dist/commands/impl/agentImpl.js +426 -0
  49. package/dist/commands/impl/agentImpl.js.map +1 -0
  50. package/dist/commands/impl/createImpl.js +31 -4
  51. package/dist/commands/impl/createImpl.js.map +1 -1
  52. package/dist/commands/impl/initImpl.js +28 -4
  53. package/dist/commands/impl/initImpl.js.map +1 -1
  54. package/dist/commands/impl/syncImpl.js +30 -5
  55. package/dist/commands/impl/syncImpl.js.map +1 -1
  56. package/dist/commands/init.js +1 -0
  57. package/dist/commands/init.js.map +1 -1
  58. package/dist/index.js +12 -1
  59. package/dist/index.js.map +1 -1
  60. package/dist/merge/applyOps.d.ts +5 -2
  61. package/dist/merge/applyOps.js +75 -32
  62. package/dist/merge/applyOps.js.map +1 -1
  63. package/dist/merge/childrenOrder.d.ts +13 -0
  64. package/dist/merge/childrenOrder.js +51 -0
  65. package/dist/merge/childrenOrder.js.map +1 -0
  66. package/dist/merge/diff.d.ts +20 -1
  67. package/dist/merge/diff.js +77 -17
  68. package/dist/merge/diff.js.map +1 -1
  69. package/dist/merge/threeWay.d.ts +2 -2
  70. package/dist/merge/threeWay.js +74 -10
  71. package/dist/merge/threeWay.js.map +1 -1
  72. package/dist/merge/toEdits.d.ts +1 -3
  73. package/dist/merge/toEdits.js +3 -91
  74. package/dist/merge/toEdits.js.map +1 -1
  75. package/dist/nav/navigatorTree.d.ts +78 -0
  76. package/dist/nav/navigatorTree.js +410 -0
  77. package/dist/nav/navigatorTree.js.map +1 -0
  78. package/dist/nav/placement.d.ts +53 -0
  79. package/dist/nav/placement.js +260 -0
  80. package/dist/nav/placement.js.map +1 -0
  81. package/dist/nav/routeTree.d.ts +8 -2
  82. package/dist/nav/routeTree.js +79 -151
  83. package/dist/nav/routeTree.js.map +1 -1
  84. package/dist/nav/screenOptions.d.ts +15 -0
  85. package/dist/nav/screenOptions.js +213 -0
  86. package/dist/nav/screenOptions.js.map +1 -0
  87. package/dist/project/agentState.d.ts +30 -0
  88. package/dist/project/agentState.js +42 -0
  89. package/dist/project/agentState.js.map +1 -0
  90. package/dist/project/baseStore.d.ts +19 -1
  91. package/dist/project/baseStore.js +28 -0
  92. package/dist/project/baseStore.js.map +1 -1
  93. package/dist/project/componentsMap.d.ts +7 -0
  94. package/dist/project/componentsMap.js +21 -0
  95. package/dist/project/componentsMap.js.map +1 -0
  96. package/dist/project/config.d.ts +12 -3
  97. package/dist/project/config.js +11 -2
  98. package/dist/project/config.js.map +1 -1
  99. package/dist/project/env.d.ts +10 -3
  100. package/dist/project/env.js +23 -5
  101. package/dist/project/env.js.map +1 -1
  102. package/dist/project/pagesMap.d.ts +2 -0
  103. package/dist/project/pagesMap.js.map +1 -1
  104. package/dist/project/secret.d.ts +6 -2
  105. package/dist/project/secret.js +11 -5
  106. package/dist/project/secret.js.map +1 -1
  107. package/dist/services/adoptService.d.ts +3 -0
  108. package/dist/services/adoptService.js +357 -38
  109. package/dist/services/adoptService.js.map +1 -1
  110. package/dist/services/agentInstall.d.ts +80 -0
  111. package/dist/services/agentInstall.js +309 -0
  112. package/dist/services/agentInstall.js.map +1 -0
  113. package/dist/services/agentLease.d.ts +2 -0
  114. package/dist/services/agentLease.js +32 -0
  115. package/dist/services/agentLease.js.map +1 -0
  116. package/dist/services/clientFactory.d.ts +2 -0
  117. package/dist/services/clientFactory.js +20 -3
  118. package/dist/services/clientFactory.js.map +1 -1
  119. package/dist/services/doctorService.js +77 -66
  120. package/dist/services/doctorService.js.map +1 -1
  121. package/dist/services/scaffold.js +4 -0
  122. package/dist/services/scaffold.js.map +1 -1
  123. package/dist/services/syncEngine.d.ts +7 -0
  124. package/dist/services/syncEngine.js +719 -306
  125. package/dist/services/syncEngine.js.map +1 -1
  126. package/dist/style/theme.js +17 -1
  127. package/dist/style/theme.js.map +1 -1
  128. package/dist/types.d.ts +51 -2
  129. package/dist/types.js +25 -0
  130. package/dist/types.js.map +1 -1
  131. package/dist/ui/report.d.ts +15 -0
  132. package/dist/ui/report.js +30 -0
  133. package/dist/ui/report.js.map +1 -1
  134. package/package.json +3 -2
  135. package/templates/agent/agents-md/AGENTS.md +8 -0
  136. package/templates/agent/claude/CLAUDE.md +7 -0
  137. package/templates/agent/claude/mcp.json +11 -0
  138. package/templates/agent/claude/settings.json +26 -0
  139. package/templates/agent/codex/config.toml +6 -0
  140. package/templates/agent/codex/hooks.json +26 -0
  141. package/templates/agent/cursor/hooks.json +9 -0
  142. package/templates/agent/cursor/mcp.json +10 -0
  143. package/templates/agent/mapples.md +124 -0
  144. package/templates/agent/skills/mapples-conventions/SKILL.md +137 -0
  145. package/templates/agent/skills/mapples-design/SKILL.md +235 -0
  146. package/templates/agent/skills/mapples-design/reference/component-library.md +128 -0
  147. package/templates/agent/skills/mapples-design/reference/design-tokens.md +132 -0
  148. package/templates/agent/skills/mapples-design/reference/layout-contract.md +227 -0
  149. package/templates/agent/skills/mapples-design/reference/lint-checklist.md +51 -0
  150. package/templates/agent/skills/mapples-design/reference/plan.md +95 -0
  151. package/templates/agent/skills/mapples-design/reference/playbooks/empty-states.md +14 -0
  152. package/templates/agent/skills/mapples-design/reference/playbooks/forms-and-auth.md +22 -0
  153. package/templates/agent/skills/mapples-design/reference/playbooks/home-dashboard.md +14 -0
  154. package/templates/agent/skills/mapples-design/reference/playbooks/list-and-detail.md +18 -0
  155. package/templates/agent/skills/mapples-design/reference/playbooks/microcopy.md +20 -0
  156. package/templates/agent/skills/mapples-design/reference/playbooks/navigation-chrome.md +21 -0
  157. package/templates/agent/skills/mapples-design/reference/playbooks/onboarding-flow.md +15 -0
  158. package/templates/agent/skills/mapples-design/reference/playbooks/screen-flow-wiring.md +37 -0
  159. package/templates/agent/skills/mapples-design/reference/playbooks/settings-profile.md +16 -0
  160. package/templates/agent/skills/mapples-design/reference/playbooks/stats-and-progress.md +17 -0
  161. package/templates/agent/skills/mapples-design/reference/playbooks/visual-hierarchy.md +18 -0
  162. package/templates/agent/skills/mapples-design/reference/style-guides.md +92 -0
  163. package/templates/agent/skills/mapples-sync/SKILL.md +93 -0
  164. package/templates/app/_layout.tsx +3 -0
  165. package/templates/app.json +0 -1
  166. package/templates/gitignore +2 -0
  167. package/templates/mapples/sid.d.ts +6 -0
  168. package/templates/package.json +12 -10
@@ -1,22 +1,47 @@
1
1
  import chalk from 'chalk';
2
2
  import { runSyncEngine } from '../../services/syncEngine.js';
3
+ import { touchAgentLease } from '../../services/agentLease.js';
3
4
  import { clientForApp } from '../../services/clientFactory.js';
4
- import { renderReport } from '../../ui/report.js';
5
+ import { readHead } from '../../project/head.js';
6
+ import { emptyReport, isAlreadyRemoved, renderReport } from '../../ui/report.js';
5
7
  export async function runSync(opts) {
6
8
  const root = process.cwd();
7
9
  const client = clientForApp(root, opts);
10
+ const adopt = opts.adopt !== false;
11
+ const leaseNotes = emptyReport();
12
+ await touchAgentLease(root, leaseNotes, opts);
13
+ // Adoption goes first once the project has a base: a new component file
14
+ // and the managed page that already uses it then link in the same run
15
+ // (the merge tags the usage as an instance of the component just adopted).
16
+ // The very first sync bootstraps before anything can be adopted.
17
+ let adoption = null;
18
+ if (adopt && readHead(root)) {
19
+ const { proposeAdoptions } = await import('../../services/adoptService.js');
20
+ adoption = emptyReport();
21
+ await proposeAdoptions({ root, client, report: adoption, yes: opts.yes === true });
22
+ }
8
23
  const report = await runSyncEngine({ root, client });
9
- if (opts.adopt !== false) {
24
+ if (adoption) {
25
+ report.files.unshift(...adoption.files);
26
+ report.notes.unshift(...adoption.notes);
27
+ report.warnings.unshift(...adoption.warnings);
28
+ report.pushedOps += adoption.pushedOps;
29
+ }
30
+ else if (adopt) {
10
31
  const { proposeAdoptions } = await import('../../services/adoptService.js');
11
32
  await proposeAdoptions({ root, client, report, yes: opts.yes === true });
12
33
  }
34
+ await touchAgentLease(root, leaseNotes, opts);
35
+ report.notes.push(...leaseNotes.notes);
36
+ const exitCode = report.conflicts.length > 0 ? 2 : 0;
37
+ if (exitCode !== 0)
38
+ process.exitCode = exitCode;
13
39
  if (opts.json === true) {
14
- console.log(JSON.stringify(report, null, 2));
40
+ const dropped = report.dropped.map((d) => isAlreadyRemoved(d) ? { ...d, alreadyRemoved: true } : d);
41
+ console.log(JSON.stringify({ ...report, dropped, exitCode }, null, 2));
15
42
  return;
16
43
  }
17
44
  console.log(chalk.bold('\nmapples sync'));
18
45
  console.log(renderReport(report));
19
- if (report.conflicts.length > 0)
20
- process.exitCode = 2;
21
46
  }
22
47
  //# sourceMappingURL=syncImpl.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"syncImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/syncImpl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,IAA6B;IACzD,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAExC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAErD,IAAI,IAAI,CAAC,KAAK,KAAK,KAAK,EAAE,CAAC;QACzB,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;QAC5E,MAAM,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;IAClC,IAAI,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACxD,CAAC"}
1
+ {"version":3,"file":"syncImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/syncImpl.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,7 @@ export function registerInit(program) {
5
5
  .description('Link an existing Expo app to a Mapples project')
6
6
  .option('--secret <secret>', 'project API secret (Creator: Project → Settings)')
7
7
  .option('--api-url <url>', 'Mapples API base URL')
8
+ .option('--agent <name>', 'also set up an AI agent: claude (Claude Code) | cursor | codex (ChatGPT) — skills, instructions, MCP entry')
8
9
  .addOption(new Option('--denv <env>').hideHelp()) // internal: dev|staging|prod
9
10
  .option('--json', 'machine-readable output')
10
11
  .action(async (opts) => {
@@ -1 +1 @@
1
- {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,mBAAmB,EAAE,kDAAkD,CAAC;SAC/E,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;SACjD,SAAS,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,6BAA6B;SAC9E,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,IAA6B,EAAE,EAAE;QAC9C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACvD,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACP,CAAC"}
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,MAAM,EAAE,MAAM,WAAW,CAAC;AAE5C,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,mBAAmB,EAAE,kDAAkD,CAAC;SAC/E,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;SACjD,MAAM,CACL,gBAAgB,EAChB,4GAA4G,CAC7G;SACA,SAAS,CAAC,IAAI,MAAM,CAAC,cAAc,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,6BAA6B;SAC9E,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,IAA6B,EAAE,EAAE;QAC9C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,oBAAoB,CAAC,CAAC;QACvD,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;AACP,CAAC"}
package/dist/index.js CHANGED
@@ -6,16 +6,27 @@ import { registerInit } from './commands/init.js';
6
6
  import { registerSync } from './commands/sync.js';
7
7
  import { registerAdopt } from './commands/adopt.js';
8
8
  import { registerDoctor } from './commands/doctor.js';
9
+ import { registerAgent } from './commands/agent.js';
9
10
  const program = new Command();
10
11
  program
11
12
  .name('mapples')
12
13
  .description('Mapples CLI — two-way code sync between Mapples Creator and your Expo project')
13
- .version(cliVersion());
14
+ .version(cliVersion())
15
+ .addHelpText('after', [
16
+ '',
17
+ 'Exit codes:',
18
+ ' 0 ok',
19
+ ' 1 error',
20
+ ' 2 sync finished with conflicts (files deprecated, never overwritten)',
21
+ ' 3 agent lease gone (session expired, released or disconnected in Creator)',
22
+ ' 4 project busy (another agent session holds it — `agent start --takeover`)',
23
+ ].join('\n'));
14
24
  registerCreate(program);
15
25
  registerInit(program);
16
26
  registerSync(program);
17
27
  registerAdopt(program);
18
28
  registerDoctor(program);
29
+ registerAgent(program);
19
30
  program.parseAsync(process.argv).catch((err) => {
20
31
  // Top-level failure surface: print and exit non-zero. Never swallow.
21
32
  console.error(err instanceof Error ? err.message : String(err));
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,+EAA+E,CAAC;KAC5F,OAAO,CAAC,UAAU,EAAE,CAAC,CAAC;AAEzB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,cAAc,CAAC,OAAO,CAAC,CAAC;AAExB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACtD,qEAAqE;IACrE,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAEpD,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,+EAA+E,CAAC;KAC5F,OAAO,CAAC,UAAU,EAAE,CAAC;KACrB,WAAW,CACV,OAAO,EACP;IACE,EAAE;IACF,aAAa;IACb,SAAS;IACT,YAAY;IACZ,yEAAyE;IACzE,8EAA8E;IAC9E,+EAA+E;CAChF,CAAC,IAAI,CAAC,IAAI,CAAC,CACb,CAAC;AAEJ,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,YAAY,CAAC,OAAO,CAAC,CAAC;AACtB,aAAa,CAAC,OAAO,CAAC,CAAC;AACvB,cAAc,CAAC,OAAO,CAAC,CAAC;AACxB,aAAa,CAAC,OAAO,CAAC,CAAC;AAEvB,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;IACtD,qEAAqE;IACrE,OAAO,CAAC,KAAK,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IAChE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
@@ -1,11 +1,14 @@
1
- import type { JpatchOp, RenderDomNode } from '../types.js';
1
+ import { type JpatchOp, type RenderDomNode } from '../types.js';
2
2
  /**
3
3
  * Apply RenderNode ops to one page tree. Ops whose target is not in this tree
4
4
  * are ignored (they belong to another page) and returned in `skipped` so the
5
- * caller can route them; nothing is dropped silently.
5
+ * caller can route them; nothing is dropped silently. `warnings` carries
6
+ * CHILDREN_REBASED when a directive resolved differently from its literal
7
+ * intent, exactly when the server flags it.
6
8
  */
7
9
  export declare function applyNodeOps(root: RenderDomNode | null, ops: JpatchOp[]): {
8
10
  root: RenderDomNode | null;
9
11
  skipped: JpatchOp[];
10
12
  orphans: Map<string, RenderDomNode>;
13
+ warnings: string[];
11
14
  };
@@ -1,5 +1,7 @@
1
1
  // Apply RenderNode ops to a page tree (the pull direction). The inverse of
2
2
  // diffTree: applyNodeOps(base, diffTree(base, x)) ≡ x.
3
+ import { sidecarFilled, sidecarOf, } from '../types.js';
4
+ import { resolveChildOrder } from './childrenOrder.js';
3
5
  import { applyMergePatch } from './mergePatch.js';
4
6
  function buildState(root) {
5
7
  const index = new Map();
@@ -19,13 +21,16 @@ function buildState(root) {
19
21
  /**
20
22
  * Apply RenderNode ops to one page tree. Ops whose target is not in this tree
21
23
  * are ignored (they belong to another page) and returned in `skipped` so the
22
- * caller can route them; nothing is dropped silently.
24
+ * caller can route them; nothing is dropped silently. `warnings` carries
25
+ * CHILDREN_REBASED when a directive resolved differently from its literal
26
+ * intent, exactly when the server flags it.
23
27
  */
24
28
  export function applyNodeOps(root, ops) {
25
29
  const state = buildState(root);
26
30
  const skipped = [];
27
31
  // Created-but-not-yet-linked nodes park here until a children directive links them.
28
32
  const orphans = new Map();
33
+ let rebased = false;
29
34
  for (const op of ops) {
30
35
  if (op.entity !== 'RenderNode') {
31
36
  skipped.push(op);
@@ -42,9 +47,26 @@ export function applyNodeOps(root, ops) {
42
47
  type: data.type,
43
48
  props: data.props ?? {},
44
49
  children: [],
50
+ ...sidecarOf(op.data),
45
51
  };
46
52
  state.index.set(id, node);
47
- orphans.set(id, node);
53
+ // A create may link itself under its parent (RFC-0001 §5 create.data.parent/index).
54
+ const parent = typeof data.parent === 'string' ? state.index.get(data.parent) : undefined;
55
+ if (parent) {
56
+ const at = typeof data.index === 'number'
57
+ ? Math.max(0, Math.min(data.index, parent.children.length))
58
+ : parent.children.length;
59
+ parent.children.splice(at, 0, node);
60
+ state.parents.set(id, parent.sid);
61
+ }
62
+ else {
63
+ if (typeof data.parent === 'string') {
64
+ skipped.push(op); // parent lives in another tree — route it there
65
+ state.index.delete(id);
66
+ continue;
67
+ }
68
+ orphans.set(id, node);
69
+ }
48
70
  continue;
49
71
  }
50
72
  const id = op.id;
@@ -79,12 +101,25 @@ export function applyNodeOps(root, ops) {
79
101
  }
80
102
  // update
81
103
  if (op.patch) {
82
- const patched = applyMergePatch({ type: node.type, props: node.props }, op.patch);
104
+ const patched = applyMergePatch({ type: node.type, props: node.props, ...sidecarFilled(node) }, op.patch);
83
105
  node.type = patched.type;
84
106
  node.props = patched.props ?? {};
107
+ const sidecar = sidecarOf(patched);
108
+ if (sidecar.refProps)
109
+ node.refProps = sidecar.refProps;
110
+ else
111
+ delete node.refProps;
112
+ if (sidecar.dataProps)
113
+ node.dataProps = sidecar.dataProps;
114
+ else
115
+ delete node.dataProps;
116
+ if (sidecar.actionProps)
117
+ node.actionProps = sidecar.actionProps;
118
+ else
119
+ delete node.actionProps;
85
120
  }
86
- if (op.children) {
87
- applyChildrenDirective(state, node, op.children, orphans);
121
+ if (op.children && applyChildrenDirective(state, node, op.children, orphans)) {
122
+ rebased = true;
88
123
  }
89
124
  }
90
125
  // Root replacement: the old root was deleted and a new tree created with no
@@ -96,39 +131,47 @@ export function applyNodeOps(root, ops) {
96
131
  orphans.clear();
97
132
  }
98
133
  }
99
- return { root: state.root, skipped, orphans };
134
+ return { root: state.root, skipped, orphans, warnings: rebased ? ['CHILDREN_REBASED'] : [] };
100
135
  }
136
+ /**
137
+ * Resolve a children directive the way the server does (RFC-0001 §5.2,
138
+ * service--mapplesorg #724/#725): order via resolveChildOrder, then every ref
139
+ * must resolve in this tree and must not be the target or one of its
140
+ * ancestors — such a ref is skipped. A ref linked elsewhere is reparented; a
141
+ * child left out parks in `orphans`. Returns whether the result was rebased.
142
+ */
101
143
  function applyChildrenDirective(state, node, directive, orphans) {
102
- if (directive.remove) {
103
- for (const ref of directive.remove) {
104
- const removed = node.children.find((c) => c.sid === ref);
105
- node.children = node.children.filter((c) => c.sid !== ref);
106
- if (removed) {
107
- state.parents.delete(ref);
108
- orphans.set(ref, removed); // may be re-linked under a new parent
109
- }
110
- }
144
+ const current = node.children.map((c) => c.sid);
145
+ const resolved = resolveChildOrder(current, directive);
146
+ let rebased = resolved.rebased;
147
+ const lineage = new Set();
148
+ for (let sid = node.sid; sid !== undefined; sid = state.parents.get(sid)) {
149
+ lineage.add(sid);
111
150
  }
112
- if (directive.insert) {
113
- for (const ins of directive.insert) {
114
- const child = state.index.get(ins.ref) ?? orphans.get(ins.ref);
115
- if (!child)
116
- throw new Error(`children.insert references unknown node ${ins.ref}`);
117
- orphans.delete(ins.ref);
118
- const at = Math.max(0, Math.min(ins.at, node.children.length));
119
- node.children.splice(at, 0, child);
120
- state.parents.set(ins.ref, node.sid);
151
+ const kept = [];
152
+ for (const sid of resolved.order) {
153
+ const child = state.index.get(sid) ?? orphans.get(sid);
154
+ if (!child || lineage.has(sid)) {
155
+ rebased = true;
156
+ continue;
157
+ }
158
+ if (!current.includes(sid)) {
159
+ const oldParent = state.parents.get(sid);
160
+ const parent = oldParent === undefined ? undefined : state.index.get(oldParent);
161
+ if (parent)
162
+ parent.children = parent.children.filter((c) => c.sid !== sid);
163
+ orphans.delete(sid);
121
164
  }
165
+ state.parents.set(sid, node.sid);
166
+ kept.push(child);
122
167
  }
123
- if (directive.move) {
124
- for (const mv of directive.move) {
125
- const from = node.children.findIndex((c) => c.sid === mv.ref);
126
- if (from === -1)
127
- continue; // clamped server-side; mirror the tolerance
128
- const [child] = node.children.splice(from, 1);
129
- const to = Math.max(0, Math.min(mv.to, node.children.length));
130
- node.children.splice(to, 0, child);
168
+ for (const child of node.children) {
169
+ if (!kept.includes(child)) {
170
+ state.parents.delete(child.sid);
171
+ orphans.set(child.sid, child); // may be re-linked under a new parent
131
172
  }
132
173
  }
174
+ node.children = kept;
175
+ return rebased;
133
176
  }
134
177
  //# sourceMappingURL=applyOps.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"applyOps.js","sourceRoot":"","sources":["../../src/merge/applyOps.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"applyOps.js","sourceRoot":"","sources":["../../src/merge/applyOps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ChildrenDirective } from '../types.js';
2
+ export interface ChildOrder {
3
+ order: string[];
4
+ /** The result diverges from the directive's literal intent (CHILDREN_REBASED). */
5
+ rebased: boolean;
6
+ }
7
+ /**
8
+ * `set` is wholesale and exclusive; the first occurrence of each ref wins.
9
+ * Otherwise remove → move → insert: a missing remove/move ref is skipped,
10
+ * `move.to` and `insert.at` clamp to bounds, and inserting a present ref moves
11
+ * it. Ref resolution (unknown refs, cycles) is the caller's second pass.
12
+ */
13
+ export declare function resolveChildOrder(children: string[], directive: ChildrenDirective): ChildOrder;
@@ -0,0 +1,51 @@
1
+ // Child-order directive resolution, identical to the backend's
2
+ // `api/canvas/tree.py` apply_children (service--mapplesorg #724, #725).
3
+ // Pull replay and the mock server both resolve directives through here, so a
4
+ // replayed tree lands exactly on HEAD.
5
+ /**
6
+ * `set` is wholesale and exclusive; the first occurrence of each ref wins.
7
+ * Otherwise remove → move → insert: a missing remove/move ref is skipped,
8
+ * `move.to` and `insert.at` clamp to bounds, and inserting a present ref moves
9
+ * it. Ref resolution (unknown refs, cycles) is the caller's second pass.
10
+ */
11
+ export function resolveChildOrder(children, directive) {
12
+ if (directive.set !== undefined) {
13
+ const order = [...new Set(directive.set)];
14
+ return { order, rebased: order.length !== directive.set.length };
15
+ }
16
+ const out = [...children];
17
+ let rebased = false;
18
+ for (const ref of directive.remove ?? []) {
19
+ const at = out.indexOf(ref);
20
+ if (at === -1) {
21
+ rebased = true;
22
+ continue;
23
+ }
24
+ out.splice(at, 1);
25
+ }
26
+ for (const mv of directive.move ?? []) {
27
+ const from = out.indexOf(mv.ref);
28
+ if (from === -1) {
29
+ rebased = true;
30
+ continue;
31
+ }
32
+ out.splice(from, 1);
33
+ const to = Math.min(mv.to, out.length);
34
+ if (to !== mv.to)
35
+ rebased = true;
36
+ out.splice(to, 0, mv.ref);
37
+ }
38
+ for (const ins of directive.insert ?? []) {
39
+ const present = out.indexOf(ins.ref);
40
+ if (present !== -1) {
41
+ out.splice(present, 1);
42
+ rebased = true;
43
+ }
44
+ const at = Math.min(ins.at, out.length);
45
+ if (at !== ins.at)
46
+ rebased = true;
47
+ out.splice(at, 0, ins.ref);
48
+ }
49
+ return { order: out, rebased };
50
+ }
51
+ //# sourceMappingURL=childrenOrder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"childrenOrder.js","sourceRoot":"","sources":["../../src/merge/childrenOrder.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,wEAAwE;AACxE,6EAA6E;AAC7E,uCAAuC;AAUvC;;;;;GAKG;AACH,MAAM,UAAU,iBAAiB,CAAC,QAAkB,EAAE,SAA4B;IAChF,IAAI,SAAS,CAAC,GAAG,KAAK,SAAS,EAAE,CAAC;QAChC,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;QAC1C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,CAAC,MAAM,KAAK,SAAS,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC;IACnE,CAAC;IACD,MAAM,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IAC1B,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACzC,MAAM,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YACd,OAAO,GAAG,IAAI,CAAC;YACf,SAAS;QACX,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;IACpB,CAAC;IACD,KAAK,MAAM,EAAE,IAAI,SAAS,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;QACjC,IAAI,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC;YAChB,OAAO,GAAG,IAAI,CAAC;YACf,SAAS;QACX,CAAC;QACD,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;QACpB,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACvC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE;YAAE,OAAO,GAAG,IAAI,CAAC;QACjC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;IAC5B,CAAC;IACD,KAAK,MAAM,GAAG,IAAI,SAAS,CAAC,MAAM,IAAI,EAAE,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACrC,IAAI,OAAO,KAAK,CAAC,CAAC,EAAE,CAAC;YACnB,GAAG,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACvB,OAAO,GAAG,IAAI,CAAC;QACjB,CAAC;QACD,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;QACxC,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE;YAAE,OAAO,GAAG,IAAI,CAAC;QAClC,GAAG,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;IAC7B,CAAC;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,CAAC;AACjC,CAAC"}
@@ -1,4 +1,4 @@
1
- import type { JpatchOp, RenderDomNode } from '../types.js';
1
+ import { type JpatchOp, type RenderDomNode } from '../types.js';
2
2
  interface Indexed {
3
3
  node: RenderDomNode;
4
4
  parentSid: string | null;
@@ -12,4 +12,23 @@ export declare function indexTree(root: RenderDomNode | null): Map<string, Index
12
12
  * `c_` sids for genuinely new nodes before diffing).
13
13
  */
14
14
  export declare function diffTree(base: RenderDomNode | null, next: RenderDomNode | null): JpatchOp[];
15
+ export interface StagedDiff {
16
+ /** Everything but the moves into new containers — one push. */
17
+ ops: JpatchOp[];
18
+ /**
19
+ * The moves into containers `ops` creates. They target those containers by
20
+ * id, and the server resolves a cid only as a reference, never as the
21
+ * target of an update — so they go in a LATER transaction, once the
22
+ * earlier one has minted the ids (the push resolves cids per transaction).
23
+ * Each move's remove and insert stay together, so no node is ever orphaned.
24
+ */
25
+ deferred: JpatchOp[];
26
+ }
27
+ /**
28
+ * `diffTree`, staged so an existing element can move into a container created
29
+ * in the same change (wrapping, grouping). Stage one creates the containers
30
+ * and applies every other change with the moved elements still under a
31
+ * surviving ancestor from `base`; stage two moves them into place.
32
+ */
33
+ export declare function diffTreeStaged(base: RenderDomNode | null, next: RenderDomNode | null): StagedDiff;
15
34
  export {};
@@ -1,6 +1,7 @@
1
1
  // Two RenderDom trees -> JpatchOp[]. RFC 7386 merge-patch for prop objects;
2
2
  // explicit children move/insert/remove directives for ordering — arrays are
3
3
  // never merge-patched (RFC-0001 invariant 7).
4
+ import { sidecarFilled, sidecarOf, } from '../types.js';
4
5
  import { buildMergePatch, deepEqual } from './mergePatch.js';
5
6
  export function indexTree(root) {
6
7
  const map = new Map();
@@ -25,29 +26,43 @@ export function diffTree(base, next) {
25
26
  const baseIdx = indexTree(base);
26
27
  const nextIdx = indexTree(next);
27
28
  const ops = [];
28
- // Creates — walk `next` top-down so parents are minted before children.
29
+ // Creates — walk `next` top-down so parents are minted before children. A
30
+ // new node under a NEW parent links itself at creation (`data.parent` +
31
+ // `data.index`, both cid-resolvable): the server only accepts DB ids as the
32
+ // target of an update, so a children directive on the new parent's cid
33
+ // would be rejected. New nodes under a surviving parent are linked by that
34
+ // parent's children directive below.
29
35
  const created = new Set();
30
- const walkCreates = (node) => {
36
+ const walkCreates = (node, parent, index) => {
31
37
  if (!baseIdx.has(node.sid)) {
32
38
  created.add(node.sid);
39
+ const underNewParent = parent !== null && created.has(parent.sid);
33
40
  ops.push({
34
41
  op: 'create',
35
42
  entity: 'RenderNode',
36
43
  cid: node.sid,
37
- data: { type: node.type, props: node.props },
44
+ data: {
45
+ type: node.type,
46
+ props: node.props,
47
+ ...sidecarOf(node),
48
+ ...(underNewParent ? { parent: parent.sid, index } : {}),
49
+ },
38
50
  });
39
51
  }
40
- for (const child of node.children)
41
- walkCreates(child);
52
+ node.children.forEach((child, i) => walkCreates(child, node, i));
42
53
  };
43
54
  if (next)
44
- walkCreates(next);
55
+ walkCreates(next, null, 0);
45
56
  // Updates on surviving nodes.
46
57
  for (const [sid, { node }] of nextIdx) {
47
58
  const baseEntry = baseIdx.get(sid);
48
59
  if (!baseEntry)
49
60
  continue;
50
- const patch = buildMergePatch({ type: baseEntry.node.type, props: baseEntry.node.props }, { type: node.type, props: node.props });
61
+ const patch = buildMergePatch({
62
+ type: baseEntry.node.type,
63
+ props: baseEntry.node.props,
64
+ ...sidecarFilled(baseEntry.node),
65
+ }, { type: node.type, props: node.props, ...sidecarFilled(node) });
51
66
  if (patch !== null) {
52
67
  ops.push({ op: 'update', entity: 'RenderNode', id: sid, patch });
53
68
  }
@@ -56,16 +71,14 @@ export function diffTree(base, next) {
56
71
  for (const [sid, { node }] of nextIdx) {
57
72
  const baseEntry = baseIdx.get(sid);
58
73
  if (!baseEntry) {
59
- // Newly created parents carry their children via inserts below? No —
60
- // created nodes get their children linked with an explicit directive too,
61
- // because `create.data` never embeds children.
62
- if (node.children.length > 0) {
63
- ops.push({
64
- op: 'update',
65
- entity: 'RenderNode',
66
- id: sid, // a cid — the server resolves refs minted earlier in this tx
67
- children: { insert: node.children.map((c, i) => ({ ref: c.sid, at: i })) },
68
- });
74
+ // A new parent's new children linked themselves at creation; a SURVIVING
75
+ // child re-parented under it still needs a directive — and an update on
76
+ // a cid is exactly what the server rejects, so it goes through the
77
+ // child's old parent (remove) and a follow-up sync (insert once the cid
78
+ // has a DB id). Surface it rather than emit an invalid op.
79
+ const adopted = node.children.filter((c) => baseIdx.has(c.sid));
80
+ if (adopted.length > 0) {
81
+ throw new Error(`node ${adopted[0].sid} moved under the new node ${sid} — move existing nodes only under existing parents, or sync twice (create first, then move)`);
69
82
  }
70
83
  continue;
71
84
  }
@@ -85,6 +98,53 @@ export function diffTree(base, next) {
85
98
  }
86
99
  return ops;
87
100
  }
101
+ /**
102
+ * Surviving nodes whose parent in `next` is a node `next` creates: moving
103
+ * an existing element into a brand-new container.
104
+ */
105
+ function adoptedByNewParents(baseIdx, nextIdx) {
106
+ return [...nextIdx]
107
+ .filter(([sid, entry]) => baseIdx.has(sid) && entry.parentSid !== null && !baseIdx.has(entry.parentSid))
108
+ .map(([sid]) => sid);
109
+ }
110
+ /**
111
+ * `diffTree`, staged so an existing element can move into a container created
112
+ * in the same change (wrapping, grouping). Stage one creates the containers
113
+ * and applies every other change with the moved elements still under a
114
+ * surviving ancestor from `base`; stage two moves them into place.
115
+ */
116
+ export function diffTreeStaged(base, next) {
117
+ const baseIdx = indexTree(base);
118
+ const nextIdx = indexTree(next);
119
+ const adopted = adoptedByNewParents(baseIdx, nextIdx);
120
+ if (adopted.length === 0 || next === null)
121
+ return { ops: diffTree(base, next), deferred: [] };
122
+ // Stage one: `next`, with each adopted element back under its nearest
123
+ // ancestor from `base` that survives as an existing node — its own base
124
+ // parent, unless that parent is deleted in `next`.
125
+ const stageOne = structuredClone(next);
126
+ const stageIdx = indexTree(stageOne);
127
+ const holders = adopted.map((sid) => {
128
+ let ancestor = baseIdx.get(sid).parentSid;
129
+ while (ancestor !== null && !(stageIdx.has(ancestor) && baseIdx.has(ancestor))) {
130
+ ancestor = baseIdx.get(ancestor).parentSid;
131
+ }
132
+ if (ancestor === null) {
133
+ throw new Error(`node ${sid} moved under a new node, and no ancestor it had survives to hold it meanwhile — sync twice (create first, then move)`);
134
+ }
135
+ return { sid, ancestor, index: baseIdx.get(sid).index };
136
+ });
137
+ for (const { sid } of holders) {
138
+ const parent = stageIdx.get(stageIdx.get(sid).parentSid).node;
139
+ parent.children = parent.children.filter((child) => child.sid !== sid);
140
+ }
141
+ for (const { sid, ancestor, index } of [...holders].sort((a, b) => a.index - b.index)) {
142
+ const holder = stageIdx.get(ancestor).node;
143
+ const at = Math.min(index, holder.children.length);
144
+ holder.children.splice(at, 0, stageIdx.get(sid).node);
145
+ }
146
+ return { ops: diffTree(base, stageOne), deferred: diffTree(stageOne, next) };
147
+ }
88
148
  function childrenDirective(baseNode, nextNode, baseIdx, nextIdx) {
89
149
  const baseIds = baseNode.children.map((c) => c.sid);
90
150
  const nextIds = nextNode.children.map((c) => c.sid);
@@ -1 +1 @@
1
- {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/merge/diff.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/merge/diff.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,4EAA4E;AAC5E,8CAA8C;AAE9C,OAAO,EACL,aAAa,EACb,SAAS,GAIV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,eAAe,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAQ7D,MAAM,UAAU,SAAS,CAAC,IAA0B;IAClD,MAAM,GAAG,GAAG,IAAI,GAAG,EAAmB,CAAC;IACvC,MAAM,IAAI,GAAG,CAAC,IAAmB,EAAE,SAAwB,EAAE,KAAa,EAAQ,EAAE;QAClF,IAAI,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,0BAA0B,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACxD,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAC9C,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAChE,CAAC,CAAC;IACF,IAAI,IAAI;QAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAC9B,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,QAAQ,CAAC,IAA0B,EAAE,IAA0B;IAC7E,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,GAAG,GAAe,EAAE,CAAC;IAE3B,0EAA0E;IAC1E,wEAAwE;IACxE,4EAA4E;IAC5E,uEAAuE;IACvE,2EAA2E;IAC3E,qCAAqC;IACrC,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;IAClC,MAAM,WAAW,GAAG,CAAC,IAAmB,EAAE,MAA4B,EAAE,KAAa,EAAQ,EAAE;QAC7F,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC3B,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACtB,MAAM,cAAc,GAAG,MAAM,KAAK,IAAI,IAAI,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YAClE,GAAG,CAAC,IAAI,CAAC;gBACP,EAAE,EAAE,QAAQ;gBACZ,MAAM,EAAE,YAAY;gBACpB,GAAG,EAAE,IAAI,CAAC,GAAG;gBACb,IAAI,EAAE;oBACJ,IAAI,EAAE,IAAI,CAAC,IAAI;oBACf,KAAK,EAAE,IAAI,CAAC,KAAK;oBACjB,GAAG,SAAS,CAAC,IAAI,CAAC;oBAClB,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;iBACzD;aACF,CAAC,CAAC;QACL,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC;IACF,IAAI,IAAI;QAAE,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IAErC,8BAA8B;IAC9B,KAAK,MAAM,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,SAAS;YAAE,SAAS;QACzB,MAAM,KAAK,GAAG,eAAe,CAC3B;YACE,IAAI,EAAE,SAAS,CAAC,IAAI,CAAC,IAAI;YACzB,KAAK,EAAE,SAAS,CAAC,IAAI,CAAC,KAAK;YAC3B,GAAG,aAAa,CAAC,SAAS,CAAC,IAAI,CAAC;SACjC,EACD,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,GAAG,aAAa,CAAC,IAAI,CAAC,EAAE,CAC/D,CAAC;QACF,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC,CAAC;QACnE,CAAC;IACH,CAAC;IAED,4CAA4C;IAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC;QACtC,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACnC,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,yEAAyE;YACzE,wEAAwE;YACxE,mEAAmE;YACnE,wEAAwE;YACxE,2DAA2D;YAC3D,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;YAChE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CACb,QAAQ,OAAO,CAAC,CAAC,CAAE,CAAC,GAAG,6BAA6B,GAAG,6FAA6F,CACrJ,CAAC;YACJ,CAAC;YACD,SAAS;QACX,CAAC;QACD,MAAM,SAAS,GAAG,iBAAiB,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;QAC5E,IAAI,SAAS,EAAE,CAAC;YACd,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED,kFAAkF;IAClF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,OAAO,EAAE,CAAC;QACnC,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC/B,MAAM,UAAU,GACd,KAAK,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC5F,IAAI,UAAU;YAAE,SAAS,CAAC,oCAAoC;QAC9D,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;GAGG;AACH,SAAS,mBAAmB,CAC1B,OAA6B,EAC7B,OAA6B;IAE7B,OAAO,CAAC,GAAG,OAAO,CAAC;SAChB,MAAM,CACL,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CACf,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,SAAS,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAChF;SACA,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC;AACzB,CAAC;AAeD;;;;;GAKG;AACH,MAAM,UAAU,cAAc,CAAC,IAA0B,EAAE,IAA0B;IACnF,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,OAAO,GAAG,mBAAmB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACtD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC;IAE9F,sEAAsE;IACtE,wEAAwE;IACxE,mDAAmD;IACnD,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;IACrC,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QAClC,IAAI,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,SAAS,CAAC;QAC3C,OAAO,QAAQ,KAAK,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC;YAC/E,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,SAAS,CAAC;QAC9C,CAAC;QACD,IAAI,QAAQ,KAAK,IAAI,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CACb,QAAQ,GAAG,sHAAsH,CAClI,CAAC;QACJ,CAAC;QACD,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,KAAK,EAAE,CAAC;IAC3D,CAAC,CAAC,CAAC;IACH,KAAK,MAAM,EAAE,GAAG,EAAE,IAAI,OAAO,EAAE,CAAC;QAC9B,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,SAAU,CAAE,CAAC,IAAI,CAAC;QACjE,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC;IACzE,CAAC;IACD,KAAK,MAAM,EAAE,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,EAAE,CAAC;QACtF,MAAM,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC;QAC5C,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACnD,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAE,CAAC,IAAI,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,EAAE,GAAG,EAAE,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,EAAE,QAAQ,EAAE,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,CAAC;AAC/E,CAAC;AAED,SAAS,iBAAiB,CACxB,QAAuB,EACvB,QAAuB,EACvB,OAA6B,EAC7B,OAA6B;IAE7B,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACpD,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAEpD,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE;QACpC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,GAAG,CAAC;IACjE,CAAC,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE;QACrC,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC9B,OAAO,KAAK,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,QAAQ,CAAC,GAAG,CAAC;IACjE,CAAC,CAAC,CAAC;IAEH,2EAA2E;IAC3E,sCAAsC;IACtC,MAAM,SAAS,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC;IAChE,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;QAC1B,MAAM,EAAE,GAAG,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC;QAC3D,SAAS,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,MAAM,UAAU,GAAG,CAAC,SAAS,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;IAElD,MAAM,SAAS,GAAsB,EAAE,CAAC;IACxC,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,uEAAuE;QACvE,yEAAyE;QACzE,8DAA8D;QAC9D,SAAS,CAAC,MAAM,GAAG,OAAO,CAAC;IAC7B,CAAC;IACD,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,SAAS,CAAC,MAAM,GAAG,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAClF,CAAC;IACD,IAAI,UAAU,EAAE,CAAC;QACf,wEAAwE;QACxE,sCAAsC;QACtC,SAAS,CAAC,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC;IAChE,CAAC;IACD,OAAO,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,MAAM,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC;AACnF,CAAC"}
@@ -1,7 +1,7 @@
1
- import type { RenderDomNode } from '../types.js';
1
+ import { type RenderDomNode } from '../types.js';
2
2
  export interface ConflictDetail {
3
3
  sid: string;
4
- reason: 'same-prop' | 'delete-vs-edit';
4
+ reason: 'same-prop' | 'delete-vs-edit' | 'source-text';
5
5
  props?: string[];
6
6
  localValue?: unknown;
7
7
  remoteValue?: unknown;