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
package/dist/api/commit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/api/commit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAI5B,OAAO,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,UAAU,QAAQ;IACtB,OAAO,MAAM,IAAI,EAAE,EAAE,CAAC;AACxB,CAAC;AAED,MAAM,UAAU,OAAO;IACrB,OAAO,KAAK,IAAI,EAAE,EAAE,CAAC;AACvB,CAAC;AASD,MAAM,UAAU,aAAa,CAAC,MAAoB,EAAE,MAAoB;IACtE,MAAM,QAAQ,GAAa;QACzB,QAAQ,EAAE,UAAU;QACpB,MAAM,EAAE,CAAC;QACT,IAAI,EAAE,MAAM,CAAC,IAAI,IAAI,QAAQ,EAAE;QAC/B,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,GAAG,EAAE,MAAM,CAAC,GAAG;QACf,IAAI,EAAE;YACJ,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAChD,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACnD,EAAE,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SAC7B;KACF,CAAC;IACF,IAAI,MAAM,CAAC,QAAQ,KAAK,SAAS;QAAE,QAAQ,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACvE,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,wBAAwB,CAC5C,MAAoB,EACpB,QAAkB,EAClB,WAAW,GAAG,CAAC;IAEf,IAAI,OAAgB,CAAC;IACrB,KAAK,IAAI,OAAO,GAAG,CAAC,EAAE,OAAO,GAAG,WAAW,EAAE,OAAO,EAAE,EAAE,CAAC;QACvD,IAAI,CAAC;YACH,OAAO,MAAM,MAAM,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC1C,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,WAAW,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;gBAC3D,
|
|
1
|
+
{"version":3,"file":"commit.js","sourceRoot":"","sources":["../../src/api/commit.ts"],"names":[],"mappings":"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"}
|
package/dist/api/errors.js
CHANGED
|
@@ -60,14 +60,24 @@ export class UnexpectedResponseError extends Error {
|
|
|
60
60
|
}
|
|
61
61
|
}
|
|
62
62
|
export function errorFromBody(status, body) {
|
|
63
|
+
// The real backend's auth denials carry {detail} without a code field.
|
|
64
|
+
if (status === 403 &&
|
|
65
|
+
typeof body === 'object' &&
|
|
66
|
+
body !== null &&
|
|
67
|
+
!('code' in body) &&
|
|
68
|
+
typeof body.detail === 'string') {
|
|
69
|
+
return new JpatchError('FORBIDDEN', body.detail);
|
|
70
|
+
}
|
|
63
71
|
if (isJpatchErrorBody(body)) {
|
|
64
|
-
|
|
72
|
+
// The real server words its errors as `detail`; the mock as `message`.
|
|
73
|
+
const { code, message, detail, ...rest } = body;
|
|
65
74
|
if (code === 'HEAD_MISMATCH') {
|
|
66
75
|
const head = rest.head;
|
|
67
76
|
const delta = rest.delta;
|
|
68
77
|
return new HeadMismatchError(head, delta);
|
|
69
78
|
}
|
|
70
|
-
|
|
79
|
+
const text = typeof message === 'string' ? message : typeof detail === 'string' ? detail : '';
|
|
80
|
+
return new JpatchError(code, text, rest);
|
|
71
81
|
}
|
|
72
82
|
return new UnexpectedResponseError(status, body);
|
|
73
83
|
}
|
package/dist/api/errors.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/api/errors.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAC7E,2EAA2E;AAiB3E,MAAM,YAAY,GAAoC;IACpD,aAAa,EAAE,GAAG;IAClB,aAAa,EAAE,GAAG;IAClB,cAAc,EAAE,GAAG;IACnB,cAAc,EAAE,GAAG;IACnB,aAAa,EAAE,GAAG;IAClB,gBAAgB,EAAE,GAAG;IACrB,cAAc,EAAE,GAAG;IACnB,YAAY,EAAE,GAAG;IACjB,cAAc,EAAE,GAAG;IACnB,SAAS,EAAE,GAAG;IACd,iBAAiB,EAAE,GAAG;CACvB,CAAC;AAEF,MAAM,OAAO,WAAY,SAAQ,KAAK;IAC3B,IAAI,CAAkB;IACtB,IAAI,CAAS;IACb,IAAI,CAA0B;IAEvC,YAAY,IAAqB,EAAE,OAAe,EAAE,OAAgC,EAAE;QACpF,KAAK,CAAC,GAAG,IAAI,KAAK,OAAO,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;QAC1B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,oFAAoF;AACpF,MAAM,OAAO,iBAAkB,SAAQ,WAAW;IACvC,IAAI,CAAS;IACb,KAAK,CAAQ;IAEtB,YAAY,IAAY,EAAE,KAAY;QACpC,KAAK,CAAC,eAAe,EAAE,iCAAiC,IAAI,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAClF,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;IACrB,CAAC;CACF;AAED,mHAAmH;AACnH,MAAM,OAAO,gBAAgB;IACN;IAArB,YAAqB,OAAmB;QAAnB,YAAO,GAAP,OAAO,CAAY;IAAG,CAAC;CAC7C;AAED,MAAM,UAAU,iBAAiB,CAC/B,IAAa;IAEb,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC5D,MAAM,IAAI,GAAI,IAAgC,CAAC,IAAI,CAAC;IACpD,OAAO,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;AAC9F,CAAC;AAED,8GAA8G;AAC9G,MAAM,OAAO,uBAAwB,SAAQ,KAAK;IAErC;IACA;IAFX,YACW,MAAc,EACd,YAAqB;QAE9B,KAAK,CAAC,6BAA6B,MAAM,MAAM,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,EAAE,CAAC,CAAC;QAHtE,WAAM,GAAN,MAAM,CAAQ;QACd,iBAAY,GAAZ,YAAY,CAAS;QAG9B,IAAI,CAAC,IAAI,GAAG,yBAAyB,CAAC;IACxC,CAAC;CACF;AAED,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,IAAa;IACzD,IAAI,iBAAiB,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5B,MAAM,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,GAAG,IAAI,CAAC;
|
|
1
|
+
{"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/api/errors.ts"],"names":[],"mappings":"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"}
|
package/dist/api/objects.d.ts
CHANGED
|
@@ -1,19 +1,39 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type Bootstrap, type RenderDomNode, type SourceEntity } from '../types.js';
|
|
2
2
|
import type { JpatchClient } from './client.js';
|
|
3
|
+
/**
|
|
4
|
+
* A container's render states by key — what a node's `style::<key>` variant
|
|
5
|
+
* renders under (RFC-0001 §4.1 `state`). The file owns the states its prop
|
|
6
|
+
* tests declare (`props.*` conditions); the Creator owns the rest.
|
|
7
|
+
*/
|
|
8
|
+
export type EntityStates = Record<string, {
|
|
9
|
+
name: string;
|
|
10
|
+
condition: string;
|
|
11
|
+
id?: string;
|
|
12
|
+
}>;
|
|
3
13
|
export interface PageEntity {
|
|
4
14
|
id: string;
|
|
5
15
|
name: string;
|
|
6
16
|
route: string;
|
|
7
17
|
root: RenderDomNode;
|
|
18
|
+
/** Creator page uuid — navigator route targets reference pages by this. */
|
|
19
|
+
uuid?: string;
|
|
20
|
+
state?: EntityStates;
|
|
8
21
|
}
|
|
9
22
|
export interface ComponentEntity {
|
|
10
23
|
id: string;
|
|
11
24
|
name: string;
|
|
12
25
|
root: RenderDomNode;
|
|
26
|
+
/** Creator component uuid — a page's `ComponentInstance` nodes link to it. */
|
|
27
|
+
uuid?: string;
|
|
28
|
+
state?: EntityStates;
|
|
13
29
|
}
|
|
14
30
|
export interface NavigationDocument {
|
|
15
|
-
|
|
16
|
-
|
|
31
|
+
/** Legacy/CLI route list. The real backend serves a navigator document
|
|
32
|
+
* (`data.navigators`) without this field — then route-tree codegen is
|
|
33
|
+
* skipped with a visible note; the raw doc is preserved in base. */
|
|
34
|
+
routes?: NavigationRoute[];
|
|
35
|
+
layouts?: Record<string, unknown>;
|
|
36
|
+
[k: string]: unknown;
|
|
17
37
|
}
|
|
18
38
|
export interface NavigationRoute {
|
|
19
39
|
id: string;
|
|
@@ -28,11 +48,18 @@ export interface StyleConfig {
|
|
|
28
48
|
sizing: Record<string, unknown>;
|
|
29
49
|
}
|
|
30
50
|
export type AssetIndex = Record<string, {
|
|
31
|
-
sha256
|
|
32
|
-
mime
|
|
51
|
+
sha256?: string;
|
|
52
|
+
mime?: string;
|
|
33
53
|
w?: number;
|
|
34
54
|
h?: number;
|
|
35
55
|
name?: string;
|
|
56
|
+
/** Real backend fields (dev): server-relative body URL + file metadata. */
|
|
57
|
+
link?: string;
|
|
58
|
+
file_name?: string;
|
|
59
|
+
extension?: string;
|
|
60
|
+
type?: string;
|
|
61
|
+
uuid?: string;
|
|
62
|
+
[k: string]: unknown;
|
|
36
63
|
}>;
|
|
37
64
|
export interface ProjectState {
|
|
38
65
|
head: string;
|
|
@@ -42,7 +69,11 @@ export interface ProjectState {
|
|
|
42
69
|
navigation: NavigationDocument;
|
|
43
70
|
style: StyleConfig;
|
|
44
71
|
assets: AssetIndex;
|
|
72
|
+
/** Stored source text per page/component id — only containers that have one. */
|
|
73
|
+
sources: Map<string, SourceEntity>;
|
|
45
74
|
}
|
|
75
|
+
/** Pages on the real backend carry no route; derive a stable one from the name. */
|
|
76
|
+
export declare function deriveRoute(name: string): string;
|
|
46
77
|
/** Cold bootstrap: walk the manifest and fetch every blob (RFC-0001 §6). */
|
|
47
78
|
export declare function fetchProjectState(client: JpatchClient, boot: Bootstrap): Promise<ProjectState>;
|
|
48
79
|
/**
|
package/dist/api/objects.js
CHANGED
|
@@ -1,24 +1,190 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
|
+
import { sidecarOf, } from '../types.js';
|
|
3
|
+
// ---- Hash-linked blob resolution (RFC-0001 §4.1) ----
|
|
4
|
+
// The real backend embeds children as hash STRINGS, never inlined: a page blob
|
|
5
|
+
// is {id, name, root: "b3:…"} and a node blob is {id, key?, type, props,
|
|
6
|
+
// children: ["b3:…"], _canvasProps?}. The mock server may still serve
|
|
7
|
+
// materialized trees; both shapes resolve through the same walker.
|
|
8
|
+
const isHashRef = (v) => typeof v === 'string' && v.startsWith('b3:');
|
|
9
|
+
/** Editor-internal node fields that never enter the CLI's RenderDom model. */
|
|
10
|
+
const NODE_META_FIELDS = new Set([
|
|
11
|
+
'id',
|
|
12
|
+
'sid',
|
|
13
|
+
'key',
|
|
14
|
+
'type',
|
|
15
|
+
'props',
|
|
16
|
+
'children',
|
|
17
|
+
'refProps',
|
|
18
|
+
'dataProps',
|
|
19
|
+
'actionProps',
|
|
20
|
+
'_canvasProps',
|
|
21
|
+
'uuid',
|
|
22
|
+
]);
|
|
23
|
+
async function fetchObjects(client, hashes) {
|
|
24
|
+
const out = new Map();
|
|
25
|
+
for (let i = 0; i < hashes.length; i += 100) {
|
|
26
|
+
const chunk = hashes.slice(i, i + 100);
|
|
27
|
+
const objects = await client.objectsGet(chunk);
|
|
28
|
+
for (const h of chunk) {
|
|
29
|
+
if (!(h in objects))
|
|
30
|
+
throw new Error(`objects/get did not return blob ${h}`);
|
|
31
|
+
out.set(h, objects[h]);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
return out;
|
|
35
|
+
}
|
|
36
|
+
/** Resolve a root ref (hash or inline tree) into a materialized RenderDomNode. */
|
|
37
|
+
async function materializeTree(client, rootRef) {
|
|
38
|
+
// Breadth-first: collect unresolved hashes level by level, batch-fetch them.
|
|
39
|
+
const blobCache = new Map();
|
|
40
|
+
const collectHashes = (ref, acc) => {
|
|
41
|
+
if (isHashRef(ref)) {
|
|
42
|
+
if (!blobCache.has(ref))
|
|
43
|
+
acc.add(ref);
|
|
44
|
+
return;
|
|
45
|
+
}
|
|
46
|
+
const node = ref;
|
|
47
|
+
for (const child of node.children ?? [])
|
|
48
|
+
collectHashes(child, acc);
|
|
49
|
+
};
|
|
50
|
+
let frontier = [rootRef];
|
|
51
|
+
for (let depth = 0; depth < 100 && frontier.length > 0; depth++) {
|
|
52
|
+
const wanted = new Set();
|
|
53
|
+
for (const ref of frontier)
|
|
54
|
+
collectHashes(ref, wanted);
|
|
55
|
+
if (wanted.size === 0)
|
|
56
|
+
break;
|
|
57
|
+
const fetched = await fetchObjects(client, [...wanted]);
|
|
58
|
+
for (const [h, blob] of fetched)
|
|
59
|
+
blobCache.set(h, blob);
|
|
60
|
+
frontier = [...fetched.values()];
|
|
61
|
+
}
|
|
62
|
+
const build = (ref, trail) => {
|
|
63
|
+
let blob = ref;
|
|
64
|
+
if (isHashRef(ref)) {
|
|
65
|
+
if (trail.has(ref))
|
|
66
|
+
throw new Error(`cycle in canvas blobs at ${ref}`);
|
|
67
|
+
trail = new Set(trail).add(ref);
|
|
68
|
+
blob = blobCache.get(ref);
|
|
69
|
+
if (blob === undefined)
|
|
70
|
+
throw new Error(`unresolved canvas blob ${ref}`);
|
|
71
|
+
}
|
|
72
|
+
const node = blob;
|
|
73
|
+
const sid = (node.id ?? node.sid);
|
|
74
|
+
if (typeof sid !== 'string' || typeof node.type !== 'string') {
|
|
75
|
+
throw new Error(`canvas node blob is missing id/type: ${JSON.stringify(node).slice(0, 120)}`);
|
|
76
|
+
}
|
|
77
|
+
// Anything beyond the known meta fields is unexpected — keep it visible.
|
|
78
|
+
for (const k of Object.keys(node)) {
|
|
79
|
+
if (!NODE_META_FIELDS.has(k)) {
|
|
80
|
+
throw new Error(`canvas node ${sid} has unknown field \`${k}\` — schema drift, update the CLI`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
return {
|
|
84
|
+
sid,
|
|
85
|
+
type: node.type,
|
|
86
|
+
props: node.props ?? {},
|
|
87
|
+
children: (node.children ?? []).map((c) => build(c, trail)),
|
|
88
|
+
...sidecarOf(node),
|
|
89
|
+
};
|
|
90
|
+
};
|
|
91
|
+
return build(rootRef, new Set());
|
|
92
|
+
}
|
|
93
|
+
/** Pages on the real backend carry no route; derive a stable one from the name. */
|
|
94
|
+
export function deriveRoute(name) {
|
|
95
|
+
const slug = name
|
|
96
|
+
.trim()
|
|
97
|
+
.replace(/([a-z0-9])([A-Z])/g, '$1-$2')
|
|
98
|
+
.replace(/[^A-Za-z0-9]+/g, '-')
|
|
99
|
+
.replace(/^-+|-+$/g, '')
|
|
100
|
+
.toLowerCase();
|
|
101
|
+
return slug === '' || slug === 'home' || slug === 'index' ? '/' : `/${slug}`;
|
|
102
|
+
}
|
|
103
|
+
/** A style-blob section may be inline, hash-linked, or a {id, data} document. */
|
|
104
|
+
async function resolveStyleSection(client, value) {
|
|
105
|
+
let section = value;
|
|
106
|
+
if (isHashRef(section)) {
|
|
107
|
+
const fetched = await fetchObjects(client, [section]);
|
|
108
|
+
section = fetched.get(section);
|
|
109
|
+
}
|
|
110
|
+
if (typeof section !== 'object' || section === null)
|
|
111
|
+
return {};
|
|
112
|
+
const doc = section;
|
|
113
|
+
if (typeof doc.data === 'object' && doc.data !== null)
|
|
114
|
+
return doc.data;
|
|
115
|
+
return doc;
|
|
116
|
+
}
|
|
2
117
|
/** Cold bootstrap: walk the manifest and fetch every blob (RFC-0001 §6). */
|
|
3
118
|
export async function fetchProjectState(client, boot) {
|
|
4
|
-
const [pagesIndex, componentsIndex,
|
|
119
|
+
const [pagesIndex, componentsIndex, navigationBlob, styleBlob, assets] = await Promise.all([
|
|
5
120
|
client.getObject(boot.manifest.pages),
|
|
6
121
|
client.getObject(boot.manifest.components),
|
|
7
122
|
client.getObject(boot.manifest.navigation),
|
|
8
123
|
client.getObject(boot.manifest.style),
|
|
9
124
|
client.getObject(boot.manifest.assets),
|
|
10
125
|
]);
|
|
126
|
+
const pageBlobs = await fetchObjects(client, Object.values(pagesIndex));
|
|
11
127
|
const pages = new Map();
|
|
12
|
-
|
|
13
|
-
const blob =
|
|
14
|
-
pages.set(
|
|
15
|
-
|
|
128
|
+
for (const [indexId, hash] of Object.entries(pagesIndex)) {
|
|
129
|
+
const blob = pageBlobs.get(hash);
|
|
130
|
+
pages.set(indexId, {
|
|
131
|
+
id: blob.id ?? indexId,
|
|
132
|
+
name: blob.name,
|
|
133
|
+
route: blob.route ?? deriveRoute(blob.name),
|
|
134
|
+
root: await materializeTree(client, blob.root),
|
|
135
|
+
...(blob.uuid ? { uuid: blob.uuid } : {}),
|
|
136
|
+
...(blob.state ? { state: blob.state } : {}),
|
|
137
|
+
});
|
|
138
|
+
}
|
|
139
|
+
const componentBlobs = await fetchObjects(client, Object.values(componentsIndex));
|
|
16
140
|
const components = new Map();
|
|
17
|
-
|
|
18
|
-
const blob =
|
|
19
|
-
components.set(
|
|
20
|
-
|
|
21
|
-
|
|
141
|
+
for (const [indexId, hash] of Object.entries(componentsIndex)) {
|
|
142
|
+
const blob = componentBlobs.get(hash);
|
|
143
|
+
components.set(indexId, {
|
|
144
|
+
id: blob.id ?? indexId,
|
|
145
|
+
name: blob.name,
|
|
146
|
+
root: await materializeTree(client, blob.root),
|
|
147
|
+
...(blob.uuid ? { uuid: blob.uuid } : {}),
|
|
148
|
+
...(blob.state ? { state: blob.state } : {}),
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
const style = {
|
|
152
|
+
theme: await resolveStyleSection(client, styleBlob.theme),
|
|
153
|
+
typography: await resolveStyleSection(client, styleBlob.typography),
|
|
154
|
+
sizing: await resolveStyleSection(client, styleBlob.sizing),
|
|
155
|
+
};
|
|
156
|
+
return {
|
|
157
|
+
head: boot.head,
|
|
158
|
+
seq: boot.seq,
|
|
159
|
+
pages,
|
|
160
|
+
components,
|
|
161
|
+
navigation: navigationBlob,
|
|
162
|
+
style,
|
|
163
|
+
assets,
|
|
164
|
+
sources: await fetchSources(client, boot),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/** The `sources` index (RFC-0001 A12), keyed by container id; empty when the manifest has none. */
|
|
168
|
+
async function fetchSources(client, boot) {
|
|
169
|
+
const sources = new Map();
|
|
170
|
+
if (boot.manifest.sources === undefined)
|
|
171
|
+
return sources;
|
|
172
|
+
const index = (await client.getObject(boot.manifest.sources));
|
|
173
|
+
const blobs = await fetchObjects(client, Object.values(index));
|
|
174
|
+
for (const [indexId, hash] of Object.entries(index)) {
|
|
175
|
+
const blob = blobs.get(hash);
|
|
176
|
+
if (typeof blob.of !== 'string' || typeof blob.text !== 'string') {
|
|
177
|
+
throw new Error(`source blob ${indexId} is missing of/text — schema drift, update the CLI`);
|
|
178
|
+
}
|
|
179
|
+
sources.set(blob.of, {
|
|
180
|
+
id: blob.id ?? indexId,
|
|
181
|
+
of: blob.of,
|
|
182
|
+
lang: typeof blob.lang === 'string' ? blob.lang : 'tsx',
|
|
183
|
+
text: blob.text,
|
|
184
|
+
...(typeof blob.docHash === 'string' ? { docHash: blob.docHash } : {}),
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
return sources;
|
|
22
188
|
}
|
|
23
189
|
/**
|
|
24
190
|
* Upload binary asset bodies: `objects/have` filters to genuinely missing
|
package/dist/api/objects.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"objects.js","sourceRoot":"","sources":["../../src/api/objects.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"objects.js","sourceRoot":"","sources":["../../src/api/objects.ts"],"names":[],"mappings":"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"}
|
package/dist/api/poll.d.ts
CHANGED
|
@@ -4,7 +4,9 @@ export declare class SnapshotRequired extends Error {
|
|
|
4
4
|
constructor();
|
|
5
5
|
}
|
|
6
6
|
/**
|
|
7
|
-
* Pull the full delta since `
|
|
8
|
-
*
|
|
7
|
+
* Pull the full delta since `sinceSeq`, following `truncated: true` pages via
|
|
8
|
+
* `lastSeq` until exhausted. The real backend signals "cold-bootstrap instead"
|
|
9
|
+
* with a 200 `snapshotRequired: true` body; older servers/mocks may use a
|
|
10
|
+
* SNAPSHOT_REQUIRED error — both raise SnapshotRequired.
|
|
9
11
|
*/
|
|
10
|
-
export declare function pullDelta(client: JpatchClient,
|
|
12
|
+
export declare function pullDelta(client: JpatchClient, sinceSeq: number): Promise<Delta>;
|
package/dist/api/poll.js
CHANGED
|
@@ -6,13 +6,15 @@ export class SnapshotRequired extends Error {
|
|
|
6
6
|
}
|
|
7
7
|
}
|
|
8
8
|
/**
|
|
9
|
-
* Pull the full delta since `
|
|
10
|
-
*
|
|
9
|
+
* Pull the full delta since `sinceSeq`, following `truncated: true` pages via
|
|
10
|
+
* `lastSeq` until exhausted. The real backend signals "cold-bootstrap instead"
|
|
11
|
+
* with a 200 `snapshotRequired: true` body; older servers/mocks may use a
|
|
12
|
+
* SNAPSHOT_REQUIRED error — both raise SnapshotRequired.
|
|
11
13
|
*/
|
|
12
|
-
export async function pullDelta(client,
|
|
14
|
+
export async function pullDelta(client, sinceSeq) {
|
|
13
15
|
const ops = [];
|
|
14
|
-
let cursor =
|
|
15
|
-
for (
|
|
16
|
+
let cursor = sinceSeq;
|
|
17
|
+
for (let page_n = 0; page_n < 1000; page_n++) {
|
|
16
18
|
let page;
|
|
17
19
|
try {
|
|
18
20
|
page = await client.pullOnce(cursor);
|
|
@@ -23,11 +25,20 @@ export async function pullDelta(client, since) {
|
|
|
23
25
|
}
|
|
24
26
|
throw err;
|
|
25
27
|
}
|
|
28
|
+
if (page.snapshotRequired)
|
|
29
|
+
throw new SnapshotRequired();
|
|
30
|
+
if (!Array.isArray(page.ops)) {
|
|
31
|
+
throw new Error(`delta response has no ops array (head ${page.head}) — server/CLI contract drift`);
|
|
32
|
+
}
|
|
26
33
|
ops.push(...page.ops);
|
|
27
34
|
if (!page.truncated) {
|
|
28
35
|
return { ops, head: page.head, seq: page.seq, truncated: false };
|
|
29
36
|
}
|
|
30
|
-
|
|
37
|
+
if (typeof page.lastSeq !== 'number' || page.lastSeq <= cursor) {
|
|
38
|
+
throw new Error('truncated delta without an advancing lastSeq cursor');
|
|
39
|
+
}
|
|
40
|
+
cursor = page.lastSeq;
|
|
31
41
|
}
|
|
42
|
+
throw new Error('delta paging did not converge after 1000 pages');
|
|
32
43
|
}
|
|
33
44
|
//# sourceMappingURL=poll.js.map
|
package/dist/api/poll.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"poll.js","sourceRoot":"","sources":["../../src/api/poll.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC;QACE,KAAK,CAAC,qEAAqE,CAAC,CAAC;QAC7E,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED
|
|
1
|
+
{"version":3,"file":"poll.js","sourceRoot":"","sources":["../../src/api/poll.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE1C,MAAM,OAAO,gBAAiB,SAAQ,KAAK;IACzC;QACE,KAAK,CAAC,qEAAqE,CAAC,CAAC;QAC7E,IAAI,CAAC,IAAI,GAAG,kBAAkB,CAAC;IACjC,CAAC;CACF;AAED;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAoB,EAAE,QAAgB;IACpE,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,IAAI,MAAM,GAAG,QAAQ,CAAC;IACtB,KAAK,IAAI,MAAM,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,EAAE,MAAM,EAAE,EAAE,CAAC;QAC7C,IAAI,IAAW,CAAC;QAChB,IAAI,CAAC;YACH,IAAI,GAAG,MAAM,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,WAAW,IAAI,GAAG,CAAC,IAAI,KAAK,mBAAmB,EAAE,CAAC;gBACnE,MAAM,IAAI,gBAAgB,EAAE,CAAC;YAC/B,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;QACD,IAAI,IAAI,CAAC,gBAAgB;YAAE,MAAM,IAAI,gBAAgB,EAAE,CAAC;QACxD,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC7B,MAAM,IAAI,KAAK,CACb,yCAAyC,IAAI,CAAC,IAAI,+BAA+B,CAClF,CAAC;QACJ,CAAC;QACD,GAAG,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACtB,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,CAAC;YACpB,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QACnE,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,IAAI,CAAC,OAAO,IAAI,MAAM,EAAE,CAAC;YAC/D,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QACD,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC;IACxB,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { JpatchOp } from '../types.js';
|
|
2
|
+
export declare const MAX_OPS_PER_TX = 200;
|
|
3
|
+
/** A placement group larger than one transaction: the push stops, nothing is sent. */
|
|
4
|
+
export declare class PushGroupTooLargeError extends Error {
|
|
5
|
+
readonly size: number;
|
|
6
|
+
readonly limit: number;
|
|
7
|
+
readonly sample: JpatchOp[];
|
|
8
|
+
constructor(size: number, limit: number, sample: JpatchOp[]);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Plan `ops` as sequential transactions, each at most `limit` ops. Flattening
|
|
12
|
+
* the result gives the order the ops are sent in; a caller that tracks how
|
|
13
|
+
* many ops committed must count against that flattened order.
|
|
14
|
+
*/
|
|
15
|
+
export declare function planTransactions(ops: JpatchOp[], limit?: number): JpatchOp[][];
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
// Splitting a push into transactions of at most MAX_OPS_PER_TX ops without
|
|
2
|
+
// losing nodes (RFC-0001 §5.2, rev. 2026-09-15). The server serializes only
|
|
3
|
+
// what the manifest reaches when a transaction ends, so a create that is not
|
|
4
|
+
// placed in its own transaction is gone. A split therefore:
|
|
5
|
+
// - keeps an unplaced create and the op that places it (a children
|
|
6
|
+
// directive or a Page/Component root) in one transaction;
|
|
7
|
+
// - never sends an op before the create that mints a cid it references
|
|
8
|
+
// (cids resolve through earlier transactions' idMaps);
|
|
9
|
+
// - keeps the relative order of ops aimed at the same target;
|
|
10
|
+
// - refuses, rather than sends, a group that cannot fit one transaction.
|
|
11
|
+
export const MAX_OPS_PER_TX = 200;
|
|
12
|
+
/** A placement group larger than one transaction: the push stops, nothing is sent. */
|
|
13
|
+
export class PushGroupTooLargeError extends Error {
|
|
14
|
+
size;
|
|
15
|
+
limit;
|
|
16
|
+
sample;
|
|
17
|
+
constructor(size, limit, sample) {
|
|
18
|
+
super(`a new element and everything that must land with it is ${size} ops, over the ${limit}-op transaction limit — nothing was pushed. ` +
|
|
19
|
+
'Sync the change in smaller steps (e.g. add the container first, then its children).');
|
|
20
|
+
this.size = size;
|
|
21
|
+
this.limit = limit;
|
|
22
|
+
this.sample = sample;
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function cidsIn(value, out) {
|
|
26
|
+
if (typeof value === 'string') {
|
|
27
|
+
if (value.startsWith('c_'))
|
|
28
|
+
out.add(value);
|
|
29
|
+
}
|
|
30
|
+
else if (Array.isArray(value)) {
|
|
31
|
+
for (const v of value)
|
|
32
|
+
cidsIn(v, out);
|
|
33
|
+
}
|
|
34
|
+
else if (value !== null && typeof value === 'object') {
|
|
35
|
+
for (const v of Object.values(value))
|
|
36
|
+
cidsIn(v, out);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/** Refs an op links under its target: the op that places them. */
|
|
40
|
+
function placedRefs(op) {
|
|
41
|
+
if (op.op === 'create' && (op.entity === 'Page' || op.entity === 'Component')) {
|
|
42
|
+
const root = op.data?.root;
|
|
43
|
+
return typeof root === 'string' ? [root] : [];
|
|
44
|
+
}
|
|
45
|
+
if (op.op === 'update' && op.children) {
|
|
46
|
+
return [...(op.children.insert ?? []).map((i) => i.ref), ...(op.children.set ?? [])];
|
|
47
|
+
}
|
|
48
|
+
return [];
|
|
49
|
+
}
|
|
50
|
+
/** The entity whose state an op's position matters for. */
|
|
51
|
+
function orderKey(op) {
|
|
52
|
+
if (op.op === 'create') {
|
|
53
|
+
const parent = op.data?.parent;
|
|
54
|
+
return typeof parent === 'string' ? parent : undefined;
|
|
55
|
+
}
|
|
56
|
+
return op.id;
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Plan `ops` as sequential transactions, each at most `limit` ops. Flattening
|
|
60
|
+
* the result gives the order the ops are sent in; a caller that tracks how
|
|
61
|
+
* many ops committed must count against that flattened order.
|
|
62
|
+
*/
|
|
63
|
+
export function planTransactions(ops, limit = MAX_OPS_PER_TX) {
|
|
64
|
+
if (ops.length <= limit)
|
|
65
|
+
return ops.length === 0 ? [] : [ops];
|
|
66
|
+
const n = ops.length;
|
|
67
|
+
// Union-find: an unplaced RenderNode create joins the op that places it.
|
|
68
|
+
const group = Array.from({ length: n }, (_, i) => i);
|
|
69
|
+
const find = (i) => {
|
|
70
|
+
while (group[i] !== i) {
|
|
71
|
+
group[i] = group[group[i]];
|
|
72
|
+
i = group[i];
|
|
73
|
+
}
|
|
74
|
+
return i;
|
|
75
|
+
};
|
|
76
|
+
const union = (a, b) => {
|
|
77
|
+
group[find(a)] = find(b);
|
|
78
|
+
};
|
|
79
|
+
const minter = new Map();
|
|
80
|
+
const unplaced = new Set();
|
|
81
|
+
const deps = Array.from({ length: n }, () => []);
|
|
82
|
+
const lastByKey = new Map();
|
|
83
|
+
ops.forEach((op, i) => {
|
|
84
|
+
const refs = new Set();
|
|
85
|
+
cidsIn({ ...op, cid: undefined }, refs);
|
|
86
|
+
for (const cid of refs) {
|
|
87
|
+
const m = minter.get(cid);
|
|
88
|
+
if (m !== undefined)
|
|
89
|
+
deps[i].push(m);
|
|
90
|
+
}
|
|
91
|
+
for (const ref of placedRefs(op)) {
|
|
92
|
+
const m = minter.get(ref);
|
|
93
|
+
if (m !== undefined && unplaced.delete(ref))
|
|
94
|
+
union(i, m);
|
|
95
|
+
}
|
|
96
|
+
const key = orderKey(op);
|
|
97
|
+
if (key !== undefined) {
|
|
98
|
+
const prev = lastByKey.get(key);
|
|
99
|
+
if (prev !== undefined)
|
|
100
|
+
deps[i].push(prev);
|
|
101
|
+
lastByKey.set(key, i);
|
|
102
|
+
}
|
|
103
|
+
if (op.op === 'create' && op.cid) {
|
|
104
|
+
minter.set(op.cid, i);
|
|
105
|
+
if (op.entity === 'RenderNode' && typeof op.data?.parent !== 'string')
|
|
106
|
+
unplaced.add(op.cid);
|
|
107
|
+
}
|
|
108
|
+
});
|
|
109
|
+
// Group graph, then merge its cycles (Tarjan) so it becomes a DAG.
|
|
110
|
+
const roots = [...new Set(group.map((_, i) => find(i)))];
|
|
111
|
+
const edges = new Map(roots.map((r) => [r, new Set()]));
|
|
112
|
+
ops.forEach((_, i) => {
|
|
113
|
+
for (const d of deps[i]) {
|
|
114
|
+
const from = find(i);
|
|
115
|
+
const to = find(d);
|
|
116
|
+
if (from !== to)
|
|
117
|
+
edges.get(from).add(to);
|
|
118
|
+
}
|
|
119
|
+
});
|
|
120
|
+
const component = new Map();
|
|
121
|
+
const indexOf = new Map();
|
|
122
|
+
const low = new Map();
|
|
123
|
+
const stack = [];
|
|
124
|
+
const onStack = new Set();
|
|
125
|
+
let counter = 0;
|
|
126
|
+
const strongConnect = (v) => {
|
|
127
|
+
indexOf.set(v, counter);
|
|
128
|
+
low.set(v, counter);
|
|
129
|
+
counter += 1;
|
|
130
|
+
stack.push(v);
|
|
131
|
+
onStack.add(v);
|
|
132
|
+
for (const w of edges.get(v)) {
|
|
133
|
+
if (!indexOf.has(w)) {
|
|
134
|
+
strongConnect(w);
|
|
135
|
+
low.set(v, Math.min(low.get(v), low.get(w)));
|
|
136
|
+
}
|
|
137
|
+
else if (onStack.has(w)) {
|
|
138
|
+
low.set(v, Math.min(low.get(v), indexOf.get(w)));
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
if (low.get(v) === indexOf.get(v)) {
|
|
142
|
+
for (;;) {
|
|
143
|
+
const w = stack.pop();
|
|
144
|
+
onStack.delete(w);
|
|
145
|
+
component.set(w, v);
|
|
146
|
+
if (w === v)
|
|
147
|
+
break;
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
};
|
|
151
|
+
for (const r of roots)
|
|
152
|
+
if (!indexOf.has(r))
|
|
153
|
+
strongConnect(r);
|
|
154
|
+
const members = new Map();
|
|
155
|
+
ops.forEach((_, i) => {
|
|
156
|
+
const c = component.get(find(i));
|
|
157
|
+
const list = members.get(c) ?? [];
|
|
158
|
+
list.push(i);
|
|
159
|
+
members.set(c, list);
|
|
160
|
+
});
|
|
161
|
+
const needs = new Map([...members.keys()].map((c) => [c, new Set()]));
|
|
162
|
+
for (const [from, tos] of edges) {
|
|
163
|
+
for (const to of tos) {
|
|
164
|
+
const a = component.get(from);
|
|
165
|
+
const b = component.get(to);
|
|
166
|
+
if (a !== b)
|
|
167
|
+
needs.get(a).add(b);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
// Kahn's order, earliest first op first: untouched ops keep their order.
|
|
171
|
+
const done = new Set();
|
|
172
|
+
const ordered = [];
|
|
173
|
+
const pending = [...members.entries()].sort((a, b) => a[1][0] - b[1][0]);
|
|
174
|
+
while (ordered.length < pending.length) {
|
|
175
|
+
const next = pending.find(([c]) => !done.has(c) && [...needs.get(c)].every((d) => done.has(d)));
|
|
176
|
+
done.add(next[0]);
|
|
177
|
+
ordered.push(next[1]);
|
|
178
|
+
}
|
|
179
|
+
const txs = [];
|
|
180
|
+
let current = [];
|
|
181
|
+
for (const indices of ordered) {
|
|
182
|
+
if (indices.length > limit) {
|
|
183
|
+
throw new PushGroupTooLargeError(indices.length, limit, indices.slice(0, 3).map((i) => ops[i]));
|
|
184
|
+
}
|
|
185
|
+
if (current.length + indices.length > limit) {
|
|
186
|
+
txs.push(current);
|
|
187
|
+
current = [];
|
|
188
|
+
}
|
|
189
|
+
for (const i of indices)
|
|
190
|
+
current.push(ops[i]);
|
|
191
|
+
}
|
|
192
|
+
if (current.length > 0)
|
|
193
|
+
txs.push(current);
|
|
194
|
+
return txs;
|
|
195
|
+
}
|
|
196
|
+
//# sourceMappingURL=txPlan.js.map
|