From 0525f43bf53d568bbd201a060856bdfe61b9e1fd Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 7 Apr 2026 16:19:55 +0000 Subject: [PATCH 1/3] Fix include rules not working for subdirectory paths When an include rule targeted a subdirectory (e.g. "include frontend/out"), the parent directory was skipped because it didn't exactly match the pattern. Now we check if a directory is an ancestor of any include pattern and traverse into it without assuming all contents are included. https://claude.ai/code/session_01SnpQmtb8Xt5WVJcUUXKd6W --- .../src/__tests__/resolveFileList.test.ts | 30 +++++++++++++++++++ file-manifest/src/resolveFileList.ts | 24 +++++++++++++-- 2 files changed, 51 insertions(+), 3 deletions(-) diff --git a/file-manifest/src/__tests__/resolveFileList.test.ts b/file-manifest/src/__tests__/resolveFileList.test.ts index 4d42230..0fd9f6a 100644 --- a/file-manifest/src/__tests__/resolveFileList.test.ts +++ b/file-manifest/src/__tests__/resolveFileList.test.ts @@ -82,6 +82,36 @@ it("exclude a nested file", async () => { `); }); +it("include a subdirectory", async () => { + const files = await resolveFileList(sampleDir, ` + include dir-2/subdir-1 + `); + expect(normalizePathsForSnapshot(files.listAll())).toMatchInlineSnapshot(` + [ + { + "id": 1, + "relPath": "dir-2/subdir-1/file-6", + "sourcePath": "dir-2/subdir-1/file-6", + }, + ] + `); +}); + +it("include a file inside a subdirectory", async () => { + const files = await resolveFileList(sampleDir, ` + include dir-2/file-4 + `); + expect(normalizePathsForSnapshot(files.listAll())).toMatchInlineSnapshot(` + [ + { + "id": 1, + "relPath": "dir-2/file-4", + "sourcePath": "dir-2/file-4", + }, + ] + `); +}); + it("exclude a nested directory", async () => { const files = await resolveFileList(sampleDir, ` include dir-2 diff --git a/file-manifest/src/resolveFileList.ts b/file-manifest/src/resolveFileList.ts index e4895fc..e059f7e 100644 --- a/file-manifest/src/resolveFileList.ts +++ b/file-manifest/src/resolveFileList.ts @@ -66,6 +66,20 @@ export async function resolveFileList(sourceDir: string, ruleConfig: string | Pa return defaultValue; } + function isAncestorOfInclude(localPath: string) { + // Check if this directory is an ancestor of any include pattern, so we + // know to traverse into it even when it's not directly included. + const relPath = getRelPath(localPath); + const prefix = relPath + '/'; + + for (const rule of rules) { + if (rule.type === RuleType.Include && rule.pattern.startsWith(prefix)) + return true; + } + + return false; + } + async function recursiveIncludeSubDirectory(localDir: string, assumeIncludeContents: boolean) { // Include the contents of this directory. // @@ -80,12 +94,16 @@ export async function resolveFileList(sourceDir: string, ruleConfig: string | Pa for (const dirRelFile of dirContents) { const localSubFile = Path.join(localDir, dirRelFile); - if (!shouldInclude(localSubFile, assumeIncludeContents)) { + if (await isDirectory(localSubFile)) { + if (shouldInclude(localSubFile, assumeIncludeContents)) { + await recursiveIncludeSubDirectory(localSubFile, true); + } else if (isAncestorOfInclude(localSubFile)) { + await recursiveIncludeSubDirectory(localSubFile, false); + } continue; } - if (await isDirectory(localSubFile)) { - await recursiveIncludeSubDirectory(localSubFile, true); + if (!shouldInclude(localSubFile, assumeIncludeContents)) { continue; } From 78b4f57f4d3094784d099aebb334c6903b617275 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 7 Apr 2026 16:34:38 +0000 Subject: [PATCH 2/3] Add glob pattern support for include/exclude rules - Add picomatch dependency for glob matching in file-manifest - Update shouldInclude() and findLeftoverFiles() to use picomatch.isMatch() instead of exact string comparison - Fix parseRulesFile to join all tag attrs, since @facetlayer/qc splits on * - Add couldContainMatch() to traverse ancestor directories of glob patterns - Make exclude rules take priority over include rules (needed for overlapping glob patterns like include src/**/*.ts + exclude **/*.test.ts) - Add tests for *, **, and mixed glob/exact patterns https://claude.ai/code/session_01SnpQmtb8Xt5WVJcUUXKd6W --- file-manifest/package.json | 4 +- .../src/__tests__/resolveFileList.test.ts | 78 +++++++ .../src/__tests__/samplefiles-glob/README.md | 0 .../__tests__/samplefiles-glob/package.json | 0 .../samplefiles-glob/src/index.test.ts | 0 .../__tests__/samplefiles-glob/src/index.ts | 0 .../samplefiles-glob/src/lib/helper.test.ts | 0 .../samplefiles-glob/src/lib/helper.ts | 0 .../__tests__/samplefiles-glob/src/utils.ts | 0 file-manifest/src/findLeftoverFiles.ts | 3 +- file-manifest/src/parseRulesFile.ts | 2 +- file-manifest/src/resolveFileList.ts | 42 +++- pnpm-lock.yaml | 195 ++++++++++-------- 13 files changed, 227 insertions(+), 97 deletions(-) create mode 100644 file-manifest/src/__tests__/samplefiles-glob/README.md create mode 100644 file-manifest/src/__tests__/samplefiles-glob/package.json create mode 100644 file-manifest/src/__tests__/samplefiles-glob/src/index.test.ts create mode 100644 file-manifest/src/__tests__/samplefiles-glob/src/index.ts create mode 100644 file-manifest/src/__tests__/samplefiles-glob/src/lib/helper.test.ts create mode 100644 file-manifest/src/__tests__/samplefiles-glob/src/lib/helper.ts create mode 100644 file-manifest/src/__tests__/samplefiles-glob/src/utils.ts diff --git a/file-manifest/package.json b/file-manifest/package.json index 8c6c99c..1879e30 100644 --- a/file-manifest/package.json +++ b/file-manifest/package.json @@ -11,10 +11,12 @@ "dependencies": { "@facetlayer/concurrency-limit": "^0.1.0", "@facetlayer/qc": "^0.1.0", - "@facetlayer/streams": "^1.0.0" + "@facetlayer/streams": "^1.0.0", + "picomatch": "^4.0.4" }, "devDependencies": { "@types/node": "^20.0.0", + "@types/picomatch": "^4.0.3", "typescript": "^5.2.0", "vitest": "^3.0.6" } diff --git a/file-manifest/src/__tests__/resolveFileList.test.ts b/file-manifest/src/__tests__/resolveFileList.test.ts index 0fd9f6a..8ed4169 100644 --- a/file-manifest/src/__tests__/resolveFileList.test.ts +++ b/file-manifest/src/__tests__/resolveFileList.test.ts @@ -112,6 +112,84 @@ it("include a file inside a subdirectory", async () => { `); }); +// Glob pattern tests + +const globSampleDir = Path.resolve(__dirname, 'samplefiles-glob'); + +function normalizeGlobPaths(files: FileEntry[]): string[] { + return files.map(f => Path.relative(globSampleDir, f.sourcePath)).sort(); +} + +it("glob: include with wildcard matching directories", async () => { + const files = await resolveFileList(sampleDir, ` + include dir-* + `); + expect(normalizePathsForSnapshot(files.listAll()).map(f => f.relPath)).toEqual([ + "dir-1/file-3", + "dir-2/file-4", + "dir-2/file-5", + "dir-2/subdir-1/file-6", + ]); +}); + +it("glob: include with wildcard matching files", async () => { + const files = await resolveFileList(sampleDir, ` + include file-* + `); + expect(normalizePathsForSnapshot(files.listAll()).map(f => f.relPath)).toEqual([ + "file-1", + "file-2", + ]); +}); + +it("glob: include with ** to match deep paths", async () => { + const files = await resolveFileList(globSampleDir, ` + include src/**/*.ts + `); + expect(normalizeGlobPaths(files.listAll())).toEqual([ + "src/index.test.ts", + "src/index.ts", + "src/lib/helper.test.ts", + "src/lib/helper.ts", + "src/utils.ts", + ]); +}); + +it("glob: exclude with ** pattern", async () => { + const files = await resolveFileList(globSampleDir, ` + include src/**/*.ts + exclude **/*.test.ts + `); + expect(normalizeGlobPaths(files.listAll())).toEqual([ + "src/index.ts", + "src/lib/helper.ts", + "src/utils.ts", + ]); +}); + +it("glob: include with extension wildcard at top level", async () => { + const files = await resolveFileList(globSampleDir, ` + include *.json + `); + expect(normalizeGlobPaths(files.listAll())).toEqual([ + "package.json", + ]); +}); + +it("glob: mix glob and exact patterns", async () => { + const files = await resolveFileList(globSampleDir, ` + include src + include *.json + exclude src/lib + `); + expect(normalizeGlobPaths(files.listAll())).toEqual([ + "package.json", + "src/index.test.ts", + "src/index.ts", + "src/utils.ts", + ]); +}); + it("exclude a nested directory", async () => { const files = await resolveFileList(sampleDir, ` include dir-2 diff --git a/file-manifest/src/__tests__/samplefiles-glob/README.md b/file-manifest/src/__tests__/samplefiles-glob/README.md new file mode 100644 index 0000000..e69de29 diff --git a/file-manifest/src/__tests__/samplefiles-glob/package.json b/file-manifest/src/__tests__/samplefiles-glob/package.json new file mode 100644 index 0000000..e69de29 diff --git a/file-manifest/src/__tests__/samplefiles-glob/src/index.test.ts b/file-manifest/src/__tests__/samplefiles-glob/src/index.test.ts new file mode 100644 index 0000000..e69de29 diff --git a/file-manifest/src/__tests__/samplefiles-glob/src/index.ts b/file-manifest/src/__tests__/samplefiles-glob/src/index.ts new file mode 100644 index 0000000..e69de29 diff --git a/file-manifest/src/__tests__/samplefiles-glob/src/lib/helper.test.ts b/file-manifest/src/__tests__/samplefiles-glob/src/lib/helper.test.ts new file mode 100644 index 0000000..e69de29 diff --git a/file-manifest/src/__tests__/samplefiles-glob/src/lib/helper.ts b/file-manifest/src/__tests__/samplefiles-glob/src/lib/helper.ts new file mode 100644 index 0000000..e69de29 diff --git a/file-manifest/src/__tests__/samplefiles-glob/src/utils.ts b/file-manifest/src/__tests__/samplefiles-glob/src/utils.ts new file mode 100644 index 0000000..e69de29 diff --git a/file-manifest/src/findLeftoverFiles.ts b/file-manifest/src/findLeftoverFiles.ts index 6874721..1849ffb 100644 --- a/file-manifest/src/findLeftoverFiles.ts +++ b/file-manifest/src/findLeftoverFiles.ts @@ -2,6 +2,7 @@ import { ParsedRules } from './resolveFileList'; import { RuleType } from './FileMatchRule'; import { FileList } from './FileList'; +import picomatch from 'picomatch'; import Path from 'path'; import Fs from 'fs/promises'; @@ -31,7 +32,7 @@ export async function findLeftoverFiles(targetDir: string, incomingFiles: FileLi // Check if any rule tells us to ignore this destination file let shouldIgnore = false; for (const rule of ruleConfig) { - if ((rule.type === RuleType.IgnoreDestination || rule.type === RuleType.Ignore) && rule.pattern === relPath) { + if ((rule.type === RuleType.IgnoreDestination || rule.type === RuleType.Ignore) && picomatch.isMatch(relPath, rule.pattern)) { shouldIgnore = true; break; } diff --git a/file-manifest/src/parseRulesFile.ts b/file-manifest/src/parseRulesFile.ts index 2aeb48c..e6b0f15 100644 --- a/file-manifest/src/parseRulesFile.ts +++ b/file-manifest/src/parseRulesFile.ts @@ -7,7 +7,7 @@ export function parseRulesFile(ruleConfig: string): FileMatchRule[] { for (const query of queries) { const command = query.command; - const pattern = query.tags?.[0]?.attr; + const pattern = query.tags?.map(t => t.attr).join(''); if (!pattern) { throw new Error(`Missing pattern for ${command} rule`); diff --git a/file-manifest/src/resolveFileList.ts b/file-manifest/src/resolveFileList.ts index e059f7e..aa49fd9 100644 --- a/file-manifest/src/resolveFileList.ts +++ b/file-manifest/src/resolveFileList.ts @@ -2,6 +2,7 @@ import Path from 'path' import Fs from 'fs/promises' +import picomatch from 'picomatch'; import { FileMatchRule, RuleType } from './FileMatchRule'; import { parseRulesFile } from './parseRulesFile'; import { FileList } from './FileList'; @@ -50,30 +51,57 @@ export async function resolveFileList(sourceDir: string, ruleConfig: string | Pa } function shouldInclude(localPath: string, defaultValue: boolean) { - // Returns whether the file should be included (based on the config rules) + // Returns whether the file should be included (based on the config rules). + // Exclude rules take priority over include rules. const relPath = getRelPath(localPath); for (const rule of rules) { - if (rule.type === RuleType.Include && rule.pattern === relPath) - return true; + if ((rule.type === RuleType.Exclude || rule.type === RuleType.Ignore) && picomatch.isMatch(relPath, rule.pattern)) + return false; } for (const rule of rules) { - if ((rule.type === RuleType.Exclude || rule.type === RuleType.Ignore) && rule.pattern === relPath) - return false; + if (rule.type === RuleType.Include && picomatch.isMatch(relPath, rule.pattern)) + return true; } return defaultValue; } + function couldContainMatch(dirRelPath: string, pattern: string): boolean { + // Check if a directory could contain files that match the given pattern + // by walking through path segments and pattern segments together. + const dirParts = dirRelPath.split('/'); + const patParts = pattern.split('/'); + + let pi = 0; + let di = 0; + + while (di < dirParts.length && pi < patParts.length) { + if (patParts[pi] === '**') { + // ** can match any number of segments - directory could contain matches + return true; + } + if (picomatch.isMatch(dirParts[di], patParts[pi])) { + di++; + pi++; + } else { + return false; + } + } + + // If we consumed all dir segments and still have pattern segments left, + // then this directory is an ancestor of potential matches. + return di === dirParts.length && pi < patParts.length; + } + function isAncestorOfInclude(localPath: string) { // Check if this directory is an ancestor of any include pattern, so we // know to traverse into it even when it's not directly included. const relPath = getRelPath(localPath); - const prefix = relPath + '/'; for (const rule of rules) { - if (rule.type === RuleType.Include && rule.pattern.startsWith(prefix)) + if (rule.type === RuleType.Include && couldContainMatch(relPath, rule.pattern)) return true; } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 443c3b0..e05a495 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -338,10 +338,16 @@ importers: '@facetlayer/streams': specifier: ^1.0.0 version: 1.0.0 + picomatch: + specifier: ^4.0.4 + version: 4.0.4 devDependencies: '@types/node': specifier: ^20.0.0 version: 20.19.23 + '@types/picomatch': + specifier: ^4.0.3 + version: 4.0.3 typescript: specifier: ^5.2.0 version: 5.7.3 @@ -753,7 +759,7 @@ importers: version: link:../prism-framework expo-sqlite: specifier: '>=14.0.0' - version: 55.0.11(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0) + version: 55.0.11(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4) zod: specifier: ^4.0.5 version: 4.1.12 @@ -4047,6 +4053,9 @@ packages: '@types/node@22.13.0': resolution: {integrity: sha512-ClIbNe36lawluuvq3+YYhnIN2CELi+6q8NpnM7PYp4hBn/TatfboPgVSm2rwKRfnV2M+Ty9GWDFI64KEe+kysA==} + '@types/picomatch@4.0.3': + resolution: {integrity: sha512-iG0T6+nYJ9FAPmx9SsUlnwcq1ZVRuCXcVEvWnntoPlrOpwtSTKNDC9uVAxTsC3PUvJ+99n4RpAcNgBbHX3JSnQ==} + '@types/prismjs@1.26.5': resolution: {integrity: sha512-AUZTa7hQ2KY5L7AmtSiqxlhWxb4ina0yd8hNbl4TWuqnv/pFP0nDMb3YrfSBf4hJVGLh2YEIBfKaBW/9UEl6IQ==} @@ -7618,6 +7627,10 @@ packages: resolution: {integrity: sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==} engines: {node: '>=12'} + picomatch@4.0.4: + resolution: {integrity: sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==} + engines: {node: '>=12'} + pirates@4.0.7: resolution: {integrity: sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==} engines: {node: '>= 6'} @@ -12135,7 +12148,7 @@ snapshots: '@exodus/bytes@1.15.0': {} - '@expo/cli@55.0.19(@expo/dom-webview@55.0.3)(expo-constants@55.0.9(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(typescript@5.9.3))(expo-font@55.0.4(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0))(expo@55.0.9)(react-dom@19.2.0(react@19.2.0))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)(typescript@5.9.3)': + '@expo/cli@55.0.19(@expo/dom-webview@55.0.3)(expo-constants@55.0.9(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(typescript@5.9.3))(expo-font@55.0.4(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4))(expo@55.0.9)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)(typescript@5.9.3)': dependencies: '@expo/code-signing-certificates': 0.0.6 '@expo/config': 55.0.11(typescript@5.9.3) @@ -12144,7 +12157,7 @@ snapshots: '@expo/env': 2.1.1 '@expo/image-utils': 0.8.12 '@expo/json-file': 10.0.12 - '@expo/log-box': 55.0.8(@expo/dom-webview@55.0.3)(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0) + '@expo/log-box': 55.0.8(@expo/dom-webview@55.0.3)(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4) '@expo/metro': 54.2.0 '@expo/metro-config': 55.0.11(expo@55.0.9)(typescript@5.9.3) '@expo/osascript': 2.4.2 @@ -12152,7 +12165,7 @@ snapshots: '@expo/plist': 0.5.2 '@expo/prebuild-config': 55.0.11(expo@55.0.9)(typescript@5.9.3) '@expo/require-utils': 55.0.3(typescript@5.9.3) - '@expo/router-server': 55.0.11(expo-constants@55.0.9(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(typescript@5.9.3))(expo-font@55.0.4(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0))(expo-server@55.0.6)(expo@55.0.9)(react-dom@19.2.0(react@19.2.0))(react@19.2.0) + '@expo/router-server': 55.0.11(expo-constants@55.0.9(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(typescript@5.9.3))(expo-font@55.0.4(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4))(expo-server@55.0.6)(expo@55.0.9)(react-dom@19.2.4(react@19.2.4))(react@19.2.4) '@expo/schema-utils': 55.0.2 '@expo/spawn-async': 1.7.2 '@expo/ws-tunnel': 1.0.6 @@ -12169,7 +12182,7 @@ snapshots: connect: 3.7.0 debug: 4.4.3 dnssd-advertise: 1.1.4 - expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.0(react@19.2.0))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)(typescript@5.9.3) expo-server: 55.0.6 fetch-nodeshim: 0.4.10 getenv: 2.0.0 @@ -12179,7 +12192,7 @@ snapshots: node-forge: 1.4.0 npm-package-arg: 11.0.3 ora: 3.4.0 - picomatch: 4.0.3 + picomatch: 4.0.4 pretty-format: 29.7.0 progress: 2.0.3 prompts: 2.4.2 @@ -12196,7 +12209,7 @@ snapshots: ws: 8.18.3 zod: 3.25.76 optionalDependencies: - react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0) + react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4) transitivePeerDependencies: - '@expo/dom-webview' - '@expo/metro-runtime' @@ -12258,18 +12271,18 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/devtools@55.0.2(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)': + '@expo/devtools@55.0.2(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)': dependencies: chalk: 4.1.2 optionalDependencies: - react: 19.2.0 - react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0) + react: 19.2.4 + react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4) - '@expo/dom-webview@55.0.3(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)': + '@expo/dom-webview@55.0.3(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)': dependencies: - expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.0(react@19.2.0))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) - react: 19.2.0 - react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0) + expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + react: 19.2.4 + react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4) '@expo/env@2.1.1': dependencies: @@ -12318,13 +12331,13 @@ snapshots: - supports-color - typescript - '@expo/log-box@55.0.8(@expo/dom-webview@55.0.3)(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)': + '@expo/log-box@55.0.8(@expo/dom-webview@55.0.3)(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)': dependencies: - '@expo/dom-webview': 55.0.3(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0) + '@expo/dom-webview': 55.0.3(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4) anser: 1.4.10 - expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.0(react@19.2.0))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) - react: 19.2.0 - react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0) + expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + react: 19.2.4 + react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4) stacktrace-parser: 0.1.11 '@expo/metro-config@55.0.11(expo@55.0.9)(typescript@5.9.3)': @@ -12345,11 +12358,11 @@ snapshots: hermes-parser: 0.32.1 jsc-safe-url: 0.2.4 lightningcss: 1.31.1 - picomatch: 4.0.3 + picomatch: 4.0.4 postcss: 8.4.49 resolve-from: 5.0.0 optionalDependencies: - expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.0(react@19.2.0))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)(typescript@5.9.3) transitivePeerDependencies: - bufferutil - supports-color @@ -12405,7 +12418,7 @@ snapshots: '@expo/json-file': 10.0.12 '@react-native/normalize-colors': 0.83.4 debug: 4.4.3 - expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.0(react@19.2.0))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)(typescript@5.9.3) resolve-from: 5.0.0 semver: 7.7.3 xml2js: 0.6.0 @@ -12423,16 +12436,16 @@ snapshots: transitivePeerDependencies: - supports-color - '@expo/router-server@55.0.11(expo-constants@55.0.9(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(typescript@5.9.3))(expo-font@55.0.4(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0))(expo-server@55.0.6)(expo@55.0.9)(react-dom@19.2.0(react@19.2.0))(react@19.2.0)': + '@expo/router-server@55.0.11(expo-constants@55.0.9(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(typescript@5.9.3))(expo-font@55.0.4(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4))(expo-server@55.0.6)(expo@55.0.9)(react-dom@19.2.4(react@19.2.4))(react@19.2.4)': dependencies: debug: 4.4.3 - expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.0(react@19.2.0))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) - expo-constants: 55.0.9(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(typescript@5.9.3) - expo-font: 55.0.4(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0) + expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + expo-constants: 55.0.9(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(typescript@5.9.3) + expo-font: 55.0.4(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4) expo-server: 55.0.6 - react: 19.2.0 + react: 19.2.4 optionalDependencies: - react-dom: 19.2.0(react@19.2.0) + react-dom: 19.2.4(react@19.2.4) transitivePeerDependencies: - supports-color @@ -12446,11 +12459,11 @@ snapshots: '@expo/sudo-prompt@9.3.2': {} - '@expo/vector-icons@15.1.1(expo-font@55.0.4(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)': + '@expo/vector-icons@15.1.1(expo-font@55.0.4(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)': dependencies: - expo-font: 55.0.4(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0) - react: 19.2.0 - react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0) + expo-font: 55.0.4(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4) + react: 19.2.4 + react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4) '@expo/ws-tunnel@1.0.6': {} @@ -13177,12 +13190,12 @@ snapshots: '@react-native/normalize-colors@0.84.1': {} - '@react-native/virtualized-lists@0.84.1(@types/react@19.2.2)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)': + '@react-native/virtualized-lists@0.84.1(@types/react@19.2.2)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)': dependencies: invariant: 2.2.4 nullthrows: 1.1.1 - react: 19.2.0 - react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0) + react: 19.2.4 + react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4) optionalDependencies: '@types/react': 19.2.2 @@ -13670,6 +13683,8 @@ snapshots: dependencies: undici-types: 6.20.0 + '@types/picomatch@4.0.3': {} + '@types/prismjs@1.26.5': {} '@types/qs@6.14.0': {} @@ -14482,7 +14497,7 @@ snapshots: resolve-from: 5.0.0 optionalDependencies: '@babel/runtime': 7.28.4 - expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.0(react@19.2.0))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)(typescript@5.9.3) transitivePeerDependencies: - '@babel/core' - supports-color @@ -15637,43 +15652,43 @@ snapshots: expect-type@1.3.0: {} - expo-asset@55.0.10(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)(typescript@5.9.3): + expo-asset@55.0.10(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)(typescript@5.9.3): dependencies: '@expo/image-utils': 0.8.12 - expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.0(react@19.2.0))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) - expo-constants: 55.0.9(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(typescript@5.9.3) - react: 19.2.0 - react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0) + expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + expo-constants: 55.0.9(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(typescript@5.9.3) + react: 19.2.4 + react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4) transitivePeerDependencies: - supports-color - typescript - expo-constants@55.0.9(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(typescript@5.9.3): + expo-constants@55.0.9(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(typescript@5.9.3): dependencies: '@expo/config': 55.0.11(typescript@5.9.3) '@expo/env': 2.1.1 - expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.0(react@19.2.0))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) - react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0) + expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4) transitivePeerDependencies: - supports-color - typescript - expo-file-system@55.0.12(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0)): + expo-file-system@55.0.12(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4)): dependencies: - expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.0(react@19.2.0))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) - react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0) + expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4) - expo-font@55.0.4(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0): + expo-font@55.0.4(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4): dependencies: - expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.0(react@19.2.0))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)(typescript@5.9.3) fontfaceobserver: 2.3.0 - react: 19.2.0 - react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0) + react: 19.2.4 + react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4) - expo-keep-awake@55.0.4(expo@55.0.9)(react@19.2.0): + expo-keep-awake@55.0.4(expo@55.0.9)(react@19.2.4): dependencies: - expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.0(react@19.2.0))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) - react: 19.2.0 + expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + react: 19.2.4 expo-modules-autolinking@55.0.12(typescript@5.9.3): dependencies: @@ -15685,50 +15700,50 @@ snapshots: - supports-color - typescript - expo-modules-core@55.0.18(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0): + expo-modules-core@55.0.18(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4): dependencies: invariant: 2.2.4 - react: 19.2.0 - react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0) + react: 19.2.4 + react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4) expo-server@55.0.6: {} - expo-sqlite@55.0.11(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0): + expo-sqlite@55.0.11(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4): dependencies: await-lock: 2.2.2 - expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.0(react@19.2.0))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) - react: 19.2.0 - react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0) + expo: 55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + react: 19.2.4 + react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4) - expo@55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.0(react@19.2.0))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)(typescript@5.9.3): + expo@55.0.9(@babel/core@7.28.5)(@expo/dom-webview@55.0.3)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)(typescript@5.9.3): dependencies: '@babel/runtime': 7.28.4 - '@expo/cli': 55.0.19(@expo/dom-webview@55.0.3)(expo-constants@55.0.9(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(typescript@5.9.3))(expo-font@55.0.4(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0))(expo@55.0.9)(react-dom@19.2.0(react@19.2.0))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) + '@expo/cli': 55.0.19(@expo/dom-webview@55.0.3)(expo-constants@55.0.9(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(typescript@5.9.3))(expo-font@55.0.4(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4))(expo@55.0.9)(react-dom@19.2.4(react@19.2.4))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)(typescript@5.9.3) '@expo/config': 55.0.11(typescript@5.9.3) '@expo/config-plugins': 55.0.7 - '@expo/devtools': 55.0.2(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0) + '@expo/devtools': 55.0.2(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4) '@expo/fingerprint': 0.16.6 '@expo/local-build-cache-provider': 55.0.7(typescript@5.9.3) - '@expo/log-box': 55.0.8(@expo/dom-webview@55.0.3)(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0) + '@expo/log-box': 55.0.8(@expo/dom-webview@55.0.3)(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4) '@expo/metro': 54.2.0 '@expo/metro-config': 55.0.11(expo@55.0.9)(typescript@5.9.3) - '@expo/vector-icons': 15.1.1(expo-font@55.0.4(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0) + '@expo/vector-icons': 15.1.1(expo-font@55.0.4(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4))(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4) '@ungap/structured-clone': 1.3.0 babel-preset-expo: 55.0.13(@babel/core@7.28.5)(@babel/runtime@7.28.4)(expo@55.0.9)(react-refresh@0.14.2) - expo-asset: 55.0.10(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0)(typescript@5.9.3) - expo-constants: 55.0.9(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(typescript@5.9.3) - expo-file-system: 55.0.12(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0)) - expo-font: 55.0.4(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0) - expo-keep-awake: 55.0.4(expo@55.0.9)(react@19.2.0) + expo-asset: 55.0.10(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4)(typescript@5.9.3) + expo-constants: 55.0.9(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(typescript@5.9.3) + expo-file-system: 55.0.12(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4)) + expo-font: 55.0.4(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4) + expo-keep-awake: 55.0.4(expo@55.0.9)(react@19.2.4) expo-modules-autolinking: 55.0.12(typescript@5.9.3) - expo-modules-core: 55.0.18(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0) + expo-modules-core: 55.0.18(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4) pretty-format: 29.7.0 - react: 19.2.0 - react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0) + react: 19.2.4 + react-native: 0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4) react-refresh: 0.14.2 whatwg-url-minimum: 0.1.1 optionalDependencies: - '@expo/dom-webview': 55.0.3(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0) + '@expo/dom-webview': 55.0.3(expo@55.0.9)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4) transitivePeerDependencies: - '@babel/core' - bufferutil @@ -15854,6 +15869,10 @@ snapshots: optionalDependencies: picomatch: 4.0.3 + fdir@6.5.0(picomatch@4.0.4): + optionalDependencies: + picomatch: 4.0.4 + feed@4.2.2: dependencies: xml-js: 1.6.11 @@ -18183,7 +18202,7 @@ snapshots: path-scurry@2.0.2: dependencies: - lru-cache: 11.2.2 + lru-cache: 11.2.7 minipass: 7.1.3 path-to-regexp@0.1.12: {} @@ -18216,6 +18235,8 @@ snapshots: picomatch@4.0.3: {} + picomatch@4.0.4: {} + pirates@4.0.7: {} pkg-dir@7.0.0: @@ -18872,7 +18893,7 @@ snapshots: react-loadable: '@docusaurus/react-loadable@6.0.0(react@18.3.1)' webpack: 5.103.0 - react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0): + react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4): dependencies: '@jest/create-cache-key-function': 29.7.0 '@react-native/assets-registry': 0.84.1 @@ -18881,7 +18902,7 @@ snapshots: '@react-native/gradle-plugin': 0.84.1 '@react-native/js-polyfills': 0.84.1 '@react-native/normalize-colors': 0.84.1 - '@react-native/virtualized-lists': 0.84.1(@types/react@19.2.2)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.0))(react@19.2.0) + '@react-native/virtualized-lists': 0.84.1(@types/react@19.2.2)(react-native@0.84.1(@babel/core@7.28.5)(@types/react@19.2.2)(react@19.2.4))(react@19.2.4) abort-controller: 3.0.0 anser: 1.4.10 ansi-regex: 5.0.1 @@ -18899,7 +18920,7 @@ snapshots: nullthrows: 1.1.1 pretty-format: 29.7.0 promise: 8.3.0 - react: 19.2.0 + react: 19.2.4 react-devtools-core: 6.1.5 react-refresh: 0.14.2 regenerator-runtime: 0.13.11 @@ -19756,8 +19777,8 @@ snapshots: tinyglobby@0.2.15: dependencies: - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 tinypool@0.8.4: {} @@ -20285,8 +20306,8 @@ snapshots: vite@7.1.11(@types/node@20.19.23)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1): dependencies: esbuild: 0.25.12 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 postcss: 8.5.6 rollup: 4.52.5 tinyglobby: 0.2.15 @@ -20301,8 +20322,8 @@ snapshots: vite@7.1.11(@types/node@22.13.0)(jiti@2.6.1)(lightningcss@1.31.1)(terser@5.44.1)(yaml@2.8.1): dependencies: esbuild: 0.25.12 - fdir: 6.5.0(picomatch@4.0.3) - picomatch: 4.0.3 + fdir: 6.5.0(picomatch@4.0.4) + picomatch: 4.0.4 postcss: 8.5.6 rollup: 4.52.5 tinyglobby: 0.2.15 @@ -20593,7 +20614,7 @@ snapshots: expect-type: 1.2.2 magic-string: 0.30.19 pathe: 2.0.3 - picomatch: 4.0.3 + picomatch: 4.0.4 std-env: 3.10.0 tinybench: 2.9.0 tinyexec: 0.3.2 @@ -20636,7 +20657,7 @@ snapshots: expect-type: 1.2.2 magic-string: 0.30.19 pathe: 2.0.3 - picomatch: 4.0.3 + picomatch: 4.0.4 std-env: 3.10.0 tinybench: 2.9.0 tinyexec: 0.3.2 From b72f33d4d675204302376e9fe01d684c3e5ad334 Mon Sep 17 00:00:00 2001 From: Claude Date: Tue, 7 Apr 2026 16:48:53 +0000 Subject: [PATCH 3/3] Update docs for glob pattern support and subdirectory includes - file-manifest README: document glob patterns, subdirectory includes, rule priority, and updated API example - file-manifest CHANGELOG: created with unreleased changes - goobernetes README: add glob examples to file inclusion/exclusion section - goobernetes CHANGELOG: add unreleased section https://claude.ai/code/session_01SnpQmtb8Xt5WVJcUUXKd6W --- file-manifest/CHANGELOG.md | 7 ++++++ file-manifest/README.md | 49 ++++++++++++++++++++++++++++++++++++-- goobernetes/CHANGELOG.md | 4 ++++ goobernetes/README.md | 6 +++++ 4 files changed, 64 insertions(+), 2 deletions(-) create mode 100644 file-manifest/CHANGELOG.md diff --git a/file-manifest/CHANGELOG.md b/file-manifest/CHANGELOG.md new file mode 100644 index 0000000..a26b701 --- /dev/null +++ b/file-manifest/CHANGELOG.md @@ -0,0 +1,7 @@ +# Unreleased + - Added glob pattern support for all rules (include, exclude, ignore, ignore-destination) using picomatch + - Fixed include rules not working for subdirectory paths (e.g. `include frontend/out`) + - Changed exclude rules to take priority over include rules + +# 0.1.0 + - Initial public release. diff --git a/file-manifest/README.md b/file-manifest/README.md index 52c3d9f..35f1c7a 100644 --- a/file-manifest/README.md +++ b/file-manifest/README.md @@ -39,6 +39,51 @@ to specify paths that shouldn't be deleted. ignore-destination dest ``` +## Glob patterns + +All rules support glob patterns (powered by [picomatch](https://github.com/micromatch/picomatch)): + +| Pattern | Description | Example | +|---------|-------------|---------| +| `*` | Match any characters except `/` | `include *.json` matches top-level JSON files | +| `**` | Match any number of directories | `include src/**/*.ts` matches all `.ts` files under `src/` | +| `?` | Match a single character | `include file-?` matches `file-1`, `file-2`, etc. | +| `{a,b}` | Match any of the comma-separated patterns | `include *.{js,ts}` matches JS and TS files | + +### Glob examples + +``` + include src/**/*.ts + exclude **/*.test.ts + include dist/*.js + include config-* +``` + +**Note:** `*` only matches within a single path segment. Use `**` to match across directories: +- `include *.js` matches `index.js` but not `src/index.js` +- `include **/*.js` matches both `index.js` and `src/index.js` + +## Subdirectory includes + +You can include a specific subdirectory without including its parent's other contents: + +``` + include frontend/out +``` + +This will traverse into `frontend/` but only include the `out/` subdirectory and its contents. Other files and directories inside `frontend/` are not included. + +## Rule priority + +Exclude rules take priority over include rules. If a path matches both an include and exclude pattern, the exclude wins: + +``` + include src/**/*.ts + exclude **/*.test.ts +``` + +This includes all TypeScript files under `src/` except test files. + # API @@ -62,9 +107,9 @@ Takes a source directory and rules configuration, returns a table of files that **Example:** ```typescript const files = await resolveFileList('/path/to/source', ` - include src + include src/**/*.ts include docs - exclude src/build + exclude **/*.test.ts exclude .git `); diff --git a/goobernetes/CHANGELOG.md b/goobernetes/CHANGELOG.md index 44f9ff8..97b44a5 100644 --- a/goobernetes/CHANGELOG.md +++ b/goobernetes/CHANGELOG.md @@ -1,3 +1,7 @@ +# Unreleased + - Added glob pattern support for include/exclude/ignore rules (e.g. `include src/**/*.ts`, `exclude **/*.test.js`) + - Fixed include rules not working for subdirectory paths (e.g. `include frontend/out`) + # 0.3.3 - Update sqlite3 version diff --git a/goobernetes/README.md b/goobernetes/README.md index 9c437b4..adaa0ff 100644 --- a/goobernetes/README.md +++ b/goobernetes/README.md @@ -134,6 +134,12 @@ ignore web/.next - `exclude `: Exclude files or directories from the deployment. - `ignore `: Ignore a path or directory on the source side or receiving side. +All file rules support glob patterns: +- `include src/**/*.ts` — include all TypeScript files under `src/` +- `exclude **/*.test.js` — exclude test files at any depth +- `include config-*` — include files/directories matching a wildcard +- `include frontend/out` — include only a specific subdirectory + ### Example Configuration ```