@absolutejs/absolute 0.20.0-beta.123 → 0.20.0-beta.125

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,22 @@ 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.125 — 2026-09-29
10
+
11
+ ### Fixed
12
+
13
+ - **Vue pages that reach a helper through a re-export build again**
14
+ The Vue build copies every `.ts` helper a page reaches into its generated tree, but it found them with a regex that only matched `import … from`. A helper reached only through a re-export (`export { x } from './y'` or `export * from './y'`) was never copied, so the build failed with `Could not resolve: "./y"` and every page above it answered 500 in dev. Dependencies are now read with Bun's import scanner, which sees imports, dynamic imports and all three re-export forms; a regex that also covers re-exports is the fallback for source that does not parse.
15
+
16
+ ## 0.20.0-beta.124 — 2026-09-28
17
+
18
+ ### Fixed
19
+
20
+ - **Projects on a current `@absolutejs/auth` no longer get a second, older copy**
21
+ AbsoluteJS accepted `@absolutejs/auth` only below 0.77, so a project that added a current auth (0.77 to 0.96) got two copies: its own, plus 0.76.3 nested under AbsoluteJS for the mobile shell. The duplicate also doubled the auth type declarations TypeScript loads. AbsoluteJS now accepts auth up to 0.96. The `@absolutejs/auth/client/mobile` API it uses is byte-identical from 0.76.3 to 0.96.0, in both its declarations and its runtime.
22
+ - **`/hmr-status` no longer counts closed or duplicate HMR clients** (`HMRWebSocket`)
23
+ Elysia 2 hands every open, message and close event of a WebSocket a new wrapper object. The dev server tracked HMR clients by that wrapper, so a closed browser tab was never removed (it stayed until a broadcast send threw) and each `ready` message counted the same tab again under `connectedTargets`, so `/hmr-status` reported clients that were gone and more web targets than open sockets. Clients are now tracked by the underlying socket.
24
+
9
25
  ## 0.20.0-beta.123 — 2026-09-28
10
26
 
11
27
  ### Added
package/changelog.json CHANGED
@@ -2,6 +2,36 @@
2
2
  "contract": 1,
3
3
  "name": "@absolutejs/absolute",
4
4
  "releases": [
5
+ {
6
+ "changes": [
7
+ {
8
+ "detail": "The Vue build copies every `.ts` helper a page reaches into its generated tree, but it found them with a regex that only matched `import … from`. A helper reached only through a re-export (`export { x } from './y'` or `export * from './y'`) was never copied, so the build failed with `Could not resolve: \"./y\"` and every page above it answered 500 in dev. Dependencies are now read with Bun's import scanner, which sees imports, dynamic imports and all three re-export forms; a regex that also covers re-exports is the fallback for source that does not parse.",
9
+ "kind": "fixed",
10
+ "summary": "Vue pages that reach a helper through a re-export build again"
11
+ }
12
+ ],
13
+ "date": "2026-09-29",
14
+ "version": "0.20.0-beta.125"
15
+ },
16
+ {
17
+ "changes": [
18
+ {
19
+ "detail": "AbsoluteJS accepted `@absolutejs/auth` only below 0.77, so a project that added a current auth (0.77 to 0.96) got two copies: its own, plus 0.76.3 nested under AbsoluteJS for the mobile shell. The duplicate also doubled the auth type declarations TypeScript loads. AbsoluteJS now accepts auth up to 0.96. The `@absolutejs/auth/client/mobile` API it uses is byte-identical from 0.76.3 to 0.96.0, in both its declarations and its runtime.",
20
+ "kind": "fixed",
21
+ "summary": "Projects on a current `@absolutejs/auth` no longer get a second, older copy"
22
+ },
23
+ {
24
+ "detail": "Elysia 2 hands every open, message and close event of a WebSocket a new wrapper object. The dev server tracked HMR clients by that wrapper, so a closed browser tab was never removed (it stayed until a broadcast send threw) and each `ready` message counted the same tab again under `connectedTargets`, so `/hmr-status` reported clients that were gone and more web targets than open sockets. Clients are now tracked by the underlying socket.",
25
+ "kind": "fixed",
26
+ "summary": "`/hmr-status` no longer counts closed or duplicate HMR clients",
27
+ "symbols": [
28
+ "HMRWebSocket"
29
+ ]
30
+ }
31
+ ],
32
+ "date": "2026-09-28",
33
+ "version": "0.20.0-beta.124"
34
+ },
5
35
  {
6
36
  "changes": [
7
37
  {
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  var __require = import.meta.require;
3
3
 
4
- // .angular-partial-tmp-TZvQHy/src/core/streamingSlotRegistrar.ts
4
+ // .angular-partial-tmp-xJT9Ow/src/core/streamingSlotRegistrar.ts
5
5
  var STREAMING_SLOT_REGISTRAR_KEY = Symbol.for("absolutejs.streamingSlotRegistrar");
6
6
  var STREAMING_SLOT_WARNING_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotWarningController");
7
7
  var STREAMING_SLOT_COLLECTION_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotCollectionController");
@@ -1,7 +1,7 @@
1
1
  // @bun
2
2
  var __require = import.meta.require;
3
3
 
4
- // .angular-partial-tmp-TZvQHy/src/core/streamingSlotRegistrar.ts
4
+ // .angular-partial-tmp-xJT9Ow/src/core/streamingSlotRegistrar.ts
5
5
  var STREAMING_SLOT_REGISTRAR_KEY = Symbol.for("absolutejs.streamingSlotRegistrar");
6
6
  var STREAMING_SLOT_WARNING_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotWarningController");
7
7
  var STREAMING_SLOT_COLLECTION_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotCollectionController");
@@ -48,7 +48,7 @@ var warnMissingStreamingSlotCollector = (primitiveName) => {
48
48
  getWarningController()?.maybeWarn(primitiveName);
49
49
  };
50
50
 
51
- // .angular-partial-tmp-TZvQHy/src/core/streamingSlotRegistry.ts
51
+ // .angular-partial-tmp-xJT9Ow/src/core/streamingSlotRegistry.ts
52
52
  var STREAMING_SLOT_STORAGE_KEY = Symbol.for("absolutejs.streamingSlotAsyncLocalStorage");
53
53
  var isObjectRecord2 = (value) => Boolean(value) && typeof value === "object";
54
54
  var isAsyncLocalStorage = (value) => isObjectRecord2(value) && ("getStore" in value) && typeof value.getStore === "function" && ("run" in value) && typeof value.run === "function";
package/dist/build.js CHANGED
@@ -19439,10 +19439,14 @@ var resolveDevClientDir3 = () => {
19439
19439
  return "template-only";
19440
19440
  }
19441
19441
  return "full";
19442
- }, generateVueHmrId = (sourceFilePath, vueRootDir) => relative17(vueRootDir, sourceFilePath).replace(/\\/g, "/").replace(/\.vue$/, ""), extractImports = (sourceCode) => {
19443
- const staticImports = Array.from(sourceCode.matchAll(/import\s+[\s\S]+?['"]([^'"]+)['"]/g));
19444
- const dynamicImports = Array.from(sourceCode.matchAll(/\bimport\s*\(\s*['"]([^'"]+)['"]\s*\)/g));
19445
- return Array.from(new Set([...staticImports, ...dynamicImports].map((match) => match[1]).filter((importPath) => importPath !== undefined)));
19442
+ }, generateVueHmrId = (sourceFilePath, vueRootDir) => relative17(vueRootDir, sourceFilePath).replace(/\\/g, "/").replace(/\.vue$/, ""), importScanner, IMPORT_PATTERNS, matchImports = (sourceCode) => IMPORT_PATTERNS.flatMap((pattern) => Array.from(sourceCode.matchAll(pattern), (match) => match[1])).filter((importPath) => importPath !== undefined), extractImports = (sourceCode) => {
19443
+ let found;
19444
+ try {
19445
+ found = importScanner.scanImports(sourceCode).map(({ path }) => path);
19446
+ } catch {
19447
+ found = matchImports(sourceCode);
19448
+ }
19449
+ return Array.from(new Set(found));
19446
19450
  }, resolveHelperTsPath = (sourceDir, helper) => {
19447
19451
  if (helper.endsWith(".ts"))
19448
19452
  return resolve28(sourceDir, helper);
@@ -20017,6 +20021,12 @@ var init_compileVue = __esm(() => {
20017
20021
  persistentBuildCache = new Map;
20018
20022
  vueSourceHashCache = new Map;
20019
20023
  vueHmrMetadata = new Map;
20024
+ importScanner = new Bun.Transpiler({ loader: "ts" });
20025
+ IMPORT_PATTERNS = [
20026
+ /import\s+[\s\S]+?['"]([^'"]+)['"]/g,
20027
+ /\bimport\s*\(\s*['"]([^'"]+)['"]\s*\)/g,
20028
+ /\bexport\s+(?:type\s+)?(?:\*(?:\s+as\s+[\w$]+)?|\{[^}]*\})\s*from\s*['"]([^'"]+)['"]/g
20029
+ ];
20020
20030
  EXTERNAL_STYLE_DEPENDENCY = /@(?:import|use|forward)\b/;
20021
20031
  fingerprintCache2 = new Map;
20022
20032
  pendingWrites = new Set;
@@ -26803,6 +26813,15 @@ var MAX_RETAINED_HMR_UPDATES = 100, normalizedHmrTarget = (value) => {
26803
26813
  const oldest = state.hmrUpdates.keys().next().value;
26804
26814
  if (typeof oldest === "number")
26805
26815
  state.hmrUpdates.delete(oldest);
26816
+ }, canonicalClients, canonicalClient = (client) => {
26817
+ const { raw } = client;
26818
+ if (!raw)
26819
+ return client;
26820
+ const known = canonicalClients.get(raw);
26821
+ if (known)
26822
+ return known;
26823
+ canonicalClients.set(raw, client);
26824
+ return client;
26806
26825
  }, trySendMessage = (client, messageStr) => {
26807
26826
  try {
26808
26827
  client.send(messageStr);
@@ -26829,7 +26848,7 @@ var MAX_RETAINED_HMR_UPDATES = 100, normalizedHmrTarget = (value) => {
26829
26848
  state.clientTargets.delete(client);
26830
26849
  });
26831
26850
  }, handleClientConnect = (state, client, manifest) => {
26832
- state.connectedClients.add(client);
26851
+ state.connectedClients.add(canonicalClient(client));
26833
26852
  const serverVersions = serializeModuleVersions(state.moduleVersions);
26834
26853
  client.send(JSON.stringify({
26835
26854
  data: {
@@ -26866,8 +26885,11 @@ var MAX_RETAINED_HMR_UPDATES = 100, normalizedHmrTarget = (value) => {
26866
26885
  }));
26867
26886
  }
26868
26887
  }, handleClientDisconnect = (state, client) => {
26869
- state.connectedClients.delete(client);
26870
- state.clientTargets.delete(client);
26888
+ const known = canonicalClient(client);
26889
+ state.connectedClients.delete(known);
26890
+ state.clientTargets.delete(known);
26891
+ if (client.raw)
26892
+ canonicalClients.delete(client.raw);
26871
26893
  }, parseJsonSafe = (raw) => JSON.parse(raw), parseMessage = (message) => {
26872
26894
  if (typeof message === "string") {
26873
26895
  return parseJsonSafe(message);
@@ -26943,12 +26965,13 @@ var MAX_RETAINED_HMR_UPDATES = 100, normalizedHmrTarget = (value) => {
26943
26965
  if (!isValidHMRClientMessage(parsedData)) {
26944
26966
  return;
26945
26967
  }
26946
- handleParsedMessage(state, client, parsedData);
26968
+ handleParsedMessage(state, canonicalClient(client), parsedData);
26947
26969
  } catch {}
26948
26970
  };
26949
26971
  var init_webSocket = __esm(() => {
26950
26972
  init_telemetryEvent();
26951
26973
  init_logger();
26974
+ canonicalClients = new WeakMap;
26952
26975
  });
26953
26976
 
26954
26977
  // src/utils/loadConfig.ts
@@ -38159,5 +38182,5 @@ export {
38159
38182
  devBuild
38160
38183
  };
38161
38184
 
38162
- //# debugId=71208AEC5F61453764756E2164756E21
38185
+ //# debugId=1A9F6B3E887493E464756E2164756E21
38163
38186
  //# sourceMappingURL=build.js.map