@limrun/api 0.39.4 → 0.39.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 0.39.5 (2026-07-10)
4
+
5
+ Full Changelog: [v0.39.4...v0.39.5](https://github.com/limrun-inc/typescript-sdk/compare/v0.39.4...v0.39.5)
6
+
3
7
  ## 0.39.4 (2026-07-10)
4
8
 
5
9
  Full Changelog: [v0.39.3...v0.39.4](https://github.com/limrun-inc/typescript-sdk/compare/v0.39.3...v0.39.4)
@@ -1,9 +1,47 @@
1
1
  export type IgnoreFn = (relativePath: string) => boolean;
2
2
  export type IgnoreLogger = (level: 'debug' | 'info' | 'warn' | 'error', msg: string) => void;
3
3
  export type IgnoreFnOptions = {
4
+ /** User-supplied extra excludes (the CLI's --ignore). Consulted after every built-in layer. */
4
5
  additional?: IgnoreFn;
6
+ /**
7
+ * User-supplied force-includes (the CLI's --include): matches sync even when
8
+ * gitignored or covered by the default Xcode excludes. Only `.git`,
9
+ * `.DS_Store`, and the basis cache stay excluded. Note: the walk prunes
10
+ * gitignore-excluded directories, so to rescue files under a wholly-ignored
11
+ * parent the predicate must also match the parent directory paths (probed
12
+ * with a trailing slash), e.g. `^ios/` reaches `ios/GeneratedKit/...` but
13
+ * `GeneratedKit/` alone does not.
14
+ */
15
+ include?: IgnoreFn;
16
+ /**
17
+ * "Xcode project sync mode." Enables the default Xcode/dependency excludes
18
+ * (build/, Pods/, xcuserdata/, …) and nested-.gitignore honoring. When
19
+ * unset (e.g. the app-bundle install sync) only the root .gitignore is
20
+ * read, so a build artifact isn't reshaped by gitignore files embedded
21
+ * in it.
22
+ */
23
+ xcodeDefaults?: boolean;
5
24
  basisCacheDir: string;
6
25
  log?: IgnoreLogger;
7
26
  };
27
+ /**
28
+ * Builds the layered sync ignore predicate. First decisive answer wins:
29
+ *
30
+ * 1. `.git`, `.DS_Store`, the basis cache: excluded, never overridable.
31
+ * 2. User include (--include): explicit intent beats the default excludes.
32
+ * 3. Default Xcode/dependency excludes (when xcodeDefaults is set).
33
+ * 4. Built-in force-include: `*.xcconfig` (gitignored xcconfigs are still
34
+ * required to reproduce the build remotely). Gitignored projects are NOT
35
+ * force-included: limbuild regenerates them from project.yml, and
36
+ * exact-version holdouts force-sync theirs with `--include`.
37
+ * 5. `.gitignore` chain: the root file, plus nested ones with git semantics
38
+ * when xcodeDefaults is set (rules bind relative to their containing
39
+ * directory, deeper files override shallower ones). Only a decisive
40
+ * *exclude* short-circuits; a negation re-include defers to layer 6.
41
+ * Directory pruning in the walk means only layers 2 and 4 can reach a
42
+ * file whose parent directory is gitignore-excluded, and only when the
43
+ * predicate matches the pruned parent directory paths too.
44
+ * 6. User ignore (--ignore).
45
+ */
8
46
  export declare function createIgnoreFn(rootDir: string, options: IgnoreFnOptions): Promise<IgnoreFn>;
9
47
  //# sourceMappingURL=folder-sync-ignore.d.mts.map
@@ -1 +1 @@
1
- {"version":3,"file":"folder-sync-ignore.d.mts","sourceRoot":"","sources":["src/folder-sync-ignore.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,QAAQ,GAAG,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;AAEzD,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAE7F,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,YAAY,CAAC;CACpB,CAAC;AAsCF,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,CAyEjG"}
1
+ {"version":3,"file":"folder-sync-ignore.d.mts","sourceRoot":"","sources":["src/folder-sync-ignore.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,QAAQ,GAAG,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;AAEzD,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAE7F,MAAM,MAAM,eAAe,GAAG;IAC5B,+FAA+F;IAC/F,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,YAAY,CAAC;CACpB,CAAC;AAoDF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,CAyIjG"}
@@ -1,9 +1,47 @@
1
1
  export type IgnoreFn = (relativePath: string) => boolean;
2
2
  export type IgnoreLogger = (level: 'debug' | 'info' | 'warn' | 'error', msg: string) => void;
3
3
  export type IgnoreFnOptions = {
4
+ /** User-supplied extra excludes (the CLI's --ignore). Consulted after every built-in layer. */
4
5
  additional?: IgnoreFn;
6
+ /**
7
+ * User-supplied force-includes (the CLI's --include): matches sync even when
8
+ * gitignored or covered by the default Xcode excludes. Only `.git`,
9
+ * `.DS_Store`, and the basis cache stay excluded. Note: the walk prunes
10
+ * gitignore-excluded directories, so to rescue files under a wholly-ignored
11
+ * parent the predicate must also match the parent directory paths (probed
12
+ * with a trailing slash), e.g. `^ios/` reaches `ios/GeneratedKit/...` but
13
+ * `GeneratedKit/` alone does not.
14
+ */
15
+ include?: IgnoreFn;
16
+ /**
17
+ * "Xcode project sync mode." Enables the default Xcode/dependency excludes
18
+ * (build/, Pods/, xcuserdata/, …) and nested-.gitignore honoring. When
19
+ * unset (e.g. the app-bundle install sync) only the root .gitignore is
20
+ * read, so a build artifact isn't reshaped by gitignore files embedded
21
+ * in it.
22
+ */
23
+ xcodeDefaults?: boolean;
5
24
  basisCacheDir: string;
6
25
  log?: IgnoreLogger;
7
26
  };
27
+ /**
28
+ * Builds the layered sync ignore predicate. First decisive answer wins:
29
+ *
30
+ * 1. `.git`, `.DS_Store`, the basis cache: excluded, never overridable.
31
+ * 2. User include (--include): explicit intent beats the default excludes.
32
+ * 3. Default Xcode/dependency excludes (when xcodeDefaults is set).
33
+ * 4. Built-in force-include: `*.xcconfig` (gitignored xcconfigs are still
34
+ * required to reproduce the build remotely). Gitignored projects are NOT
35
+ * force-included: limbuild regenerates them from project.yml, and
36
+ * exact-version holdouts force-sync theirs with `--include`.
37
+ * 5. `.gitignore` chain: the root file, plus nested ones with git semantics
38
+ * when xcodeDefaults is set (rules bind relative to their containing
39
+ * directory, deeper files override shallower ones). Only a decisive
40
+ * *exclude* short-circuits; a negation re-include defers to layer 6.
41
+ * Directory pruning in the walk means only layers 2 and 4 can reach a
42
+ * file whose parent directory is gitignore-excluded, and only when the
43
+ * predicate matches the pruned parent directory paths too.
44
+ * 6. User ignore (--ignore).
45
+ */
8
46
  export declare function createIgnoreFn(rootDir: string, options: IgnoreFnOptions): Promise<IgnoreFn>;
9
47
  //# sourceMappingURL=folder-sync-ignore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"folder-sync-ignore.d.ts","sourceRoot":"","sources":["src/folder-sync-ignore.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,QAAQ,GAAG,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;AAEzD,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAE7F,MAAM,MAAM,eAAe,GAAG;IAC5B,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,YAAY,CAAC;CACpB,CAAC;AAsCF,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,CAyEjG"}
1
+ {"version":3,"file":"folder-sync-ignore.d.ts","sourceRoot":"","sources":["src/folder-sync-ignore.ts"],"names":[],"mappings":"AAQA,MAAM,MAAM,QAAQ,GAAG,CAAC,YAAY,EAAE,MAAM,KAAK,OAAO,CAAC;AAEzD,MAAM,MAAM,YAAY,GAAG,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAE7F,MAAM,MAAM,eAAe,GAAG;IAC5B,+FAA+F;IAC/F,UAAU,CAAC,EAAE,QAAQ,CAAC;IACtB;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,QAAQ,CAAC;IACnB;;;;;;OAMG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;IACtB,GAAG,CAAC,EAAE,YAAY,CAAC;CACpB,CAAC;AAoDF;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO,CAAC,QAAQ,CAAC,CAyIjG"}
@@ -39,22 +39,94 @@ async function getGitTrackedSets(rootDir) {
39
39
  return null;
40
40
  }
41
41
  }
42
+ // Root-anchored (top-level only) default excludes; nested build junk is the
43
+ // project's own nested .gitignore's job. xcuserdata/.dSYM below are any-depth.
44
+ const XCODE_DEFAULT_EXCLUDE_PREFIXES = [
45
+ 'build/',
46
+ '.build/',
47
+ 'DerivedData/',
48
+ 'Index.noindex/',
49
+ 'ModuleCache.noindex/',
50
+ '.index-build/',
51
+ '.swiftpm/',
52
+ 'Pods/',
53
+ 'Carthage/Build/',
54
+ ];
55
+ /**
56
+ * Builds the layered sync ignore predicate. First decisive answer wins:
57
+ *
58
+ * 1. `.git`, `.DS_Store`, the basis cache: excluded, never overridable.
59
+ * 2. User include (--include): explicit intent beats the default excludes.
60
+ * 3. Default Xcode/dependency excludes (when xcodeDefaults is set).
61
+ * 4. Built-in force-include: `*.xcconfig` (gitignored xcconfigs are still
62
+ * required to reproduce the build remotely). Gitignored projects are NOT
63
+ * force-included: limbuild regenerates them from project.yml, and
64
+ * exact-version holdouts force-sync theirs with `--include`.
65
+ * 5. `.gitignore` chain: the root file, plus nested ones with git semantics
66
+ * when xcodeDefaults is set (rules bind relative to their containing
67
+ * directory, deeper files override shallower ones). Only a decisive
68
+ * *exclude* short-circuits; a negation re-include defers to layer 6.
69
+ * Directory pruning in the walk means only layers 2 and 4 can reach a
70
+ * file whose parent directory is gitignore-excluded, and only when the
71
+ * predicate matches the pruned parent directory paths too.
72
+ * 6. User ignore (--ignore).
73
+ */
42
74
  async function createIgnoreFn(rootDir, options) {
43
75
  const rootResolved = path_1.default.resolve(rootDir);
76
+ // Per-directory .gitignore instances, lazily loaded; key is the dir path
77
+ // relative to the root ('' = root), value null when the dir has none.
44
78
  // ignorecase: false matches git's default semantics. The package defaults to true,
45
79
  // which silently drops e.g. `Vendor/` when .gitignore says `vendor/` (Ruby convention).
46
80
  // allowRelativePaths: true so a `../`-style path doesn't throw mid-sync — treat it as
47
81
  // "not ignored" and let it through, since the cost of dropping a needed file is higher
48
82
  // than including an unexpected one.
49
- const ig = (0, ignore_1.default)({ ignorecase: false, allowRelativePaths: true });
50
- const gitignorePath = path_1.default.join(rootResolved, '.gitignore');
51
- try {
52
- const content = await fs_1.default.promises.readFile(gitignorePath, 'utf-8');
53
- ig.add(content);
54
- }
55
- catch {
56
- // No .gitignore file, return empty ignore instance
57
- }
83
+ const dirIgnores = new Map();
84
+ const gitignoreFor = (dirRel) => {
85
+ let ig = dirIgnores.get(dirRel);
86
+ if (ig !== undefined)
87
+ return ig;
88
+ try {
89
+ const content = fs_1.default.readFileSync(path_1.default.join(rootResolved, dirRel.split('/').join(path_1.default.sep), '.gitignore'), 'utf-8');
90
+ ig = (0, ignore_1.default)({ ignorecase: false, allowRelativePaths: true }).add(content);
91
+ }
92
+ catch {
93
+ ig = null;
94
+ }
95
+ dirIgnores.set(dirRel, ig);
96
+ return ig;
97
+ };
98
+ // xcodeDefaults selects "Xcode project sync mode": besides the default junk
99
+ // excludes it also enables nested-.gitignore honoring and the project-file
100
+ // force-includes below. Callers that don't set it (e.g. the app-bundle
101
+ // install sync) keep the legacy behavior: root-only .gitignore and no
102
+ // project force-includes, so a build artifact isn't reshaped by gitignore
103
+ // files or Xcode-specific rules that happen to sit inside it.
104
+ const nestedGitignore = !!options.xcodeDefaults;
105
+ // Evaluates the .gitignore chain for a path (trailing slash preserved so
106
+ // dir-only rules like `build/` match the directory itself). Files are
107
+ // consulted root-to-deepest; the last decisive match wins, so deeper
108
+ // files naturally override shallower ones. When nestedGitignore is off,
109
+ // only the root .gitignore is consulted.
110
+ const gitignoreDecision = (testPath) => {
111
+ const withoutTrailingSlash = testPath.replace(/\/+$/, '');
112
+ const trailingSlash = testPath.endsWith('/') ? '/' : '';
113
+ const parts = withoutTrailingSlash.split('/');
114
+ let decision;
115
+ const depth = nestedGitignore ? parts.length : 1;
116
+ for (let i = 0; i < depth; i++) {
117
+ const ig = gitignoreFor(parts.slice(0, i).join('/'));
118
+ if (!ig)
119
+ continue;
120
+ const result = ig.test(parts.slice(i).join('/') + trailingSlash);
121
+ if (result.ignored || result.unignored) {
122
+ decision = { ignored: result.ignored };
123
+ const rule = result.rule?.pattern;
124
+ if (rule !== undefined)
125
+ decision.rule = rule;
126
+ }
127
+ }
128
+ return decision;
129
+ };
58
130
  const basisCacheRelative = normalizeRelativePath(path_1.default.relative(rootResolved, options.basisCacheDir)).replace(/\/+$/, '');
59
131
  const shouldIgnoreBasisCache = basisCacheRelative &&
60
132
  basisCacheRelative !== '.' &&
@@ -69,6 +141,7 @@ async function createIgnoreFn(rootDir, options) {
69
141
  if (!normalized)
70
142
  return false;
71
143
  const withoutTrailingSlash = normalized.replace(/\/+$/, '');
144
+ // 1. Never overridable.
72
145
  if (withoutTrailingSlash === '.git' ||
73
146
  withoutTrailingSlash.startsWith('.git/') ||
74
147
  withoutTrailingSlash.endsWith('/.git') ||
@@ -82,15 +155,36 @@ async function createIgnoreFn(rootDir, options) {
82
155
  withoutTrailingSlash.startsWith(`${basisCacheRelative}/`))) {
83
156
  return true;
84
157
  }
158
+ // 2. User include.
159
+ if (options.include?.(normalized))
160
+ return false;
161
+ // 3. Default Xcode/dependency excludes.
162
+ if (options.xcodeDefaults) {
163
+ for (const prefix of XCODE_DEFAULT_EXCLUDE_PREFIXES) {
164
+ if (normalized.startsWith(prefix))
165
+ return true;
166
+ }
167
+ if (normalized.includes('/xcuserdata/') || normalized.includes('.dSYM/'))
168
+ return true;
169
+ }
170
+ // 4. Built-in force-include: gitignored xcconfigs are still required to
171
+ // reproduce the build remotely. Gitignored .xcodeproj bundles are NOT
172
+ // force-included: limbuild regenerates them from project.yml, and
173
+ // exact-version holdouts force-sync theirs with --include.
85
174
  if (withoutTrailingSlash.endsWith('.xcconfig'))
86
175
  return false;
87
- if (ig.ignores(normalized)) {
176
+ // 5. The .gitignore chain. Only a decisive *exclude* short-circuits; a
177
+ // negation re-include (decision.ignored === false) still falls through to
178
+ // the user --ignore layer, matching the pre-restructure precedence where
179
+ // gitignore never overrode --ignore for a re-included path.
180
+ const decision = gitignoreDecision(normalized);
181
+ if (decision?.ignored) {
88
182
  if (trackedSets &&
89
183
  (trackedSets.tracked.has(withoutTrailingSlash) || trackedSets.prefixes.has(withoutTrailingSlash))) {
90
- const rule = ig.test(normalized).rule?.pattern ?? '<unknown>';
184
+ const rule = decision.rule ?? '<unknown>';
91
185
  if (!warnedRules.has(rule)) {
92
186
  warnedRules.add(rule);
93
- const msg = `.gitignore rule '${rule}' is dropping '${withoutTrailingSlash}', which is tracked in git. The remote build will not see this path. Remove or scope the rule if you need it synced.`;
187
+ const msg = `.gitignore rule '${rule}' is dropping '${withoutTrailingSlash}', which is tracked in git. The remote build will not see this path. Remove or scope the rule, or pass --include, if you need it synced.`;
94
188
  if (log) {
95
189
  log('warn', msg);
96
190
  }
@@ -101,6 +195,7 @@ async function createIgnoreFn(rootDir, options) {
101
195
  }
102
196
  return true;
103
197
  }
198
+ // 6. User ignore.
104
199
  if (options.additional?.(normalized))
105
200
  return true;
106
201
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"folder-sync-ignore.js","sourceRoot":"","sources":["src/folder-sync-ignore.ts"],"names":[],"mappings":";;AAsDA,wCAyEC;;AA/HD,oDAAoB;AACpB,wDAAwB;AACxB,iDAAyC;AACzC,+BAAiC;AACjC,4DAA+B;AAE/B,MAAM,aAAa,GAAG,IAAA,gBAAS,EAAC,wBAAQ,CAAC,CAAC;AAY1C,SAAS,qBAAqB,CAAC,YAAoB;IACjD,OAAO,YAAY;SAChB,KAAK,CAAC,cAAI,CAAC,GAAG,CAAC;SACf,IAAI,CAAC,GAAG,CAAC;SACT,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC1B,CAAC;AAOD,KAAK,UAAU,iBAAiB,CAAC,OAAe;IAC9C,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE;YAChE,GAAG,EAAE,OAAO;YACZ,SAAS,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;SAC7B,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,IAAI,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAChC,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC;gBACf,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;gBACrC,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAEM,KAAK,UAAU,cAAc,CAAC,OAAe,EAAE,OAAwB;IAC5E,MAAM,YAAY,GAAG,cAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC3C,mFAAmF;IACnF,wFAAwF;IACxF,sFAAsF;IACtF,uFAAuF;IACvF,oCAAoC;IACpC,MAAM,EAAE,GAAG,IAAA,gBAAS,EAAC,EAAE,UAAU,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC;IACtE,MAAM,aAAa,GAAG,cAAI,CAAC,IAAI,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC;IAC5D,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,MAAM,YAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC,CAAC;QACnE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IAClB,CAAC;IAAC,MAAM,CAAC;QACP,mDAAmD;IACrD,CAAC;IACD,MAAM,kBAAkB,GAAG,qBAAqB,CAC9C,cAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,aAAa,CAAC,CACnD,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtB,MAAM,sBAAsB,GAC1B,kBAAkB;QAClB,kBAAkB,KAAK,GAAG;QAC1B,kBAAkB,KAAK,IAAI;QAC3B,CAAC,kBAAkB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAExC,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,wFAAwF;IACxF,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IAEtC,OAAO,CAAC,YAAoB,EAAE,EAAE;QAC9B,MAAM,UAAU,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;QACvD,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAC9B,MAAM,oBAAoB,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAE5D,IACE,oBAAoB,KAAK,MAAM;YAC/B,oBAAoB,CAAC,UAAU,CAAC,OAAO,CAAC;YACxC,oBAAoB,CAAC,QAAQ,CAAC,OAAO,CAAC;YACtC,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACvC,oBAAoB,KAAK,WAAW;YACpC,oBAAoB,CAAC,QAAQ,CAAC,YAAY,CAAC,EAC3C,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IACE,sBAAsB;YACtB,CAAC,oBAAoB,KAAK,kBAAkB;gBAC1C,oBAAoB,CAAC,UAAU,CAAC,GAAG,kBAAkB,GAAG,CAAC,CAAC,EAC5D,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,oBAAoB,CAAC,QAAQ,CAAC,WAAW,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7D,IAAI,EAAE,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3B,IACE,WAAW;gBACX,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,EACjG,CAAC;gBACD,MAAM,IAAI,GAAG,EAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC,IAAI,EAAE,OAAO,IAAI,WAAW,CAAC;gBAC9D,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC3B,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACtB,MAAM,GAAG,GAAG,oBAAoB,IAAI,kBAAkB,oBAAoB,sHAAsH,CAAC;oBACjM,IAAI,GAAG,EAAE,CAAC;wBACR,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;oBACnB,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;oBACpC,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QAClD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"folder-sync-ignore.js","sourceRoot":"","sources":["src/folder-sync-ignore.ts"],"names":[],"mappings":"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"}
@@ -35,22 +35,94 @@ async function getGitTrackedSets(rootDir) {
35
35
  return null;
36
36
  }
37
37
  }
38
+ // Root-anchored (top-level only) default excludes; nested build junk is the
39
+ // project's own nested .gitignore's job. xcuserdata/.dSYM below are any-depth.
40
+ const XCODE_DEFAULT_EXCLUDE_PREFIXES = [
41
+ 'build/',
42
+ '.build/',
43
+ 'DerivedData/',
44
+ 'Index.noindex/',
45
+ 'ModuleCache.noindex/',
46
+ '.index-build/',
47
+ '.swiftpm/',
48
+ 'Pods/',
49
+ 'Carthage/Build/',
50
+ ];
51
+ /**
52
+ * Builds the layered sync ignore predicate. First decisive answer wins:
53
+ *
54
+ * 1. `.git`, `.DS_Store`, the basis cache: excluded, never overridable.
55
+ * 2. User include (--include): explicit intent beats the default excludes.
56
+ * 3. Default Xcode/dependency excludes (when xcodeDefaults is set).
57
+ * 4. Built-in force-include: `*.xcconfig` (gitignored xcconfigs are still
58
+ * required to reproduce the build remotely). Gitignored projects are NOT
59
+ * force-included: limbuild regenerates them from project.yml, and
60
+ * exact-version holdouts force-sync theirs with `--include`.
61
+ * 5. `.gitignore` chain: the root file, plus nested ones with git semantics
62
+ * when xcodeDefaults is set (rules bind relative to their containing
63
+ * directory, deeper files override shallower ones). Only a decisive
64
+ * *exclude* short-circuits; a negation re-include defers to layer 6.
65
+ * Directory pruning in the walk means only layers 2 and 4 can reach a
66
+ * file whose parent directory is gitignore-excluded, and only when the
67
+ * predicate matches the pruned parent directory paths too.
68
+ * 6. User ignore (--ignore).
69
+ */
38
70
  export async function createIgnoreFn(rootDir, options) {
39
71
  const rootResolved = path.resolve(rootDir);
72
+ // Per-directory .gitignore instances, lazily loaded; key is the dir path
73
+ // relative to the root ('' = root), value null when the dir has none.
40
74
  // ignorecase: false matches git's default semantics. The package defaults to true,
41
75
  // which silently drops e.g. `Vendor/` when .gitignore says `vendor/` (Ruby convention).
42
76
  // allowRelativePaths: true so a `../`-style path doesn't throw mid-sync — treat it as
43
77
  // "not ignored" and let it through, since the cost of dropping a needed file is higher
44
78
  // than including an unexpected one.
45
- const ig = ignorePkg({ ignorecase: false, allowRelativePaths: true });
46
- const gitignorePath = path.join(rootResolved, '.gitignore');
47
- try {
48
- const content = await fs.promises.readFile(gitignorePath, 'utf-8');
49
- ig.add(content);
50
- }
51
- catch {
52
- // No .gitignore file, return empty ignore instance
53
- }
79
+ const dirIgnores = new Map();
80
+ const gitignoreFor = (dirRel) => {
81
+ let ig = dirIgnores.get(dirRel);
82
+ if (ig !== undefined)
83
+ return ig;
84
+ try {
85
+ const content = fs.readFileSync(path.join(rootResolved, dirRel.split('/').join(path.sep), '.gitignore'), 'utf-8');
86
+ ig = ignorePkg({ ignorecase: false, allowRelativePaths: true }).add(content);
87
+ }
88
+ catch {
89
+ ig = null;
90
+ }
91
+ dirIgnores.set(dirRel, ig);
92
+ return ig;
93
+ };
94
+ // xcodeDefaults selects "Xcode project sync mode": besides the default junk
95
+ // excludes it also enables nested-.gitignore honoring and the project-file
96
+ // force-includes below. Callers that don't set it (e.g. the app-bundle
97
+ // install sync) keep the legacy behavior: root-only .gitignore and no
98
+ // project force-includes, so a build artifact isn't reshaped by gitignore
99
+ // files or Xcode-specific rules that happen to sit inside it.
100
+ const nestedGitignore = !!options.xcodeDefaults;
101
+ // Evaluates the .gitignore chain for a path (trailing slash preserved so
102
+ // dir-only rules like `build/` match the directory itself). Files are
103
+ // consulted root-to-deepest; the last decisive match wins, so deeper
104
+ // files naturally override shallower ones. When nestedGitignore is off,
105
+ // only the root .gitignore is consulted.
106
+ const gitignoreDecision = (testPath) => {
107
+ const withoutTrailingSlash = testPath.replace(/\/+$/, '');
108
+ const trailingSlash = testPath.endsWith('/') ? '/' : '';
109
+ const parts = withoutTrailingSlash.split('/');
110
+ let decision;
111
+ const depth = nestedGitignore ? parts.length : 1;
112
+ for (let i = 0; i < depth; i++) {
113
+ const ig = gitignoreFor(parts.slice(0, i).join('/'));
114
+ if (!ig)
115
+ continue;
116
+ const result = ig.test(parts.slice(i).join('/') + trailingSlash);
117
+ if (result.ignored || result.unignored) {
118
+ decision = { ignored: result.ignored };
119
+ const rule = result.rule?.pattern;
120
+ if (rule !== undefined)
121
+ decision.rule = rule;
122
+ }
123
+ }
124
+ return decision;
125
+ };
54
126
  const basisCacheRelative = normalizeRelativePath(path.relative(rootResolved, options.basisCacheDir)).replace(/\/+$/, '');
55
127
  const shouldIgnoreBasisCache = basisCacheRelative &&
56
128
  basisCacheRelative !== '.' &&
@@ -65,6 +137,7 @@ export async function createIgnoreFn(rootDir, options) {
65
137
  if (!normalized)
66
138
  return false;
67
139
  const withoutTrailingSlash = normalized.replace(/\/+$/, '');
140
+ // 1. Never overridable.
68
141
  if (withoutTrailingSlash === '.git' ||
69
142
  withoutTrailingSlash.startsWith('.git/') ||
70
143
  withoutTrailingSlash.endsWith('/.git') ||
@@ -78,15 +151,36 @@ export async function createIgnoreFn(rootDir, options) {
78
151
  withoutTrailingSlash.startsWith(`${basisCacheRelative}/`))) {
79
152
  return true;
80
153
  }
154
+ // 2. User include.
155
+ if (options.include?.(normalized))
156
+ return false;
157
+ // 3. Default Xcode/dependency excludes.
158
+ if (options.xcodeDefaults) {
159
+ for (const prefix of XCODE_DEFAULT_EXCLUDE_PREFIXES) {
160
+ if (normalized.startsWith(prefix))
161
+ return true;
162
+ }
163
+ if (normalized.includes('/xcuserdata/') || normalized.includes('.dSYM/'))
164
+ return true;
165
+ }
166
+ // 4. Built-in force-include: gitignored xcconfigs are still required to
167
+ // reproduce the build remotely. Gitignored .xcodeproj bundles are NOT
168
+ // force-included: limbuild regenerates them from project.yml, and
169
+ // exact-version holdouts force-sync theirs with --include.
81
170
  if (withoutTrailingSlash.endsWith('.xcconfig'))
82
171
  return false;
83
- if (ig.ignores(normalized)) {
172
+ // 5. The .gitignore chain. Only a decisive *exclude* short-circuits; a
173
+ // negation re-include (decision.ignored === false) still falls through to
174
+ // the user --ignore layer, matching the pre-restructure precedence where
175
+ // gitignore never overrode --ignore for a re-included path.
176
+ const decision = gitignoreDecision(normalized);
177
+ if (decision?.ignored) {
84
178
  if (trackedSets &&
85
179
  (trackedSets.tracked.has(withoutTrailingSlash) || trackedSets.prefixes.has(withoutTrailingSlash))) {
86
- const rule = ig.test(normalized).rule?.pattern ?? '<unknown>';
180
+ const rule = decision.rule ?? '<unknown>';
87
181
  if (!warnedRules.has(rule)) {
88
182
  warnedRules.add(rule);
89
- const msg = `.gitignore rule '${rule}' is dropping '${withoutTrailingSlash}', which is tracked in git. The remote build will not see this path. Remove or scope the rule if you need it synced.`;
183
+ const msg = `.gitignore rule '${rule}' is dropping '${withoutTrailingSlash}', which is tracked in git. The remote build will not see this path. Remove or scope the rule, or pass --include, if you need it synced.`;
90
184
  if (log) {
91
185
  log('warn', msg);
92
186
  }
@@ -97,6 +191,7 @@ export async function createIgnoreFn(rootDir, options) {
97
191
  }
98
192
  return true;
99
193
  }
194
+ // 6. User ignore.
100
195
  if (options.additional?.(normalized))
101
196
  return true;
102
197
  return false;
@@ -1 +1 @@
1
- {"version":3,"file":"folder-sync-ignore.mjs","sourceRoot":"","sources":["src/folder-sync-ignore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"folder-sync-ignore.mjs","sourceRoot":"","sources":["src/folder-sync-ignore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,SAA0B,MAAM,QAAQ,CAAC;AAEhD,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AA+B1C,SAAS,qBAAqB,CAAC,YAAoB;IACjD,OAAO,YAAY;SAChB,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC;SACf,IAAI,CAAC,GAAG,CAAC;SACT,OAAO,CAAC,QAAQ,EAAE,EAAE,CAAC;SACrB,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;AAC1B,CAAC;AAOD,KAAK,UAAU,iBAAiB,CAAC,OAAe;IAC9C,IAAI,CAAC;QACH,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,IAAI,CAAC,EAAE;YAChE,GAAG,EAAE,OAAO;YACZ,SAAS,EAAE,GAAG,GAAG,IAAI,GAAG,IAAI;SAC7B,CAAC,CAAC;QACH,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAU,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACtC,IAAI,CAAC,IAAI;gBAAE,SAAS;YACpB,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YAClB,IAAI,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC;YAChC,OAAO,GAAG,GAAG,CAAC,EAAE,CAAC;gBACf,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;gBACrC,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,GAAG,CAAC,CAAC,CAAC;YACvC,CAAC;QACH,CAAC;QACD,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,4EAA4E;AAC5E,+EAA+E;AAC/E,MAAM,8BAA8B,GAAG;IACrC,QAAQ;IACR,SAAS;IACT,cAAc;IACd,gBAAgB;IAChB,sBAAsB;IACtB,eAAe;IACf,WAAW;IACX,OAAO;IACP,iBAAiB;CAClB,CAAC;AAEF;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAe,EAAE,OAAwB;IAC5E,MAAM,YAAY,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAE3C,yEAAyE;IACzE,sEAAsE;IACtE,mFAAmF;IACnF,wFAAwF;IACxF,sFAAsF;IACtF,uFAAuF;IACvF,oCAAoC;IACpC,MAAM,UAAU,GAAG,IAAI,GAAG,EAAyB,CAAC;IACpD,MAAM,YAAY,GAAG,CAAC,MAAc,EAAiB,EAAE;QACrD,IAAI,EAAE,GAAG,UAAU,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QAChC,IAAI,EAAE,KAAK,SAAS;YAAE,OAAO,EAAE,CAAC;QAChC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAC7B,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,YAAY,CAAC,EACvE,OAAO,CACR,CAAC;YACF,EAAE,GAAG,SAAS,CAAC,EAAE,UAAU,EAAE,KAAK,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC/E,CAAC;QAAC,MAAM,CAAC;YACP,EAAE,GAAG,IAAI,CAAC;QACZ,CAAC;QACD,UAAU,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC3B,OAAO,EAAE,CAAC;IACZ,CAAC,CAAC;IAEF,4EAA4E;IAC5E,2EAA2E;IAC3E,uEAAuE;IACvE,sEAAsE;IACtE,0EAA0E;IAC1E,8DAA8D;IAC9D,MAAM,eAAe,GAAG,CAAC,CAAC,OAAO,CAAC,aAAa,CAAC;IAEhD,yEAAyE;IACzE,sEAAsE;IACtE,qEAAqE;IACrE,wEAAwE;IACxE,yCAAyC;IACzC,MAAM,iBAAiB,GAAG,CAAC,QAAgB,EAAmD,EAAE;QAC9F,MAAM,oBAAoB,GAAG,QAAQ,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAC1D,MAAM,aAAa,GAAG,QAAQ,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACxD,MAAM,KAAK,GAAG,oBAAoB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,QAAyD,CAAC;QAC9D,MAAM,KAAK,GAAG,eAAe,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC;QACjD,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC;YAC/B,MAAM,EAAE,GAAG,YAAY,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACrD,IAAI,CAAC,EAAE;gBAAE,SAAS;YAClB,MAAM,MAAM,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,aAAa,CAAC,CAAC;YACjE,IAAI,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;gBACvC,QAAQ,GAAG,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,CAAC;gBACvC,MAAM,IAAI,GAAI,MAA0C,CAAC,IAAI,EAAE,OAAO,CAAC;gBACvE,IAAI,IAAI,KAAK,SAAS;oBAAE,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC;YAC/C,CAAC;QACH,CAAC;QACD,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,qBAAqB,CAC9C,IAAI,CAAC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC,aAAa,CAAC,CACnD,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACtB,MAAM,sBAAsB,GAC1B,kBAAkB;QAClB,kBAAkB,KAAK,GAAG;QAC1B,kBAAkB,KAAK,IAAI;QAC3B,CAAC,kBAAkB,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;IAExC,MAAM,WAAW,GAAG,MAAM,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAC1D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IACxB,wFAAwF;IACxF,MAAM,WAAW,GAAG,IAAI,GAAG,EAAU,CAAC;IAEtC,OAAO,CAAC,YAAoB,EAAE,EAAE;QAC9B,MAAM,UAAU,GAAG,qBAAqB,CAAC,YAAY,CAAC,CAAC;QACvD,IAAI,CAAC,UAAU;YAAE,OAAO,KAAK,CAAC;QAC9B,MAAM,oBAAoB,GAAG,UAAU,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;QAE5D,wBAAwB;QACxB,IACE,oBAAoB,KAAK,MAAM;YAC/B,oBAAoB,CAAC,UAAU,CAAC,OAAO,CAAC;YACxC,oBAAoB,CAAC,QAAQ,CAAC,OAAO,CAAC;YACtC,oBAAoB,CAAC,QAAQ,CAAC,QAAQ,CAAC;YACvC,oBAAoB,KAAK,WAAW;YACpC,oBAAoB,CAAC,QAAQ,CAAC,YAAY,CAAC,EAC3C,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,IACE,sBAAsB;YACtB,CAAC,oBAAoB,KAAK,kBAAkB;gBAC1C,oBAAoB,CAAC,UAAU,CAAC,GAAG,kBAAkB,GAAG,CAAC,CAAC,EAC5D,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,mBAAmB;QACnB,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC;YAAE,OAAO,KAAK,CAAC;QAChD,wCAAwC;QACxC,IAAI,OAAO,CAAC,aAAa,EAAE,CAAC;YAC1B,KAAK,MAAM,MAAM,IAAI,8BAA8B,EAAE,CAAC;gBACpD,IAAI,UAAU,CAAC,UAAU,CAAC,MAAM,CAAC;oBAAE,OAAO,IAAI,CAAC;YACjD,CAAC;YACD,IAAI,UAAU,CAAC,QAAQ,CAAC,cAAc,CAAC,IAAI,UAAU,CAAC,QAAQ,CAAC,QAAQ,CAAC;gBAAE,OAAO,IAAI,CAAC;QACxF,CAAC;QACD,wEAAwE;QACxE,sEAAsE;QACtE,kEAAkE;QAClE,2DAA2D;QAC3D,IAAI,oBAAoB,CAAC,QAAQ,CAAC,WAAW,CAAC;YAAE,OAAO,KAAK,CAAC;QAC7D,uEAAuE;QACvE,0EAA0E;QAC1E,yEAAyE;QACzE,4DAA4D;QAC5D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,UAAU,CAAC,CAAC;QAC/C,IAAI,QAAQ,EAAE,OAAO,EAAE,CAAC;YACtB,IACE,WAAW;gBACX,CAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,IAAI,WAAW,CAAC,QAAQ,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC,EACjG,CAAC;gBACD,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,IAAI,WAAW,CAAC;gBAC1C,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;oBAC3B,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;oBACtB,MAAM,GAAG,GAAG,oBAAoB,IAAI,kBAAkB,oBAAoB,0IAA0I,CAAC;oBACrN,IAAI,GAAG,EAAE,CAAC;wBACR,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;oBACnB,CAAC;yBAAM,CAAC;wBACN,OAAO,CAAC,IAAI,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;oBACpC,CAAC;gBACH,CAAC;YACH,CAAC;YACD,OAAO,IAAI,CAAC;QACd,CAAC;QACD,kBAAkB;QAClB,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC;YAAE,OAAO,IAAI,CAAC;QAClD,OAAO,KAAK,CAAC;IACf,CAAC,CAAC;AACJ,CAAC"}
package/folder-sync.d.mts CHANGED
@@ -32,6 +32,12 @@ export type FolderSyncOptions = {
32
32
  * ignoreFn: (path) => !(path.startsWith('src/') || path.endsWith('.json'))
33
33
  */
34
34
  ignoreFn: IgnoreFn;
35
+ /**
36
+ * Sync symlinks as symlinks (relative, in-root targets only). Off by
37
+ * default: only the limbuild workspace sync understands link entries;
38
+ * the limulator app-install sync keeps the historical skip behavior.
39
+ */
40
+ syncSymlinks?: boolean;
35
41
  /**
36
42
  * Extra files to sync into limbuild. These are included
37
43
  * in every sync pass but are not watched directly.
@@ -1 +1 @@
1
- {"version":3,"file":"folder-sync.d.mts","sourceRoot":"","sources":["src/folder-sync.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,QAAQ,EAAE,iCAA6B;AAWrD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;OAMG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,qBAAqB,GAAG,mBAAmB,CAAC;IACxD,uFAAuF;IACvF,KAAK,EAAE,OAAO,CAAC;IACf,iCAAiC;IACjC,GAAG,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACvE;;;;;;;;;;;;;OAaG;IACH,QAAQ,EAAE,QAAQ,CAAC;IACnB;;;OAGG;IACH,eAAe,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAC5C,4GAA4G;IAC5G,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAkUhF;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CA2CjB;AAYD,wBAAsB,UAAU,CAC9B,eAAe,EAAE,MAAM,EACvB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,gBAAgB,CAAC,CA6F3B"}
1
+ {"version":3,"file":"folder-sync.d.mts","sourceRoot":"","sources":["src/folder-sync.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,QAAQ,EAAE,iCAA6B;AAWrD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;OAMG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,qBAAqB,GAAG,mBAAmB,CAAC;IACxD,uFAAuF;IACvF,KAAK,EAAE,OAAO,CAAC;IACf,iCAAiC;IACjC,GAAG,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACvE;;;;;;;;;;;;;OAaG;IACH,QAAQ,EAAE,QAAQ,CAAC;IACnB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,eAAe,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAC5C,4GAA4G;IAC5G,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAwYhF;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CA2CjB;AAmDD,wBAAsB,UAAU,CAC9B,eAAe,EAAE,MAAM,EACvB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,gBAAgB,CAAC,CA6F3B"}
package/folder-sync.d.ts CHANGED
@@ -32,6 +32,12 @@ export type FolderSyncOptions = {
32
32
  * ignoreFn: (path) => !(path.startsWith('src/') || path.endsWith('.json'))
33
33
  */
34
34
  ignoreFn: IgnoreFn;
35
+ /**
36
+ * Sync symlinks as symlinks (relative, in-root targets only). Off by
37
+ * default: only the limbuild workspace sync understands link entries;
38
+ * the limulator app-install sync keeps the historical skip behavior.
39
+ */
40
+ syncSymlinks?: boolean;
35
41
  /**
36
42
  * Extra files to sync into limbuild. These are included
37
43
  * in every sync pass but are not watched directly.
@@ -1 +1 @@
1
- {"version":3,"file":"folder-sync.d.ts","sourceRoot":"","sources":["src/folder-sync.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,QAAQ,EAAE,gCAA6B;AAWrD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;OAMG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,qBAAqB,GAAG,mBAAmB,CAAC;IACxD,uFAAuF;IACvF,KAAK,EAAE,OAAO,CAAC;IACf,iCAAiC;IACjC,GAAG,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACvE;;;;;;;;;;;;;OAaG;IACH,QAAQ,EAAE,QAAQ,CAAC;IACnB;;;OAGG;IACH,eAAe,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAC5C,4GAA4G;IAC5G,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAkUhF;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CA2CjB;AAYD,wBAAsB,UAAU,CAC9B,eAAe,EAAE,MAAM,EACvB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,gBAAgB,CAAC,CA6F3B"}
1
+ {"version":3,"file":"folder-sync.d.ts","sourceRoot":"","sources":["src/folder-sync.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,QAAQ,EAAE,gCAA6B;AAWrD,MAAM,MAAM,iBAAiB,GAAG;IAC9B,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb;;;;;;OAMG;IACH,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,qBAAqB,GAAG,mBAAmB,CAAC;IACxD,uFAAuF;IACvF,KAAK,EAAE,OAAO,CAAC;IACf,iCAAiC;IACjC,GAAG,EAAE,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;IACvE;;;;;;;;;;;;;OAaG;IACH,QAAQ,EAAE,QAAQ,CAAC;IACnB;;;;OAIG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB;;;OAGG;IACH,eAAe,CAAC,EAAE,uBAAuB,EAAE,CAAC;IAC5C,4GAA4G;IAC5G,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,UAAU,CAAC;CAC5C,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG;IAC7B,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,2DAA2D;IAC3D,YAAY,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,uBAAuB,GAAG;IAAE,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC;AAwYhF;;;;;;;GAOG;AACH,wBAAsB,kBAAkB,CACtC,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,MAAM,CAAC,CA2CjB;AAmDD,wBAAsB,UAAU,CAC9B,eAAe,EAAE,MAAM,EACvB,IAAI,EAAE,iBAAiB,GACtB,OAAO,CAAC,gBAAgB,CAAC,CA6F3B"}