mapples 0.2.0-beta.3 → 0.2.0-beta.5

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 (43) hide show
  1. package/dist/api/objects.d.ts +3 -1
  2. package/dist/api/objects.js +24 -1
  3. package/dist/api/objects.js.map +1 -1
  4. package/dist/api/txPlan.d.ts +15 -0
  5. package/dist/api/txPlan.js +196 -0
  6. package/dist/api/txPlan.js.map +1 -0
  7. package/dist/codegen/emit.d.ts +2 -31
  8. package/dist/codegen/emit.js +7 -147
  9. package/dist/codegen/emit.js.map +1 -1
  10. package/dist/codegen/imports.d.ts +1 -17
  11. package/dist/codegen/imports.js +2 -116
  12. package/dist/codegen/imports.js.map +1 -1
  13. package/dist/codegen/instances.d.ts +2 -13
  14. package/dist/codegen/instances.js +23 -134
  15. package/dist/codegen/instances.js.map +1 -1
  16. package/dist/codegen/styles.d.ts +1 -11
  17. package/dist/codegen/styles.js +2 -130
  18. package/dist/codegen/styles.js.map +1 -1
  19. package/dist/merge/applyOps.d.ts +4 -1
  20. package/dist/merge/applyOps.js +42 -30
  21. package/dist/merge/applyOps.js.map +1 -1
  22. package/dist/merge/childrenOrder.d.ts +13 -0
  23. package/dist/merge/childrenOrder.js +51 -0
  24. package/dist/merge/childrenOrder.js.map +1 -0
  25. package/dist/merge/threeWay.d.ts +1 -1
  26. package/dist/merge/toEdits.d.ts +1 -3
  27. package/dist/merge/toEdits.js +3 -94
  28. package/dist/merge/toEdits.js.map +1 -1
  29. package/dist/project/baseStore.d.ts +11 -1
  30. package/dist/project/baseStore.js +13 -0
  31. package/dist/project/baseStore.js.map +1 -1
  32. package/dist/services/adoptService.js +11 -0
  33. package/dist/services/adoptService.js.map +1 -1
  34. package/dist/services/syncEngine.d.ts +1 -1
  35. package/dist/services/syncEngine.js +297 -60
  36. package/dist/services/syncEngine.js.map +1 -1
  37. package/dist/types.d.ts +28 -1
  38. package/dist/types.js +3 -0
  39. package/dist/types.js.map +1 -1
  40. package/dist/ui/report.d.ts +7 -0
  41. package/dist/ui/report.js +8 -0
  42. package/dist/ui/report.js.map +1 -1
  43. package/package.json +3 -2
@@ -1,4 +1,4 @@
1
- import { type Bootstrap, type RenderDomNode } from '../types.js';
1
+ import { type Bootstrap, type RenderDomNode, type SourceEntity } from '../types.js';
2
2
  import type { JpatchClient } from './client.js';
3
3
  export interface PageEntity {
4
4
  id: string;
@@ -57,6 +57,8 @@ export interface ProjectState {
57
57
  navigation: NavigationDocument;
58
58
  style: StyleConfig;
59
59
  assets: AssetIndex;
60
+ /** Stored source text per page/component id — only containers that have one. */
61
+ sources: Map<string, SourceEntity>;
60
62
  }
61
63
  /** Pages on the real backend carry no route; derive a stable one from the name. */
62
64
  export declare function deriveRoute(name: string): string;
@@ -1,5 +1,5 @@
1
1
  import axios from 'axios';
2
- import { sidecarOf } from '../types.js';
2
+ import { sidecarOf, } from '../types.js';
3
3
  // ---- Hash-linked blob resolution (RFC-0001 §4.1) ----
4
4
  // The real backend embeds children as hash STRINGS, never inlined: a page blob
5
5
  // is {id, name, root: "b3:…"} and a node blob is {id, key?, type, props,
@@ -159,8 +159,31 @@ export async function fetchProjectState(client, boot) {
159
159
  navigation: navigationBlob,
160
160
  style,
161
161
  assets,
162
+ sources: await fetchSources(client, boot),
162
163
  };
163
164
  }
165
+ /** The `sources` index (RFC-0001 A12), keyed by container id; empty when the manifest has none. */
166
+ async function fetchSources(client, boot) {
167
+ const sources = new Map();
168
+ if (boot.manifest.sources === undefined)
169
+ return sources;
170
+ const index = (await client.getObject(boot.manifest.sources));
171
+ const blobs = await fetchObjects(client, Object.values(index));
172
+ for (const [indexId, hash] of Object.entries(index)) {
173
+ const blob = blobs.get(hash);
174
+ if (typeof blob.of !== 'string' || typeof blob.text !== 'string') {
175
+ throw new Error(`source blob ${indexId} is missing of/text — schema drift, update the CLI`);
176
+ }
177
+ sources.set(blob.of, {
178
+ id: blob.id ?? indexId,
179
+ of: blob.of,
180
+ lang: typeof blob.lang === 'string' ? blob.lang : 'tsx',
181
+ text: blob.text,
182
+ ...(typeof blob.docHash === 'string' ? { docHash: blob.docHash } : {}),
183
+ });
184
+ }
185
+ return sources;
186
+ }
164
187
  /**
165
188
  * Upload binary asset bodies: `objects/have` filters to genuinely missing
166
189
  * hashes, then PUT bytes to each signed URL (RFC-0001 §6, binary assets).
@@ -1 +1 @@
1
- {"version":3,"file":"objects.js","sourceRoot":"","sources":["../../src/api/objects.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"objects.js","sourceRoot":"","sources":["../../src/api/objects.ts"],"names":[],"mappings":"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"}
@@ -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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"txPlan.js","sourceRoot":"","sources":["../../src/api/txPlan.ts"],"names":[],"mappings":"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"}
@@ -1,34 +1,5 @@
1
- import type { RenderDomNode } from '../types.js';
2
- export declare const GENERATED_HEADER: string;
3
- /** `// mapples-route: <id> — “<name>”` — the first such line names the route a file renders. */
4
- export declare const ROUTE_MARKER: RegExp;
5
- export declare function routeMarkerLine(routeId: string, routeName: string): string;
6
- export declare function readRouteMarker(source: string): string | null;
7
- /** Ensure `source` opens with the marker for `routeId`; replaces a stale marker, never duplicates. */
8
- export declare function withRouteMarker(source: string, routeId: string, routeName: string): string;
9
- export declare function withoutRouteMarker(source: string): string;
10
- /**
11
- * The exported component name for a page: the page name in PascalCase, with
12
- * no suffix. `taken` lists identifiers the file already imports (a page named
13
- * “View” must not shadow the `View` it renders) — a collision gets `Screen`.
14
- */
15
- export declare function pageComponentName(pageName: string, taken?: Iterable<string>,
16
- /** Appended when the name is taken or reserved: a page becomes `…Screen`, a component `…Component`. */
17
- suffix?: 'Screen' | 'Component'): string;
18
- export interface EmitPageInput {
19
- name: string;
20
- root: RenderDomNode;
21
- /** Present for a routed page: the file opens with its route marker. */
22
- route?: {
23
- id: string;
24
- name: string;
25
- };
26
- }
1
+ import { type EmitComponentInput, type EmitPageInput } from '@mapples/codegen';
2
+ export { COMPONENT_HEADER, GENERATED_HEADER, pageComponentName, readRouteMarker, ROUTE_MARKER, routeMarkerLine, withoutRouteMarker, withRouteMarker, type EmitComponentInput, type EmitPageInput, } from '@mapples/codegen';
27
3
  export declare function emitPage(page: EmitPageInput, filePath?: string): Promise<string>;
28
- export declare const COMPONENT_HEADER: string;
29
- export interface EmitComponentInput {
30
- name: string;
31
- root: RenderDomNode;
32
- }
33
4
  /** A Creator component as a file: same shape as a page, no route. */
34
5
  export declare function emitComponent(component: EmitComponentInput, filePath?: string): Promise<string>;
@@ -1,154 +1,14 @@
1
- // RenderDom page -> complete page file. Deterministic: stable prop order
2
- // (sid-ast printer), stable import order, Prettier-formatted.
3
- //
4
- // A page file lives where expo-router expects the route (RFC-0002 §5 file
5
- // layout): `app/<segment>.tsx` for a routed page, `<pagesDir>/<Name>.tsx` for
6
- // a page that is not in the navigation yet. Routed files open with a route
7
- // marker line that carries the route id — the file's identity for renames.
8
- import { printNode, printValue } from '@mapples/sid-ast';
9
- import { collectImports, printImports } from './imports.js';
1
+ // RenderDom page -> complete page file, Prettier-formatted with the target
2
+ // project's config. The generation itself lives in @mapples/codegen (pure),
3
+ // shared with the Creator's code editor; this module adds the formatting.
4
+ import { emitComponent as emitComponentText, emitPage as emitPageText, } from '@mapples/codegen';
10
5
  import { formatTsx } from './format.js';
11
- import { hoistStyles, STYLE_MODULE } from './styles.js';
12
- export const GENERATED_HEADER = '// Generated by Mapples — edit freely, but keep the $sid props intact.\n' +
13
- '// Two-way sync: `mapples sync` reconciles this file with Mapples Creator.';
14
- /** `// mapples-route: <id> — “<name>”` — the first such line names the route a file renders. */
15
- export const ROUTE_MARKER = /\/\/\s*mapples-route:\s*([A-Za-z0-9_-]+)/;
16
- export function routeMarkerLine(routeId, routeName) {
17
- return `// mapples-route: ${routeId} — “${routeName}”. Renaming this file renames the route in Creator on the next \`mapples sync\`.`;
18
- }
19
- export function readRouteMarker(source) {
20
- return ROUTE_MARKER.exec(source)?.[1] ?? null;
21
- }
22
- /** Ensure `source` opens with the marker for `routeId`; replaces a stale marker, never duplicates. */
23
- export function withRouteMarker(source, routeId, routeName) {
24
- const line = routeMarkerLine(routeId, routeName);
25
- const lines = source.split('\n');
26
- const idx = lines.findIndex((l) => ROUTE_MARKER.test(l));
27
- if (idx === -1)
28
- return `${line}\n${source}`;
29
- if (lines[idx] === line)
30
- return source;
31
- lines[idx] = line;
32
- return lines.join('\n');
33
- }
34
- export function withoutRouteMarker(source) {
35
- const lines = source.split('\n');
36
- const idx = lines.findIndex((l) => ROUTE_MARKER.test(l));
37
- if (idx === -1)
38
- return source;
39
- lines.splice(idx, 1);
40
- // A marker was followed by its own blank line; drop it so the file does not grow a gap.
41
- if (idx === 0 && lines[0] === '')
42
- lines.shift();
43
- return lines.join('\n');
44
- }
45
- const RESERVED = new Set([
46
- 'default',
47
- 'function',
48
- 'class',
49
- 'return',
50
- 'export',
51
- 'import',
52
- 'new',
53
- 'delete',
54
- 'in',
55
- 'of',
56
- 'for',
57
- 'if',
58
- 'else',
59
- 'switch',
60
- 'case',
61
- 'while',
62
- 'do',
63
- 'var',
64
- 'let',
65
- 'const',
66
- 'this',
67
- 'super',
68
- 'null',
69
- 'true',
70
- 'false',
71
- 'void',
72
- 'typeof',
73
- 'with',
74
- 'yield',
75
- 'await',
76
- 'enum',
77
- 'extends',
78
- 'try',
79
- 'catch',
80
- 'finally',
81
- 'throw',
82
- 'break',
83
- 'continue',
84
- 'debugger',
85
- 'instanceof',
86
- 'static',
87
- 'interface',
88
- 'package',
89
- 'private',
90
- 'protected',
91
- 'public',
92
- 'implements',
93
- ]);
94
- /**
95
- * The exported component name for a page: the page name in PascalCase, with
96
- * no suffix. `taken` lists identifiers the file already imports (a page named
97
- * “View” must not shadow the `View` it renders) — a collision gets `Screen`.
98
- */
99
- export function pageComponentName(pageName, taken = [],
100
- /** Appended when the name is taken or reserved: a page becomes `…Screen`, a component `…Component`. */
101
- suffix = 'Screen') {
102
- let pascal = pageName
103
- .split(/[^A-Za-z0-9]+/)
104
- .filter(Boolean)
105
- .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
106
- .join('');
107
- if (pascal === '' || /^[0-9]/.test(pascal))
108
- pascal = `Page${pascal}`;
109
- const used = new Set(taken);
110
- if (used.has(pascal) || RESERVED.has(pascal.toLowerCase()))
111
- pascal = `${pascal}${suffix}`;
112
- return pascal;
113
- }
6
+ export { COMPONENT_HEADER, GENERATED_HEADER, pageComponentName, readRouteMarker, ROUTE_MARKER, routeMarkerLine, withoutRouteMarker, withRouteMarker, } from '@mapples/codegen';
114
7
  export async function emitPage(page, filePath) {
115
- return emitTree(page.name, page.root, page.route ? [routeMarkerLine(page.route.id, page.route.name)] : [], filePath);
8
+ return formatTsx(emitPageText(page), filePath);
116
9
  }
117
- export const COMPONENT_HEADER = '// Generated by Mapples — a Creator component. Edit freely, keep the $sid props intact.\n' +
118
- '// Two-way sync: `mapples sync` reconciles this file with Mapples Creator.';
119
10
  /** A Creator component as a file: same shape as a page, no route. */
120
11
  export async function emitComponent(component, filePath) {
121
- return emitTree(component.name, component.root, [], filePath, COMPONENT_HEADER, 'Component');
122
- }
123
- async function emitTree(name, root, leading, filePath, header = GENERATED_HEADER, suffix = 'Screen') {
124
- const imports = collectImports(root);
125
- // Styles live in a `Styler.create` dictionary below the component, the way
126
- // hand-written Mapples code keeps them — never inline in the JSX.
127
- const styles = hoistStyles(root);
128
- const jsx = printNode(root, ' ', { styleRef: styles.refFor });
129
- const componentName = pageComponentName(name, [...imports.uiNames, ...imports.customs.keys(), styles.dictName, 'Styler'], suffix);
130
- const code = [
131
- ...leading,
132
- header,
133
- '',
134
- printImports(imports),
135
- ...(styles.entries.length > 0 ? [`import { Styler } from '${STYLE_MODULE}';`] : []),
136
- '',
137
- `export default function ${componentName}() {`,
138
- ' return (',
139
- jsx,
140
- ' );',
141
- '}',
142
- ...(styles.entries.length > 0
143
- ? [
144
- '',
145
- `const ${styles.dictName} = Styler.create({`,
146
- ...styles.entries.map(([key, value]) => ` ${key}: ${printValue(value)},`),
147
- '});',
148
- ]
149
- : []),
150
- '',
151
- ].join('\n');
152
- return formatTsx(code, filePath);
12
+ return formatTsx(emitComponentText(component), filePath);
153
13
  }
154
14
  //# sourceMappingURL=emit.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/codegen/emit.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/codegen/emit.ts"],"names":[],"mappings":"AAAA,2EAA2E;AAC3E,4EAA4E;AAC5E,0EAA0E;AAE1E,OAAO,EACL,aAAa,IAAI,iBAAiB,EAClC,QAAQ,IAAI,YAAY,GAGzB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,OAAO,EACL,gBAAgB,EAChB,gBAAgB,EAChB,iBAAiB,EACjB,eAAe,EACf,YAAY,EACZ,eAAe,EACf,kBAAkB,EAClB,eAAe,GAGhB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAmB,EAAE,QAAiB;IACnE,OAAO,SAAS,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,CAAC;AACjD,CAAC;AAED,qEAAqE;AACrE,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,SAA6B,EAC7B,QAAiB;IAEjB,OAAO,SAAS,CAAC,iBAAiB,CAAC,SAAS,CAAC,EAAE,QAAQ,CAAC,CAAC;AAC3D,CAAC"}
@@ -1,17 +1 @@
1
- import type { RenderDomNode } from '../types.js';
2
- export interface ResolvedImports {
3
- uiNames: string[];
4
- customs: Map<string, {
5
- module: string;
6
- exportName: string;
7
- }>;
8
- }
9
- export declare const UI_MODULE = "@mapples/ui";
10
- export declare function parseImportRef(ref: string): {
11
- module: string;
12
- exportName: string;
13
- };
14
- export declare function collectImports(root: RenderDomNode): ResolvedImports;
15
- export declare function printImports(resolved: ResolvedImports): string;
16
- /** ImportNeeds for @mapples/sid-ast upsertImports, from a merged tree. */
17
- export declare function importNeedsFor(root: import('../types.js').RenderDomNode): import('@mapples/sid-ast').ImportNeed[];
1
+ export { collectImports, importNeedsFor, parseImportRef, printImports, UI_MODULE, type ResolvedImports, } from '@mapples/codegen';