@absolutejs/absolute 0.20.0-beta.104 → 0.20.0-beta.106

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 (32) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/changelog.json +45 -0
  3. package/dist/angular/components/core/streamingSlotRegistrar.js +1 -1
  4. package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
  5. package/dist/cli/{compile-g8vmvr0w.js → compile-hsbs1xf6.js} +2 -2
  6. package/dist/cli/{dev-m4r4zs2k.js → dev-f6b6hkke.js} +4 -4
  7. package/dist/cli/{expoProject-780thyfd.js → expoProject-zkprmjjz.js} +1 -1
  8. package/dist/cli/{index-d5fr1xp3.js → index-0zcebhm4.js} +59 -1
  9. package/dist/cli/{index-wpfvpsk7.js → index-5skbydh0.js} +1 -1
  10. package/dist/cli/{index-67kedtn7.js → index-hrzd7e5x.js} +1 -1
  11. package/dist/cli/{index-3sdvzrv2.js → index-jf1f6npt.js} +233 -4
  12. package/dist/cli/{index-27hhdgtg.js → index-mazxtfh4.js} +1 -1
  13. package/dist/cli/{index-qxnptvwn.js → index-q1d4ns4n.js} +100 -9
  14. package/dist/cli/index.js +5 -5
  15. package/dist/cli/{iosNativeWatcher-3k715hq0.js → iosNativeWatcher-t6gv0p1w.js} +2 -2
  16. package/dist/cli/{iosSimulatorController-dr98a0p9.js → iosSimulatorController-5n2a9fxv.js} +2 -2
  17. package/dist/cli/{mobile-njmnd7vc.js → mobile-w4my2dc7.js} +1008 -173
  18. package/dist/cli/{remoteMacProtocol-kqvkp0qd.js → remoteMacProtocol-dybpgazw.js} +6 -2
  19. package/dist/cli/{start-39aqmr5n.js → start-5grq7nfr.js} +3 -3
  20. package/dist/mobile/index.js +1445 -575
  21. package/dist/mobile/index.js.map +10 -9
  22. package/dist/mobile/remoteMacAgentEntry.js +341 -294
  23. package/dist/src/mobile/index.d.ts +1 -0
  24. package/dist/src/mobile/iosRelease.d.ts +31 -7
  25. package/dist/src/mobile/iosReleaseAcceptance.d.ts +66 -0
  26. package/dist/src/mobile/iosTestReport.d.ts +1 -0
  27. package/dist/src/mobile/nativeReleaseReadiness.d.ts +1 -1
  28. package/dist/src/mobile/nativeTestReport.d.ts +16 -0
  29. package/dist/src/mobile/remoteMacProtocol.d.ts +51 -4
  30. package/dist/src/mobile/remoteMacWire.d.ts +1 -1
  31. package/dist/src/mobile/shellReleaseReadiness.d.ts +1 -1
  32. package/package.json +1 -1
@@ -120,6 +120,25 @@ var safeOutputDirectory = (projectRoot, requested) => {
120
120
  return output;
121
121
  };
122
122
  var sha256File = async (path) => createHash("sha256").update(await readFile(path)).digest("hex");
123
+ var verifyRegisteredReleaseArtifact = async (releaseRoot, metadata) => {
124
+ if (!metadata.registeredDevice)
125
+ return;
126
+ const destination = join(releaseRoot, metadata.registeredDevice.artifact);
127
+ const [bytes, sha256] = await Promise.all([
128
+ stat(destination).then(({ size }) => size),
129
+ sha256File(destination)
130
+ ]);
131
+ if (bytes !== metadata.registeredDevice.bytes || sha256 !== metadata.registeredDevice.sha256)
132
+ throw new TypeError(`Immutable iOS release ${metadata.releaseId} registered-device artifact is missing or modified.`);
133
+ return destination;
134
+ };
135
+ var copyRegisteredReleaseArtifact = async (staging, metadata, registeredArtifactPath) => {
136
+ if (!metadata.registeredDevice)
137
+ return;
138
+ if (!registeredArtifactPath)
139
+ throw new TypeError("iOS release metadata requires a registered-device artifact.");
140
+ await copyFile(registeredArtifactPath, join(staging, metadata.registeredDevice.artifact));
141
+ };
123
142
  var findByExtension = async (root, extension) => {
124
143
  if (!await pathExists(root))
125
144
  return;
@@ -175,12 +194,12 @@ var resolveAbsoluteIosXcodeProject = async (nativeDirectory, options = {}) => {
175
194
  throw new TypeError(schemes.length > 1 ? `iOS release found multiple shared Xcode schemes: ${schemes.join(", ")}. Pass an explicit scheme.` : "iOS release could not find a shared Xcode scheme.");
176
195
  return { scheme: schemes[0], workspacePath };
177
196
  };
178
- var exportOptions = () => `<?xml version="1.0" encoding="UTF-8"?>
197
+ var exportOptions = (method) => `<?xml version="1.0" encoding="UTF-8"?>
179
198
  <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
180
199
  <plist version="1.0"><dict>
181
200
  <key>destination</key><string>export</string>
182
201
  <key>manageAppVersionAndBuildNumber</key><false/>
183
- <key>method</key><string>app-store-connect</string>
202
+ <key>method</key><string>${method}</string>
184
203
  <key>signingStyle</key><string>automatic</string>
185
204
  <key>stripSwiftSymbols</key><true/>
186
205
  <key>uploadSymbols</key><true/>
@@ -191,7 +210,19 @@ var requireBuildNumber = (value) => {
191
210
  throw new TypeError("iOS build number must be a positive integer.");
192
211
  return value;
193
212
  };
213
+ var normalizeRegisteredDevice = (value) => {
214
+ if (value === undefined)
215
+ return;
216
+ if (!isRecord(value) || value.artifact !== "App.registered.ipa" || typeof value.bytes !== "number" || !Number.isSafeInteger(value.bytes) || value.bytes < 1 || typeof value.sha256 !== "string" || !/^[a-f0-9]{64}$/u.test(value.sha256))
217
+ throw new TypeError("Invalid AbsoluteJS iOS release metadata.");
218
+ return {
219
+ artifact: "App.registered.ipa",
220
+ bytes: value.bytes,
221
+ sha256: value.sha256
222
+ };
223
+ };
194
224
  var requireAbsoluteIosReleaseMetadata = (value) => {
225
+ const registeredDevice = normalizeRegisteredDevice(isRecord(value) ? value.registeredDevice : undefined);
195
226
  if (!isRecord(value) || value.artifact !== "App.ipa" || typeof value.appBuild !== "string" || typeof value.appId !== "string" || typeof value.bytes !== "number" || !Number.isSafeInteger(value.bytes) || value.bytes < 1 || value.engine !== "capacitor" && value.engine !== "expo" || value.format !== ABSOLUTE_IOS_RELEASE_FORMAT || typeof value.marketingVersion !== "string" || value.platform !== "ios" || typeof value.releaseId !== "string" || typeof value.runtime !== "string" || typeof value.sha256 !== "string" || typeof value.signed !== "boolean" || value.type !== "ipa" || value.buildNumber !== undefined && (typeof value.buildNumber !== "number" || !Number.isSafeInteger(value.buildNumber) || value.buildNumber < 1) || !/^amobile_ios_[a-f0-9]{64}$/u.test(value.releaseId) || !/^[a-f0-9]{64}$/u.test(value.sha256) || value.releaseId !== `amobile_ios_${value.sha256}`) {
196
227
  throw new TypeError("Invalid AbsoluteJS iOS release metadata.");
197
228
  }
@@ -205,6 +236,7 @@ var requireAbsoluteIosReleaseMetadata = (value) => {
205
236
  format: value.format,
206
237
  marketingVersion: value.marketingVersion,
207
238
  platform: value.platform,
239
+ ...registeredDevice ? { registeredDevice } : {},
208
240
  releaseId: value.releaseId,
209
241
  runtime: value.runtime,
210
242
  sha256: value.sha256,
@@ -212,12 +244,13 @@ var requireAbsoluteIosReleaseMetadata = (value) => {
212
244
  type: value.type
213
245
  };
214
246
  };
215
- var installRelease = async (artifactPath, metadata, outputRoot) => {
247
+ var installRelease = async (artifactPath, metadata, outputRoot, registeredArtifactPath) => {
216
248
  const releaseRoot = join(outputRoot, metadata.releaseId);
217
249
  const destination = join(releaseRoot, "App.ipa");
218
250
  if (await pathExists(releaseRoot)) {
219
251
  const value = JSON.parse(await readFile(join(releaseRoot, "release.json"), "utf8"));
220
- if (!isRecord(value) || value.artifact !== "App.ipa" || Object.entries(metadata).some(([key, expected]) => Reflect.get(value, key) !== expected)) {
252
+ const existing = requireAbsoluteIosReleaseMetadata(value);
253
+ if (JSON.stringify(existing) !== JSON.stringify({ ...metadata, artifact: "App.ipa" })) {
221
254
  throw new TypeError(`Immutable iOS release ${metadata.releaseId} does not match its content.`);
222
255
  }
223
256
  const [bytes, sha256] = await Promise.all([
@@ -226,12 +259,14 @@ var installRelease = async (artifactPath, metadata, outputRoot) => {
226
259
  ]);
227
260
  if (bytes !== metadata.bytes || sha256 !== metadata.sha256)
228
261
  throw new TypeError(`Immutable iOS release ${metadata.releaseId} artifact is missing or modified.`);
262
+ const registeredDestination = await verifyRegisteredReleaseArtifact(releaseRoot, metadata);
229
263
  return {
230
264
  artifactPath: destination,
231
265
  metadata: {
232
266
  ...metadata,
233
267
  artifact: "App.ipa"
234
268
  },
269
+ ...registeredDestination ? { registeredArtifactPath: registeredDestination } : {},
235
270
  releaseRoot
236
271
  };
237
272
  }
@@ -239,6 +274,7 @@ var installRelease = async (artifactPath, metadata, outputRoot) => {
239
274
  const staging = await mkdtemp(join(dirname(releaseRoot), ".ios-stage-"));
240
275
  try {
241
276
  await copyFile(artifactPath, join(staging, "App.ipa"));
277
+ await copyRegisteredReleaseArtifact(staging, metadata, registeredArtifactPath);
242
278
  const complete = {
243
279
  ...metadata,
244
280
  artifact: "App.ipa"
@@ -246,13 +282,50 @@ var installRelease = async (artifactPath, metadata, outputRoot) => {
246
282
  await writeFile(join(staging, "release.json"), `${JSON.stringify(complete, null, "\t")}
247
283
  `, { flag: "wx" });
248
284
  await rename(staging, releaseRoot);
249
- return { artifactPath: destination, metadata: complete, releaseRoot };
285
+ return {
286
+ artifactPath: destination,
287
+ metadata: complete,
288
+ ...metadata.registeredDevice ? {
289
+ registeredArtifactPath: join(releaseRoot, metadata.registeredDevice.artifact)
290
+ } : {},
291
+ releaseRoot
292
+ };
250
293
  } finally {
251
294
  await rm(staging, { force: true, recursive: true }).catch(() => {
252
295
  return;
253
296
  });
254
297
  }
255
298
  };
299
+ var exportRegisteredDeviceArtifact = async (options) => {
300
+ const exportPath = join(options.staging, "registered-export");
301
+ const exportPlist = join(options.staging, "RegisteredExportOptions.plist");
302
+ await mkdir(exportPath, { recursive: true });
303
+ await writeFile(exportPlist, exportOptions("debugging"));
304
+ const exitCode = await options.run([
305
+ "xcodebuild",
306
+ "-exportArchive",
307
+ "-archivePath",
308
+ options.archivePath,
309
+ "-exportPath",
310
+ exportPath,
311
+ "-exportOptionsPlist",
312
+ exportPlist
313
+ ], { cwd: options.nativeDirectory, env: options.env });
314
+ if (exitCode !== 0)
315
+ throw new TypeError("Xcode failed to export the registered-device IPA. Confirm the selected development team includes the test device.");
316
+ const artifactPath = await findByExtension(exportPath, ".ipa");
317
+ if (!artifactPath)
318
+ throw new TypeError("Xcode did not produce a registered-device IPA.");
319
+ const [bytes, sha256] = await Promise.all([
320
+ stat(artifactPath).then(({ size }) => size),
321
+ sha256File(artifactPath)
322
+ ]);
323
+ const metadata = { artifact: "App.registered.ipa", bytes, sha256 };
324
+ return {
325
+ artifactPath,
326
+ metadata
327
+ };
328
+ };
256
329
  var buildAbsoluteIosRelease = async (options) => {
257
330
  if (options.buildNumber !== undefined && options.prepareBuildNumber)
258
331
  throw new TypeError("iOS release buildNumber and prepareBuildNumber cannot be combined.");
@@ -282,7 +355,7 @@ var buildAbsoluteIosRelease = async (options) => {
282
355
  const exportPath = join(staging, "export");
283
356
  const exportPlist = join(staging, "ExportOptions.plist");
284
357
  await mkdir(exportPath, { recursive: true });
285
- await writeFile(exportPlist, exportOptions());
358
+ await writeFile(exportPlist, exportOptions("app-store-connect"));
286
359
  const run = options.run ?? defaultRun;
287
360
  try {
288
361
  const developmentTeam = developmentTeamArgument(options.developmentTeam);
@@ -339,6 +412,13 @@ var buildAbsoluteIosRelease = async (options) => {
339
412
  sha256File(artifactPath)
340
413
  ]);
341
414
  const releaseId = `amobile_ios_${sha256}`;
415
+ const registered = options.registeredDeviceArtifact ? await exportRegisteredDeviceArtifact({
416
+ archivePath,
417
+ ...options.env ? { env: options.env } : {},
418
+ nativeDirectory,
419
+ run,
420
+ staging
421
+ }) : undefined;
342
422
  return await installRelease(artifactPath, {
343
423
  appBuild: manifest.appBuild,
344
424
  appId: manifest.appId,
@@ -348,12 +428,13 @@ var buildAbsoluteIosRelease = async (options) => {
348
428
  format: 1,
349
429
  marketingVersion,
350
430
  platform: "ios",
431
+ ...registered ? { registeredDevice: registered.metadata } : {},
351
432
  releaseId,
352
433
  runtime: manifest.runtime,
353
434
  sha256,
354
435
  signed,
355
436
  type: "ipa"
356
- }, safeOutputDirectory(options.projectRoot, options.outputDirectory));
437
+ }, safeOutputDirectory(options.projectRoot, options.outputDirectory), registered?.artifactPath);
357
438
  } finally {
358
439
  await rm(staging, { force: true, recursive: true }).catch(() => {
359
440
  return;
@@ -368,8 +449,18 @@ var installAbsoluteIosRelease = async (options) => {
368
449
  ]);
369
450
  if (bytes !== metadata.bytes || sha256 !== metadata.sha256)
370
451
  throw new TypeError("Remote iOS release artifact does not match its signed metadata.");
452
+ if (metadata.registeredDevice) {
453
+ if (!options.registeredArtifactPath)
454
+ throw new TypeError("Remote iOS release metadata requires its registered-device artifact.");
455
+ const [registeredBytes, registeredSha256] = await Promise.all([
456
+ stat(options.registeredArtifactPath).then(({ size }) => size),
457
+ sha256File(options.registeredArtifactPath)
458
+ ]);
459
+ if (registeredBytes !== metadata.registeredDevice.bytes || registeredSha256 !== metadata.registeredDevice.sha256)
460
+ throw new TypeError("Remote iOS registered-device artifact does not match its signed metadata.");
461
+ }
371
462
  const { artifact: _artifact, ...releaseMetadata } = metadata;
372
- return installRelease(options.artifactPath, releaseMetadata, safeOutputDirectory(options.projectRoot, options.outputDirectory));
463
+ return installRelease(options.artifactPath, releaseMetadata, safeOutputDirectory(options.projectRoot, options.outputDirectory), options.registeredArtifactPath);
373
464
  };
374
465
 
375
- export { fingerprintAbsoluteIosNativeProject, requireAbsoluteIosReleaseMetadata, buildAbsoluteIosRelease, installAbsoluteIosRelease };
466
+ export { fingerprintAbsoluteIosNativeProject, resolveAbsoluteIosXcodeProject, requireAbsoluteIosReleaseMetadata, buildAbsoluteIosRelease, installAbsoluteIosRelease };
package/dist/cli/index.js CHANGED
@@ -58,7 +58,7 @@ if (command === "dev") {
58
58
  }
59
59
  const positionalArgs = stripNamedArgs("--config", "--android-device", "--ios-device").filter((arg) => arg !== "--no-mobile" && arg !== "--eager");
60
60
  const serverEntry = positionalArgs[0] ?? DEFAULT_SERVER_ENTRY;
61
- const { dev } = await import("./dev-m4r4zs2k.js");
61
+ const { dev } = await import("./dev-f6b6hkke.js");
62
62
  await dev(serverEntry, configPath, {
63
63
  androidDevice,
64
64
  eager: args.includes("--eager"),
@@ -71,7 +71,7 @@ if (command === "dev") {
71
71
  const configPath = parseNamedArg("--config");
72
72
  const positionalArgs = stripNamedArgs("--outdir", "--config").filter((arg) => arg !== "--prebuilt");
73
73
  const serverEntry = positionalArgs[0] ?? DEFAULT_SERVER_ENTRY;
74
- const { start } = await import("./start-39aqmr5n.js");
74
+ const { start } = await import("./start-5grq7nfr.js");
75
75
  await start(serverEntry, outdir, configPath, {
76
76
  prebuilt: args.includes("--prebuilt")
77
77
  });
@@ -81,7 +81,7 @@ if (command === "dev") {
81
81
  const configPath = parseNamedArg("--config");
82
82
  const positionalArgs = stripNamedArgs("--outdir", "--config");
83
83
  const serverEntry = positionalArgs[0] ?? DEFAULT_SERVER_ENTRY;
84
- const { start } = await import("./start-39aqmr5n.js");
84
+ const { start } = await import("./start-5grq7nfr.js");
85
85
  await start(serverEntry, outdir, configPath, { prepareOnly: true });
86
86
  } else if (command === "build") {
87
87
  sendTelemetryEvent("cli:command", { command });
@@ -197,13 +197,13 @@ if (command === "dev") {
197
197
  const configPath = parseNamedArg("--config");
198
198
  const positionalArgs = stripNamedArgs("--outdir", "--outfile", "--config");
199
199
  const serverEntry = positionalArgs[0] ?? DEFAULT_SERVER_ENTRY;
200
- const { compile } = await import("./compile-g8vmvr0w.js");
200
+ const { compile } = await import("./compile-hsbs1xf6.js");
201
201
  await compile(serverEntry, outdir, outfile, configPath);
202
202
  } else if (command === "mobile") {
203
203
  sendTelemetryEvent("cli:command", {
204
204
  command: `mobile:${workspaceCommand ?? "unknown"}`
205
205
  });
206
- const { runMobile } = await import("./mobile-njmnd7vc.js");
206
+ const { runMobile } = await import("./mobile-w4my2dc7.js");
207
207
  try {
208
208
  await runMobile(args);
209
209
  } catch (error) {
@@ -1,8 +1,8 @@
1
1
  // @bun
2
2
  import {
3
3
  fingerprintAbsoluteIosDevProject
4
- } from "./index-wpfvpsk7.js";
5
- import"./index-qxnptvwn.js";
4
+ } from "./index-5skbydh0.js";
5
+ import"./index-q1d4ns4n.js";
6
6
  import"./index-j66p8hn5.js";
7
7
  import"./index-28pbrd3q.js";
8
8
  import"./index-knt92dm8.js";
@@ -10,8 +10,8 @@ import {
10
10
  redactAbsoluteIosLog,
11
11
  repairAbsoluteIosDevSession,
12
12
  startAbsoluteIosDevSession
13
- } from "./index-wpfvpsk7.js";
14
- import"./index-qxnptvwn.js";
13
+ } from "./index-5skbydh0.js";
14
+ import"./index-q1d4ns4n.js";
15
15
  import"./index-j66p8hn5.js";
16
16
  import"./index-28pbrd3q.js";
17
17
  import"./index-knt92dm8.js";