@analogjs/platform 2.7.0-beta.1 → 2.7.0-beta.10
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/AGENTS.md +74 -0
- package/package.json +3 -3
- package/src/lib/nx-plugin/src/generators/app/files/agents/AGENTS.md +11 -0
- package/src/lib/nx-plugin/src/generators/app/files/agents/CLAUDE.md +1 -0
- package/src/lib/nx-plugin/src/generators/app/generator.js +4 -0
- package/src/lib/nx-plugin/src/generators/app/generator.js.map +1 -1
- package/src/lib/nx-plugin/src/generators/app/lib/add-agent-context.d.ts +2 -0
- package/src/lib/nx-plugin/src/generators/app/lib/add-agent-context.js +18 -0
- package/src/lib/nx-plugin/src/generators/app/lib/add-agent-context.js.map +1 -0
- package/src/lib/nx-plugin/src/generators/app/schema.d.ts +2 -0
- package/src/lib/nx-plugin/src/generators/app/versions/nx_18_X/versions.d.ts +5 -5
- package/src/lib/nx-plugin/src/generators/app/versions/nx_18_X/versions.js +5 -5
- package/src/lib/nx-plugin/src/generators/app/versions/nx_18_X/versions.js.map +1 -1
- package/src/lib/nx-plugin/src/generators/preset/generator.js +6 -1
- package/src/lib/nx-plugin/src/generators/preset/generator.js.map +1 -1
- package/src/lib/nx-plugin/src/utils/versions/ng_19_X/versions.d.ts +5 -5
- package/src/lib/nx-plugin/src/utils/versions/ng_19_X/versions.js +5 -5
- package/src/lib/nx-plugin/src/utils/versions/ng_19_X/versions.js.map +1 -1
- package/src/lib/options.d.ts +19 -0
- package/src/lib/platform-plugin.js +42 -1
- package/src/lib/ssr/defer-streaming-plugin.d.ts +65 -0
- package/src/lib/ssr/defer-streaming-plugin.js +135 -0
package/AGENTS.md
ADDED
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
# AnalogJS — conventions for AI coding assistants
|
|
2
|
+
|
|
3
|
+
This file ships with `@analogjs/platform` and documents how to work in an [AnalogJS](https://analogjs.org) app (an Angular meta-framework, powered by Vite). A generated app's root `AGENTS.md` points here so the guidance stays in sync with the installed version.
|
|
4
|
+
|
|
5
|
+
## Commands
|
|
6
|
+
|
|
7
|
+
- `npm start` / `npm run dev` — start the dev server (Vite)
|
|
8
|
+
- `npm run build` — production build
|
|
9
|
+
- `npm test` — run unit tests (Vitest)
|
|
10
|
+
- `npm run preview` — run the built server locally
|
|
11
|
+
|
|
12
|
+
## Project structure
|
|
13
|
+
|
|
14
|
+
- `src/app/pages/` — file-based routes (see Routing below)
|
|
15
|
+
- `src/app/` — components and app config (`app.config.ts`, `app.config.server.ts`)
|
|
16
|
+
- `src/server/routes/` — server and API routes (Nitro + h3)
|
|
17
|
+
- `src/main.ts` / `src/main.server.ts` — client and server bootstrap
|
|
18
|
+
- `vite.config.ts` — Vite + Analog plugin and Vitest config
|
|
19
|
+
|
|
20
|
+
## Routing
|
|
21
|
+
|
|
22
|
+
Routes are file-based. A file in `src/app/pages/` ending in `.page.ts` becomes a route, and it must `export default` a standalone Angular component.
|
|
23
|
+
|
|
24
|
+
- `index.page.ts` → `/`
|
|
25
|
+
- `about.page.ts` → `/about`
|
|
26
|
+
- `products/index.page.ts` → `/products`
|
|
27
|
+
- `products/[productId].page.ts` → `/products/:productId` (dynamic segment)
|
|
28
|
+
- `(auth).page.ts` + `(auth)/*.page.ts` → pathless layout: `(auth).page.ts` renders a `<router-outlet />` and wraps its child routes (e.g. `(auth)/login.page.ts` → `/login`, `(auth)/signup.page.ts` → `/signup`) without adding a path segment
|
|
29
|
+
- `[...not-found].page.ts` → catch-all / 404
|
|
30
|
+
|
|
31
|
+
Read route params with `inject(ActivatedRoute)` from `@angular/router`.
|
|
32
|
+
|
|
33
|
+
Define per-route metadata (title, meta tags, guards, resolvers) by exporting a `RouteMeta`:
|
|
34
|
+
|
|
35
|
+
```ts
|
|
36
|
+
import { RouteMeta } from '@analogjs/router';
|
|
37
|
+
|
|
38
|
+
export const routeMeta: RouteMeta = {
|
|
39
|
+
title: 'Products',
|
|
40
|
+
};
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Server & API routes
|
|
44
|
+
|
|
45
|
+
Server routes live in `src/server/routes/` and use [h3](https://h3.dev). API routes are conventionally under `src/server/routes/api/`.
|
|
46
|
+
|
|
47
|
+
```ts
|
|
48
|
+
import { defineEventHandler } from 'h3';
|
|
49
|
+
|
|
50
|
+
export default defineEventHandler(() => ({ message: 'Hello World' }));
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Filenames encode the HTTP method and params: `hello.get.ts`, `users.post.ts`, `users/[id].get.ts`.
|
|
54
|
+
|
|
55
|
+
## Data fetching
|
|
56
|
+
|
|
57
|
+
- **Page load functions:** add a sibling `.server.ts` `load` function and read its result in the page with `injectLoad` from `@analogjs/router`.
|
|
58
|
+
- **Server functions:** define functions in `.server.ts` files and call them from the client with `injectServerFn`.
|
|
59
|
+
|
|
60
|
+
## Content routes
|
|
61
|
+
|
|
62
|
+
Markdown content is supported via `@analogjs/content`: `injectContent` / `injectContentFiles` to load content, and `MarkdownComponent` (`analog-markdown`) to render it. Content files live in `src/content/`.
|
|
63
|
+
|
|
64
|
+
## Conventions
|
|
65
|
+
|
|
66
|
+
- Use modern Angular: standalone components, `inject()`, signals, and the built-in control flow (`@if`, `@for`, `@switch`).
|
|
67
|
+
- Page components are **default-exported**.
|
|
68
|
+
- Tests are colocated as `*.spec.ts` and run under Vitest (jsdom environment).
|
|
69
|
+
- Prefer existing Angular and Analog APIs over hand-rolled equivalents.
|
|
70
|
+
|
|
71
|
+
## More
|
|
72
|
+
|
|
73
|
+
Full documentation: https://analogjs.org/docs
|
|
74
|
+
LLM-friendly docs index: https://analogjs.org/llms.txt
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@analogjs/platform",
|
|
3
|
-
"version": "2.7.0-beta.
|
|
3
|
+
"version": "2.7.0-beta.10",
|
|
4
4
|
"description": "The fullstack meta-framework for Angular",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "Brandon Roberts <robertsbt@gmail.com>",
|
|
@@ -29,8 +29,8 @@
|
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
31
|
"nitropack": "^2.13.1",
|
|
32
|
-
"@analogjs/vite-plugin-angular": "^2.7.0-beta.
|
|
33
|
-
"@analogjs/vite-plugin-nitro": "^2.7.0-beta.
|
|
32
|
+
"@analogjs/vite-plugin-angular": "^2.7.0-beta.10",
|
|
33
|
+
"@analogjs/vite-plugin-nitro": "^2.7.0-beta.10",
|
|
34
34
|
"oxc-parser": "^0.121.0",
|
|
35
35
|
"vitefu": "^1.1.2"
|
|
36
36
|
},
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
# AGENTS.md
|
|
2
|
+
|
|
3
|
+
This is an [AnalogJS](https://analogjs.org) app — an Angular meta-framework powered by Vite.
|
|
4
|
+
|
|
5
|
+
Framework conventions for AI assistants — file-based routing, server/API routes, data fetching, content routes, and modern Angular usage — ship with the framework and are installed alongside your dependencies. Read them here:
|
|
6
|
+
|
|
7
|
+
- `node_modules/@analogjs/platform/AGENTS.md`
|
|
8
|
+
|
|
9
|
+
Reading from `@analogjs/platform` keeps the guidance in sync with the installed version instead of drifting from a copy checked into the project.
|
|
10
|
+
|
|
11
|
+
Full documentation: https://analogjs.org/docs · LLM-friendly index: https://analogjs.org/llms.txt
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
Strictly follow the rules in @AGENTS.md
|
|
@@ -11,6 +11,7 @@ const minimum_supported_versions_1 = require("./versions/minimum-supported-versi
|
|
|
11
11
|
const add_angular_app_1 = require("./lib/add-angular-app");
|
|
12
12
|
const generator_1 = tslib_1.__importDefault(require("../init/generator"));
|
|
13
13
|
const add_files_1 = require("./lib/add-files");
|
|
14
|
+
const add_agent_context_1 = require("./lib/add-agent-context");
|
|
14
15
|
const add_tailwind_config_1 = require("./lib/add-tailwind-config");
|
|
15
16
|
const cleanup_files_1 = require("./lib/cleanup-files");
|
|
16
17
|
const add_analog_project_config_1 = require("./lib/add-analog-project-config");
|
|
@@ -81,6 +82,9 @@ async function appGenerator(tree, options) {
|
|
|
81
82
|
await (0, add_tailwind_config_1.addTailwindConfig)(tree, normalizedOptions.projectName);
|
|
82
83
|
}
|
|
83
84
|
(0, add_home_page_1.addHomePage)(tree, normalizedOptions, majorAngularVersion);
|
|
85
|
+
if (!normalizedOptions.skipAgentContext) {
|
|
86
|
+
(0, add_agent_context_1.addAgentContext)(tree, normalizedOptions.projectRoot);
|
|
87
|
+
}
|
|
84
88
|
(0, cleanup_files_1.cleanupFiles)(tree, normalizedOptions);
|
|
85
89
|
if (!normalizedOptions.skipFormat) {
|
|
86
90
|
await (0, devkit_1.formatFiles)(tree);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../../../packages/nx-plugin/src/generators/app/generator.ts"],"names":[],"mappings":";;
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../../../packages/nx-plugin/src/generators/app/generator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.addAgentContext = addAgentContext;
|
|
4
|
+
const node_fs_1 = require("node:fs");
|
|
5
|
+
const node_path_1 = require("node:path");
|
|
6
|
+
const AGENT_CONTEXT_FILES = ['AGENTS.md', 'CLAUDE.md'];
|
|
7
|
+
// Seeds agent context in the app so AI coding assistants pick up Analog
|
|
8
|
+
// conventions (see node_modules/@analogjs/platform/AGENTS.md).
|
|
9
|
+
function addAgentContext(tree, projectRoot) {
|
|
10
|
+
for (const fileName of AGENT_CONTEXT_FILES) {
|
|
11
|
+
const filePath = `${projectRoot}/${fileName}`;
|
|
12
|
+
if (tree.exists(filePath)) {
|
|
13
|
+
continue;
|
|
14
|
+
}
|
|
15
|
+
tree.write(filePath, (0, node_fs_1.readFileSync)((0, node_path_1.join)(__dirname, '..', 'files', 'agents', fileName), 'utf-8'));
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=add-agent-context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"add-agent-context.js","sourceRoot":"","sources":["../../../../../../../../../../packages/nx-plugin/src/generators/app/lib/add-agent-context.ts"],"names":[],"mappings":";;AAQA,0CAaC;AApBD,qCAAuC;AACvC,yCAAiC;AAEjC,MAAM,mBAAmB,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC;AAEvD,wEAAwE;AACxE,+DAA+D;AAC/D,SAAgB,eAAe,CAAC,IAAU,EAAE,WAAmB;IAC7D,KAAK,MAAM,QAAQ,IAAI,mBAAmB,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,GAAG,WAAW,IAAI,QAAQ,EAAE,CAAC;QAE9C,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1B,SAAS;QACX,CAAC;QAED,IAAI,CAAC,KAAK,CACR,QAAQ,EACR,IAAA,sBAAY,EAAC,IAAA,gBAAI,EAAC,SAAS,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,EAAE,OAAO,CAAC,CAC1E,CAAC;IACJ,CAAC;AACH,CAAC"}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
export declare const V18_X_NX_DEVKIT = "^20.0.0";
|
|
2
2
|
export declare const V18_X_NX_ANGULAR = "^20.0.0";
|
|
3
|
-
export declare const V18_X_ANALOG_JS_CONTENT = "^2.7.0-beta.
|
|
4
|
-
export declare const V18_X_ANALOG_JS_ROUTER = "^2.7.0-beta.
|
|
3
|
+
export declare const V18_X_ANALOG_JS_CONTENT = "^2.7.0-beta.10";
|
|
4
|
+
export declare const V18_X_ANALOG_JS_ROUTER = "^2.7.0-beta.10";
|
|
5
5
|
export declare const V18_X_ANALOG_JS_TRPC = "~0.4.0";
|
|
6
|
-
export declare const V18_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = "^2.7.0-beta.
|
|
7
|
-
export declare const V18_X_ANALOG_JS_VITEST_ANGULAR = "^2.7.0-beta.
|
|
6
|
+
export declare const V18_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = "^2.7.0-beta.10";
|
|
7
|
+
export declare const V18_X_ANALOG_JS_VITEST_ANGULAR = "^2.7.0-beta.10";
|
|
8
8
|
export declare const V18_X_TRPC_CLIENT = "^10.25.0";
|
|
9
9
|
export declare const V18_X_TRPC_SERVER = "^10.25.0";
|
|
10
10
|
export declare const V18_X_ISOMORPHIC_FETCH = "^3.0.0";
|
|
@@ -20,7 +20,7 @@ export declare const V18_X_TAILWINDCSS = "^4.1.4";
|
|
|
20
20
|
export declare const V18_X_TAILWINDCSS_VITE = "^4.1.4";
|
|
21
21
|
export declare const V18_X_POSTCSS = "^8.5.3";
|
|
22
22
|
export declare const V18_X_AUTOPREFIXER = "^10.4.0";
|
|
23
|
-
export declare const V18_X_ANALOG_JS_PLATFORM = "^2.7.0-beta.
|
|
23
|
+
export declare const V18_X_ANALOG_JS_PLATFORM = "^2.7.0-beta.10";
|
|
24
24
|
export declare const V18_X_ANGULAR_DEVKIT_BUILD_ANGULAR = "^19.0.0";
|
|
25
25
|
export declare const V18_X_NX_VITE = "^21.0.0";
|
|
26
26
|
export declare const V18_X_NX_LINTER = "^21.0.0";
|
|
@@ -5,11 +5,11 @@ exports.V18_X_ZOD = exports.V18_X_VITEST = exports.V18_X_VITE_TSCONFIG_PATHS = e
|
|
|
5
5
|
// dependencies
|
|
6
6
|
exports.V18_X_NX_DEVKIT = '^20.0.0';
|
|
7
7
|
exports.V18_X_NX_ANGULAR = '^20.0.0';
|
|
8
|
-
exports.V18_X_ANALOG_JS_CONTENT = '^2.7.0-beta.
|
|
9
|
-
exports.V18_X_ANALOG_JS_ROUTER = '^2.7.0-beta.
|
|
8
|
+
exports.V18_X_ANALOG_JS_CONTENT = '^2.7.0-beta.10';
|
|
9
|
+
exports.V18_X_ANALOG_JS_ROUTER = '^2.7.0-beta.10';
|
|
10
10
|
exports.V18_X_ANALOG_JS_TRPC = '~0.4.0';
|
|
11
|
-
exports.V18_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = '^2.7.0-beta.
|
|
12
|
-
exports.V18_X_ANALOG_JS_VITEST_ANGULAR = '^2.7.0-beta.
|
|
11
|
+
exports.V18_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = '^2.7.0-beta.10';
|
|
12
|
+
exports.V18_X_ANALOG_JS_VITEST_ANGULAR = '^2.7.0-beta.10';
|
|
13
13
|
exports.V18_X_TRPC_CLIENT = '^10.25.0';
|
|
14
14
|
exports.V18_X_TRPC_SERVER = '^10.25.0';
|
|
15
15
|
exports.V18_X_ISOMORPHIC_FETCH = '^3.0.0';
|
|
@@ -26,7 +26,7 @@ exports.V18_X_TAILWINDCSS_VITE = '^4.1.4';
|
|
|
26
26
|
exports.V18_X_POSTCSS = '^8.5.3';
|
|
27
27
|
exports.V18_X_AUTOPREFIXER = '^10.4.0';
|
|
28
28
|
// devDependencies
|
|
29
|
-
exports.V18_X_ANALOG_JS_PLATFORM = '^2.7.0-beta.
|
|
29
|
+
exports.V18_X_ANALOG_JS_PLATFORM = '^2.7.0-beta.10';
|
|
30
30
|
exports.V18_X_ANGULAR_DEVKIT_BUILD_ANGULAR = '^19.0.0';
|
|
31
31
|
exports.V18_X_NX_VITE = '^21.0.0';
|
|
32
32
|
exports.V18_X_NX_LINTER = '^21.0.0';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"versions.js","sourceRoot":"","sources":["../../../../../../../../../../../packages/nx-plugin/src/generators/app/versions/nx_18_X/versions.ts"],"names":[],"mappings":";;;AAAA,QAAQ;AACR,eAAe;AACF,QAAA,eAAe,GAAG,SAAS,CAAC;AAC5B,QAAA,gBAAgB,GAAG,SAAS,CAAC;AAC7B,QAAA,uBAAuB,GAAG,
|
|
1
|
+
{"version":3,"file":"versions.js","sourceRoot":"","sources":["../../../../../../../../../../../packages/nx-plugin/src/generators/app/versions/nx_18_X/versions.ts"],"names":[],"mappings":";;;AAAA,QAAQ;AACR,eAAe;AACF,QAAA,eAAe,GAAG,SAAS,CAAC;AAC5B,QAAA,gBAAgB,GAAG,SAAS,CAAC;AAC7B,QAAA,uBAAuB,GAAG,gBAAgB,CAAC;AAC3C,QAAA,sBAAsB,GAAG,gBAAgB,CAAC;AAC1C,QAAA,oBAAoB,GAAG,QAAQ,CAAC;AAChC,QAAA,mCAAmC,GAAG,gBAAgB,CAAC;AACvD,QAAA,8BAA8B,GAAG,gBAAgB,CAAC;AAClD,QAAA,iBAAiB,GAAG,UAAU,CAAC;AAC/B,QAAA,iBAAiB,GAAG,UAAU,CAAC;AAC/B,QAAA,sBAAsB,GAAG,QAAQ,CAAC;AAClC,QAAA,eAAe,GAAG,QAAQ,CAAC;AAC3B,QAAA,kBAAkB,GAAG,QAAQ,CAAC;AAC9B,QAAA,YAAY,GAAG,SAAS,CAAC;AACzB,QAAA,2BAA2B,GAAG,QAAQ,CAAC;AACvC,QAAA,sBAAsB,GAAG,QAAQ,CAAC;AAClC,QAAA,mBAAmB,GAAG,SAAS,CAAC;AAChC,QAAA,aAAa,GAAG,SAAS,CAAC;AAC1B,QAAA,aAAa,GAAG,SAAS,CAAC;AAC1B,QAAA,iBAAiB,GAAG,QAAQ,CAAC;AAC7B,QAAA,sBAAsB,GAAG,QAAQ,CAAC;AAClC,QAAA,aAAa,GAAG,QAAQ,CAAC;AACzB,QAAA,kBAAkB,GAAG,SAAS,CAAC;AAE5C,kBAAkB;AACL,QAAA,wBAAwB,GAAG,gBAAgB,CAAC;AAC5C,QAAA,kCAAkC,GAAG,SAAS,CAAC;AAC/C,QAAA,aAAa,GAAG,SAAS,CAAC;AAC1B,QAAA,eAAe,GAAG,SAAS,CAAC;AAC5B,QAAA,WAAW,GAAG,SAAS,CAAC;AACxB,QAAA,UAAU,GAAG,QAAQ,CAAC;AACtB,QAAA,yBAAyB,GAAG,QAAQ,CAAC;AACrC,QAAA,YAAY,GAAG,QAAQ,CAAC;AACxB,QAAA,SAAS,GAAG,SAAS,CAAC"}
|
|
@@ -35,12 +35,17 @@ var __importStar = (this && this.__importStar) || (function () {
|
|
|
35
35
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
36
|
exports.default = default_1;
|
|
37
37
|
const devkit_1 = require("@nx/devkit");
|
|
38
|
+
const node_path_1 = require("node:path");
|
|
38
39
|
async function default_1(tree, options) {
|
|
39
40
|
(0, devkit_1.ensurePackage)('@nx/angular', devkit_1.NX_VERSION);
|
|
40
41
|
(0, devkit_1.ensurePackage)('@nx/vite', devkit_1.NX_VERSION);
|
|
41
42
|
(0, devkit_1.ensurePackage)('@nx/eslint', devkit_1.NX_VERSION);
|
|
42
43
|
(0, devkit_1.ensurePackage)('@angular-devkit/core', 'latest');
|
|
43
44
|
(0, devkit_1.ensurePackage)('rxjs', 'latest');
|
|
44
|
-
|
|
45
|
+
const appTask = await Promise.resolve().then(() => __importStar(require('../app/generator'))).then(({ appGenerator }) => appGenerator(tree, { ...options, skipAgentContext: true }));
|
|
46
|
+
// Seed agent context at the workspace root so AI coding assistants pick up
|
|
47
|
+
// Analog conventions (see node_modules/@analogjs/platform/AGENTS.md).
|
|
48
|
+
(0, devkit_1.generateFiles)(tree, (0, node_path_1.join)(__dirname, '..', 'app', 'files', 'agents'), '.', options);
|
|
49
|
+
return appTask;
|
|
45
50
|
}
|
|
46
51
|
//# sourceMappingURL=generator.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../../../packages/nx-plugin/src/generators/preset/generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../../../../../../packages/nx-plugin/src/generators/preset/generator.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAIA,4BAqBC;AAzBD,uCAA4E;AAC5E,yCAAiC;AAGlB,KAAK,oBAAW,IAAU,EAAE,OAA8B;IACvE,IAAA,sBAAa,EAAC,aAAa,EAAE,mBAAU,CAAC,CAAC;IACzC,IAAA,sBAAa,EAAC,UAAU,EAAE,mBAAU,CAAC,CAAC;IACtC,IAAA,sBAAa,EAAC,YAAY,EAAE,mBAAU,CAAC,CAAC;IACxC,IAAA,sBAAa,EAAC,sBAAsB,EAAE,QAAQ,CAAC,CAAC;IAChD,IAAA,sBAAa,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IAEhC,MAAM,OAAO,GAAG,MAAM,kDAAO,kBAAkB,IAAE,IAAI,CAAC,CAAC,EAAE,YAAY,EAAE,EAAE,EAAE,CACzE,YAAY,CAAC,IAAI,EAAE,EAAE,GAAG,OAAO,EAAE,gBAAgB,EAAE,IAAI,EAAE,CAAC,CAC3D,CAAC;IAEF,2EAA2E;IAC3E,sEAAsE;IACtE,IAAA,sBAAa,EACX,IAAI,EACJ,IAAA,gBAAI,EAAC,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,CAAC,EAC/C,GAAG,EACH,OAAO,CACR,CAAC;IAEF,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
export declare const V19_X_ANALOG_JS_ROUTER = "^2.7.0-beta.
|
|
2
|
-
export declare const V19_X_ANALOG_JS_CONTENT = "^2.7.0-beta.
|
|
1
|
+
export declare const V19_X_ANALOG_JS_ROUTER = "^2.7.0-beta.10";
|
|
2
|
+
export declare const V19_X_ANALOG_JS_CONTENT = "^2.7.0-beta.10";
|
|
3
3
|
export declare const V19_X_MARKED = "^15.0.7";
|
|
4
4
|
export declare const V19_X_MARKED_GFM_HEADING_ID = "^4.1.1";
|
|
5
5
|
export declare const V19_X_MARKED_HIGHLIGHT = "^2.2.1";
|
|
6
6
|
export declare const V19_X_MARKED_MANGLE = "^1.1.10";
|
|
7
7
|
export declare const V19_X_PRISMJS = "^1.29.0";
|
|
8
|
-
export declare const V19_X_ANALOG_JS_PLATFORM = "^2.7.0-beta.
|
|
9
|
-
export declare const V19_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = "^2.7.0-beta.
|
|
10
|
-
export declare const V19_X_ANALOG_JS_VITEST_ANGULAR = "^2.7.0-beta.
|
|
8
|
+
export declare const V19_X_ANALOG_JS_PLATFORM = "^2.7.0-beta.10";
|
|
9
|
+
export declare const V19_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = "^2.7.0-beta.10";
|
|
10
|
+
export declare const V19_X_ANALOG_JS_VITEST_ANGULAR = "^2.7.0-beta.10";
|
|
11
11
|
export declare const V19_X_NX_ANGULAR = "^22.0.0";
|
|
12
12
|
export declare const V19_X_NX_VITE = "^22.0.0";
|
|
13
13
|
export declare const V19_X_JSDOM = "^22.0.0";
|
|
@@ -2,17 +2,17 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.NX_X_LATEST_NX = exports.NX_X_LATEST_VITEST = exports.NX_X_LATEST_VITE = exports.V19_X_VITE = exports.V19_X_VITEST = exports.V19_X_VITE_TSCONFIG_PATHS = exports.V19_X_JSDOM = exports.V19_X_NX_VITE = exports.V19_X_NX_ANGULAR = exports.V19_X_ANALOG_JS_VITEST_ANGULAR = exports.V19_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = exports.V19_X_ANALOG_JS_PLATFORM = exports.V19_X_PRISMJS = exports.V19_X_MARKED_MANGLE = exports.V19_X_MARKED_HIGHLIGHT = exports.V19_X_MARKED_GFM_HEADING_ID = exports.V19_X_MARKED = exports.V19_X_ANALOG_JS_CONTENT = exports.V19_X_ANALOG_JS_ROUTER = void 0;
|
|
4
4
|
// V19_X
|
|
5
|
-
exports.V19_X_ANALOG_JS_ROUTER = '^2.7.0-beta.
|
|
6
|
-
exports.V19_X_ANALOG_JS_CONTENT = '^2.7.0-beta.
|
|
5
|
+
exports.V19_X_ANALOG_JS_ROUTER = '^2.7.0-beta.10';
|
|
6
|
+
exports.V19_X_ANALOG_JS_CONTENT = '^2.7.0-beta.10';
|
|
7
7
|
exports.V19_X_MARKED = '^15.0.7';
|
|
8
8
|
exports.V19_X_MARKED_GFM_HEADING_ID = '^4.1.1';
|
|
9
9
|
exports.V19_X_MARKED_HIGHLIGHT = '^2.2.1';
|
|
10
10
|
exports.V19_X_MARKED_MANGLE = '^1.1.10';
|
|
11
11
|
exports.V19_X_PRISMJS = '^1.29.0';
|
|
12
12
|
// devDependencies
|
|
13
|
-
exports.V19_X_ANALOG_JS_PLATFORM = '^2.7.0-beta.
|
|
14
|
-
exports.V19_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = '^2.7.0-beta.
|
|
15
|
-
exports.V19_X_ANALOG_JS_VITEST_ANGULAR = '^2.7.0-beta.
|
|
13
|
+
exports.V19_X_ANALOG_JS_PLATFORM = '^2.7.0-beta.10';
|
|
14
|
+
exports.V19_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = '^2.7.0-beta.10';
|
|
15
|
+
exports.V19_X_ANALOG_JS_VITEST_ANGULAR = '^2.7.0-beta.10';
|
|
16
16
|
exports.V19_X_NX_ANGULAR = '^22.0.0';
|
|
17
17
|
exports.V19_X_NX_VITE = '^22.0.0';
|
|
18
18
|
exports.V19_X_JSDOM = '^22.0.0';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"versions.js","sourceRoot":"","sources":["../../../../../../../../../../packages/nx-plugin/src/utils/versions/ng_19_X/versions.ts"],"names":[],"mappings":";;;AAAA,QAAQ;AACK,QAAA,sBAAsB,GAAG,
|
|
1
|
+
{"version":3,"file":"versions.js","sourceRoot":"","sources":["../../../../../../../../../../packages/nx-plugin/src/utils/versions/ng_19_X/versions.ts"],"names":[],"mappings":";;;AAAA,QAAQ;AACK,QAAA,sBAAsB,GAAG,gBAAgB,CAAC;AAC1C,QAAA,uBAAuB,GAAG,gBAAgB,CAAC;AAC3C,QAAA,YAAY,GAAG,SAAS,CAAC;AACzB,QAAA,2BAA2B,GAAG,QAAQ,CAAC;AACvC,QAAA,sBAAsB,GAAG,QAAQ,CAAC;AAClC,QAAA,mBAAmB,GAAG,SAAS,CAAC;AAChC,QAAA,aAAa,GAAG,SAAS,CAAC;AAEvC,kBAAkB;AACL,QAAA,wBAAwB,GAAG,gBAAgB,CAAC;AAC5C,QAAA,mCAAmC,GAAG,gBAAgB,CAAC;AACvD,QAAA,8BAA8B,GAAG,gBAAgB,CAAC;AAClD,QAAA,gBAAgB,GAAG,SAAS,CAAC;AAC7B,QAAA,aAAa,GAAG,SAAS,CAAC;AAC1B,QAAA,WAAW,GAAG,SAAS,CAAC;AACxB,QAAA,yBAAyB,GAAG,QAAQ,CAAC;AACrC,QAAA,YAAY,GAAG,QAAQ,CAAC;AACxB,QAAA,UAAU,GAAG,QAAQ,CAAC;AACtB,QAAA,gBAAgB,GAAG,QAAQ,CAAC;AAC5B,QAAA,kBAAkB,GAAG,QAAQ,CAAC;AAC9B,QAAA,cAAc,GAAG,SAAS,CAAC"}
|
package/src/lib/options.d.ts
CHANGED
|
@@ -5,9 +5,15 @@ import { ContentPluginOptions } from './content-plugin.js';
|
|
|
5
5
|
declare module 'nitropack' {
|
|
6
6
|
interface NitroRouteConfig {
|
|
7
7
|
ssr?: boolean;
|
|
8
|
+
/**
|
|
9
|
+
* Disable progressive streaming SSR for matching routes (falls back to a
|
|
10
|
+
* buffered render). Only meaningful when `experimental.streaming` is on.
|
|
11
|
+
*/
|
|
12
|
+
streaming?: boolean;
|
|
8
13
|
}
|
|
9
14
|
interface NitroRouteRules {
|
|
10
15
|
ssr?: boolean;
|
|
16
|
+
streaming?: boolean;
|
|
11
17
|
}
|
|
12
18
|
}
|
|
13
19
|
export interface PrerenderOptions {
|
|
@@ -124,5 +130,18 @@ export interface Options {
|
|
|
124
130
|
* the LOCALE injection token.
|
|
125
131
|
*/
|
|
126
132
|
i18n?: I18nOptions;
|
|
133
|
+
/**
|
|
134
|
+
* Opt-in experimental features that are not yet stable.
|
|
135
|
+
*/
|
|
136
|
+
experimental?: {
|
|
137
|
+
/**
|
|
138
|
+
* Opt into progressive streaming SSR. When enabled, the SSR build patches
|
|
139
|
+
* `@angular/core` with a per-`@defer` block resolution hook so
|
|
140
|
+
* `@analogjs/router`'s `renderStream` can flush the document head first and
|
|
141
|
+
* each `@defer (hydrate …)` block as it resolves on the server. Has no
|
|
142
|
+
* effect unless the server entry uses `renderStream`.
|
|
143
|
+
*/
|
|
144
|
+
streaming?: boolean;
|
|
145
|
+
};
|
|
127
146
|
}
|
|
128
147
|
export { PrerenderContentDir, PrerenderContentFile };
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
+
import { createRequire } from 'node:module';
|
|
2
|
+
import { join } from 'node:path';
|
|
1
3
|
import viteNitroPlugin from '@analogjs/vite-plugin-nitro';
|
|
2
4
|
import angular from '@analogjs/vite-plugin-angular';
|
|
3
5
|
import { routerPlugin } from './router-plugin.js';
|
|
4
6
|
import { ssrBuildPlugin, i18nDefRegistryPlugin, } from './ssr/ssr-build-plugin.js';
|
|
7
|
+
import { deferStreamingPlugin, streamingSupportedOnAngular, MIN_STREAMING_ANGULAR_MAJOR, } from './ssr/defer-streaming-plugin.js';
|
|
5
8
|
import { contentPlugin } from './content-plugin.js';
|
|
6
9
|
import { clearClientPageEndpointsPlugin } from './clear-client-page-endpoint.js';
|
|
7
10
|
import { ssrXhrBuildPlugin } from './ssr/ssr-xhr-plugin.js';
|
|
@@ -9,12 +12,46 @@ import { depsPlugin } from './deps-plugin.js';
|
|
|
9
12
|
import { injectHTMLPlugin } from './ssr/inject-html-plugin.js';
|
|
10
13
|
import { serverModePlugin } from '../server-mode-plugin.js';
|
|
11
14
|
import { i18nExtractPlugin } from './i18n-extract-plugin.js';
|
|
15
|
+
/**
|
|
16
|
+
* The installed `@angular/core` major version, resolved from the workspace root
|
|
17
|
+
* (where the app's Angular is installed). Returns `null` when it cannot be
|
|
18
|
+
* detected, in which case streaming is not blocked and the build-time
|
|
19
|
+
* anchor-drift detection is relied on instead.
|
|
20
|
+
*/
|
|
21
|
+
function getAngularCoreMajor(workspaceRoot) {
|
|
22
|
+
try {
|
|
23
|
+
const req = createRequire(join(workspaceRoot, 'noop.js'));
|
|
24
|
+
const { version } = req('@angular/core/package.json');
|
|
25
|
+
const major = Number.parseInt(version.split('.')[0], 10);
|
|
26
|
+
return Number.isNaN(major) ? null : major;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
return null;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
12
32
|
export function platformPlugin(opts = {}) {
|
|
13
33
|
const isTest = process.env['NODE_ENV'] === 'test' || !!process.env['VITEST'];
|
|
14
34
|
const { ...platformOptions } = {
|
|
15
35
|
ssr: true,
|
|
16
36
|
...opts,
|
|
17
37
|
};
|
|
38
|
+
// Gate experimental streaming SSR on an Angular version whose compiled
|
|
39
|
+
// @angular/core matches the patch anchors (see MIN_STREAMING_ANGULAR_MAJOR).
|
|
40
|
+
// Reflect the gated value back onto platformOptions so the nitro renderer
|
|
41
|
+
// selection and the deferStreamingPlugin registration below stay consistent —
|
|
42
|
+
// never select the streaming renderer without applying the patch.
|
|
43
|
+
if (platformOptions.ssr && platformOptions.experimental?.streaming) {
|
|
44
|
+
const major = getAngularCoreMajor(platformOptions.workspaceRoot ?? process.cwd());
|
|
45
|
+
if (!streamingSupportedOnAngular(major)) {
|
|
46
|
+
console.warn(`[@analogjs/platform] experimental.streaming requires Angular ` +
|
|
47
|
+
`${MIN_STREAMING_ANGULAR_MAJOR}+ (detected v${major}); streaming is ` +
|
|
48
|
+
`disabled and rendering falls back to buffered SSR.`);
|
|
49
|
+
platformOptions.experimental = {
|
|
50
|
+
...platformOptions.experimental,
|
|
51
|
+
streaming: false,
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
}
|
|
18
55
|
let nitroOptions = platformOptions?.nitro;
|
|
19
56
|
if (nitroOptions?.routeRules) {
|
|
20
57
|
nitroOptions = {
|
|
@@ -27,6 +64,7 @@ export function platformPlugin(opts = {}) {
|
|
|
27
64
|
headers: {
|
|
28
65
|
...config[curr].headers,
|
|
29
66
|
'x-analog-no-ssr': config[curr]?.ssr === false ? 'true' : undefined,
|
|
67
|
+
'x-analog-no-streaming': config[curr]?.streaming === false ? 'true' : undefined,
|
|
30
68
|
},
|
|
31
69
|
},
|
|
32
70
|
};
|
|
@@ -36,6 +74,9 @@ export function platformPlugin(opts = {}) {
|
|
|
36
74
|
return [
|
|
37
75
|
...viteNitroPlugin(platformOptions, nitroOptions),
|
|
38
76
|
...(platformOptions.ssr ? [ssrBuildPlugin(), ...injectHTMLPlugin()] : []),
|
|
77
|
+
...(platformOptions.ssr && platformOptions.experimental?.streaming
|
|
78
|
+
? [deferStreamingPlugin()]
|
|
79
|
+
: []),
|
|
39
80
|
...(!isTest ? depsPlugin(platformOptions) : []),
|
|
40
81
|
...routerPlugin(platformOptions),
|
|
41
82
|
...contentPlugin(platformOptions?.content, platformOptions),
|
|
@@ -66,4 +107,4 @@ export function platformPlugin(opts = {}) {
|
|
|
66
107
|
: []),
|
|
67
108
|
];
|
|
68
109
|
}
|
|
69
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
110
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0tcGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcGxhdGZvcm0vc3JjL2xpYi9wbGF0Zm9ybS1wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUM1QyxPQUFPLEVBQUUsSUFBSSxFQUFFLE1BQU0sV0FBVyxDQUFDO0FBQ2pDLE9BQU8sZUFBZSxNQUFNLDZCQUE2QixDQUFDO0FBQzFELE9BQU8sT0FBTyxNQUFNLCtCQUErQixDQUFDO0FBR3BELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNsRCxPQUFPLEVBQ0wsY0FBYyxFQUNkLHFCQUFxQixHQUN0QixNQUFNLDJCQUEyQixDQUFDO0FBQ25DLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsMkJBQTJCLEVBQzNCLDJCQUEyQixHQUM1QixNQUFNLGlDQUFpQyxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNwRCxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSxpQ0FBaUMsQ0FBQztBQUNqRixPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUM1RCxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sa0JBQWtCLENBQUM7QUFDOUMsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sNkJBQTZCLENBQUM7QUFDL0QsT0FBTyxFQUFFLGdCQUFnQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFDNUQsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUFFN0Q7Ozs7O0dBS0c7QUFDSCxTQUFTLG1CQUFtQixDQUFDLGFBQXFCO0lBQ2hELElBQUksQ0FBQztRQUNILE1BQU0sR0FBRyxHQUFHLGFBQWEsQ0FBQyxJQUFJLENBQUMsYUFBYSxFQUFFLFNBQVMsQ0FB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
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import type { Plugin } from 'vite';
|
|
2
|
+
/**
|
|
3
|
+
* Minimum Angular major whose compiled `@angular/core` FESM matches the
|
|
4
|
+
* streaming patch anchors. Incremental hydration is a stable public API from
|
|
5
|
+
* v20 (`withIncrementalHydration`, `@publicApi 20.0`), but v20's FESM inlines
|
|
6
|
+
* the injection anchor's `DeferBlockStateEnd` profiler event to its numeric
|
|
7
|
+
* ordinal, whereas v21+ keeps the symbolic `ProfilerEvent.DeferBlockStateEnd`
|
|
8
|
+
* form the anchor matches on. Keying on the literal ordinal would be fragile
|
|
9
|
+
* (enum values shift between versions), so v21 is the floor.
|
|
10
|
+
*/
|
|
11
|
+
export declare const MIN_STREAMING_ANGULAR_MAJOR = 21;
|
|
12
|
+
/**
|
|
13
|
+
* Whether the streaming SSR patch can be applied to the installed Angular.
|
|
14
|
+
* A `null` major (version undetectable) returns `true`: don't block on a failed
|
|
15
|
+
* detection — the plugin's anchor-drift detection catches a real mismatch at
|
|
16
|
+
* build time and falls back to buffered rendering.
|
|
17
|
+
*/
|
|
18
|
+
export declare function streamingSupportedOnAngular(major: number | null): boolean;
|
|
19
|
+
/**
|
|
20
|
+
* Pure transform that injects the streaming-SSR per-block resolution hook into
|
|
21
|
+
* `@angular/core`'s compiled output. It is the same class of transform as
|
|
22
|
+
* `i18nDefRegistryPlugin` in ./ssr-build-plugin — a string patch of Angular's
|
|
23
|
+
* bundle applied only to SSR builds. Exported separately so it can be unit
|
|
24
|
+
* tested against a bundle string.
|
|
25
|
+
*
|
|
26
|
+
* Two edits, both keyed on single-occurrence anchors in the module that holds
|
|
27
|
+
* the defer runtime:
|
|
28
|
+
* 1. Inside `applyDeferBlockState`, fire `globalThis.__analogSsrDeferCapture`
|
|
29
|
+
* when a `@defer` block reaches `Complete` on the server, passing the
|
|
30
|
+
* block's live `lContainer` — this is the per-block resolution signal a
|
|
31
|
+
* streaming renderer consumes.
|
|
32
|
+
* 2. Expose `collectNativeNodesInLContainer` via `globalThis.__analogSsrInternals`
|
|
33
|
+
* so the renderer can serialize a block's subtree.
|
|
34
|
+
*
|
|
35
|
+
* Returns `null` when the module is not the one carrying the defer runtime, so
|
|
36
|
+
* it is a no-op on every other Angular module.
|
|
37
|
+
*/
|
|
38
|
+
export declare function injectDeferStreamingHook(code: string): string | null;
|
|
39
|
+
/**
|
|
40
|
+
* Classify an `@angular/core` module for the streaming patch. The patch anchors
|
|
41
|
+
* on internal symbol names, so when Angular changes those the transform would
|
|
42
|
+
* otherwise become a silent no-op and streaming would degrade to buffered with
|
|
43
|
+
* no signal. This distinguishes "not the target module" (skip quietly) from
|
|
44
|
+
* "this IS the `@defer` runtime module but the anchors drifted" (worth warning).
|
|
45
|
+
*/
|
|
46
|
+
export declare function inspectAngularCoreModule(code: string): {
|
|
47
|
+
kind: 'not-target';
|
|
48
|
+
} | {
|
|
49
|
+
kind: 'patchable';
|
|
50
|
+
} | {
|
|
51
|
+
kind: 'drifted';
|
|
52
|
+
reason: string;
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Vite plugin that applies {@link injectDeferStreamingHook} to `@angular/core`
|
|
56
|
+
* during SSR builds, so `@analogjs/router`'s `renderStream` can flush `@defer`
|
|
57
|
+
* blocks as they resolve on the server — without hand-patching node_modules.
|
|
58
|
+
*
|
|
59
|
+
* Only active for SSR. Mirrors the enforce/filter/ssr-gate shape of
|
|
60
|
+
* `i18nDefRegistryPlugin`. If the `@defer` runtime module is found but its
|
|
61
|
+
* anchors have drifted (Angular changed internals), or if it is never
|
|
62
|
+
* encountered at all, the plugin warns rather than silently producing a build
|
|
63
|
+
* that falls back to buffered rendering.
|
|
64
|
+
*/
|
|
65
|
+
export declare function deferStreamingPlugin(): Plugin;
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Minimum Angular major whose compiled `@angular/core` FESM matches the
|
|
3
|
+
* streaming patch anchors. Incremental hydration is a stable public API from
|
|
4
|
+
* v20 (`withIncrementalHydration`, `@publicApi 20.0`), but v20's FESM inlines
|
|
5
|
+
* the injection anchor's `DeferBlockStateEnd` profiler event to its numeric
|
|
6
|
+
* ordinal, whereas v21+ keeps the symbolic `ProfilerEvent.DeferBlockStateEnd`
|
|
7
|
+
* form the anchor matches on. Keying on the literal ordinal would be fragile
|
|
8
|
+
* (enum values shift between versions), so v21 is the floor.
|
|
9
|
+
*/
|
|
10
|
+
export const MIN_STREAMING_ANGULAR_MAJOR = 21;
|
|
11
|
+
/**
|
|
12
|
+
* Whether the streaming SSR patch can be applied to the installed Angular.
|
|
13
|
+
* A `null` major (version undetectable) returns `true`: don't block on a failed
|
|
14
|
+
* detection — the plugin's anchor-drift detection catches a real mismatch at
|
|
15
|
+
* build time and falls back to buffered rendering.
|
|
16
|
+
*/
|
|
17
|
+
export function streamingSupportedOnAngular(major) {
|
|
18
|
+
return major === null || major >= MIN_STREAMING_ANGULAR_MAJOR;
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Pure transform that injects the streaming-SSR per-block resolution hook into
|
|
22
|
+
* `@angular/core`'s compiled output. It is the same class of transform as
|
|
23
|
+
* `i18nDefRegistryPlugin` in ./ssr-build-plugin — a string patch of Angular's
|
|
24
|
+
* bundle applied only to SSR builds. Exported separately so it can be unit
|
|
25
|
+
* tested against a bundle string.
|
|
26
|
+
*
|
|
27
|
+
* Two edits, both keyed on single-occurrence anchors in the module that holds
|
|
28
|
+
* the defer runtime:
|
|
29
|
+
* 1. Inside `applyDeferBlockState`, fire `globalThis.__analogSsrDeferCapture`
|
|
30
|
+
* when a `@defer` block reaches `Complete` on the server, passing the
|
|
31
|
+
* block's live `lContainer` — this is the per-block resolution signal a
|
|
32
|
+
* streaming renderer consumes.
|
|
33
|
+
* 2. Expose `collectNativeNodesInLContainer` via `globalThis.__analogSsrInternals`
|
|
34
|
+
* so the renderer can serialize a block's subtree.
|
|
35
|
+
*
|
|
36
|
+
* Returns `null` when the module is not the one carrying the defer runtime, so
|
|
37
|
+
* it is a no-op on every other Angular module.
|
|
38
|
+
*/
|
|
39
|
+
export function injectDeferStreamingHook(code) {
|
|
40
|
+
const END_ANCHOR = 'profiler(ProfilerEvent.DeferBlockStateEnd);';
|
|
41
|
+
if (!code.includes('function applyDeferBlockState(') ||
|
|
42
|
+
!code.includes(END_ANCHOR)) {
|
|
43
|
+
return null;
|
|
44
|
+
}
|
|
45
|
+
// Wrap the entire guard — not just the call — so a drifted Angular runtime
|
|
46
|
+
// that still matches the anchors but renamed these locals fails as a silent
|
|
47
|
+
// no-op instead of throwing a ReferenceError inside applyDeferBlockState.
|
|
48
|
+
const capture = `try { if (newState === DeferBlockState.Complete && ` +
|
|
49
|
+
`typeof ngServerMode !== 'undefined' && ngServerMode && ` +
|
|
50
|
+
`typeof globalThis.__analogSsrDeferCapture === 'function') { ` +
|
|
51
|
+
`globalThis.__analogSsrDeferCapture({ ssrUniqueId: lDetails[SSR_UNIQUE_ID], lContainer, hostLView }); } } catch (e) {}\n `;
|
|
52
|
+
let out = code.replace(END_ANCHOR, capture + END_ANCHOR);
|
|
53
|
+
if (code.includes('function collectNativeNodesInLContainer(')) {
|
|
54
|
+
out +=
|
|
55
|
+
'\nglobalThis.__analogSsrInternals = Object.assign(globalThis.__analogSsrInternals || {}, { collectNativeNodesInLContainer });\n';
|
|
56
|
+
}
|
|
57
|
+
return out;
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Classify an `@angular/core` module for the streaming patch. The patch anchors
|
|
61
|
+
* on internal symbol names, so when Angular changes those the transform would
|
|
62
|
+
* otherwise become a silent no-op and streaming would degrade to buffered with
|
|
63
|
+
* no signal. This distinguishes "not the target module" (skip quietly) from
|
|
64
|
+
* "this IS the `@defer` runtime module but the anchors drifted" (worth warning).
|
|
65
|
+
*/
|
|
66
|
+
export function inspectAngularCoreModule(code) {
|
|
67
|
+
if (!code.includes('function applyDeferBlockState(')) {
|
|
68
|
+
return { kind: 'not-target' };
|
|
69
|
+
}
|
|
70
|
+
const missing = [];
|
|
71
|
+
if (!code.includes('profiler(ProfilerEvent.DeferBlockStateEnd);')) {
|
|
72
|
+
missing.push('DeferBlockStateEnd profiler anchor');
|
|
73
|
+
}
|
|
74
|
+
if (!code.includes('function collectNativeNodesInLContainer(')) {
|
|
75
|
+
missing.push('collectNativeNodesInLContainer');
|
|
76
|
+
}
|
|
77
|
+
return missing.length === 0
|
|
78
|
+
? { kind: 'patchable' }
|
|
79
|
+
: { kind: 'drifted', reason: `missing ${missing.join(', ')}` };
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Vite plugin that applies {@link injectDeferStreamingHook} to `@angular/core`
|
|
83
|
+
* during SSR builds, so `@analogjs/router`'s `renderStream` can flush `@defer`
|
|
84
|
+
* blocks as they resolve on the server — without hand-patching node_modules.
|
|
85
|
+
*
|
|
86
|
+
* Only active for SSR. Mirrors the enforce/filter/ssr-gate shape of
|
|
87
|
+
* `i18nDefRegistryPlugin`. If the `@defer` runtime module is found but its
|
|
88
|
+
* anchors have drifted (Angular changed internals), or if it is never
|
|
89
|
+
* encountered at all, the plugin warns rather than silently producing a build
|
|
90
|
+
* that falls back to buffered rendering.
|
|
91
|
+
*/
|
|
92
|
+
export function deferStreamingPlugin() {
|
|
93
|
+
let applied = false;
|
|
94
|
+
let warnedDrift = false;
|
|
95
|
+
return {
|
|
96
|
+
name: 'analogjs-defer-streaming',
|
|
97
|
+
enforce: 'post',
|
|
98
|
+
transform: {
|
|
99
|
+
filter: {
|
|
100
|
+
id: /\/@angular\/core\//,
|
|
101
|
+
},
|
|
102
|
+
handler(code, _id, options) {
|
|
103
|
+
if (!options?.ssr)
|
|
104
|
+
return;
|
|
105
|
+
const info = inspectAngularCoreModule(code);
|
|
106
|
+
if (info.kind === 'not-target')
|
|
107
|
+
return;
|
|
108
|
+
if (info.kind === 'drifted') {
|
|
109
|
+
if (!warnedDrift) {
|
|
110
|
+
warnedDrift = true;
|
|
111
|
+
this.warn(`experimental streaming SSR: found @angular/core's @defer runtime ` +
|
|
112
|
+
`but could not apply the resolution hook (${info.reason}). The ` +
|
|
113
|
+
`installed Angular version likely changed internals the patch ` +
|
|
114
|
+
`depends on; streaming will fall back to buffered rendering.`);
|
|
115
|
+
}
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
const out = injectDeferStreamingHook(code);
|
|
119
|
+
if (!out)
|
|
120
|
+
return;
|
|
121
|
+
applied = true;
|
|
122
|
+
return { code: out };
|
|
123
|
+
},
|
|
124
|
+
},
|
|
125
|
+
buildEnd() {
|
|
126
|
+
if (!applied && !warnedDrift) {
|
|
127
|
+
this.warn(`experimental streaming SSR is enabled but @angular/core's @defer ` +
|
|
128
|
+
`runtime module was never encountered during the SSR build, so the ` +
|
|
129
|
+
`resolution hook was not injected. Streaming will fall back to ` +
|
|
130
|
+
`buffered rendering.`);
|
|
131
|
+
}
|
|
132
|
+
},
|
|
133
|
+
};
|
|
134
|
+
}
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVmZXItc3RyZWFtaW5nLXBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3BsYXRmb3JtL3NyYy9saWIvc3NyL2RlZmVyLXN0cmVhbWluZy1wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUE7Ozs7Ozs7O0dBUUc7QUFDSCxNQUFNLENBQUMsTUFBTSwyQkFBMkIsR0FBRyxFQUFFLENBQUM7QUFFOUM7Ozs7O0dBS0c7QUFDSCxNQUFNLFVBQVUsMkJBQTJCLENBQUMsS0FBb0I7SUFDOUQsT0FBTyxLQUFLLEtBQUssSUFBSSxJQUFJLEtBQUssSUFBSSwyQkFBMkIsQ0FBQztBQUNoRSxDQUFDO0FBRUQ7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQWtCRztBQUNILE1BQU0sVUFBVSx3QkFBd0IsQ0FBQyxJQUFZO0lBQ25ELE1BQU0sVUFBVSxHQUFHLDZDQUE2QyxDQUFDO0lBQ2pFLElBQ0UsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLGdDQUFnQyxDQUFDO1FBQ2hELENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxVQUFVLENBQUMsRUFDMUIsQ0FBQztRQUNELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVELDJFQUEyRTtJQUMzRSw0RUFBNEU7SUFDNUUsMEVBQTBFO0lBQzFFLE1BQU0sT0FBTyxHQUNYLHFEQUFxRDtRQUNyRCx5REFBeUQ7UUFDekQsOERBQThEO1FBQzlELDJIQUEySCxDQUFDO0lBRTlILElBQUksR0FBRyxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLE9BQU8sR0FBRyxVQUFVLENBQUMsQ0FBQztJQUV6RCxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsMENBQTBDLENBQUMsRUFBRSxDQUFDO1FBQzlELEdBQUc7WUFDRCxpSUFBaUksQ0FBQztJQUN0SSxDQUFDO0lBRUQsT0FBTyxHQUFHLENBQUM7QUFDYixDQUFDO0FBRUQ7Ozs7OztHQU1HO0FBQ0gsTUFB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
|