@absolutejs/absolute 0.20.0-beta.132 → 0.20.0-beta.134

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 (30) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/changelog.json +35 -0
  3. package/dist/angular/components/core/streamingSlotRegistrar.js +1 -1
  4. package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
  5. package/dist/build.js +25 -4
  6. package/dist/build.js.map +5 -5
  7. package/dist/cli/{compile-nf4qsqyd.js → compile-dae4qez4.js} +3 -2
  8. package/dist/cli/{config-3te1fbry.js → config-hy5dkexz.js} +1 -1
  9. package/dist/cli/{dev-6f0gry3y.js → dev-wv69we44.js} +2 -2
  10. package/dist/cli/{index-r915cvqp.js → index-cc8eay5y.js} +79 -157
  11. package/dist/cli/{index-c3tqbpkq.js → index-f0bjr9s0.js} +2 -2
  12. package/dist/cli/{index-hfvxsgf4.js → index-gy8rm8hs.js} +199 -64
  13. package/dist/cli/{index-rrxeqrbn.js → index-t7yf3vxs.js} +8 -0
  14. package/dist/cli/index.js +7 -7
  15. package/dist/cli/{mobile-m0cdh8cf.js → mobile-5tx2cfm5.js} +3 -3
  16. package/dist/cli/{patchedBun-m7vj5sks.js → patchedBun-541bbnee.js} +1 -1
  17. package/dist/cli/{start-3z3gtgm0.js → start-tpebqwc0.js} +3 -3
  18. package/dist/dev/serverBootstrap.js +1 -1
  19. package/dist/index.js +25 -4
  20. package/dist/index.js.map +5 -5
  21. package/dist/mobile/index.js +46 -14
  22. package/dist/mobile/index.js.map +6 -6
  23. package/dist/mobile/remoteMacAgentEntry.js +66 -66
  24. package/dist/mobile/shellBootstrap.js +23 -0
  25. package/dist/src/cli/patchedBun.d.ts +28 -40
  26. package/dist/src/mobile/artifactStore.d.ts +4 -0
  27. package/dist/src/mobile/config.d.ts +4 -0
  28. package/dist/src/mobile/pushDeepLinks.d.ts +16 -0
  29. package/dist/types/build.d.ts +11 -0
  30. package/package.json +2 -1
package/CHANGELOG.md CHANGED
@@ -6,6 +6,27 @@ 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.134 — 2026-10-08
10
+
11
+ ### Added
12
+
13
+ - **Mobile release history can live in a blob store, so CI builds keep serving installed apps** (`NormalizedAbsoluteMobileConfig`)
14
+ Builds keep answering the three most recent mobile releases so installed apps keep working, but that history lived only in the build directory, so a fresh checkout such as a CI run started with none and every installed app was asked to update. Set `mobile.compatibility.store` to a project module whose default export is a blob store (for example `awsS3BlobStore` from `@absolutejs/blob/aws-s3`) and `absolute start` and `absolute compile` read the history from it and write each new release back. Releases that only an existing build directory knows are copied into the store on the first build, and `mobile.compatibility.prefix` keeps several apps or environments in one bucket apart. The store does not change the app's runtime fingerprint.
15
+ - **Tapping a push notification opens its deepLink inside the app**
16
+ A push sent with `deepLink` carried it to the device as `absoluteDeepLink`, but tapping the notification only opened the app. Tapping it now opens that page inside the app, in Capacitor and Expo apps alike. The link takes the same route as any other deep link, so only the app's configured HTTPS hosts and its URL scheme are opened; anything else is ignored. Action buttons other than the notification body are still left to the app's own `pushNotifications.onAction` listener.
17
+
18
+ ### Fixed
19
+
20
+ - **PDF assets are served as application/pdf**
21
+ PDF assets were served without a PDF content type in `absolute dev` and in compiled apps, so browsers could download them instead of opening them. They are now served as `application/pdf`.
22
+
23
+ ## 0.20.0-beta.133 — 2026-10-06
24
+
25
+ ### Changed
26
+
27
+ - **The patched Bun for React Fast Refresh is installed and verified by bvm**
28
+ `absolute dev` and `absolute bun-patch` now install AbsoluteJS's patched Bun with bvm (`@absolutejs/bvm`, a new dependency), which checks the release's checksum list against the AbsoluteJS release key's Ed25519 signature before anything runs. The CLI no longer downloads and unzips the build itself or pins a SHA-256 per platform, so a new patched build no longer needs a framework release. A patched build installed by an earlier release in `~/.absolutejs/bun` moves onto bvm's copy on the next `absolute dev`. bvm has builds for Linux, macOS and Windows on x64 and arm64; FreeBSD and Android no longer get the offer.
29
+
9
30
  ## 0.20.0-beta.132 — 2026-10-06
10
31
 
11
32
  ### Fixed
package/changelog.json CHANGED
@@ -2,6 +2,41 @@
2
2
  "contract": 1,
3
3
  "name": "@absolutejs/absolute",
4
4
  "releases": [
5
+ {
6
+ "changes": [
7
+ {
8
+ "detail": "Builds keep answering the three most recent mobile releases so installed apps keep working, but that history lived only in the build directory, so a fresh checkout such as a CI run started with none and every installed app was asked to update. Set `mobile.compatibility.store` to a project module whose default export is a blob store (for example `awsS3BlobStore` from `@absolutejs/blob/aws-s3`) and `absolute start` and `absolute compile` read the history from it and write each new release back. Releases that only an existing build directory knows are copied into the store on the first build, and `mobile.compatibility.prefix` keeps several apps or environments in one bucket apart. The store does not change the app's runtime fingerprint.",
9
+ "kind": "added",
10
+ "summary": "Mobile release history can live in a blob store, so CI builds keep serving installed apps",
11
+ "symbols": [
12
+ "NormalizedAbsoluteMobileConfig"
13
+ ]
14
+ },
15
+ {
16
+ "detail": "PDF assets were served without a PDF content type in `absolute dev` and in compiled apps, so browsers could download them instead of opening them. They are now served as `application/pdf`.",
17
+ "kind": "fixed",
18
+ "summary": "PDF assets are served as application/pdf"
19
+ },
20
+ {
21
+ "detail": "A push sent with `deepLink` carried it to the device as `absoluteDeepLink`, but tapping the notification only opened the app. Tapping it now opens that page inside the app, in Capacitor and Expo apps alike. The link takes the same route as any other deep link, so only the app's configured HTTPS hosts and its URL scheme are opened; anything else is ignored. Action buttons other than the notification body are still left to the app's own `pushNotifications.onAction` listener.",
22
+ "kind": "added",
23
+ "summary": "Tapping a push notification opens its deepLink inside the app"
24
+ }
25
+ ],
26
+ "date": "2026-10-08",
27
+ "version": "0.20.0-beta.134"
28
+ },
29
+ {
30
+ "changes": [
31
+ {
32
+ "detail": "`absolute dev` and `absolute bun-patch` now install AbsoluteJS's patched Bun with bvm (`@absolutejs/bvm`, a new dependency), which checks the release's checksum list against the AbsoluteJS release key's Ed25519 signature before anything runs. The CLI no longer downloads and unzips the build itself or pins a SHA-256 per platform, so a new patched build no longer needs a framework release. A patched build installed by an earlier release in `~/.absolutejs/bun` moves onto bvm's copy on the next `absolute dev`. bvm has builds for Linux, macOS and Windows on x64 and arm64; FreeBSD and Android no longer get the offer.",
33
+ "kind": "changed",
34
+ "summary": "The patched Bun for React Fast Refresh is installed and verified by bvm"
35
+ }
36
+ ],
37
+ "date": "2026-10-06",
38
+ "version": "0.20.0-beta.133"
39
+ },
5
40
  {
6
41
  "changes": [
7
42
  {
@@ -1,5 +1,5 @@
1
1
  // @bun
2
- // .angular-partial-tmp-tlgEoz/src/core/streamingSlotRegistrar.ts
2
+ // .angular-partial-tmp-47WTEl/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-tlgEoz/src/core/streamingSlotRegistrar.ts
2
+ // .angular-partial-tmp-47WTEl/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-tlgEoz/src/core/streamingSlotRegistry.ts
49
+ // .angular-partial-tmp-47WTEl/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";
package/dist/build.js CHANGED
@@ -21637,7 +21637,7 @@ var init_compileAngular = __esm(() => {
21637
21637
 
21638
21638
  // node_modules/content-tag/pkg/node/content_tag.cjs
21639
21639
  var require_content_tag = __commonJS(function(exports, module) {
21640
- var __dirname = "/tmp/claude-1000/-home-alexkahn-abs-PAAS/9b0057a2-5737-48f9-9dbe-dcb83ea02b04/scratchpad/ajs-peer/node_modules/content-tag/pkg/node";
21640
+ var __dirname = "/home/runner/work/absolutejs/absolutejs/node_modules/content-tag/pkg/node";
21641
21641
  var imports = {};
21642
21642
  imports["__wbindgen_placeholder__"] = exports;
21643
21643
  var wasm;
@@ -25764,6 +25764,7 @@ var init_assetStore = __esm(() => {
25764
25764
  ".map": "application/json",
25765
25765
  ".mjs": "application/javascript",
25766
25766
  ".otf": "font/otf",
25767
+ ".pdf": "application/pdf",
25767
25768
  ".png": "image/png",
25768
25769
  ".svg": "image/svg+xml",
25769
25770
  ".ttf": "font/ttf",
@@ -27987,6 +27988,14 @@ var APP_ID_PATTERN, SCHEME_PATTERN, APPLE_APP_ID_PREFIX_PATTERN, CERTIFICATE_FIN
27987
27988
  appName: requireText(config.appName, "mobile.appName"),
27988
27989
  ...branding ? { branding } : {},
27989
27990
  bundleDirectory: resolveProjectPath(projectRoot, config.bundleDirectory ?? ".absolutejs/mobile/web", "mobile.bundleDirectory"),
27991
+ ...config.compatibility ? {
27992
+ compatibilityStore: {
27993
+ modulePath: resolveProjectPath(projectRoot, requireText(config.compatibility.store, "mobile.compatibility.store"), "mobile.compatibility.store"),
27994
+ ...config.compatibility.prefix === undefined ? {} : {
27995
+ prefix: requireText(config.compatibility.prefix, "mobile.compatibility.prefix")
27996
+ }
27997
+ }
27998
+ } : {},
27990
27999
  deepLinkHosts: normalizeHosts(config.deepLinks?.hosts, productionOrigin),
27991
28000
  deepLinkScheme,
27992
28001
  engine: config.engine ?? "capacitor",
@@ -30064,6 +30073,7 @@ import {
30064
30073
  writeFile as writeFile11
30065
30074
  } from "fs/promises";
30066
30075
  import { join as join56, resolve as resolvePath } from "path";
30076
+ import { pathToFileURL as pathToFileURL4 } from "url";
30067
30077
  var DEFAULT_MAX_PRODUCER_BYTES = 134217728, SHA_2562 = "sha256", ARTIFACT_FILE = "artifact.json", RELEASE_ID_PATTERN, DEFAULT_BLOB_PREFIX = "absolutejs/mobile-compatibility", hashBlob = async (blob) => {
30068
30078
  const bytes = new Uint8Array(await blob.arrayBuffer());
30069
30079
  return createHash7(SHA_2562).update(bytes).digest("hex");
@@ -30242,6 +30252,17 @@ var DEFAULT_MAX_PRODUCER_BYTES = 134217728, SHA_2562 = "sha256", ARTIFACT_FILE =
30242
30252
  }
30243
30253
  }
30244
30254
  };
30255
+ }, isFunctionRecord = (value, keys) => typeof value === "object" && value !== null && keys.every((key) => typeof Reflect.get(value, key) === "function"), isArtifactStore = (value) => isFunctionRecord(value, ["delete", "list", "read", "write"]), isBlobStore = (value) => isFunctionRecord(value, ["delete", "get", "list", "put"]), loadAbsoluteMobileCompatibilityStore = async (options) => {
30256
+ const loaded = await import(pathToFileURL4(options.modulePath).href);
30257
+ const exported = typeof loaded === "object" && loaded !== null ? Reflect.get(loaded, "default") ?? Reflect.get(loaded, "store") : undefined;
30258
+ if (isArtifactStore(exported))
30259
+ return exported;
30260
+ if (isBlobStore(exported))
30261
+ return createAbsoluteMobileBlobArtifactStore({
30262
+ ...options.prefix === undefined ? {} : { prefix: options.prefix },
30263
+ store: exported
30264
+ });
30265
+ throw new TypeError(`mobile.compatibility.store (${options.modulePath}) must export a blob store with get, put, list and delete.`);
30245
30266
  }, verifyAbsoluteMobileCompatibilityProducer = async (release, maxProducerBytes = DEFAULT_MAX_PRODUCER_BYTES) => {
30246
30267
  const { artifact, producer } = release;
30247
30268
  if (producer.size !== artifact.producer.bytes || producer.size > maxProducerBytes) {
@@ -30276,7 +30297,7 @@ import {
30276
30297
  writeFile as writeFile12
30277
30298
  } from "fs/promises";
30278
30299
  import { dirname as dirname34, join as join57, resolve as resolvePath2 } from "path";
30279
- import { pathToFileURL as pathToFileURL4 } from "url";
30300
+ import { pathToFileURL as pathToFileURL5 } from "url";
30280
30301
  var ABSOLUTE_MOBILE_MATERIALIZED_BUNDLE_FORMAT = 1, CURRENT_BUNDLE_FILE = "current.json", BUNDLES_DIRECTORY = "bundles", ARTIFACT_FILE2 = "artifact.json", BUNDLE_ID_PATTERN, isRecord9 = (value) => typeof value === "object" && value !== null && !Array.isArray(value), errorHasCode2 = (error, code) => typeof error === "object" && error !== null && Reflect.get(error, "code") === code, bundleIdFor = (currentReleaseId, releases) => {
30281
30302
  const identity = JSON.stringify({
30282
30303
  currentReleaseId,
@@ -30335,7 +30356,7 @@ var ABSOLUTE_MOBILE_MATERIALIZED_BUNDLE_FORMAT = 1, CURRENT_BUNDLE_FILE = "curre
30335
30356
  throw error;
30336
30357
  }
30337
30358
  return destination;
30338
- }, readCompatibilityModule = (modulePath) => import(pathToFileURL4(modulePath).href), resolveProducerHandler = (loaded, exportName) => {
30359
+ }, readCompatibilityModule = (modulePath) => import(pathToFileURL5(modulePath).href), resolveProducerHandler = (loaded, exportName) => {
30339
30360
  const value = loaded[exportName];
30340
30361
  if (!isRecord9(value) || typeof value.handle !== "function") {
30341
30362
  throw new TypeError(`Compatibility producer export ${exportName} must expose handle(request).`);
@@ -37596,5 +37617,5 @@ export {
37596
37617
  devBuild
37597
37618
  };
37598
37619
 
37599
- //# debugId=D76E41A35661D4E064756E2164756E21
37620
+ //# debugId=38D11963F42C01EC64756E2164756E21
37600
37621
  //# sourceMappingURL=build.js.map