@absolutejs/absolute 0.20.0-beta.126 → 0.20.0-beta.128
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 +18 -0
- package/README.md +19 -0
- package/changelog.json +36 -0
- package/dist/angular/components/core/streamingSlotRegistrar.js +1 -1
- package/dist/angular/components/core/streamingSlotRegistry.js +2 -2
- package/dist/angular/index.js +88 -35
- package/dist/angular/index.js.map +8 -7
- package/dist/angular/server.js +88 -35
- package/dist/angular/server.js.map +8 -7
- package/dist/build/buildWorker.js +9 -3
- package/dist/build.js +342 -263
- package/dist/build.js.map +14 -12
- package/dist/cli/{compile-smcnjyhb.js → compile-0epdbdcx.js} +1 -1
- package/dist/cli/config/server.js +91 -52
- package/dist/cli/{index-9q8yn5ax.js → index-54q7pxcx.js} +1 -0
- package/dist/cli/{index-fx42yxhy.js → index-79ppyst7.js} +1 -1
- package/dist/cli/index.js +4 -4
- package/dist/cli/{mobile-50c5tahh.js → mobile-49hyrgrj.js} +1 -1
- package/dist/cli/{prerender-vvrj9vjg.js → prerender-yex2zwj3.js} +1 -1
- package/dist/cli/{start-pdacfgcc.js → start-m0p0qbep.js} +1 -1
- package/dist/index.js +362 -279
- package/dist/index.js.map +17 -14
- package/dist/islands/index.js +10 -4
- package/dist/islands/index.js.map +5 -4
- package/dist/mobile/remoteMacAgentEntry.js +1 -1
- package/dist/react/index.js +114 -61
- package/dist/react/index.js.map +8 -7
- package/dist/react/server.js +105 -58
- package/dist/react/server.js.map +6 -6
- package/dist/src/core/requestContext.d.ts +5 -10
- package/dist/src/dev/restartScope.d.ts +1 -0
- package/dist/src/utils/index.d.ts +1 -0
- package/dist/src/utils/isFile.d.ts +4 -0
- package/dist/src/utils/isPrerendering.d.ts +5 -0
- package/dist/src/utils/ssrErrorPage.d.ts +3 -0
- package/dist/svelte/index.js +114 -61
- package/dist/svelte/index.js.map +8 -7
- package/dist/svelte/server.js +105 -58
- package/dist/svelte/server.js.map +6 -6
- package/dist/vue/index.js +114 -61
- package/dist/vue/index.js.map +8 -7
- package/dist/vue/server.js +105 -58
- package/dist/vue/server.js.map +6 -6
- package/package.json +2 -2
package/CHANGELOG.md
CHANGED
|
@@ -6,6 +6,24 @@ 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.128 — 2026-10-03
|
|
10
|
+
|
|
11
|
+
### Fixed
|
|
12
|
+
|
|
13
|
+
- **A page that fails to build in development shows the real build error and reloads itself once fixed** (`DeferredPageAssets`, `DevPageWarmer`)
|
|
14
|
+
When a page failed its on-demand build in development, the handler threw `Asset "<Page>" not found in manifest.` and left the response to whichever error handler answered first. An app with its own `onError` (most real apps) showed its generic error page, so the actual cause — a missing import, a syntax error — was only in the terminal. Page handlers for Vue, React, Svelte, Angular and Ember now return a Build Error page themselves, with the build's own error message, and the page reloads by itself once a rebuild lands or the dev server comes back. AbsoluteJS's fallback error page for missing assets shows the same build error.
|
|
15
|
+
- **Editing docs, tests or code the server never loaded no longer restarts the dev server**
|
|
16
|
+
Any changed file no HMR pipeline handled restarted the dev server, including documentation and test files the server never runs. Each restart dropped every open page for seconds and rebuilt them from nothing. Now documents (`.md`, `.txt`, …) and test files never restart it; code modules restart it only when the running server process has loaded them (a module nothing has imported yet loads fresh on first use); config such as `.env`, `package.json` and `tsconfig.json` still does.
|
|
17
|
+
|
|
18
|
+
## 0.20.0-beta.127 — 2026-10-03
|
|
19
|
+
|
|
20
|
+
### Fixed
|
|
21
|
+
|
|
22
|
+
- **Projects on `@absolutejs/auth` 0.97 no longer get a second, older copy**
|
|
23
|
+
AbsoluteJS accepted `@absolutejs/auth` only below 0.97, so a project on auth 0.97 got a second, older copy nested under AbsoluteJS. It now accepts auth up to 0.97. Between 0.96.0 and 0.97.0 the `@absolutejs/auth/client/mobile` declarations are byte-identical, and its runtime differs only in bundler helpers and local variable names.
|
|
24
|
+
- **Vue pages whose prop types come through a directory index build again instead of failing with EISDIR**
|
|
25
|
+
Vue resolves an imported prop or emit type by probing the import path as written before trying `<path>.ts` and `<path>/index.ts`. AbsoluteJS answered that probe with `existsSync`, which is true for a directory, so Vue read the directory and the page failed to build with `EISDIR: illegal operation on a directory, read`. In development the page then answered `Asset "<Page>" not found in manifest`. Any type reached through `export * from './folder'` triggered it, which includes `@absolutejs/auth` 0.97's declarations. Type resolution and CSS `@import` inlining now accept only regular files.
|
|
26
|
+
|
|
9
27
|
## 0.20.0-beta.126 — 2026-10-01
|
|
10
28
|
|
|
11
29
|
### Fixed
|
package/README.md
CHANGED
|
@@ -435,3 +435,22 @@ Pull requests and issues are welcome! Whether it’s a new plugin, framework han
|
|
|
435
435
|
## License
|
|
436
436
|
|
|
437
437
|
**Business Source License 1.1 (BSL-1.1)** – see [`LICENSE`](./LICENSE) for details.
|
|
438
|
+
|
|
439
|
+
## Background work during prerendering
|
|
440
|
+
|
|
441
|
+
Builds can start a temporary application server to render pages. This process
|
|
442
|
+
inherits application configuration and is stopped once rendering finishes; it
|
|
443
|
+
must not start billing, queues, scheduled emails, or other durable workers.
|
|
444
|
+
Absolute sets `ABSOLUTE_PRERENDER=1` on this child, overriding inherited values.
|
|
445
|
+
Use the runtime helper before starting background work:
|
|
446
|
+
|
|
447
|
+
```ts
|
|
448
|
+
import { isPrerendering } from '@absolutejs/absolute';
|
|
449
|
+
|
|
450
|
+
if (!isPrerendering()) {
|
|
451
|
+
startBackgroundWorkers();
|
|
452
|
+
}
|
|
453
|
+
```
|
|
454
|
+
|
|
455
|
+
This is a lifecycle signal, not a sandbox: unguarded application side effects
|
|
456
|
+
can still run. Do not set this flag in the deployed server's environment.
|
package/changelog.json
CHANGED
|
@@ -2,6 +2,42 @@
|
|
|
2
2
|
"contract": 1,
|
|
3
3
|
"name": "@absolutejs/absolute",
|
|
4
4
|
"releases": [
|
|
5
|
+
{
|
|
6
|
+
"changes": [
|
|
7
|
+
{
|
|
8
|
+
"detail": "When a page failed its on-demand build in development, the handler threw `Asset \"<Page>\" not found in manifest.` and left the response to whichever error handler answered first. An app with its own `onError` (most real apps) showed its generic error page, so the actual cause — a missing import, a syntax error — was only in the terminal. Page handlers for Vue, React, Svelte, Angular and Ember now return a Build Error page themselves, with the build's own error message, and the page reloads by itself once a rebuild lands or the dev server comes back. AbsoluteJS's fallback error page for missing assets shows the same build error.",
|
|
9
|
+
"kind": "fixed",
|
|
10
|
+
"symbols": [
|
|
11
|
+
"DeferredPageAssets",
|
|
12
|
+
"DevPageWarmer"
|
|
13
|
+
],
|
|
14
|
+
"summary": "A page that fails to build in development shows the real build error and reloads itself once fixed"
|
|
15
|
+
},
|
|
16
|
+
{
|
|
17
|
+
"detail": "Any changed file no HMR pipeline handled restarted the dev server, including documentation and test files the server never runs. Each restart dropped every open page for seconds and rebuilt them from nothing. Now documents (`.md`, `.txt`, …) and test files never restart it; code modules restart it only when the running server process has loaded them (a module nothing has imported yet loads fresh on first use); config such as `.env`, `package.json` and `tsconfig.json` still does.",
|
|
18
|
+
"kind": "fixed",
|
|
19
|
+
"summary": "Editing docs, tests or code the server never loaded no longer restarts the dev server"
|
|
20
|
+
}
|
|
21
|
+
],
|
|
22
|
+
"date": "2026-10-03",
|
|
23
|
+
"version": "0.20.0-beta.128"
|
|
24
|
+
},
|
|
25
|
+
{
|
|
26
|
+
"changes": [
|
|
27
|
+
{
|
|
28
|
+
"detail": "AbsoluteJS accepted `@absolutejs/auth` only below 0.97, so a project on auth 0.97 got a second, older copy nested under AbsoluteJS. It now accepts auth up to 0.97. Between 0.96.0 and 0.97.0 the `@absolutejs/auth/client/mobile` declarations are byte-identical, and its runtime differs only in bundler helpers and local variable names.",
|
|
29
|
+
"kind": "fixed",
|
|
30
|
+
"summary": "Projects on `@absolutejs/auth` 0.97 no longer get a second, older copy"
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
"detail": "Vue resolves an imported prop or emit type by probing the import path as written before trying `<path>.ts` and `<path>/index.ts`. AbsoluteJS answered that probe with `existsSync`, which is true for a directory, so Vue read the directory and the page failed to build with `EISDIR: illegal operation on a directory, read`. In development the page then answered `Asset \"<Page>\" not found in manifest`. Any type reached through `export * from './folder'` triggered it, which includes `@absolutejs/auth` 0.97's declarations. Type resolution and CSS `@import` inlining now accept only regular files.",
|
|
34
|
+
"kind": "fixed",
|
|
35
|
+
"summary": "Vue pages whose prop types come through a directory index build again instead of failing with EISDIR"
|
|
36
|
+
}
|
|
37
|
+
],
|
|
38
|
+
"date": "2026-10-03",
|
|
39
|
+
"version": "0.20.0-beta.127"
|
|
40
|
+
},
|
|
5
41
|
{
|
|
6
42
|
"changes": [
|
|
7
43
|
{
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
// @bun
|
|
2
2
|
var __require = import.meta.require;
|
|
3
3
|
|
|
4
|
-
// .angular-partial-tmp-
|
|
4
|
+
// .angular-partial-tmp-hgUVbA/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-
|
|
4
|
+
// .angular-partial-tmp-hgUVbA/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-
|
|
51
|
+
// .angular-partial-tmp-hgUVbA/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/angular/index.js
CHANGED
|
@@ -371,9 +371,16 @@ var init_inlinePageCss = __esm(() => {
|
|
|
371
371
|
// src/utils/ssrErrorPage.ts
|
|
372
372
|
var exports_ssrErrorPage = {};
|
|
373
373
|
__export(exports_ssrErrorPage, {
|
|
374
|
+
buildErrorPage: () => buildErrorPage,
|
|
374
375
|
ssrErrorPage: () => ssrErrorPage
|
|
375
376
|
});
|
|
376
|
-
var
|
|
377
|
+
var errorPageHtml = ({
|
|
378
|
+
framework,
|
|
379
|
+
hint,
|
|
380
|
+
kind,
|
|
381
|
+
message,
|
|
382
|
+
script = ""
|
|
383
|
+
}) => {
|
|
377
384
|
const frameworkColors = {
|
|
378
385
|
angular: "#dd0031",
|
|
379
386
|
html: "#e34c26",
|
|
@@ -384,7 +391,6 @@ var ssrErrorPage = (framework, error) => {
|
|
|
384
391
|
};
|
|
385
392
|
const accent = frameworkColors[framework] ?? "#94a3b8";
|
|
386
393
|
const label = framework.charAt(0).toUpperCase() + framework.slice(1);
|
|
387
|
-
const message = error instanceof Error ? error.message : String(error);
|
|
388
394
|
return `<!DOCTYPE html>
|
|
389
395
|
<html>
|
|
390
396
|
<head>
|
|
@@ -412,17 +418,31 @@ body{min-height:100vh;background:linear-gradient(135deg,rgba(15,23,42,0.98) 0%,r
|
|
|
412
418
|
<span class="brand">AbsoluteJS</span>
|
|
413
419
|
<span class="badge">${label}</span>
|
|
414
420
|
</div>
|
|
415
|
-
<span class="kind"
|
|
421
|
+
<span class="kind">${kind}</span>
|
|
416
422
|
</div>
|
|
417
423
|
<div class="content">
|
|
418
424
|
<div class="label">What went wrong</div>
|
|
419
425
|
<pre class="message">${message.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">")}</pre>
|
|
420
|
-
<div class="hint"
|
|
426
|
+
<div class="hint">${hint}</div>
|
|
421
427
|
</div>
|
|
422
428
|
</div>
|
|
429
|
+
${script}
|
|
423
430
|
</body>
|
|
424
431
|
</html>`;
|
|
425
|
-
};
|
|
432
|
+
}, RELOAD_ON_REBUILD = `<script>(()=>{const url=(location.protocol==='https:'?'wss://':'ws://')+location.host+'/hmr';let seen=false;const connect=()=>{const socket=new WebSocket(url);socket.onopen=()=>{if(seen)location.reload();seen=true;};socket.onmessage=(event)=>{try{const message=JSON.parse(event.data);const type=message&&typeof message.type==='string'?message.type:'';if(type==='rebuild-complete'||type==='server-entry-reloaded'||type.endsWith('-update'))location.reload();}catch{}};socket.onclose=()=>setTimeout(connect,500);};connect();})();</script>`, buildErrorPage = (framework, pageName, error) => errorPageHtml({
|
|
433
|
+
framework,
|
|
434
|
+
hint: "Fix the file and save. This page reloads by itself when the build succeeds.",
|
|
435
|
+
kind: "Build Error",
|
|
436
|
+
message: `${pageName || "This page"} could not be built.
|
|
437
|
+
|
|
438
|
+
${error ?? "The dev-server terminal has the build output."}`,
|
|
439
|
+
script: RELOAD_ON_REBUILD
|
|
440
|
+
}), ssrErrorPage = (framework, error) => errorPageHtml({
|
|
441
|
+
framework,
|
|
442
|
+
hint: "A component threw during server-side rendering. Check the terminal for the full stack trace.",
|
|
443
|
+
kind: "Server Render Error",
|
|
444
|
+
message: error instanceof Error ? error.message : String(error)
|
|
445
|
+
});
|
|
426
446
|
|
|
427
447
|
// src/utils/stringModifiers.ts
|
|
428
448
|
var normalizeSlug = (str) => str.trim().replace(/\s+/g, "-").replace(/[^A-Za-z0-9\-_]+/g, "").replace(/[-_]{2,}/g, "-"), toKebab = (str) => normalizeSlug(str).replace(/([a-z0-9])([A-Z])/g, "$1-$2").toLowerCase(), toPascal = (str) => {
|
|
@@ -2877,6 +2897,11 @@ var init_svelteServerModule = __esm(() => {
|
|
|
2877
2897
|
});
|
|
2878
2898
|
});
|
|
2879
2899
|
|
|
2900
|
+
// src/utils/isFile.ts
|
|
2901
|
+
import { statSync } from "fs";
|
|
2902
|
+
var isFile = (path) => statSync(path, { throwIfNoEntry: false })?.isFile() ?? false;
|
|
2903
|
+
var init_isFile = () => {};
|
|
2904
|
+
|
|
2880
2905
|
// src/utils/vueCompiler.ts
|
|
2881
2906
|
var exports_vueCompiler = {};
|
|
2882
2907
|
__export(exports_vueCompiler, {
|
|
@@ -2895,7 +2920,7 @@ var createVueCompiler = async () => {
|
|
|
2895
2920
|
};
|
|
2896
2921
|
|
|
2897
2922
|
// src/core/vueServerModule.ts
|
|
2898
|
-
import {
|
|
2923
|
+
import { readFileSync as readFileSync4, realpathSync } from "fs";
|
|
2899
2924
|
import { mkdir as mkdir3 } from "fs/promises";
|
|
2900
2925
|
import { dirname as dirname4, join as join7, relative as relative4, resolve as resolve5 } from "path";
|
|
2901
2926
|
var {Transpiler } = globalThis.Bun;
|
|
@@ -2942,9 +2967,9 @@ var ISLAND_COMPONENT_ID_LENGTH = 8, serverCacheRoot3, compiledModuleCache3, tran
|
|
|
2942
2967
|
const hasScript = descriptor.script || descriptor.scriptSetup;
|
|
2943
2968
|
const compiledScript = hasScript ? compiler.compileScript(descriptor, {
|
|
2944
2969
|
fs: {
|
|
2945
|
-
fileExists:
|
|
2970
|
+
fileExists: isFile,
|
|
2946
2971
|
realpath: realpathSync,
|
|
2947
|
-
readFile: (file) =>
|
|
2972
|
+
readFile: (file) => isFile(file) ? readFileSync4(file, "utf-8") : undefined
|
|
2948
2973
|
},
|
|
2949
2974
|
id: componentId,
|
|
2950
2975
|
inlineTemplate: false
|
|
@@ -2989,6 +3014,7 @@ var ISLAND_COMPONENT_ID_LENGTH = 8, serverCacheRoot3, compiledModuleCache3, tran
|
|
|
2989
3014
|
};
|
|
2990
3015
|
var init_vueServerModule = __esm(() => {
|
|
2991
3016
|
init_constants();
|
|
3017
|
+
init_isFile();
|
|
2992
3018
|
serverCacheRoot3 = join7(process.cwd(), ".absolutejs", "islands", "vue");
|
|
2993
3019
|
compiledModuleCache3 = new Map;
|
|
2994
3020
|
transpiler2 = new Transpiler({ loader: "ts", target: "browser" });
|
|
@@ -3321,6 +3347,19 @@ var init_devRouteRegistrationCallsite = __esm(() => {
|
|
|
3321
3347
|
});
|
|
3322
3348
|
|
|
3323
3349
|
// src/core/requestContext.ts
|
|
3350
|
+
var exports_requestContext = {};
|
|
3351
|
+
__export(exports_requestContext, {
|
|
3352
|
+
absoluteRequestContext: () => absoluteRequestContext,
|
|
3353
|
+
devBuildErrorResponse: () => devBuildErrorResponse,
|
|
3354
|
+
getCurrentAbsoluteRequest: () => getCurrentAbsoluteRequest,
|
|
3355
|
+
getDevPageWarmer: () => getDevPageWarmer,
|
|
3356
|
+
getMissingAssets: () => getMissingAssets,
|
|
3357
|
+
recordMissingAsset: () => recordMissingAsset,
|
|
3358
|
+
resolveDeferredPageAssets: () => resolveDeferredPageAssets,
|
|
3359
|
+
runWithAbsoluteRequest: () => runWithAbsoluteRequest,
|
|
3360
|
+
setDevPageWarmer: () => setDevPageWarmer,
|
|
3361
|
+
withDeferredStylesheets: () => withDeferredStylesheets
|
|
3362
|
+
});
|
|
3324
3363
|
import { AsyncLocalStorage as AsyncLocalStorage2 } from "async_hooks";
|
|
3325
3364
|
import { Elysia as Elysia2 } from "elysia";
|
|
3326
3365
|
var REQUEST_STORAGE_KEY, PAGE_WARMER_KEY, isAbsoluteRequestStorage = (value) => typeof value === "object" && value !== null && ("getStore" in value) && typeof value.getStore === "function" && ("run" in value) && typeof value.run === "function", getRequestStorage = () => {
|
|
@@ -3333,7 +3372,17 @@ var REQUEST_STORAGE_KEY, PAGE_WARMER_KEY, isAbsoluteRequestStorage = (value) =>
|
|
|
3333
3372
|
const storage = new AsyncLocalStorage2;
|
|
3334
3373
|
Reflect.set(globalThis, REQUEST_STORAGE_KEY, storage);
|
|
3335
3374
|
return storage;
|
|
3336
|
-
}, absoluteRequestContext, getCurrentAbsoluteRequest = () => getRequestStorage()?.getStore()?.request, runWithAbsoluteRequest = (request, callback) => ensureRequestStorage().run({ request }, callback), CSS_KEY_RE, isDevPageWarmer = (value) => typeof value === "object" && value !== null && ("describe" in value) && typeof value.describe === "function" && ("warm" in value) && typeof value.warm === "function" && ("lookup" in value) && typeof value.lookup === "function",
|
|
3375
|
+
}, absoluteRequestContext, getCurrentAbsoluteRequest = () => getRequestStorage()?.getStore()?.request, runWithAbsoluteRequest = (request, callback) => ensureRequestStorage().run({ request }, callback), CSS_KEY_RE, isDevPageWarmer = (value) => typeof value === "object" && value !== null && ("describe" in value) && typeof value.describe === "function" && ("warm" in value) && typeof value.warm === "function" && ("lookup" in value) && typeof value.lookup === "function", devBuildErrorResponse = (framework, assets) => {
|
|
3376
|
+
if (!assets?.failed)
|
|
3377
|
+
return null;
|
|
3378
|
+
return new Response(buildErrorPage(framework, assets.name, assets.error), {
|
|
3379
|
+
headers: {
|
|
3380
|
+
"cache-control": "no-store",
|
|
3381
|
+
"content-type": "text/html; charset=utf-8"
|
|
3382
|
+
},
|
|
3383
|
+
status: 500
|
|
3384
|
+
});
|
|
3385
|
+
}, getDevPageWarmer = () => {
|
|
3337
3386
|
const value = Reflect.get(globalThis, PAGE_WARMER_KEY);
|
|
3338
3387
|
return isDevPageWarmer(value) ? value : undefined;
|
|
3339
3388
|
}, getMissingAssets = () => {
|
|
@@ -3363,6 +3412,7 @@ var REQUEST_STORAGE_KEY, PAGE_WARMER_KEY, isAbsoluteRequestStorage = (value) =>
|
|
|
3363
3412
|
const cssHrefs = () => cssKeys.map(lookup).filter((href) => href.length > 0 && href.startsWith("/"));
|
|
3364
3413
|
const assets = {
|
|
3365
3414
|
cssHrefs,
|
|
3415
|
+
error: failed ? warmer.lastError?.() : undefined,
|
|
3366
3416
|
failed,
|
|
3367
3417
|
lookup,
|
|
3368
3418
|
name: described.name
|
|
@@ -5177,7 +5227,7 @@ __export(exports_compileAngular, {
|
|
|
5177
5227
|
compileAngularFiles: () => compileAngularFiles,
|
|
5178
5228
|
invalidateAngularJitCache: () => invalidateAngularJitCache
|
|
5179
5229
|
});
|
|
5180
|
-
import { existsSync as
|
|
5230
|
+
import { existsSync as existsSync4, readFileSync as readFileSync5, promises as fs } from "fs";
|
|
5181
5231
|
import { join as join9, basename as basename4, sep, dirname as dirname5, resolve as resolve6, relative as relative5 } from "path";
|
|
5182
5232
|
var {Glob } = globalThis.Bun;
|
|
5183
5233
|
import ts from "typescript";
|
|
@@ -5234,7 +5284,7 @@ var atomicWriteSequence = 0, writeTextFileAtomically = async (path, content) =>
|
|
|
5234
5284
|
join9(candidate, "index.js"),
|
|
5235
5285
|
join9(candidate, "index.jsx")
|
|
5236
5286
|
];
|
|
5237
|
-
return candidates.find((file) =>
|
|
5287
|
+
return candidates.find((file) => existsSync4(file));
|
|
5238
5288
|
}, createLegacyAngularAnimationUsageResolver = (rootDir) => {
|
|
5239
5289
|
const baseDir = resolve6(rootDir);
|
|
5240
5290
|
const tsconfigAliases = readTsconfigPathAliases();
|
|
@@ -5315,11 +5365,11 @@ var atomicWriteSequence = 0, writeTextFileAtomically = async (path, content) =>
|
|
|
5315
5365
|
}, resolveDevClientDir = () => {
|
|
5316
5366
|
const projectRoot = process.cwd();
|
|
5317
5367
|
const fromSource = resolve6(import.meta.dir, "../dev/client");
|
|
5318
|
-
if (
|
|
5368
|
+
if (existsSync4(fromSource) && fromSource.startsWith(projectRoot)) {
|
|
5319
5369
|
return fromSource;
|
|
5320
5370
|
}
|
|
5321
5371
|
const fromNodeModules = resolve6(projectRoot, "node_modules/@absolutejs/absolute/dist/dev/client");
|
|
5322
|
-
if (
|
|
5372
|
+
if (existsSync4(fromNodeModules))
|
|
5323
5373
|
return fromNodeModules;
|
|
5324
5374
|
return resolve6(import.meta.dir, "./dev/client");
|
|
5325
5375
|
}, devClientDir, hmrClientPath, formatDiagnosticMessage = (diagnostic) => {
|
|
@@ -5365,11 +5415,11 @@ var atomicWriteSequence = 0, writeTextFileAtomically = async (path, content) =>
|
|
|
5365
5415
|
return `${path}${query}`;
|
|
5366
5416
|
const importerDir = dirname5(importerOutputPath);
|
|
5367
5417
|
const fileCandidate = resolve6(importerDir, `${path}.js`);
|
|
5368
|
-
if (outputFiles?.has(fileCandidate) ||
|
|
5418
|
+
if (outputFiles?.has(fileCandidate) || existsSync4(fileCandidate)) {
|
|
5369
5419
|
return `${path}.js${query}`;
|
|
5370
5420
|
}
|
|
5371
5421
|
const indexCandidate = resolve6(importerDir, path, "index.js");
|
|
5372
|
-
if (outputFiles?.has(indexCandidate) ||
|
|
5422
|
+
if (outputFiles?.has(indexCandidate) || existsSync4(indexCandidate)) {
|
|
5373
5423
|
return `${path}/index.js${query}`;
|
|
5374
5424
|
}
|
|
5375
5425
|
return `${path}.js${query}`;
|
|
@@ -5407,7 +5457,7 @@ var atomicWriteSequence = 0, writeTextFileAtomically = async (path, content) =>
|
|
|
5407
5457
|
join9(basePath, "index.mts"),
|
|
5408
5458
|
join9(basePath, "index.cts")
|
|
5409
5459
|
];
|
|
5410
|
-
return candidates.map((candidate) => resolve6(candidate)).find((candidate) =>
|
|
5460
|
+
return candidates.map((candidate) => resolve6(candidate)).find((candidate) => existsSync4(candidate) && !candidate.endsWith(".d.ts")) ?? null;
|
|
5411
5461
|
}, readFileForAotTransform = async (fileName, readFile2) => {
|
|
5412
5462
|
const hostSource = readFile2?.(fileName);
|
|
5413
5463
|
if (typeof hostSource === "string")
|
|
@@ -5488,7 +5538,7 @@ var atomicWriteSequence = 0, writeTextFileAtomically = async (path, content) =>
|
|
|
5488
5538
|
if (visited.has(resolvedPath))
|
|
5489
5539
|
return;
|
|
5490
5540
|
visited.add(resolvedPath);
|
|
5491
|
-
if (!
|
|
5541
|
+
if (!existsSync4(resolvedPath) || resolvedPath.endsWith(".d.ts"))
|
|
5492
5542
|
return;
|
|
5493
5543
|
stats.filesVisited += 1;
|
|
5494
5544
|
const source = await readFileForAotTransform(resolvedPath, readFile2);
|
|
@@ -5662,7 +5712,7 @@ var atomicWriteSequence = 0, writeTextFileAtomically = async (path, content) =>
|
|
|
5662
5712
|
return null;
|
|
5663
5713
|
}, resolveAngularDeferImportSpecifier = () => {
|
|
5664
5714
|
const sourceEntry = resolve6(import.meta.dir, "../angular/components/index.ts");
|
|
5665
|
-
if (
|
|
5715
|
+
if (existsSync4(sourceEntry)) {
|
|
5666
5716
|
return sourceEntry.replace(/\\/g, "/");
|
|
5667
5717
|
}
|
|
5668
5718
|
return "@absolutejs/absolute/angular/components";
|
|
@@ -5790,7 +5840,7 @@ ${slot.resolvedBindings.map((binding) => ` "${binding.key}": this.__absoluteDef
|
|
|
5790
5840
|
${fields}
|
|
5791
5841
|
`);
|
|
5792
5842
|
}, readAndEscapeFile = async (filePath, stylePreprocessors) => {
|
|
5793
|
-
if (!
|
|
5843
|
+
if (!existsSync4(filePath)) {
|
|
5794
5844
|
throw new Error(`Unable to inline Angular style resource: file not found at ${filePath}`);
|
|
5795
5845
|
}
|
|
5796
5846
|
const content = await compileStyleFileIfNeeded(filePath, stylePreprocessors);
|
|
@@ -5799,7 +5849,7 @@ ${fields}
|
|
|
5799
5849
|
const templateUrlMatch = findUncommentedMatch(source, /templateUrl\s*:\s*['"]([^'"]+)['"]/);
|
|
5800
5850
|
if (templateUrlMatch?.[1]) {
|
|
5801
5851
|
const templatePath = join9(fileDir, templateUrlMatch[1]);
|
|
5802
|
-
if (!
|
|
5852
|
+
if (!existsSync4(templatePath)) {
|
|
5803
5853
|
throw new Error(`Unable to inline Angular templateUrl "${templateUrlMatch[1]}": file not found at ${templatePath}`);
|
|
5804
5854
|
}
|
|
5805
5855
|
const templateRaw2 = await fs.readFile(templatePath, "utf-8");
|
|
@@ -5830,7 +5880,7 @@ ${fields}
|
|
|
5830
5880
|
const templateUrlMatch = findUncommentedMatch(source, /templateUrl\s*:\s*['"]([^'"]+)['"]/);
|
|
5831
5881
|
if (templateUrlMatch?.[1]) {
|
|
5832
5882
|
const templatePath = join9(fileDir, templateUrlMatch[1]);
|
|
5833
|
-
if (!
|
|
5883
|
+
if (!existsSync4(templatePath)) {
|
|
5834
5884
|
throw new Error(`Unable to inline Angular templateUrl "${templateUrlMatch[1]}": file not found at ${templatePath}`);
|
|
5835
5885
|
}
|
|
5836
5886
|
const templateRaw2 = readFileSync5(templatePath, "utf-8");
|
|
@@ -5978,7 +6028,7 @@ ${fields}
|
|
|
5978
6028
|
join9(candidate, "index.js"),
|
|
5979
6029
|
join9(candidate, "index.jsx")
|
|
5980
6030
|
];
|
|
5981
|
-
return candidates.find((file) =>
|
|
6031
|
+
return candidates.find((file) => existsSync4(file));
|
|
5982
6032
|
};
|
|
5983
6033
|
const resolveLocalImport = (specifier, fromDir) => {
|
|
5984
6034
|
if (specifier.startsWith(".") || specifier.startsWith("/")) {
|
|
@@ -6053,7 +6103,7 @@ ${fields}
|
|
|
6053
6103
|
if (visited.has(resolved))
|
|
6054
6104
|
return;
|
|
6055
6105
|
visited.add(resolved);
|
|
6056
|
-
if (resolved.endsWith(".json") &&
|
|
6106
|
+
if (resolved.endsWith(".json") && existsSync4(resolved)) {
|
|
6057
6107
|
const inputDir2 = dirname5(resolved);
|
|
6058
6108
|
const relativeDir2 = inputDir2.startsWith(baseDir) ? inputDir2.substring(baseDir.length + 1) : inputDir2;
|
|
6059
6109
|
const targetDir2 = join9(outDir, relativeDir2);
|
|
@@ -6066,7 +6116,7 @@ ${fields}
|
|
|
6066
6116
|
let actualPath = resolved;
|
|
6067
6117
|
if (!actualPath.endsWith(".ts"))
|
|
6068
6118
|
actualPath += ".ts";
|
|
6069
|
-
if (!
|
|
6119
|
+
if (!existsSync4(actualPath))
|
|
6070
6120
|
return;
|
|
6071
6121
|
let sourceCode = await fs.readFile(actualPath, "utf-8");
|
|
6072
6122
|
const inlined = await inlineResources(sourceCode, dirname5(actualPath), stylePreprocessors);
|
|
@@ -6104,7 +6154,7 @@ ${fields}
|
|
|
6104
6154
|
const isEntry = resolve6(actualPath) === resolve6(entryPath);
|
|
6105
6155
|
const contentHash = Bun.hash(sourceCode).toString(BASE_36_RADIX);
|
|
6106
6156
|
const cacheKey2 = actualPath;
|
|
6107
|
-
const shouldWriteFile = cacheBuster && isEntry ? true : jitContentCache.get(cacheKey2) !== contentHash || !
|
|
6157
|
+
const shouldWriteFile = cacheBuster && isEntry ? true : jitContentCache.get(cacheKey2) !== contentHash || !existsSync4(targetPath);
|
|
6108
6158
|
if (shouldWriteFile) {
|
|
6109
6159
|
const processedContent = transpileAndRewrite(sourceCode, relativeDir, actualPath, importRewrites);
|
|
6110
6160
|
const preservedInjection = await readPreservedInjection(targetPath);
|
|
@@ -6117,7 +6167,7 @@ ${fields}
|
|
|
6117
6167
|
};
|
|
6118
6168
|
await transpileFile(inputPath);
|
|
6119
6169
|
const entryOutputPath = toOutputPath(entryPath);
|
|
6120
|
-
if (
|
|
6170
|
+
if (existsSync4(entryOutputPath)) {
|
|
6121
6171
|
const entryOutput = await fs.readFile(entryOutputPath, "utf-8");
|
|
6122
6172
|
const withoutLegacyFlag = entryOutput.replace(/\nexport const __ABSOLUTE_PAGE_USES_LEGACY_ANIMATIONS__ = true;\n?/g, `
|
|
6123
6173
|
`);
|
|
@@ -6143,7 +6193,7 @@ export const __ABSOLUTE_PAGE_USES_LEGACY_ANIMATIONS__ = true;
|
|
|
6143
6193
|
await traceAngularPhase("aot/copy-json-resources", async () => {
|
|
6144
6194
|
const cwd = process.cwd();
|
|
6145
6195
|
const angularSrcDir = resolve6(outRoot);
|
|
6146
|
-
if (!
|
|
6196
|
+
if (!existsSync4(angularSrcDir))
|
|
6147
6197
|
return;
|
|
6148
6198
|
const jsonGlob = new Glob("**/*.json");
|
|
6149
6199
|
for (const rel of jsonGlob.scanSync({
|
|
@@ -6178,15 +6228,15 @@ export const __ABSOLUTE_PAGE_USES_LEGACY_ANIMATIONS__ = true;
|
|
|
6178
6228
|
...candidatePaths.map((file) => resolve6(file)),
|
|
6179
6229
|
...compiledFallbackPaths
|
|
6180
6230
|
];
|
|
6181
|
-
let candidate = normalizedCandidates.find((file) =>
|
|
6231
|
+
let candidate = normalizedCandidates.find((file) => existsSync4(file) && file.endsWith(`${sep}${relativeEntry}`));
|
|
6182
6232
|
if (!candidate) {
|
|
6183
|
-
candidate = normalizedCandidates.find((file) =>
|
|
6233
|
+
candidate = normalizedCandidates.find((file) => existsSync4(file) && file.endsWith(`${sep}pages${sep}${jsName}`));
|
|
6184
6234
|
}
|
|
6185
6235
|
if (!candidate) {
|
|
6186
|
-
candidate = normalizedCandidates.find((file) =>
|
|
6236
|
+
candidate = normalizedCandidates.find((file) => existsSync4(file) && file.endsWith(`${sep}${jsName}`));
|
|
6187
6237
|
}
|
|
6188
6238
|
if (!candidate) {
|
|
6189
|
-
candidate = normalizedCandidates.find((file) =>
|
|
6239
|
+
candidate = normalizedCandidates.find((file) => existsSync4(file));
|
|
6190
6240
|
}
|
|
6191
6241
|
return candidate;
|
|
6192
6242
|
};
|
|
@@ -6194,11 +6244,11 @@ export const __ABSOLUTE_PAGE_USES_LEGACY_ANIMATIONS__ = true;
|
|
|
6194
6244
|
if (!rawServerFile) {
|
|
6195
6245
|
rawServerFile = await traceAngularPhase("wrapper/resolve-server-output-fallback", () => resolveRawServerFile([]), { entry: resolvedEntry });
|
|
6196
6246
|
}
|
|
6197
|
-
if (rawServerFile && !
|
|
6247
|
+
if (rawServerFile && !existsSync4(rawServerFile)) {
|
|
6198
6248
|
outputs = hmr ? await compileEntry() : aotOutputs;
|
|
6199
6249
|
rawServerFile = await traceAngularPhase("wrapper/resolve-server-output-retry", () => resolveRawServerFile(outputs), { entry: resolvedEntry });
|
|
6200
6250
|
}
|
|
6201
|
-
if (!rawServerFile || !
|
|
6251
|
+
if (!rawServerFile || !existsSync4(rawServerFile)) {
|
|
6202
6252
|
throw new Error(`Compiled output not found for ${entry}. Looking for: ${jsName}. Available: ${[
|
|
6203
6253
|
...outputs,
|
|
6204
6254
|
...compiledFallbackPaths
|
|
@@ -6234,7 +6284,7 @@ export const __ABSOLUTE_PAGE_USES_LEGACY_ANIMATIONS__ = true;
|
|
|
6234
6284
|
const serverContentHash = `${Bun.hash(original).toString(BASE_36_RADIX)}.${Bun.hash(providersHashInput).toString(BASE_36_RADIX)}`;
|
|
6235
6285
|
const cachedWrapper = wrapperOutputCache.get(resolvedEntry);
|
|
6236
6286
|
const clientFile = join9(indexesDir, jsName);
|
|
6237
|
-
if (hmr && cachedWrapper && cachedWrapper.serverHash === serverContentHash &&
|
|
6287
|
+
if (hmr && cachedWrapper && cachedWrapper.serverHash === serverContentHash && existsSync4(clientFile) && (usesLegacyAnimations || !original.includes("__ABSOLUTE_PAGE_USES_LEGACY_ANIMATIONS__")) && (!usesLegacyAnimations || original.includes("__ABSOLUTE_PAGE_USES_LEGACY_ANIMATIONS__"))) {
|
|
6238
6288
|
return {
|
|
6239
6289
|
clientPath: clientFile,
|
|
6240
6290
|
indexUnchanged: true,
|
|
@@ -16133,6 +16183,9 @@ var handleAngularPageRequest = async (input) => {
|
|
|
16133
16183
|
const requestId = `angular_${Date.now()}_${Math.random().toString(BASE_36_RADIX).substring(2, RANDOM_ID_END_INDEX)}`;
|
|
16134
16184
|
const request = input.request ?? getCurrentAbsoluteRequest();
|
|
16135
16185
|
const deferredAssets = input.pagePath === "" || input.indexPath === "" ? await resolveDeferredPageAssets() : null;
|
|
16186
|
+
const buildFailure = devBuildErrorResponse("angular", deferredAssets);
|
|
16187
|
+
if (buildFailure)
|
|
16188
|
+
return buildFailure;
|
|
16136
16189
|
const deferredPagePath = deferredAssets && input.pagePath === "" ? deferredAssets.lookup(deferredAssets.name) : input.pagePath;
|
|
16137
16190
|
const deferredIndexPath = deferredAssets && input.indexPath === "" ? deferredAssets.lookup(`${deferredAssets.name}Index`) : input.indexPath;
|
|
16138
16191
|
const pageName = deferredAssets?.name ?? derivePageName(deferredPagePath);
|
|
@@ -16764,5 +16817,5 @@ export {
|
|
|
16764
16817
|
withPendingTask
|
|
16765
16818
|
};
|
|
16766
16819
|
|
|
16767
|
-
//# debugId=
|
|
16820
|
+
//# debugId=4B4A4D8B4E52128064756E2164756E21
|
|
16768
16821
|
//# sourceMappingURL=index.js.map
|