@node-projects/web-component-designer 0.0.218 → 0.0.219

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.
@@ -2,11 +2,8 @@ import { InstanceServiceContainer } from '../InstanceServiceContainer.js';
2
2
  import { ServiceContainer } from '../ServiceContainer.js';
3
3
  import { IHtmlParserService } from './IHtmlParserService.js';
4
4
  import { IDesignItem } from '../../item/IDesignItem.js';
5
- export declare abstract class AbstractClassElementParserService implements IHtmlParserService {
6
- private _parserUrl;
7
- private _esprimaUrl;
8
- constructor(parserUrl?: string, esprimaUrl?: string);
9
- parse(module: string, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, parseSnippet: boolean): Promise<IDesignItem[]>;
10
- private _parseDiv;
11
- _createDesignItemsRecursive(item: any, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, namespace: string): IDesignItem;
5
+ export declare class AbstractClassElementParserService implements IHtmlParserService {
6
+ private htmlParser;
7
+ constructor(htmlParser: IHtmlParserService);
8
+ parse(code: string, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, parseSnippet: boolean): Promise<IDesignItem[]>;
12
9
  }
@@ -1,106 +1,46 @@
1
- import { DesignItem } from '../../item/DesignItem.js';
2
- import { CssAttributeParser } from '../../helper/CssAttributeParser.js';
3
- import { newElementFromString } from '../../helper/ElementHelper.js';
4
- function* getChildNodes(node) {
5
- switch (node.type) {
6
- case 'Program':
7
- yield node.body;
8
- break;
9
- case 'ClassDeclaration':
10
- yield node.body;
11
- break;
12
- case 'MethodDefinition':
13
- yield node.value;
14
- break;
15
- }
1
+ function* findAllNodesOfKind(node, kind) {
2
+ if (node.kind == kind)
3
+ yield node;
4
+ for (const c of node.getChildren())
5
+ yield* findAllNodesOfKind(c, kind);
16
6
  }
17
- //WIP - not yet workin
18
- //Parse HTML inside of Javascript Classes
19
7
  export class AbstractClassElementParserService {
20
- _parserUrl;
21
- _esprimaUrl;
22
- constructor(parserUrl = '../../../../../node-html-parser-esm/dist/index.js', esprimaUrl = '../../../../../esprima-next/dist/esm/esprima.js') {
23
- this._parserUrl = parserUrl;
24
- this._esprimaUrl = esprimaUrl;
8
+ htmlParser;
9
+ constructor(htmlParser) {
10
+ this.htmlParser = htmlParser;
25
11
  }
26
- async parse(module, serviceContainer, instanceServiceContainer, parseSnippet) {
27
- let esprima = await import(this._esprimaUrl);
28
- const parsedModule = esprima.parseModule(module);
29
- const classDecl = parsedModule.body.find(x => x.type == esprima.Syntax.ClassDeclaration);
30
- const renderMethod = classDecl.body.body.find(x => x.type == esprima.Syntax.MethodDefinition && x.key.name == 'render');
31
- const renderMethodStatement = renderMethod.value.body.body[0];
32
- const taggedTemplate = renderMethodStatement.argument;
33
- const templateLiteral = taggedTemplate.quasi;
34
- //@ts-ignore
35
- const tmp = getChildNodes(parsedModule);
36
- const html = templateLiteral.quasis.map(x => x.value.raw).join();
12
+ async parse(code, serviceContainer, instanceServiceContainer, parseSnippet) {
13
+ const compilerHost /*: ts.CompilerHost*/ = {
14
+ fileExists: () => true,
15
+ getCanonicalFileName: filename => filename,
16
+ getCurrentDirectory: () => '',
17
+ getDefaultLibFileName: () => 'lib.d.ts',
18
+ getNewLine: () => '\n',
19
+ getSourceFile: filename => {
20
+ //@ts-ignore
21
+ return ts.createSourceFile(filename, code, ts.ScriptTarget.Latest, true);
22
+ },
23
+ readFile: () => null,
24
+ useCaseSensitiveFileNames: () => true,
25
+ writeFile: () => null,
26
+ };
27
+ const filename = 'aa.ts';
37
28
  //@ts-ignore
38
- let parser = await import(this._parserUrl);
39
- const parsed = parser.parse(html, { comment: true });
40
- let designItems = [];
41
- for (let p of parsed.childNodes) {
42
- let di = this._createDesignItemsRecursive(p, serviceContainer, instanceServiceContainer, null);
43
- if (di != null)
44
- designItems.push(di);
45
- else
46
- console.warn("NodeHtmlParserService - could not parse element", p);
47
- }
48
- return designItems;
49
- }
50
- _parseDiv = document.createElement("div");
51
- _createDesignItemsRecursive(item, serviceContainer, instanceServiceContainer, namespace) {
52
- let designItem = null;
53
- if (item.nodeType == 1) {
54
- let element;
55
- let manualCreatedElement = false;
56
- if (!namespace)
57
- element = newElementFromString('<' + item.rawTagName + ' ' + item.rawAttrs + '></' + item.rawTagName + '>'); // some custom elements only parse attributes during constructor call
58
- if (!element) {
59
- if (namespace)
60
- element = document.createElementNS(namespace, item.rawTagName);
61
- else
62
- element = document.createElement(item.rawTagName);
63
- manualCreatedElement = true;
64
- }
65
- designItem = new DesignItem(element, item, serviceContainer, instanceServiceContainer);
66
- let style = '';
67
- let attr = item.attributes;
68
- for (let a in attr) {
69
- if (a !== 'style') {
70
- designItem._withoutUndoSetAttribute(a, attr[a]);
71
- if (manualCreatedElement) {
72
- element.setAttribute(a, attr[a]);
73
- }
74
- }
75
- else {
76
- style = attr[a];
77
- }
78
- }
79
- if ((element instanceof HTMLElement || element instanceof SVGElement) && style) {
80
- let styleParser = new CssAttributeParser();
81
- styleParser.parse(style);
82
- for (let s of styleParser.entries) {
83
- designItem._withoutUndoSetStyle(s.name, s.value);
84
- if (manualCreatedElement) {
85
- element.style[s.name] = s.value;
86
- }
87
- }
88
- }
89
- element.draggable = false; //even if it should be true, for better designer exp.
90
- for (let c of item.childNodes) {
91
- let di = this._createDesignItemsRecursive(c, serviceContainer, instanceServiceContainer, element instanceof SVGElement ? 'http://www.w3.org/2000/svg' : null);
92
- designItem._insertChildInternal(di);
93
- }
94
- }
95
- else if (item.nodeType == 3) {
96
- this._parseDiv.innerHTML = item.rawText;
97
- let element = this._parseDiv.childNodes[0];
98
- designItem = new DesignItem(element, item, serviceContainer, instanceServiceContainer);
99
- }
100
- else if (item.nodeType == 8) {
101
- let element = document.createComment(item.rawText);
102
- designItem = new DesignItem(element, item, serviceContainer, instanceServiceContainer);
29
+ const program = ts.createProgram([filename], {
30
+ noResolve: true,
31
+ //@ts-ignore
32
+ target: ts.ScriptTarget.Latest,
33
+ }, compilerHost);
34
+ const sourceFile = program.getSourceFile(filename);
35
+ let htmlCode = "";
36
+ let cssStyle = "";
37
+ const nodes = findAllNodesOfKind(sourceFile, 212);
38
+ for (let nd of nodes) {
39
+ if (nd.tag.escapedText == 'html' && nd.parent.name.escapedText == "template")
40
+ htmlCode = nd.template.rawText;
41
+ if (nd.tag.escapedText == 'css' && nd.parent.name.escapedText == "style")
42
+ cssStyle = nd.template.rawText;
103
43
  }
104
- return designItem;
44
+ return this.htmlParser.parse(htmlCode, serviceContainer, instanceServiceContainer, parseSnippet);
105
45
  }
106
46
  }
@@ -0,0 +1,9 @@
1
+ import { InstanceServiceContainer } from '../InstanceServiceContainer.js';
2
+ import { ServiceContainer } from '../ServiceContainer.js';
3
+ import { IHtmlParserService } from './IHtmlParserService.js';
4
+ import { IDesignItem } from '../../item/IDesignItem.js';
5
+ export declare class BaseCustomWebcomponentParserService implements IHtmlParserService {
6
+ private htmlParser;
7
+ constructor(htmlParser: IHtmlParserService);
8
+ parse(code: string, serviceContainer: ServiceContainer, instanceServiceContainer: InstanceServiceContainer, parseSnippet: boolean): Promise<IDesignItem[]>;
9
+ }
@@ -0,0 +1,47 @@
1
+ function* findAllNodesOfKind(node, kind) {
2
+ if (node.kind == kind)
3
+ yield node;
4
+ for (const c of node.getChildren())
5
+ yield* findAllNodesOfKind(c, kind);
6
+ }
7
+ export class BaseCustomWebcomponentParserService {
8
+ htmlParser;
9
+ constructor(htmlParser) {
10
+ this.htmlParser = htmlParser;
11
+ }
12
+ async parse(code, serviceContainer, instanceServiceContainer, parseSnippet) {
13
+ const compilerHost = {
14
+ fileExists: () => true,
15
+ getCanonicalFileName: filename => filename,
16
+ getCurrentDirectory: () => '',
17
+ getDefaultLibFileName: () => 'lib.d.ts',
18
+ getNewLine: () => '\n',
19
+ getSourceFile: filename => {
20
+ //@ts-ignore
21
+ return ts.createSourceFile(filename, code, ts.ScriptTarget.Latest, true);
22
+ },
23
+ readFile: () => null,
24
+ useCaseSensitiveFileNames: () => true,
25
+ writeFile: () => null,
26
+ };
27
+ const filename = 'aa.ts';
28
+ //@ts-ignore
29
+ const program = ts.createProgram([filename], {
30
+ noResolve: true,
31
+ //@ts-ignore
32
+ target: ts.ScriptTarget.Latest,
33
+ }, compilerHost);
34
+ const sourceFile = program.getSourceFile(filename);
35
+ let htmlCode = "";
36
+ let cssStyle = "";
37
+ const nodes = findAllNodesOfKind(sourceFile, 212);
38
+ for (let nd of nodes) {
39
+ if (nd.tag.escapedText == 'html' && nd.parent.name.escapedText == "template")
40
+ htmlCode = nd.template.rawText;
41
+ if (nd.tag.escapedText == 'css' && nd.parent.name.escapedText == "style")
42
+ cssStyle = nd.template.rawText;
43
+ }
44
+ instanceServiceContainer.stylesheetService.setStylesheets([{ name: 'css', content: cssStyle }]);
45
+ return this.htmlParser.parse(htmlCode, serviceContainer, instanceServiceContainer, parseSnippet);
46
+ }
47
+ }
package/dist/index.d.ts CHANGED
@@ -57,6 +57,7 @@ export * from "./elements/services/htmlWriterService/AbstractHtmlWriterService.j
57
57
  export * from "./elements/services/htmlWriterService/FormatingHtmlWriterService.js";
58
58
  export * from "./elements/services/htmlWriterService/HtmlWriterService.js";
59
59
  export * from "./elements/services/htmlWriterService/LitTsElementWriterService.js";
60
+ export * from "./elements/services/htmlParserService/BaseCustomWebcomponentParserService.js";
60
61
  export * from "./elements/services/htmlParserService/DefaultHtmlParserService.js";
61
62
  export * from "./elements/services/htmlParserService/NodeHtmlParserService.js";
62
63
  export * from "./elements/services/htmlParserService/LitElementParserService.js";
package/dist/index.js CHANGED
@@ -35,6 +35,7 @@ export * from "./elements/services/htmlWriterService/AbstractHtmlWriterService.j
35
35
  export * from "./elements/services/htmlWriterService/FormatingHtmlWriterService.js";
36
36
  export * from "./elements/services/htmlWriterService/HtmlWriterService.js";
37
37
  export * from "./elements/services/htmlWriterService/LitTsElementWriterService.js";
38
+ export * from "./elements/services/htmlParserService/BaseCustomWebcomponentParserService.js";
38
39
  export * from "./elements/services/htmlParserService/DefaultHtmlParserService.js";
39
40
  export * from "./elements/services/htmlParserService/NodeHtmlParserService.js";
40
41
  export * from "./elements/services/htmlParserService/LitElementParserService.js";
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "description": "A UI designer for Polymer apps",
3
3
  "name": "@node-projects/web-component-designer",
4
- "version": "0.0.218",
4
+ "version": "0.0.219",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",
7
7
  "author": "",