@absolutejs/absolute 0.20.0-beta.135 → 0.20.0-beta.137

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
@@ -6,6 +6,20 @@ This file is generated by `absolute-changelog` from the entries in
6
6
  `changelog/`. Edit an entry, not this file — and add new ones under
7
7
  `changelog/unreleased/`.
8
8
 
9
+ ## 0.20.0-beta.137 — 2026-10-08
10
+
11
+ ### Fixed
12
+
13
+ - **absolute compile prints the real error when the executable fails to bundle**
14
+ When the last step of `absolute compile` ("Compiling standalone executable") failed, it printed only `AggregateError: Bundle failed`, because Bun throws by default. It now reports failures as data, like the server bundle step, so each error is printed with its file and message.
15
+
16
+ ## 0.20.0-beta.136 — 2026-10-08
17
+
18
+ ### Added
19
+
20
+ - **iOS release builds check that a push app is signed for production push**
21
+ An app that uses push notifications is built with the `development` push environment so debug builds sign, and App Store export is expected to switch it to `production` through the distribution profile. If it does not, Apple rejects every installed device's push token and no user receives push, with nothing to show for it. `absolute mobile build ios` now reads the entitlements signed into the exported IPA and fails, explaining the fix, unless `aps-environment` is `production`. Apps that do not use push are not inspected.
22
+
9
23
  ## 0.20.0-beta.135 — 2026-10-08
10
24
 
11
25
  ### Fixed
package/changelog.json CHANGED
@@ -2,6 +2,28 @@
2
2
  "contract": 1,
3
3
  "name": "@absolutejs/absolute",
4
4
  "releases": [
5
+ {
6
+ "changes": [
7
+ {
8
+ "detail": "When the last step of `absolute compile` (\"Compiling standalone executable\") failed, it printed only `AggregateError: Bundle failed`, because Bun throws by default. It now reports failures as data, like the server bundle step, so each error is printed with its file and message.",
9
+ "kind": "fixed",
10
+ "summary": "absolute compile prints the real error when the executable fails to bundle"
11
+ }
12
+ ],
13
+ "date": "2026-10-08",
14
+ "version": "0.20.0-beta.137"
15
+ },
16
+ {
17
+ "changes": [
18
+ {
19
+ "detail": "An app that uses push notifications is built with the `development` push environment so debug builds sign, and App Store export is expected to switch it to `production` through the distribution profile. If it does not, Apple rejects every installed device's push token and no user receives push, with nothing to show for it. `absolute mobile build ios` now reads the entitlements signed into the exported IPA and fails, explaining the fix, unless `aps-environment` is `production`. Apps that do not use push are not inspected.",
20
+ "kind": "added",
21
+ "summary": "iOS release builds check that a push app is signed for production push"
22
+ }
23
+ ],
24
+ "date": "2026-10-08",
25
+ "version": "0.20.0-beta.136"
26
+ },
5
27
  {
6
28
  "changes": [
7
29
  {
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- // .angular-partial-tmp-guYgL8/src/core/streamingSlotRegistrar.ts
2
+ // .angular-partial-tmp-zUCRPO/src/core/streamingSlotRegistrar.ts
3
3
  var STREAMING_SLOT_REGISTRAR_KEY = Symbol.for("absolutejs.streamingSlotRegistrar");
4
4
  var STREAMING_SLOT_WARNING_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotWarningController");
5
5
  var STREAMING_SLOT_COLLECTION_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotCollectionController");
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- // .angular-partial-tmp-guYgL8/src/core/streamingSlotRegistrar.ts
2
+ // .angular-partial-tmp-zUCRPO/src/core/streamingSlotRegistrar.ts
3
3
  var STREAMING_SLOT_REGISTRAR_KEY = Symbol.for("absolutejs.streamingSlotRegistrar");
4
4
  var STREAMING_SLOT_WARNING_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotWarningController");
5
5
  var STREAMING_SLOT_COLLECTION_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotCollectionController");
@@ -46,7 +46,7 @@ var warnMissingStreamingSlotCollector = (primitiveName) => {
46
46
  getWarningController()?.maybeWarn(primitiveName);
47
47
  };
48
48
 
49
- // .angular-partial-tmp-guYgL8/src/core/streamingSlotRegistry.ts
49
+ // .angular-partial-tmp-zUCRPO/src/core/streamingSlotRegistry.ts
50
50
  var STREAMING_SLOT_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotAsyncLocalStorage");
51
51
  var isObjectRecord2 = (value) => Boolean(value) && typeof value === "object";
52
52
  var isAsyncLocalStorage = (value) => isObjectRecord2(value) && ("getStore" in value) && typeof value.getStore === "function" && ("run" in value) && typeof value.run === "function";
@@ -1261,7 +1261,8 @@ export default server;
1261
1261
  }),
1262
1262
  createBunStringRawUnicodePlugin()
1263
1263
  ],
1264
- target: "bun"
1264
+ target: "bun",
1265
+ throw: false
1265
1266
  });
1266
1267
  if (!result.success) {
1267
1268
  result.logs.forEach((log) => console.error(log));
@@ -1321,9 +1321,9 @@ var loadAbsoluteMobileDevModules = async () => {
1321
1321
  import("./emulatorDoctor-cwa70kgt.js"),
1322
1322
  import("./emulatorInstaller-dx3fmm2m.js"),
1323
1323
  import("./androidNativeWatcher-ctbnsr1v.js"),
1324
- import("./iosSimulatorController-haa1cc3p.js"),
1325
- import("./remoteMacProtocol-v3ax0y0f.js"),
1326
- import("./iosNativeWatcher-zx49pzej.js"),
1324
+ import("./iosSimulatorController-491k640d.js"),
1325
+ import("./remoteMacProtocol-5qxgxk21.js"),
1326
+ import("./iosNativeWatcher-p1z40vbb.js"),
1327
1327
  import("./expoNativeWatcher-aakp7xvj.js")
1328
1328
  ]);
1329
1329
  return {
@@ -35,9 +35,31 @@ var requireManifest = (value) => {
35
35
  return {
36
36
  appBuild: value.appBuild,
37
37
  appId: value.appId,
38
+ deviceCapabilities: Array.isArray(value.deviceCapabilities) ? value.deviceCapabilities.filter((capability) => typeof capability === "string") : [],
38
39
  runtime: value.runtime
39
40
  };
40
41
  };
42
+ var APS_ENVIRONMENT_PATTERN = /<key>aps-environment<\/key>\s*<string>([^<]*)<\/string>/;
43
+ var verifyIosPushEntitlement = async (options) => {
44
+ const unpacked = join(options.staging, "push-entitlement-check");
45
+ if (options.capture(["ditto", "-x", "-k", options.artifactPath, unpacked]).exitCode !== 0)
46
+ throw new TypeError("Could not unpack the exported IPA to check its push entitlement.");
47
+ const app = await findByExtension(join(unpacked, "Payload"), ".app");
48
+ if (!app)
49
+ throw new TypeError("The exported IPA does not contain an app bundle.");
50
+ const signed = options.capture([
51
+ "codesign",
52
+ "--display",
53
+ "--entitlements",
54
+ ":-",
55
+ app
56
+ ]);
57
+ if (signed.exitCode !== 0)
58
+ throw new TypeError("Could not read the exported app's signed entitlements.");
59
+ const environment = APS_ENVIRONMENT_PATTERN.exec(signed.stdout)?.[1];
60
+ if (environment !== "production")
61
+ throw new TypeError(`The app uses push notifications, but its signed aps-environment entitlement is ${environment ? `"${environment}"` : "missing"}, not "production". APNs production would reject its device tokens, so no installed user would receive push. Sign the release with an App Store distribution profile whose App ID has Push Notifications enabled.`);
62
+ };
41
63
  var pathExists = async (path) => {
42
64
  try {
43
65
  await access(path);
@@ -407,6 +429,8 @@ var buildAbsoluteIosRelease = async (options) => {
407
429
  const artifactPath = await findByExtension(exportPath, ".ipa");
408
430
  if (!artifactPath)
409
431
  throw new TypeError("Xcode did not produce an exported IPA.");
432
+ if (signed && manifest.deviceCapabilities.includes("pushNotifications"))
433
+ await verifyIosPushEntitlement({ artifactPath, capture, staging });
410
434
  const [bytes, sha256] = await Promise.all([
411
435
  stat(artifactPath).then(({ size }) => size),
412
436
  sha256File(artifactPath)
@@ -5,7 +5,7 @@ import {
5
5
  } from "./index-j57pgg5m.js";
6
6
  import {
7
7
  fingerprintAbsoluteIosNativeProject
8
- } from "./index-thqwfzy8.js";
8
+ } from "./index-adywn74r.js";
9
9
  import {
10
10
  normalizeAbsoluteIosDeviceHost,
11
11
  normalizeAbsoluteIosDeviceIdentifier,
@@ -2,7 +2,7 @@
2
2
  import {
3
3
  requireAbsoluteIosReleaseMetadata,
4
4
  installAbsoluteIosRelease
5
- } from "./index-thqwfzy8.js";
5
+ } from "./index-adywn74r.js";
6
6
  import {
7
7
  unrefTimer
8
8
  } from "./index-1y5mmnwg.js";
package/dist/cli/index.js CHANGED
@@ -54,7 +54,7 @@ if (command === "dev") {
54
54
  }
55
55
  const positionalArgs = stripNamedArgs("--config", "--android-device", "--ios-device").filter((arg) => arg !== "--no-mobile" && arg !== "--eager");
56
56
  const serverEntry = positionalArgs[0] ?? DEFAULT_SERVER_ENTRY;
57
- const { dev } = await import("./dev-cjq9rdeq.js");
57
+ const { dev } = await import("./dev-k5mbc04f.js");
58
58
  await dev(serverEntry, configPath, {
59
59
  androidDevice,
60
60
  eager: args.includes("--eager"),
@@ -201,13 +201,13 @@ if (command === "dev") {
201
201
  const configPath = parseNamedArg("--config");
202
202
  const positionalArgs = stripNamedArgs("--outdir", "--outfile", "--config");
203
203
  const serverEntry = positionalArgs[0] ?? DEFAULT_SERVER_ENTRY;
204
- const { compile } = await import("./compile-c7798g5y.js");
204
+ const { compile } = await import("./compile-brr8ad4a.js");
205
205
  await compile(serverEntry, outdir, outfile, configPath);
206
206
  } else if (command === "mobile") {
207
207
  sendTelemetryEvent("cli:command", {
208
208
  command: `mobile:${workspaceCommand ?? "unknown"}`
209
209
  });
210
- const { runMobile } = await import("./mobile-ma7sfttv.js");
210
+ const { runMobile } = await import("./mobile-jx4e7r2w.js");
211
211
  try {
212
212
  await runMobile(args);
213
213
  } catch (error) {
@@ -1,10 +1,10 @@
1
1
  // @bun
2
2
  import"./index-hxqprc80.js";
3
3
  import"./index-j57pgg5m.js";
4
- import"./index-thqwfzy8.js";
4
+ import"./index-adywn74r.js";
5
5
  import {
6
6
  fingerprintAbsoluteIosDevProject2
7
- } from "./index-vj2v38sq.js";
7
+ } from "./index-fkn59pcp.js";
8
8
  import"./index-k4t9k1xk.js";
9
9
  import"./index-92hmw204.js";
10
10
  import"./index-1x1vah31.js";
@@ -6,8 +6,8 @@ import {
6
6
  fingerprintAbsoluteIosDevProject2,
7
7
  prepareAbsoluteIosDevProject2,
8
8
  startAbsoluteIosDevSession2
9
- } from "./index-vj2v38sq.js";
10
- import"./index-thqwfzy8.js";
9
+ } from "./index-fkn59pcp.js";
10
+ import"./index-adywn74r.js";
11
11
  import"./index-j57pgg5m.js";
12
12
  import"./index-k4t9k1xk.js";
13
13
  import"./index-92hmw204.js";
@@ -66,12 +66,12 @@ import {
66
66
  resolveAbsoluteIosXcodeProject,
67
67
  requireAbsoluteIosReleaseMetadata,
68
68
  buildAbsoluteIosRelease
69
- } from "./index-thqwfzy8.js";
69
+ } from "./index-adywn74r.js";
70
70
  import {
71
71
  ABSOLUTE_IOS_SIMULATOR_NAME2,
72
72
  parseIosSimulators2,
73
73
  repairAbsoluteIosDevSession2
74
- } from "./index-vj2v38sq.js";
74
+ } from "./index-fkn59pcp.js";
75
75
  import"./index-e6ysp900.js";
76
76
  import {
77
77
  start2
@@ -88,7 +88,7 @@ import {
88
88
  inspectAbsoluteRemoteMacWorkspace2,
89
89
  buildAbsoluteRemoteIosRelease2,
90
90
  runAbsoluteRemoteIosReleaseAcceptance2
91
- } from "./index-1qewxkgy.js";
91
+ } from "./index-gmwb037j.js";
92
92
  import {
93
93
  installPackages
94
94
  } from "./index-jjfbjv1z.js";
@@ -15,8 +15,8 @@ import {
15
15
  runAbsoluteRemoteIosReleaseAcceptance2,
16
16
  startAbsoluteRemoteExpoIosDevSession2,
17
17
  startAbsoluteRemoteIosDevSession2
18
- } from "./index-1qewxkgy.js";
19
- import"./index-thqwfzy8.js";
18
+ } from "./index-gmwb037j.js";
19
+ import"./index-adywn74r.js";
20
20
  import"./index-j57pgg5m.js";
21
21
  import"./index-k4t9k1xk.js";
22
22
  import"./index-92hmw204.js";
@@ -24852,9 +24852,31 @@ var requireManifest2 = (value) => {
24852
24852
  return {
24853
24853
  appBuild: value.appBuild,
24854
24854
  appId: value.appId,
24855
+ deviceCapabilities: Array.isArray(value.deviceCapabilities) ? value.deviceCapabilities.filter((capability) => typeof capability === "string") : [],
24855
24856
  runtime: value.runtime
24856
24857
  };
24857
24858
  };
24859
+ var APS_ENVIRONMENT_PATTERN = /<key>aps-environment<\/key>\s*<string>([^<]*)<\/string>/;
24860
+ var verifyIosPushEntitlement = async (options) => {
24861
+ const unpacked = join8(options.staging, "push-entitlement-check");
24862
+ if (options.capture(["ditto", "-x", "-k", options.artifactPath, unpacked]).exitCode !== 0)
24863
+ throw new TypeError("Could not unpack the exported IPA to check its push entitlement.");
24864
+ const app = await findByExtension(join8(unpacked, "Payload"), ".app");
24865
+ if (!app)
24866
+ throw new TypeError("The exported IPA does not contain an app bundle.");
24867
+ const signed = options.capture([
24868
+ "codesign",
24869
+ "--display",
24870
+ "--entitlements",
24871
+ ":-",
24872
+ app
24873
+ ]);
24874
+ if (signed.exitCode !== 0)
24875
+ throw new TypeError("Could not read the exported app's signed entitlements.");
24876
+ const environment = APS_ENVIRONMENT_PATTERN.exec(signed.stdout)?.[1];
24877
+ if (environment !== "production")
24878
+ throw new TypeError(`The app uses push notifications, but its signed aps-environment entitlement is ${environment ? `"${environment}"` : "missing"}, not "production". APNs production would reject its device tokens, so no installed user would receive push. Sign the release with an App Store distribution profile whose App ID has Push Notifications enabled.`);
24879
+ };
24858
24880
  var pathExists4 = async (path) => {
24859
24881
  try {
24860
24882
  await access8(path);
@@ -25224,6 +25246,8 @@ var buildAbsoluteIosRelease = async (options) => {
25224
25246
  const artifactPath = await findByExtension(exportPath, ".ipa");
25225
25247
  if (!artifactPath)
25226
25248
  throw new TypeError("Xcode did not produce an exported IPA.");
25249
+ if (signed && manifest.deviceCapabilities.includes("pushNotifications"))
25250
+ await verifyIosPushEntitlement({ artifactPath, capture, staging });
25227
25251
  const [bytes, sha256] = await Promise.all([
25228
25252
  stat3(artifactPath).then(({ size }) => size),
25229
25253
  sha256File2(artifactPath)
@@ -44234,5 +44258,5 @@ export {
44234
44258
  writeAbsoluteMobileUpdateRegistry
44235
44259
  };
44236
44260
 
44237
- //# debugId=0637FEF0F991934364756E2164756E21
44261
+ //# debugId=996CBF4A7D59550E64756E2164756E21
44238
44262
  //# sourceMappingURL=index.js.map