mapples 0.2.0-beta.9 → 0.2.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.
Files changed (87) hide show
  1. package/README.md +1 -1
  2. package/dist/api/client.d.ts +16 -0
  3. package/dist/api/client.js +37 -0
  4. package/dist/api/client.js.map +1 -1
  5. package/dist/api/commit.js +19 -1
  6. package/dist/api/commit.js.map +1 -1
  7. package/dist/api/errors.d.ts +1 -1
  8. package/dist/api/errors.js +3 -0
  9. package/dist/api/errors.js.map +1 -1
  10. package/dist/api/objects.d.ts +3 -1
  11. package/dist/api/objects.js +31 -4
  12. package/dist/api/objects.js.map +1 -1
  13. package/dist/api/project.d.ts +11 -0
  14. package/dist/api/project.js +29 -0
  15. package/dist/api/project.js.map +1 -0
  16. package/dist/assets/assets.d.ts +12 -0
  17. package/dist/assets/assets.js +31 -2
  18. package/dist/assets/assets.js.map +1 -1
  19. package/dist/codegen/imports.d.ts +7 -0
  20. package/dist/codegen/imports.js +31 -0
  21. package/dist/codegen/imports.js.map +1 -1
  22. package/dist/commands/doctor.js +3 -1
  23. package/dist/commands/doctor.js.map +1 -1
  24. package/dist/commands/impl/createImpl.js +34 -4
  25. package/dist/commands/impl/createImpl.js.map +1 -1
  26. package/dist/commands/impl/doctorImpl.js +17 -7
  27. package/dist/commands/impl/doctorImpl.js.map +1 -1
  28. package/dist/commands/impl/initImpl.js +47 -1
  29. package/dist/commands/impl/initImpl.js.map +1 -1
  30. package/dist/commands/impl/syncImpl.js +16 -2
  31. package/dist/commands/impl/syncImpl.js.map +1 -1
  32. package/dist/commands/init.js +1 -0
  33. package/dist/commands/init.js.map +1 -1
  34. package/dist/nav/navigatorTree.d.ts +36 -2
  35. package/dist/nav/navigatorTree.js +191 -40
  36. package/dist/nav/navigatorTree.js.map +1 -1
  37. package/dist/nav/routeTree.d.ts +2 -1
  38. package/dist/nav/routeTree.js +9 -4
  39. package/dist/nav/routeTree.js.map +1 -1
  40. package/dist/nav/screenOptions.d.ts +24 -0
  41. package/dist/nav/screenOptions.js +41 -13
  42. package/dist/nav/screenOptions.js.map +1 -1
  43. package/dist/packages/catalog.d.ts +20 -0
  44. package/dist/packages/catalog.js +94 -0
  45. package/dist/packages/catalog.js.map +1 -0
  46. package/dist/packages/resolve.d.ts +61 -0
  47. package/dist/packages/resolve.js +149 -0
  48. package/dist/packages/resolve.js.map +1 -0
  49. package/dist/runtime/runtimeFiles.d.ts +17 -0
  50. package/dist/runtime/runtimeFiles.js +183 -0
  51. package/dist/runtime/runtimeFiles.js.map +1 -0
  52. package/dist/services/appDeps.d.ts +41 -0
  53. package/dist/services/appDeps.js +152 -0
  54. package/dist/services/appDeps.js.map +1 -0
  55. package/dist/services/appPackages.d.ts +46 -0
  56. package/dist/services/appPackages.js +266 -0
  57. package/dist/services/appPackages.js.map +1 -0
  58. package/dist/services/doctorService.d.ts +28 -1
  59. package/dist/services/doctorService.js +217 -3
  60. package/dist/services/doctorService.js.map +1 -1
  61. package/dist/services/scaffold.d.ts +13 -1
  62. package/dist/services/scaffold.js +57 -5
  63. package/dist/services/scaffold.js.map +1 -1
  64. package/dist/services/syncEngine.js +89 -25
  65. package/dist/services/syncEngine.js.map +1 -1
  66. package/dist/types.d.ts +4 -0
  67. package/dist/types.js.map +1 -1
  68. package/dist/ui/report.d.ts +8 -0
  69. package/dist/ui/report.js +22 -0
  70. package/dist/ui/report.js.map +1 -1
  71. package/dist/version.d.ts +21 -0
  72. package/dist/version.js +40 -3
  73. package/dist/version.js.map +1 -1
  74. package/package.json +4 -3
  75. package/templates/agent/mapples.md +9 -4
  76. package/templates/agent/skills/mapples-conventions/SKILL.md +5 -4
  77. package/templates/agent/skills/mapples-design/SKILL.md +4 -4
  78. package/templates/agent/skills/mapples-design/reference/component-library.md +3 -3
  79. package/templates/agent/skills/mapples-design/reference/layout-contract.md +2 -3
  80. package/templates/agent/skills/mapples-design/reference/playbooks/onboarding-flow.md +1 -1
  81. package/templates/agent/skills/mapples-design/reference/playbooks/screen-flow-wiring.md +2 -5
  82. package/templates/agent/skills/mapples-design/reference/style-guides.md +2 -0
  83. package/templates/agent/skills/mapples-sync/SKILL.md +3 -2
  84. package/templates/app/_layout.tsx +6 -1
  85. package/templates/gitignore +2 -0
  86. package/templates/metro.config.js +11 -0
  87. package/templates/package.json +27 -33
@@ -0,0 +1,266 @@
1
+ // The app's optional packages (icon packs, QR/bar codes, gradient, video, …)
2
+ // follow the Creator project. `create`, `init` and `sync` read the project's
3
+ // packages document, union it with what the synced canvas needs
4
+ // (packages/resolve.ts), and make package.json and app.json carry it:
5
+ //
6
+ // - A missing dependency is added (the document's version; `@mapples/*` get
7
+ // the one runtime spec; an installed Expo SDK's own pin wins for its native
8
+ // modules, as in `init`). An entry already in package.json is never changed.
9
+ // - What the CLI added is recorded in `.mapples/packages.json` (committed with
10
+ // the app). A recorded dependency the project no longer needs is removed —
11
+ // but only while package.json still holds the spec the CLI wrote and no
12
+ // source file of the app imports it; otherwise it is reported as removable.
13
+ // Catalog dependencies the CLI did not add (an app from an older template,
14
+ // or the user's own) are only ever reported.
15
+ // - Expo config plugins from the document are added to app.json the same way
16
+ // (and retired the same way). An app configured in code (app.config.*)
17
+ // gets a note naming the plugins to register.
18
+ //
19
+ // Installing is the caller's decision: `init` runs the package manager,
20
+ // `create` and `sync` say which command to run.
21
+ import { existsSync, readFileSync, readdirSync, writeFileSync } from 'node:fs';
22
+ import { join, relative } from 'node:path';
23
+ import { ProjectDocumentError } from '../api/client.js';
24
+ import { CATALOG_DEPENDENCY_NAMES } from '../packages/catalog.js';
25
+ import { parsePackagesDocument, resolveAppPackages, } from '../packages/resolve.js';
26
+ import { BaseStore } from '../project/baseStore.js';
27
+ import { CONFIG_DIR } from '../project/config.js';
28
+ import { mapplesRuntimeSpec } from '../version.js';
29
+ import { detectPackageManager, installedSdkPins } from './appDeps.js';
30
+ export const PACKAGES_STATE_FILE = join(CONFIG_DIR, 'packages.json');
31
+ function readState(root) {
32
+ const path = join(root, PACKAGES_STATE_FILE);
33
+ if (!existsSync(path))
34
+ return { version: 1, dependencies: {}, expoPlugins: [], manualPlugins: [] };
35
+ const parsed = JSON.parse(readFileSync(path, 'utf8'));
36
+ return {
37
+ version: 1,
38
+ dependencies: parsed.dependencies ?? {},
39
+ expoPlugins: parsed.expoPlugins ?? [],
40
+ manualPlugins: parsed.manualPlugins ?? [],
41
+ };
42
+ }
43
+ /** The project's packages document, `null` when it has none yet (404). Any other refusal stops the command. */
44
+ export async function fetchPackagesDocument(client) {
45
+ let data;
46
+ try {
47
+ data = await client.projectDocument('packagesdef');
48
+ }
49
+ catch (err) {
50
+ if (err instanceof ProjectDocumentError && (err.status === 401 || err.status === 403)) {
51
+ throw new Error(`could not read the project's packages document — the backend refuses this project key for packagesdef (${err.message}). ` +
52
+ "The app's dependencies follow that document; the backend must allow API keys to read GET /project/{uuid}/packagesdef.", { cause: err });
53
+ }
54
+ throw err;
55
+ }
56
+ return data === null ? null : parsePackagesDocument(data);
57
+ }
58
+ const SOURCE_EXT = /\.(?:[cm]?[jt]sx?)$/;
59
+ const SKIP_DIRS = new Set([
60
+ 'node_modules',
61
+ '.git',
62
+ CONFIG_DIR,
63
+ '.expo',
64
+ 'ios',
65
+ 'android',
66
+ 'dist',
67
+ 'web-build',
68
+ 'build',
69
+ ]);
70
+ /** The first source file of the app that imports `name` (or a subpath of it), if any. */
71
+ function importingFile(root, name) {
72
+ const escaped = name.replace(/[.*+?^${}()|[\]\\/]/g, '\\$&');
73
+ const pattern = new RegExp(`(['"\`])${escaped}(?:/[^'"\`]*)?\\1`);
74
+ const visit = (dir) => {
75
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
76
+ if (entry.isDirectory()) {
77
+ if (SKIP_DIRS.has(entry.name))
78
+ continue;
79
+ const found = visit(join(dir, entry.name));
80
+ if (found)
81
+ return found;
82
+ }
83
+ else if (SOURCE_EXT.test(entry.name)) {
84
+ const path = join(dir, entry.name);
85
+ if (pattern.test(readFileSync(path, 'utf8')))
86
+ return relative(root, path);
87
+ }
88
+ }
89
+ return null;
90
+ };
91
+ return visit(root);
92
+ }
93
+ const pluginName = (entry) => typeof entry === 'string'
94
+ ? entry
95
+ : Array.isArray(entry) && typeof entry[0] === 'string'
96
+ ? entry[0]
97
+ : null;
98
+ /**
99
+ * Bring package.json (and app.json's plugins) in line with the project's
100
+ * packages. Reads the synced canvas from the base, so call it after a
101
+ * successful sync. A transport failure propagates (the caller reports
102
+ * offline); a refused or malformed document stops the command.
103
+ */
104
+ export async function syncAppPackages(root, client) {
105
+ const pkgPath = join(root, 'package.json');
106
+ if (!existsSync(pkgPath)) {
107
+ return {
108
+ skipped: `packages: no package.json in ${root} — the project's packages were not applied`,
109
+ };
110
+ }
111
+ const doc = await fetchPackagesDocument(client);
112
+ const base = new BaseStore(root).readAll();
113
+ const resolution = resolveAppPackages(doc, {
114
+ pages: base.pages.values(),
115
+ components: base.components.values(),
116
+ style: base.style,
117
+ });
118
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
119
+ const state = readState(root);
120
+ const stateBefore = JSON.stringify(state);
121
+ const pins = installedSdkPins(root);
122
+ const runtime = mapplesRuntimeSpec();
123
+ const outcome = {
124
+ source: resolution.source,
125
+ iconFamily: resolution.iconFamily,
126
+ added: [],
127
+ removed: [],
128
+ removable: [],
129
+ pluginsAdded: [],
130
+ pluginsRemoved: [],
131
+ pluginsManual: [],
132
+ installNeeded: false,
133
+ packageManager: detectPackageManager(root),
134
+ notes: [...resolution.notes],
135
+ };
136
+ // ---- dependencies ----
137
+ const has = (name) => Boolean(pkg.dependencies?.[name] ?? pkg.devDependencies?.[name]);
138
+ const needed = new Set();
139
+ for (const entry of resolution.packages) {
140
+ for (const dep of entry.dependencies) {
141
+ needed.add(dep.name);
142
+ if (has(dep.name))
143
+ continue;
144
+ const spec = dep.name.startsWith('@mapples/') ? runtime : (pins?.[dep.name] ?? dep.version);
145
+ pkg.dependencies = { ...(pkg.dependencies ?? {}), [dep.name]: spec };
146
+ state.dependencies[dep.name] = spec;
147
+ outcome.added.push({ name: dep.name, spec, package: entry.id });
148
+ }
149
+ }
150
+ for (const [name, spec] of Object.entries(state.dependencies)) {
151
+ if (needed.has(name))
152
+ continue;
153
+ const current = pkg.dependencies?.[name];
154
+ if (current === undefined) {
155
+ delete state.dependencies[name]; // removed by hand meanwhile
156
+ continue;
157
+ }
158
+ if (current !== spec) {
159
+ outcome.removable.push({
160
+ name,
161
+ reason: `no longer used by the project; left in place because package.json now says "${current}", not the "${spec}" mapples added`,
162
+ });
163
+ continue;
164
+ }
165
+ const importer = importingFile(root, name);
166
+ if (importer) {
167
+ outcome.removable.push({
168
+ name,
169
+ reason: `no longer used by the project; left in place because ${importer} imports it`,
170
+ });
171
+ continue;
172
+ }
173
+ delete pkg.dependencies[name];
174
+ delete state.dependencies[name];
175
+ outcome.removed.push({ name, spec });
176
+ }
177
+ for (const name of CATALOG_DEPENDENCY_NAMES) {
178
+ if (needed.has(name) || name in state.dependencies || !has(name))
179
+ continue;
180
+ outcome.removable.push({
181
+ name,
182
+ reason: 'not used by the project (not added by mapples — remove it if your code does not use it)',
183
+ });
184
+ }
185
+ if (outcome.added.length > 0 || outcome.removed.length > 0) {
186
+ if (pkg.dependencies) {
187
+ pkg.dependencies = Object.fromEntries(Object.entries(pkg.dependencies).sort(([a], [b]) => a.localeCompare(b)));
188
+ }
189
+ writeFileSync(pkgPath, JSON.stringify(pkg, null, 2) + '\n');
190
+ outcome.installNeeded = true;
191
+ }
192
+ // ---- Expo config plugins ----
193
+ const plugins = [...new Set(resolution.packages.flatMap((p) => p.expoPlugins ?? []))];
194
+ const appJsonPath = join(root, 'app.json');
195
+ const appJson = existsSync(appJsonPath)
196
+ ? JSON.parse(readFileSync(appJsonPath, 'utf8'))
197
+ : null;
198
+ if (appJson?.expo) {
199
+ const list = appJson.expo.plugins ?? [];
200
+ const present = new Set(list.map(pluginName).filter((n) => n !== null));
201
+ for (const plugin of plugins) {
202
+ if (present.has(plugin))
203
+ continue;
204
+ list.push(plugin);
205
+ state.expoPlugins.push(plugin);
206
+ outcome.pluginsAdded.push(plugin);
207
+ }
208
+ for (const plugin of [...state.expoPlugins]) {
209
+ if (plugins.includes(plugin))
210
+ continue;
211
+ state.expoPlugins = state.expoPlugins.filter((p) => p !== plugin);
212
+ const index = list.indexOf(plugin);
213
+ if (index === -1)
214
+ continue; // gone already, or rewritten with options — the user's now
215
+ list.splice(index, 1);
216
+ outcome.pluginsRemoved.push(plugin);
217
+ }
218
+ if (outcome.pluginsAdded.length > 0 || outcome.pluginsRemoved.length > 0) {
219
+ appJson.expo.plugins = list;
220
+ writeFileSync(appJsonPath, JSON.stringify(appJson, null, 2) + '\n');
221
+ }
222
+ }
223
+ else {
224
+ // app.config.js/ts (or an app.json without `expo`): code the CLI does not edit.
225
+ for (const plugin of plugins) {
226
+ if (state.manualPlugins.includes(plugin))
227
+ continue;
228
+ state.manualPlugins.push(plugin);
229
+ outcome.pluginsManual.push(plugin);
230
+ }
231
+ }
232
+ if (JSON.stringify(state) !== stateBefore) {
233
+ writeFileSync(join(root, PACKAGES_STATE_FILE), JSON.stringify(state, null, 2) + '\n');
234
+ }
235
+ return outcome;
236
+ }
237
+ /** Human lines for the command output (the JSON report carries the outcome itself). */
238
+ export function renderPackagesOutcome(outcome) {
239
+ if ('skipped' in outcome)
240
+ return [` ${outcome.skipped}`];
241
+ const lines = [];
242
+ if (outcome.added.length > 0) {
243
+ lines.push(` M package.json — added ${outcome.added.map((a) => `${a.name}@${a.spec}`).join(', ')}`);
244
+ }
245
+ if (outcome.removed.length > 0) {
246
+ lines.push(` M package.json — removed ${outcome.removed.map((r) => r.name).join(', ')} (no longer used by the project)`);
247
+ }
248
+ if (outcome.pluginsAdded.length > 0) {
249
+ lines.push(` M app.json — added Expo plugin(s) ${outcome.pluginsAdded.join(', ')}`);
250
+ }
251
+ if (outcome.pluginsRemoved.length > 0) {
252
+ lines.push(` M app.json — removed Expo plugin(s) ${outcome.pluginsRemoved.join(', ')}`);
253
+ }
254
+ if (outcome.pluginsManual.length > 0) {
255
+ lines.push(` ⚠ register the Expo config plugin(s) ${outcome.pluginsManual.join(', ')} in your app config (not edited automatically)`);
256
+ }
257
+ const byReason = new Map();
258
+ for (const r of outcome.removable)
259
+ byReason.set(r.reason, [...(byReason.get(r.reason) ?? []), r.name]);
260
+ for (const [reason, names] of byReason)
261
+ lines.push(` ⚠ ${names.join(', ')}: ${reason}`);
262
+ for (const n of outcome.notes)
263
+ lines.push(` ${n}`);
264
+ return lines;
265
+ }
266
+ //# sourceMappingURL=appPackages.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appPackages.js","sourceRoot":"","sources":["../../src/services/appPackages.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,12 @@
1
- export type DoctorIssueKind = 'missing-file' | 'duplicate-sid' | 'unknown-sid' | 'missing-sid' | 'orphaned-base' | 'drift' | 'no-head';
1
+ import { type JpatchClient } from '../api/client.js';
2
+ export type DoctorIssueKind = 'missing-file' | 'duplicate-sid' | 'unknown-sid' | 'missing-sid' | 'orphaned-base' | 'drift' | 'no-head' | 'foreign-layout' | 'stale-layout' | 'type-error' | 'no-typecheck' | 'missing-package' | 'missing-icon-pack' | 'no-packages-check';
3
+ /** Informational kinds: reported, but doctor still exits 0. */
4
+ export declare const INFO_KINDS: ReadonlySet<DoctorIssueKind>;
5
+ export interface DoctorCounts {
6
+ pages: number;
7
+ components: number;
8
+ layouts: number;
9
+ }
2
10
  export interface DoctorIssue {
3
11
  kind: DoctorIssueKind;
4
12
  file?: string;
@@ -8,4 +16,23 @@ export interface DoctorIssue {
8
16
  export declare function runDoctorChecks(root: string): {
9
17
  issues: DoctorIssue[];
10
18
  checkedFiles: number;
19
+ counts: DoctorCounts;
20
+ };
21
+ /**
22
+ * The project's packages against the app: every package the project resolves
23
+ * (packages document ∪ synced canvas, as `sync` applies it) must be in
24
+ * package.json, and every icon family the project draws from — Style → Icons,
25
+ * plus `iconStyle` overrides on Icon elements — needs its pack installed, or
26
+ * the first glyph throws at render. Offline is reported, not failed.
27
+ */
28
+ export declare function runPackageChecks(root: string, client: JpatchClient): Promise<DoctorIssue[]>;
29
+ /**
30
+ * Typecheck the app with its own TypeScript (`tsc --noEmit -p .`): synced
31
+ * files that compile against the wrong @mapples/* types fail here, not on a
32
+ * device. Errors in any file are reported — an app that does not compile is
33
+ * not healthy whichever file is at fault.
34
+ */
35
+ export declare function runTypecheck(root: string): {
36
+ issues: DoctorIssue[];
37
+ ran: boolean;
11
38
  };
@@ -1,13 +1,29 @@
1
1
  // `mapples doctor` — $sid lint (RFC-0002 Phase 8): duplicate/edited/missing
2
2
  // $sids, orphaned base entries, drift (re-extract vs base at HEAD).
3
+ import { spawnSync } from 'node:child_process';
3
4
  import { existsSync, readFileSync } from 'node:fs';
4
- import { join } from 'node:path';
5
+ import { createRequire } from 'node:module';
6
+ import { basename, dirname, join, relative, resolve } from 'node:path';
5
7
  import { extract } from '@mapples/sid-ast';
8
+ import { isNetworkError } from '../api/client.js';
9
+ import { iconPackForFamily } from '../packages/catalog.js';
10
+ import { resolveAppPackages } from '../packages/resolve.js';
11
+ import { buildNavPlan, chromeFilesFor, extractNavigatorDoc, GENERATED_LAYOUT_HEADER, } from '../nav/navigatorTree.js';
6
12
  import { BaseStore } from '../project/baseStore.js';
13
+ import { readConfig } from '../project/config.js';
7
14
  import { readHead } from '../project/head.js';
8
15
  import { readComponentsMap } from '../project/componentsMap.js';
9
16
  import { readPagesMap } from '../project/pagesMap.js';
10
17
  import { deepEqual } from '../merge/mergePatch.js';
18
+ import { detectPackageManager } from './appDeps.js';
19
+ import { fetchPackagesDocument } from './appPackages.js';
20
+ /** Informational kinds: reported, but doctor still exits 0. */
21
+ export const INFO_KINDS = new Set([
22
+ 'drift',
23
+ 'stale-layout',
24
+ 'no-typecheck',
25
+ 'no-packages-check',
26
+ ]);
11
27
  function collectSids(root) {
12
28
  const sids = new Set();
13
29
  const walk = (n) => {
@@ -20,10 +36,11 @@ function collectSids(root) {
20
36
  }
21
37
  export function runDoctorChecks(root) {
22
38
  const issues = [];
39
+ const counts = { pages: 0, components: 0, layouts: 0 };
23
40
  const head = readHead(root);
24
41
  if (!head) {
25
42
  issues.push({ kind: 'no-head', detail: 'no .mapples/head — run `mapples sync` first' });
26
- return { issues, checkedFiles: 0 };
43
+ return { issues, checkedFiles: 0, counts };
27
44
  }
28
45
  const base = new BaseStore(root).readAll();
29
46
  let checkedFiles = 0;
@@ -68,6 +85,7 @@ export function runDoctorChecks(root) {
68
85
  continue;
69
86
  }
70
87
  checkedFiles += 1;
88
+ counts[kind.label === 'page' ? 'pages' : 'components'] += 1;
71
89
  const source = readFileSync(filePath, 'utf8');
72
90
  const extracted = extract(source);
73
91
  for (const w of extracted.warnings) {
@@ -120,7 +138,203 @@ export function runDoctorChecks(root) {
120
138
  }
121
139
  }
122
140
  }
123
- return { issues, checkedFiles };
141
+ // CLI-owned layouts: every layout the navigation at HEAD plans must be
142
+ // there, generated, and current.
143
+ const { routesDir = 'app' } = readConfig(root);
144
+ const navDoc = extractNavigatorDoc(base.navigation);
145
+ if (navDoc) {
146
+ const pagesMap = readPagesMap(root);
147
+ const overrides = new Map();
148
+ for (const entry of Object.values(pagesMap)) {
149
+ if (entry.routeId)
150
+ overrides.set(entry.routeId, basename(entry.file, '.tsx'));
151
+ }
152
+ const chromeFiles = chromeFilesFor(base.components, readComponentsMap(root));
153
+ for (const layout of buildNavPlan(navDoc, base.pages, [], overrides, {
154
+ routesDir,
155
+ chromeFiles,
156
+ }).layouts) {
157
+ const rel = join(routesDir, layout.file);
158
+ const abs = join(root, rel);
159
+ if (!existsSync(abs)) {
160
+ issues.push({
161
+ kind: 'missing-file',
162
+ file: rel,
163
+ detail: 'navigator layout is missing — the next sync will regenerate it',
164
+ });
165
+ continue;
166
+ }
167
+ checkedFiles += 1;
168
+ counts.layouts += 1;
169
+ const current = readFileSync(abs, 'utf8');
170
+ if (!GENERATED_LAYOUT_HEADER.test(current)) {
171
+ issues.push({
172
+ kind: 'foreign-layout',
173
+ file: rel,
174
+ detail: 'this layout position is owned by the navigation, but the file lacks the GENERATED header — the next sync deprecates it (_depr_…)',
175
+ });
176
+ }
177
+ else if (current !== layout.content) {
178
+ issues.push({
179
+ kind: 'stale-layout',
180
+ file: rel,
181
+ detail: 'layout differs from what the navigation at HEAD generates — run `mapples sync`',
182
+ });
183
+ }
184
+ }
185
+ }
186
+ return { issues, checkedFiles, counts };
187
+ }
188
+ /** True when `name` is installed where the app's bundler resolves it (node_modules up the tree). */
189
+ function isInstalled(root, name) {
190
+ let dir = resolve(root);
191
+ for (;;) {
192
+ if (existsSync(join(dir, 'node_modules', name, 'package.json')))
193
+ return true;
194
+ const parent = dirname(dir);
195
+ if (parent === dir)
196
+ return false;
197
+ dir = parent;
198
+ }
199
+ }
200
+ /**
201
+ * The project's packages against the app: every package the project resolves
202
+ * (packages document ∪ synced canvas, as `sync` applies it) must be in
203
+ * package.json, and every icon family the project draws from — Style → Icons,
204
+ * plus `iconStyle` overrides on Icon elements — needs its pack installed, or
205
+ * the first glyph throws at render. Offline is reported, not failed.
206
+ */
207
+ export async function runPackageChecks(root, client) {
208
+ if (!readHead(root))
209
+ return []; // runDoctorChecks already reports no-head
210
+ const pkgPath = join(root, 'package.json');
211
+ if (!existsSync(pkgPath)) {
212
+ return [{ kind: 'missing-package', detail: 'no package.json in the app root' }];
213
+ }
214
+ let doc;
215
+ try {
216
+ doc = await fetchPackagesDocument(client);
217
+ }
218
+ catch (err) {
219
+ if (!isNetworkError(err))
220
+ throw err;
221
+ return [
222
+ {
223
+ kind: 'no-packages-check',
224
+ detail: "offline — could not read the project's packages document; packages not checked",
225
+ },
226
+ ];
227
+ }
228
+ const base = new BaseStore(root).readAll();
229
+ const resolution = resolveAppPackages(doc, {
230
+ pages: base.pages.values(),
231
+ components: base.components.values(),
232
+ style: base.style,
233
+ });
234
+ const pkg = JSON.parse(readFileSync(pkgPath, 'utf8'));
235
+ const declared = (name) => Boolean(pkg.dependencies?.[name] ?? pkg.devDependencies?.[name]);
236
+ const pm = detectPackageManager(root);
237
+ // Icon families in use: the project's, and per-element overrides.
238
+ const families = new Map([[resolution.iconFamily, 'Style → Icons']]);
239
+ const visit = (node, where) => {
240
+ if (node.type === 'Icon' && typeof node.props.iconStyle === 'string') {
241
+ if (!families.has(node.props.iconStyle))
242
+ families.set(node.props.iconStyle, where);
243
+ }
244
+ node.children.forEach((child) => visit(child, where));
245
+ };
246
+ for (const page of base.pages.values())
247
+ visit(page.root, `page “${page.name}”`);
248
+ for (const component of base.components.values()) {
249
+ visit(component.root, `component “${component.name}”`);
250
+ }
251
+ const issues = [];
252
+ const iconDeps = new Set();
253
+ for (const [family, where] of families) {
254
+ for (const { name } of iconPackForFamily(family).dependencies) {
255
+ iconDeps.add(name);
256
+ if (!declared(name)) {
257
+ issues.push({
258
+ kind: 'missing-icon-pack',
259
+ detail: `icon family “${family}” (${where}) needs ${name}, which package.json does not list — run \`mapples sync\``,
260
+ });
261
+ }
262
+ else if (!isInstalled(root, name)) {
263
+ issues.push({
264
+ kind: 'missing-icon-pack',
265
+ detail: `icon family “${family}” (${where}) needs ${name}, which is not installed — run \`${pm} install\``,
266
+ });
267
+ }
268
+ }
269
+ }
270
+ for (const entry of resolution.packages) {
271
+ for (const { name } of entry.dependencies) {
272
+ if (iconDeps.has(name) || declared(name))
273
+ continue;
274
+ issues.push({
275
+ kind: 'missing-package',
276
+ detail: `the project uses ${entry.id} (${entry.reason}), but package.json does not list ${name} — run \`mapples sync\``,
277
+ });
278
+ }
279
+ }
280
+ return issues;
281
+ }
282
+ /**
283
+ * Typecheck the app with its own TypeScript (`tsc --noEmit -p .`): synced
284
+ * files that compile against the wrong @mapples/* types fail here, not on a
285
+ * device. Errors in any file are reported — an app that does not compile is
286
+ * not healthy whichever file is at fault.
287
+ */
288
+ export function runTypecheck(root) {
289
+ if (!existsSync(join(root, 'tsconfig.json'))) {
290
+ return {
291
+ issues: [{ kind: 'no-typecheck', detail: 'no tsconfig.json — typecheck skipped' }],
292
+ ran: false,
293
+ };
294
+ }
295
+ let tscPath;
296
+ try {
297
+ tscPath = createRequire(join(root, 'package.json')).resolve('typescript/bin/tsc');
298
+ }
299
+ catch {
300
+ // Not an error to hide: reported as its own (informational) issue.
301
+ return {
302
+ issues: [
303
+ {
304
+ kind: 'no-typecheck',
305
+ detail: 'typescript is not installed in this app — install dependencies to typecheck',
306
+ },
307
+ ],
308
+ ran: false,
309
+ };
310
+ }
311
+ const result = spawnSync(process.execPath, [tscPath, '--noEmit', '-p', root, '--pretty', 'false'], {
312
+ cwd: root,
313
+ encoding: 'utf8',
314
+ maxBuffer: 64 * 1024 * 1024,
315
+ });
316
+ if (result.error)
317
+ throw result.error;
318
+ const issues = [];
319
+ const output = `${result.stdout}${result.stderr}`;
320
+ for (const line of output.split('\n')) {
321
+ const m = /^(.+?)\((\d+),(\d+)\): error (TS\d+): (.*)$/.exec(line);
322
+ if (m) {
323
+ const file = relative(root, resolve(root, m[1]));
324
+ issues.push({
325
+ kind: 'type-error',
326
+ file: `${file}:${m[2]}:${m[3]}`,
327
+ detail: `${m[4]} ${m[5]}`,
328
+ });
329
+ }
330
+ else if (line.startsWith(' ') && issues.length > 0) {
331
+ issues[issues.length - 1].detail += `\n ${line.trim()}`;
332
+ }
333
+ }
334
+ if (result.status !== 0 && issues.length === 0) {
335
+ issues.push({ kind: 'type-error', detail: `tsc exited ${result.status}:\n${output.trim()}` });
336
+ }
337
+ return { issues, ran: true };
124
338
  }
125
339
  /** Fill NON_LITERAL holes from base so expression props don't read as drift. */
126
340
  function stripNonLiteralHoles(local, baseRoot) {
@@ -1 +1 @@
1
- {"version":3,"file":"doctorService.js","sourceRoot":"","sources":["../../src/services/doctorService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"doctorService.js","sourceRoot":"","sources":["../../src/services/doctorService.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,19 @@
1
1
  export declare function templatesDir(): string;
2
+ export interface ScaffoldOptions {
3
+ /** The Creator project's identifier → app.json ios.bundleIdentifier / android.package. */
4
+ identifier?: string;
5
+ }
6
+ export interface ScaffoldResult {
7
+ written: string[];
8
+ /** Lossy steps the caller must surface (e.g. an identifier a platform rejects). */
9
+ warnings: string[];
10
+ }
2
11
  /** Copy the app-shell templates into `target`, substituting __APP_NAME__. Never overwrites. */
3
- export declare function scaffoldApp(target: string, appName: string): string[];
12
+ export declare function scaffoldApp(target: string, appName: string, options?: ScaffoldOptions): ScaffoldResult;
4
13
  /** Write mapples/sid.d.ts into an existing app (init). Never overwrites. */
5
14
  export declare function writeSidTypes(root: string): boolean;
15
+ /** Ensure @mapples/app's Metro resolver is wired (mapples/theme.ts, mapples/assetMap.ts).
16
+ * Creates metro.config.js when absent; never edits an existing one. */
17
+ export declare function ensureMetroConfig(root: string): 'created' | 'present' | 'manual';
6
18
  /** Ensure babel-plugin-mapples-sid is wired. Creates babel.config.js when absent; never edits an existing one. */
7
19
  export declare function ensureBabelPlugin(root: string): 'created' | 'present' | 'manual';