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.
- package/README.md +133 -22
- package/dist/adopt/scan.d.ts +8 -2
- package/dist/adopt/scan.js +31 -13
- package/dist/adopt/scan.js.map +1 -1
- package/dist/api/agent.d.ts +85 -0
- package/dist/api/agent.js +92 -0
- package/dist/api/agent.js.map +1 -0
- package/dist/api/client.d.ts +12 -1
- package/dist/api/client.js +23 -2
- package/dist/api/client.js.map +1 -1
- package/dist/api/commit.d.ts +9 -0
- package/dist/api/commit.js +33 -2
- package/dist/api/commit.js.map +1 -1
- package/dist/api/errors.js +12 -2
- package/dist/api/errors.js.map +1 -1
- package/dist/api/objects.d.ts +36 -5
- package/dist/api/objects.js +176 -10
- package/dist/api/objects.js.map +1 -1
- package/dist/api/poll.d.ts +5 -3
- package/dist/api/poll.js +17 -6
- package/dist/api/poll.js.map +1 -1
- package/dist/api/txPlan.d.ts +15 -0
- package/dist/api/txPlan.js +196 -0
- package/dist/api/txPlan.js.map +1 -0
- package/dist/assets/assets.d.ts +9 -0
- package/dist/assets/assets.js +33 -4
- package/dist/assets/assets.js.map +1 -1
- package/dist/codegen/emit.d.ts +4 -7
- package/dist/codegen/emit.js +10 -29
- package/dist/codegen/emit.js.map +1 -1
- package/dist/codegen/imports.d.ts +8 -15
- package/dist/codegen/imports.js +27 -72
- package/dist/codegen/imports.js.map +1 -1
- package/dist/codegen/instances.d.ts +5 -0
- package/dist/codegen/instances.js +30 -0
- package/dist/codegen/instances.js.map +1 -0
- package/dist/codegen/styles.d.ts +1 -0
- package/dist/codegen/styles.js +3 -0
- package/dist/codegen/styles.js.map +1 -0
- package/dist/commands/agent.d.ts +2 -0
- package/dist/commands/agent.js +87 -0
- package/dist/commands/agent.js.map +1 -0
- package/dist/commands/create.js +1 -0
- package/dist/commands/create.js.map +1 -1
- package/dist/commands/impl/adoptImpl.js +3 -0
- package/dist/commands/impl/adoptImpl.js.map +1 -1
- package/dist/commands/impl/agentImpl.d.ts +23 -0
- package/dist/commands/impl/agentImpl.js +426 -0
- package/dist/commands/impl/agentImpl.js.map +1 -0
- package/dist/commands/impl/createImpl.js +31 -4
- package/dist/commands/impl/createImpl.js.map +1 -1
- package/dist/commands/impl/initImpl.js +28 -4
- package/dist/commands/impl/initImpl.js.map +1 -1
- package/dist/commands/impl/syncImpl.js +30 -5
- package/dist/commands/impl/syncImpl.js.map +1 -1
- package/dist/commands/init.js +1 -0
- package/dist/commands/init.js.map +1 -1
- package/dist/index.js +12 -1
- package/dist/index.js.map +1 -1
- package/dist/merge/applyOps.d.ts +5 -2
- package/dist/merge/applyOps.js +75 -32
- package/dist/merge/applyOps.js.map +1 -1
- package/dist/merge/childrenOrder.d.ts +13 -0
- package/dist/merge/childrenOrder.js +51 -0
- package/dist/merge/childrenOrder.js.map +1 -0
- package/dist/merge/diff.d.ts +20 -1
- package/dist/merge/diff.js +77 -17
- package/dist/merge/diff.js.map +1 -1
- package/dist/merge/threeWay.d.ts +2 -2
- package/dist/merge/threeWay.js +74 -10
- package/dist/merge/threeWay.js.map +1 -1
- package/dist/merge/toEdits.d.ts +1 -3
- package/dist/merge/toEdits.js +3 -91
- package/dist/merge/toEdits.js.map +1 -1
- package/dist/nav/navigatorTree.d.ts +78 -0
- package/dist/nav/navigatorTree.js +410 -0
- package/dist/nav/navigatorTree.js.map +1 -0
- package/dist/nav/placement.d.ts +53 -0
- package/dist/nav/placement.js +260 -0
- package/dist/nav/placement.js.map +1 -0
- package/dist/nav/routeTree.d.ts +8 -2
- package/dist/nav/routeTree.js +79 -151
- package/dist/nav/routeTree.js.map +1 -1
- package/dist/nav/screenOptions.d.ts +15 -0
- package/dist/nav/screenOptions.js +213 -0
- package/dist/nav/screenOptions.js.map +1 -0
- package/dist/project/agentState.d.ts +30 -0
- package/dist/project/agentState.js +42 -0
- package/dist/project/agentState.js.map +1 -0
- package/dist/project/baseStore.d.ts +19 -1
- package/dist/project/baseStore.js +28 -0
- package/dist/project/baseStore.js.map +1 -1
- package/dist/project/componentsMap.d.ts +7 -0
- package/dist/project/componentsMap.js +21 -0
- package/dist/project/componentsMap.js.map +1 -0
- package/dist/project/config.d.ts +12 -3
- package/dist/project/config.js +11 -2
- package/dist/project/config.js.map +1 -1
- package/dist/project/env.d.ts +10 -3
- package/dist/project/env.js +23 -5
- package/dist/project/env.js.map +1 -1
- package/dist/project/pagesMap.d.ts +2 -0
- package/dist/project/pagesMap.js.map +1 -1
- package/dist/project/secret.d.ts +6 -2
- package/dist/project/secret.js +11 -5
- package/dist/project/secret.js.map +1 -1
- package/dist/services/adoptService.d.ts +3 -0
- package/dist/services/adoptService.js +357 -38
- package/dist/services/adoptService.js.map +1 -1
- package/dist/services/agentInstall.d.ts +80 -0
- package/dist/services/agentInstall.js +309 -0
- package/dist/services/agentInstall.js.map +1 -0
- package/dist/services/agentLease.d.ts +2 -0
- package/dist/services/agentLease.js +32 -0
- package/dist/services/agentLease.js.map +1 -0
- package/dist/services/clientFactory.d.ts +2 -0
- package/dist/services/clientFactory.js +20 -3
- package/dist/services/clientFactory.js.map +1 -1
- package/dist/services/doctorService.js +77 -66
- package/dist/services/doctorService.js.map +1 -1
- package/dist/services/scaffold.js +4 -0
- package/dist/services/scaffold.js.map +1 -1
- package/dist/services/syncEngine.d.ts +7 -0
- package/dist/services/syncEngine.js +719 -306
- package/dist/services/syncEngine.js.map +1 -1
- package/dist/style/theme.js +17 -1
- package/dist/style/theme.js.map +1 -1
- package/dist/types.d.ts +51 -2
- package/dist/types.js +25 -0
- package/dist/types.js.map +1 -1
- package/dist/ui/report.d.ts +15 -0
- package/dist/ui/report.js +30 -0
- package/dist/ui/report.js.map +1 -1
- package/package.json +3 -2
- package/templates/agent/agents-md/AGENTS.md +8 -0
- package/templates/agent/claude/CLAUDE.md +7 -0
- package/templates/agent/claude/mcp.json +11 -0
- package/templates/agent/claude/settings.json +26 -0
- package/templates/agent/codex/config.toml +6 -0
- package/templates/agent/codex/hooks.json +26 -0
- package/templates/agent/cursor/hooks.json +9 -0
- package/templates/agent/cursor/mcp.json +10 -0
- package/templates/agent/mapples.md +124 -0
- package/templates/agent/skills/mapples-conventions/SKILL.md +137 -0
- package/templates/agent/skills/mapples-design/SKILL.md +235 -0
- package/templates/agent/skills/mapples-design/reference/component-library.md +128 -0
- package/templates/agent/skills/mapples-design/reference/design-tokens.md +132 -0
- package/templates/agent/skills/mapples-design/reference/layout-contract.md +227 -0
- package/templates/agent/skills/mapples-design/reference/lint-checklist.md +51 -0
- package/templates/agent/skills/mapples-design/reference/plan.md +95 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/empty-states.md +14 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/forms-and-auth.md +22 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/home-dashboard.md +14 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/list-and-detail.md +18 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/microcopy.md +20 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/navigation-chrome.md +21 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/onboarding-flow.md +15 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/screen-flow-wiring.md +37 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/settings-profile.md +16 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/stats-and-progress.md +17 -0
- package/templates/agent/skills/mapples-design/reference/playbooks/visual-hierarchy.md +18 -0
- package/templates/agent/skills/mapples-design/reference/style-guides.md +92 -0
- package/templates/agent/skills/mapples-sync/SKILL.md +93 -0
- package/templates/app/_layout.tsx +3 -0
- package/templates/app.json +0 -1
- package/templates/gitignore +2 -0
- package/templates/mapples/sid.d.ts +6 -0
- 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 {
|
|
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 (
|
|
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
|
-
|
|
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,
|
|
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,eAAe,EAAE,MAAM,8BAA8B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAE,MAAM,iCAAiC,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,uBAAuB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,YAAY,EAAmB,MAAM,oBAAoB,CAAC;AAElG,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;IACxC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,KAAK,KAAK,CAAC;IACnC,MAAM,UAAU,GAAG,WAAW,EAAE,CAAC;IACjC,MAAM,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IAE9C,wEAAwE;IACxE,sEAAsE;IACtE,2EAA2E;IAC3E,iEAAiE;IACjE,IAAI,QAAQ,GAAsB,IAAI,CAAC;IACvC,IAAI,KAAK,IAAI,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,EAAE,gBAAgB,EAAE,GAAG,MAAM,MAAM,CAAC,gCAAgC,CAAC,CAAC;QAC5E,QAAQ,GAAG,WAAW,EAAE,CAAC;QACzB,MAAM,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,KAAK,IAAI,EAAE,CAAC,CAAC;IACrF,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;IAErD,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QACxC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC9C,MAAM,CAAC,SAAS,IAAI,QAAQ,CAAC,SAAS,CAAC;IACzC,CAAC;SAAM,IAAI,KAAK,EAAE,CAAC;QACjB,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,MAAM,eAAe,CAAC,IAAI,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IAC9C,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;IAEvC,MAAM,QAAQ,GAAG,MAAM,CAAC,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACrD,IAAI,QAAQ,KAAK,CAAC;QAAE,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAChD,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACvB,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CACvC,gBAAgB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,cAAc,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CACzD,CAAC;QACF,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,GAAG,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QACvE,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;AACpC,CAAC"}
|
package/dist/commands/init.js
CHANGED
|
@@ -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;
|
|
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"}
|
package/dist/merge/applyOps.d.ts
CHANGED
|
@@ -1,11 +1,14 @@
|
|
|
1
|
-
import type
|
|
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
|
};
|
package/dist/merge/applyOps.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
state.parents.
|
|
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
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
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":"AAAA,2EAA2E;AAC3E,uDAAuD;
|
|
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"}
|
package/dist/merge/diff.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type
|
|
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 {};
|
package/dist/merge/diff.js
CHANGED
|
@@ -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: {
|
|
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
|
-
|
|
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({
|
|
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
|
-
//
|
|
60
|
-
//
|
|
61
|
-
//
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
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);
|
package/dist/merge/diff.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/merge/diff.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,4EAA4E;AAC5E,8CAA8C;
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../../src/merge/diff.ts"],"names":[],"mappings":"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"}
|
package/dist/merge/threeWay.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import type
|
|
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;
|