@analogjs/platform 3.0.0-alpha.36 → 3.0.0-alpha.38
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 +5 -6
- package/src/lib/i18n-component-registry-plugin.d.ts +17 -0
- package/src/lib/i18n-component-registry-plugin.js +100 -0
- package/src/lib/i18n-component-registry-plugin.js.map +1 -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.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 +11 -0
- package/src/lib/platform-plugin.js +2 -0
- package/src/lib/platform-plugin.js.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@analogjs/platform",
|
|
3
|
-
"version": "3.0.0-alpha.
|
|
3
|
+
"version": "3.0.0-alpha.38",
|
|
4
4
|
"description": "The fullstack meta-framework for Angular",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"author": "Brandon Roberts <robertsbt@gmail.com>",
|
|
@@ -44,9 +44,9 @@
|
|
|
44
44
|
"front-matter": "^4.0.2",
|
|
45
45
|
"es-toolkit": "^1.45.1",
|
|
46
46
|
"tinyglobby": "^0.2.15",
|
|
47
|
-
"nitro": "3.0.
|
|
48
|
-
"@analogjs/vite-plugin-angular": "3.0.0-alpha.
|
|
49
|
-
"@analogjs/vite-plugin-nitro": "3.0.0-alpha.
|
|
47
|
+
"nitro": "3.0.260415-beta",
|
|
48
|
+
"@analogjs/vite-plugin-angular": "3.0.0-alpha.38",
|
|
49
|
+
"@analogjs/vite-plugin-nitro": "3.0.0-alpha.38",
|
|
50
50
|
"rolldown": "^1.0.0-rc.13",
|
|
51
51
|
"obug": "^2.1.1",
|
|
52
52
|
"vitefu": "^1.1.2"
|
|
@@ -98,8 +98,7 @@
|
|
|
98
98
|
"@analogjs/storybook-angular",
|
|
99
99
|
"@analogjs/vite-plugin-angular",
|
|
100
100
|
"@analogjs/vite-plugin-nitro",
|
|
101
|
-
"@analogjs/vitest-angular"
|
|
102
|
-
"@analogjs/angular-compiler"
|
|
101
|
+
"@analogjs/vitest-angular"
|
|
103
102
|
],
|
|
104
103
|
"migrations": "./migrations/migration.json"
|
|
105
104
|
},
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { Plugin } from "vite";
|
|
2
|
+
/**
|
|
3
|
+
* Vite plugin that instruments compiled Angular component definitions with
|
|
4
|
+
* calls to `registerI18nComponentDef()` from `@analogjs/router`. This
|
|
5
|
+
* populates a process-level registry of component definitions that the
|
|
6
|
+
* server renderer uses to null cached `tView` objects between SSR requests,
|
|
7
|
+
* allowing `$localize` tagged templates in `consts()` to re-evaluate with
|
|
8
|
+
* the freshly loaded translations for each request's locale.
|
|
9
|
+
*
|
|
10
|
+
* The plugin runs in `enforce: 'post'` so that it sees the compiled
|
|
11
|
+
* JavaScript output from the Angular compiler (which contains the
|
|
12
|
+
* `ClassName.ɵcmp = ɵɵdefineComponent({...})` assignments).
|
|
13
|
+
*
|
|
14
|
+
* Only active when the platform's `i18n` option is configured.
|
|
15
|
+
* Only transforms modules loaded for the SSR environment.
|
|
16
|
+
*/
|
|
17
|
+
export declare function i18nComponentRegistryPlugin(): Plugin;
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import MagicString from "magic-string";
|
|
2
|
+
//#region packages/platform/src/lib/i18n-component-registry-plugin.ts
|
|
3
|
+
/**
|
|
4
|
+
* Vite plugin that instruments compiled Angular component definitions with
|
|
5
|
+
* calls to `registerI18nComponentDef()` from `@analogjs/router`. This
|
|
6
|
+
* populates a process-level registry of component definitions that the
|
|
7
|
+
* server renderer uses to null cached `tView` objects between SSR requests,
|
|
8
|
+
* allowing `$localize` tagged templates in `consts()` to re-evaluate with
|
|
9
|
+
* the freshly loaded translations for each request's locale.
|
|
10
|
+
*
|
|
11
|
+
* The plugin runs in `enforce: 'post'` so that it sees the compiled
|
|
12
|
+
* JavaScript output from the Angular compiler (which contains the
|
|
13
|
+
* `ClassName.ɵcmp = ɵɵdefineComponent({...})` assignments).
|
|
14
|
+
*
|
|
15
|
+
* Only active when the platform's `i18n` option is configured.
|
|
16
|
+
* Only transforms modules loaded for the SSR environment.
|
|
17
|
+
*/
|
|
18
|
+
function i18nComponentRegistryPlugin() {
|
|
19
|
+
return {
|
|
20
|
+
name: "analogjs-i18n-component-registry",
|
|
21
|
+
enforce: "post",
|
|
22
|
+
transform(code, id, options) {
|
|
23
|
+
if (!options?.ssr) return;
|
|
24
|
+
if (!code.includes(".ɵcmp")) return;
|
|
25
|
+
if (id.includes("node_modules")) return;
|
|
26
|
+
if (!id.match(/\.(ts|js)(\?|$)/)) return;
|
|
27
|
+
const classNames = findComponentClassNames(this.parse(code));
|
|
28
|
+
if (classNames.size === 0) return;
|
|
29
|
+
const registrations = [...classNames].map((name) => `__analog_i18n_reg(${name});`).join("\n");
|
|
30
|
+
const s = new MagicString(code);
|
|
31
|
+
s.prepend(`import { ɵregisterI18nComponentDef as __analog_i18n_reg } from '@analogjs/router';\n`);
|
|
32
|
+
s.append(`\n${registrations}\n`);
|
|
33
|
+
return {
|
|
34
|
+
code: s.toString(),
|
|
35
|
+
map: s.generateMap({
|
|
36
|
+
hires: true,
|
|
37
|
+
source: id,
|
|
38
|
+
includeContent: true
|
|
39
|
+
})
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Walks the AST to find class names whose definitions include a `ɵcmp`
|
|
46
|
+
* static property assignment — the marker Angular uses for compiled
|
|
47
|
+
* component definitions.
|
|
48
|
+
*
|
|
49
|
+
* Handles two codegen styles:
|
|
50
|
+
*
|
|
51
|
+
* Production (tree-shaken):
|
|
52
|
+
* _ClassName.ɵcmp = ɵɵdefineComponent({...})
|
|
53
|
+
* → AssignmentExpression left: MemberExpression(.ɵcmp) object: Identifier
|
|
54
|
+
*
|
|
55
|
+
* Dev mode (class fields):
|
|
56
|
+
* class Foo { static { this.ɵcmp = i0.ɵɵdefineComponent({...}) } }
|
|
57
|
+
* → ClassDeclaration → StaticBlock → AssignmentExpression left: MemberExpression(.ɵcmp) object: ThisExpression
|
|
58
|
+
*/
|
|
59
|
+
function findComponentClassNames(ast) {
|
|
60
|
+
const names = /* @__PURE__ */ new Set();
|
|
61
|
+
walk(ast, (node) => {
|
|
62
|
+
if (node.type === "AssignmentExpression" && isNode(node.left) && node.left.type === "MemberExpression" && isNode(node.left.property) && node.left.property.name === "ɵcmp" && isNode(node.left.object) && node.left.object.type === "Identifier") {
|
|
63
|
+
const name = node.left.object.name;
|
|
64
|
+
if (name !== "this") names.add(name);
|
|
65
|
+
}
|
|
66
|
+
if ((node.type === "ClassDeclaration" || node.type === "ClassExpression") && isNode(node.id) && node.id.name) {
|
|
67
|
+
const className = node.id.name;
|
|
68
|
+
if (classHasCmpDef(node)) names.add(className);
|
|
69
|
+
}
|
|
70
|
+
});
|
|
71
|
+
return names;
|
|
72
|
+
}
|
|
73
|
+
function classHasCmpDef(classNode) {
|
|
74
|
+
let found = false;
|
|
75
|
+
walk(classNode, (node) => {
|
|
76
|
+
if (found) return;
|
|
77
|
+
if (node.type === "PropertyDefinition" && node.static === true && isNode(node.key) && node.key.name === "ɵcmp") {
|
|
78
|
+
found = true;
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
if (node.type === "AssignmentExpression" && isNode(node.left) && node.left.type === "MemberExpression" && isNode(node.left.property) && node.left.property.name === "ɵcmp" && isNode(node.left.object) && node.left.object.type === "ThisExpression") found = true;
|
|
82
|
+
});
|
|
83
|
+
return found;
|
|
84
|
+
}
|
|
85
|
+
function isNode(v) {
|
|
86
|
+
return v != null && typeof v === "object" && "type" in v;
|
|
87
|
+
}
|
|
88
|
+
function walk(node, visitor) {
|
|
89
|
+
visitor(node);
|
|
90
|
+
for (const key of Object.keys(node)) {
|
|
91
|
+
const child = node[key];
|
|
92
|
+
if (Array.isArray(child)) {
|
|
93
|
+
for (const item of child) if (isNode(item)) walk(item, visitor);
|
|
94
|
+
} else if (isNode(child)) walk(child, visitor);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
//#endregion
|
|
98
|
+
export { i18nComponentRegistryPlugin };
|
|
99
|
+
|
|
100
|
+
//# sourceMappingURL=i18n-component-registry-plugin.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"i18n-component-registry-plugin.js","names":[],"sources":["../../../src/lib/i18n-component-registry-plugin.ts"],"sourcesContent":["import type { Plugin, TransformResult } from 'vite';\nimport MagicString from 'magic-string';\n\n/**\n * Vite plugin that instruments compiled Angular component definitions with\n * calls to `registerI18nComponentDef()` from `@analogjs/router`. This\n * populates a process-level registry of component definitions that the\n * server renderer uses to null cached `tView` objects between SSR requests,\n * allowing `$localize` tagged templates in `consts()` to re-evaluate with\n * the freshly loaded translations for each request's locale.\n *\n * The plugin runs in `enforce: 'post'` so that it sees the compiled\n * JavaScript output from the Angular compiler (which contains the\n * `ClassName.ɵcmp = ɵɵdefineComponent({...})` assignments).\n *\n * Only active when the platform's `i18n` option is configured.\n * Only transforms modules loaded for the SSR environment.\n */\nexport function i18nComponentRegistryPlugin(): Plugin {\n return {\n name: 'analogjs-i18n-component-registry',\n enforce: 'post',\n\n transform(code, id, options): TransformResult | undefined {\n if (!options?.ssr) return;\n if (!code.includes('.ɵcmp')) return;\n if (id.includes('node_modules')) return;\n if (!id.match(/\\.(ts|js)(\\?|$)/)) return;\n\n const ast = this.parse(code) as unknown as AstNode;\n const classNames = findComponentClassNames(ast);\n\n if (classNames.size === 0) return;\n\n const registrations = [...classNames]\n .map((name) => `__analog_i18n_reg(${name});`)\n .join('\\n');\n\n // Use MagicString so the source map stays aligned with the original\n // file — prepended imports and appended registration calls must not\n // shift line numbers for frames that land inside the user's code.\n const s = new MagicString(code);\n s.prepend(\n `import { ɵregisterI18nComponentDef as __analog_i18n_reg } from '@analogjs/router';\\n`,\n );\n s.append(`\\n${registrations}\\n`);\n\n return {\n code: s.toString(),\n map: s.generateMap({\n hires: true,\n source: id,\n includeContent: true,\n }) as TransformResult['map'],\n };\n },\n };\n}\n\n// Minimal ESTree node shape used by the walker.\ninterface AstNode {\n type: string;\n [key: string]: unknown;\n}\n\n/**\n * Walks the AST to find class names whose definitions include a `ɵcmp`\n * static property assignment — the marker Angular uses for compiled\n * component definitions.\n *\n * Handles two codegen styles:\n *\n * Production (tree-shaken):\n * _ClassName.ɵcmp = ɵɵdefineComponent({...})\n * → AssignmentExpression left: MemberExpression(.ɵcmp) object: Identifier\n *\n * Dev mode (class fields):\n * class Foo { static { this.ɵcmp = i0.ɵɵdefineComponent({...}) } }\n * → ClassDeclaration → StaticBlock → AssignmentExpression left: MemberExpression(.ɵcmp) object: ThisExpression\n */\nfunction findComponentClassNames(ast: AstNode): Set<string> {\n const names = new Set<string>();\n\n walk(ast, (node: any) => {\n // Prod: top-level `Identifier.ɵcmp = ...`\n if (\n node.type === 'AssignmentExpression' &&\n isNode(node.left) &&\n node.left.type === 'MemberExpression' &&\n isNode(node.left.property) &&\n (node.left.property as AstNode & { name?: string }).name === 'ɵcmp' &&\n isNode(node.left.object) &&\n node.left.object.type === 'Identifier'\n ) {\n const name = (node.left.object as AstNode & { name: string }).name;\n if (name !== 'this') {\n names.add(name);\n }\n }\n\n // Dev: ClassDeclaration containing `this.ɵcmp = ...` in a static block\n if (\n (node.type === 'ClassDeclaration' || node.type === 'ClassExpression') &&\n isNode(node.id) &&\n (node.id as AstNode & { name?: string }).name\n ) {\n const className = (node.id as AstNode & { name: string }).name;\n if (classHasCmpDef(node)) {\n names.add(className);\n }\n }\n });\n\n return names;\n}\n\nfunction classHasCmpDef(classNode: AstNode): boolean {\n let found = false;\n\n walk(classNode, (node: any) => {\n if (found) return;\n\n // static ɵcmp = ... (PropertyDefinition)\n if (\n node.type === 'PropertyDefinition' &&\n node.static === true &&\n isNode(node.key) &&\n (node.key as AstNode & { name?: string }).name === 'ɵcmp'\n ) {\n found = true;\n return;\n }\n\n // static { this.ɵcmp = ... }\n if (\n node.type === 'AssignmentExpression' &&\n isNode(node.left) &&\n node.left.type === 'MemberExpression' &&\n isNode(node.left.property) &&\n (node.left.property as AstNode & { name?: string }).name === 'ɵcmp' &&\n isNode(node.left.object) &&\n node.left.object.type === 'ThisExpression'\n ) {\n found = true;\n }\n });\n\n return found;\n}\n\nfunction isNode(v: unknown): v is AstNode {\n return v != null && typeof v === 'object' && 'type' in (v as object);\n}\n\nfunction walk(node: AstNode, visitor: (n: AstNode) => void): void {\n visitor(node);\n for (const key of Object.keys(node)) {\n const child = node[key];\n if (Array.isArray(child)) {\n for (const item of child) {\n if (isNode(item)) walk(item, visitor);\n }\n } else if (isNode(child)) {\n walk(child, visitor);\n }\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;AAkBA,SAAgB,8BAAsC;AACpD,QAAO;EACL,MAAM;EACN,SAAS;EAET,UAAU,MAAM,IAAI,SAAsC;AACxD,OAAI,CAAC,SAAS,IAAK;AACnB,OAAI,CAAC,KAAK,SAAS,QAAQ,CAAE;AAC7B,OAAI,GAAG,SAAS,eAAe,CAAE;AACjC,OAAI,CAAC,GAAG,MAAM,kBAAkB,CAAE;GAGlC,MAAM,aAAa,wBADP,KAAK,MAAM,KAAK,CACmB;AAE/C,OAAI,WAAW,SAAS,EAAG;GAE3B,MAAM,gBAAgB,CAAC,GAAG,WAAW,CAClC,KAAK,SAAS,qBAAqB,KAAK,IAAI,CAC5C,KAAK,KAAK;GAKb,MAAM,IAAI,IAAI,YAAY,KAAK;AAC/B,KAAE,QACA,uFACD;AACD,KAAE,OAAO,KAAK,cAAc,IAAI;AAEhC,UAAO;IACL,MAAM,EAAE,UAAU;IAClB,KAAK,EAAE,YAAY;KACjB,OAAO;KACP,QAAQ;KACR,gBAAgB;KACjB,CAAC;IACH;;EAEJ;;;;;;;;;;;;;;;;;AAwBH,SAAS,wBAAwB,KAA2B;CAC1D,MAAM,wBAAQ,IAAI,KAAa;AAE/B,MAAK,MAAM,SAAc;AAEvB,MACE,KAAK,SAAS,0BACd,OAAO,KAAK,KAAK,IACjB,KAAK,KAAK,SAAS,sBACnB,OAAO,KAAK,KAAK,SAAS,IACzB,KAAK,KAAK,SAAyC,SAAS,UAC7D,OAAO,KAAK,KAAK,OAAO,IACxB,KAAK,KAAK,OAAO,SAAS,cAC1B;GACA,MAAM,OAAQ,KAAK,KAAK,OAAsC;AAC9D,OAAI,SAAS,OACX,OAAM,IAAI,KAAK;;AAKnB,OACG,KAAK,SAAS,sBAAsB,KAAK,SAAS,sBACnD,OAAO,KAAK,GAAG,IACd,KAAK,GAAmC,MACzC;GACA,MAAM,YAAa,KAAK,GAAkC;AAC1D,OAAI,eAAe,KAAK,CACtB,OAAM,IAAI,UAAU;;GAGxB;AAEF,QAAO;;AAGT,SAAS,eAAe,WAA6B;CACnD,IAAI,QAAQ;AAEZ,MAAK,YAAY,SAAc;AAC7B,MAAI,MAAO;AAGX,MACE,KAAK,SAAS,wBACd,KAAK,WAAW,QAChB,OAAO,KAAK,IAAI,IACf,KAAK,IAAoC,SAAS,QACnD;AACA,WAAQ;AACR;;AAIF,MACE,KAAK,SAAS,0BACd,OAAO,KAAK,KAAK,IACjB,KAAK,KAAK,SAAS,sBACnB,OAAO,KAAK,KAAK,SAAS,IACzB,KAAK,KAAK,SAAyC,SAAS,UAC7D,OAAO,KAAK,KAAK,OAAO,IACxB,KAAK,KAAK,OAAO,SAAS,iBAE1B,SAAQ;GAEV;AAEF,QAAO;;AAGT,SAAS,OAAO,GAA0B;AACxC,QAAO,KAAK,QAAQ,OAAO,MAAM,YAAY,UAAW;;AAG1D,SAAS,KAAK,MAAe,SAAqC;AAChE,SAAQ,KAAK;AACb,MAAK,MAAM,OAAO,OAAO,KAAK,KAAK,EAAE;EACnC,MAAM,QAAQ,KAAK;AACnB,MAAI,MAAM,QAAQ,MAAM;QACjB,MAAM,QAAQ,MACjB,KAAI,OAAO,KAAK,CAAE,MAAK,MAAM,QAAQ;aAE9B,OAAO,MAAM,CACtB,MAAK,OAAO,QAAQ"}
|
|
@@ -1,9 +1,9 @@
|
|
|
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 = "^3.0.0-alpha.
|
|
4
|
-
export declare const V18_X_ANALOG_JS_ROUTER = "^3.0.0-alpha.
|
|
5
|
-
export declare const V18_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = "^3.0.0-alpha.
|
|
6
|
-
export declare const V18_X_ANALOG_JS_VITEST_ANGULAR = "^3.0.0-alpha.
|
|
3
|
+
export declare const V18_X_ANALOG_JS_CONTENT = "^3.0.0-alpha.38";
|
|
4
|
+
export declare const V18_X_ANALOG_JS_ROUTER = "^3.0.0-alpha.38";
|
|
5
|
+
export declare const V18_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = "^3.0.0-alpha.38";
|
|
6
|
+
export declare const V18_X_ANALOG_JS_VITEST_ANGULAR = "^3.0.0-alpha.38";
|
|
7
7
|
export declare const V18_X_FRONT_MATTER = "^4.0.2";
|
|
8
8
|
export declare const V18_X_MARKED = "^18.0.0";
|
|
9
9
|
export declare const V18_X_MARKED_GFM_HEADING_ID = "^4.1.1";
|
|
@@ -15,7 +15,7 @@ export declare const V18_X_TAILWINDCSS = "^4.2.2";
|
|
|
15
15
|
export declare const V18_X_TAILWINDCSS_POSTCSS = "^4.2.2";
|
|
16
16
|
export declare const V18_X_TAILWINDCSS_VITE = "^4.2.2";
|
|
17
17
|
export declare const V18_X_POSTCSS = "^8.5.6";
|
|
18
|
-
export declare const V18_X_ANALOG_JS_PLATFORM = "^3.0.0-alpha.
|
|
18
|
+
export declare const V18_X_ANALOG_JS_PLATFORM = "^3.0.0-alpha.38";
|
|
19
19
|
export declare const V18_X_ANGULAR_DEVKIT_BUILD_ANGULAR = "^19.0.0";
|
|
20
20
|
export declare const V18_X_NX_VITE = "^21.0.0";
|
|
21
21
|
export declare const V18_X_NX_LINTER = "^21.0.0";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"versions.js","names":[],"sources":["../../../../../../../../../../nx-plugin/src/generators/app/versions/nx_18_X/versions.ts"],"sourcesContent":["// V18_X\n// dependencies\nexport const V18_X_NX_DEVKIT = '^20.0.0';\nexport const V18_X_NX_ANGULAR = '^20.0.0';\nexport const V18_X_ANALOG_JS_CONTENT = '^3.0.0-alpha.
|
|
1
|
+
{"version":3,"file":"versions.js","names":[],"sources":["../../../../../../../../../../nx-plugin/src/generators/app/versions/nx_18_X/versions.ts"],"sourcesContent":["// V18_X\n// dependencies\nexport const V18_X_NX_DEVKIT = '^20.0.0';\nexport const V18_X_NX_ANGULAR = '^20.0.0';\nexport const V18_X_ANALOG_JS_CONTENT = '^3.0.0-alpha.38';\nexport const V18_X_ANALOG_JS_ROUTER = '^3.0.0-alpha.38';\nexport const V18_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = '^3.0.0-alpha.38';\nexport const V18_X_ANALOG_JS_VITEST_ANGULAR = '^3.0.0-alpha.38';\nexport const V18_X_FRONT_MATTER = '^4.0.2';\nexport const V18_X_MARKED = '^18.0.0';\nexport const V18_X_MARKED_GFM_HEADING_ID = '^4.1.1';\nexport const V18_X_MARKED_HIGHLIGHT = '^2.2.1';\nexport const V18_X_MARKED_MANGLE = '^1.1.10';\nexport const V18_X_MERMAID = '^10.2.4';\nexport const V18_X_PRISMJS = '^1.29.0';\nexport const V18_X_TAILWINDCSS = '^4.2.2';\nexport const V18_X_TAILWINDCSS_POSTCSS = '^4.2.2';\nexport const V18_X_TAILWINDCSS_VITE = '^4.2.2';\nexport const V18_X_POSTCSS = '^8.5.6';\n\n// devDependencies\nexport const V18_X_ANALOG_JS_PLATFORM = '^3.0.0-alpha.38';\nexport const V18_X_ANGULAR_DEVKIT_BUILD_ANGULAR = '^19.0.0';\nexport const V18_X_NX_VITE = '^21.0.0';\nexport const V18_X_NX_LINTER = '^21.0.0';\nexport const V18_X_JSDOM = '^22.1.0';\nexport const V18_X_VITE = '^8.0.0';\nexport const V18_X_VITE_TSCONFIG_PATHS = '^4.2.0';\nexport const V18_X_VITEST = '^4.0.0';\nexport const V18_X_ZOD = '^3.21.4';\n"],"mappings":";AAeA,IAAa,oBAAoB;AACjC,IAAa,4BAA4B;AACzC,IAAa,yBAAyB;AACtC,IAAa,gBAAgB"}
|
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
export declare const V19_X_ANALOG_JS_ROUTER = "^3.0.0-alpha.
|
|
2
|
-
export declare const V19_X_ANALOG_JS_CONTENT = "^3.0.0-alpha.
|
|
1
|
+
export declare const V19_X_ANALOG_JS_ROUTER = "^3.0.0-alpha.38";
|
|
2
|
+
export declare const V19_X_ANALOG_JS_CONTENT = "^3.0.0-alpha.38";
|
|
3
3
|
export declare const V19_X_MARKED = "^18.0.0";
|
|
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 = "^3.0.0-alpha.
|
|
9
|
-
export declare const V19_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = "^3.0.0-alpha.
|
|
10
|
-
export declare const V19_X_ANALOG_JS_VITEST_ANGULAR = "^3.0.0-alpha.
|
|
8
|
+
export declare const V19_X_ANALOG_JS_PLATFORM = "^3.0.0-alpha.38";
|
|
9
|
+
export declare const V19_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = "^3.0.0-alpha.38";
|
|
10
|
+
export declare const V19_X_ANALOG_JS_VITEST_ANGULAR = "^3.0.0-alpha.38";
|
|
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";
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
//#region packages/nx-plugin/src/utils/versions/ng_19_X/versions.ts
|
|
2
|
-
var V19_X_ANALOG_JS_ROUTER = "^3.0.0-alpha.
|
|
3
|
-
var V19_X_ANALOG_JS_CONTENT = "^3.0.0-alpha.
|
|
2
|
+
var V19_X_ANALOG_JS_ROUTER = "^3.0.0-alpha.38";
|
|
3
|
+
var V19_X_ANALOG_JS_CONTENT = "^3.0.0-alpha.38";
|
|
4
4
|
var V19_X_MARKED = "^18.0.0";
|
|
5
5
|
var V19_X_MARKED_GFM_HEADING_ID = "^4.1.1";
|
|
6
6
|
var V19_X_MARKED_HIGHLIGHT = "^2.2.1";
|
|
7
7
|
var V19_X_MARKED_MANGLE = "^1.1.10";
|
|
8
8
|
var V19_X_PRISMJS = "^1.29.0";
|
|
9
|
-
var V19_X_ANALOG_JS_PLATFORM = "^3.0.0-alpha.
|
|
10
|
-
var V19_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = "^3.0.0-alpha.
|
|
11
|
-
var V19_X_ANALOG_JS_VITEST_ANGULAR = "^3.0.0-alpha.
|
|
9
|
+
var V19_X_ANALOG_JS_PLATFORM = "^3.0.0-alpha.38";
|
|
10
|
+
var V19_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = "^3.0.0-alpha.38";
|
|
11
|
+
var V19_X_ANALOG_JS_VITEST_ANGULAR = "^3.0.0-alpha.38";
|
|
12
12
|
var V19_X_NX_VITE = "^22.0.0";
|
|
13
13
|
var V19_X_JSDOM = "^22.0.0";
|
|
14
14
|
var V19_X_VITE_TSCONFIG_PATHS = "^4.2.0";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"versions.js","names":[],"sources":["../../../../../../../../../nx-plugin/src/utils/versions/ng_19_X/versions.ts"],"sourcesContent":["// V19_X\nexport const V19_X_ANALOG_JS_ROUTER = '^3.0.0-alpha.
|
|
1
|
+
{"version":3,"file":"versions.js","names":[],"sources":["../../../../../../../../../nx-plugin/src/utils/versions/ng_19_X/versions.ts"],"sourcesContent":["// V19_X\nexport const V19_X_ANALOG_JS_ROUTER = '^3.0.0-alpha.38';\nexport const V19_X_ANALOG_JS_CONTENT = '^3.0.0-alpha.38';\nexport const V19_X_MARKED = '^18.0.0';\nexport const V19_X_MARKED_GFM_HEADING_ID = '^4.1.1';\nexport const V19_X_MARKED_HIGHLIGHT = '^2.2.1';\nexport const V19_X_MARKED_MANGLE = '^1.1.10';\nexport const V19_X_PRISMJS = '^1.29.0';\n\n// devDependencies\nexport const V19_X_ANALOG_JS_PLATFORM = '^3.0.0-alpha.38';\nexport const V19_X_ANALOG_JS_VITE_PLUGIN_ANGULAR = '^3.0.0-alpha.38';\nexport const V19_X_ANALOG_JS_VITEST_ANGULAR = '^3.0.0-alpha.38';\nexport const V19_X_NX_ANGULAR = '^22.0.0';\nexport const V19_X_NX_VITE = '^22.0.0';\nexport const V19_X_JSDOM = '^22.0.0';\nexport const V19_X_VITE_TSCONFIG_PATHS = '^4.2.0';\nexport const V19_X_VITEST = '^3.0.0';\nexport const V19_X_VITE = '^6.0.0';\nexport const NX_X_LATEST_VITE = '^8.0.0';\nexport const NX_X_LATEST_VITEST = '^4.0.0';\n"],"mappings":";AACA,IAAa,yBAAyB;AACtC,IAAa,0BAA0B;AACvC,IAAa,eAAe;AAC5B,IAAa,8BAA8B;AAC3C,IAAa,yBAAyB;AACtC,IAAa,sBAAsB;AACnC,IAAa,gBAAgB;AAG7B,IAAa,2BAA2B;AACxC,IAAa,sCAAsC;AACnD,IAAa,iCAAiC;AAE9C,IAAa,gBAAgB;AAC7B,IAAa,cAAc;AAC3B,IAAa,4BAA4B;AACzC,IAAa,eAAe;AAC5B,IAAa,aAAa;AAC1B,IAAa,mBAAmB;AAChC,IAAa,qBAAqB"}
|
package/src/lib/options.d.ts
CHANGED
|
@@ -147,6 +147,17 @@ export interface Options {
|
|
|
147
147
|
*/
|
|
148
148
|
disableTypeChecking?: boolean;
|
|
149
149
|
/**
|
|
150
|
+
* Opt into the fast compile path. Skips Angular's template type-checking
|
|
151
|
+
* and routes compilation through an internal single-pass transform.
|
|
152
|
+
*/
|
|
153
|
+
fastCompile?: boolean;
|
|
154
|
+
/**
|
|
155
|
+
* Compilation output mode used when `fastCompile` is enabled.
|
|
156
|
+
* - `'full'` (default): Emit final Ivy definitions for application builds.
|
|
157
|
+
* - `'partial'`: Emit partial declarations for library publishing.
|
|
158
|
+
*/
|
|
159
|
+
fastCompileMode?: "full" | "partial";
|
|
160
|
+
/**
|
|
150
161
|
* File replacements
|
|
151
162
|
*/
|
|
152
163
|
fileReplacements?: PluginOptions["fileReplacements"];
|
|
@@ -9,6 +9,7 @@ import { injectHTMLPlugin } from "./ssr/inject-html-plugin.js";
|
|
|
9
9
|
import { serverModePlugin } from "../server-mode-plugin.js";
|
|
10
10
|
import { routeGenerationPlugin } from "./route-generation-plugin.js";
|
|
11
11
|
import { resolveStylePipelinePlugins } from "./style-pipeline.js";
|
|
12
|
+
import { i18nComponentRegistryPlugin } from "./i18n-component-registry-plugin.js";
|
|
12
13
|
import viteNitroPlugin from "@analogjs/vite-plugin-nitro";
|
|
13
14
|
import angular from "@analogjs/vite-plugin-angular";
|
|
14
15
|
import { mapValues, union } from "es-toolkit";
|
|
@@ -78,6 +79,7 @@ function platformPlugin(opts = {}) {
|
|
|
78
79
|
useAngularCompilationAPI
|
|
79
80
|
}
|
|
80
81
|
})),
|
|
82
|
+
...platformOptions.i18n ? [i18nComponentRegistryPlugin()] : [],
|
|
81
83
|
...serverModePlugin(),
|
|
82
84
|
...clearClientPageEndpointsPlugin()
|
|
83
85
|
];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"platform-plugin.js","names":[],"sources":["../../../src/lib/platform-plugin.ts"],"sourcesContent":["import { Plugin } from 'vite';\nimport viteNitroPlugin from '@analogjs/vite-plugin-nitro';\nimport angular from '@analogjs/vite-plugin-angular';\nimport { mapValues, union } from 'es-toolkit';\n\nimport { Options } from './options.js';\nimport {\n activateDeferredDebug,\n applyDebugOption,\n debugPlatform,\n} from './utils/debug.js';\nimport { discoverLibraryRoutes } from './discover-library-routes.js';\nimport { routerPlugin } from './router-plugin.js';\nimport { ssrBuildPlugin } from './ssr/ssr-build-plugin.js';\nimport { contentPlugin } from './content-plugin.js';\nimport { clearClientPageEndpointsPlugin } from './clear-client-page-endpoint.js';\nimport { depsPlugin } from './deps-plugin.js';\nimport { injectHTMLPlugin } from './ssr/inject-html-plugin.js';\nimport { serverModePlugin } from '../server-mode-plugin.js';\nimport { routeGenerationPlugin } from './route-generation-plugin.js';\nimport { resolveStylePipelinePlugins } from './style-pipeline.js';\n\n// Bridge Plugin types from external @analogjs packages that resolve a different vite instance\nfunction externalPlugins(plugins: unknown): Plugin[] {\n return plugins as Plugin[];\n}\n\nexport function platformPlugin(opts: Options = {}): Plugin[] {\n applyDebugOption(opts.debug, opts.workspaceRoot);\n\n const isTest = process.env['NODE_ENV'] === 'test' || !!process.env['VITEST'];\n const viteOptions = opts?.vite === false ? undefined : opts?.vite;\n const {\n experimental: viteExperimental,\n hmr: _removedViteHmrOption,\n ...forwardedViteOptions\n } = viteOptions ?? {};\n const { ...platformOptions } = {\n ssr: true,\n ...opts,\n };\n if (platformOptions.discoverRoutes) {\n const workspaceRoot =\n platformOptions.workspaceRoot ??\n process.env['NX_WORKSPACE_ROOT'] ??\n process.cwd();\n const discovered = discoverLibraryRoutes(workspaceRoot);\n platformOptions.additionalPagesDirs = union(\n platformOptions.additionalPagesDirs ?? [],\n discovered.additionalPagesDirs,\n );\n platformOptions.additionalContentDirs = union(\n platformOptions.additionalContentDirs ?? [],\n discovered.additionalContentDirs,\n );\n platformOptions.additionalAPIDirs = union(\n platformOptions.additionalAPIDirs ?? [],\n discovered.additionalAPIDirs,\n );\n }\n\n const useAngularCompilationAPI =\n platformOptions.experimental?.useAngularCompilationAPI ??\n viteExperimental?.useAngularCompilationAPI;\n debugPlatform('experimental options resolved', {\n useAngularCompilationAPI: !!useAngularCompilationAPI,\n typedRouter: platformOptions.experimental?.typedRouter,\n stylePipeline: !!platformOptions.experimental?.stylePipeline,\n });\n let nitroOptions = platformOptions?.nitro;\n\n if (nitroOptions?.routeRules) {\n nitroOptions = {\n ...nitroOptions,\n routeRules: mapValues(nitroOptions.routeRules, (rule) => ({\n ...rule,\n headers: {\n ...rule.headers,\n 'x-analog-no-ssr': rule?.ssr === false ? 'true' : undefined,\n } as any,\n })),\n };\n }\n\n return [\n {\n name: 'analogjs-debug-activate',\n config(_, { command }) {\n activateDeferredDebug(command);\n },\n },\n ...externalPlugins(viteNitroPlugin(platformOptions as any, nitroOptions)),\n ...(platformOptions.ssr\n ? [...ssrBuildPlugin(), ...injectHTMLPlugin()]\n : []),\n ...(!isTest ? depsPlugin(platformOptions) : []),\n ...resolveStylePipelinePlugins(\n platformOptions.experimental?.stylePipeline,\n platformOptions.workspaceRoot,\n ),\n ...routerPlugin(platformOptions),\n routeGenerationPlugin(platformOptions),\n ...contentPlugin(platformOptions?.content, platformOptions),\n ...(opts?.vite === false\n ? []\n : externalPlugins(\n angular({\n jit: platformOptions.jit,\n workspaceRoot: platformOptions.workspaceRoot,\n // Let the Angular plugin keep its own dev-friendly default unless the\n // app explicitly opts into stricter serve-time diagnostics.\n disableTypeChecking: platformOptions.disableTypeChecking,\n include: [\n ...(platformOptions.include ?? []),\n ...(platformOptions.additionalPagesDirs ?? []).map(\n (pageDir) => `${pageDir}/**/*.page.ts`,\n ),\n ],\n additionalContentDirs: platformOptions.additionalContentDirs,\n liveReload: platformOptions.liveReload,\n inlineStylesExtension: platformOptions.inlineStylesExtension,\n fileReplacements: platformOptions.fileReplacements,\n debug: platformOptions.debug,\n stylePipeline: platformOptions.experimental?.stylePipeline\n ?.angularPlugins?.length\n ? {\n plugins:\n platformOptions.experimental.stylePipeline.angularPlugins,\n }\n : undefined,\n ...forwardedViteOptions,\n experimental: {\n ...(viteExperimental ?? {}),\n useAngularCompilationAPI,\n },\n }),\n )),\n ...serverModePlugin(),\n ...clearClientPageEndpointsPlugin(),\n ];\n}\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"platform-plugin.js","names":[],"sources":["../../../src/lib/platform-plugin.ts"],"sourcesContent":["import { Plugin } from 'vite';\nimport viteNitroPlugin from '@analogjs/vite-plugin-nitro';\nimport angular from '@analogjs/vite-plugin-angular';\nimport { mapValues, union } from 'es-toolkit';\n\nimport { Options } from './options.js';\nimport {\n activateDeferredDebug,\n applyDebugOption,\n debugPlatform,\n} from './utils/debug.js';\nimport { discoverLibraryRoutes } from './discover-library-routes.js';\nimport { routerPlugin } from './router-plugin.js';\nimport { ssrBuildPlugin } from './ssr/ssr-build-plugin.js';\nimport { contentPlugin } from './content-plugin.js';\nimport { clearClientPageEndpointsPlugin } from './clear-client-page-endpoint.js';\nimport { depsPlugin } from './deps-plugin.js';\nimport { injectHTMLPlugin } from './ssr/inject-html-plugin.js';\nimport { serverModePlugin } from '../server-mode-plugin.js';\nimport { routeGenerationPlugin } from './route-generation-plugin.js';\nimport { resolveStylePipelinePlugins } from './style-pipeline.js';\nimport { i18nComponentRegistryPlugin } from './i18n-component-registry-plugin.js';\n\n// Bridge Plugin types from external @analogjs packages that resolve a different vite instance\nfunction externalPlugins(plugins: unknown): Plugin[] {\n return plugins as Plugin[];\n}\n\nexport function platformPlugin(opts: Options = {}): Plugin[] {\n applyDebugOption(opts.debug, opts.workspaceRoot);\n\n const isTest = process.env['NODE_ENV'] === 'test' || !!process.env['VITEST'];\n const viteOptions = opts?.vite === false ? undefined : opts?.vite;\n const {\n experimental: viteExperimental,\n hmr: _removedViteHmrOption,\n ...forwardedViteOptions\n } = viteOptions ?? {};\n const { ...platformOptions } = {\n ssr: true,\n ...opts,\n };\n if (platformOptions.discoverRoutes) {\n const workspaceRoot =\n platformOptions.workspaceRoot ??\n process.env['NX_WORKSPACE_ROOT'] ??\n process.cwd();\n const discovered = discoverLibraryRoutes(workspaceRoot);\n platformOptions.additionalPagesDirs = union(\n platformOptions.additionalPagesDirs ?? [],\n discovered.additionalPagesDirs,\n );\n platformOptions.additionalContentDirs = union(\n platformOptions.additionalContentDirs ?? [],\n discovered.additionalContentDirs,\n );\n platformOptions.additionalAPIDirs = union(\n platformOptions.additionalAPIDirs ?? [],\n discovered.additionalAPIDirs,\n );\n }\n\n const useAngularCompilationAPI =\n platformOptions.experimental?.useAngularCompilationAPI ??\n viteExperimental?.useAngularCompilationAPI;\n debugPlatform('experimental options resolved', {\n useAngularCompilationAPI: !!useAngularCompilationAPI,\n typedRouter: platformOptions.experimental?.typedRouter,\n stylePipeline: !!platformOptions.experimental?.stylePipeline,\n });\n let nitroOptions = platformOptions?.nitro;\n\n if (nitroOptions?.routeRules) {\n nitroOptions = {\n ...nitroOptions,\n routeRules: mapValues(nitroOptions.routeRules, (rule) => ({\n ...rule,\n headers: {\n ...rule.headers,\n 'x-analog-no-ssr': rule?.ssr === false ? 'true' : undefined,\n } as any,\n })),\n };\n }\n\n return [\n {\n name: 'analogjs-debug-activate',\n config(_, { command }) {\n activateDeferredDebug(command);\n },\n },\n ...externalPlugins(viteNitroPlugin(platformOptions as any, nitroOptions)),\n ...(platformOptions.ssr\n ? [...ssrBuildPlugin(), ...injectHTMLPlugin()]\n : []),\n ...(!isTest ? depsPlugin(platformOptions) : []),\n ...resolveStylePipelinePlugins(\n platformOptions.experimental?.stylePipeline,\n platformOptions.workspaceRoot,\n ),\n ...routerPlugin(platformOptions),\n routeGenerationPlugin(platformOptions),\n ...contentPlugin(platformOptions?.content, platformOptions),\n ...(opts?.vite === false\n ? []\n : externalPlugins(\n angular({\n jit: platformOptions.jit,\n workspaceRoot: platformOptions.workspaceRoot,\n // Let the Angular plugin keep its own dev-friendly default unless the\n // app explicitly opts into stricter serve-time diagnostics.\n disableTypeChecking: platformOptions.disableTypeChecking,\n include: [\n ...(platformOptions.include ?? []),\n ...(platformOptions.additionalPagesDirs ?? []).map(\n (pageDir) => `${pageDir}/**/*.page.ts`,\n ),\n ],\n additionalContentDirs: platformOptions.additionalContentDirs,\n liveReload: platformOptions.liveReload,\n inlineStylesExtension: platformOptions.inlineStylesExtension,\n fileReplacements: platformOptions.fileReplacements,\n debug: platformOptions.debug,\n stylePipeline: platformOptions.experimental?.stylePipeline\n ?.angularPlugins?.length\n ? {\n plugins:\n platformOptions.experimental.stylePipeline.angularPlugins,\n }\n : undefined,\n ...forwardedViteOptions,\n experimental: {\n ...(viteExperimental ?? {}),\n useAngularCompilationAPI,\n },\n }),\n )),\n ...(platformOptions.i18n ? [i18nComponentRegistryPlugin()] : []),\n ...serverModePlugin(),\n ...clearClientPageEndpointsPlugin(),\n ];\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAwBA,SAAS,gBAAgB,SAA4B;AACnD,QAAO;;AAGT,SAAgB,eAAe,OAAgB,EAAE,EAAY;AAC3D,kBAAiB,KAAK,OAAO,KAAK,cAAc;CAEhD,MAAM,SAAA,QAAA,IAAA,aAAqC,UAAU,CAAC,CAAC,QAAQ,IAAI;CAEnE,MAAM,EACJ,cAAc,kBACd,KAAK,uBACL,GAAG,0BAJe,MAAM,SAAS,QAAQ,KAAA,IAAY,MAAM,SAK1C,EAAE;CACrB,MAAM,EAAE,GAAG,oBAAoB;EAC7B,KAAK;EACL,GAAG;EACJ;AACD,KAAI,gBAAgB,gBAAgB;EAKlC,MAAM,aAAa,sBAHjB,gBAAgB,iBAChB,QAAQ,IAAI,wBACZ,QAAQ,KAAK,CACwC;AACvD,kBAAgB,sBAAsB,MACpC,gBAAgB,uBAAuB,EAAE,EACzC,WAAW,oBACZ;AACD,kBAAgB,wBAAwB,MACtC,gBAAgB,yBAAyB,EAAE,EAC3C,WAAW,sBACZ;AACD,kBAAgB,oBAAoB,MAClC,gBAAgB,qBAAqB,EAAE,EACvC,WAAW,kBACZ;;CAGH,MAAM,2BACJ,gBAAgB,cAAc,4BAC9B,kBAAkB;AACpB,eAAc,iCAAiC;EAC7C,0BAA0B,CAAC,CAAC;EAC5B,aAAa,gBAAgB,cAAc;EAC3C,eAAe,CAAC,CAAC,gBAAgB,cAAc;EAChD,CAAC;CACF,IAAI,eAAe,iBAAiB;AAEpC,KAAI,cAAc,WAChB,gBAAe;EACb,GAAG;EACH,YAAY,UAAU,aAAa,aAAa,UAAU;GACxD,GAAG;GACH,SAAS;IACP,GAAG,KAAK;IACR,mBAAmB,MAAM,QAAQ,QAAQ,SAAS,KAAA;IACnD;GACF,EAAE;EACJ;AAGH,QAAO;EACL;GACE,MAAM;GACN,OAAO,GAAG,EAAE,WAAW;AACrB,0BAAsB,QAAQ;;GAEjC;EACD,GAAG,gBAAgB,gBAAgB,iBAAwB,aAAa,CAAC;EACzE,GAAI,gBAAgB,MAChB,CAAC,GAAG,gBAAgB,EAAE,GAAG,kBAAkB,CAAC,GAC5C,EAAE;EACN,GAAI,CAAC,SAAS,WAAW,gBAAgB,GAAG,EAAE;EAC9C,GAAG,4BACD,gBAAgB,cAAc,eAC9B,gBAAgB,cACjB;EACD,GAAG,aAAa,gBAAgB;EAChC,sBAAsB,gBAAgB;EACtC,GAAG,cAAc,iBAAiB,SAAS,gBAAgB;EAC3D,GAAI,MAAM,SAAS,QACf,EAAE,GACF,gBACE,QAAQ;GACN,KAAK,gBAAgB;GACrB,eAAe,gBAAgB;GAG/B,qBAAqB,gBAAgB;GACrC,SAAS,CACP,GAAI,gBAAgB,WAAW,EAAE,EACjC,IAAI,gBAAgB,uBAAuB,EAAE,EAAE,KAC5C,YAAY,GAAG,QAAQ,eACzB,CACF;GACD,uBAAuB,gBAAgB;GACvC,YAAY,gBAAgB;GAC5B,uBAAuB,gBAAgB;GACvC,kBAAkB,gBAAgB;GAClC,OAAO,gBAAgB;GACvB,eAAe,gBAAgB,cAAc,eACzC,gBAAgB,SAChB,EACE,SACE,gBAAgB,aAAa,cAAc,gBAC9C,GACD,KAAA;GACJ,GAAG;GACH,cAAc;IACZ,GAAI,oBAAoB,EAAE;IAC1B;IACD;GACF,CAAC,CACH;EACL,GAAI,gBAAgB,OAAO,CAAC,6BAA6B,CAAC,GAAG,EAAE;EAC/D,GAAG,kBAAkB;EACrB,GAAG,gCAAgC;EACpC"}
|