@xcodekit/xcode-node 0.6.8 → 0.6.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (4) hide show
  1. package/README.md +302 -0
  2. package/index.d.ts +2 -0
  3. package/index.js +18 -18
  4. package/package.json +6 -6
package/README.md ADDED
@@ -0,0 +1,302 @@
1
+ # @xcodekit/xcode
2
+
3
+ Super fast Xcode `.pbxproj` parser and serializer written in Rust.
4
+
5
+ Drop-in replacement for the low-level API of [`@bacons/xcode`](https://github.com/EvanBacon/xcode) — same `parse()` and `build()` interface, **3-15x faster parsing**, byte-identical output.
6
+
7
+ ## Install
8
+
9
+ ```bash
10
+ # Recommended — auto-selects native or WASM
11
+ npm install @xcodekit/xcode
12
+
13
+ # Native only (Node.js, fastest)
14
+ npm install @xcodekit/xcode-node
15
+
16
+ # WASM only (universal — Bun, CF Workers, any bundler)
17
+ npm install @xcodekit/xcode-wasm
18
+ ```
19
+
20
+ `@xcodekit/xcode` is a thin auto-selector — in Node.js/Bun it tries the native addon first, everywhere else it uses WASM. You get optimal performance without choosing.
21
+
22
+ ## Quick Start
23
+
24
+ ```js
25
+ import { parse, build } from "@xcodekit/xcode";
26
+ import { readFileSync, writeFileSync } from "fs";
27
+
28
+ // Parse a .pbxproj file
29
+ const text = readFileSync("project.pbxproj", "utf8");
30
+ const project = parse(text);
31
+
32
+ // Modify it
33
+ project.objects["YOUR_UUID"] = {
34
+ isa: "PBXFileReference",
35
+ path: "NewFile.swift",
36
+ sourceTree: "<group>",
37
+ };
38
+
39
+ // Write it back
40
+ const output = build(project);
41
+ writeFileSync("project.pbxproj", output);
42
+ ```
43
+
44
+ ## API
45
+
46
+ ### Low-Level (JSON)
47
+
48
+ #### `parse(text: string): object`
49
+
50
+ Parse a `.pbxproj` string into a JSON-compatible object. Matches the output of `@bacons/xcode/json`'s `parse()`.
51
+
52
+ ```js
53
+ const project = parse(readFileSync("project.pbxproj", "utf8"));
54
+ ```
55
+
56
+ #### `build(project: object): string`
57
+
58
+ Serialize a JSON object back to `.pbxproj` format. Produces byte-identical output to `@bacons/xcode/json`'s `build()`.
59
+
60
+ ```js
61
+ writeFileSync("project.pbxproj", build(project));
62
+ ```
63
+
64
+ #### `parseAndBuild(text: string): string`
65
+
66
+ Parse and immediately re-serialize. Stays entirely in Rust/WASM with zero JS marshalling — the fastest possible round-trip path.
67
+
68
+ ```js
69
+ const output = parseAndBuild(readFileSync("project.pbxproj", "utf8"));
70
+ ```
71
+
72
+ ### High-Level (XcodeProject)
73
+
74
+ #### `XcodeProject.open(filePath)` / `XcodeProject.fromString(content)`
75
+
76
+ Open from disk or parse from a string.
77
+
78
+ ```js
79
+ import { XcodeProject } from "@xcodekit/xcode";
80
+
81
+ // From disk
82
+ const project = XcodeProject.open("ios/MyApp.xcodeproj/project.pbxproj");
83
+
84
+ // From string (no file on disk needed)
85
+ const project = XcodeProject.fromString(pbxprojContent);
86
+
87
+ // Properties
88
+ project.archiveVersion; // 1
89
+ project.objectVersion; // 46
90
+ project.filePath; // path if opened from disk, null if fromString
91
+ project.mainGroupUuid; // root group UUID
92
+
93
+ // Targets
94
+ const targets = project.getNativeTargets(); // UUID[]
95
+ const mainApp = project.findMainAppTarget("ios"); // UUID | null
96
+ project.getTargetName(mainApp); // "MyApp"
97
+ project.setTargetName(mainApp, "NewName");
98
+ project.renameTarget(mainApp, "OldName", "NewName"); // cascades to groups, product refs, proxies
99
+
100
+ // Build settings
101
+ project.getBuildSetting(targetUuid, "PRODUCT_BUNDLE_IDENTIFIER");
102
+ project.setBuildSetting(targetUuid, "SWIFT_VERSION", "5.0");
103
+ project.removeBuildSetting(targetUuid, "CODE_SIGN_IDENTITY");
104
+
105
+ // Files & groups
106
+ const fileUuid = project.addFile(project.mainGroupUuid, "Sources/App.swift");
107
+ const groupUuid = project.addGroup(project.mainGroupUuid, "Features");
108
+ const children = project.getGroupChildren(groupUuid);
109
+
110
+ // Build phases
111
+ const phase = project.ensureBuildPhase(targetUuid, "PBXSourcesBuildPhase");
112
+ project.addBuildFile(phase, fileUuid);
113
+
114
+ // Frameworks
115
+ project.addFramework(targetUuid, "SwiftUI");
116
+
117
+ // Create targets
118
+ const widgetTarget = project.createNativeTarget(
119
+ "MyWidget",
120
+ "com.apple.product-type.app-extension",
121
+ "com.example.mywidget",
122
+ );
123
+
124
+ // Embed extension into host app
125
+ project.addDependency(mainApp, widgetTarget);
126
+ project.embedExtension(mainApp, widgetTarget);
127
+
128
+ // Xcode 16+ file system sync groups
129
+ project.addFileSystemSyncGroup(widgetTarget, "MyWidget");
130
+
131
+ // Generic object access
132
+ project.getObjectProperty(uuid, "path");
133
+ project.setObjectProperty(uuid, "path", "new/path");
134
+ const proxies = project.findObjectsByIsa("PBXContainerItemProxy");
135
+
136
+ // Validation
137
+ const orphans = project.findOrphanedReferences();
138
+ // [{ referrerUuid, referrerIsa, property, orphanUuid }]
139
+
140
+ // Serialize
141
+ const pbxproj = project.toBuild(); // string
142
+ const json = project.toJSON(); // object
143
+
144
+ // Write back to disk
145
+ project.save();
146
+
147
+ // Deterministic UUID generation
148
+ const uuid = project.getUniqueId("my-seed-string"); // 24-char hex
149
+ ```
150
+
151
+ All `XcodeProject` methods operate in Rust/WASM — only primitive strings cross the boundary. This is the fastest path for project manipulation.
152
+
153
+ ## Packages
154
+
155
+ | Package | What | Size | Runtime |
156
+ | ---------------------- | ------------------------------------------------ | ------- | ---------------------------------- |
157
+ | `@xcodekit/xcode` | Auto-selector (tries native, falls back to WASM) | ~4 KB | Node.js, Bun, CF Workers, browsers |
158
+ | `@xcodekit/xcode-node` | Native napi-rs addon | ~600 KB | Node.js only |
159
+ | `@xcodekit/xcode-wasm` | WASM with inlined base64 | ~370 KB | Everywhere |
160
+
161
+ `@xcodekit/xcode` uses [exports conditions](https://nodejs.org/api/packages.html#conditional-exports): the `node` condition loads native, `default` loads WASM. No try/catch at runtime for most environments.
162
+
163
+ ### When to use which
164
+
165
+ | Environment | Recommended |
166
+ | ------------------------- | ---------------------------------------------------- |
167
+ | Node.js / Bun | `@xcodekit/xcode` (auto-selects native) |
168
+ | Cloudflare Workers / edge | `@xcodekit/xcode` or `@xcodekit/xcode-wasm` |
169
+ | Bundled app (single file) | `@xcodekit/xcode-wasm` (inlined, no file resolution) |
170
+ | Need max performance | `@xcodekit/xcode-node` (direct, no facade overhead) |
171
+
172
+ ## Performance
173
+
174
+ Benchmarked on Apple M4 Pro, Node.js v24. Median of 200 iterations.
175
+
176
+ - **xcode-wasm** — `@xcodekit/xcode-wasm`
177
+ - **xcode-node** — `@xcodekit/xcode-node`
178
+ - **@bacons/xcode** — `@bacons/xcode/json`
179
+
180
+ ### Parse
181
+
182
+ | Fixture | xcode-wasm | xcode-node | @bacons/xcode | wasm speedup | node speedup |
183
+ | -------------------------- | ---------- | ---------- | ------------- | ------------ | ------------ |
184
+ | swift-protobuf (257 KB) | 2.9 ms | 3.7 ms | 43.9 ms | **15.2x** | **11.8x** |
185
+ | Cocoa-Application (166 KB) | 2.4 ms | 3.2 ms | 17.2 ms | **7.3x** | **5.4x** |
186
+ | AFNetworking (99 KB) | 1.3 ms | 1.7 ms | 6.6 ms | **5.1x** | **3.9x** |
187
+ | watch (48 KB) | 0.7 ms | 0.9 ms | 2.1 ms | **3.0x** | **2.3x** |
188
+ | project (19 KB) | 0.3 ms | 0.4 ms | 0.8 ms | **2.9x** | **2.2x** |
189
+
190
+ ### Build
191
+
192
+ | Fixture | xcode-wasm | xcode-node | @bacons/xcode | wasm speedup | node speedup |
193
+ | -------------------------- | ---------- | ---------- | ------------- | ------------ | ------------ |
194
+ | swift-protobuf (257 KB) | 4.1 ms | 5.2 ms | 12.0 ms | **2.9x** | **2.3x** |
195
+ | Cocoa-Application (166 KB) | 3.3 ms | 4.5 ms | 2.7 ms | 1.2x slower | 1.7x slower |
196
+ | AFNetworking (99 KB) | 1.6 ms | 2.3 ms | 1.8 ms | **1.1x** | 1.3x slower |
197
+ | watch (48 KB) | 0.8 ms | 1.1 ms | 0.4 ms | 1.9x slower | 2.7x slower |
198
+ | project (19 KB) | 0.3 ms | 0.4 ms | 0.2 ms | 1.9x slower | 2.7x slower |
199
+
200
+ > [!NOTE]
201
+ > TypeScript wins `build()` on smaller files because it operates directly on native JS objects with zero serialization cost. On large files (>100 KB) where actual serialization work dominates, Rust wins.
202
+
203
+ ### Round-Trip (parse + build)
204
+
205
+ | Fixture | xcode-wasm | xcode-node | @bacons/xcode | wasm speedup | node speedup |
206
+ | -------------------------- | ---------- | ---------- | ------------- | ------------ | ------------ |
207
+ | swift-protobuf (257 KB) | 7.0 ms | 9.0 ms | 55.9 ms | **8.0x** | **6.2x** |
208
+ | Cocoa-Application (166 KB) | 5.7 ms | 7.7 ms | 19.9 ms | **3.5x** | **2.6x** |
209
+ | AFNetworking (99 KB) | 2.9 ms | 4.0 ms | 8.4 ms | **2.9x** | **2.1x** |
210
+ | watch (48 KB) | 1.5 ms | 2.0 ms | 2.5 ms | **1.7x** | **1.3x** |
211
+ | project (19 KB) | 0.6 ms | 0.8 ms | 1.0 ms | **1.7x** | **1.3x** |
212
+
213
+ ### Round-Trip (parseAndBuild — zero marshalling)
214
+
215
+ | Fixture | xcode-wasm | xcode-node | @bacons/xcode | wasm speedup | node speedup |
216
+ | -------------------------- | ---------- | ---------- | ------------- | ------------ | ------------ |
217
+ | swift-protobuf (257 KB) | 4.8 ms | 4.4 ms | 62.7 ms | **13.1x** | **14.2x** |
218
+ | Cocoa-Application (166 KB) | 3.7 ms | 3.7 ms | 22.4 ms | **6.0x** | **6.1x** |
219
+ | AFNetworking (99 KB) | 1.9 ms | 1.8 ms | 9.2 ms | **4.7x** | **5.1x** |
220
+ | watch (48 KB) | 0.9 ms | 0.9 ms | 2.8 ms | **3.0x** | **3.1x** |
221
+ | project (19 KB) | 0.4 ms | 0.3 ms | 1.0 ms | **2.8x** | **2.9x** |
222
+
223
+ ### Package Size
224
+
225
+ | | xcode-wasm | xcode-node | @bacons/xcode |
226
+ | ------------ | ---------- | ---------- | ------------- |
227
+ | Uncompressed | ~370 KB | 559 KB | 1.1 MB |
228
+ | Gzipped | ~96 KB | 270 KB | ~400 KB |
229
+
230
+ ## Compatibility
231
+
232
+ - Full feature parity with `@bacons/xcode/json` (parse/build)
233
+ - 13/13 round-trip fixtures produce **byte-identical** output
234
+ - All escape sequences: standard (`\n`, `\t`, etc.), Unicode (`\Uxxxx`), octal, NeXTSTEP (128 entries)
235
+ - Xcode 16+ file system synchronized groups
236
+ - Swift Package Manager references
237
+
238
+ ## Supported Platforms
239
+
240
+ ### Native (`@xcodekit/xcode-node`)
241
+
242
+ | Platform | Architecture |
243
+ | -------- | ---------------------------------- |
244
+ | macOS | arm64 (Apple Silicon), x64 (Intel) |
245
+ | Linux | x64 (glibc), arm64 (glibc) |
246
+ | Windows | x64 (MSVC) |
247
+
248
+ ### WASM (`@xcodekit/xcode-wasm`)
249
+
250
+ Any environment that supports WebAssembly — Node.js, Bun, Deno, Cloudflare Workers, browsers, etc. WASM binary is inlined as base64 — no file resolution needed, works in single-file bundles.
251
+
252
+ ## Development
253
+
254
+ ```bash
255
+ # Prerequisites: Rust toolchain, Node.js >= 18, wasm-pack, binaryen
256
+
257
+ npm install
258
+
259
+ # Tests
260
+ make test # all (Rust + native JS + WASM JS)
261
+ make test-rust # Rust unit + integration tests
262
+ make test-js # native napi tests (vitest)
263
+ make test-wasm # WASM tests (vitest)
264
+
265
+ # Build
266
+ make build # native napi release
267
+ make build-debug # native napi debug (faster compilation)
268
+ make build-wasm # WASM → pkg/xcode-wasm/
269
+ make build-node # native → pkg/xcode-node/
270
+ make build-all # all packages
271
+
272
+ # Other
273
+ make check # type-check all targets
274
+ make fmt # cargo fmt + prettier
275
+ make lint # cargo clippy
276
+ make bench # all benchmarks
277
+ make clean # remove all artifacts
278
+ ```
279
+
280
+ ### Project Structure
281
+
282
+ ```
283
+ src/ # Rust source (parser, writer, project API)
284
+ tests/
285
+ integration_tests.rs # Rust integration tests
286
+ node.test.mjs # Native napi JS tests (vitest)
287
+ wasm.test.mjs # WASM JS tests (vitest)
288
+ fixtures/ # 20 real-world .pbxproj files
289
+ npm/ # Publishable package metadata
290
+ xcode/ # @xcodekit/xcode (auto-selector facade)
291
+ xcode-node/ # @xcodekit/xcode-node (native napi)
292
+ platforms/ # Platform binary packages (darwin-arm64, etc.)
293
+ xcode-wasm/ # @xcodekit/xcode-wasm (WASM wrapper + types)
294
+ scripts/ # Build scripts
295
+ build-node-pkg.sh # Assembles pkg/xcode-node/
296
+ build-wasm-pkg.sh # Assembles pkg/xcode-wasm/ (wasm-opt, base64 inline)
297
+ pkg/ # Generated build output (gitignored)
298
+ ```
299
+
300
+ ## License
301
+
302
+ MIT
package/index.d.ts CHANGED
@@ -103,6 +103,8 @@ export declare class XcodeProject {
103
103
  * Returns the UUID of the sync group.
104
104
  */
105
105
  addFileSystemSyncGroup(targetUuid: string, path: string): string | null
106
+ /** Get the on-disk paths of a target's file system sync groups. */
107
+ getTargetSyncGroupPaths(targetUuid: string): Array<string>
106
108
  /** Get a string property from any object. */
107
109
  getObjectProperty(uuid: string, key: string): string | null
108
110
  /** Set a string property on any object. */
package/index.js CHANGED
@@ -37,7 +37,7 @@ switch (platform) {
37
37
  if (localFileExisted) {
38
38
  nativeBinding = require('./xcode.android-arm64.node')
39
39
  } else {
40
- nativeBinding = require('undefined-android-arm64')
40
+ nativeBinding = require('@xcodekit/xcode-android-arm64')
41
41
  }
42
42
  } catch (e) {
43
43
  loadError = e
@@ -49,7 +49,7 @@ switch (platform) {
49
49
  if (localFileExisted) {
50
50
  nativeBinding = require('./xcode.android-arm-eabi.node')
51
51
  } else {
52
- nativeBinding = require('undefined-android-arm-eabi')
52
+ nativeBinding = require('@xcodekit/xcode-android-arm-eabi')
53
53
  }
54
54
  } catch (e) {
55
55
  loadError = e
@@ -69,7 +69,7 @@ switch (platform) {
69
69
  if (localFileExisted) {
70
70
  nativeBinding = require('./xcode.win32-x64-msvc.node')
71
71
  } else {
72
- nativeBinding = require('undefined-win32-x64-msvc')
72
+ nativeBinding = require('@xcodekit/xcode-win32-x64-msvc')
73
73
  }
74
74
  } catch (e) {
75
75
  loadError = e
@@ -83,7 +83,7 @@ switch (platform) {
83
83
  if (localFileExisted) {
84
84
  nativeBinding = require('./xcode.win32-ia32-msvc.node')
85
85
  } else {
86
- nativeBinding = require('undefined-win32-ia32-msvc')
86
+ nativeBinding = require('@xcodekit/xcode-win32-ia32-msvc')
87
87
  }
88
88
  } catch (e) {
89
89
  loadError = e
@@ -97,7 +97,7 @@ switch (platform) {
97
97
  if (localFileExisted) {
98
98
  nativeBinding = require('./xcode.win32-arm64-msvc.node')
99
99
  } else {
100
- nativeBinding = require('undefined-win32-arm64-msvc')
100
+ nativeBinding = require('@xcodekit/xcode-win32-arm64-msvc')
101
101
  }
102
102
  } catch (e) {
103
103
  loadError = e
@@ -113,7 +113,7 @@ switch (platform) {
113
113
  if (localFileExisted) {
114
114
  nativeBinding = require('./xcode.darwin-universal.node')
115
115
  } else {
116
- nativeBinding = require('undefined-darwin-universal')
116
+ nativeBinding = require('@xcodekit/xcode-darwin-universal')
117
117
  }
118
118
  break
119
119
  } catch {}
@@ -124,7 +124,7 @@ switch (platform) {
124
124
  if (localFileExisted) {
125
125
  nativeBinding = require('./xcode.darwin-x64.node')
126
126
  } else {
127
- nativeBinding = require('undefined-darwin-x64')
127
+ nativeBinding = require('@xcodekit/xcode-darwin-x64')
128
128
  }
129
129
  } catch (e) {
130
130
  loadError = e
@@ -138,7 +138,7 @@ switch (platform) {
138
138
  if (localFileExisted) {
139
139
  nativeBinding = require('./xcode.darwin-arm64.node')
140
140
  } else {
141
- nativeBinding = require('undefined-darwin-arm64')
141
+ nativeBinding = require('@xcodekit/xcode-darwin-arm64')
142
142
  }
143
143
  } catch (e) {
144
144
  loadError = e
@@ -157,7 +157,7 @@ switch (platform) {
157
157
  if (localFileExisted) {
158
158
  nativeBinding = require('./xcode.freebsd-x64.node')
159
159
  } else {
160
- nativeBinding = require('undefined-freebsd-x64')
160
+ nativeBinding = require('@xcodekit/xcode-freebsd-x64')
161
161
  }
162
162
  } catch (e) {
163
163
  loadError = e
@@ -174,7 +174,7 @@ switch (platform) {
174
174
  if (localFileExisted) {
175
175
  nativeBinding = require('./xcode.linux-x64-musl.node')
176
176
  } else {
177
- nativeBinding = require('undefined-linux-x64-musl')
177
+ nativeBinding = require('@xcodekit/xcode-linux-x64-musl')
178
178
  }
179
179
  } catch (e) {
180
180
  loadError = e
@@ -187,7 +187,7 @@ switch (platform) {
187
187
  if (localFileExisted) {
188
188
  nativeBinding = require('./xcode.linux-x64-gnu.node')
189
189
  } else {
190
- nativeBinding = require('undefined-linux-x64-gnu')
190
+ nativeBinding = require('@xcodekit/xcode-linux-x64-gnu')
191
191
  }
192
192
  } catch (e) {
193
193
  loadError = e
@@ -203,7 +203,7 @@ switch (platform) {
203
203
  if (localFileExisted) {
204
204
  nativeBinding = require('./xcode.linux-arm64-musl.node')
205
205
  } else {
206
- nativeBinding = require('undefined-linux-arm64-musl')
206
+ nativeBinding = require('@xcodekit/xcode-linux-arm64-musl')
207
207
  }
208
208
  } catch (e) {
209
209
  loadError = e
@@ -216,7 +216,7 @@ switch (platform) {
216
216
  if (localFileExisted) {
217
217
  nativeBinding = require('./xcode.linux-arm64-gnu.node')
218
218
  } else {
219
- nativeBinding = require('undefined-linux-arm64-gnu')
219
+ nativeBinding = require('@xcodekit/xcode-linux-arm64-gnu')
220
220
  }
221
221
  } catch (e) {
222
222
  loadError = e
@@ -232,7 +232,7 @@ switch (platform) {
232
232
  if (localFileExisted) {
233
233
  nativeBinding = require('./xcode.linux-arm-musleabihf.node')
234
234
  } else {
235
- nativeBinding = require('undefined-linux-arm-musleabihf')
235
+ nativeBinding = require('@xcodekit/xcode-linux-arm-musleabihf')
236
236
  }
237
237
  } catch (e) {
238
238
  loadError = e
@@ -245,7 +245,7 @@ switch (platform) {
245
245
  if (localFileExisted) {
246
246
  nativeBinding = require('./xcode.linux-arm-gnueabihf.node')
247
247
  } else {
248
- nativeBinding = require('undefined-linux-arm-gnueabihf')
248
+ nativeBinding = require('@xcodekit/xcode-linux-arm-gnueabihf')
249
249
  }
250
250
  } catch (e) {
251
251
  loadError = e
@@ -261,7 +261,7 @@ switch (platform) {
261
261
  if (localFileExisted) {
262
262
  nativeBinding = require('./xcode.linux-riscv64-musl.node')
263
263
  } else {
264
- nativeBinding = require('undefined-linux-riscv64-musl')
264
+ nativeBinding = require('@xcodekit/xcode-linux-riscv64-musl')
265
265
  }
266
266
  } catch (e) {
267
267
  loadError = e
@@ -274,7 +274,7 @@ switch (platform) {
274
274
  if (localFileExisted) {
275
275
  nativeBinding = require('./xcode.linux-riscv64-gnu.node')
276
276
  } else {
277
- nativeBinding = require('undefined-linux-riscv64-gnu')
277
+ nativeBinding = require('@xcodekit/xcode-linux-riscv64-gnu')
278
278
  }
279
279
  } catch (e) {
280
280
  loadError = e
@@ -289,7 +289,7 @@ switch (platform) {
289
289
  if (localFileExisted) {
290
290
  nativeBinding = require('./xcode.linux-s390x-gnu.node')
291
291
  } else {
292
- nativeBinding = require('undefined-linux-s390x-gnu')
292
+ nativeBinding = require('@xcodekit/xcode-linux-s390x-gnu')
293
293
  }
294
294
  } catch (e) {
295
295
  loadError = e
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xcodekit/xcode-node",
3
- "version": "0.6.8",
3
+ "version": "0.6.10",
4
4
  "description": "Parse, manipulate, and serialize Xcode .pbxproj files — native Node.js addon (napi-rs)",
5
5
  "main": "index.js",
6
6
  "types": "index.d.ts",
@@ -10,11 +10,11 @@
10
10
  "types.d.ts"
11
11
  ],
12
12
  "optionalDependencies": {
13
- "@xcodekit/xcode-darwin-arm64": "0.6.8",
14
- "@xcodekit/xcode-darwin-x64": "0.6.8",
15
- "@xcodekit/xcode-linux-arm64-gnu": "0.6.8",
16
- "@xcodekit/xcode-linux-x64-gnu": "0.6.8",
17
- "@xcodekit/xcode-win32-x64-msvc": "0.6.8"
13
+ "@xcodekit/xcode-darwin-arm64": "0.6.10",
14
+ "@xcodekit/xcode-darwin-x64": "0.6.10",
15
+ "@xcodekit/xcode-linux-arm64-gnu": "0.6.10",
16
+ "@xcodekit/xcode-linux-x64-gnu": "0.6.10",
17
+ "@xcodekit/xcode-win32-x64-msvc": "0.6.10"
18
18
  },
19
19
  "repository": {
20
20
  "type": "git",