@analogjs/platform 0.1.0-beta.0 → 0.1.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/package.json +3 -5
- package/src/lib/build-server.d.ts +3 -0
- package/src/lib/build-server.js +20 -0
- package/src/lib/content-plugin.d.ts +12 -0
- package/src/lib/content-plugin.js +43 -0
- package/src/lib/options.d.ts +4 -0
- package/src/lib/platform-plugin.js +12 -4
- package/src/lib/router-plugin.d.ts +1 -1
- package/src/lib/router-plugin.js +17 -2
- package/src/lib/runtime/api-middleware.js +15 -0
- package/src/lib/runtime/renderer.js +19 -0
- package/src/lib/ssr/build.d.ts +3 -0
- package/src/lib/ssr/build.js +18 -0
- package/src/lib/ssr/dev-server-plugin.d.ts +7 -0
- package/src/lib/ssr/dev-server-plugin.js +90 -0
- package/src/lib/ssr/ssr-build-plugin.d.ts +2 -0
- package/src/lib/ssr/ssr-build-plugin.js +35 -0
- package/src/lib/vite-nitro-plugin.d.ts +2 -1
- package/src/lib/vite-nitro-plugin.js +76 -28
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@analogjs/platform",
|
|
3
|
-
"version": "0.1.0-beta.
|
|
3
|
+
"version": "0.1.0-beta.10",
|
|
4
4
|
"type": "commonjs",
|
|
5
5
|
"description": "The fullstack meta-framework for Angular",
|
|
6
6
|
"author": "Brandon Roberts <robertsbt@gmail.com>",
|
|
@@ -24,11 +24,9 @@
|
|
|
24
24
|
"url": "https://github.com/analogjs/analog.git"
|
|
25
25
|
},
|
|
26
26
|
"dependencies": {
|
|
27
|
-
"nitropack": "^0.6.1"
|
|
28
|
-
},
|
|
29
|
-
"peerDependencies": {
|
|
27
|
+
"nitropack": "^0.6.1",
|
|
30
28
|
"@analogjs/vite-plugin-angular": "latest"
|
|
31
29
|
},
|
|
32
30
|
"main": "./src/index.js",
|
|
33
|
-
"
|
|
31
|
+
"types": "./src/index.d.ts"
|
|
34
32
|
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildServer = void 0;
|
|
4
|
+
const load_esm_1 = require("@angular-devkit/build-angular/src/utils/load-esm");
|
|
5
|
+
async function buildServer(options, nitroConfig) {
|
|
6
|
+
const { createNitro, build, prepare, copyPublicAssets, prerender } = await (0, load_esm_1.loadEsmModule)('nitropack');
|
|
7
|
+
const nitro = await createNitro({
|
|
8
|
+
dev: false,
|
|
9
|
+
...nitroConfig,
|
|
10
|
+
});
|
|
11
|
+
await prepare(nitro);
|
|
12
|
+
await copyPublicAssets(nitro);
|
|
13
|
+
await prerender(nitro);
|
|
14
|
+
if (!options?.prerender) {
|
|
15
|
+
await build(nitro);
|
|
16
|
+
}
|
|
17
|
+
await nitro.close();
|
|
18
|
+
}
|
|
19
|
+
exports.buildServer = buildServer;
|
|
20
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQtc2VydmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcGxhdGZvcm0vc3JjL2xpYi9idWlsZC1zZXJ2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0VBQWlGO0FBSzFFLEtBQUssVUFBVSxXQUFXLENBQy9CLE9BQWlCLEVBQ2pCLFdBQXlCO0lBRXpCLE1BQU0sRUFBRSxXQUFXLEVBQUUsS0FBSyxFQUFFLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsR0FDaEUsTUFBTSxJQUFBLHdCQUFhLEVBQTZCLFdBQVcsQ0FBQyxDQUFDO0lBRS9ELE1BQU0sS0FBSyxHQUFHLE1BQU0sV0FBVyxDQUFDO1FBQzlCLEdBQUcsRUFBRSxLQUFLO1FBQ1YsR0FBRyxXQUFXO0tBQ2YsQ0FBQyxDQUFDO0lBQ0gsTUFBTSxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7SUFDckIsTUFBTSxnQkFBZ0IsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUM5QixNQUFNLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQztJQUV2QixJQUFJLENBQUMsT0FBTyxFQUFFLFNBQVMsRUFBRTtRQUN2QixNQUFNLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztLQUNwQjtJQUVELE1BQU0sS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO0FBQ3RCLENBQUM7QUFwQkQsa0NBb0JDIn0=
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { Plugin } from 'vite';
|
|
2
|
+
/**
|
|
3
|
+
* This excludes the build from including the
|
|
4
|
+
* @analogjs/content package because it is
|
|
5
|
+
* dynamically imported at runtime.
|
|
6
|
+
*
|
|
7
|
+
* This prevents a dependency on @analogjs/router
|
|
8
|
+
* to @analogjs/content
|
|
9
|
+
*
|
|
10
|
+
* @returns
|
|
11
|
+
*/
|
|
12
|
+
export declare function contentPlugin(): Plugin[];
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.contentPlugin = void 0;
|
|
4
|
+
const fs = require("fs");
|
|
5
|
+
const path = require("path");
|
|
6
|
+
/**
|
|
7
|
+
* This excludes the build from including the
|
|
8
|
+
* @analogjs/content package because it is
|
|
9
|
+
* dynamically imported at runtime.
|
|
10
|
+
*
|
|
11
|
+
* This prevents a dependency on @analogjs/router
|
|
12
|
+
* to @analogjs/content
|
|
13
|
+
*
|
|
14
|
+
* @returns
|
|
15
|
+
*/
|
|
16
|
+
function contentPlugin() {
|
|
17
|
+
let excludeContent = true;
|
|
18
|
+
const pkgJsonPath = path.resolve(process.cwd(), './package.json');
|
|
19
|
+
const packageJsonExists = fs.existsSync(pkgJsonPath);
|
|
20
|
+
if (packageJsonExists) {
|
|
21
|
+
const pkg = JSON.parse(fs.readFileSync(pkgJsonPath, 'utf-8'));
|
|
22
|
+
if (pkg.dependencies['@analogjs/content']) {
|
|
23
|
+
excludeContent = false;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return [
|
|
27
|
+
{
|
|
28
|
+
name: 'analogjs-content-build-plugin',
|
|
29
|
+
apply: 'build',
|
|
30
|
+
config() {
|
|
31
|
+
return {
|
|
32
|
+
build: {
|
|
33
|
+
rollupOptions: {
|
|
34
|
+
external: [excludeContent ? '@analogjs/content' : ''],
|
|
35
|
+
},
|
|
36
|
+
},
|
|
37
|
+
};
|
|
38
|
+
},
|
|
39
|
+
},
|
|
40
|
+
];
|
|
41
|
+
}
|
|
42
|
+
exports.contentPlugin = contentPlugin;
|
|
43
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29udGVudC1wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9wbGF0Zm9ybS9zcmMvbGliL2NvbnRlbnQtcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUNBLHlCQUF5QjtBQUN6Qiw2QkFBNkI7QUFFN0I7Ozs7Ozs7OztHQVNHO0FBQ0gsU0FBZ0IsYUFBYTtJQUMzQixJQUFJLGNBQWMsR0FBRyxJQUFJLENBQUM7SUFFMUIsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztJQUNsRSxNQUFNLGlCQUFpQixHQUFHLEVBQUUsQ0FBQyxVQUFVLENBQUMsV0FBVyxDQUFDLENBQUM7SUFFckQsSUFBSSxpQkFBaUIsRUFBRTtRQUNyQixNQUFNLEdBQUcsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxZQUFZLENBQUMsV0FBVyxFQUFFLE9BQU8sQ0FBQyxDQUFDLENBQUM7UUFFOUQsSUFBSSxHQUFHLENBQUMsWUFBWSxDQUFDLG1CQUFtQixDQUFDLEVBQUU7WUFDekMsY0FBYyxHQUFHLEtBQUssQ0FBQztTQUN4QjtLQUNGO0lBRUQsT0FBTztRQUNMO1lBQ0UsSUFBSSxFQUFFLCtCQUErQjtZQUNyQyxLQUFLLEVBQUUsT0FBTztZQUNkLE1BQU07Z0JBQ0osT0FBTztvQkFDTCxLQUFLLEVBQUU7d0JBQ0wsYUFBYSxFQUFFOzRCQUNiLFFBQVEsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUMsbUJBQW1CLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQzt5QkFDdEQ7cUJBQ0Y7aUJBQ0YsQ0FBQztZQUNKLENBQUM7U0FDRjtLQUNGLENBQUM7QUFDSixDQUFDO0FBN0JELHNDQTZCQyJ9
|
package/src/lib/options.d.ts
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
1
|
import type { PluginOptions } from '@analogjs/vite-plugin-angular';
|
|
2
2
|
import { NitroConfig } from 'nitropack';
|
|
3
3
|
export interface Options {
|
|
4
|
+
ssr?: boolean;
|
|
5
|
+
ssrBuildDir?: string;
|
|
6
|
+
prerender?: boolean;
|
|
7
|
+
entryServer?: string;
|
|
4
8
|
vite?: PluginOptions;
|
|
5
9
|
nitro?: NitroConfig;
|
|
6
10
|
}
|
|
@@ -4,12 +4,20 @@ exports.platformPlugin = void 0;
|
|
|
4
4
|
const vite_plugin_angular_1 = require("@analogjs/vite-plugin-angular");
|
|
5
5
|
const vite_nitro_plugin_1 = require("./vite-nitro-plugin");
|
|
6
6
|
const router_plugin_1 = require("./router-plugin");
|
|
7
|
-
|
|
7
|
+
const dev_server_plugin_1 = require("./ssr/dev-server-plugin");
|
|
8
|
+
const ssr_build_plugin_1 = require("./ssr/ssr-build-plugin");
|
|
9
|
+
const content_plugin_1 = require("./content-plugin");
|
|
10
|
+
function platformPlugin(opts = {}) {
|
|
8
11
|
return [
|
|
9
|
-
(0, vite_nitro_plugin_1.viteNitroPlugin)(opts?.nitro),
|
|
10
|
-
|
|
12
|
+
(0, vite_nitro_plugin_1.viteNitroPlugin)(opts, opts?.nitro),
|
|
13
|
+
(opts.ssr ? (0, ssr_build_plugin_1.ssrBuildPlugin)() : false),
|
|
11
14
|
...(0, router_plugin_1.routerPlugin)(),
|
|
15
|
+
...(0, content_plugin_1.contentPlugin)(),
|
|
16
|
+
(opts.ssr
|
|
17
|
+
? (0, dev_server_plugin_1.devServerPlugin)({ entryServer: opts.entryServer })
|
|
18
|
+
: false),
|
|
19
|
+
...(0, vite_plugin_angular_1.default)(opts?.vite),
|
|
12
20
|
];
|
|
13
21
|
}
|
|
14
22
|
exports.platformPlugin = platformPlugin;
|
|
15
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
23
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGxhdGZvcm0tcGx1Z2luLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcGFja2FnZXMvcGxhdGZvcm0vc3JjL2xpYi9wbGF0Zm9ybS1wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQ0EsdUVBQW9EO0FBRXBELDJEQUFzRDtBQUN0RCxtREFBK0M7QUFDL0MsK0RBQTBEO0FBQzFELDZEQUF3RDtBQUN4RCxxREFBaUQ7QUFFakQsU0FBZ0IsY0FBYyxDQUFDLE9BQWdCLEVBQUU7SUFDL0MsT0FBTztRQUNMLElBQUEsbUNBQWUsRUFBQyxJQUFJLEVBQUUsSUFBSSxFQUFFLEtBQUssQ0FBQztRQUNsQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLElBQUEsaUNBQWMsR0FBRSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQVc7UUFDL0MsR0FBRyxJQUFBLDRCQUFZLEdBQUU7UUFDakIsR0FBRyxJQUFBLDhCQUFhLEdBQUU7UUFDbEIsQ0FBQyxJQUFJLENBQUMsR0FBRztZQUNQLENBQUMsQ0FBQyxJQUFBLG1DQUFlLEVBQUMsRUFBRSxXQUFXLEVBQUUsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO1lBQ3BELENBQUMsQ0FBQyxLQUFLLENBQVc7UUFDcEIsR0FBRyxJQUFBLDZCQUFPLEVBQUMsSUFBSSxFQUFFLElBQUksQ0FBQztLQUN2QixDQUFDO0FBQ0osQ0FBQztBQVhELHdDQVdDIn0=
|
package/src/lib/router-plugin.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.routerPlugin = void 0;
|
|
4
|
+
const vite_1 = require("vite");
|
|
4
5
|
/**
|
|
5
6
|
* This plugin invalidates the files for routes when new files
|
|
6
7
|
* are added/deleted.
|
|
@@ -11,11 +12,25 @@ exports.routerPlugin = void 0;
|
|
|
11
12
|
*/
|
|
12
13
|
function routerPlugin() {
|
|
13
14
|
return [
|
|
15
|
+
{
|
|
16
|
+
name: 'analogjs-router-plugin',
|
|
17
|
+
config() {
|
|
18
|
+
return {
|
|
19
|
+
ssr: {
|
|
20
|
+
noExternal: ['@analogjs/**', '@angular/**'],
|
|
21
|
+
},
|
|
22
|
+
optimizeDeps: {
|
|
23
|
+
include: ['rxjs'],
|
|
24
|
+
exclude: ['@angular/platform-server', '@analogjs/router'],
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
},
|
|
28
|
+
},
|
|
14
29
|
{
|
|
15
30
|
name: 'analogjs-router-invalidate-routes',
|
|
16
31
|
configureServer(server) {
|
|
17
32
|
function invalidateRoutes(path) {
|
|
18
|
-
if (path.includes(
|
|
33
|
+
if (path.includes((0, vite_1.normalizePath)(`/app/routes/`))) {
|
|
19
34
|
server.moduleGraph.fileToModulesMap.forEach((mods) => {
|
|
20
35
|
mods.forEach((mod) => {
|
|
21
36
|
if (mod.id?.includes('@analogjs_router.js')) {
|
|
@@ -38,4 +53,4 @@ function routerPlugin() {
|
|
|
38
53
|
];
|
|
39
54
|
}
|
|
40
55
|
exports.routerPlugin = routerPlugin;
|
|
41
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
56
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm91dGVyLXBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3BsYXRmb3JtL3NyYy9saWIvcm91dGVyLXBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBNkM7QUFFN0M7Ozs7Ozs7R0FPRztBQUNILFNBQWdCLFlBQVk7SUFDMUIsT0FBTztRQUNMO1lBQ0UsSUFBSSxFQUFFLHdCQUF3QjtZQUM5QixNQUFNO2dCQUNKLE9BQU87b0JBQ0wsR0FBRyxFQUFFO3dCQUNILFVBQVUsRUFBRSxDQUFDLGNBQWMsRUFBRSxhQUFhLENBQUM7cUJBQzVDO29CQUNELFlBQVksRUFBRTt3QkFDWixPQUFPLEVBQUUsQ0FBQyxNQUFNLENBQUM7d0JBQ2pCLE9BQU8sRUFBRSxDQUFDLDBCQUEwQixFQUFFLGtCQUFrQixDQUFDO3FCQUMxRDtpQkFDRixDQUFDO1lBQ0osQ0FBQztTQUNGO1FBQ0Q7WUFDRSxJQUFJLEVBQUUsbUNBQW1DO1lBQ3pDLGVBQWUsQ0FBQyxNQUFNO2dCQUNwQixTQUFTLGdCQUFnQixDQUFDLElBQVk7b0JBQ3BDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFBLG9CQUFhLEVBQUMsY0FBYyxDQUFDLENBQUMsRUFBRTt3QkFDaEQsTUFBTSxDQUFDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRTs0QkFDbkQsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsRUFBRSxFQUFFO2dDQUNuQixJQUFJLEdBQUcsQ0FBQyxFQUFFLEVBQUUsUUFBUSxDQUFDLHFCQUFxQixDQUFDLEVBQUU7b0NBQzNDLE1BQU0sQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7b0NBRXpDLEdBQUcsQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUU7d0NBQzVCLE1BQU0sQ0FBQyxXQUFXLENBQUMsZ0JBQWdCLENBQUMsR0FBRyxDQUFDLENBQUM7b0NBQzNDLENBQUMsQ0FBQyxDQUFDO2lDQUNKOzRCQUNILENBQUMsQ0FBQyxDQUFDO3dCQUNMLENBQUMsQ0FBQyxDQUFDO3dCQUVILE1BQU0sQ0FBQyxFQUFFLENBQUMsSUFBSSxDQUFDOzRCQUNiLElBQUksRUFBRSxhQUFhO3lCQUNwQixDQUFDLENBQUM7cUJBQ0o7Z0JBQ0gsQ0FBQztnQkFFRCxNQUFNLENBQUMsT0FBTyxDQUFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsZ0JBQWdCLENBQUMsQ0FBQztnQkFDM0MsTUFBTSxDQUFDLE9BQU8sQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFLGdCQUFnQixDQUFDLENBQUM7WUFDaEQsQ0FBQztTQUNGO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUE1Q0Qsb0NBNENDIn0=
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is written in JavaScript
|
|
3
|
+
* because it is used by Nitro to build
|
|
4
|
+
* the renderer for SSR.
|
|
5
|
+
*
|
|
6
|
+
* The package is shipped as commonjs
|
|
7
|
+
* which won't be parsed by Nitro correctly.
|
|
8
|
+
*/
|
|
9
|
+
import { eventHandler } from 'h3';
|
|
10
|
+
|
|
11
|
+
export default eventHandler(async (event) => {
|
|
12
|
+
if (event.req.url?.startsWith('/api')) {
|
|
13
|
+
return $fetch(`${event.req.url?.replace('/api', '')}`);
|
|
14
|
+
}
|
|
15
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* This file is written in JavaScript
|
|
3
|
+
* because it is used by Nitro to build
|
|
4
|
+
* the renderer for SSR.
|
|
5
|
+
*
|
|
6
|
+
* The package is shipped as commonjs
|
|
7
|
+
* which won't be parsed by Nitro correctly.
|
|
8
|
+
*/
|
|
9
|
+
import { eventHandler } from 'h3';
|
|
10
|
+
import { useStorage } from '#imports';
|
|
11
|
+
|
|
12
|
+
export default eventHandler(async (event) => {
|
|
13
|
+
const render = (await import('#build/../ssr/main.server.mjs'))['default'];
|
|
14
|
+
const template = await useStorage().getItem(`/assets/public:index.html`);
|
|
15
|
+
|
|
16
|
+
const html = await render(event.req.url, template);
|
|
17
|
+
|
|
18
|
+
return html;
|
|
19
|
+
});
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.buildSSRApp = void 0;
|
|
4
|
+
const vite_1 = require("vite");
|
|
5
|
+
async function buildSSRApp(config, options) {
|
|
6
|
+
const ssrBuildConfig = (0, vite_1.mergeConfig)(config, {
|
|
7
|
+
build: {
|
|
8
|
+
ssr: true,
|
|
9
|
+
rollupOptions: {
|
|
10
|
+
input: options?.entryServer || './src/main.server.ts',
|
|
11
|
+
},
|
|
12
|
+
outDir: options?.ssrBuildDir || './dist/ssr',
|
|
13
|
+
},
|
|
14
|
+
});
|
|
15
|
+
await (0, vite_1.build)(ssrBuildConfig);
|
|
16
|
+
}
|
|
17
|
+
exports.buildSSRApp = buildSSRApp;
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVpbGQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9wbGF0Zm9ybS9zcmMvbGliL3Nzci9idWlsZC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSwrQkFBc0Q7QUFHL0MsS0FBSyxVQUFVLFdBQVcsQ0FBQyxNQUFrQixFQUFFLE9BQWlCO0lBQ3JFLE1BQU0sY0FBYyxHQUFHLElBQUEsa0JBQVcsRUFBQyxNQUFNLEVBQUU7UUFDekMsS0FBSyxFQUFFO1lBQ0wsR0FBRyxFQUFFLElBQUk7WUFDVCxhQUFhLEVBQUU7Z0JBQ2IsS0FBSyxFQUFFLE9BQU8sRUFBRSxXQUFXLElBQUksc0JBQXNCO2FBQ3REO1lBQ0QsTUFBTSxFQUFFLE9BQU8sRUFBRSxXQUFXLElBQUksWUFBWTtTQUM3QztLQUNGLENBQUMsQ0FBQztJQUVILE1BQU0sSUFBQSxZQUFLLEVBQUMsY0FBYyxDQUFDLENBQUM7QUFDOUIsQ0FBQztBQVpELGtDQVlDIn0=
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// SSR dev server, middleware and error page source modified from
|
|
3
|
+
// https://github.com/solidjs/solid-start/blob/main/packages/start/dev/server.js
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.devServerPlugin = void 0;
|
|
6
|
+
const path = require("path");
|
|
7
|
+
const fs = require("fs");
|
|
8
|
+
function devServerPlugin(options) {
|
|
9
|
+
const entryServer = options.entryServer || 'src/main.server.ts';
|
|
10
|
+
const index = options.index || 'index.html';
|
|
11
|
+
return {
|
|
12
|
+
name: 'analogjs-dev-ssr-plugin',
|
|
13
|
+
config() {
|
|
14
|
+
return {
|
|
15
|
+
resolve: {
|
|
16
|
+
alias: {
|
|
17
|
+
'~analog/entry-server': entryServer,
|
|
18
|
+
},
|
|
19
|
+
},
|
|
20
|
+
};
|
|
21
|
+
},
|
|
22
|
+
configureServer(viteServer) {
|
|
23
|
+
return async () => {
|
|
24
|
+
remove_html_middlewares(viteServer.middlewares);
|
|
25
|
+
viteServer.middlewares.use(async (req, res) => {
|
|
26
|
+
let template = fs.readFileSync(path.resolve(viteServer.config.root, index), 'utf-8');
|
|
27
|
+
template = await viteServer.transformIndexHtml(req.originalUrl, template);
|
|
28
|
+
try {
|
|
29
|
+
const entryServer = (await viteServer.ssrLoadModule('~analog/entry-server'))['default'];
|
|
30
|
+
const result = await entryServer(req.originalUrl, template);
|
|
31
|
+
res.end(result);
|
|
32
|
+
}
|
|
33
|
+
catch (e) {
|
|
34
|
+
viteServer && viteServer.ssrFixStacktrace(e);
|
|
35
|
+
res.statusCode = 500;
|
|
36
|
+
res.end(`
|
|
37
|
+
<!DOCTYPE html>
|
|
38
|
+
<html lang="en">
|
|
39
|
+
<head>
|
|
40
|
+
<meta charset="UTF-8" />
|
|
41
|
+
<title>Error</title>
|
|
42
|
+
<script type="module">
|
|
43
|
+
import { ErrorOverlay } from '/@vite/client'
|
|
44
|
+
document.body.appendChild(new ErrorOverlay(${JSON.stringify(prepareError(req, e)).replace(/</g, '\\u003c')}))
|
|
45
|
+
</script>
|
|
46
|
+
</head>
|
|
47
|
+
<body>
|
|
48
|
+
</body>
|
|
49
|
+
</html>
|
|
50
|
+
`);
|
|
51
|
+
throw e;
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
};
|
|
55
|
+
},
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
exports.devServerPlugin = devServerPlugin;
|
|
59
|
+
/**
|
|
60
|
+
* Removes Vite internal middleware
|
|
61
|
+
*
|
|
62
|
+
* @param server
|
|
63
|
+
*/
|
|
64
|
+
function remove_html_middlewares(server) {
|
|
65
|
+
const html_middlewares = [
|
|
66
|
+
'viteIndexHtmlMiddleware',
|
|
67
|
+
'vite404Middleware',
|
|
68
|
+
'viteSpaFallbackMiddleware',
|
|
69
|
+
];
|
|
70
|
+
for (let i = server.stack.length - 1; i > 0; i--) {
|
|
71
|
+
// @ts-ignore
|
|
72
|
+
if (html_middlewares.includes(server.stack[i].handle.name)) {
|
|
73
|
+
server.stack.splice(i, 1);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Formats error for SSR message in error overlay
|
|
79
|
+
* @param req
|
|
80
|
+
* @param error
|
|
81
|
+
* @returns
|
|
82
|
+
*/
|
|
83
|
+
function prepareError(req, error) {
|
|
84
|
+
const e = error;
|
|
85
|
+
return {
|
|
86
|
+
message: `An error occured while server rendering ${req.url}:\n\n\t${typeof e === 'string' ? e : e.message} `,
|
|
87
|
+
stack: typeof e === 'string' ? '' : e.stack,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGV2LXNlcnZlci1wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9wbGF0Zm9ybS9zcmMvbGliL3Nzci9kZXYtc2VydmVyLXBsdWdpbi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsaUVBQWlFO0FBQ2pFLGdGQUFnRjs7O0FBR2hGLDZCQUE2QjtBQUM3Qix5QkFBeUI7QUFPekIsU0FBZ0IsZUFBZSxDQUFDLE9BQXNCO0lBQ3BELE1BQU0sV0FBVyxHQUFHLE9BQU8sQ0FBQyxXQUFXLElBQUksb0JBQW9CLENBQUM7SUFDaEUsTUFBTSxLQUFLLEdBQUcsT0FBTyxDQUFDLEtBQUssSUFBSSxZQUFZLENBQUM7SUFFNUMsT0FBTztRQUNMLElBQUksRUFBRSx5QkFBeUI7UUFDL0IsTUFBTTtZQUNKLE9BQU87Z0JBQ0wsT0FBTyxFQUFFO29CQUNQLEtBQUssRUFBRTt3QkFDTCxzQkFBc0IsRUFBRSxXQUFXO3FCQUNwQztpQkFDRjthQUNGLENBQUM7UUFDSixDQUFDO1FBQ0QsZUFBZSxDQUFDLFVBQVU7WUFDeEIsT0FBTyxLQUFLLElBQUksRUFBRTtnQkFDaEIsdUJBQXVCLENBQUMsVUFBVSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNoRCxVQUFVLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxLQUFLLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxFQUFFO29CQUM1QyxJQUFJLFFBQVEsR0FBRyxFQUFFLENBQUMsWUFBWSxDQUM1QixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEtBQUssQ0FBQyxFQUMzQyxPQUFPLENBQ1IsQ0FBQztvQkFFRixRQUFRLEdBQUcsTUFBTSxVQUFVLENBQUMsa0JBQWtCLENBQzVDLEdBQUcsQ0FBQyxXQUFxQixFQUN6QixRQUFRLENBQ1QsQ0FBQztvQkFFRixJQUFJO3dCQUNGLE1BQU0sV0FBVyxHQUFHLENBQ2xCLE1BQU0sVUFBVSxDQUFDLGFBQWEsQ0FBQyxzQkFBc0IsQ0FBQyxDQUN2RCxDQUFDLFNBQVMsQ0FBQyxDQUFDO3dCQUNiLE1BQU0sTUFBTSxHQUFHLE1BQU0sV0FBVyxDQUFDLEdBQUcsQ0FBQyxXQUFXLEVBQUUsUUFBUSxDQUFDLENBQUM7d0JBQzVELEdBQUcsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7cUJBQ2pCO29CQUFDLE9BQU8sQ0FBQyxFQUFFO3dCQUNWLFVBQVUsSUFBSSxVQUFVLENBQUMsZ0JBQWdCLENBQUMsQ0FBVSxDQUFDLENBQUM7d0JBQ3RELEdBQUcsQ0FBQyxVQUFVLEdBQUcsR0FBRyxDQUFDO3dCQUNyQixHQUFHLENBQUMsR0FBRyxDQUFDOzs7Ozs7OztpRUFRNkMsSUFBSSxDQUFDLFNBQVMsQ0FDekQsWUFBWSxDQUFDLEdBQUcsRUFBRSxDQUFDLENBQUMsQ0FDckIsQ0FBQyxPQUFPLENBQUMsSUFBSSxFQUFFLFNBQVMsQ0FBQzs7Ozs7O2FBTWpDLENBQUMsQ0FBQzt3QkFFSCxNQUFNLENBQUMsQ0FBQztxQkFDVDtnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQztRQUNKLENBQUM7S0FDRixDQUFDO0FBQ0osQ0FBQztBQTlERCwwQ0E4REM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyx1QkFBdUIsQ0FBQyxNQUFvQztJQUNuRSxNQUFNLGdCQUFnQixHQUFHO1FBQ3ZCLHlCQUF5QjtRQUN6QixtQkFBbUI7UUFDbkIsMkJBQTJCO0tBQzVCLENBQUM7SUFDRixLQUFLLElBQUksQ0FBQyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ2hELGFBQWE7UUFDYixJQUFJLGdCQUFnQixDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtZQUMxRCxNQUFNLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7U0FDM0I7S0FDRjtBQUNILENBQUM7QUFFRDs7Ozs7R0FLRztBQUNILFNBQVMsWUFBWSxDQUFDLEdBQTRCLEVBQUUsS0FBYztJQUNoRSxNQUFNLENBQUMsR0FBRyxLQUFjLENBQUM7SUFDekIsT0FBTztRQUNMLE9BQU8sRUFBRSwyQ0FBMkMsR0FBRyxDQUFDLEdBQUcsVUFDekQsT0FBTyxDQUFDLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUNoQyxHQUFHO1FBQ0gsS0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLLFFBQVEsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSztLQUM1QyxDQUFDO0FBQ0osQ0FBQyJ9
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ssrBuildPlugin = void 0;
|
|
4
|
+
const vite_1 = require("vite");
|
|
5
|
+
function ssrBuildPlugin() {
|
|
6
|
+
return {
|
|
7
|
+
name: 'analogjs-ssr-build-plugin',
|
|
8
|
+
config(_config) {
|
|
9
|
+
return {
|
|
10
|
+
resolve: {
|
|
11
|
+
alias: {
|
|
12
|
+
'zone.js/node': 'zone.js/bundles/zone-node.umd.js',
|
|
13
|
+
},
|
|
14
|
+
},
|
|
15
|
+
};
|
|
16
|
+
},
|
|
17
|
+
transform(code, id) {
|
|
18
|
+
// Remove usage of `with()` in sloppy.js file
|
|
19
|
+
if (id.includes((0, vite_1.normalizePath)('domino/lib/sloppy.js'))) {
|
|
20
|
+
return {
|
|
21
|
+
code: code.replace(/with\(/gi, 'if('),
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
// Convert usage of xhr2 default import
|
|
25
|
+
if (code.includes('new xhr2.')) {
|
|
26
|
+
return {
|
|
27
|
+
code: code.replace('new xhr2.', 'new xhr2.default.'),
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
return;
|
|
31
|
+
},
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
exports.ssrBuildPlugin = ssrBuildPlugin;
|
|
35
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3NyLWJ1aWxkLXBsdWdpbi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uL3BhY2thZ2VzL3BsYXRmb3JtL3NyYy9saWIvc3NyL3Nzci1idWlsZC1wbHVnaW4udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBQUEsK0JBQTZDO0FBRTdDLFNBQWdCLGNBQWM7SUFDNUIsT0FBTztRQUNMLElBQUksRUFBRSwyQkFBMkI7UUFDakMsTUFBTSxDQUFDLE9BQU87WUFDWixPQUFPO2dCQUNMLE9BQU8sRUFBRTtvQkFDUCxLQUFLLEVBQUU7d0JBQ0wsY0FBYyxFQUFFLGtDQUFrQztxQkFDbkQ7aUJBQ0Y7YUFDRixDQUFDO1FBQ0osQ0FBQztRQUNELFNBQVMsQ0FBQyxJQUFJLEVBQUUsRUFBRTtZQUNoQiw2Q0FBNkM7WUFDN0MsSUFBSSxFQUFFLENBQUMsUUFBUSxDQUFDLElBQUEsb0JBQWEsRUFBQyxzQkFBc0IsQ0FBQyxDQUFDLEVBQUU7Z0JBQ3RELE9BQU87b0JBQ0wsSUFBSSxFQUFFLElBQUksQ0FBQyxPQUFPLENBQUMsVUFBVSxFQUFFLEtBQUssQ0FBQztpQkFDdEMsQ0FBQzthQUNIO1lBRUQsdUNBQXVDO1lBQ3ZDLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUMsRUFBRTtnQkFDOUIsT0FBTztvQkFDTCxJQUFJLEVBQUUsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLEVBQUUsbUJBQW1CLENBQUM7aUJBQ3JELENBQUM7YUFDSDtZQUVELE9BQU87UUFDVCxDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUM7QUE5QkQsd0NBOEJDIn0=
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import { NitroConfig } from 'nitropack';
|
|
2
2
|
import { Plugin } from 'vite';
|
|
3
|
-
|
|
3
|
+
import { Options } from './options';
|
|
4
|
+
export declare function viteNitroPlugin(options?: Options, nitroOptions?: NitroConfig): Plugin;
|
|
@@ -3,42 +3,90 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.viteNitroPlugin = void 0;
|
|
4
4
|
const load_esm_1 = require("@angular-devkit/build-angular/src/utils/load-esm");
|
|
5
5
|
const h3_1 = require("h3");
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
const build_server_1 = require("./build-server");
|
|
7
|
+
const build_1 = require("./ssr/build");
|
|
8
|
+
function viteNitroPlugin(options, nitroOptions) {
|
|
9
|
+
const rootDir = nitroOptions?.rootDir || '.';
|
|
10
|
+
const isTest = process.env['NODE_ENV'] === 'test' || !!process.env['VITEST'];
|
|
11
|
+
let nitroConfig = {
|
|
12
|
+
rootDir,
|
|
13
|
+
logLevel: nitroOptions?.logLevel || 0,
|
|
14
|
+
srcDir: `${rootDir}/src`,
|
|
15
|
+
scanDirs: [`${rootDir}/src/server`],
|
|
11
16
|
output: {
|
|
12
|
-
dir: '
|
|
13
|
-
|
|
17
|
+
dir: '../dist/server',
|
|
18
|
+
publicDir: '../dist/server/public',
|
|
19
|
+
...nitroOptions?.output,
|
|
20
|
+
},
|
|
21
|
+
buildDir: './dist/.nitro',
|
|
22
|
+
typescript: {
|
|
23
|
+
generateTsConfig: false,
|
|
14
24
|
},
|
|
15
|
-
buildDir: '../dist/.nitro',
|
|
16
|
-
...opts,
|
|
17
25
|
};
|
|
26
|
+
let isBuild = false;
|
|
27
|
+
let isServe = false;
|
|
28
|
+
let ssrBuild = false;
|
|
29
|
+
let config;
|
|
18
30
|
return {
|
|
19
|
-
name: 'vite-nitro-plugin',
|
|
31
|
+
name: 'analogjs-vite-nitro-plugin',
|
|
32
|
+
config(_config, { command }) {
|
|
33
|
+
isServe = command === 'serve';
|
|
34
|
+
isBuild = command === 'build';
|
|
35
|
+
ssrBuild = _config.build?.ssr === true;
|
|
36
|
+
config = _config;
|
|
37
|
+
if (isBuild && ssrBuild) {
|
|
38
|
+
nitroConfig = {
|
|
39
|
+
...nitroConfig,
|
|
40
|
+
publicAssets: [{ dir: `../dist/client` }],
|
|
41
|
+
serverAssets: [{ baseName: 'public', dir: `./dist/client` }],
|
|
42
|
+
externals: {
|
|
43
|
+
inline: ['zone.js/node'],
|
|
44
|
+
external: ['rxjs', 'node-fetch-native/dist/polyfill', 'destr'],
|
|
45
|
+
},
|
|
46
|
+
moduleSideEffects: ['zone.js/bundles/zone-node.umd.js'],
|
|
47
|
+
renderer: `${__dirname}/runtime/renderer`,
|
|
48
|
+
handlers: [
|
|
49
|
+
{
|
|
50
|
+
handler: `${__dirname}/runtime/api-middleware`,
|
|
51
|
+
middleware: true,
|
|
52
|
+
},
|
|
53
|
+
],
|
|
54
|
+
};
|
|
55
|
+
}
|
|
56
|
+
nitroConfig = {
|
|
57
|
+
...nitroConfig,
|
|
58
|
+
...nitroOptions,
|
|
59
|
+
};
|
|
60
|
+
},
|
|
20
61
|
async configureServer(viteServer) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
62
|
+
if (isServe && !isTest) {
|
|
63
|
+
const { createNitro, createDevServer, build, prepare } = await (0, load_esm_1.loadEsmModule)('nitropack');
|
|
64
|
+
const nitro = await createNitro({
|
|
65
|
+
dev: true,
|
|
66
|
+
...nitroConfig,
|
|
67
|
+
});
|
|
68
|
+
const server = createDevServer(nitro);
|
|
69
|
+
await prepare(nitro);
|
|
70
|
+
await build(nitro);
|
|
71
|
+
viteServer.middlewares.use('/api', (0, h3_1.toNodeListener)(server.app));
|
|
72
|
+
console.log(`\n\nThe '@analogjs/platform' successfully started.\nThe server endpoints are accessible under the "/api"`);
|
|
73
|
+
}
|
|
28
74
|
},
|
|
29
75
|
async closeBundle() {
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
76
|
+
if (ssrBuild) {
|
|
77
|
+
return;
|
|
78
|
+
}
|
|
79
|
+
if (isBuild) {
|
|
80
|
+
if (options?.ssr) {
|
|
81
|
+
console.log('Building SSR application...');
|
|
82
|
+
await (0, build_1.buildSSRApp)(config, options);
|
|
83
|
+
}
|
|
84
|
+
console.log('Building Server...');
|
|
85
|
+
await (0, build_server_1.buildServer)(options, nitroConfig);
|
|
86
|
+
console.log(`\n\nThe '@analogjs/platform' server has been successfully built.`);
|
|
87
|
+
}
|
|
40
88
|
},
|
|
41
89
|
};
|
|
42
90
|
}
|
|
43
91
|
exports.viteNitroPlugin = viteNitroPlugin;
|
|
44
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
92
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidml0ZS1uaXRyby1wbHVnaW4uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wYWNrYWdlcy9wbGF0Zm9ybS9zcmMvbGliL3ZpdGUtbml0cm8tcGx1Z2luLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQUFBLCtFQUFpRjtBQUVqRiwyQkFBb0M7QUFHcEMsaURBQTZDO0FBQzdDLHVDQUEwQztBQUUxQyxTQUFnQixlQUFlLENBQzdCLE9BQWlCLEVBQ2pCLFlBQTBCO0lBRTFCLE1BQU0sT0FBTyxHQUFHLFlBQVksRUFBRSxPQUFPLElBQUksR0FBRyxDQUFDO0lBQzdDLE1BQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEtBQUssTUFBTSxJQUFJLENBQUMsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO0lBRTdFLElBQUksV0FBVyxHQUFnQjtRQUM3QixPQUFPO1FBQ1AsUUFBUSxFQUFFLFlBQVksRUFBRSxRQUFRLElBQUksQ0FBQztRQUNyQyxNQUFNLEVBQUUsR0FBRyxPQUFPLE1BQU07UUFDeEIsUUFBUSxFQUFFLENBQUMsR0FBRyxPQUFPLGFBQWEsQ0FBQztRQUNuQyxNQUFNLEVBQUU7WUFDTixHQUFHLEVBQUUsZ0JBQWdCO1lBQ3JCLFNBQVMsRUFBRSx1QkFBdUI7WUFDbEMsR0FBRyxZQUFZLEVBQUUsTUFBTTtTQUN4QjtRQUNELFFBQVEsRUFBRSxlQUFlO1FBQ3pCLFVBQVUsRUFBRTtZQUNWLGdCQUFnQixFQUFFLEtBQUs7U0FDeEI7S0FDRixDQUFDO0lBRUYsSUFBSSxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3BCLElBQUksT0FBTyxHQUFHLEtBQUssQ0FBQztJQUNwQixJQUFJLFFBQVEsR0FBRyxLQUFLLENBQUM7SUFDckIsSUFBSSxNQUFrQixDQUFDO0lBRXZCLE9BQU87UUFDTCxJQUFJLEVBQUUsNEJBQTRCO1FBQ2xDLE1BQU0sQ0FBQyxPQUFPLEVBQUUs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
|