mapples 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +42 -0
- package/dist/adopt/mappingTable.d.ts +1 -0
- package/dist/adopt/mappingTable.js +18 -0
- package/dist/adopt/mappingTable.js.map +1 -0
- package/dist/adopt/scan.d.ts +4 -0
- package/dist/adopt/scan.js +51 -0
- package/dist/adopt/scan.js.map +1 -0
- package/dist/api/canonical.d.ts +12 -0
- package/dist/api/canonical.js +65 -0
- package/dist/api/canonical.js.map +1 -0
- package/dist/api/client.d.ts +37 -0
- package/dist/api/client.js +79 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/commit.d.ts +18 -0
- package/dist/api/commit.js +47 -0
- package/dist/api/commit.js.map +1 -0
- package/dist/api/errors.d.ts +30 -0
- package/dist/api/errors.js +74 -0
- package/dist/api/errors.js.map +1 -0
- package/dist/api/objects.d.ts +55 -0
- package/dist/api/objects.js +48 -0
- package/dist/api/objects.js.map +1 -0
- package/dist/api/poll.d.ts +10 -0
- package/dist/api/poll.js +33 -0
- package/dist/api/poll.js.map +1 -0
- package/dist/assets/assets.d.ts +15 -0
- package/dist/assets/assets.js +110 -0
- package/dist/assets/assets.js.map +1 -0
- package/dist/codegen/emit.d.ts +8 -0
- package/dist/codegen/emit.js +33 -0
- package/dist/codegen/emit.js.map +1 -0
- package/dist/codegen/format.d.ts +8 -0
- package/dist/codegen/format.js +24 -0
- package/dist/codegen/format.js.map +1 -0
- package/dist/codegen/imports.d.ts +15 -0
- package/dist/codegen/imports.js +79 -0
- package/dist/codegen/imports.js.map +1 -0
- package/dist/commands/adopt.d.ts +2 -0
- package/dist/commands/adopt.js +11 -0
- package/dist/commands/adopt.js.map +1 -0
- package/dist/commands/create.d.ts +2 -0
- package/dist/commands/create.js +13 -0
- package/dist/commands/create.js.map +1 -0
- package/dist/commands/doctor.d.ts +2 -0
- package/dist/commands/doctor.js +11 -0
- package/dist/commands/doctor.js.map +1 -0
- package/dist/commands/impl/adoptImpl.d.ts +1 -0
- package/dist/commands/impl/adoptImpl.js +24 -0
- package/dist/commands/impl/adoptImpl.js.map +1 -0
- package/dist/commands/impl/createImpl.d.ts +2 -0
- package/dist/commands/impl/createImpl.js +65 -0
- package/dist/commands/impl/createImpl.js.map +1 -0
- package/dist/commands/impl/doctorImpl.d.ts +1 -0
- package/dist/commands/impl/doctorImpl.js +25 -0
- package/dist/commands/impl/doctorImpl.js.map +1 -0
- package/dist/commands/impl/initImpl.d.ts +1 -0
- package/dist/commands/impl/initImpl.js +65 -0
- package/dist/commands/impl/initImpl.js.map +1 -0
- package/dist/commands/impl/syncImpl.d.ts +1 -0
- package/dist/commands/impl/syncImpl.js +34 -0
- package/dist/commands/impl/syncImpl.js.map +1 -0
- package/dist/commands/init.d.ts +2 -0
- package/dist/commands/init.js +13 -0
- package/dist/commands/init.js.map +1 -0
- package/dist/commands/sync.d.ts +2 -0
- package/dist/commands/sync.js +13 -0
- package/dist/commands/sync.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.js +23 -0
- package/dist/index.js.map +1 -0
- package/dist/merge/applyOps.d.ts +11 -0
- package/dist/merge/applyOps.js +134 -0
- package/dist/merge/applyOps.js.map +1 -0
- package/dist/merge/deprecate.d.ts +3 -0
- package/dist/merge/deprecate.js +28 -0
- package/dist/merge/deprecate.js.map +1 -0
- package/dist/merge/diff.d.ts +15 -0
- package/dist/merge/diff.js +124 -0
- package/dist/merge/diff.js.map +1 -0
- package/dist/merge/mergePatch.d.ts +8 -0
- package/dist/merge/mergePatch.js +63 -0
- package/dist/merge/mergePatch.js.map +1 -0
- package/dist/merge/threeWay.d.ts +15 -0
- package/dist/merge/threeWay.js +242 -0
- package/dist/merge/threeWay.js.map +1 -0
- package/dist/merge/toEdits.d.ts +3 -0
- package/dist/merge/toEdits.js +92 -0
- package/dist/merge/toEdits.js.map +1 -0
- package/dist/nav/routeTree.d.ts +11 -0
- package/dist/nav/routeTree.js +182 -0
- package/dist/nav/routeTree.js.map +1 -0
- package/dist/project/baseStore.d.ts +19 -0
- package/dist/project/baseStore.js +78 -0
- package/dist/project/baseStore.js.map +1 -0
- package/dist/project/config.d.ts +13 -0
- package/dist/project/config.js +28 -0
- package/dist/project/config.js.map +1 -0
- package/dist/project/head.d.ts +6 -0
- package/dist/project/head.js +22 -0
- package/dist/project/head.js.map +1 -0
- package/dist/project/outbox.d.ts +14 -0
- package/dist/project/outbox.js +31 -0
- package/dist/project/outbox.js.map +1 -0
- package/dist/project/pagesMap.d.ts +8 -0
- package/dist/project/pagesMap.js +20 -0
- package/dist/project/pagesMap.js.map +1 -0
- package/dist/services/adoptService.d.ts +11 -0
- package/dist/services/adoptService.js +197 -0
- package/dist/services/adoptService.js.map +1 -0
- package/dist/services/doctorService.d.ts +11 -0
- package/dist/services/doctorService.js +135 -0
- package/dist/services/doctorService.js.map +1 -0
- package/dist/services/scaffold.d.ts +7 -0
- package/dist/services/scaffold.js +56 -0
- package/dist/services/scaffold.js.map +1 -0
- package/dist/services/syncEngine.d.ts +11 -0
- package/dist/services/syncEngine.js +618 -0
- package/dist/services/syncEngine.js.map +1 -0
- package/dist/style/theme.d.ts +12 -0
- package/dist/style/theme.js +125 -0
- package/dist/style/theme.js.map +1 -0
- package/dist/types.d.ts +136 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/ui/report.d.ts +24 -0
- package/dist/ui/report.js +50 -0
- package/dist/ui/report.js.map +1 -0
- package/package.json +38 -0
- package/templates/app/_layout.tsx +5 -0
- package/templates/app.json +15 -0
- package/templates/babel.config.js +8 -0
- package/templates/gitignore +7 -0
- package/templates/mapples/sid.d.ts +13 -0
- package/templates/package.json +30 -0
- package/templates/tsconfig.json +10 -0
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { StyleConfig } from '../api/objects.js';
|
|
2
|
+
import type { JpatchOp } from '../types.js';
|
|
3
|
+
import type { SyncReport } from '../ui/report.js';
|
|
4
|
+
export declare const THEME_FILE: string;
|
|
5
|
+
export declare function renderThemeFile(style: StyleConfig): string;
|
|
6
|
+
export declare function parseThemeFile(source: string): StyleConfig | null;
|
|
7
|
+
export interface StyleSyncResult {
|
|
8
|
+
pushOps: JpatchOp[];
|
|
9
|
+
mergedStyle: StyleConfig;
|
|
10
|
+
}
|
|
11
|
+
/** 3-way merge of the style entity; writes mapples/theme.ts; returns push ops. */
|
|
12
|
+
export declare function syncStyleFile(root: string, base: StyleConfig | null, remote: StyleConfig | null, report: SyncReport): StyleSyncResult;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
// Style entity <-> mapples/theme.ts. The file exports three literal objects
|
|
2
|
+
// (theme, typography, sizing); edits merge per section per key, same 3-way
|
|
3
|
+
// discipline as pages: disjoint auto-merges, same-key conflicts deprecate.
|
|
4
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
5
|
+
import { dirname, join, relative } from 'node:path';
|
|
6
|
+
import { extractExportedObjects } from '@mapples/sid-ast';
|
|
7
|
+
import { deprecateFile } from '../merge/deprecate.js';
|
|
8
|
+
import { applyMergePatch, buildMergePatch, deepEqual } from '../merge/mergePatch.js';
|
|
9
|
+
export const THEME_FILE = join('mapples', 'theme.ts');
|
|
10
|
+
const SECTIONS = ['theme', 'typography', 'sizing'];
|
|
11
|
+
const ENTITY_BY_SECTION = {
|
|
12
|
+
theme: 'Theme',
|
|
13
|
+
typography: 'Typography',
|
|
14
|
+
sizing: 'Sizing',
|
|
15
|
+
};
|
|
16
|
+
export function renderThemeFile(style) {
|
|
17
|
+
const print = (v) => JSON.stringify(v, null, 2).replace(/"([A-Za-z_$][\w$]*)":/g, '$1:');
|
|
18
|
+
return [
|
|
19
|
+
'// Managed by Mapples — design tokens sync with Creator via `mapples sync`.',
|
|
20
|
+
'// Edit values freely; keys you add here are pushed to the canvas style config.',
|
|
21
|
+
'',
|
|
22
|
+
`export const theme = ${print(style.theme)} as const;`,
|
|
23
|
+
'',
|
|
24
|
+
`export const typography = ${print(style.typography)} as const;`,
|
|
25
|
+
'',
|
|
26
|
+
`export const sizing = ${print(style.sizing)} as const;`,
|
|
27
|
+
'',
|
|
28
|
+
].join('\n');
|
|
29
|
+
}
|
|
30
|
+
export function parseThemeFile(source) {
|
|
31
|
+
const { values } = extractExportedObjects(source);
|
|
32
|
+
const theme = values.get('theme');
|
|
33
|
+
const typography = values.get('typography');
|
|
34
|
+
const sizing = values.get('sizing');
|
|
35
|
+
if (typeof theme !== 'object' ||
|
|
36
|
+
theme === null ||
|
|
37
|
+
typeof typography !== 'object' ||
|
|
38
|
+
typography === null ||
|
|
39
|
+
typeof sizing !== 'object' ||
|
|
40
|
+
sizing === null) {
|
|
41
|
+
return null;
|
|
42
|
+
}
|
|
43
|
+
return {
|
|
44
|
+
theme: theme,
|
|
45
|
+
typography: typography,
|
|
46
|
+
sizing: sizing,
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
/** 3-way merge of the style entity; writes mapples/theme.ts; returns push ops. */
|
|
50
|
+
export function syncStyleFile(root, base, remote, report) {
|
|
51
|
+
const empty = { theme: {}, typography: {}, sizing: {} };
|
|
52
|
+
const baseStyle = base ?? empty;
|
|
53
|
+
const remoteStyle = remote ?? baseStyle;
|
|
54
|
+
const filePath = join(root, THEME_FILE);
|
|
55
|
+
const pushOps = [];
|
|
56
|
+
const isEmpty = (sc) => SECTIONS.every((s) => Object.keys(sc[s]).length === 0);
|
|
57
|
+
if (!existsSync(filePath) && isEmpty(baseStyle) && isEmpty(remoteStyle)) {
|
|
58
|
+
return { pushOps: [], mergedStyle: remoteStyle };
|
|
59
|
+
}
|
|
60
|
+
let local = null;
|
|
61
|
+
if (existsSync(filePath)) {
|
|
62
|
+
local = parseThemeFile(readFileSync(filePath, 'utf8'));
|
|
63
|
+
if (local === null) {
|
|
64
|
+
report.warnings.push({
|
|
65
|
+
kind: 'NON_LITERAL_PROP',
|
|
66
|
+
detail: `${THEME_FILE} exports are not literal objects — local style edits ignored this run`,
|
|
67
|
+
prop: 'theme',
|
|
68
|
+
});
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
const localStyle = local ?? baseStyle;
|
|
72
|
+
const merged = { ...empty };
|
|
73
|
+
let conflicted = false;
|
|
74
|
+
for (const section of SECTIONS) {
|
|
75
|
+
const b = baseStyle[section];
|
|
76
|
+
const l = localStyle[section];
|
|
77
|
+
const r = remoteStyle[section];
|
|
78
|
+
const lPatch = buildMergePatch(b, l) ?? {};
|
|
79
|
+
const rPatch = buildMergePatch(b, r) ?? {};
|
|
80
|
+
const overlap = Object.keys(lPatch).filter((k) => k in rPatch && !deepEqual(lPatch[k], rPatch[k]));
|
|
81
|
+
if (overlap.length > 0) {
|
|
82
|
+
conflicted = true;
|
|
83
|
+
report.conflicts.push({
|
|
84
|
+
file: THEME_FILE,
|
|
85
|
+
sid: `style.${section}`,
|
|
86
|
+
reason: 'same-prop',
|
|
87
|
+
props: overlap,
|
|
88
|
+
localValue: lPatch[overlap[0]],
|
|
89
|
+
remoteValue: rPatch[overlap[0]],
|
|
90
|
+
detail: `both sides changed ${section}.${overlap.join(', ')}`,
|
|
91
|
+
});
|
|
92
|
+
}
|
|
93
|
+
// remote first, local second (overlaps only survive when not conflicted).
|
|
94
|
+
const withRemote = applyMergePatch(b, rPatch);
|
|
95
|
+
merged[section] = applyMergePatch(withRemote, lPatch);
|
|
96
|
+
}
|
|
97
|
+
if (conflicted) {
|
|
98
|
+
let deprecatedTo;
|
|
99
|
+
if (existsSync(filePath))
|
|
100
|
+
deprecatedTo = relative(root, deprecateFile(filePath));
|
|
101
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
102
|
+
writeFileSync(filePath, renderThemeFile(remoteStyle));
|
|
103
|
+
report.files.push({
|
|
104
|
+
file: THEME_FILE,
|
|
105
|
+
action: 'deprecated',
|
|
106
|
+
detail: `style conflict — your version kept at ${deprecatedTo ?? '(none)'}`,
|
|
107
|
+
});
|
|
108
|
+
return { pushOps: [], mergedStyle: remoteStyle };
|
|
109
|
+
}
|
|
110
|
+
for (const section of SECTIONS) {
|
|
111
|
+
const push = buildMergePatch(remoteStyle[section], merged[section]);
|
|
112
|
+
if (push !== null) {
|
|
113
|
+
pushOps.push({ op: 'update', entity: ENTITY_BY_SECTION[section], patch: push });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
const desired = renderThemeFile(merged);
|
|
117
|
+
const current = existsSync(filePath) ? readFileSync(filePath, 'utf8') : null;
|
|
118
|
+
if (current !== desired) {
|
|
119
|
+
mkdirSync(dirname(filePath), { recursive: true });
|
|
120
|
+
writeFileSync(filePath, desired);
|
|
121
|
+
report.files.push({ file: THEME_FILE, action: current === null ? 'created' : 'updated' });
|
|
122
|
+
}
|
|
123
|
+
return { pushOps, mergedStyle: merged };
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=theme.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"theme.js","sourceRoot":"","sources":["../../src/style/theme.ts"],"names":[],"mappings":"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"}
|
package/dist/types.d.ts
ADDED
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
export interface RenderDomNode {
|
|
2
|
+
sid: string;
|
|
3
|
+
type: string;
|
|
4
|
+
props: Record<string, unknown>;
|
|
5
|
+
children: RenderDomNode[];
|
|
6
|
+
}
|
|
7
|
+
export interface CustomNodeProps {
|
|
8
|
+
name: string;
|
|
9
|
+
importRef: string;
|
|
10
|
+
layout: Record<string, unknown>;
|
|
11
|
+
fallbackSize: {
|
|
12
|
+
w: number;
|
|
13
|
+
h: number;
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
export interface CustomNode extends RenderDomNode {
|
|
17
|
+
type: 'Custom';
|
|
18
|
+
props: CustomNodeProps & Record<string, unknown>;
|
|
19
|
+
}
|
|
20
|
+
export declare function isCustomNode(node: RenderDomNode): node is CustomNode;
|
|
21
|
+
export interface ChildrenDirective {
|
|
22
|
+
move?: {
|
|
23
|
+
ref: string;
|
|
24
|
+
to: number;
|
|
25
|
+
}[];
|
|
26
|
+
insert?: {
|
|
27
|
+
ref: string;
|
|
28
|
+
at: number;
|
|
29
|
+
}[];
|
|
30
|
+
remove?: string[];
|
|
31
|
+
}
|
|
32
|
+
export interface JpatchOp {
|
|
33
|
+
op: 'create' | 'update' | 'delete';
|
|
34
|
+
entity: string;
|
|
35
|
+
id?: string;
|
|
36
|
+
cid?: string;
|
|
37
|
+
data?: Record<string, unknown>;
|
|
38
|
+
patch?: Record<string, unknown>;
|
|
39
|
+
children?: ChildrenDirective;
|
|
40
|
+
hash?: string;
|
|
41
|
+
cascade?: boolean;
|
|
42
|
+
}
|
|
43
|
+
export interface EnvelopeMeta {
|
|
44
|
+
actor?: string;
|
|
45
|
+
origin?: string;
|
|
46
|
+
ts?: string;
|
|
47
|
+
}
|
|
48
|
+
export interface Envelope {
|
|
49
|
+
protocol: 'jpatch/1';
|
|
50
|
+
schema: 1;
|
|
51
|
+
txId: string;
|
|
52
|
+
base: string;
|
|
53
|
+
ops: JpatchOp[];
|
|
54
|
+
revertTo?: string;
|
|
55
|
+
meta?: EnvelopeMeta;
|
|
56
|
+
}
|
|
57
|
+
export interface Manifest {
|
|
58
|
+
pages: string;
|
|
59
|
+
components: string;
|
|
60
|
+
navigation: string;
|
|
61
|
+
style: string;
|
|
62
|
+
assets: string;
|
|
63
|
+
}
|
|
64
|
+
export interface CommitOk {
|
|
65
|
+
txId: string;
|
|
66
|
+
base: string;
|
|
67
|
+
head: string;
|
|
68
|
+
seq: number;
|
|
69
|
+
committed: number;
|
|
70
|
+
idMap: Record<string, string>;
|
|
71
|
+
manifest: Manifest;
|
|
72
|
+
replayed?: boolean;
|
|
73
|
+
warnings?: string[];
|
|
74
|
+
}
|
|
75
|
+
export interface Delta {
|
|
76
|
+
ops: JpatchOp[];
|
|
77
|
+
head: string;
|
|
78
|
+
seq: number;
|
|
79
|
+
truncated: boolean;
|
|
80
|
+
}
|
|
81
|
+
export interface Bootstrap {
|
|
82
|
+
head: string;
|
|
83
|
+
seq: number;
|
|
84
|
+
manifest: Manifest;
|
|
85
|
+
}
|
|
86
|
+
export interface Span {
|
|
87
|
+
start: number;
|
|
88
|
+
end: number;
|
|
89
|
+
}
|
|
90
|
+
export type ExtractWarningKind = 'NON_LITERAL_PROP' | 'DUPLICATE_SID' | 'UNKNOWN_ELEMENT_WITH_SID';
|
|
91
|
+
export interface ExtractWarning {
|
|
92
|
+
kind: ExtractWarningKind;
|
|
93
|
+
sid?: string;
|
|
94
|
+
prop?: string;
|
|
95
|
+
detail: string;
|
|
96
|
+
}
|
|
97
|
+
export interface ExtractResult {
|
|
98
|
+
dom: RenderDomNode | null;
|
|
99
|
+
warnings: ExtractWarning[];
|
|
100
|
+
spans: Map<string, Span>;
|
|
101
|
+
}
|
|
102
|
+
export type NodeVerdict = {
|
|
103
|
+
kind: 'clean';
|
|
104
|
+
} | {
|
|
105
|
+
kind: 'applyRemote';
|
|
106
|
+
} | {
|
|
107
|
+
kind: 'keepLocal';
|
|
108
|
+
ops: JpatchOp[];
|
|
109
|
+
} | {
|
|
110
|
+
kind: 'autoMerge';
|
|
111
|
+
ops: JpatchOp[];
|
|
112
|
+
} | {
|
|
113
|
+
kind: 'conflict';
|
|
114
|
+
reason: 'same-prop' | 'delete-vs-edit';
|
|
115
|
+
detail: string;
|
|
116
|
+
};
|
|
117
|
+
export interface MergePlan {
|
|
118
|
+
verdicts: Map<string, NodeVerdict>;
|
|
119
|
+
deprecations: string[];
|
|
120
|
+
}
|
|
121
|
+
export interface AdoptCandidate {
|
|
122
|
+
file: string;
|
|
123
|
+
componentName: string;
|
|
124
|
+
kind: 'page' | 'component';
|
|
125
|
+
}
|
|
126
|
+
export type Classification = {
|
|
127
|
+
kind: 'primitive';
|
|
128
|
+
mapplesType: string;
|
|
129
|
+
} | {
|
|
130
|
+
kind: 'custom';
|
|
131
|
+
importRef: string;
|
|
132
|
+
name: string;
|
|
133
|
+
} | {
|
|
134
|
+
kind: 'skip';
|
|
135
|
+
reason: string;
|
|
136
|
+
};
|
package/dist/types.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,sBAAsB;AAsBtB,MAAM,UAAU,YAAY,CAAC,IAAmB;IAC9C,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC;AAChC,CAAC"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { ExtractWarning } from '@mapples/sid-ast';
|
|
2
|
+
import type { ConflictDetail } from '../merge/threeWay.js';
|
|
3
|
+
export interface FileOutcome {
|
|
4
|
+
file: string;
|
|
5
|
+
action: 'created' | 'updated' | 'unchanged' | 'deprecated' | 'regenerated';
|
|
6
|
+
detail?: string;
|
|
7
|
+
}
|
|
8
|
+
export interface SyncReport {
|
|
9
|
+
pulledOps: number;
|
|
10
|
+
pushedOps: number;
|
|
11
|
+
files: FileOutcome[];
|
|
12
|
+
conflicts: (ConflictDetail & {
|
|
13
|
+
file: string;
|
|
14
|
+
deprecatedTo?: string;
|
|
15
|
+
})[];
|
|
16
|
+
warnings: (ExtractWarning & {
|
|
17
|
+
file?: string;
|
|
18
|
+
})[];
|
|
19
|
+
offline: boolean;
|
|
20
|
+
head: string | null;
|
|
21
|
+
notes: string[];
|
|
22
|
+
}
|
|
23
|
+
export declare function emptyReport(): SyncReport;
|
|
24
|
+
export declare function renderReport(report: SyncReport): string;
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// The sync report. Every lossy step surfaces here — nothing is silent.
|
|
2
|
+
import chalk from 'chalk';
|
|
3
|
+
export function emptyReport() {
|
|
4
|
+
return {
|
|
5
|
+
pulledOps: 0,
|
|
6
|
+
pushedOps: 0,
|
|
7
|
+
files: [],
|
|
8
|
+
conflicts: [],
|
|
9
|
+
warnings: [],
|
|
10
|
+
offline: false,
|
|
11
|
+
head: null,
|
|
12
|
+
notes: [],
|
|
13
|
+
};
|
|
14
|
+
}
|
|
15
|
+
export function renderReport(report) {
|
|
16
|
+
const lines = [];
|
|
17
|
+
const icon = {
|
|
18
|
+
created: chalk.green('A'),
|
|
19
|
+
updated: chalk.cyan('M'),
|
|
20
|
+
unchanged: chalk.gray('·'),
|
|
21
|
+
deprecated: chalk.red('D'),
|
|
22
|
+
regenerated: chalk.yellow('R'),
|
|
23
|
+
};
|
|
24
|
+
for (const f of report.files) {
|
|
25
|
+
if (f.action === 'unchanged')
|
|
26
|
+
continue;
|
|
27
|
+
lines.push(` ${icon[f.action]} ${f.file}${f.detail ? chalk.gray(` — ${f.detail}`) : ''}`);
|
|
28
|
+
}
|
|
29
|
+
if (report.conflicts.length > 0) {
|
|
30
|
+
lines.push(chalk.red.bold(`\n ${report.conflicts.length} conflict(s) — files deprecated, never overwritten:`));
|
|
31
|
+
for (const c of report.conflicts) {
|
|
32
|
+
lines.push(` ${chalk.red('!')} ${c.file} ${chalk.gray(`[${c.sid}]`)} ${c.reason}: ${c.detail}` +
|
|
33
|
+
(c.deprecatedTo ? chalk.gray(`\n your version: ${c.deprecatedTo}`) : ''));
|
|
34
|
+
if (c.props && c.localValue !== undefined) {
|
|
35
|
+
lines.push(chalk.gray(` local: ${JSON.stringify(c.localValue)} | creator: ${JSON.stringify(c.remoteValue)}`));
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
for (const w of report.warnings) {
|
|
40
|
+
lines.push(` ${chalk.yellow('⚠')} ${w.file ?? ''} ${w.kind}${w.sid ? ` [${w.sid}]` : ''}: ${w.detail}`);
|
|
41
|
+
}
|
|
42
|
+
for (const n of report.notes)
|
|
43
|
+
lines.push(` ${chalk.gray(n)}`);
|
|
44
|
+
lines.push(report.offline
|
|
45
|
+
? chalk.yellow(`\n offline — ${report.pushedOps} op(s) parked in .mapples/outbox`)
|
|
46
|
+
: chalk.bold(`\n pulled ${report.pulledOps} op(s), pushed ${report.pushedOps} op(s)`) +
|
|
47
|
+
(report.head ? chalk.gray(` @ ${report.head}`) : ''));
|
|
48
|
+
return lines.join('\n');
|
|
49
|
+
}
|
|
50
|
+
//# sourceMappingURL=report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"report.js","sourceRoot":"","sources":["../../src/ui/report.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "mapples",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Mapples CLI — two-way code sync between Creator and your Expo project",
|
|
5
|
+
"license": "MIT",
|
|
6
|
+
"author": "Oleksandr Soloviov <oleksolv@gmail.com>",
|
|
7
|
+
"type": "module",
|
|
8
|
+
"bin": "./dist/index.js",
|
|
9
|
+
"main": "./dist/index.js",
|
|
10
|
+
"types": "./dist/index.d.ts",
|
|
11
|
+
"files": [
|
|
12
|
+
"dist/",
|
|
13
|
+
"templates/",
|
|
14
|
+
"README.md"
|
|
15
|
+
],
|
|
16
|
+
"scripts": {
|
|
17
|
+
"build": "tsc -b",
|
|
18
|
+
"clean": "rm -rf dist *.tsbuildinfo"
|
|
19
|
+
},
|
|
20
|
+
"dependencies": {
|
|
21
|
+
"@mapples/sid-ast": "workspace:*",
|
|
22
|
+
"@noble/hashes": "^1.6.1",
|
|
23
|
+
"axios": "^1.7.9",
|
|
24
|
+
"chalk": "^5.4.1",
|
|
25
|
+
"commander": "^12.1.0",
|
|
26
|
+
"prettier": "^3.4.2",
|
|
27
|
+
"prompts": "^2.4.2",
|
|
28
|
+
"ulid": "^2.3.0"
|
|
29
|
+
},
|
|
30
|
+
"devDependencies": {
|
|
31
|
+
"@types/node": "^22.10.2",
|
|
32
|
+
"@types/prompts": "^2.4.9",
|
|
33
|
+
"typescript": "^5.7.2"
|
|
34
|
+
},
|
|
35
|
+
"engines": {
|
|
36
|
+
"node": ">=18.18"
|
|
37
|
+
}
|
|
38
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
{
|
|
2
|
+
"expo": {
|
|
3
|
+
"name": "__APP_NAME__",
|
|
4
|
+
"slug": "__APP_NAME__",
|
|
5
|
+
"version": "1.0.0",
|
|
6
|
+
"orientation": "portrait",
|
|
7
|
+
"scheme": "__APP_NAME__",
|
|
8
|
+
"userInterfaceStyle": "automatic",
|
|
9
|
+
"newArchEnabled": true,
|
|
10
|
+
"plugins": ["expo-router"],
|
|
11
|
+
"experiments": {
|
|
12
|
+
"typedRoutes": true
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// Generated by Mapples — do not delete. Makes the `$sid` tooling prop
|
|
2
|
+
// typecheck on every JSX element (RFC-0002 D8). `babel-plugin-mapples-sid`
|
|
3
|
+
// strips it from production bundles and keeps it in dev.
|
|
4
|
+
import 'react';
|
|
5
|
+
|
|
6
|
+
declare module 'react' {
|
|
7
|
+
interface Attributes {
|
|
8
|
+
/** Mapples canvas node id — tooling-only, stripped in production. */
|
|
9
|
+
$sid?: string;
|
|
10
|
+
/** Fallback size for Custom canvas nodes — tooling-only. */
|
|
11
|
+
$fallback?: { w: number; h: number };
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "__APP_NAME__",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"main": "expo-router/entry",
|
|
5
|
+
"scripts": {
|
|
6
|
+
"start": "expo start",
|
|
7
|
+
"android": "expo run:android",
|
|
8
|
+
"ios": "expo run:ios",
|
|
9
|
+
"web": "expo start --web",
|
|
10
|
+
"sync": "mapples sync"
|
|
11
|
+
},
|
|
12
|
+
"dependencies": {
|
|
13
|
+
"@mapples/render": "latest",
|
|
14
|
+
"@mapples/ui": "latest",
|
|
15
|
+
"expo": "~54.0.0",
|
|
16
|
+
"expo-router": "~6.0.0",
|
|
17
|
+
"expo-status-bar": "~3.0.0",
|
|
18
|
+
"react": "19.1.0",
|
|
19
|
+
"react-native": "0.81.4",
|
|
20
|
+
"react-native-safe-area-context": "~5.6.0",
|
|
21
|
+
"react-native-screens": "~4.16.0"
|
|
22
|
+
},
|
|
23
|
+
"devDependencies": {
|
|
24
|
+
"@babel/core": "^7.25.0",
|
|
25
|
+
"babel-plugin-mapples-sid": "latest",
|
|
26
|
+
"mapples": "latest",
|
|
27
|
+
"typescript": "~5.9.0"
|
|
28
|
+
},
|
|
29
|
+
"private": true
|
|
30
|
+
}
|