@tinycld/bootstrap 2.4.1 → 2.4.3

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.
@@ -94,6 +94,87 @@ function pnpmWorkspaceYaml(dir) {
94
94
  '',
95
95
  ].join('\n');
96
96
  }
97
+ /**
98
+ * .watchmanconfig contents: the directories watchman must NOT crawl or subscribe
99
+ * to. The motivating failure is native build artifacts — tinycld/ios (Pods) and
100
+ * tinycld/android (.gradle, .cxx, build/) are multi-GB and churn on every native
101
+ * build, overflowing the fsevents kernel queue ("MustScanSubDirs UserDropped")
102
+ * and forcing slow recrawls that stall Metro starts.
103
+ *
104
+ * CRITICAL: the root node_modules is NOT ignored. Under node-linker=hoisted it's
105
+ * the flat store Metro resolves EVERY dependency from (incl. expo-router/entry,
106
+ * the app entry point); hiding it from watchman makes Metro's file map miss those
107
+ * files → "Unable to resolve module ./node_modules/...". Only node_modules/.cache
108
+ * (Metro's transform cache, never a resolvable path) is excluded. Each MEMBER's
109
+ * own node_modules IS ignored — under hoisting those are near-empty (deps resolve
110
+ * up to the root store), so Metro never reads them and they're pure crawl cost.
111
+ *
112
+ * Ignore_dirs matches path prefixes relative to the watch root, so the bare
113
+ * ".git" covers only the root-level one and every member's .git is listed
114
+ * explicitly. Listing an ignore_dir that doesn't exist is harmless — watchman
115
+ * skips absent paths.
116
+ *
117
+ * NON_MEMBER_DIRS are sibling dirs that aren't workspace members (so they're
118
+ * absent from the member union above) but routinely exist in a dev checkout and
119
+ * carry their own node_modules/.git: bootstrap (cloned for development), and the
120
+ * utils/web ecosystem tooling. Their node_modules/.git/dist are excluded too —
121
+ * none are part of the Metro app graph.
122
+ */
123
+ const NON_MEMBER_DIRS = ['bootstrap', 'utils', 'web'];
124
+ function watchmanConfig(dir) {
125
+ const members = [...new Set([...ALL_MEMBERS, ...discoverPresentMembers(dir)])];
126
+ const memberDirs = members.flatMap((m) => [`${m}/node_modules`, `${m}/.git`]);
127
+ const testResultDirs = members.filter((m) => !m.startsWith('tinycld')).map((m) => `${m}/test-results`);
128
+ const nonMemberDirs = NON_MEMBER_DIRS.flatMap((d) => [`${d}/node_modules`, `${d}/.git`, `${d}/dist`]);
129
+ const ignoreDirs = [
130
+ // Root-level .git only. The root node_modules is deliberately NOT ignored:
131
+ // under node-linker=hoisted it's the flat store Metro resolves every dep
132
+ // from (incl. expo-router/entry), so hiding it breaks module resolution.
133
+ '.git',
134
+ // Metro's own transform cache under the root store — churns every build,
135
+ // never a resolvable module path.
136
+ 'node_modules/.cache',
137
+ ...memberDirs,
138
+ ...nonMemberDirs,
139
+ // App-shell native + generated output that churns on builds. ios/android
140
+ // are multi-GB and the original motivation for this file.
141
+ 'tinycld/ios',
142
+ 'tinycld/android',
143
+ 'tinycld/modules/app-updater/android/build',
144
+ 'tinycld/modules/app-updater/ios/build',
145
+ 'tinycld/.expo',
146
+ 'tinycld/dist',
147
+ 'tinycld/server/pb_data',
148
+ 'tinycld/server/pb_test_data',
149
+ 'tinycld/test-results',
150
+ 'tinycld/playwright-report',
151
+ ...testResultDirs,
152
+ ];
153
+ const config = {
154
+ enable_parallel_crawl: true,
155
+ // fsevents_try_resync is FALSE — watchman's own default since Dec 2021.
156
+ // When fsevents drops events (kFSEventStreamEventFlagUserDropped, common
157
+ // under the ~110k-file root store on a `pnpm install` / `git checkout`
158
+ // burst), resync-from-journal usually fails on macOS and falls back to a
159
+ // full recrawl — that's the 60s "syncToNow: timed out waiting for cookie
160
+ // file" stall on Metro start. Leaving it false skips the doomed resync.
161
+ fsevents_try_resync: false,
162
+ // Latency passed to FSEventStreamCreate (seconds). Higher = the OS batches
163
+ // more change notifications per wakeup, so a burst overflows the kernel
164
+ // queue less. Measured on a fast SSD here, an 8k-file burst (a `pnpm
165
+ // install` / `git checkout`) still drops events at 0.1/0.25, goes clean at
166
+ // 0.5, and survives even a 20k-file burst at 1.0. We ship 1.0 because this
167
+ // default lands on unknown hardware: a slow / encrypted / cloud-synced
168
+ // volume drains the fsevents queue more slowly, so it drops at a FAR
169
+ // smaller burst than an SSD — the extra latency is the margin those
170
+ // machines need. The cost is ~1s of detection lag before HMR fires per
171
+ // save; on a slow disk (where rebuilds are already slower) that's
172
+ // proportionally minor, and stability beats shaving it. (default is 0.01.)
173
+ fsevents_latency: 1.0,
174
+ ignore_dirs: [...new Set(ignoreDirs)],
175
+ };
176
+ return `${JSON.stringify(config, null, 4)}\n`;
177
+ }
97
178
  /**
98
179
  * Write (or merge into) the workspace-root coordination files in `dir`:
99
180
  * package.json, pnpm-workspace.yaml, and scripts/link-members.ts.
@@ -160,6 +241,11 @@ export function writeWorkspaceManifest(dir) {
160
241
  // pnpm-workspace.yaml is the source of truth for members + settings — always
161
242
  // rewrite it (unlike package.json, no human-owned fields live here).
162
243
  writeFileSync(join(dir, 'pnpm-workspace.yaml'), pnpmWorkspaceYaml(dir));
244
+ // .watchmanconfig is derived from the member list, like pnpm-workspace.yaml —
245
+ // always rewrite so it self-heals and can't drift to a stale ignore list (a
246
+ // hand-maintained one kept missing the hoisted root node_modules, which is
247
+ // what stalls Metro starts). No human-owned fields live here.
248
+ writeFileSync(join(dir, '.watchmanconfig'), watchmanConfig(dir));
163
249
  // Minimal .npmrc: all pnpm settings live in pnpm-workspace.yaml (pnpm 10+
164
250
  // reads them there, not from .npmrc). Only written when absent (don't
165
251
  // clobber a real checkout's).
@@ -169,38 +255,73 @@ export function writeWorkspaceManifest(dir) {
169
255
  }
170
256
  writeRootBiomeConfig(dir);
171
257
  }
258
+ // Re-root a biome glob written against the canonical's dir (<root>/tinycld/) so
259
+ // it means the same thing one level up at the workspace root. `**`-anchored globs
260
+ // already match at any depth; only bare relative segments need the tinycld/ prefix.
261
+ function rerootBiomeGlob(glob) {
262
+ const negated = glob.startsWith('!');
263
+ const body = negated ? glob.slice(1) : glob;
264
+ if (body.startsWith('**') || body.startsWith('/'))
265
+ return glob;
266
+ const rerooted = `tinycld/${body}`;
267
+ return negated ? `!${rerooted}` : rerooted;
268
+ }
269
+ function rerootBiomePluginPath(p) {
270
+ if (p.startsWith('/'))
271
+ return p;
272
+ return `./tinycld/${p.replace(/^\.\//, '')}`;
273
+ }
172
274
  /**
173
275
  * Write the workspace-root biome.json. Biome searches only UPWARD for config,
174
276
  * and the canonical biome.json lives at <root>/tinycld/ — a SIBLING of the
175
- * feature members, never an ancestor. Without a root config, running biome from
176
- * inside a member (or via the editor/LSP) finds nothing and falls back to
177
- * biome's built-in defaults, flooding output with bogus reformatting. This
178
- * minimal `root: true` config extends the canonical one (which is `root: false`)
179
- * so it's resolvable from anywhere. Members may add their own `root: false`
180
- * biome.json extending canonical to override rules; most don't.
277
+ * feature members, never an ancestor. Without a `root: true` config above the
278
+ * members, running biome from inside a sibling (or via the editor/LSP) finds
279
+ * nothing and falls back to biome's built-in defaults, flooding output with
280
+ * bogus reformatting.
181
281
  *
182
- * Seeded here so a freshly-assembled root lints before its first install. The
183
- * generator also writes it on every install (the canonical config's `root:
184
- * false` ships via the tinycld repo and breaks `pnpm run lint` if no root config
185
- * sits above it), so this is the belt to the generator's suspenders. Content is
186
- * static, so always rewrite.
282
+ * This config must NOT use `extends: ['./tinycld/biome.json']`: Biome 2.5.0
283
+ * silently DROPS the entire `plugins` array from any config reached through a
284
+ * file-path `extends` (biome #8488, only partially fixed by #8524, which covers
285
+ * `extends: "//"` but not a root extending a sibling file). Rules still load, so
286
+ * the GritQL pbtsdb guards would just never run. So the root config must INLINE
287
+ * the canonical's rules + plugins. The generator (tinycld/scripts/generate.ts,
288
+ * run by every install's postinstall) is the authoritative writer and re-derives
289
+ * this file from the canonical each install; this seed only has to be correct for
290
+ * the window between `--assemble-only` and the first install.
187
291
  *
188
- * `vcs.root` points at the tinycld/ member, NOT the workspace root: the
189
- * canonical config relies on `.gitignore` to exclude generated/build artifacts,
190
- * and the only .gitignore listing them is tinycld/.gitignore. Once canonical is
191
- * `root: false`, every invocation under the workspace root resolves THIS config
192
- * as the root and inherits its vcs settings, so useIgnoreFile must be anchored
193
- * here. A freshly-assembled workspace root has no .gitignore (and isn't a git
194
- * repo), so pointing biome there would make it error "couldn't find an ignore
195
- * file".
292
+ * Bootstrap can only inline when the canonical is already on disk (a re-assemble
293
+ * onto an existing workspace, or after the tinycld clone). On a fresh assemble the
294
+ * tinycld repo isn't cloned yet, so we fall back to a minimal `root: true` seed
295
+ * with no plugins — harmless because nothing is installed to lint yet, and the
296
+ * first install's generator immediately replaces it with the full inlined config.
297
+ *
298
+ * `files.includes`/plugin paths are re-rooted (the canonical writes them relative
299
+ * to tinycld/; inlining moves them up one dir). `vcs.root` points at tinycld/, not
300
+ * the workspace root: the canonical relies on tinycld/.gitignore to exclude
301
+ * generated/build artifacts, and every invocation under the workspace root
302
+ * resolves THIS config as the root and inherits its vcs settings. A fresh
303
+ * workspace root has no .gitignore (and isn't a git repo), so anchoring vcs there
304
+ * would error "couldn't find an ignore file".
196
305
  */
197
306
  function writeRootBiomeConfig(root) {
198
- const config = {
199
- $schema: 'https://biomejs.dev/schemas/2.4.16/schema.json',
200
- root: true,
201
- extends: ['./tinycld/biome.json'],
202
- vcs: { enabled: true, clientKind: 'git', useIgnoreFile: true, root: 'tinycld' },
203
- };
307
+ const canonicalPath = join(root, 'tinycld', 'biome.json');
308
+ const config = existsSync(canonicalPath)
309
+ ? (() => {
310
+ const canonical = JSON.parse(readFileSync(canonicalPath, 'utf8'));
311
+ const c = { ...canonical, root: true };
312
+ delete c.extends;
313
+ if (c.files?.includes) {
314
+ c.files = { ...c.files, includes: c.files.includes.map(rerootBiomeGlob) };
315
+ }
316
+ if (Array.isArray(c.plugins)) {
317
+ c.plugins = c.plugins.map((entry) => typeof entry === 'string'
318
+ ? rerootBiomePluginPath(entry)
319
+ : { ...entry, path: rerootBiomePluginPath(entry.path) });
320
+ }
321
+ return c;
322
+ })()
323
+ : { $schema: 'https://biomejs.dev/schemas/2.5.0/schema.json', root: true };
324
+ config.vcs = { enabled: true, clientKind: 'git', useIgnoreFile: true, root: 'tinycld' };
204
325
  writeFileSync(join(root, 'biome.json'), `${JSON.stringify(config, null, 4)}\n`);
205
326
  }
206
327
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"assemble-workspace.js","sourceRoot":"","sources":["../src/assemble-workspace.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"assemble-workspace.js","sourceRoot":"","sources":["../src/assemble-workspace.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
File without changes
package/package.json CHANGED
@@ -1,49 +1,47 @@
1
1
  {
2
- "name": "@tinycld/bootstrap",
3
- "version": "2.4.1",
4
- "description": "Scaffolder for @tinycld feature packages",
5
- "type": "module",
6
- "license": "MIT",
7
- "repository": {
8
- "type": "git",
9
- "url": "git+https://github.com/tinycld/bootstrap.git"
10
- },
11
- "bin": {
12
- "bootstrap": "dist/index.js"
13
- },
14
- "files": [
15
- "dist",
16
- "templates"
17
- ],
18
- "publishConfig": {
19
- "access": "public"
20
- },
21
- "scripts": {
22
- "clean": "rm -rf dist",
23
- "build": "pnpm run clean && tsc",
24
- "dev": "tsx src/index.ts",
25
- "lint": "biome check .",
26
- "lint:fix": "biome check --write .",
27
- "typecheck": "tsc --noEmit",
28
- "checks": "pnpm run lint && pnpm run typecheck",
29
- "test": "vitest run --exclude '**/tests/integration/**'",
30
- "test:integration": "vitest run tests/integration",
31
- "prepublishOnly": "pnpm run checks && pnpm run test && pnpm run build",
32
- "release": "pnpm publish"
33
- },
34
- "dependencies": {
35
- "@clack/prompts": "^0.8.0",
36
- "picocolors": "^1.1.0"
37
- },
38
- "devDependencies": {
39
- "@biomejs/biome": "^2.4.12",
40
- "@types/node": "^22.10.0",
41
- "tsx": "^4.21.0",
42
- "typescript": "^5.9.0",
43
- "vitest": "^3.0.0"
44
- },
45
- "engines": {
46
- "node": ">=24"
47
- },
48
- "packageManager": "pnpm@11.3.0"
49
- }
2
+ "name": "@tinycld/bootstrap",
3
+ "version": "2.4.3",
4
+ "description": "Scaffolder for @tinycld feature packages",
5
+ "type": "module",
6
+ "license": "MIT",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "git+https://github.com/tinycld/bootstrap.git"
10
+ },
11
+ "bin": {
12
+ "bootstrap": "dist/index.js"
13
+ },
14
+ "files": [
15
+ "dist",
16
+ "templates"
17
+ ],
18
+ "publishConfig": {
19
+ "access": "public"
20
+ },
21
+ "dependencies": {
22
+ "@clack/prompts": "^0.8.0",
23
+ "picocolors": "^1.1.0"
24
+ },
25
+ "devDependencies": {
26
+ "@biomejs/biome": "^2.4.12",
27
+ "@types/node": "^22.10.0",
28
+ "tsx": "^4.21.0",
29
+ "typescript": "^5.9.0",
30
+ "vitest": "^3.0.0"
31
+ },
32
+ "engines": {
33
+ "node": ">=24"
34
+ },
35
+ "scripts": {
36
+ "clean": "rm -rf dist",
37
+ "build": "pnpm run clean && tsc",
38
+ "dev": "tsx src/index.ts",
39
+ "lint": "biome check .",
40
+ "lint:fix": "biome check --write .",
41
+ "typecheck": "tsc --noEmit",
42
+ "checks": "pnpm run lint && pnpm run typecheck",
43
+ "test": "vitest run --exclude '**/tests/integration/**'",
44
+ "test:integration": "vitest run tests/integration",
45
+ "release": "pnpm publish"
46
+ }
47
+ }
@@ -27,6 +27,15 @@ import { getPackages } from '../tinycld.packages'
27
27
 
28
28
  const WS_ROOT = path.resolve(import.meta.dirname, '..')
29
29
 
30
+ // Absolute path to the app shell dir, which holds the nested core/,
31
+ // package-scripts/, and the generated output. Normally <WS_ROOT>/tinycld, but
32
+ // EAS cloud builds clone the shell into a dir named 'build', so the EAS install
33
+ // script exports TINYCLD_APP_DIR. Resolved as an absolute path to match the
34
+ // generator's scripts/paths.ts contract for the same env var.
35
+ const APP_DIR = process.env.TINYCLD_APP_DIR
36
+ ? path.resolve(process.env.TINYCLD_APP_DIR)
37
+ : path.join(WS_ROOT, 'tinycld')
38
+
30
39
  // Map a member's package name to its on-disk sibling dir by scanning the
31
40
  // workspace root (the dir name need not equal the package name — e.g.
32
41
  // @tinycld/google-takeout-import lives in google-takeout-import/).
@@ -45,11 +54,11 @@ function memberDirsByName(): Map<string, string> {
45
54
  // not a dir, or no/unreadable package.json — skip
46
55
  }
47
56
  }
48
- // @tinycld/core lives nested in the tinycld member (<WS_ROOT>/tinycld/core/);
57
+ // @tinycld/core lives nested in the app shell (<WS_ROOT>/<APP_DIR>/core/);
49
58
  // the top-level scan won't find it. Register it explicitly so the
50
59
  // node_modules/@tinycld/core symlink is still created.
51
60
  if (!index.has('@tinycld/core')) {
52
- const nestedCore = path.join(WS_ROOT, 'tinycld', 'core')
61
+ const nestedCore = path.join(APP_DIR, 'core')
53
62
  try {
54
63
  const name = JSON.parse(
55
64
  fs.readFileSync(path.join(nestedCore, 'package.json'), 'utf8')
@@ -83,13 +92,73 @@ function linkInto(nodeModulesDir: string, scopeName: string, targetDir: string):
83
92
  fs.symlinkSync(relTarget, linkPath)
84
93
  }
85
94
 
95
+ const GITIGNORE_BEGIN = '# >>> tinycld members (auto-managed by link-members.ts) >>>'
96
+ const GITIGNORE_END = '# <<< tinycld members <<<'
97
+
98
+ // Keep the workspace-root .gitignore's member list in sync with the
99
+ // independent repos present on disk. Every top-level dir that is its own git
100
+ // repo or carries a package.json (members like mail/drive, plus sibling repos
101
+ // like bootstrap/utils/web) must never be tracked by the workspace repo — each
102
+ // has its own history + remote, and the workspace repo commits only
103
+ // coordination files. Nested members (e.g. tinycld/core) are already covered by
104
+ // ignoring /tinycld/. The block is delimited so we rewrite only between the
105
+ // markers and never clobber hand-written rules (.env, node_modules, scratch).
106
+ function discoverSiblingRepos(): string[] {
107
+ const names = new Set<string>()
108
+ for (const entry of fs.readdirSync(WS_ROOT)) {
109
+ if (entry === 'node_modules') continue
110
+ const dir = path.join(WS_ROOT, entry)
111
+ try {
112
+ if (!fs.statSync(dir).isDirectory()) continue
113
+ } catch {
114
+ continue
115
+ }
116
+ const isRepo = fs.existsSync(path.join(dir, '.git'))
117
+ const hasPkg = fs.existsSync(path.join(dir, 'package.json'))
118
+ if (isRepo || hasPkg) names.add(`/${entry}/`)
119
+ }
120
+ return [...names].sort()
121
+ }
122
+
123
+ function syncGitignore(): void {
124
+ const topLevel = discoverSiblingRepos()
125
+ if (topLevel.length === 0) return
126
+
127
+ const block = [GITIGNORE_BEGIN, ...topLevel, GITIGNORE_END].join('\n')
128
+ const gitignorePath = path.join(WS_ROOT, '.gitignore')
129
+ let existing = ''
130
+ try {
131
+ existing = fs.readFileSync(gitignorePath, 'utf8')
132
+ } catch {
133
+ // no .gitignore yet — we'll create one
134
+ }
135
+
136
+ const beginIdx = existing.indexOf(GITIGNORE_BEGIN)
137
+ const endIdx = existing.indexOf(GITIGNORE_END)
138
+ let next: string
139
+ if (beginIdx !== -1 && endIdx !== -1 && endIdx > beginIdx) {
140
+ // Replace the existing managed block in place.
141
+ const before = existing.slice(0, beginIdx)
142
+ const after = existing.slice(endIdx + GITIGNORE_END.length)
143
+ next = `${before}${block}${after}`
144
+ } else {
145
+ // Append a fresh block, separated by a blank line if there's prior content.
146
+ const sep = existing.length > 0 && !existing.endsWith('\n\n') ? '\n\n' : ''
147
+ const prefix = existing.length > 0 && !existing.endsWith('\n') ? '\n' : ''
148
+ next = `${existing}${prefix}${sep}${block}\n`
149
+ }
150
+
151
+ if (next !== existing) {
152
+ fs.writeFileSync(gitignorePath, next)
153
+ console.log(`[link-members] synced ${topLevel.length} member(s) into .gitignore`)
154
+ }
155
+ }
156
+
86
157
  function main(): void {
87
158
  const names = getPackages() // ['@tinycld/core', '@tinycld/calc', ...]
88
159
  const dirs = memberDirsByName()
89
- const targets = [
90
- path.join(WS_ROOT, 'node_modules'),
91
- path.join(WS_ROOT, 'tinycld', 'node_modules'),
92
- ]
160
+ syncGitignore()
161
+ const targets = [path.join(WS_ROOT, 'node_modules'), path.join(APP_DIR, 'node_modules')]
93
162
 
94
163
  let linked = 0
95
164
  for (const name of names) {
@@ -112,13 +181,15 @@ function main(): void {
112
181
  // `@tinycld/app-generated/*` imports resolve by name from any consumer that
113
182
  // pulls core in via its exports map. Skip if the generated dir doesn't exist
114
183
  // yet (generator runs in the same postinstall, but ordering/partial runs vary).
115
- const appGeneratedDir = path.join(WS_ROOT, 'tinycld', 'lib', 'generated')
184
+ const appGeneratedDir = path.join(APP_DIR, 'lib', 'generated')
116
185
  if (fs.existsSync(appGeneratedDir)) {
117
186
  for (const nm of targets) {
118
187
  if (fs.existsSync(nm)) linkInto(nm, 'app-generated', appGeneratedDir)
119
188
  }
120
189
  } else {
121
- console.warn('[link-members] tinycld/lib/generated not present — skipping @tinycld/app-generated link')
190
+ console.warn(
191
+ '[link-members] tinycld/lib/generated not present — skipping @tinycld/app-generated link'
192
+ )
122
193
  }
123
194
 
124
195
  console.log(`[link-members] linked ${linked} workspace member(s) into node_modules/@tinycld/`)
@@ -0,0 +1,11 @@
1
+ // Test-only stub for expo-image. The real package transitively imports
2
+ // expo-modules-core, whose module-load-time side effects (e.g. reading
3
+ // the `__DEV__` global) don't survive a bare Node test environment.
4
+ // Tests that pull a component importing <Image> only need a harmless
5
+ // placeholder — they assert on logic, not on rendered pixels.
6
+
7
+ import type { ReactElement } from 'react'
8
+
9
+ export function Image(_props: unknown): ReactElement | null {
10
+ return null
11
+ }
@@ -49,11 +49,16 @@ export function getPackages(): string[] {
49
49
  if (hasManifest(dir)) features.push(name)
50
50
  }
51
51
 
52
- // @tinycld/core moved INSIDE the tinycld member (at <wsRoot>/tinycld/core/);
53
- // the top-level scan above won't see it. Look for it explicitly so it is
54
- // still listed first.
52
+ // @tinycld/core moved INSIDE the app shell (at <appDir>/core/); the
53
+ // top-level scan above won't see it. Look for it explicitly so it is
54
+ // still listed first. The app dir is normally <wsRoot>/tinycld, but EAS
55
+ // cloud builds clone the shell into a dir named 'build' and export
56
+ // TINYCLD_APP_DIR (absolute path) — honor it to match scripts/paths.ts.
55
57
  if (!core) {
56
- const nestedCorePkg = path.join(wsRoot, 'tinycld', 'core', 'package.json')
58
+ const appDir = process.env.TINYCLD_APP_DIR
59
+ ? path.resolve(process.env.TINYCLD_APP_DIR)
60
+ : path.join(wsRoot, 'tinycld')
61
+ const nestedCorePkg = path.join(appDir, 'core', 'package.json')
57
62
  try {
58
63
  const name = JSON.parse(fs.readFileSync(nestedCorePkg, 'utf8')).name
59
64
  if (name === CORE_NAME) core = name
@@ -75,6 +75,14 @@ export default defineConfig({
75
75
  find: /^expo-clipboard$/,
76
76
  replacement: path.join(ROOT, 'tests/expo-clipboard-stub.ts'),
77
77
  },
78
+ // expo-image pulls in expo-modules-core the same way (its Platform
79
+ // module reads the global __DEV__ at load). Any unit test that
80
+ // imports a component rendering a Thumbnail / <Image> would
81
+ // otherwise crash at collect time.
82
+ {
83
+ find: /^expo-image$/,
84
+ replacement: path.join(ROOT, 'tests/expo-image-stub.tsx'),
85
+ },
78
86
  // expo-router's CJS entry does `require("./global")` at module top,
79
87
  // which Node can't resolve when reached through a member symlink.
80
88
  {