@adaas/are-html 0.0.5 → 0.0.6
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/dist/browser/index.d.mts +11 -2
- package/dist/browser/index.mjs +24 -2
- package/dist/browser/index.mjs.map +1 -1
- package/dist/node/engine/AreHTML.engine.d.mts +2 -2
- package/dist/node/engine/AreHTML.engine.d.ts +2 -2
- package/dist/node/engine/AreHTML.engine.js +7 -2
- package/dist/node/engine/AreHTML.engine.js.map +1 -1
- package/dist/node/engine/AreHTML.engine.mjs +8 -3
- package/dist/node/engine/AreHTML.engine.mjs.map +1 -1
- package/dist/node/engine/AreHTML.lifecycle.d.mts +10 -1
- package/dist/node/engine/AreHTML.lifecycle.d.ts +10 -1
- package/dist/node/engine/AreHTML.lifecycle.js +18 -0
- package/dist/node/engine/AreHTML.lifecycle.js.map +1 -1
- package/dist/node/engine/AreHTML.lifecycle.mjs +19 -1
- package/dist/node/engine/AreHTML.lifecycle.mjs.map +1 -1
- package/examples/dashboard/dist/index.html +1 -1
- package/examples/dashboard/dist/{mpm5e2oi-ghokyu.js → mpmt0gys-1r9rcu.js} +72 -14
- package/examples/dashboard/src/components/DashboardLogo.component.ts +9 -0
- package/package.json +1 -1
- package/src/engine/AreHTML.engine.ts +7 -1
- package/src/engine/AreHTML.lifecycle.ts +31 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { A_Scope } from '@adaas/a-concept';
|
|
2
|
-
import { AreEngine, AreSyntax, AreSyntaxTokenMatch } from '@adaas/are';
|
|
2
|
+
import { AreEngine, AreSyntax, AreSignalsContext, AreSyntaxTokenMatch } from '@adaas/are';
|
|
3
3
|
|
|
4
4
|
declare class AreHTMLEngine extends AreEngine {
|
|
5
5
|
get DefaultSyntax(): AreSyntax;
|
|
@@ -8,7 +8,7 @@ declare class AreHTMLEngine extends AreEngine {
|
|
|
8
8
|
*
|
|
9
9
|
* @param container
|
|
10
10
|
*/
|
|
11
|
-
init(scope: A_Scope): Promise<void>;
|
|
11
|
+
init(scope: A_Scope, signalContext?: AreSignalsContext): Promise<void>;
|
|
12
12
|
protected rootElementMatcher(source: string, from: number, to: number, build: (raw: string, content: string, position: number, closing: string) => AreSyntaxTokenMatch): AreSyntaxTokenMatch | null;
|
|
13
13
|
protected htmlElementMatcher(source: string, from: number, to: number, build: (raw: string, content: string, position: number, closing: string) => AreSyntaxTokenMatch): AreSyntaxTokenMatch | null;
|
|
14
14
|
/**
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { A_Scope } from '@adaas/a-concept';
|
|
2
|
-
import { AreEngine, AreSyntax, AreSyntaxTokenMatch } from '@adaas/are';
|
|
2
|
+
import { AreEngine, AreSyntax, AreSignalsContext, AreSyntaxTokenMatch } from '@adaas/are';
|
|
3
3
|
|
|
4
4
|
declare class AreHTMLEngine extends AreEngine {
|
|
5
5
|
get DefaultSyntax(): AreSyntax;
|
|
@@ -8,7 +8,7 @@ declare class AreHTMLEngine extends AreEngine {
|
|
|
8
8
|
*
|
|
9
9
|
* @param container
|
|
10
10
|
*/
|
|
11
|
-
init(scope: A_Scope): Promise<void>;
|
|
11
|
+
init(scope: A_Scope, signalContext?: AreSignalsContext): Promise<void>;
|
|
12
12
|
protected rootElementMatcher(source: string, from: number, to: number, build: (raw: string, content: string, position: number, closing: string) => AreSyntaxTokenMatch): AreSyntaxTokenMatch | null;
|
|
13
13
|
protected htmlElementMatcher(source: string, from: number, to: number, build: (raw: string, content: string, position: number, closing: string) => AreSyntaxTokenMatch): AreSyntaxTokenMatch | null;
|
|
14
14
|
/**
|
|
@@ -72,7 +72,7 @@ exports.AreHTMLEngine = class AreHTMLEngine extends are.AreEngine {
|
|
|
72
72
|
]
|
|
73
73
|
});
|
|
74
74
|
}
|
|
75
|
-
async init(scope) {
|
|
75
|
+
async init(scope, signalContext) {
|
|
76
76
|
this.package(scope, {
|
|
77
77
|
context: new AreHTML_context.AreHTMLEngineContext({}),
|
|
78
78
|
syntax: this.DefaultSyntax,
|
|
@@ -82,6 +82,10 @@ exports.AreHTMLEngine = class AreHTMLEngine extends are.AreEngine {
|
|
|
82
82
|
lifecycle: lifecycle.AreHTMLLifecycle,
|
|
83
83
|
transformer: transformer.AreHTMLTransformer
|
|
84
84
|
});
|
|
85
|
+
if (!signalContext) {
|
|
86
|
+
signalContext = new are.AreSignalsContext();
|
|
87
|
+
scope.register(signalContext);
|
|
88
|
+
}
|
|
85
89
|
}
|
|
86
90
|
rootElementMatcher(source, from, to, build) {
|
|
87
91
|
const rootTag = "are-root";
|
|
@@ -190,7 +194,8 @@ __decorateClass([
|
|
|
190
194
|
name: aService.A_ServiceFeatures.onBeforeLoad,
|
|
191
195
|
before: /.*/
|
|
192
196
|
}),
|
|
193
|
-
__decorateParam(0, aConcept.A_Inject(aConcept.A_Scope))
|
|
197
|
+
__decorateParam(0, aConcept.A_Inject(aConcept.A_Scope)),
|
|
198
|
+
__decorateParam(1, aConcept.A_Inject(are.AreSignalsContext))
|
|
194
199
|
], exports.AreHTMLEngine.prototype, "init", 1);
|
|
195
200
|
exports.AreHTMLEngine = __decorateClass([
|
|
196
201
|
core.A_Frame.Define({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/engine/AreHTML.engine.ts"],"names":["AreHTMLEngine","AreEngine","AreSyntax","AreComment","AreInterpolation","AreRootNode","AreComponentNode","AreText","AreHTMLEngineContext","AreHTMLCompiler","AreHTMLInterpreter","AreHTMLTokenizer","AreHTMLLifecycle","AreHTMLTransformer","content","match","isVoidElement","A_Feature","A_ServiceFeatures","A_Scope","A_Frame"],"mappings":"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","file":"AreHTML.engine.js","sourcesContent":["import { A_Feature, A_Inject, A_Scope } from \"@adaas/a-concept\";\nimport { A_Frame } from \"@adaas/a-frame/core\"\nimport { A_ServiceFeatures } from \"@adaas/a-utils/a-service\";\nimport { AreEngine, AreSyntaxTokenMatch, AreSyntax } from \"@adaas/are\";\nimport { AreHTMLInterpreter } from \"@adaas/are-html/interpreter\";\nimport { AreHTMLEngineContext } from \"./AreHTML.context\";\nimport { AreInterpolation } from \"@adaas/are-html/nodes/AreInterpolation\";\nimport { AreText } from \"@adaas/are-html/nodes/AreText\";\nimport { AreComment } from \"@adaas/are-html/nodes/AreComment\";\nimport { AreComponentNode } from \"@adaas/are-html/nodes/AreComponent\";\nimport { AreHTMLTokenizer } from \"@adaas/are-html/tokenizer\";\nimport { AreRootNode } from \"@adaas/are-html/nodes/AreRoot\";\nimport { AreHTMLLifecycle } from \"@adaas/are-html/lifecycle\";\nimport { AreHTMLTransformer } from \"@adaas/are-html/transformer\";\nimport { AreHTMLCompiler } from \"./AreHTML.compiler\";\nimport { isVoidElement } from \"./AreHTML.constants\";\n\n\n\n@A_Frame.Define({\n namespace: 'a-are-html',\n description: 'Concrete HTML rendering engine that assembles the full ARE pipeline for web environments. Bootstraps and wires AreHTMLTokenizer, AreHTMLTransformer, AreHTMLCompiler, AreHTMLInterpreter, and AreHTMLLifecycle; mounts root nodes from inline or fetched templates; and drives reactive re-renders via the AreSignals bus.'\n})\nexport class AreHTMLEngine extends AreEngine {\n\n\n\n get DefaultSyntax() {\n return new AreSyntax({\n trimWhitespace: true,\n strictMode: true,\n rules: [\n // HTML comments\n {\n opening: '<!--',\n closing: '-->',\n component: AreComment,\n priority: 10,\n nested: false,\n extract: (raw) => ({ content: raw.slice(4, -3).trim() }),\n },\n // interpolations\n {\n opening: '{{',\n closing: '}}',\n component: AreInterpolation,\n priority: 9,\n nested: false,\n extract: (_, match) => ({ key: match.content }),\n },\n // are-root — matched before generic elements, produces AreRootNode\n {\n matcher: this.rootElementMatcher.bind(this),\n component: AreRootNode,\n priority: 5,\n },\n // generic HTML elements\n {\n matcher: this.htmlElementMatcher.bind(this),\n component: AreComponentNode,\n priority: 4,\n },\n // plain text fallback\n {\n component: AreText,\n priority: 0,\n },\n ],\n })\n }\n\n\n /**\n * Inject AreHTMLSyntax into the container scope before loading\n * \n * @param container \n */\n @A_Feature.Extend({\n name: A_ServiceFeatures.onBeforeLoad,\n before: /.*/\n })\n async init(\n @A_Inject(A_Scope) scope: A_Scope,\n ) {\n this.package(scope, {\n context: new AreHTMLEngineContext({}),\n syntax: this.DefaultSyntax,\n compiler: AreHTMLCompiler,\n interpreter: AreHTMLInterpreter,\n tokenizer: AreHTMLTokenizer,\n lifecycle: AreHTMLLifecycle,\n transformer: AreHTMLTransformer,\n });\n }\n\n\n protected rootElementMatcher(\n source: string,\n from: number,\n to: number,\n build: (raw: string, content: string, position: number, closing: string) => AreSyntaxTokenMatch\n ): AreSyntaxTokenMatch | null {\n\n // const rootTag = this.config.rootTag\n const rootTag = 'are-root';\n\n const tagStart = source.indexOf('<', from)\n if (tagStart === -1 || tagStart >= to) return null\n\n // only match if the tag name is exactly the configured root tag\n const tagNameMatch = source.slice(tagStart).match(/^<([a-zA-Z][a-zA-Z0-9-]*)/)\n if (!tagNameMatch || tagNameMatch[1].toLowerCase() !== rootTag) return null\n\n // delegate the actual matching to the shared HTML element logic\n return this.htmlElementMatcher(source, from, to, build)\n }\n\n protected htmlElementMatcher(\n source: string,\n from: number,\n to: number,\n build: (raw: string, content: string, position: number, closing: string) => AreSyntaxTokenMatch\n ): AreSyntaxTokenMatch | null {\n let index = from\n\n while (index < to) {\n const tagStart = source.indexOf('<', index)\n if (tagStart === -1 || tagStart >= to) return null\n\n // skip comments, closing tags, doctype, processing instructions\n if (source.startsWith('<!--', tagStart)) { index = tagStart + 1; continue }\n if (source[tagStart + 1] === '/') { index = tagStart + 1; continue }\n if (source[tagStart + 1] === '!' || source[tagStart + 1] === '?') { index = tagStart + 1; continue }\n\n const tagNameMatch = source.slice(tagStart).match(/^<([a-zA-Z][a-zA-Z0-9-]*)/)\n if (!tagNameMatch) { index = tagStart + 1; continue }\n\n const tagName = tagNameMatch[1]\n const openingTagEnd = AreHTMLEngine.findTagClose(source, tagStart)\n if (openingTagEnd === -1) return null\n\n // extract id attribute if present in the opening tag\n const openingTagStr = source.slice(tagStart, openingTagEnd + 1)\n const idMatch = openingTagStr.match(/\\bid=[\"']([^\"']*)[\"']/)\n const id = idMatch ? idMatch[1] : undefined\n\n // self-closing: <br/> or <input/>\n if (source[openingTagEnd - 1] === '/') {\n const raw = source.slice(tagStart, openingTagEnd + 1)\n const content = source.slice(tagStart + tagNameMatch[0].length, openingTagEnd - 1)\n const match = build(raw, content, tagStart, '/>')\n match.payload = { entity: tagName, selfClose: true, id }\n return match\n }\n\n // HTML5 void elements: <input>, <br>, <img>, etc. — treat as self-closing\n if (isVoidElement(tagName)) {\n const raw = source.slice(tagStart, openingTagEnd + 1)\n const content = source.slice(tagStart + tagNameMatch[0].length, openingTagEnd)\n const match = build(raw, content, tagStart, '>')\n match.payload = { entity: tagName, selfClose: true, id }\n return match\n }\n\n // find matching closing tag respecting nesting\n const closingTag = `</${tagName}>`\n let level = 0\n let searchIndex = openingTagEnd + 1\n let closingStart = -1\n\n while (searchIndex < to) {\n const nextOpen = source.indexOf(`<${tagName}`, searchIndex)\n const nextClose = source.indexOf(closingTag, searchIndex)\n if (nextClose === -1) break\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n const charAfter = source[nextOpen + tagName.length + 1]\n if (charAfter === ' ' || charAfter === '>' || charAfter === '/') {\n // Skip self-closing nested occurrences, e.g. <div/> inside <div>...</div>.\n const innerEnd = AreHTMLEngine.findTagClose(source, nextOpen)\n const isSelfClose = innerEnd !== -1 && source[innerEnd - 1] === '/'\n\n if (!isSelfClose) {\n level++\n }\n searchIndex = (innerEnd === -1 ? nextOpen + tagName.length + 1 : innerEnd + 1)\n continue\n }\n }\n\n if (level === 0) { closingStart = nextClose; break }\n level--\n searchIndex = nextClose + closingTag.length\n }\n\n if (closingStart === -1) return null\n\n const fullTag = source.slice(tagStart, closingStart + closingTag.length)\n const content = source.slice(openingTagEnd + 1, closingStart)\n const match = build(fullTag, content, tagStart, closingTag)\n match.payload = { entity: tagName, selfClose: false, id }\n return match\n }\n return null\n }\n\n /**\n * Find the index of the closing `>` of an opening tag, skipping over\n * `>` characters that appear inside quoted attribute values.\n */\n private static findTagClose(source: string, from: number): number {\n let inSingle = false\n let inDouble = false\n\n for (let i = from; i < source.length; i++) {\n const ch = source[i]\n if (ch === '\"' && !inSingle) inDouble = !inDouble\n else if (ch === \"'\" && !inDouble) inSingle = !inSingle\n else if (ch === '>' && !inSingle && !inDouble) return i\n }\n\n return -1\n }\n\n}"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/engine/AreHTML.engine.ts"],"names":["AreHTMLEngine","AreEngine","AreSyntax","AreComment","AreInterpolation","AreRootNode","AreComponentNode","AreText","AreHTMLEngineContext","AreHTMLCompiler","AreHTMLInterpreter","AreHTMLTokenizer","AreHTMLLifecycle","AreHTMLTransformer","AreSignalsContext","content","match","isVoidElement","A_Feature","A_ServiceFeatures","A_Scope","A_Frame"],"mappings":"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","file":"AreHTML.engine.js","sourcesContent":["import { A_Feature, A_Inject, A_Scope } from \"@adaas/a-concept\";\nimport { A_Frame } from \"@adaas/a-frame/core\"\nimport { A_ServiceFeatures } from \"@adaas/a-utils/a-service\";\nimport { AreEngine, AreSyntaxTokenMatch, AreSyntax, AreSignalsContext } from \"@adaas/are\";\nimport { AreHTMLInterpreter } from \"@adaas/are-html/interpreter\";\nimport { AreHTMLEngineContext } from \"./AreHTML.context\";\nimport { AreInterpolation } from \"@adaas/are-html/nodes/AreInterpolation\";\nimport { AreText } from \"@adaas/are-html/nodes/AreText\";\nimport { AreComment } from \"@adaas/are-html/nodes/AreComment\";\nimport { AreComponentNode } from \"@adaas/are-html/nodes/AreComponent\";\nimport { AreHTMLTokenizer } from \"@adaas/are-html/tokenizer\";\nimport { AreRootNode } from \"@adaas/are-html/nodes/AreRoot\";\nimport { AreHTMLLifecycle } from \"@adaas/are-html/lifecycle\";\nimport { AreHTMLTransformer } from \"@adaas/are-html/transformer\";\nimport { AreHTMLCompiler } from \"./AreHTML.compiler\";\nimport { isVoidElement } from \"./AreHTML.constants\";\n\n\n\n@A_Frame.Define({\n namespace: 'a-are-html',\n description: 'Concrete HTML rendering engine that assembles the full ARE pipeline for web environments. Bootstraps and wires AreHTMLTokenizer, AreHTMLTransformer, AreHTMLCompiler, AreHTMLInterpreter, and AreHTMLLifecycle; mounts root nodes from inline or fetched templates; and drives reactive re-renders via the AreSignals bus.'\n})\nexport class AreHTMLEngine extends AreEngine {\n\n\n\n get DefaultSyntax() {\n return new AreSyntax({\n trimWhitespace: true,\n strictMode: true,\n rules: [\n // HTML comments\n {\n opening: '<!--',\n closing: '-->',\n component: AreComment,\n priority: 10,\n nested: false,\n extract: (raw) => ({ content: raw.slice(4, -3).trim() }),\n },\n // interpolations\n {\n opening: '{{',\n closing: '}}',\n component: AreInterpolation,\n priority: 9,\n nested: false,\n extract: (_, match) => ({ key: match.content }),\n },\n // are-root — matched before generic elements, produces AreRootNode\n {\n matcher: this.rootElementMatcher.bind(this),\n component: AreRootNode,\n priority: 5,\n },\n // generic HTML elements\n {\n matcher: this.htmlElementMatcher.bind(this),\n component: AreComponentNode,\n priority: 4,\n },\n // plain text fallback\n {\n component: AreText,\n priority: 0,\n },\n ],\n })\n }\n\n\n /**\n * Inject AreHTMLSyntax into the container scope before loading\n * \n * @param container \n */\n @A_Feature.Extend({\n name: A_ServiceFeatures.onBeforeLoad,\n before: /.*/\n })\n async init(\n @A_Inject(A_Scope) scope: A_Scope,\n @A_Inject(AreSignalsContext) signalContext?: AreSignalsContext\n ) {\n this.package(scope, {\n context: new AreHTMLEngineContext({}),\n syntax: this.DefaultSyntax,\n compiler: AreHTMLCompiler,\n interpreter: AreHTMLInterpreter,\n tokenizer: AreHTMLTokenizer,\n lifecycle: AreHTMLLifecycle,\n transformer: AreHTMLTransformer,\n });\n\n if(!signalContext) {\n signalContext = new AreSignalsContext();\n scope.register(signalContext);\n }\n }\n\n\n protected rootElementMatcher(\n source: string,\n from: number,\n to: number,\n build: (raw: string, content: string, position: number, closing: string) => AreSyntaxTokenMatch\n ): AreSyntaxTokenMatch | null {\n\n // const rootTag = this.config.rootTag\n const rootTag = 'are-root';\n\n const tagStart = source.indexOf('<', from)\n if (tagStart === -1 || tagStart >= to) return null\n\n // only match if the tag name is exactly the configured root tag\n const tagNameMatch = source.slice(tagStart).match(/^<([a-zA-Z][a-zA-Z0-9-]*)/)\n if (!tagNameMatch || tagNameMatch[1].toLowerCase() !== rootTag) return null\n\n // delegate the actual matching to the shared HTML element logic\n return this.htmlElementMatcher(source, from, to, build)\n }\n\n protected htmlElementMatcher(\n source: string,\n from: number,\n to: number,\n build: (raw: string, content: string, position: number, closing: string) => AreSyntaxTokenMatch\n ): AreSyntaxTokenMatch | null {\n let index = from\n\n while (index < to) {\n const tagStart = source.indexOf('<', index)\n if (tagStart === -1 || tagStart >= to) return null\n\n // skip comments, closing tags, doctype, processing instructions\n if (source.startsWith('<!--', tagStart)) { index = tagStart + 1; continue }\n if (source[tagStart + 1] === '/') { index = tagStart + 1; continue }\n if (source[tagStart + 1] === '!' || source[tagStart + 1] === '?') { index = tagStart + 1; continue }\n\n const tagNameMatch = source.slice(tagStart).match(/^<([a-zA-Z][a-zA-Z0-9-]*)/)\n if (!tagNameMatch) { index = tagStart + 1; continue }\n\n const tagName = tagNameMatch[1]\n const openingTagEnd = AreHTMLEngine.findTagClose(source, tagStart)\n if (openingTagEnd === -1) return null\n\n // extract id attribute if present in the opening tag\n const openingTagStr = source.slice(tagStart, openingTagEnd + 1)\n const idMatch = openingTagStr.match(/\\bid=[\"']([^\"']*)[\"']/)\n const id = idMatch ? idMatch[1] : undefined\n\n // self-closing: <br/> or <input/>\n if (source[openingTagEnd - 1] === '/') {\n const raw = source.slice(tagStart, openingTagEnd + 1)\n const content = source.slice(tagStart + tagNameMatch[0].length, openingTagEnd - 1)\n const match = build(raw, content, tagStart, '/>')\n match.payload = { entity: tagName, selfClose: true, id }\n return match\n }\n\n // HTML5 void elements: <input>, <br>, <img>, etc. — treat as self-closing\n if (isVoidElement(tagName)) {\n const raw = source.slice(tagStart, openingTagEnd + 1)\n const content = source.slice(tagStart + tagNameMatch[0].length, openingTagEnd)\n const match = build(raw, content, tagStart, '>')\n match.payload = { entity: tagName, selfClose: true, id }\n return match\n }\n\n // find matching closing tag respecting nesting\n const closingTag = `</${tagName}>`\n let level = 0\n let searchIndex = openingTagEnd + 1\n let closingStart = -1\n\n while (searchIndex < to) {\n const nextOpen = source.indexOf(`<${tagName}`, searchIndex)\n const nextClose = source.indexOf(closingTag, searchIndex)\n if (nextClose === -1) break\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n const charAfter = source[nextOpen + tagName.length + 1]\n if (charAfter === ' ' || charAfter === '>' || charAfter === '/') {\n // Skip self-closing nested occurrences, e.g. <div/> inside <div>...</div>.\n const innerEnd = AreHTMLEngine.findTagClose(source, nextOpen)\n const isSelfClose = innerEnd !== -1 && source[innerEnd - 1] === '/'\n\n if (!isSelfClose) {\n level++\n }\n searchIndex = (innerEnd === -1 ? nextOpen + tagName.length + 1 : innerEnd + 1)\n continue\n }\n }\n\n if (level === 0) { closingStart = nextClose; break }\n level--\n searchIndex = nextClose + closingTag.length\n }\n\n if (closingStart === -1) return null\n\n const fullTag = source.slice(tagStart, closingStart + closingTag.length)\n const content = source.slice(openingTagEnd + 1, closingStart)\n const match = build(fullTag, content, tagStart, closingTag)\n match.payload = { entity: tagName, selfClose: false, id }\n return match\n }\n return null\n }\n\n /**\n * Find the index of the closing `>` of an opening tag, skipping over\n * `>` characters that appear inside quoted attribute values.\n */\n private static findTagClose(source: string, from: number): number {\n let inSingle = false\n let inDouble = false\n\n for (let i = from; i < source.length; i++) {\n const ch = source[i]\n if (ch === '\"' && !inSingle) inDouble = !inDouble\n else if (ch === \"'\" && !inDouble) inSingle = !inSingle\n else if (ch === '>' && !inSingle && !inDouble) return i\n }\n\n return -1\n }\n\n}"]}
|
|
@@ -2,7 +2,7 @@ import { __decorateClass, __decorateParam } from '../chunk-EQQGB2QZ.mjs';
|
|
|
2
2
|
import { A_Feature, A_Inject, A_Scope } from '@adaas/a-concept';
|
|
3
3
|
import { A_Frame } from '@adaas/a-frame/core';
|
|
4
4
|
import { A_ServiceFeatures } from '@adaas/a-utils/a-service';
|
|
5
|
-
import { AreEngine, AreSyntax } from '@adaas/are';
|
|
5
|
+
import { AreSignalsContext, AreEngine, AreSyntax } from '@adaas/are';
|
|
6
6
|
import { AreHTMLInterpreter } from '@adaas/are-html/interpreter';
|
|
7
7
|
import { AreHTMLEngineContext } from './AreHTML.context';
|
|
8
8
|
import { AreInterpolation } from '@adaas/are-html/nodes/AreInterpolation';
|
|
@@ -60,7 +60,7 @@ let AreHTMLEngine = class extends AreEngine {
|
|
|
60
60
|
]
|
|
61
61
|
});
|
|
62
62
|
}
|
|
63
|
-
async init(scope) {
|
|
63
|
+
async init(scope, signalContext) {
|
|
64
64
|
this.package(scope, {
|
|
65
65
|
context: new AreHTMLEngineContext({}),
|
|
66
66
|
syntax: this.DefaultSyntax,
|
|
@@ -70,6 +70,10 @@ let AreHTMLEngine = class extends AreEngine {
|
|
|
70
70
|
lifecycle: AreHTMLLifecycle,
|
|
71
71
|
transformer: AreHTMLTransformer
|
|
72
72
|
});
|
|
73
|
+
if (!signalContext) {
|
|
74
|
+
signalContext = new AreSignalsContext();
|
|
75
|
+
scope.register(signalContext);
|
|
76
|
+
}
|
|
73
77
|
}
|
|
74
78
|
rootElementMatcher(source, from, to, build) {
|
|
75
79
|
const rootTag = "are-root";
|
|
@@ -178,7 +182,8 @@ __decorateClass([
|
|
|
178
182
|
name: A_ServiceFeatures.onBeforeLoad,
|
|
179
183
|
before: /.*/
|
|
180
184
|
}),
|
|
181
|
-
__decorateParam(0, A_Inject(A_Scope))
|
|
185
|
+
__decorateParam(0, A_Inject(A_Scope)),
|
|
186
|
+
__decorateParam(1, A_Inject(AreSignalsContext))
|
|
182
187
|
], AreHTMLEngine.prototype, "init", 1);
|
|
183
188
|
AreHTMLEngine = __decorateClass([
|
|
184
189
|
A_Frame.Define({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/engine/AreHTML.engine.ts"],"names":["content","match"],"mappings":"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","file":"AreHTML.engine.mjs","sourcesContent":["import { A_Feature, A_Inject, A_Scope } from \"@adaas/a-concept\";\nimport { A_Frame } from \"@adaas/a-frame/core\"\nimport { A_ServiceFeatures } from \"@adaas/a-utils/a-service\";\nimport { AreEngine, AreSyntaxTokenMatch, AreSyntax } from \"@adaas/are\";\nimport { AreHTMLInterpreter } from \"@adaas/are-html/interpreter\";\nimport { AreHTMLEngineContext } from \"./AreHTML.context\";\nimport { AreInterpolation } from \"@adaas/are-html/nodes/AreInterpolation\";\nimport { AreText } from \"@adaas/are-html/nodes/AreText\";\nimport { AreComment } from \"@adaas/are-html/nodes/AreComment\";\nimport { AreComponentNode } from \"@adaas/are-html/nodes/AreComponent\";\nimport { AreHTMLTokenizer } from \"@adaas/are-html/tokenizer\";\nimport { AreRootNode } from \"@adaas/are-html/nodes/AreRoot\";\nimport { AreHTMLLifecycle } from \"@adaas/are-html/lifecycle\";\nimport { AreHTMLTransformer } from \"@adaas/are-html/transformer\";\nimport { AreHTMLCompiler } from \"./AreHTML.compiler\";\nimport { isVoidElement } from \"./AreHTML.constants\";\n\n\n\n@A_Frame.Define({\n namespace: 'a-are-html',\n description: 'Concrete HTML rendering engine that assembles the full ARE pipeline for web environments. Bootstraps and wires AreHTMLTokenizer, AreHTMLTransformer, AreHTMLCompiler, AreHTMLInterpreter, and AreHTMLLifecycle; mounts root nodes from inline or fetched templates; and drives reactive re-renders via the AreSignals bus.'\n})\nexport class AreHTMLEngine extends AreEngine {\n\n\n\n get DefaultSyntax() {\n return new AreSyntax({\n trimWhitespace: true,\n strictMode: true,\n rules: [\n // HTML comments\n {\n opening: '<!--',\n closing: '-->',\n component: AreComment,\n priority: 10,\n nested: false,\n extract: (raw) => ({ content: raw.slice(4, -3).trim() }),\n },\n // interpolations\n {\n opening: '{{',\n closing: '}}',\n component: AreInterpolation,\n priority: 9,\n nested: false,\n extract: (_, match) => ({ key: match.content }),\n },\n // are-root — matched before generic elements, produces AreRootNode\n {\n matcher: this.rootElementMatcher.bind(this),\n component: AreRootNode,\n priority: 5,\n },\n // generic HTML elements\n {\n matcher: this.htmlElementMatcher.bind(this),\n component: AreComponentNode,\n priority: 4,\n },\n // plain text fallback\n {\n component: AreText,\n priority: 0,\n },\n ],\n })\n }\n\n\n /**\n * Inject AreHTMLSyntax into the container scope before loading\n * \n * @param container \n */\n @A_Feature.Extend({\n name: A_ServiceFeatures.onBeforeLoad,\n before: /.*/\n })\n async init(\n @A_Inject(A_Scope) scope: A_Scope,\n ) {\n this.package(scope, {\n context: new AreHTMLEngineContext({}),\n syntax: this.DefaultSyntax,\n compiler: AreHTMLCompiler,\n interpreter: AreHTMLInterpreter,\n tokenizer: AreHTMLTokenizer,\n lifecycle: AreHTMLLifecycle,\n transformer: AreHTMLTransformer,\n });\n }\n\n\n protected rootElementMatcher(\n source: string,\n from: number,\n to: number,\n build: (raw: string, content: string, position: number, closing: string) => AreSyntaxTokenMatch\n ): AreSyntaxTokenMatch | null {\n\n // const rootTag = this.config.rootTag\n const rootTag = 'are-root';\n\n const tagStart = source.indexOf('<', from)\n if (tagStart === -1 || tagStart >= to) return null\n\n // only match if the tag name is exactly the configured root tag\n const tagNameMatch = source.slice(tagStart).match(/^<([a-zA-Z][a-zA-Z0-9-]*)/)\n if (!tagNameMatch || tagNameMatch[1].toLowerCase() !== rootTag) return null\n\n // delegate the actual matching to the shared HTML element logic\n return this.htmlElementMatcher(source, from, to, build)\n }\n\n protected htmlElementMatcher(\n source: string,\n from: number,\n to: number,\n build: (raw: string, content: string, position: number, closing: string) => AreSyntaxTokenMatch\n ): AreSyntaxTokenMatch | null {\n let index = from\n\n while (index < to) {\n const tagStart = source.indexOf('<', index)\n if (tagStart === -1 || tagStart >= to) return null\n\n // skip comments, closing tags, doctype, processing instructions\n if (source.startsWith('<!--', tagStart)) { index = tagStart + 1; continue }\n if (source[tagStart + 1] === '/') { index = tagStart + 1; continue }\n if (source[tagStart + 1] === '!' || source[tagStart + 1] === '?') { index = tagStart + 1; continue }\n\n const tagNameMatch = source.slice(tagStart).match(/^<([a-zA-Z][a-zA-Z0-9-]*)/)\n if (!tagNameMatch) { index = tagStart + 1; continue }\n\n const tagName = tagNameMatch[1]\n const openingTagEnd = AreHTMLEngine.findTagClose(source, tagStart)\n if (openingTagEnd === -1) return null\n\n // extract id attribute if present in the opening tag\n const openingTagStr = source.slice(tagStart, openingTagEnd + 1)\n const idMatch = openingTagStr.match(/\\bid=[\"']([^\"']*)[\"']/)\n const id = idMatch ? idMatch[1] : undefined\n\n // self-closing: <br/> or <input/>\n if (source[openingTagEnd - 1] === '/') {\n const raw = source.slice(tagStart, openingTagEnd + 1)\n const content = source.slice(tagStart + tagNameMatch[0].length, openingTagEnd - 1)\n const match = build(raw, content, tagStart, '/>')\n match.payload = { entity: tagName, selfClose: true, id }\n return match\n }\n\n // HTML5 void elements: <input>, <br>, <img>, etc. — treat as self-closing\n if (isVoidElement(tagName)) {\n const raw = source.slice(tagStart, openingTagEnd + 1)\n const content = source.slice(tagStart + tagNameMatch[0].length, openingTagEnd)\n const match = build(raw, content, tagStart, '>')\n match.payload = { entity: tagName, selfClose: true, id }\n return match\n }\n\n // find matching closing tag respecting nesting\n const closingTag = `</${tagName}>`\n let level = 0\n let searchIndex = openingTagEnd + 1\n let closingStart = -1\n\n while (searchIndex < to) {\n const nextOpen = source.indexOf(`<${tagName}`, searchIndex)\n const nextClose = source.indexOf(closingTag, searchIndex)\n if (nextClose === -1) break\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n const charAfter = source[nextOpen + tagName.length + 1]\n if (charAfter === ' ' || charAfter === '>' || charAfter === '/') {\n // Skip self-closing nested occurrences, e.g. <div/> inside <div>...</div>.\n const innerEnd = AreHTMLEngine.findTagClose(source, nextOpen)\n const isSelfClose = innerEnd !== -1 && source[innerEnd - 1] === '/'\n\n if (!isSelfClose) {\n level++\n }\n searchIndex = (innerEnd === -1 ? nextOpen + tagName.length + 1 : innerEnd + 1)\n continue\n }\n }\n\n if (level === 0) { closingStart = nextClose; break }\n level--\n searchIndex = nextClose + closingTag.length\n }\n\n if (closingStart === -1) return null\n\n const fullTag = source.slice(tagStart, closingStart + closingTag.length)\n const content = source.slice(openingTagEnd + 1, closingStart)\n const match = build(fullTag, content, tagStart, closingTag)\n match.payload = { entity: tagName, selfClose: false, id }\n return match\n }\n return null\n }\n\n /**\n * Find the index of the closing `>` of an opening tag, skipping over\n * `>` characters that appear inside quoted attribute values.\n */\n private static findTagClose(source: string, from: number): number {\n let inSingle = false\n let inDouble = false\n\n for (let i = from; i < source.length; i++) {\n const ch = source[i]\n if (ch === '\"' && !inSingle) inDouble = !inDouble\n else if (ch === \"'\" && !inDouble) inSingle = !inSingle\n else if (ch === '>' && !inSingle && !inDouble) return i\n }\n\n return -1\n }\n\n}"]}
|
|
1
|
+
{"version":3,"sources":["../../../src/engine/AreHTML.engine.ts"],"names":["content","match"],"mappings":"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","file":"AreHTML.engine.mjs","sourcesContent":["import { A_Feature, A_Inject, A_Scope } from \"@adaas/a-concept\";\nimport { A_Frame } from \"@adaas/a-frame/core\"\nimport { A_ServiceFeatures } from \"@adaas/a-utils/a-service\";\nimport { AreEngine, AreSyntaxTokenMatch, AreSyntax, AreSignalsContext } from \"@adaas/are\";\nimport { AreHTMLInterpreter } from \"@adaas/are-html/interpreter\";\nimport { AreHTMLEngineContext } from \"./AreHTML.context\";\nimport { AreInterpolation } from \"@adaas/are-html/nodes/AreInterpolation\";\nimport { AreText } from \"@adaas/are-html/nodes/AreText\";\nimport { AreComment } from \"@adaas/are-html/nodes/AreComment\";\nimport { AreComponentNode } from \"@adaas/are-html/nodes/AreComponent\";\nimport { AreHTMLTokenizer } from \"@adaas/are-html/tokenizer\";\nimport { AreRootNode } from \"@adaas/are-html/nodes/AreRoot\";\nimport { AreHTMLLifecycle } from \"@adaas/are-html/lifecycle\";\nimport { AreHTMLTransformer } from \"@adaas/are-html/transformer\";\nimport { AreHTMLCompiler } from \"./AreHTML.compiler\";\nimport { isVoidElement } from \"./AreHTML.constants\";\n\n\n\n@A_Frame.Define({\n namespace: 'a-are-html',\n description: 'Concrete HTML rendering engine that assembles the full ARE pipeline for web environments. Bootstraps and wires AreHTMLTokenizer, AreHTMLTransformer, AreHTMLCompiler, AreHTMLInterpreter, and AreHTMLLifecycle; mounts root nodes from inline or fetched templates; and drives reactive re-renders via the AreSignals bus.'\n})\nexport class AreHTMLEngine extends AreEngine {\n\n\n\n get DefaultSyntax() {\n return new AreSyntax({\n trimWhitespace: true,\n strictMode: true,\n rules: [\n // HTML comments\n {\n opening: '<!--',\n closing: '-->',\n component: AreComment,\n priority: 10,\n nested: false,\n extract: (raw) => ({ content: raw.slice(4, -3).trim() }),\n },\n // interpolations\n {\n opening: '{{',\n closing: '}}',\n component: AreInterpolation,\n priority: 9,\n nested: false,\n extract: (_, match) => ({ key: match.content }),\n },\n // are-root — matched before generic elements, produces AreRootNode\n {\n matcher: this.rootElementMatcher.bind(this),\n component: AreRootNode,\n priority: 5,\n },\n // generic HTML elements\n {\n matcher: this.htmlElementMatcher.bind(this),\n component: AreComponentNode,\n priority: 4,\n },\n // plain text fallback\n {\n component: AreText,\n priority: 0,\n },\n ],\n })\n }\n\n\n /**\n * Inject AreHTMLSyntax into the container scope before loading\n * \n * @param container \n */\n @A_Feature.Extend({\n name: A_ServiceFeatures.onBeforeLoad,\n before: /.*/\n })\n async init(\n @A_Inject(A_Scope) scope: A_Scope,\n @A_Inject(AreSignalsContext) signalContext?: AreSignalsContext\n ) {\n this.package(scope, {\n context: new AreHTMLEngineContext({}),\n syntax: this.DefaultSyntax,\n compiler: AreHTMLCompiler,\n interpreter: AreHTMLInterpreter,\n tokenizer: AreHTMLTokenizer,\n lifecycle: AreHTMLLifecycle,\n transformer: AreHTMLTransformer,\n });\n\n if(!signalContext) {\n signalContext = new AreSignalsContext();\n scope.register(signalContext);\n }\n }\n\n\n protected rootElementMatcher(\n source: string,\n from: number,\n to: number,\n build: (raw: string, content: string, position: number, closing: string) => AreSyntaxTokenMatch\n ): AreSyntaxTokenMatch | null {\n\n // const rootTag = this.config.rootTag\n const rootTag = 'are-root';\n\n const tagStart = source.indexOf('<', from)\n if (tagStart === -1 || tagStart >= to) return null\n\n // only match if the tag name is exactly the configured root tag\n const tagNameMatch = source.slice(tagStart).match(/^<([a-zA-Z][a-zA-Z0-9-]*)/)\n if (!tagNameMatch || tagNameMatch[1].toLowerCase() !== rootTag) return null\n\n // delegate the actual matching to the shared HTML element logic\n return this.htmlElementMatcher(source, from, to, build)\n }\n\n protected htmlElementMatcher(\n source: string,\n from: number,\n to: number,\n build: (raw: string, content: string, position: number, closing: string) => AreSyntaxTokenMatch\n ): AreSyntaxTokenMatch | null {\n let index = from\n\n while (index < to) {\n const tagStart = source.indexOf('<', index)\n if (tagStart === -1 || tagStart >= to) return null\n\n // skip comments, closing tags, doctype, processing instructions\n if (source.startsWith('<!--', tagStart)) { index = tagStart + 1; continue }\n if (source[tagStart + 1] === '/') { index = tagStart + 1; continue }\n if (source[tagStart + 1] === '!' || source[tagStart + 1] === '?') { index = tagStart + 1; continue }\n\n const tagNameMatch = source.slice(tagStart).match(/^<([a-zA-Z][a-zA-Z0-9-]*)/)\n if (!tagNameMatch) { index = tagStart + 1; continue }\n\n const tagName = tagNameMatch[1]\n const openingTagEnd = AreHTMLEngine.findTagClose(source, tagStart)\n if (openingTagEnd === -1) return null\n\n // extract id attribute if present in the opening tag\n const openingTagStr = source.slice(tagStart, openingTagEnd + 1)\n const idMatch = openingTagStr.match(/\\bid=[\"']([^\"']*)[\"']/)\n const id = idMatch ? idMatch[1] : undefined\n\n // self-closing: <br/> or <input/>\n if (source[openingTagEnd - 1] === '/') {\n const raw = source.slice(tagStart, openingTagEnd + 1)\n const content = source.slice(tagStart + tagNameMatch[0].length, openingTagEnd - 1)\n const match = build(raw, content, tagStart, '/>')\n match.payload = { entity: tagName, selfClose: true, id }\n return match\n }\n\n // HTML5 void elements: <input>, <br>, <img>, etc. — treat as self-closing\n if (isVoidElement(tagName)) {\n const raw = source.slice(tagStart, openingTagEnd + 1)\n const content = source.slice(tagStart + tagNameMatch[0].length, openingTagEnd)\n const match = build(raw, content, tagStart, '>')\n match.payload = { entity: tagName, selfClose: true, id }\n return match\n }\n\n // find matching closing tag respecting nesting\n const closingTag = `</${tagName}>`\n let level = 0\n let searchIndex = openingTagEnd + 1\n let closingStart = -1\n\n while (searchIndex < to) {\n const nextOpen = source.indexOf(`<${tagName}`, searchIndex)\n const nextClose = source.indexOf(closingTag, searchIndex)\n if (nextClose === -1) break\n\n if (nextOpen !== -1 && nextOpen < nextClose) {\n const charAfter = source[nextOpen + tagName.length + 1]\n if (charAfter === ' ' || charAfter === '>' || charAfter === '/') {\n // Skip self-closing nested occurrences, e.g. <div/> inside <div>...</div>.\n const innerEnd = AreHTMLEngine.findTagClose(source, nextOpen)\n const isSelfClose = innerEnd !== -1 && source[innerEnd - 1] === '/'\n\n if (!isSelfClose) {\n level++\n }\n searchIndex = (innerEnd === -1 ? nextOpen + tagName.length + 1 : innerEnd + 1)\n continue\n }\n }\n\n if (level === 0) { closingStart = nextClose; break }\n level--\n searchIndex = nextClose + closingTag.length\n }\n\n if (closingStart === -1) return null\n\n const fullTag = source.slice(tagStart, closingStart + closingTag.length)\n const content = source.slice(openingTagEnd + 1, closingStart)\n const match = build(fullTag, content, tagStart, closingTag)\n match.payload = { entity: tagName, selfClose: false, id }\n return match\n }\n return null\n }\n\n /**\n * Find the index of the closing `>` of an opening tag, skipping over\n * `>` characters that appear inside quoted attribute values.\n */\n private static findTagClose(source: string, from: number): number {\n let inSingle = false\n let inDouble = false\n\n for (let i = from; i < source.length; i++) {\n const ch = source[i]\n if (ch === '\"' && !inSingle) inDouble = !inDouble\n else if (ch === \"'\" && !inDouble) inSingle = !inSingle\n else if (ch === '>' && !inSingle && !inDouble) return i\n }\n\n return -1\n }\n\n}"]}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { A_Scope, A_Feature } from '@adaas/a-concept';
|
|
2
|
-
import { AreLifecycle, AreSignalsContext } from '@adaas/are';
|
|
2
|
+
import { AreLifecycle, AreSignalsContext, AreScene } from '@adaas/are';
|
|
3
3
|
import { A_Logger } from '@adaas/a-utils/a-logger';
|
|
4
4
|
import { e as AreHTMLNode, b as AreDirectiveAttribute } from '../AreBinding.attribute-C6qrxN8K.mjs';
|
|
5
5
|
import { AreHTMLEngineContext } from './AreHTML.context.mjs';
|
|
@@ -10,6 +10,15 @@ declare class AreHTMLLifecycle extends AreLifecycle {
|
|
|
10
10
|
initComponent(node: AreHTMLNode, scope: A_Scope, context: AreHTMLEngineContext, signalsContext?: AreSignalsContext, logger?: A_Logger, ...args: any[]): void;
|
|
11
11
|
initText(node: AreHTMLNode, scope: A_Scope, context: AreHTMLEngineContext, logger?: A_Logger, ...args: any[]): void;
|
|
12
12
|
initInterpolation(node: AreHTMLNode, scope: A_Scope, context: AreHTMLEngineContext, logger?: A_Logger, ...args: any[]): void;
|
|
13
|
+
mount(
|
|
14
|
+
/**
|
|
15
|
+
* Node to be mounted
|
|
16
|
+
*/
|
|
17
|
+
node: AreHTMLNode,
|
|
18
|
+
/**
|
|
19
|
+
* Node Content
|
|
20
|
+
*/
|
|
21
|
+
scene: AreScene, logger?: A_Logger, ...args: any[]): void;
|
|
13
22
|
updateDirectiveAttribute(directive: AreDirectiveAttribute, scope: A_Scope, feature: A_Feature, logger?: A_Logger, ...args: any[]): void;
|
|
14
23
|
}
|
|
15
24
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { A_Scope, A_Feature } from '@adaas/a-concept';
|
|
2
|
-
import { AreLifecycle, AreSignalsContext } from '@adaas/are';
|
|
2
|
+
import { AreLifecycle, AreSignalsContext, AreScene } from '@adaas/are';
|
|
3
3
|
import { A_Logger } from '@adaas/a-utils/a-logger';
|
|
4
4
|
import { e as AreHTMLNode, b as AreDirectiveAttribute } from '../AreBinding.attribute-C6JasbJL.js';
|
|
5
5
|
import { AreHTMLEngineContext } from './AreHTML.context.js';
|
|
@@ -10,6 +10,15 @@ declare class AreHTMLLifecycle extends AreLifecycle {
|
|
|
10
10
|
initComponent(node: AreHTMLNode, scope: A_Scope, context: AreHTMLEngineContext, signalsContext?: AreSignalsContext, logger?: A_Logger, ...args: any[]): void;
|
|
11
11
|
initText(node: AreHTMLNode, scope: A_Scope, context: AreHTMLEngineContext, logger?: A_Logger, ...args: any[]): void;
|
|
12
12
|
initInterpolation(node: AreHTMLNode, scope: A_Scope, context: AreHTMLEngineContext, logger?: A_Logger, ...args: any[]): void;
|
|
13
|
+
mount(
|
|
14
|
+
/**
|
|
15
|
+
* Node to be mounted
|
|
16
|
+
*/
|
|
17
|
+
node: AreHTMLNode,
|
|
18
|
+
/**
|
|
19
|
+
* Node Content
|
|
20
|
+
*/
|
|
21
|
+
scene: AreScene, logger?: A_Logger, ...args: any[]): void;
|
|
13
22
|
updateDirectiveAttribute(directive: AreDirectiveAttribute, scope: A_Scope, feature: A_Feature, logger?: A_Logger, ...args: any[]): void;
|
|
14
23
|
}
|
|
15
24
|
|
|
@@ -10,6 +10,7 @@ var AreText = require('@adaas/are-html/nodes/AreText');
|
|
|
10
10
|
var AreDirective_attribute = require('@adaas/are-html/attributes/AreDirective.attribute');
|
|
11
11
|
var AreDirective_constants = require('@adaas/are-html/directive/AreDirective.constants');
|
|
12
12
|
var AreHTML_context = require('./AreHTML.context');
|
|
13
|
+
var AreHTMLNode = require('../lib/AreHTMLNode/AreHTMLNode');
|
|
13
14
|
var core = require('@adaas/a-frame/core');
|
|
14
15
|
|
|
15
16
|
var __defProp = Object.defineProperty;
|
|
@@ -36,6 +37,14 @@ exports.AreHTMLLifecycle = class AreHTMLLifecycle extends are.AreLifecycle {
|
|
|
36
37
|
const scene = new are.AreScene(node.aseid);
|
|
37
38
|
scope.register(scene);
|
|
38
39
|
}
|
|
40
|
+
mount(node, scene, logger, ...args) {
|
|
41
|
+
logger?.debug(`[Mount] Component Trigger for <${node.aseid.entity}> with aseid :{${node.aseid.toString()}}`);
|
|
42
|
+
node.interpret();
|
|
43
|
+
for (let i = 0; i < node.children.length; i++) {
|
|
44
|
+
const child = node.children[i];
|
|
45
|
+
child.mount();
|
|
46
|
+
}
|
|
47
|
+
}
|
|
39
48
|
updateDirectiveAttribute(directive, scope, feature, logger, ...args) {
|
|
40
49
|
if (directive.component) {
|
|
41
50
|
feature.chain(directive.component, AreDirective_constants.AreDirectiveFeatures.Update, directive.owner.scope);
|
|
@@ -67,6 +76,15 @@ __decorateClass([
|
|
|
67
76
|
__decorateParam(2, aConcept.A_Inject(AreHTML_context.AreHTMLEngineContext)),
|
|
68
77
|
__decorateParam(3, aConcept.A_Inject(aLogger.A_Logger))
|
|
69
78
|
], exports.AreHTMLLifecycle.prototype, "initInterpolation", 1);
|
|
79
|
+
__decorateClass([
|
|
80
|
+
aConcept.A_Feature.Extend({
|
|
81
|
+
name: are.AreNodeFeatures.onMount,
|
|
82
|
+
scope: [AreHTMLNode.AreHTMLNode]
|
|
83
|
+
}),
|
|
84
|
+
__decorateParam(0, aConcept.A_Inject(aConcept.A_Caller)),
|
|
85
|
+
__decorateParam(1, aConcept.A_Inject(are.AreScene)),
|
|
86
|
+
__decorateParam(2, aConcept.A_Inject(aLogger.A_Logger))
|
|
87
|
+
], exports.AreHTMLLifecycle.prototype, "mount", 1);
|
|
70
88
|
__decorateClass([
|
|
71
89
|
aConcept.A_Feature.Extend({
|
|
72
90
|
name: are.AreAttributeFeatures.Update,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/engine/AreHTML.lifecycle.ts"],"names":["AreHTMLLifecycle","AreLifecycle","AreScene","AreDirectiveFeatures","A_FormatterHelper","AreComponentNode","AreRootNode","A_Caller","A_Scope","AreHTMLEngineContext","AreSignalsContext","A_Logger","AreText","AreInterpolation","A_Feature","AreAttributeFeatures","AreDirectiveAttribute","A_Frame"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/engine/AreHTML.lifecycle.ts"],"names":["AreHTMLLifecycle","AreLifecycle","AreScene","AreDirectiveFeatures","A_FormatterHelper","AreComponentNode","AreRootNode","A_Caller","A_Scope","AreHTMLEngineContext","AreSignalsContext","A_Logger","AreText","AreInterpolation","A_Feature","AreNodeFeatures","AreHTMLNode","AreAttributeFeatures","AreDirectiveAttribute","A_Frame"],"mappings":"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","file":"AreHTML.lifecycle.js","sourcesContent":["import { A_Caller, A_Feature, A_FormatterHelper, A_Inject, A_Scope } from \"@adaas/a-concept\";\nimport { AreLifecycle, AreScene, AreAttributeFeatures, AreSignalsContext, AreNodeFeatures, AreFeatures } from \"@adaas/are\";\nimport { A_Logger } from \"@adaas/a-utils/a-logger\";\nimport { AreComponentNode } from \"@adaas/are-html/nodes/AreComponent\";\nimport { AreRootNode } from \"@adaas/are-html/nodes/AreRoot\";\nimport { AreInterpolation } from \"@adaas/are-html/nodes/AreInterpolation\";\nimport { AreText } from \"@adaas/are-html/nodes/AreText\";\nimport { AreDirectiveAttribute } from \"@adaas/are-html/attributes/AreDirective.attribute\";\nimport { AreDirectiveFeatures } from \"@adaas/are-html/directive/AreDirective.constants\";\nimport { AreHTMLEngineContext } from \"./AreHTML.context\";\nimport { AreHTMLNode } from \"../lib/AreHTMLNode/AreHTMLNode\";\nimport { A_Frame } from \"@adaas/a-frame/core\";\n\n\n@A_Frame.Define({\n namespace: 'a-are-html',\n description: 'HTML-specific lifecycle handler extending AreLifecycle. Wires DOM-aware init hooks for component nodes, root nodes, interpolations, text nodes, and directive attributes to the ARE rendering pipeline, connecting each entity to its HTML engine context and priming the scene for subsequent compilation and interpretation.'\n})\nexport class AreHTMLLifecycle extends AreLifecycle {\n\n @AreLifecycle.Init(AreComponentNode)\n @AreLifecycle.Init(AreRootNode)\n initComponent(\n @A_Inject(A_Caller) node: AreHTMLNode,\n @A_Inject(A_Scope) scope: A_Scope,\n @A_Inject(AreHTMLEngineContext) context: AreHTMLEngineContext,\n @A_Inject(AreSignalsContext) signalsContext?: AreSignalsContext,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ): void {\n signalsContext?.subscribe(node);\n super.init(node, scope, context, logger, ...args);\n }\n\n\n // initRoot(\n // @A_Inject(A_Caller) node: AreHTMLNode,\n // @A_Inject(A_Scope) scope: A_Scope,\n // @A_Inject(AreHTMLEngineContext) context: AreHTMLEngineContext,\n // @A_Inject(AreSignalsContext) signalsContext?: AreSignalsContext,\n // @A_Inject(A_Logger) logger?: A_Logger,\n // ...args: any[]\n // ): void {\n // super.init(node, scope, context, logger, ...args);\n // }\n\n\n @AreLifecycle.Init(AreText)\n initText(\n @A_Inject(A_Caller) node: AreHTMLNode,\n @A_Inject(A_Scope) scope: A_Scope,\n @A_Inject(AreHTMLEngineContext) context: AreHTMLEngineContext,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ): void {\n const scene = new AreScene(node.aseid);\n\n scope.register(scene);\n }\n\n\n @AreLifecycle.Init(AreInterpolation)\n initInterpolation(\n @A_Inject(A_Caller) node: AreHTMLNode,\n @A_Inject(A_Scope) scope: A_Scope,\n @A_Inject(AreHTMLEngineContext) context: AreHTMLEngineContext,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ): void {\n const scene = new AreScene(node.aseid);\n\n scope.register(scene);\n }\n\n @A_Feature.Extend({\n name: AreNodeFeatures.onMount,\n scope: [AreHTMLNode]\n })\n mount(\n /**\n * Node to be mounted\n */\n @A_Inject(A_Caller) node: AreHTMLNode,\n /**\n * Node Content\n */\n @A_Inject(AreScene) scene: AreScene,\n\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ) {\n\n logger?.debug(`[Mount] Component Trigger for <${node.aseid.entity}> with aseid :{${node.aseid.toString()}}`);\n\n /**\n * 1. We should simply run and render node itself.\n */\n node.interpret();\n /**\n * 2. Then go through all children of the node and mount the.\n */\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n child.mount();\n }\n }\n\n @A_Feature.Extend({\n name: AreAttributeFeatures.Update,\n scope: [AreDirectiveAttribute],\n })\n updateDirectiveAttribute(\n @A_Inject(A_Caller) directive: AreDirectiveAttribute,\n @A_Inject(A_Scope) scope: A_Scope,\n @A_Inject(A_Feature) feature: A_Feature,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ) {\n /**\n * 3. If the attribute is a directive, then we should find a component that is responsible for\n * the directive compiling logic, and call it. \n * In case component is not found we just want to log a warning, \n * since the directive may be handled by some parent component or simply is a mistake in the template.\n */\n if (directive.component) {\n feature.chain(directive.component, AreDirectiveFeatures.Update, directive.owner.scope);\n } else {\n logger?.warning(`Directive handler component not found for directive: ${directive.name}. Make sure to create a component named \"AreDirective${A_FormatterHelper.toPascalCase(directive.name)}\" to handle this directive.`);\n }\n }\n\n}"]}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { __decorateClass, __decorateParam } from '../chunk-EQQGB2QZ.mjs';
|
|
2
2
|
import { A_Inject, A_Caller, A_Scope, A_Feature, A_FormatterHelper } from '@adaas/a-concept';
|
|
3
|
-
import { AreLifecycle, AreSignalsContext,
|
|
3
|
+
import { AreLifecycle, AreSignalsContext, AreNodeFeatures, AreScene, AreAttributeFeatures } from '@adaas/are';
|
|
4
4
|
import { A_Logger } from '@adaas/a-utils/a-logger';
|
|
5
5
|
import { AreComponentNode } from '@adaas/are-html/nodes/AreComponent';
|
|
6
6
|
import { AreRootNode } from '@adaas/are-html/nodes/AreRoot';
|
|
@@ -9,6 +9,7 @@ import { AreText } from '@adaas/are-html/nodes/AreText';
|
|
|
9
9
|
import { AreDirectiveAttribute } from '@adaas/are-html/attributes/AreDirective.attribute';
|
|
10
10
|
import { AreDirectiveFeatures } from '@adaas/are-html/directive/AreDirective.constants';
|
|
11
11
|
import { AreHTMLEngineContext } from './AreHTML.context';
|
|
12
|
+
import { AreHTMLNode } from '../lib/AreHTMLNode/AreHTMLNode';
|
|
12
13
|
import { A_Frame } from '@adaas/a-frame/core';
|
|
13
14
|
|
|
14
15
|
let AreHTMLLifecycle = class extends AreLifecycle {
|
|
@@ -24,6 +25,14 @@ let AreHTMLLifecycle = class extends AreLifecycle {
|
|
|
24
25
|
const scene = new AreScene(node.aseid);
|
|
25
26
|
scope.register(scene);
|
|
26
27
|
}
|
|
28
|
+
mount(node, scene, logger, ...args) {
|
|
29
|
+
logger?.debug(`[Mount] Component Trigger for <${node.aseid.entity}> with aseid :{${node.aseid.toString()}}`);
|
|
30
|
+
node.interpret();
|
|
31
|
+
for (let i = 0; i < node.children.length; i++) {
|
|
32
|
+
const child = node.children[i];
|
|
33
|
+
child.mount();
|
|
34
|
+
}
|
|
35
|
+
}
|
|
27
36
|
updateDirectiveAttribute(directive, scope, feature, logger, ...args) {
|
|
28
37
|
if (directive.component) {
|
|
29
38
|
feature.chain(directive.component, AreDirectiveFeatures.Update, directive.owner.scope);
|
|
@@ -55,6 +64,15 @@ __decorateClass([
|
|
|
55
64
|
__decorateParam(2, A_Inject(AreHTMLEngineContext)),
|
|
56
65
|
__decorateParam(3, A_Inject(A_Logger))
|
|
57
66
|
], AreHTMLLifecycle.prototype, "initInterpolation", 1);
|
|
67
|
+
__decorateClass([
|
|
68
|
+
A_Feature.Extend({
|
|
69
|
+
name: AreNodeFeatures.onMount,
|
|
70
|
+
scope: [AreHTMLNode]
|
|
71
|
+
}),
|
|
72
|
+
__decorateParam(0, A_Inject(A_Caller)),
|
|
73
|
+
__decorateParam(1, A_Inject(AreScene)),
|
|
74
|
+
__decorateParam(2, A_Inject(A_Logger))
|
|
75
|
+
], AreHTMLLifecycle.prototype, "mount", 1);
|
|
58
76
|
__decorateClass([
|
|
59
77
|
A_Feature.Extend({
|
|
60
78
|
name: AreAttributeFeatures.Update,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/engine/AreHTML.lifecycle.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../src/engine/AreHTML.lifecycle.ts"],"names":[],"mappings":"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","file":"AreHTML.lifecycle.mjs","sourcesContent":["import { A_Caller, A_Feature, A_FormatterHelper, A_Inject, A_Scope } from \"@adaas/a-concept\";\nimport { AreLifecycle, AreScene, AreAttributeFeatures, AreSignalsContext, AreNodeFeatures, AreFeatures } from \"@adaas/are\";\nimport { A_Logger } from \"@adaas/a-utils/a-logger\";\nimport { AreComponentNode } from \"@adaas/are-html/nodes/AreComponent\";\nimport { AreRootNode } from \"@adaas/are-html/nodes/AreRoot\";\nimport { AreInterpolation } from \"@adaas/are-html/nodes/AreInterpolation\";\nimport { AreText } from \"@adaas/are-html/nodes/AreText\";\nimport { AreDirectiveAttribute } from \"@adaas/are-html/attributes/AreDirective.attribute\";\nimport { AreDirectiveFeatures } from \"@adaas/are-html/directive/AreDirective.constants\";\nimport { AreHTMLEngineContext } from \"./AreHTML.context\";\nimport { AreHTMLNode } from \"../lib/AreHTMLNode/AreHTMLNode\";\nimport { A_Frame } from \"@adaas/a-frame/core\";\n\n\n@A_Frame.Define({\n namespace: 'a-are-html',\n description: 'HTML-specific lifecycle handler extending AreLifecycle. Wires DOM-aware init hooks for component nodes, root nodes, interpolations, text nodes, and directive attributes to the ARE rendering pipeline, connecting each entity to its HTML engine context and priming the scene for subsequent compilation and interpretation.'\n})\nexport class AreHTMLLifecycle extends AreLifecycle {\n\n @AreLifecycle.Init(AreComponentNode)\n @AreLifecycle.Init(AreRootNode)\n initComponent(\n @A_Inject(A_Caller) node: AreHTMLNode,\n @A_Inject(A_Scope) scope: A_Scope,\n @A_Inject(AreHTMLEngineContext) context: AreHTMLEngineContext,\n @A_Inject(AreSignalsContext) signalsContext?: AreSignalsContext,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ): void {\n signalsContext?.subscribe(node);\n super.init(node, scope, context, logger, ...args);\n }\n\n\n // initRoot(\n // @A_Inject(A_Caller) node: AreHTMLNode,\n // @A_Inject(A_Scope) scope: A_Scope,\n // @A_Inject(AreHTMLEngineContext) context: AreHTMLEngineContext,\n // @A_Inject(AreSignalsContext) signalsContext?: AreSignalsContext,\n // @A_Inject(A_Logger) logger?: A_Logger,\n // ...args: any[]\n // ): void {\n // super.init(node, scope, context, logger, ...args);\n // }\n\n\n @AreLifecycle.Init(AreText)\n initText(\n @A_Inject(A_Caller) node: AreHTMLNode,\n @A_Inject(A_Scope) scope: A_Scope,\n @A_Inject(AreHTMLEngineContext) context: AreHTMLEngineContext,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ): void {\n const scene = new AreScene(node.aseid);\n\n scope.register(scene);\n }\n\n\n @AreLifecycle.Init(AreInterpolation)\n initInterpolation(\n @A_Inject(A_Caller) node: AreHTMLNode,\n @A_Inject(A_Scope) scope: A_Scope,\n @A_Inject(AreHTMLEngineContext) context: AreHTMLEngineContext,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ): void {\n const scene = new AreScene(node.aseid);\n\n scope.register(scene);\n }\n\n @A_Feature.Extend({\n name: AreNodeFeatures.onMount,\n scope: [AreHTMLNode]\n })\n mount(\n /**\n * Node to be mounted\n */\n @A_Inject(A_Caller) node: AreHTMLNode,\n /**\n * Node Content\n */\n @A_Inject(AreScene) scene: AreScene,\n\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ) {\n\n logger?.debug(`[Mount] Component Trigger for <${node.aseid.entity}> with aseid :{${node.aseid.toString()}}`);\n\n /**\n * 1. We should simply run and render node itself.\n */\n node.interpret();\n /**\n * 2. Then go through all children of the node and mount the.\n */\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n child.mount();\n }\n }\n\n @A_Feature.Extend({\n name: AreAttributeFeatures.Update,\n scope: [AreDirectiveAttribute],\n })\n updateDirectiveAttribute(\n @A_Inject(A_Caller) directive: AreDirectiveAttribute,\n @A_Inject(A_Scope) scope: A_Scope,\n @A_Inject(A_Feature) feature: A_Feature,\n @A_Inject(A_Logger) logger?: A_Logger,\n ...args: any[]\n ) {\n /**\n * 3. If the attribute is a directive, then we should find a component that is responsible for\n * the directive compiling logic, and call it. \n * In case component is not found we just want to log a warning, \n * since the directive may be handled by some parent component or simply is a mistake in the template.\n */\n if (directive.component) {\n feature.chain(directive.component, AreDirectiveFeatures.Update, directive.owner.scope);\n } else {\n logger?.warning(`Directive handler component not found for directive: ${directive.name}. Make sure to create a component named \"AreDirective${A_FormatterHelper.toPascalCase(directive.name)}\" to handle this directive.`);\n }\n }\n\n}"]}
|