@teleporthq/teleport-project-generator-html 0.19.1 → 0.19.8

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,17 +2,55 @@ import uidlSample from '../../../../examples/uidl-samples/simple-html.json'
2
2
  import invalidUidlSample from '../../../../examples/test-samples/project-invalid-sample.json'
3
3
  import { createHTMLProjectGenerator } from '../../src'
4
4
  import HTMLTemplate from '../../src/project-template'
5
+ import { FileType } from '@teleporthq/teleport-types'
5
6
 
6
7
  describe('Html Project Generator', () => {
7
8
  const generator = createHTMLProjectGenerator()
8
9
 
9
10
  it('runs without crasing', async () => {
10
11
  const { name, files, subFolders } = await generator.generateProject(uidlSample, HTMLTemplate)
12
+ const aboutPage = subFolders[0]?.files.find(
13
+ (page) => page.name === 'about' && page.fileType === FileType.HTML
14
+ )
15
+ const homePage = subFolders[0]?.files.find(
16
+ (page) => page.name === 'landing-page' && page.fileType === FileType.HTML
17
+ )
18
+ const homeCSS = subFolders[0]?.files.find(
19
+ (page) => page.name === 'landing-page' && page.fileType === FileType.CSS
20
+ )
11
21
 
12
22
  expect(name).toBe('teleport-project-html')
13
23
  expect(files.length).toBe(1)
14
- expect(files[0].content).toContain('start')
15
24
  expect(subFolders.length).toBe(2)
25
+ expect(aboutPage.content).toContain('head')
26
+ expect(aboutPage.content).toContain('html')
27
+ expect(homePage.content).toContain('public/playground_assets/kitten.png')
28
+ expect(homeCSS.content).toContain('public/playground_assets/kitten.png')
29
+ })
30
+
31
+ it('run withut crashing and appends entry things into single index.html', async () => {
32
+ const singularGenerator = createHTMLProjectGenerator({ individualEntyFile: false })
33
+ const { name, files, subFolders } = await singularGenerator.generateProject(
34
+ uidlSample,
35
+ HTMLTemplate
36
+ )
37
+ const aboutPage = subFolders[0]?.files.find(
38
+ (page) => page.name === 'about' && page.fileType === FileType.HTML
39
+ )
40
+ const homePage = subFolders[0]?.files.find(
41
+ (page) => page.name === 'landing-page' && page.fileType === FileType.HTML
42
+ )
43
+ const homeCSS = subFolders[0]?.files.find(
44
+ (page) => page.name === 'landing-page' && page.fileType === FileType.CSS
45
+ )
46
+
47
+ expect(name).toBe('teleport-project-html')
48
+ expect(files.length).toBe(1)
49
+ expect(subFolders.length).toBe(2)
50
+ expect(aboutPage.content).not.toContain('head')
51
+ expect(aboutPage.content).not.toContain('html')
52
+ expect(homePage.content).toContain('public/playground_assets/kitten.png')
53
+ expect(homeCSS.content).toContain('public/playground_assets/kitten.png')
16
54
  })
17
55
 
18
56
  it('throws error when invalid UIDL sample is used', async () => {
@@ -0,0 +1,144 @@
1
+ import {
2
+ InMemoryFileRecord,
3
+ ProjectPluginStructure,
4
+ ProjectStrategy,
5
+ ProjectUIDL,
6
+ UIDLElementNode,
7
+ UIDLElementNodeInlineReferencedStyle,
8
+ } from '@teleporthq/teleport-types'
9
+ import { element, elementNode, staticNode } from '@teleporthq/teleport-uidl-builders'
10
+ import { UIDLUtils } from '@teleporthq/teleport-shared'
11
+ import ProjectTemplate from '../src/project-template'
12
+ import { pluginImageResolution } from '../src/plugin-image-resolution'
13
+
14
+ describe('Image Resolution project-plugin', () => {
15
+ const files = new Map<string, InMemoryFileRecord>()
16
+ it('resolves all local assets to be refered from public folder', async () => {
17
+ const projectUIDL: ProjectUIDL = {
18
+ name: 'teleport-html',
19
+ globals: {
20
+ settings: {
21
+ title: 'teleport-html',
22
+ language: 'en',
23
+ },
24
+ assets: [],
25
+ meta: [],
26
+ },
27
+ root: {
28
+ name: 'root',
29
+ styleSetDefinitions: {
30
+ bgImage: {
31
+ type: 'reusable-project-style-map',
32
+ content: {
33
+ backgroundImage: staticNode('url("/playground_assets/kitten.png")'),
34
+ },
35
+ },
36
+ },
37
+ node: {
38
+ type: 'element',
39
+ content: element('div', {}, [
40
+ elementNode('image', { src: staticNode('/playground_assets/kitten.png') }),
41
+ elementNode('div', {}, [], null, {
42
+ backgroundImage: staticNode('url("/playground_assets/kitten.png")'),
43
+ }),
44
+ {
45
+ type: 'element',
46
+ content: {
47
+ semanticType: 'Home',
48
+ ...element('component', { image: staticNode('/playground_assets/kitten.png') }),
49
+ },
50
+ },
51
+ ]),
52
+ },
53
+ },
54
+ components: {
55
+ Home: {
56
+ name: 'Home',
57
+ styleSetDefinitions: {
58
+ bgImageC: {
59
+ type: 'reusable-project-style-map',
60
+ content: {
61
+ backgroundImage: staticNode('url("/playground_assets/kitten.png")'),
62
+ },
63
+ },
64
+ },
65
+ propDefinitions: {
66
+ image: {
67
+ type: 'string',
68
+ defaultValue: '/playground_assets/kitten.png',
69
+ },
70
+ },
71
+ node: elementNode('div', {}, [], { type: 'local' }, {}, null, {
72
+ primaryButton: {
73
+ type: 'style-map',
74
+ content: {
75
+ mapType: 'inlined',
76
+ conditions: [{ maxWidth: 991, conditionType: 'screen-size' }],
77
+ styles: {
78
+ backgroundImage: staticNode('url("/playground_assets/kitten.png")'),
79
+ },
80
+ },
81
+ },
82
+ }),
83
+ },
84
+ },
85
+ }
86
+
87
+ const structrue: ProjectPluginStructure = {
88
+ uidl: projectUIDL,
89
+ files,
90
+ dependencies: {},
91
+ template: ProjectTemplate,
92
+ strategy: {
93
+ id: 'teleport-project-html',
94
+ pages: {
95
+ path: ['src', 'pages'],
96
+ },
97
+ components: {
98
+ path: ['src', 'components'],
99
+ },
100
+ static: {
101
+ path: ['public'],
102
+ },
103
+ } as ProjectStrategy,
104
+ devDependencies: {},
105
+ rootFolder: UIDLUtils.cloneObject(ProjectTemplate),
106
+ }
107
+
108
+ const result = await pluginImageResolution.runBefore(structrue)
109
+ const { uidl } = result
110
+ const rootNode = uidl.root.node.content
111
+
112
+ /* Using assets on dom nodes like image tags */
113
+ expect((rootNode.children[0] as UIDLElementNode).content.attrs?.src?.content).toBe(
114
+ '../../public/playground_assets/kitten.png'
115
+ )
116
+ /* Using assets in style sheets */
117
+ expect((rootNode.children[1] as UIDLElementNode).content.style?.backgroundImage?.content).toBe(
118
+ 'url("../../public/playground_assets/kitten.png")'
119
+ )
120
+ /* Using attrs while passing as a prop for a component call */
121
+ expect((rootNode.children[2] as UIDLElementNode).content.attrs.image?.content).toBe(
122
+ '../../public/playground_assets/kitten.png'
123
+ )
124
+ /* Using assets as defaultProp for component definition */
125
+ expect(uidl.components.Home.propDefinitions.image.defaultValue).toBe(
126
+ '../../public/playground_assets/kitten.png'
127
+ )
128
+ /* Using assets in global styleSetDefinitions */
129
+ expect(uidl.root.styleSetDefinitions.bgImage.content.backgroundImage.content).toBe(
130
+ 'url("../../public/playground_assets/kitten.png")'
131
+ )
132
+ /* Using assets for component scoped styles */
133
+ expect(uidl.components.Home.styleSetDefinitions.bgImageC.content.backgroundImage.content).toBe(
134
+ 'url("../../public/playground_assets/kitten.png")'
135
+ )
136
+ /* Using assets for media queries */
137
+ expect(
138
+ (
139
+ uidl.components.Home.node.content.referencedStyles
140
+ .primaryButton as UIDLElementNodeInlineReferencedStyle
141
+ ).content?.styles.backgroundImage.content
142
+ ).toBe('url("../../public/playground_assets/kitten.png")')
143
+ })
144
+ })
@@ -1,3 +1,5 @@
1
1
  import HTMLTemplate from './project-template';
2
- declare const createHTMLProjectGenerator: () => import("@teleporthq/teleport-project-generator").ProjectGenerator;
2
+ declare const createHTMLProjectGenerator: (config?: {
3
+ individualEntyFile: boolean;
4
+ }) => import("@teleporthq/teleport-project-generator").ProjectGenerator;
3
5
  export { createHTMLProjectGenerator, HTMLTemplate };
package/dist/cjs/index.js CHANGED
@@ -11,16 +11,19 @@ var teleport_plugin_css_1 = require("@teleporthq/teleport-plugin-css");
11
11
  var teleport_postprocessor_prettier_html_1 = __importDefault(require("@teleporthq/teleport-postprocessor-prettier-html"));
12
12
  var project_template_1 = __importDefault(require("./project-template"));
13
13
  exports.HTMLTemplate = project_template_1.default;
14
- var createHTMLProjectGenerator = function () {
14
+ var plugin_clone_globals_1 = require("./plugin-clone-globals");
15
+ var plugin_image_resolution_1 = require("./plugin-image-resolution");
16
+ var createHTMLProjectGenerator = function (config) {
17
+ var individualEntyFile = (config || { individualEntyFile: true }).individualEntyFile;
15
18
  var generator = teleport_project_generator_1.createProjectGenerator({
16
19
  id: 'teleport-project-html',
17
20
  components: {
18
21
  generator: teleport_component_generator_html_1.createHTMLComponentGenerator,
19
- path: ['src', 'components'],
22
+ path: ['components'],
20
23
  },
21
24
  pages: {
22
25
  generator: teleport_component_generator_html_1.createHTMLComponentGenerator,
23
- path: ['src', 'pages'],
26
+ path: [''],
24
27
  },
25
28
  static: {
26
29
  prefix: '',
@@ -30,28 +33,19 @@ var createHTMLProjectGenerator = function () {
30
33
  generator: teleport_component_generator_1.createComponentGenerator,
31
34
  plugins: [teleport_plugin_css_1.createStyleSheetPlugin()],
32
35
  fileName: 'style',
33
- path: ['src'],
36
+ path: [''],
34
37
  importFile: true,
35
38
  },
36
39
  entry: {
37
40
  postprocessors: [teleport_postprocessor_prettier_html_1.default],
38
41
  fileName: 'index',
39
42
  path: [''],
40
- options: {
41
- appRootOverride: "<div>Entry file of the project</div>",
42
- customTags: [
43
- {
44
- tagName: 'link',
45
- targetTag: 'head',
46
- attributes: [
47
- { attributeKey: 'href', attributeValue: './src/style.css' },
48
- { attributeKey: 'rel', attributeValue: 'stylesheet' },
49
- ],
50
- },
51
- ],
52
- },
53
43
  },
54
44
  });
45
+ generator.addPlugin(plugin_image_resolution_1.pluginImageResolution);
46
+ if (individualEntyFile) {
47
+ generator.addPlugin(plugin_clone_globals_1.pluginCloneGlobals);
48
+ }
55
49
  return generator;
56
50
  };
57
51
  exports.createHTMLProjectGenerator = createHTMLProjectGenerator;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,qFAA+E;AAC/E,mGAA4F;AAC5F,yFAAmF;AACnF,uEAAwE;AACxE,0HAA2E;AAC3E,wEAA6C;AA+CR,uBA/C9B,0BAAY,CA+C8B;AA7CjD,IAAM,0BAA0B,GAAG;IACjC,IAAM,SAAS,GAAG,mDAAsB,CAAC;QACvC,EAAE,EAAE,uBAAuB;QAC3B,UAAU,EAAE;YACV,SAAS,EAAE,gEAA4B;YACvC,IAAI,EAAE,CAAC,KAAK,EAAE,YAAY,CAAC;SAC5B;QACD,KAAK,EAAE;YACL,SAAS,EAAE,gEAA4B;YACvC,IAAI,EAAE,CAAC,KAAK,EAAE,OAAO,CAAC;SACvB;QACD,MAAM,EAAE;YACN,MAAM,EAAE,EAAE;YACV,IAAI,EAAE,CAAC,QAAQ,CAAC;SACjB;QACD,iBAAiB,EAAE;YACjB,SAAS,EAAE,uDAAwB;YACnC,OAAO,EAAE,CAAC,4CAAsB,EAAE,CAAC;YACnC,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,CAAC,KAAK,CAAC;YACb,UAAU,EAAE,IAAI;SACjB;QACD,KAAK,EAAE;YACL,cAAc,EAAE,CAAC,8CAAY,CAAC;YAC9B,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,CAAC,EAAE,CAAC;YACV,OAAO,EAAE;gBACP,eAAe,EAAE,sCAAsC;gBACvD,UAAU,EAAE;oBACV;wBACE,OAAO,EAAE,MAAM;wBACf,SAAS,EAAE,MAAM;wBACjB,UAAU,EAAE;4BACV,EAAE,YAAY,EAAE,MAAM,EAAE,cAAc,EAAE,iBAAiB,EAAE;4BAC3D,EAAE,YAAY,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE;yBACtD;qBACF;iBACF;aACF;SACF;KACF,CAAC,CAAA;IAEF,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAEQ,gEAA0B"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;AAAA,qFAA+E;AAC/E,mGAA4F;AAC5F,yFAAmF;AACnF,uEAAwE;AACxE,0HAA2E;AAC3E,wEAA6C;AA2CR,uBA3C9B,0BAAY,CA2C8B;AA1CjD,+DAA2D;AAC3D,qEAAiE;AAEjE,IAAM,0BAA0B,GAAG,UAAC,MAAwC;IAClE,IAAA,kBAAkB,GAAK,CAAA,MAAM,IAAI,EAAE,kBAAkB,EAAE,IAAI,EAAE,CAAA,mBAA3C,CAA2C;IAErE,IAAM,SAAS,GAAG,mDAAsB,CAAC;QACvC,EAAE,EAAE,uBAAuB;QAC3B,UAAU,EAAE;YACV,SAAS,EAAE,gEAA4B;YACvC,IAAI,EAAE,CAAC,YAAY,CAAC;SACrB;QACD,KAAK,EAAE;YACL,SAAS,EAAE,gEAA4B;YACvC,IAAI,EAAE,CAAC,EAAE,CAAC;SACX;QACD,MAAM,EAAE;YACN,MAAM,EAAE,EAAE;YACV,IAAI,EAAE,CAAC,QAAQ,CAAC;SACjB;QACD,iBAAiB,EAAE;YACjB,SAAS,EAAE,uDAAwB;YACnC,OAAO,EAAE,CAAC,4CAAsB,EAAE,CAAC;YACnC,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,CAAC,EAAE,CAAC;YACV,UAAU,EAAE,IAAI;SACjB;QACD,KAAK,EAAE;YACL,cAAc,EAAE,CAAC,8CAAY,CAAC;YAC9B,QAAQ,EAAE,OAAO;YACjB,IAAI,EAAE,CAAC,EAAE,CAAC;SACX;KACF,CAAC,CAAA;IAEF,SAAS,CAAC,SAAS,CAAC,+CAAqB,CAAC,CAAA;IAC1C,IAAI,kBAAkB,EAAE;QACtB,SAAS,CAAC,SAAS,CAAC,yCAAkB,CAAC,CAAA;KACxC;IAED,OAAO,SAAS,CAAA;AAClB,CAAC,CAAA;AAEQ,gEAA0B"}
@@ -0,0 +1,7 @@
1
+ import { ProjectPlugin, ProjectPluginStructure } from '@teleporthq/teleport-types';
2
+ declare class ProjectPluginCloneGlobals implements ProjectPlugin {
3
+ runBefore(structure: ProjectPluginStructure): Promise<ProjectPluginStructure>;
4
+ runAfter(structure: ProjectPluginStructure): Promise<ProjectPluginStructure>;
5
+ }
6
+ export declare const pluginCloneGlobals: Readonly<ProjectPluginCloneGlobals>;
7
+ export {};
@@ -0,0 +1,98 @@
1
+ "use strict";
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
11
+ var __generator = (this && this.__generator) || function (thisArg, body) {
12
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
13
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
14
+ function verb(n) { return function (v) { return step([n, v]); }; }
15
+ function step(op) {
16
+ if (f) throw new TypeError("Generator is already executing.");
17
+ while (_) try {
18
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
19
+ if (y = 0, t) op = [op[0] & 2, t.value];
20
+ switch (op[0]) {
21
+ case 0: case 1: t = op; break;
22
+ case 4: _.label++; return { value: op[1], done: false };
23
+ case 5: _.label++; y = op[1]; op = [0]; continue;
24
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
25
+ default:
26
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
27
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
28
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
29
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
30
+ if (t[2]) _.ops.pop();
31
+ _.trys.pop(); continue;
32
+ }
33
+ op = body.call(thisArg, _);
34
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
35
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
36
+ }
37
+ };
38
+ var __importDefault = (this && this.__importDefault) || function (mod) {
39
+ return (mod && mod.__esModule) ? mod : { "default": mod };
40
+ };
41
+ Object.defineProperty(exports, "__esModule", { value: true });
42
+ exports.pluginCloneGlobals = void 0;
43
+ var teleport_types_1 = require("@teleporthq/teleport-types");
44
+ var node_html_parser_1 = require("node-html-parser");
45
+ var teleport_postprocessor_prettier_html_1 = __importDefault(require("@teleporthq/teleport-postprocessor-prettier-html"));
46
+ var ProjectPluginCloneGlobals = /** @class */ (function () {
47
+ function ProjectPluginCloneGlobals() {
48
+ }
49
+ ProjectPluginCloneGlobals.prototype.runBefore = function (structure) {
50
+ return __awaiter(this, void 0, void 0, function () {
51
+ return __generator(this, function (_a) {
52
+ return [2 /*return*/, structure];
53
+ });
54
+ });
55
+ };
56
+ ProjectPluginCloneGlobals.prototype.runAfter = function (structure) {
57
+ var _a;
58
+ return __awaiter(this, void 0, void 0, function () {
59
+ var files, uidl, entryFile, result, body, head;
60
+ return __generator(this, function (_b) {
61
+ files = structure.files, uidl = structure.uidl;
62
+ entryFile = files.get('entry');
63
+ if (!entryFile) {
64
+ return [2 /*return*/, structure];
65
+ }
66
+ result = node_html_parser_1.parse(entryFile.files[0].content);
67
+ body = result.querySelector('body');
68
+ body.childNodes = [];
69
+ if (Object.values(((_a = uidl.root) === null || _a === void 0 ? void 0 : _a.styleSetDefinitions) || {}).length > 0) {
70
+ head = result.querySelector('head');
71
+ head.appendChild(new node_html_parser_1.HTMLElement('link', {}, 'rel="stylesheet" href="./style.css"', result));
72
+ }
73
+ files.forEach(function (fileId, key) {
74
+ var path = fileId.path;
75
+ if (path[0] === '') {
76
+ var newFiles = fileId.files.map(function (file) {
77
+ var _a;
78
+ if (file.fileType === teleport_types_1.FileType.HTML) {
79
+ body.innerHTML = file.content;
80
+ var prettyFile = teleport_postprocessor_prettier_html_1.default((_a = {},
81
+ _a[teleport_types_1.FileType.HTML] = result.toString(),
82
+ _a));
83
+ return { name: file.name, content: prettyFile[teleport_types_1.FileType.HTML], fileType: teleport_types_1.FileType.HTML };
84
+ }
85
+ return file;
86
+ });
87
+ files.set(key, { path: path, files: newFiles });
88
+ }
89
+ });
90
+ files.delete('entry');
91
+ return [2 /*return*/, structure];
92
+ });
93
+ });
94
+ };
95
+ return ProjectPluginCloneGlobals;
96
+ }());
97
+ exports.pluginCloneGlobals = Object.freeze(new ProjectPluginCloneGlobals());
98
+ //# sourceMappingURL=plugin-clone-globals.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-clone-globals.js","sourceRoot":"","sources":["../../src/plugin-clone-globals.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,6DAKmC;AACnC,qDAAqD;AACrD,0HAA2E;AAE3E;IAAA;IA0CA,CAAC;IAzCO,6CAAS,GAAf,UAAgB,SAAiC;;;gBAC/C,sBAAO,SAAS,EAAA;;;KACjB;IAEK,4CAAQ,GAAd,UAAe,SAAiC;;;;;gBACtC,KAAK,GAAW,SAAS,MAApB,EAAE,IAAI,GAAK,SAAS,KAAd,CAAc;gBAC3B,SAAS,GAAG,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;gBACpC,IAAI,CAAC,SAAS,EAAE;oBACd,sBAAO,SAAS,EAAA;iBACjB;gBAEK,MAAM,GAAG,wBAAK,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAA;gBAC1C,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;gBACzC,IAAI,CAAC,UAAU,GAAG,EAAE,CAAA;gBAEpB,IAAI,MAAM,CAAC,MAAM,CAAC,CAAA,MAAA,IAAI,CAAC,IAAI,0CAAE,mBAAmB,KAAI,EAAE,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE;oBAC5D,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,CAAA;oBACzC,IAAI,CAAC,WAAW,CAAC,IAAI,8BAAW,CAAC,MAAM,EAAE,EAAE,EAAE,qCAAqC,EAAE,MAAM,CAAC,CAAC,CAAA;iBAC7F;gBAED,KAAK,CAAC,OAAO,CAAC,UAAC,MAAM,EAAE,GAAG;oBAChB,IAAA,IAAI,GAAK,MAAM,KAAX,CAAW;oBACvB,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE,EAAE;wBAClB,IAAM,QAAQ,GAAoB,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,UAAC,IAAI;;4BACtD,IAAI,IAAI,CAAC,QAAQ,KAAK,yBAAQ,CAAC,IAAI,EAAE;gCACnC,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAA;gCAC7B,IAAM,UAAU,GAAG,8CAAY;oCAC7B,GAAC,yBAAQ,CAAC,IAAI,IAAG,MAAM,CAAC,QAAQ,EAAE;wCAClC,CAAA;gCAEF,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,UAAU,CAAC,yBAAQ,CAAC,IAAI,CAAC,EAAE,QAAQ,EAAE,yBAAQ,CAAC,IAAI,EAAE,CAAA;6BACxF;4BACD,OAAO,IAAI,CAAA;wBACb,CAAC,CAAC,CAAA;wBACF,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,IAAI,MAAA,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAA;qBAC1C;gBACH,CAAC,CAAC,CAAA;gBAEF,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAA;gBACrB,sBAAO,SAAS,EAAA;;;KACjB;IACH,gCAAC;AAAD,CAAC,AA1CD,IA0CC;AAEY,QAAA,kBAAkB,GAAG,MAAM,CAAC,MAAM,CAAC,IAAI,yBAAyB,EAAE,CAAC,CAAA"}
@@ -0,0 +1,11 @@
1
+ import { ProjectPlugin, ProjectPluginStructure } from '@teleporthq/teleport-types';
2
+ declare class ProjectPluginImageResolution implements ProjectPlugin {
3
+ private relativePath;
4
+ runBefore(structure: ProjectPluginStructure): Promise<ProjectPluginStructure>;
5
+ runAfter(structure: ProjectPluginStructure): Promise<ProjectPluginStructure>;
6
+ private resolvePropsAndStates;
7
+ private resolveFromStyles;
8
+ private imageResolver;
9
+ }
10
+ export declare const pluginImageResolution: ProjectPluginImageResolution;
11
+ export {};
@@ -0,0 +1,152 @@
1
+ "use strict";
2
+ var __assign = (this && this.__assign) || function () {
3
+ __assign = Object.assign || function(t) {
4
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
5
+ s = arguments[i];
6
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
7
+ t[p] = s[p];
8
+ }
9
+ return t;
10
+ };
11
+ return __assign.apply(this, arguments);
12
+ };
13
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
14
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
15
+ return new (P || (P = Promise))(function (resolve, reject) {
16
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
17
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
18
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
19
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
20
+ });
21
+ };
22
+ var __generator = (this && this.__generator) || function (thisArg, body) {
23
+ var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
24
+ return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
25
+ function verb(n) { return function (v) { return step([n, v]); }; }
26
+ function step(op) {
27
+ if (f) throw new TypeError("Generator is already executing.");
28
+ while (_) try {
29
+ if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
30
+ if (y = 0, t) op = [op[0] & 2, t.value];
31
+ switch (op[0]) {
32
+ case 0: case 1: t = op; break;
33
+ case 4: _.label++; return { value: op[1], done: false };
34
+ case 5: _.label++; y = op[1]; op = [0]; continue;
35
+ case 7: op = _.ops.pop(); _.trys.pop(); continue;
36
+ default:
37
+ if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
38
+ if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
39
+ if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
40
+ if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
41
+ if (t[2]) _.ops.pop();
42
+ _.trys.pop(); continue;
43
+ }
44
+ op = body.call(thisArg, _);
45
+ } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
46
+ if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
47
+ }
48
+ };
49
+ var __importDefault = (this && this.__importDefault) || function (mod) {
50
+ return (mod && mod.__esModule) ? mod : { "default": mod };
51
+ };
52
+ Object.defineProperty(exports, "__esModule", { value: true });
53
+ exports.pluginImageResolution = void 0;
54
+ var teleport_shared_1 = require("@teleporthq/teleport-shared");
55
+ var path_browserify_1 = __importDefault(require("path-browserify"));
56
+ var parse = path_browserify_1.default.parse, join = path_browserify_1.default.join, relative = path_browserify_1.default.relative, isAbsolute = path_browserify_1.default.isAbsolute;
57
+ var ProjectPluginImageResolution = /** @class */ (function () {
58
+ function ProjectPluginImageResolution() {
59
+ var _this = this;
60
+ this.resolvePropsAndStates = function (defs) {
61
+ Object.keys(defs || {}).forEach(function (propKey) {
62
+ var propValue = defs[propKey];
63
+ if (propValue.type === 'string' &&
64
+ typeof (propValue === null || propValue === void 0 ? void 0 : propValue.defaultValue) === 'string' &&
65
+ parse(propValue === null || propValue === void 0 ? void 0 : propValue.defaultValue).dir.startsWith('/')) {
66
+ defs[propKey] = __assign(__assign({}, defs[propKey]), { defaultValue: join(_this.relativePath, propValue.defaultValue) });
67
+ }
68
+ });
69
+ };
70
+ this.resolveFromStyles = function (style) {
71
+ var _a, _b;
72
+ if (((_a = style === null || style === void 0 ? void 0 : style.backgroundImage) === null || _a === void 0 ? void 0 : _a.type) === 'static' &&
73
+ typeof ((_b = style === null || style === void 0 ? void 0 : style.backgroundImage) === null || _b === void 0 ? void 0 : _b.content) === 'string') {
74
+ var bgImage = style.backgroundImage.content;
75
+ if (bgImage.includes('http')) {
76
+ return;
77
+ }
78
+ var regex = /(?:\(['"]?)(.*?)(?:['"]?\))/;
79
+ var matches = regex.exec(bgImage);
80
+ if (matches && (matches === null || matches === void 0 ? void 0 : matches.length) > 0 && isAbsolute(matches[1])) {
81
+ style.backgroundImage.content = "url(\"" + join(_this.relativePath, matches[1]) + "\")";
82
+ }
83
+ }
84
+ };
85
+ this.imageResolver = function (element) {
86
+ var _a, _b;
87
+ _this.resolveFromStyles((element === null || element === void 0 ? void 0 : element.style) || {});
88
+ Object.values((element === null || element === void 0 ? void 0 : element.referencedStyles) || {}).forEach(function (styleRef) {
89
+ if (styleRef.content.mapType === 'inlined') {
90
+ _this.resolveFromStyles(styleRef.content.styles);
91
+ }
92
+ });
93
+ if ((element === null || element === void 0 ? void 0 : element.elementType) === 'image' &&
94
+ ((_b = (_a = element.attrs) === null || _a === void 0 ? void 0 : _a.src) === null || _b === void 0 ? void 0 : _b.type) === 'static' &&
95
+ typeof element.attrs.src.content === 'string' &&
96
+ isAbsolute(element.attrs.src.content) &&
97
+ !element.attrs.src.content.startsWith('http')) {
98
+ element.attrs.src.content = join(_this.relativePath, element.attrs.src.content);
99
+ }
100
+ if (element.elementType === 'component') {
101
+ Object.keys((element === null || element === void 0 ? void 0 : element.attrs) || {}).forEach(function (attrKey) {
102
+ var attrValue = element === null || element === void 0 ? void 0 : element.attrs[attrKey];
103
+ if (attrValue.type === 'static' &&
104
+ typeof attrValue.content === 'string' &&
105
+ !attrValue.content.startsWith('http')) {
106
+ var resolvedPath = parse(attrValue.content);
107
+ if (resolvedPath.dir.startsWith('/')) {
108
+ element.attrs[attrKey].content = join(_this.relativePath, attrValue.content);
109
+ }
110
+ }
111
+ });
112
+ }
113
+ };
114
+ }
115
+ ProjectPluginImageResolution.prototype.runBefore = function (structure) {
116
+ var _a;
117
+ return __awaiter(this, void 0, void 0, function () {
118
+ var uidl, strategy, assetsPath, pagesPath;
119
+ var _this = this;
120
+ return __generator(this, function (_b) {
121
+ uidl = structure.uidl, strategy = structure.strategy;
122
+ assetsPath = join(strategy.id, strategy.static.path.join('/'));
123
+ pagesPath = join(strategy.id, strategy.pages.path.join('/'));
124
+ this.relativePath = relative(pagesPath, assetsPath);
125
+ teleport_shared_1.UIDLUtils.traverseElements(uidl.root.node, this.imageResolver);
126
+ Object.values(((_a = uidl === null || uidl === void 0 ? void 0 : uidl.root) === null || _a === void 0 ? void 0 : _a.styleSetDefinitions) || {}).forEach(function (styleSet) {
127
+ _this.resolveFromStyles(styleSet.content);
128
+ });
129
+ this.relativePath = relative(join(strategy.id, strategy.components.path.join('/')), assetsPath);
130
+ Object.values(uidl.components || {}).forEach(function (component) {
131
+ teleport_shared_1.UIDLUtils.traverseElements(component.node, _this.imageResolver);
132
+ Object.values((component === null || component === void 0 ? void 0 : component.styleSetDefinitions) || {}).forEach(function (styleSet) {
133
+ _this.resolveFromStyles(styleSet.content);
134
+ });
135
+ _this.resolvePropsAndStates(component.stateDefinitions);
136
+ _this.resolvePropsAndStates(component.propDefinitions);
137
+ });
138
+ return [2 /*return*/, structure];
139
+ });
140
+ });
141
+ };
142
+ ProjectPluginImageResolution.prototype.runAfter = function (structure) {
143
+ return __awaiter(this, void 0, void 0, function () {
144
+ return __generator(this, function (_a) {
145
+ return [2 /*return*/, structure];
146
+ });
147
+ });
148
+ };
149
+ return ProjectPluginImageResolution;
150
+ }());
151
+ exports.pluginImageResolution = new ProjectPluginImageResolution();
152
+ //# sourceMappingURL=plugin-image-resolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin-image-resolution.js","sourceRoot":"","sources":["../../src/plugin-image-resolution.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,+DAAuD;AACvD,oEAA0C;AASlC,IAAA,KAAK,GAAiC,yBAAY,MAA7C,EAAE,IAAI,GAA2B,yBAAY,KAAvC,EAAE,QAAQ,GAAiB,yBAAY,SAA7B,EAAE,UAAU,GAAK,yBAAY,WAAjB,CAAiB;AAE1D;IAAA;QAAA,iBAyGC;QAzES,0BAAqB,GAAG,UAC9B,IAA8E;YAE9E,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAC,OAAO;gBACtC,IAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,CAAA;gBAE/B,IACE,SAAS,CAAC,IAAI,KAAK,QAAQ;oBAC3B,OAAO,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,YAAY,CAAA,KAAK,QAAQ;oBAC3C,KAAK,CAAC,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,YAAsB,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAC5D;oBACA,IAAI,CAAC,OAAO,CAAC,yBACR,IAAI,CAAC,OAAO,CAAC,KAChB,YAAY,EAAE,IAAI,CAAC,KAAI,CAAC,YAAY,EAAE,SAAS,CAAC,YAAY,CAAC,GAC9D,CAAA;iBACF;YACH,CAAC,CAAC,CAAA;QACJ,CAAC,CAAA;QAEO,sBAAiB,GAAG,UAAC,KAA2B;;YACtD,IACE,CAAA,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,eAAe,0CAAE,IAAI,MAAK,QAAQ;gBACzC,OAAO,CAAA,MAAA,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,eAAe,0CAAE,OAAO,CAAA,KAAK,QAAQ,EACnD;gBACA,IAAM,OAAO,GAAG,KAAK,CAAC,eAAe,CAAC,OAAO,CAAA;gBAC7C,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE;oBAC5B,OAAM;iBACP;gBAED,IAAM,KAAK,GAAG,6BAA6B,CAAA;gBAC3C,IAAM,OAAO,GAAG,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBAEnC,IAAI,OAAO,IAAI,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,MAAM,IAAG,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;oBAC5D,KAAK,CAAC,eAAe,CAAC,OAAO,GAAG,WAAQ,IAAI,CAAC,KAAI,CAAC,YAAY,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,QAAI,CAAA;iBAChF;aACF;QACH,CAAC,CAAA;QAEO,kBAAa,GAAG,UAAC,OAAoB;;YAC3C,KAAI,CAAC,iBAAiB,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,KAAI,EAAE,CAAC,CAAA;YAE5C,MAAM,CAAC,MAAM,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,gBAAgB,KAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAC,QAAQ;gBAC9D,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO,KAAK,SAAS,EAAE;oBAC1C,KAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAA;iBAChD;YACH,CAAC,CAAC,CAAA;YAEF,IACE,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,WAAW,MAAK,OAAO;gBAChC,CAAA,MAAA,MAAA,OAAO,CAAC,KAAK,0CAAE,GAAG,0CAAE,IAAI,MAAK,QAAQ;gBACrC,OAAO,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,KAAK,QAAQ;gBAC7C,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC;gBACrC,CAAC,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EAC7C;gBACA,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,GAAG,IAAI,CAAC,KAAI,CAAC,YAAY,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;aAC/E;YAED,IAAI,OAAO,CAAC,WAAW,KAAK,WAAW,EAAE;gBACvC,MAAM,CAAC,IAAI,CAAC,CAAA,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,KAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAC,OAAO;oBAChD,IAAM,SAAS,GAAG,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,KAAK,CAAC,OAAO,CAAC,CAAA;oBACzC,IACE,SAAS,CAAC,IAAI,KAAK,QAAQ;wBAC3B,OAAO,SAAS,CAAC,OAAO,KAAK,QAAQ;wBACrC,CAAC,SAAS,CAAC,OAAO,CAAC,UAAU,CAAC,MAAM,CAAC,EACrC;wBACA,IAAM,YAAY,GAAG,KAAK,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;wBAC7C,IAAI,YAAY,CAAC,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE;4BACpC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,GAAG,IAAI,CAAC,KAAI,CAAC,YAAY,EAAE,SAAS,CAAC,OAAO,CAAC,CAAA;yBAC5E;qBACF;gBACH,CAAC,CAAC,CAAA;aACH;QACH,CAAC,CAAA;IACH,CAAC;IAtGO,gDAAS,GAAf,UAAgB,SAAiC;;;;;;gBACvC,IAAI,GAAe,SAAS,KAAxB,EAAE,QAAQ,GAAK,SAAS,SAAd,CAAc;gBAC9B,UAAU,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;gBAC9D,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAA;gBAClE,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,SAAS,EAAE,UAAU,CAAC,CAAA;gBAEnD,2BAAS,CAAC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,aAAa,CAAC,CAAA;gBAC9D,MAAM,CAAC,MAAM,CAAC,CAAA,MAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,0CAAE,mBAAmB,KAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAC,QAAQ;oBACpE,KAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;gBAC1C,CAAC,CAAC,CAAA;gBAEF,IAAI,CAAC,YAAY,GAAG,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,UAAU,CAAC,CAAA;gBAE/F,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAC,SAAS;oBACrD,2BAAS,CAAC,gBAAgB,CAAC,SAAS,CAAC,IAAI,EAAE,KAAI,CAAC,aAAa,CAAC,CAAA;oBAC9D,MAAM,CAAC,MAAM,CAAC,CAAA,SAAS,aAAT,SAAS,uBAAT,SAAS,CAAE,mBAAmB,KAAI,EAAE,CAAC,CAAC,OAAO,CAAC,UAAC,QAAQ;wBACnE,KAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAA;oBAC1C,CAAC,CAAC,CAAA;oBACF,KAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,gBAAgB,CAAC,CAAA;oBACtD,KAAI,CAAC,qBAAqB,CAAC,SAAS,CAAC,eAAe,CAAC,CAAA;gBACvD,CAAC,CAAC,CAAA;gBAEF,sBAAO,SAAS,EAAA;;;KACjB;IAEK,+CAAQ,GAAd,UAAe,SAAiC;;;gBAC9C,sBAAO,SAAS,EAAA;;;KACjB;IA2EH,mCAAC;AAAD,CAAC,AAzGD,IAyGC;AAEY,QAAA,qBAAqB,GAAG,IAAI,4BAA4B,EAAE,CAAA"}
@@ -5,7 +5,7 @@ exports.default = {
5
5
  files: [
6
6
  {
7
7
  name: 'package',
8
- content: "\n {\n \"name\": \"teleport-project-html\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"dependencies\": {\n \"parcel-bundler\": \"^1.6.1\"\n },\n \"scripts\": {\n \"start\": \"parcel index.html --open\",\n \"build\": \"parcel build index.html\"\n }\n }",
8
+ content: "\n {\n \"name\": \"teleport-project-html\",\n \"version\": \"1.0.0\",\n \"private\": true,\n \"dependencies\": {\n \"parcel-bundler\": \"^1.6.1\"\n },\n \"scripts\": {}\n }",
9
9
  fileType: 'json',
10
10
  },
11
11
  ],
@@ -1 +1 @@
1
- {"version":3,"file":"project-template.js","sourceRoot":"","sources":["../../src/project-template.ts"],"names":[],"mappings":";;AAAA,kBAAe;IACb,IAAI,EAAE,uBAAuB;IAC7B,KAAK,EAAE;QACL;YACE,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,iTAYX;YACE,QAAQ,EAAE,MAAM;SACjB;KACF;IACD,UAAU,EAAE,EAAE;CACf,CAAA"}
1
+ {"version":3,"file":"project-template.js","sourceRoot":"","sources":["../../src/project-template.ts"],"names":[],"mappings":";;AAAA,kBAAe;IACb,IAAI,EAAE,uBAAuB;IAC7B,KAAK,EAAE;QACL;YACE,IAAI,EAAE,SAAS;YACf,OAAO,EAAE,yMASX;YACE,QAAQ,EAAE,MAAM;SACjB;KACF;IACD,UAAU,EAAE,EAAE;CACf,CAAA"}