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,10 @@
|
|
|
1
|
+
import type { Delta } from '../types.js';
|
|
2
|
+
import type { JpatchClient } from './client.js';
|
|
3
|
+
export declare class SnapshotRequired extends Error {
|
|
4
|
+
constructor();
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* Pull the full delta since `head`, following `truncated: true` pages until
|
|
8
|
+
* exhausted (RFC-0001 §6). Throws SnapshotRequired when the server signals it.
|
|
9
|
+
*/
|
|
10
|
+
export declare function pullDelta(client: JpatchClient, since: string): Promise<Delta>;
|
package/dist/api/poll.js
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { JpatchError } from './errors.js';
|
|
2
|
+
export class SnapshotRequired extends Error {
|
|
3
|
+
constructor() {
|
|
4
|
+
super('client is too far behind (or base pruned) — cold bootstrap required');
|
|
5
|
+
this.name = 'SnapshotRequired';
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* Pull the full delta since `head`, following `truncated: true` pages until
|
|
10
|
+
* exhausted (RFC-0001 §6). Throws SnapshotRequired when the server signals it.
|
|
11
|
+
*/
|
|
12
|
+
export async function pullDelta(client, since) {
|
|
13
|
+
const ops = [];
|
|
14
|
+
let cursor = since;
|
|
15
|
+
for (;;) {
|
|
16
|
+
let page;
|
|
17
|
+
try {
|
|
18
|
+
page = await client.pullOnce(cursor);
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
if (err instanceof JpatchError && err.code === 'SNAPSHOT_REQUIRED') {
|
|
22
|
+
throw new SnapshotRequired();
|
|
23
|
+
}
|
|
24
|
+
throw err;
|
|
25
|
+
}
|
|
26
|
+
ops.push(...page.ops);
|
|
27
|
+
if (!page.truncated) {
|
|
28
|
+
return { ops, head: page.head, seq: page.seq, truncated: false };
|
|
29
|
+
}
|
|
30
|
+
cursor = page.head;
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=poll.js.map
|
|
@@ -0,0 +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;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,MAAoB,EAAE,KAAa;IACjE,MAAM,GAAG,GAAe,EAAE,CAAC;IAC3B,IAAI,MAAM,GAAG,KAAK,CAAC;IACnB,SAAS,CAAC;QACR,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,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,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { JpatchClient } from '../api/client.js';
|
|
2
|
+
import type { AssetIndex } from '../api/objects.js';
|
|
3
|
+
import type { JpatchOp } from '../types.js';
|
|
4
|
+
import type { SyncReport } from '../ui/report.js';
|
|
5
|
+
export declare const ASSETS_DIR: string;
|
|
6
|
+
export declare const ASSET_MAP_FILE: string;
|
|
7
|
+
export interface AssetSyncResult {
|
|
8
|
+
pushOps: JpatchOp[];
|
|
9
|
+
mergedAssets: AssetIndex;
|
|
10
|
+
}
|
|
11
|
+
export declare function syncAssets(root: string, client: JpatchClient, remote: AssetIndex | null, report: SyncReport): Promise<AssetSyncResult>;
|
|
12
|
+
/** Regenerate mapples/assetMap.ts from the index. CLI-owned file. */
|
|
13
|
+
export declare function writeAssetMap(root: string, index: AssetIndex, report?: SyncReport): void;
|
|
14
|
+
/** After commit, swap the cid keys in the asset index for the server-minted as_ ids. */
|
|
15
|
+
export declare function resolveAssetIds(index: AssetIndex, idMap: Record<string, string>): AssetIndex;
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
// Asset pull/upload + assetMap.ts generation. Binary bodies are content-
|
|
2
|
+
// addressed (sha256) and travel via objects/have + signed PUT / objects GET —
|
|
3
|
+
// never inside a JPATCH envelope (RFC-0001 §6).
|
|
4
|
+
import { createHash } from 'node:crypto';
|
|
5
|
+
import { existsSync, mkdirSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
|
|
6
|
+
import { extname, join } from 'node:path';
|
|
7
|
+
import { uploadMissingAssets } from '../api/objects.js';
|
|
8
|
+
import { mintCid } from '../api/commit.js';
|
|
9
|
+
export const ASSETS_DIR = join('mapples', 'assets');
|
|
10
|
+
export const ASSET_MAP_FILE = join('mapples', 'assetMap.ts');
|
|
11
|
+
const MIME_BY_EXT = {
|
|
12
|
+
'.png': 'image/png',
|
|
13
|
+
'.jpg': 'image/jpeg',
|
|
14
|
+
'.jpeg': 'image/jpeg',
|
|
15
|
+
'.gif': 'image/gif',
|
|
16
|
+
'.webp': 'image/webp',
|
|
17
|
+
'.svg': 'image/svg+xml',
|
|
18
|
+
'.mp4': 'video/mp4',
|
|
19
|
+
'.ttf': 'font/ttf',
|
|
20
|
+
'.otf': 'font/otf',
|
|
21
|
+
'.json': 'application/json',
|
|
22
|
+
};
|
|
23
|
+
const EXT_BY_MIME = Object.fromEntries(Object.entries(MIME_BY_EXT).map(([ext, mime]) => [mime, ext]));
|
|
24
|
+
export async function syncAssets(root, client, remote, report) {
|
|
25
|
+
const dir = join(root, ASSETS_DIR);
|
|
26
|
+
const index = structuredClone(remote ?? {});
|
|
27
|
+
const pushOps = [];
|
|
28
|
+
const knownShas = new Set(Object.values(index).map((a) => a.sha256));
|
|
29
|
+
const namesInIndex = new Map(Object.entries(index).map(([id, a]) => [a.name ?? id, id]));
|
|
30
|
+
// 1. Pull: remote assets not on disk get downloaded.
|
|
31
|
+
for (const [id, meta] of Object.entries(index)) {
|
|
32
|
+
const fileName = meta.name ?? `${id}${EXT_BY_MIME[meta.mime] ?? ''}`;
|
|
33
|
+
const filePath = join(dir, fileName);
|
|
34
|
+
if (existsSync(filePath))
|
|
35
|
+
continue;
|
|
36
|
+
const bytes = await client.getObjectBytes(`sha256:${meta.sha256}`);
|
|
37
|
+
mkdirSync(dir, { recursive: true });
|
|
38
|
+
writeFileSync(filePath, bytes);
|
|
39
|
+
report.files.push({ file: join(ASSETS_DIR, fileName), action: 'created' });
|
|
40
|
+
}
|
|
41
|
+
// 2. Push: local files not in the index get uploaded + Asset create ops.
|
|
42
|
+
if (existsSync(dir)) {
|
|
43
|
+
const uploads = new Map();
|
|
44
|
+
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
45
|
+
if (!entry.isFile() || entry.name.startsWith('.'))
|
|
46
|
+
continue;
|
|
47
|
+
const bytes = readFileSync(join(dir, entry.name));
|
|
48
|
+
const sha = createHash('sha256').update(bytes).digest('hex');
|
|
49
|
+
if (knownShas.has(sha) || namesInIndex.has(entry.name))
|
|
50
|
+
continue;
|
|
51
|
+
const mime = MIME_BY_EXT[extname(entry.name).toLowerCase()];
|
|
52
|
+
if (!mime) {
|
|
53
|
+
report.notes.push(`asset ${entry.name}: unknown extension — not uploaded`);
|
|
54
|
+
continue;
|
|
55
|
+
}
|
|
56
|
+
uploads.set(`sha256:${sha}`, { bytes, mime });
|
|
57
|
+
const cid = mintCid();
|
|
58
|
+
pushOps.push({
|
|
59
|
+
op: 'create',
|
|
60
|
+
entity: 'Asset',
|
|
61
|
+
cid,
|
|
62
|
+
data: { sha256: sha, mime, name: entry.name },
|
|
63
|
+
});
|
|
64
|
+
index[cid] = { sha256: sha, mime, name: entry.name };
|
|
65
|
+
report.files.push({
|
|
66
|
+
file: join(ASSETS_DIR, entry.name),
|
|
67
|
+
action: 'updated',
|
|
68
|
+
detail: 'uploading to Creator',
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
if (uploads.size > 0)
|
|
72
|
+
await uploadMissingAssets(client, uploads);
|
|
73
|
+
}
|
|
74
|
+
// 3. assetMap.ts — CLI-owned, regenerated. (Re-written again after commit
|
|
75
|
+
// once the server has minted as_ ids for any new cids.)
|
|
76
|
+
writeAssetMap(root, index, report);
|
|
77
|
+
return { pushOps, mergedAssets: index };
|
|
78
|
+
}
|
|
79
|
+
/** Regenerate mapples/assetMap.ts from the index. CLI-owned file. */
|
|
80
|
+
export function writeAssetMap(root, index, report) {
|
|
81
|
+
if (Object.keys(index).length === 0)
|
|
82
|
+
return;
|
|
83
|
+
const lines = Object.entries(index)
|
|
84
|
+
.sort(([a], [b]) => (a < b ? -1 : 1))
|
|
85
|
+
.map(([id, meta]) => ` '${id}': require('./assets/${meta.name ?? id}'),`);
|
|
86
|
+
const content = [
|
|
87
|
+
'// GENERATED by Mapples — DO NOT EDIT. Regenerated on every `mapples sync`.',
|
|
88
|
+
'/* eslint-disable @typescript-eslint/no-require-imports */',
|
|
89
|
+
'export const assetMap = {',
|
|
90
|
+
...lines,
|
|
91
|
+
'} as const;',
|
|
92
|
+
'',
|
|
93
|
+
].join('\n');
|
|
94
|
+
const mapPath = join(root, ASSET_MAP_FILE);
|
|
95
|
+
const exists = existsSync(mapPath);
|
|
96
|
+
if (!exists || readFileSync(mapPath, 'utf8') !== content) {
|
|
97
|
+
mkdirSync(join(root, 'mapples'), { recursive: true });
|
|
98
|
+
writeFileSync(mapPath, content);
|
|
99
|
+
report?.files.push({ file: ASSET_MAP_FILE, action: exists ? 'updated' : 'created' });
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
/** After commit, swap the cid keys in the asset index for the server-minted as_ ids. */
|
|
103
|
+
export function resolveAssetIds(index, idMap) {
|
|
104
|
+
const out = {};
|
|
105
|
+
for (const [id, meta] of Object.entries(index)) {
|
|
106
|
+
out[idMap[id] ?? id] = meta;
|
|
107
|
+
}
|
|
108
|
+
return out;
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=assets.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"assets.js","sourceRoot":"","sources":["../../src/assets/assets.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { RenderDomNode } from '../types.js';
|
|
2
|
+
export declare const GENERATED_HEADER: string;
|
|
3
|
+
export declare function mappletName(pageName: string): string;
|
|
4
|
+
export interface EmitPageInput {
|
|
5
|
+
name: string;
|
|
6
|
+
root: RenderDomNode;
|
|
7
|
+
}
|
|
8
|
+
export declare function emitPage(page: EmitPageInput, filePath?: string): Promise<string>;
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
// RenderDom page -> complete *Mapplet.tsx. Deterministic: stable prop order
|
|
2
|
+
// (sid-ast printer), stable import order, Prettier-formatted.
|
|
3
|
+
import { printNode } from '@mapples/sid-ast';
|
|
4
|
+
import { collectImports, printImports } from './imports.js';
|
|
5
|
+
import { formatTsx } from './format.js';
|
|
6
|
+
export const GENERATED_HEADER = '// Generated by Mapples — edit freely, but keep the $sid props intact.\n' +
|
|
7
|
+
'// Two-way sync: `mapples sync` reconciles this file with Mapples Creator.';
|
|
8
|
+
export function mappletName(pageName) {
|
|
9
|
+
const pascal = pageName
|
|
10
|
+
.split(/[^A-Za-z0-9]+/)
|
|
11
|
+
.filter(Boolean)
|
|
12
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
13
|
+
.join('');
|
|
14
|
+
return `${pascal || 'Page'}Mapplet`;
|
|
15
|
+
}
|
|
16
|
+
export async function emitPage(page, filePath) {
|
|
17
|
+
const imports = collectImports(page.root);
|
|
18
|
+
const jsx = printNode(page.root, ' ');
|
|
19
|
+
const code = [
|
|
20
|
+
GENERATED_HEADER,
|
|
21
|
+
'',
|
|
22
|
+
printImports(imports),
|
|
23
|
+
'',
|
|
24
|
+
`export default function ${mappletName(page.name)}() {`,
|
|
25
|
+
' return (',
|
|
26
|
+
jsx,
|
|
27
|
+
' );',
|
|
28
|
+
'}',
|
|
29
|
+
'',
|
|
30
|
+
].join('\n');
|
|
31
|
+
return formatTsx(code, filePath);
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=emit.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"emit.js","sourceRoot":"","sources":["../../src/codegen/emit.ts"],"names":[],"mappings":"AAAA,4EAA4E;AAC5E,8DAA8D;AAE9D,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAG7C,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAExC,MAAM,CAAC,MAAM,gBAAgB,GAC3B,0EAA0E;IAC1E,4EAA4E,CAAC;AAE/E,MAAM,UAAU,WAAW,CAAC,QAAgB;IAC1C,MAAM,MAAM,GAAG,QAAQ;SACpB,KAAK,CAAC,eAAe,CAAC;SACtB,MAAM,CAAC,OAAO,CAAC;SACf,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,EAAE,CAAC,CAAC;IACZ,OAAO,GAAG,MAAM,IAAI,MAAM,SAAS,CAAC;AACtC,CAAC;AAOD,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAmB,EAAE,QAAiB;IACnE,MAAM,OAAO,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC1C,MAAM,GAAG,GAAG,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IACzC,MAAM,IAAI,GAAG;QACX,gBAAgB;QAChB,EAAE;QACF,YAAY,CAAC,OAAO,CAAC;QACrB,EAAE;QACF,2BAA2B,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM;QACvD,YAAY;QACZ,GAAG;QACH,MAAM;QACN,GAAG;QACH,EAAE;KACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACb,OAAO,SAAS,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;AACnC,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { type Options } from 'prettier';
|
|
2
|
+
/**
|
|
3
|
+
* The formatting contract for generated files. When the target project has a
|
|
4
|
+
* Prettier config it wins (resolved per file path); these are the fallback so
|
|
5
|
+
* golden tests are deterministic.
|
|
6
|
+
*/
|
|
7
|
+
export declare const DEFAULT_PRETTIER: Options;
|
|
8
|
+
export declare function formatTsx(code: string, filePath?: string): Promise<string>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import prettier from 'prettier';
|
|
2
|
+
/**
|
|
3
|
+
* The formatting contract for generated files. When the target project has a
|
|
4
|
+
* Prettier config it wins (resolved per file path); these are the fallback so
|
|
5
|
+
* golden tests are deterministic.
|
|
6
|
+
*/
|
|
7
|
+
export const DEFAULT_PRETTIER = {
|
|
8
|
+
parser: 'typescript',
|
|
9
|
+
semi: true,
|
|
10
|
+
singleQuote: true,
|
|
11
|
+
trailingComma: 'all',
|
|
12
|
+
printWidth: 100,
|
|
13
|
+
arrowParens: 'always',
|
|
14
|
+
};
|
|
15
|
+
export async function formatTsx(code, filePath) {
|
|
16
|
+
let options = DEFAULT_PRETTIER;
|
|
17
|
+
if (filePath) {
|
|
18
|
+
const resolved = await prettier.resolveConfig(filePath, { editorconfig: true });
|
|
19
|
+
if (resolved)
|
|
20
|
+
options = { ...resolved, parser: 'typescript' };
|
|
21
|
+
}
|
|
22
|
+
return prettier.format(code, options);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=format.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.js","sourceRoot":"","sources":["../../src/codegen/format.ts"],"names":[],"mappings":"AAAA,OAAO,QAA0B,MAAM,UAAU,CAAC;AAElD;;;;GAIG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAY;IACvC,MAAM,EAAE,YAAY;IACpB,IAAI,EAAE,IAAI;IACV,WAAW,EAAE,IAAI;IACjB,aAAa,EAAE,KAAK;IACpB,UAAU,EAAE,GAAG;IACf,WAAW,EAAE,QAAQ;CACtB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAY,EAAE,QAAiB;IAC7D,IAAI,OAAO,GAAY,gBAAgB,CAAC;IACxC,IAAI,QAAQ,EAAE,CAAC;QACb,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,aAAa,CAAC,QAAQ,EAAE,EAAE,YAAY,EAAE,IAAI,EAAE,CAAC,CAAC;QAChF,IAAI,QAAQ;YAAE,OAAO,GAAG,EAAE,GAAG,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC;IAChE,CAAC;IACD,OAAO,QAAQ,CAAC,MAAM,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;AACxC,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
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;
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
export const UI_MODULE = '@mapples/ui';
|
|
2
|
+
export function parseImportRef(ref) {
|
|
3
|
+
const idx = ref.lastIndexOf('#');
|
|
4
|
+
if (idx === -1)
|
|
5
|
+
throw new Error(`invalid importRef (missing #): ${ref}`);
|
|
6
|
+
return { module: ref.slice(0, idx), exportName: ref.slice(idx + 1) };
|
|
7
|
+
}
|
|
8
|
+
export function collectImports(root) {
|
|
9
|
+
const uiNames = new Set();
|
|
10
|
+
const customs = new Map();
|
|
11
|
+
const walk = (node) => {
|
|
12
|
+
if (node.type === 'Custom') {
|
|
13
|
+
const name = node.props.name;
|
|
14
|
+
const importRef = node.props.importRef;
|
|
15
|
+
if (typeof name !== 'string' || typeof importRef !== 'string') {
|
|
16
|
+
throw new Error(`Custom node ${node.sid} is missing name/importRef`);
|
|
17
|
+
}
|
|
18
|
+
const origin = parseImportRef(importRef);
|
|
19
|
+
if (origin.module === '') {
|
|
20
|
+
throw new Error(`Custom node ${node.sid} (${name}) has a local importRef (${importRef}); cannot emit an import for it`);
|
|
21
|
+
}
|
|
22
|
+
const existing = customs.get(name);
|
|
23
|
+
if (existing &&
|
|
24
|
+
(existing.module !== origin.module || existing.exportName !== origin.exportName)) {
|
|
25
|
+
throw new Error(`Custom name collision: ${name} maps to both ${existing.module} and ${origin.module}`);
|
|
26
|
+
}
|
|
27
|
+
customs.set(name, origin);
|
|
28
|
+
}
|
|
29
|
+
else {
|
|
30
|
+
uiNames.add(node.type);
|
|
31
|
+
}
|
|
32
|
+
for (const child of node.children)
|
|
33
|
+
walk(child);
|
|
34
|
+
};
|
|
35
|
+
walk(root);
|
|
36
|
+
for (const name of customs.keys()) {
|
|
37
|
+
if (uiNames.has(name)) {
|
|
38
|
+
throw new Error(`Custom component ${name} collides with a @mapples/ui primitive of the same name`);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return { uiNames: [...uiNames].sort(), customs };
|
|
42
|
+
}
|
|
43
|
+
export function printImports(resolved) {
|
|
44
|
+
const lines = [];
|
|
45
|
+
if (resolved.uiNames.length > 0) {
|
|
46
|
+
lines.push(`import { ${resolved.uiNames.join(', ')} } from '${UI_MODULE}';`);
|
|
47
|
+
}
|
|
48
|
+
const byModule = new Map();
|
|
49
|
+
for (const [local, origin] of resolved.customs) {
|
|
50
|
+
let entry = byModule.get(origin.module);
|
|
51
|
+
if (!entry) {
|
|
52
|
+
entry = { defaults: [], named: [] };
|
|
53
|
+
byModule.set(origin.module, entry);
|
|
54
|
+
}
|
|
55
|
+
if (origin.exportName === 'default')
|
|
56
|
+
entry.defaults.push(local);
|
|
57
|
+
else
|
|
58
|
+
entry.named.push([origin.exportName, local]);
|
|
59
|
+
}
|
|
60
|
+
for (const module of [...byModule.keys()].sort()) {
|
|
61
|
+
const entry = byModule.get(module);
|
|
62
|
+
const pieces = [];
|
|
63
|
+
if (entry.defaults.length > 1) {
|
|
64
|
+
throw new Error(`two default imports from ${module}: ${entry.defaults.join(', ')}`);
|
|
65
|
+
}
|
|
66
|
+
if (entry.defaults.length === 1)
|
|
67
|
+
pieces.push(entry.defaults[0]);
|
|
68
|
+
if (entry.named.length > 0) {
|
|
69
|
+
const named = entry.named
|
|
70
|
+
.sort(([a], [b]) => (a < b ? -1 : 1))
|
|
71
|
+
.map(([exp, local]) => (exp === local ? exp : `${exp} as ${local}`))
|
|
72
|
+
.join(', ');
|
|
73
|
+
pieces.push(`{ ${named} }`);
|
|
74
|
+
}
|
|
75
|
+
lines.push(`import ${pieces.join(', ')} from '${module}';`);
|
|
76
|
+
}
|
|
77
|
+
return lines.join('\n');
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=imports.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"imports.js","sourceRoot":"","sources":["../../src/codegen/imports.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function registerAdopt(program) {
|
|
2
|
+
program
|
|
3
|
+
.command('adopt <file>')
|
|
4
|
+
.description('Adopt an unmanaged component file into Mapples (no prompt)')
|
|
5
|
+
.option('--json', 'machine-readable output')
|
|
6
|
+
.action(async (file, opts) => {
|
|
7
|
+
const { runAdopt } = await import('./impl/adoptImpl.js');
|
|
8
|
+
await runAdopt(file, opts);
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=adopt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adopt.js","sourceRoot":"","sources":["../../src/commands/adopt.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,aAAa,CAAC,OAAgB;IAC5C,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,4DAA4D,CAAC;SACzE,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,IAAY,EAAE,IAA6B,EAAE,EAAE;QAC5D,MAAM,EAAE,QAAQ,EAAE,GAAG,MAAM,MAAM,CAAC,qBAAqB,CAAC,CAAC;QACzD,MAAM,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export function registerCreate(program) {
|
|
2
|
+
program
|
|
3
|
+
.command('create <app>')
|
|
4
|
+
.description('Scaffold a new Mapples-connected Expo app')
|
|
5
|
+
.option('--project <id>', 'Mapples project id to link')
|
|
6
|
+
.option('--api-url <url>', 'Mapples API base URL')
|
|
7
|
+
.option('--json', 'machine-readable output')
|
|
8
|
+
.action(async (app, opts) => {
|
|
9
|
+
const { runCreate } = await import('./impl/createImpl.js');
|
|
10
|
+
await runCreate(app, opts);
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=create.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"create.js","sourceRoot":"","sources":["../../src/commands/create.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,cAAc,CAAC;SACvB,WAAW,CAAC,2CAA2C,CAAC;SACxD,MAAM,CAAC,gBAAgB,EAAE,4BAA4B,CAAC;SACtD,MAAM,CAAC,iBAAiB,EAAE,sBAAsB,CAAC;SACjD,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,GAAW,EAAE,IAA6B,EAAE,EAAE;QAC3D,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC3D,MAAM,SAAS,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export function registerDoctor(program) {
|
|
2
|
+
program
|
|
3
|
+
.command('doctor')
|
|
4
|
+
.description('Lint $sid integrity: duplicates, drift, orphaned base entries')
|
|
5
|
+
.option('--json', 'machine-readable output')
|
|
6
|
+
.action(async (opts) => {
|
|
7
|
+
const { runDoctor } = await import('./impl/doctorImpl.js');
|
|
8
|
+
await runDoctor(opts);
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=doctor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctor.js","sourceRoot":"","sources":["../../src/commands/doctor.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAAC,OAAgB;IAC7C,OAAO;SACJ,OAAO,CAAC,QAAQ,CAAC;SACjB,WAAW,CAAC,+DAA+D,CAAC;SAC5E,MAAM,CAAC,QAAQ,EAAE,yBAAyB,CAAC;SAC3C,MAAM,CAAC,KAAK,EAAE,IAA6B,EAAE,EAAE;QAC9C,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,MAAM,CAAC,sBAAsB,CAAC,CAAC;QAC3D,MAAM,SAAS,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC;AACP,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runAdopt(file: string, opts: Record<string, unknown>): Promise<void>;
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { JpatchClient } from '../../api/client.js';
|
|
3
|
+
import { readConfig } from '../../project/config.js';
|
|
4
|
+
import { proposeAdoptions } from '../../services/adoptService.js';
|
|
5
|
+
import { emptyReport, renderReport } from '../../ui/report.js';
|
|
6
|
+
export async function runAdopt(file, opts) {
|
|
7
|
+
const root = process.cwd();
|
|
8
|
+
const config = readConfig(root);
|
|
9
|
+
const client = new JpatchClient({
|
|
10
|
+
baseUrl: config.apiUrl,
|
|
11
|
+
projectId: config.projectId,
|
|
12
|
+
origin: 'mapples-cli@0.0.0',
|
|
13
|
+
...(process.env.MAPPLES_TOKEN ? { token: process.env.MAPPLES_TOKEN } : {}),
|
|
14
|
+
});
|
|
15
|
+
const report = emptyReport();
|
|
16
|
+
await proposeAdoptions({ root, client, report, yes: true, file });
|
|
17
|
+
if (opts.json === true) {
|
|
18
|
+
console.log(JSON.stringify(report, null, 2));
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
console.log(chalk.bold(`\nmapples adopt ${file}`));
|
|
22
|
+
console.log(renderReport(report));
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=adoptImpl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"adoptImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/adoptImpl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAE/D,MAAM,CAAC,KAAK,UAAU,QAAQ,CAAC,IAAY,EAAE,IAA6B;IACxE,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,MAAM,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,MAAM,MAAM,GAAG,IAAI,YAAY,CAAC;QAC9B,OAAO,EAAE,MAAM,CAAC,MAAM;QACtB,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,MAAM,EAAE,mBAAmB;QAC3B,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC3E,CAAC,CAAC;IACH,MAAM,MAAM,GAAG,WAAW,EAAE,CAAC;IAC7B,MAAM,gBAAgB,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IAElE,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IACD,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,mBAAmB,IAAI,EAAE,CAAC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC,CAAC;AACpC,CAAC"}
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readdirSync } from 'node:fs';
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import prompts from 'prompts';
|
|
5
|
+
import { JpatchClient } from '../../api/client.js';
|
|
6
|
+
import { isNetworkError } from '../../api/client.js';
|
|
7
|
+
import { writeConfig } from '../../project/config.js';
|
|
8
|
+
import { scaffoldApp } from '../../services/scaffold.js';
|
|
9
|
+
import { runSyncEngine } from '../../services/syncEngine.js';
|
|
10
|
+
import { renderReport } from '../../ui/report.js';
|
|
11
|
+
export const DEFAULT_API_URL = 'https://api.mapples.io';
|
|
12
|
+
export async function runCreate(app, opts) {
|
|
13
|
+
const target = resolve(process.cwd(), app);
|
|
14
|
+
if (existsSync(target) && readdirSync(target).length > 0) {
|
|
15
|
+
throw new Error(`${target} already exists and is not empty`);
|
|
16
|
+
}
|
|
17
|
+
mkdirSync(target, { recursive: true });
|
|
18
|
+
let projectId = typeof opts.project === 'string' ? opts.project : undefined;
|
|
19
|
+
if (!projectId) {
|
|
20
|
+
const answer = await prompts({
|
|
21
|
+
type: 'text',
|
|
22
|
+
name: 'projectId',
|
|
23
|
+
message: 'Mapples project id (from Creator → project settings)',
|
|
24
|
+
});
|
|
25
|
+
projectId = answer.projectId;
|
|
26
|
+
}
|
|
27
|
+
if (!projectId)
|
|
28
|
+
throw new Error('a project id is required (pass --project <id>)');
|
|
29
|
+
const apiUrl = typeof opts.apiUrl === 'string' ? opts.apiUrl : DEFAULT_API_URL;
|
|
30
|
+
const written = scaffoldApp(target, app);
|
|
31
|
+
writeConfig(target, {
|
|
32
|
+
projectId,
|
|
33
|
+
apiUrl,
|
|
34
|
+
appDir: 'mapples/pages',
|
|
35
|
+
routesDir: 'app/(mapples)',
|
|
36
|
+
schema: 1,
|
|
37
|
+
});
|
|
38
|
+
console.log(chalk.bold(`\nmapples create ${app}`));
|
|
39
|
+
for (const file of written)
|
|
40
|
+
console.log(` ${chalk.green('A')} ${file}`);
|
|
41
|
+
// First sync pulls the whole project (tolerates being offline).
|
|
42
|
+
const client = new JpatchClient({
|
|
43
|
+
baseUrl: apiUrl,
|
|
44
|
+
projectId,
|
|
45
|
+
origin: 'mapples-cli@0.0.0',
|
|
46
|
+
...(process.env.MAPPLES_TOKEN ? { token: process.env.MAPPLES_TOKEN } : {}),
|
|
47
|
+
});
|
|
48
|
+
try {
|
|
49
|
+
const report = await runSyncEngine({ root: target, client });
|
|
50
|
+
console.log(renderReport(report));
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
if (!isNetworkError(err))
|
|
54
|
+
throw err;
|
|
55
|
+
console.log(chalk.yellow(' offline — run `mapples sync` inside the app once you are online'));
|
|
56
|
+
}
|
|
57
|
+
console.log([
|
|
58
|
+
'',
|
|
59
|
+
chalk.bold('Next steps:'),
|
|
60
|
+
` cd ${app}`,
|
|
61
|
+
' yarn install (or npm install)',
|
|
62
|
+
' npx expo start',
|
|
63
|
+
].join('\n'));
|
|
64
|
+
}
|
|
65
|
+
//# sourceMappingURL=createImpl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/createImpl.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runDoctor(opts: Record<string, unknown>): Promise<void>;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { runDoctorChecks } from '../../services/doctorService.js';
|
|
3
|
+
export async function runDoctor(opts) {
|
|
4
|
+
const root = process.cwd();
|
|
5
|
+
const { issues, checkedFiles } = runDoctorChecks(root);
|
|
6
|
+
if (opts.json === true) {
|
|
7
|
+
console.log(JSON.stringify({ checkedFiles, issues }, null, 2));
|
|
8
|
+
if (issues.some((i) => i.kind !== 'drift'))
|
|
9
|
+
process.exitCode = 1;
|
|
10
|
+
return;
|
|
11
|
+
}
|
|
12
|
+
console.log(chalk.bold('\nmapples doctor'));
|
|
13
|
+
if (issues.length === 0) {
|
|
14
|
+
console.log(chalk.green(` ✓ ${checkedFiles} file(s) checked — no problems found`));
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
for (const issue of issues) {
|
|
18
|
+
const icon = issue.kind === 'drift' ? chalk.yellow('~') : chalk.red('✗');
|
|
19
|
+
const loc = [issue.file, issue.sid].filter(Boolean).join(' ');
|
|
20
|
+
console.log(` ${icon} ${chalk.bold(issue.kind)} ${loc ? chalk.gray(loc) + ' ' : ''}${issue.detail}`);
|
|
21
|
+
}
|
|
22
|
+
if (issues.some((i) => i.kind !== 'drift'))
|
|
23
|
+
process.exitCode = 1;
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=doctorImpl.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"doctorImpl.js","sourceRoot":"","sources":["../../../src/commands/impl/doctorImpl.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,EAAE,eAAe,EAAE,MAAM,iCAAiC,CAAC;AAElE,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAA6B;IAC3D,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC3B,MAAM,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAEvD,IAAI,IAAI,CAAC,IAAI,KAAK,IAAI,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,YAAY,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;QAC/D,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;YAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACjE,OAAO;IACT,CAAC;IAED,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC;IAC5C,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,YAAY,sCAAsC,CAAC,CAAC,CAAC;QACpF,OAAO;IACT,CAAC;IACD,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;QAC3B,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QACzE,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC9D,OAAO,CAAC,GAAG,CACT,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,KAAK,CAAC,MAAM,EAAE,CACzF,CAAC;IACJ,CAAC;IACD,IAAI,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,OAAO,CAAC;QAAE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACnE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare function runInit(opts: Record<string, unknown>): Promise<void>;
|