mapples 0.1.0

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 (135) hide show
  1. package/README.md +42 -0
  2. package/dist/adopt/mappingTable.d.ts +1 -0
  3. package/dist/adopt/mappingTable.js +18 -0
  4. package/dist/adopt/mappingTable.js.map +1 -0
  5. package/dist/adopt/scan.d.ts +4 -0
  6. package/dist/adopt/scan.js +51 -0
  7. package/dist/adopt/scan.js.map +1 -0
  8. package/dist/api/canonical.d.ts +12 -0
  9. package/dist/api/canonical.js +65 -0
  10. package/dist/api/canonical.js.map +1 -0
  11. package/dist/api/client.d.ts +37 -0
  12. package/dist/api/client.js +79 -0
  13. package/dist/api/client.js.map +1 -0
  14. package/dist/api/commit.d.ts +18 -0
  15. package/dist/api/commit.js +47 -0
  16. package/dist/api/commit.js.map +1 -0
  17. package/dist/api/errors.d.ts +30 -0
  18. package/dist/api/errors.js +74 -0
  19. package/dist/api/errors.js.map +1 -0
  20. package/dist/api/objects.d.ts +55 -0
  21. package/dist/api/objects.js +48 -0
  22. package/dist/api/objects.js.map +1 -0
  23. package/dist/api/poll.d.ts +10 -0
  24. package/dist/api/poll.js +33 -0
  25. package/dist/api/poll.js.map +1 -0
  26. package/dist/assets/assets.d.ts +15 -0
  27. package/dist/assets/assets.js +110 -0
  28. package/dist/assets/assets.js.map +1 -0
  29. package/dist/codegen/emit.d.ts +8 -0
  30. package/dist/codegen/emit.js +33 -0
  31. package/dist/codegen/emit.js.map +1 -0
  32. package/dist/codegen/format.d.ts +8 -0
  33. package/dist/codegen/format.js +24 -0
  34. package/dist/codegen/format.js.map +1 -0
  35. package/dist/codegen/imports.d.ts +15 -0
  36. package/dist/codegen/imports.js +79 -0
  37. package/dist/codegen/imports.js.map +1 -0
  38. package/dist/commands/adopt.d.ts +2 -0
  39. package/dist/commands/adopt.js +11 -0
  40. package/dist/commands/adopt.js.map +1 -0
  41. package/dist/commands/create.d.ts +2 -0
  42. package/dist/commands/create.js +13 -0
  43. package/dist/commands/create.js.map +1 -0
  44. package/dist/commands/doctor.d.ts +2 -0
  45. package/dist/commands/doctor.js +11 -0
  46. package/dist/commands/doctor.js.map +1 -0
  47. package/dist/commands/impl/adoptImpl.d.ts +1 -0
  48. package/dist/commands/impl/adoptImpl.js +24 -0
  49. package/dist/commands/impl/adoptImpl.js.map +1 -0
  50. package/dist/commands/impl/createImpl.d.ts +2 -0
  51. package/dist/commands/impl/createImpl.js +65 -0
  52. package/dist/commands/impl/createImpl.js.map +1 -0
  53. package/dist/commands/impl/doctorImpl.d.ts +1 -0
  54. package/dist/commands/impl/doctorImpl.js +25 -0
  55. package/dist/commands/impl/doctorImpl.js.map +1 -0
  56. package/dist/commands/impl/initImpl.d.ts +1 -0
  57. package/dist/commands/impl/initImpl.js +65 -0
  58. package/dist/commands/impl/initImpl.js.map +1 -0
  59. package/dist/commands/impl/syncImpl.d.ts +1 -0
  60. package/dist/commands/impl/syncImpl.js +34 -0
  61. package/dist/commands/impl/syncImpl.js.map +1 -0
  62. package/dist/commands/init.d.ts +2 -0
  63. package/dist/commands/init.js +13 -0
  64. package/dist/commands/init.js.map +1 -0
  65. package/dist/commands/sync.d.ts +2 -0
  66. package/dist/commands/sync.js +13 -0
  67. package/dist/commands/sync.js.map +1 -0
  68. package/dist/index.d.ts +2 -0
  69. package/dist/index.js +23 -0
  70. package/dist/index.js.map +1 -0
  71. package/dist/merge/applyOps.d.ts +11 -0
  72. package/dist/merge/applyOps.js +134 -0
  73. package/dist/merge/applyOps.js.map +1 -0
  74. package/dist/merge/deprecate.d.ts +3 -0
  75. package/dist/merge/deprecate.js +28 -0
  76. package/dist/merge/deprecate.js.map +1 -0
  77. package/dist/merge/diff.d.ts +15 -0
  78. package/dist/merge/diff.js +124 -0
  79. package/dist/merge/diff.js.map +1 -0
  80. package/dist/merge/mergePatch.d.ts +8 -0
  81. package/dist/merge/mergePatch.js +63 -0
  82. package/dist/merge/mergePatch.js.map +1 -0
  83. package/dist/merge/threeWay.d.ts +15 -0
  84. package/dist/merge/threeWay.js +242 -0
  85. package/dist/merge/threeWay.js.map +1 -0
  86. package/dist/merge/toEdits.d.ts +3 -0
  87. package/dist/merge/toEdits.js +92 -0
  88. package/dist/merge/toEdits.js.map +1 -0
  89. package/dist/nav/routeTree.d.ts +11 -0
  90. package/dist/nav/routeTree.js +182 -0
  91. package/dist/nav/routeTree.js.map +1 -0
  92. package/dist/project/baseStore.d.ts +19 -0
  93. package/dist/project/baseStore.js +78 -0
  94. package/dist/project/baseStore.js.map +1 -0
  95. package/dist/project/config.d.ts +13 -0
  96. package/dist/project/config.js +28 -0
  97. package/dist/project/config.js.map +1 -0
  98. package/dist/project/head.d.ts +6 -0
  99. package/dist/project/head.js +22 -0
  100. package/dist/project/head.js.map +1 -0
  101. package/dist/project/outbox.d.ts +14 -0
  102. package/dist/project/outbox.js +31 -0
  103. package/dist/project/outbox.js.map +1 -0
  104. package/dist/project/pagesMap.d.ts +8 -0
  105. package/dist/project/pagesMap.js +20 -0
  106. package/dist/project/pagesMap.js.map +1 -0
  107. package/dist/services/adoptService.d.ts +11 -0
  108. package/dist/services/adoptService.js +197 -0
  109. package/dist/services/adoptService.js.map +1 -0
  110. package/dist/services/doctorService.d.ts +11 -0
  111. package/dist/services/doctorService.js +135 -0
  112. package/dist/services/doctorService.js.map +1 -0
  113. package/dist/services/scaffold.d.ts +7 -0
  114. package/dist/services/scaffold.js +56 -0
  115. package/dist/services/scaffold.js.map +1 -0
  116. package/dist/services/syncEngine.d.ts +11 -0
  117. package/dist/services/syncEngine.js +618 -0
  118. package/dist/services/syncEngine.js.map +1 -0
  119. package/dist/style/theme.d.ts +12 -0
  120. package/dist/style/theme.js +125 -0
  121. package/dist/style/theme.js.map +1 -0
  122. package/dist/types.d.ts +136 -0
  123. package/dist/types.js +6 -0
  124. package/dist/types.js.map +1 -0
  125. package/dist/ui/report.d.ts +24 -0
  126. package/dist/ui/report.js +50 -0
  127. package/dist/ui/report.js.map +1 -0
  128. package/package.json +38 -0
  129. package/templates/app/_layout.tsx +5 -0
  130. package/templates/app.json +15 -0
  131. package/templates/babel.config.js +8 -0
  132. package/templates/gitignore +7 -0
  133. package/templates/mapples/sid.d.ts +13 -0
  134. package/templates/package.json +30 -0
  135. package/templates/tsconfig.json +10 -0
@@ -0,0 +1,65 @@
1
+ import { existsSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import chalk from 'chalk';
4
+ import prompts from 'prompts';
5
+ import { JpatchClient, isNetworkError } from '../../api/client.js';
6
+ import { writeConfig, configPath } from '../../project/config.js';
7
+ import { ensureBabelPlugin, writeSidTypes } from '../../services/scaffold.js';
8
+ import { runSyncEngine } from '../../services/syncEngine.js';
9
+ import { renderReport } from '../../ui/report.js';
10
+ import { DEFAULT_API_URL } from './createImpl.js';
11
+ export async function runInit(opts) {
12
+ const root = process.cwd();
13
+ if (!existsSync(join(root, 'package.json'))) {
14
+ throw new Error('run `mapples init` inside an Expo app (no package.json found here)');
15
+ }
16
+ if (existsSync(configPath(root))) {
17
+ throw new Error('this app is already linked (.mapples/config.json exists) — run `mapples sync`');
18
+ }
19
+ let projectId = typeof opts.project === 'string' ? opts.project : undefined;
20
+ if (!projectId) {
21
+ const answer = await prompts({
22
+ type: 'text',
23
+ name: 'projectId',
24
+ message: 'Mapples project id (from Creator → project settings)',
25
+ });
26
+ projectId = answer.projectId;
27
+ }
28
+ if (!projectId)
29
+ throw new Error('a project id is required (pass --project <id>)');
30
+ const apiUrl = typeof opts.apiUrl === 'string' ? opts.apiUrl : DEFAULT_API_URL;
31
+ writeConfig(root, {
32
+ projectId,
33
+ apiUrl,
34
+ appDir: 'mapples/pages',
35
+ routesDir: 'app/(mapples)',
36
+ schema: 1,
37
+ });
38
+ console.log(chalk.bold('\nmapples init'));
39
+ console.log(` ${chalk.green('A')} .mapples/config.json`);
40
+ if (writeSidTypes(root))
41
+ console.log(` ${chalk.green('A')} mapples/sid.d.ts`);
42
+ const babel = ensureBabelPlugin(root);
43
+ if (babel === 'created')
44
+ console.log(` ${chalk.green('A')} babel.config.js`);
45
+ if (babel === 'manual') {
46
+ console.log(chalk.yellow(` ⚠ add 'babel-plugin-mapples-sid' to the plugins of your babel.config.js (not edited automatically)`));
47
+ }
48
+ console.log(chalk.gray(` ℹ ensure mapples/sid.d.ts is included by your tsconfig (add it to "include" if needed)`));
49
+ const client = new JpatchClient({
50
+ baseUrl: apiUrl,
51
+ projectId,
52
+ origin: 'mapples-cli@0.0.0',
53
+ ...(process.env.MAPPLES_TOKEN ? { token: process.env.MAPPLES_TOKEN } : {}),
54
+ });
55
+ try {
56
+ const report = await runSyncEngine({ root, client });
57
+ console.log(renderReport(report));
58
+ }
59
+ catch (err) {
60
+ if (!isNetworkError(err))
61
+ throw err;
62
+ console.log(chalk.yellow(' offline — run `mapples sync` once you are online'));
63
+ }
64
+ }
65
+ //# sourceMappingURL=initImpl.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/initImpl.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function runSync(opts: Record<string, unknown>): Promise<void>;
@@ -0,0 +1,34 @@
1
+ import chalk from 'chalk';
2
+ import { JpatchClient } from '../../api/client.js';
3
+ import { readConfig } from '../../project/config.js';
4
+ import { runSyncEngine } from '../../services/syncEngine.js';
5
+ import { renderReport } from '../../ui/report.js';
6
+ export async function runSync(opts) {
7
+ const root = process.cwd();
8
+ const config = readConfig(root);
9
+ const client = new JpatchClient({
10
+ baseUrl: config.apiUrl,
11
+ projectId: config.projectId,
12
+ origin: 'mapples-cli@0.0.0',
13
+ ...(process.env.MAPPLES_TOKEN ? { token: process.env.MAPPLES_TOKEN } : {}),
14
+ });
15
+ const report = await runSyncEngine({ root, client });
16
+ if (opts.adopt !== false) {
17
+ const { proposeAdoptions } = await import('../../services/adoptService.js');
18
+ await proposeAdoptions({ root, client, report, yes: opts.yes === true });
19
+ }
20
+ if (opts.json === true) {
21
+ console.log(JSON.stringify({
22
+ ...report,
23
+ files: report.files,
24
+ warnings: report.warnings,
25
+ conflicts: report.conflicts,
26
+ }, null, 2));
27
+ return;
28
+ }
29
+ console.log(chalk.bold('\nmapples sync'));
30
+ console.log(renderReport(report));
31
+ if (report.conflicts.length > 0)
32
+ process.exitCode = 2;
33
+ }
34
+ //# sourceMappingURL=syncImpl.js.map
@@ -0,0 +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,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,aAAa,EAAE,MAAM,8BAA8B,CAAC;AAC7D,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,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;QAC9B,OAAO,EAAE,MAAM,CAAC,MAAM;QACtB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,MAAM,EAAE,mBAAmB;QAC3B,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3E,CAAC,CAAC;IAEH,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,CACT,IAAI,CAAC,SAAS,CACZ;YACE,GAAG,MAAM;YACT,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,QAAQ,EAAE,MAAM,CAAC,QAAQ;YACzB,SAAS,EAAE,MAAM,CAAC,SAAS;SAC5B,EACD,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACF,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"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerInit(program: Command): void;
@@ -0,0 +1,13 @@
1
+ export function registerInit(program) {
2
+ program
3
+ .command('init')
4
+ .description('Link an existing Expo app to a Mapples project')
5
+ .option('--project <id>', 'Mapples project id to link')
6
+ .option('--api-url <url>', 'Mapples API base URL')
7
+ .option('--json', 'machine-readable output')
8
+ .action(async (opts) => {
9
+ const { runInit } = await import('./impl/initImpl.js');
10
+ await runInit(opts);
11
+ });
12
+ }
13
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/commands/init.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,gDAAgD,CAAC;SAC7D,MAAM,CAAC,gBAAgB,EAAE,4BAA4B,CAAC;SACtD,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;SACjD,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"}
@@ -0,0 +1,2 @@
1
+ import type { Command } from 'commander';
2
+ export declare function registerSync(program: Command): void;
@@ -0,0 +1,13 @@
1
+ export function registerSync(program) {
2
+ program
3
+ .command('sync')
4
+ .description('Pull remote changes and push local edits in one run')
5
+ .option('--yes', 'accept all adoption proposals without prompting')
6
+ .option('--no-adopt', 'skip the adoption scan')
7
+ .option('--json', 'machine-readable output')
8
+ .action(async (opts) => {
9
+ const { runSync } = await import('./impl/syncImpl.js');
10
+ await runSync(opts);
11
+ });
12
+ }
13
+ //# sourceMappingURL=sync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/commands/sync.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,YAAY,CAAC,OAAgB;IAC3C,OAAO;SACJ,OAAO,CAAC,MAAM,CAAC;SACf,WAAW,CAAC,qDAAqD,CAAC;SAClE,MAAM,CAAC,OAAO,EAAE,iDAAiD,CAAC;SAClE,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC;SAC9C,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"}
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,23 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { registerCreate } from './commands/create.js';
4
+ import { registerInit } from './commands/init.js';
5
+ import { registerSync } from './commands/sync.js';
6
+ import { registerAdopt } from './commands/adopt.js';
7
+ import { registerDoctor } from './commands/doctor.js';
8
+ const program = new Command();
9
+ program
10
+ .name('mapples')
11
+ .description('Mapples CLI — two-way code sync between Mapples Creator and your Expo project')
12
+ .version('0.0.0');
13
+ registerCreate(program);
14
+ registerInit(program);
15
+ registerSync(program);
16
+ registerAdopt(program);
17
+ registerDoctor(program);
18
+ program.parseAsync(process.argv).catch((err) => {
19
+ // Top-level failure surface: print and exit non-zero. Never swallow.
20
+ console.error(err instanceof Error ? err.message : String(err));
21
+ process.exitCode = 1;
22
+ });
23
+ //# sourceMappingURL=index.js.map
@@ -0,0 +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,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,OAAO,CAAC,CAAC;AAEpB,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"}
@@ -0,0 +1,11 @@
1
+ import type { JpatchOp, RenderDomNode } from '../types.js';
2
+ /**
3
+ * Apply RenderNode ops to one page tree. Ops whose target is not in this tree
4
+ * are ignored (they belong to another page) and returned in `skipped` so the
5
+ * caller can route them; nothing is dropped silently.
6
+ */
7
+ export declare function applyNodeOps(root: RenderDomNode | null, ops: JpatchOp[]): {
8
+ root: RenderDomNode | null;
9
+ skipped: JpatchOp[];
10
+ orphans: Map<string, RenderDomNode>;
11
+ };
@@ -0,0 +1,134 @@
1
+ // Apply RenderNode ops to a page tree (the pull direction). The inverse of
2
+ // diffTree: applyNodeOps(base, diffTree(base, x)) ≡ x.
3
+ import { applyMergePatch } from './mergePatch.js';
4
+ function buildState(root) {
5
+ const index = new Map();
6
+ const parents = new Map();
7
+ const walk = (node) => {
8
+ index.set(node.sid, node);
9
+ for (const child of node.children) {
10
+ parents.set(child.sid, node.sid);
11
+ walk(child);
12
+ }
13
+ };
14
+ const cloned = root ? structuredClone(root) : null;
15
+ if (cloned)
16
+ walk(cloned);
17
+ return { root: cloned, index, parents };
18
+ }
19
+ /**
20
+ * Apply RenderNode ops to one page tree. Ops whose target is not in this tree
21
+ * are ignored (they belong to another page) and returned in `skipped` so the
22
+ * caller can route them; nothing is dropped silently.
23
+ */
24
+ export function applyNodeOps(root, ops) {
25
+ const state = buildState(root);
26
+ const skipped = [];
27
+ // Created-but-not-yet-linked nodes park here until a children directive links them.
28
+ const orphans = new Map();
29
+ for (const op of ops) {
30
+ if (op.entity !== 'RenderNode') {
31
+ skipped.push(op);
32
+ continue;
33
+ }
34
+ if (op.op === 'create') {
35
+ const id = op.id ?? op.cid;
36
+ const data = op.data;
37
+ if (!id || !data || typeof data.type !== 'string') {
38
+ throw new Error(`malformed RenderNode create op: ${JSON.stringify(op)}`);
39
+ }
40
+ const node = {
41
+ sid: id,
42
+ type: data.type,
43
+ props: data.props ?? {},
44
+ children: [],
45
+ };
46
+ state.index.set(id, node);
47
+ orphans.set(id, node);
48
+ continue;
49
+ }
50
+ const id = op.id;
51
+ if (!id)
52
+ throw new Error(`op missing id: ${JSON.stringify(op)}`);
53
+ const node = state.index.get(id);
54
+ if (!node) {
55
+ skipped.push(op);
56
+ continue;
57
+ }
58
+ if (op.op === 'delete') {
59
+ const unlink = (sid) => {
60
+ const target = state.index.get(sid);
61
+ if (!target)
62
+ return;
63
+ for (const child of target.children)
64
+ unlink(child.sid);
65
+ state.index.delete(sid);
66
+ orphans.delete(sid);
67
+ };
68
+ const parentSid = state.parents.get(id);
69
+ unlink(id);
70
+ if (parentSid) {
71
+ const parent = state.index.get(parentSid);
72
+ if (parent)
73
+ parent.children = parent.children.filter((c) => c.sid !== id);
74
+ }
75
+ else if (state.root?.sid === id) {
76
+ state.root = null;
77
+ }
78
+ continue;
79
+ }
80
+ // update
81
+ if (op.patch) {
82
+ const patched = applyMergePatch({ type: node.type, props: node.props }, op.patch);
83
+ node.type = patched.type;
84
+ node.props = patched.props ?? {};
85
+ }
86
+ if (op.children) {
87
+ applyChildrenDirective(state, node, op.children, orphans);
88
+ }
89
+ }
90
+ // Root replacement: the old root was deleted and a new tree created with no
91
+ // parent to link it — exactly one unlinked tree becomes the new root.
92
+ if (state.root === null && orphans.size > 0) {
93
+ const candidates = [...orphans.values()];
94
+ if (candidates.length === 1) {
95
+ state.root = candidates[0];
96
+ orphans.clear();
97
+ }
98
+ }
99
+ return { root: state.root, skipped, orphans };
100
+ }
101
+ 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
+ }
111
+ }
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);
121
+ }
122
+ }
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);
131
+ }
132
+ }
133
+ }
134
+ //# sourceMappingURL=applyOps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"applyOps.js","sourceRoot":"","sources":["../../src/merge/applyOps.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function deprecationName(filePath: string, now?: Date): string;
2
+ /** Rename `filePath` to its deprecation name; returns the new path. Never overwrites. */
3
+ export declare function deprecateFile(filePath: string, now?: Date): string;
@@ -0,0 +1,28 @@
1
+ // The conflict fallback (RFC-0002 §4 / §6 P0): a user file is NEVER silently
2
+ // overwritten or deleted. Deprecation renames it out of the way; the caller
3
+ // then regenerates a fresh file from the merged (remote-wins) DOM.
4
+ import { existsSync, renameSync } from 'node:fs';
5
+ import { basename, dirname, join } from 'node:path';
6
+ export function deprecationName(filePath, now = new Date()) {
7
+ const ts = [
8
+ now.getFullYear(),
9
+ String(now.getMonth() + 1).padStart(2, '0'),
10
+ String(now.getDate()).padStart(2, '0'),
11
+ String(now.getHours()).padStart(2, '0'),
12
+ String(now.getMinutes()).padStart(2, '0'),
13
+ String(now.getSeconds()).padStart(2, '0'),
14
+ ].join('');
15
+ return join(dirname(filePath), `_depr_${ts}_${basename(filePath)}.old`);
16
+ }
17
+ /** Rename `filePath` to its deprecation name; returns the new path. Never overwrites. */
18
+ export function deprecateFile(filePath, now = new Date()) {
19
+ let target = deprecationName(filePath, now);
20
+ let counter = 1;
21
+ while (existsSync(target)) {
22
+ target = target.replace(/\.old$/, `.${counter}.old`);
23
+ counter += 1;
24
+ }
25
+ renameSync(filePath, target);
26
+ return target;
27
+ }
28
+ //# sourceMappingURL=deprecate.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"deprecate.js","sourceRoot":"","sources":["../../src/merge/deprecate.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,4EAA4E;AAC5E,mEAAmE;AAEnE,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACjD,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEpD,MAAM,UAAU,eAAe,CAAC,QAAgB,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE;IAChE,MAAM,EAAE,GAAG;QACT,GAAG,CAAC,WAAW,EAAE;QACjB,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QAC3C,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QACtC,MAAM,CAAC,GAAG,CAAC,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QACvC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;QACzC,MAAM,CAAC,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC;KAC1C,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACX,OAAO,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,SAAS,EAAE,IAAI,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC1E,CAAC;AAED,yFAAyF;AACzF,MAAM,UAAU,aAAa,CAAC,QAAgB,EAAE,GAAG,GAAG,IAAI,IAAI,EAAE;IAC9D,IAAI,MAAM,GAAG,eAAe,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;IAC5C,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,OAAO,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QAC1B,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,OAAO,MAAM,CAAC,CAAC;QACrD,OAAO,IAAI,CAAC,CAAC;IACf,CAAC;IACD,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7B,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { JpatchOp, RenderDomNode } from '../types.js';
2
+ interface Indexed {
3
+ node: RenderDomNode;
4
+ parentSid: string | null;
5
+ index: number;
6
+ }
7
+ export declare function indexTree(root: RenderDomNode | null): Map<string, Indexed>;
8
+ /**
9
+ * Diff `base` against `next` for one page tree. Emits, in order: creates
10
+ * (parents before children), per-node updates, per-parent children directives,
11
+ * then deletes. Creates reference the node's own sid as cid (the caller mints
12
+ * `c_` sids for genuinely new nodes before diffing).
13
+ */
14
+ export declare function diffTree(base: RenderDomNode | null, next: RenderDomNode | null): JpatchOp[];
15
+ export {};
@@ -0,0 +1,124 @@
1
+ // Two RenderDom trees -> JpatchOp[]. RFC 7386 merge-patch for prop objects;
2
+ // explicit children move/insert/remove directives for ordering — arrays are
3
+ // never merge-patched (RFC-0001 invariant 7).
4
+ import { buildMergePatch, deepEqual } from './mergePatch.js';
5
+ export function indexTree(root) {
6
+ const map = new Map();
7
+ const walk = (node, parentSid, index) => {
8
+ if (map.has(node.sid)) {
9
+ throw new Error(`duplicate sid in tree: ${node.sid}`);
10
+ }
11
+ map.set(node.sid, { node, parentSid, index });
12
+ node.children.forEach((child, i) => walk(child, node.sid, i));
13
+ };
14
+ if (root)
15
+ walk(root, null, 0);
16
+ return map;
17
+ }
18
+ /**
19
+ * Diff `base` against `next` for one page tree. Emits, in order: creates
20
+ * (parents before children), per-node updates, per-parent children directives,
21
+ * then deletes. Creates reference the node's own sid as cid (the caller mints
22
+ * `c_` sids for genuinely new nodes before diffing).
23
+ */
24
+ export function diffTree(base, next) {
25
+ const baseIdx = indexTree(base);
26
+ const nextIdx = indexTree(next);
27
+ const ops = [];
28
+ // Creates — walk `next` top-down so parents are minted before children.
29
+ const created = new Set();
30
+ const walkCreates = (node) => {
31
+ if (!baseIdx.has(node.sid)) {
32
+ created.add(node.sid);
33
+ ops.push({
34
+ op: 'create',
35
+ entity: 'RenderNode',
36
+ cid: node.sid,
37
+ data: { type: node.type, props: node.props },
38
+ });
39
+ }
40
+ for (const child of node.children)
41
+ walkCreates(child);
42
+ };
43
+ if (next)
44
+ walkCreates(next);
45
+ // Updates on surviving nodes.
46
+ for (const [sid, { node }] of nextIdx) {
47
+ const baseEntry = baseIdx.get(sid);
48
+ if (!baseEntry)
49
+ continue;
50
+ const patch = buildMergePatch({ type: baseEntry.node.type, props: baseEntry.node.props }, { type: node.type, props: node.props });
51
+ if (patch !== null) {
52
+ ops.push({ op: 'update', entity: 'RenderNode', id: sid, patch });
53
+ }
54
+ }
55
+ // Children directives per surviving parent.
56
+ for (const [sid, { node }] of nextIdx) {
57
+ const baseEntry = baseIdx.get(sid);
58
+ 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
+ });
69
+ }
70
+ continue;
71
+ }
72
+ const directive = childrenDirective(baseEntry.node, node, baseIdx, nextIdx);
73
+ if (directive) {
74
+ ops.push({ op: 'update', entity: 'RenderNode', id: sid, children: directive });
75
+ }
76
+ }
77
+ // Deletes last (children removed via cascade; only delete the topmost gone node).
78
+ for (const [sid, entry] of baseIdx) {
79
+ if (nextIdx.has(sid))
80
+ continue;
81
+ const parentGone = entry.parentSid !== null && !nextIdx.has(entry.parentSid) && baseIdx.has(entry.parentSid);
82
+ if (parentGone)
83
+ continue; // covered by the ancestor's cascade
84
+ ops.push({ op: 'delete', entity: 'RenderNode', id: sid, cascade: true });
85
+ }
86
+ return ops;
87
+ }
88
+ function childrenDirective(baseNode, nextNode, baseIdx, nextIdx) {
89
+ const baseIds = baseNode.children.map((c) => c.sid);
90
+ const nextIds = nextNode.children.map((c) => c.sid);
91
+ const removed = baseIds.filter((id) => {
92
+ const entry = nextIdx.get(id);
93
+ return entry === undefined || entry.parentSid !== nextNode.sid;
94
+ });
95
+ const inserted = nextIds.filter((id) => {
96
+ const entry = baseIdx.get(id);
97
+ return entry === undefined || entry.parentSid !== baseNode.sid;
98
+ });
99
+ // Simulate remove + insert over the base order; if that already yields the
100
+ // desired order, no moves are needed.
101
+ const simulated = baseIds.filter((id) => !removed.includes(id));
102
+ for (const id of inserted) {
103
+ const at = Math.min(nextIds.indexOf(id), simulated.length);
104
+ simulated.splice(at, 0, id);
105
+ }
106
+ const needsMoves = !deepEqual(simulated, nextIds);
107
+ const directive = {};
108
+ if (removed.length > 0) {
109
+ // A child that moved to another parent is removed here (its new parent
110
+ // inserts it); a deleted child is unlinked by its own delete op, but the
111
+ // explicit remove keeps directives self-contained for rebase.
112
+ directive.remove = removed;
113
+ }
114
+ if (inserted.length > 0) {
115
+ directive.insert = inserted.map((id) => ({ ref: id, at: nextIds.indexOf(id) }));
116
+ }
117
+ if (needsMoves) {
118
+ // Full move list, ascending target index: deterministic and rebase-safe
119
+ // under the server's clamp semantics.
120
+ directive.move = nextIds.map((id, i) => ({ ref: id, to: i }));
121
+ }
122
+ return directive.remove || directive.insert || directive.move ? directive : null;
123
+ }
124
+ //# sourceMappingURL=diff.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/merge/diff.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ export declare function applyMergePatch(target: unknown, patch: unknown): unknown;
2
+ /**
3
+ * Build the minimal RFC 7386 patch turning `from` into `to`. Returns null when
4
+ * they are equal (no patch needed). Arrays and non-objects replace wholesale.
5
+ * A key present in `from` but absent in `to` becomes `null` (delete).
6
+ */
7
+ export declare function buildMergePatch(from: Record<string, unknown>, to: Record<string, unknown>): Record<string, unknown> | null;
8
+ export declare function deepEqual(a: unknown, b: unknown): boolean;
@@ -0,0 +1,63 @@
1
+ // RFC 7386 JSON Merge Patch — exactly: `null` deletes a key, objects merge
2
+ // recursively, everything else (arrays included) replaces wholesale.
3
+ function isPlainObject(v) {
4
+ return typeof v === 'object' && v !== null && !Array.isArray(v);
5
+ }
6
+ export function applyMergePatch(target, patch) {
7
+ if (!isPlainObject(patch))
8
+ return patch;
9
+ const result = isPlainObject(target) ? { ...target } : {};
10
+ for (const [key, value] of Object.entries(patch)) {
11
+ if (value === null) {
12
+ delete result[key];
13
+ }
14
+ else {
15
+ result[key] = applyMergePatch(result[key], value);
16
+ }
17
+ }
18
+ return result;
19
+ }
20
+ /**
21
+ * Build the minimal RFC 7386 patch turning `from` into `to`. Returns null when
22
+ * they are equal (no patch needed). Arrays and non-objects replace wholesale.
23
+ * A key present in `from` but absent in `to` becomes `null` (delete).
24
+ */
25
+ export function buildMergePatch(from, to) {
26
+ const patch = {};
27
+ for (const key of Object.keys(from)) {
28
+ if (!(key in to))
29
+ patch[key] = null;
30
+ }
31
+ for (const [key, toVal] of Object.entries(to)) {
32
+ if (toVal === undefined)
33
+ continue;
34
+ const fromVal = from[key];
35
+ if (deepEqual(fromVal, toVal))
36
+ continue;
37
+ if (isPlainObject(fromVal) && isPlainObject(toVal)) {
38
+ const sub = buildMergePatch(fromVal, toVal);
39
+ if (sub !== null)
40
+ patch[key] = sub;
41
+ }
42
+ else {
43
+ patch[key] = toVal;
44
+ }
45
+ }
46
+ return Object.keys(patch).length === 0 ? null : patch;
47
+ }
48
+ export function deepEqual(a, b) {
49
+ if (a === b)
50
+ return true;
51
+ if (Array.isArray(a) && Array.isArray(b)) {
52
+ return a.length === b.length && a.every((x, i) => deepEqual(x, b[i]));
53
+ }
54
+ if (isPlainObject(a) && isPlainObject(b)) {
55
+ const ka = Object.keys(a).filter((k) => a[k] !== undefined);
56
+ const kb = Object.keys(b).filter((k) => b[k] !== undefined);
57
+ if (ka.length !== kb.length)
58
+ return false;
59
+ return ka.every((k) => deepEqual(a[k], b[k]));
60
+ }
61
+ return false;
62
+ }
63
+ //# sourceMappingURL=mergePatch.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mergePatch.js","sourceRoot":"","sources":["../../src/merge/mergePatch.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,qEAAqE;AAErE,SAAS,aAAa,CAAC,CAAU;IAC/B,OAAO,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,MAAe,EAAE,KAAc;IAC7D,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACxC,MAAM,MAAM,GAA4B,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnF,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACjD,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACnB,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;QACrB,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,GAAG,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,KAAK,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,eAAe,CAC7B,IAA6B,EAC7B,EAA2B;IAE3B,MAAM,KAAK,GAA4B,EAAE,CAAC;IAC1C,KAAK,MAAM,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QACpC,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,GAAG,IAAI,CAAC;IACtC,CAAC;IACD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;QAC9C,IAAI,KAAK,KAAK,SAAS;YAAE,SAAS;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QAC1B,IAAI,SAAS,CAAC,OAAO,EAAE,KAAK,CAAC;YAAE,SAAS;QACxC,IAAI,aAAa,CAAC,OAAO,CAAC,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACnD,MAAM,GAAG,GAAG,eAAe,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;YAC5C,IAAI,GAAG,KAAK,IAAI;gBAAE,KAAK,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;QACrC,CAAC;aAAM,CAAC;YACN,KAAK,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;QACrB,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,CAAU,EAAE,CAAU;IAC9C,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACxE,CAAC;IACD,IAAI,aAAa,CAAC,CAAC,CAAC,IAAI,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC;QACzC,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QAC5D,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC;QAC5D,IAAI,EAAE,CAAC,MAAM,KAAK,EAAE,CAAC,MAAM;YAAE,OAAO,KAAK,CAAC;QAC1C,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,15 @@
1
+ import type { RenderDomNode } from '../types.js';
2
+ export interface ConflictDetail {
3
+ sid: string;
4
+ reason: 'same-prop' | 'delete-vs-edit';
5
+ props?: string[];
6
+ localValue?: unknown;
7
+ remoteValue?: unknown;
8
+ detail: string;
9
+ }
10
+ export interface ThreeWayResult {
11
+ /** The merged tree the FILE should show. On conflict the caller discards this and uses remote. */
12
+ merged: RenderDomNode | null;
13
+ conflicts: ConflictDetail[];
14
+ }
15
+ export declare function threeWayMerge(base: RenderDomNode | null, local: RenderDomNode | null, remote: RenderDomNode | null): ThreeWayResult;