@fluffjs/cli 0.0.1
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/Cli.d.ts +37 -0
- package/Cli.js +596 -0
- package/CodeGenerator.d.ts +42 -0
- package/CodeGenerator.js +767 -0
- package/ComponentCompiler.d.ts +28 -0
- package/ComponentCompiler.js +354 -0
- package/ControlFlowParser.d.ts +55 -0
- package/ControlFlowParser.js +279 -0
- package/ExpressionTransformer.d.ts +30 -0
- package/ExpressionTransformer.js +276 -0
- package/Generator.d.ts +21 -0
- package/Generator.js +338 -0
- package/IndexHtmlTransformer.d.ts +9 -0
- package/IndexHtmlTransformer.js +97 -0
- package/TemplateParser.d.ts +27 -0
- package/TemplateParser.js +330 -0
- package/babel-plugin-class-transform.d.ts +20 -0
- package/babel-plugin-class-transform.js +40 -0
- package/babel-plugin-component.d.ts +14 -0
- package/babel-plugin-component.js +76 -0
- package/babel-plugin-imports.d.ts +13 -0
- package/babel-plugin-imports.js +76 -0
- package/babel-plugin-reactive.d.ts +22 -0
- package/babel-plugin-reactive.js +411 -0
- package/bin.d.ts +3 -0
- package/bin.js +10 -0
- package/fluff-esbuild-plugin.d.ts +8 -0
- package/fluff-esbuild-plugin.js +59 -0
- package/index.d.ts +7 -0
- package/index.js +4 -0
- package/package.json +39 -0
- package/types.d.ts +46 -0
- package/types.js +1 -0
package/Generator.js
ADDED
|
@@ -0,0 +1,338 @@
|
|
|
1
|
+
import * as fs from 'fs';
|
|
2
|
+
import * as path from 'path';
|
|
3
|
+
export class Generator {
|
|
4
|
+
generate(options) {
|
|
5
|
+
const { appName, outputDir } = options;
|
|
6
|
+
const kebabName = this.toKebabCase(appName);
|
|
7
|
+
const pascalName = this.toPascalCase(appName);
|
|
8
|
+
const titleName = this.toTitleCase(appName);
|
|
9
|
+
const appDir = path.join(outputDir, kebabName);
|
|
10
|
+
if (fs.existsSync(appDir)) {
|
|
11
|
+
throw new Error(`Directory '${kebabName}' already exists`);
|
|
12
|
+
}
|
|
13
|
+
console.log(`🧸 Creating new Fluff app: ${kebabName}`);
|
|
14
|
+
fs.mkdirSync(appDir, { recursive: true });
|
|
15
|
+
fs.mkdirSync(path.join(appDir, 'src', 'app'), { recursive: true });
|
|
16
|
+
this.writeFile(path.join(appDir, 'package.json'), this.getPackageJson(kebabName));
|
|
17
|
+
this.writeFile(path.join(appDir, 'tsconfig.json'), this.getTsConfig());
|
|
18
|
+
this.writeFile(path.join(appDir, 'fluff.json'), this.getFluffJson(kebabName));
|
|
19
|
+
this.writeFile(path.join(appDir, 'src', 'index.html'), this.getIndexHtml(kebabName, titleName));
|
|
20
|
+
this.writeFile(path.join(appDir, 'src', 'main.ts'), this.getMainTs(kebabName, pascalName));
|
|
21
|
+
this.writeFile(path.join(appDir, 'src', 'app', `${kebabName}.component.ts`), this.getComponentTs(kebabName, pascalName));
|
|
22
|
+
this.writeFile(path.join(appDir, 'src', 'app', `${kebabName}.component.html`), this.getComponentHtml());
|
|
23
|
+
this.writeFile(path.join(appDir, 'src', 'app', `${kebabName}.component.css`), this.getComponentCss());
|
|
24
|
+
console.log(' ✓ Created package.json');
|
|
25
|
+
console.log(' ✓ Created tsconfig.json');
|
|
26
|
+
console.log(' ✓ Created fluff.json');
|
|
27
|
+
console.log(' ✓ Created src/index.html');
|
|
28
|
+
console.log(' ✓ Created src/main.ts');
|
|
29
|
+
console.log(` ✓ Created src/app/${kebabName}.component.ts`);
|
|
30
|
+
console.log(` ✓ Created src/app/${kebabName}.component.html`);
|
|
31
|
+
console.log(` ✓ Created src/app/${kebabName}.component.css`);
|
|
32
|
+
console.log('');
|
|
33
|
+
console.log('✅ App created successfully!');
|
|
34
|
+
console.log('');
|
|
35
|
+
console.log('Next steps:');
|
|
36
|
+
console.log(` cd ${kebabName}`);
|
|
37
|
+
console.log(' npm install');
|
|
38
|
+
console.log(' npx @fluffjs/cli serve');
|
|
39
|
+
}
|
|
40
|
+
writeFile(filePath, content) {
|
|
41
|
+
if (fs.existsSync(filePath)) {
|
|
42
|
+
throw new Error(`File already exists: ${filePath}`);
|
|
43
|
+
}
|
|
44
|
+
fs.writeFileSync(filePath, content);
|
|
45
|
+
}
|
|
46
|
+
toKebabCase(str) {
|
|
47
|
+
return str
|
|
48
|
+
.replace(/([a-z])([A-Z])/g, '$1-$2')
|
|
49
|
+
.replace(/[\s_]+/g, '-')
|
|
50
|
+
.toLowerCase();
|
|
51
|
+
}
|
|
52
|
+
toPascalCase(str) {
|
|
53
|
+
return str
|
|
54
|
+
.split(/[-_\s]+/)
|
|
55
|
+
.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
56
|
+
.join('');
|
|
57
|
+
}
|
|
58
|
+
toTitleCase(str) {
|
|
59
|
+
return str
|
|
60
|
+
.split(/[-_\s]+/)
|
|
61
|
+
.map(word => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
|
|
62
|
+
.join(' ');
|
|
63
|
+
}
|
|
64
|
+
getPackageJson(name) {
|
|
65
|
+
return JSON.stringify({
|
|
66
|
+
name,
|
|
67
|
+
version: '0.0.1',
|
|
68
|
+
private: true,
|
|
69
|
+
type: 'module',
|
|
70
|
+
scripts: {
|
|
71
|
+
build: 'npx @fluffjs/cli build',
|
|
72
|
+
serve: 'npx @fluffjs/cli serve'
|
|
73
|
+
},
|
|
74
|
+
dependencies: {
|
|
75
|
+
'@fluffjs/fluff': '^1.0.0'
|
|
76
|
+
},
|
|
77
|
+
devDependencies: {
|
|
78
|
+
'@fluffjs/cli': '^1.0.0',
|
|
79
|
+
typescript: '^5.0.0'
|
|
80
|
+
}
|
|
81
|
+
}, null, 2) + '\n';
|
|
82
|
+
}
|
|
83
|
+
getTsConfig() {
|
|
84
|
+
return JSON.stringify({
|
|
85
|
+
compilerOptions: {
|
|
86
|
+
target: 'ES2022',
|
|
87
|
+
module: 'ES2022',
|
|
88
|
+
moduleResolution: 'bundler',
|
|
89
|
+
experimentalDecorators: true,
|
|
90
|
+
strict: true,
|
|
91
|
+
esModuleInterop: true,
|
|
92
|
+
skipLibCheck: true,
|
|
93
|
+
outDir: './dist',
|
|
94
|
+
rootDir: './src',
|
|
95
|
+
lib: ['ES2022', 'DOM', 'DOM.Iterable']
|
|
96
|
+
},
|
|
97
|
+
include: ['src/**/*.ts'],
|
|
98
|
+
exclude: ['node_modules', 'dist']
|
|
99
|
+
}, null, 2) + '\n';
|
|
100
|
+
}
|
|
101
|
+
getFluffJson(name) {
|
|
102
|
+
return JSON.stringify({
|
|
103
|
+
version: '1.0',
|
|
104
|
+
targets: {
|
|
105
|
+
app: {
|
|
106
|
+
name,
|
|
107
|
+
srcDir: 'src',
|
|
108
|
+
outDir: 'dist',
|
|
109
|
+
entryPoint: 'main.ts',
|
|
110
|
+
indexHtml: 'index.html',
|
|
111
|
+
components: ['**/*.component.ts'],
|
|
112
|
+
assets: [],
|
|
113
|
+
bundle: {
|
|
114
|
+
minify: true,
|
|
115
|
+
gzip: false,
|
|
116
|
+
target: 'es2022'
|
|
117
|
+
},
|
|
118
|
+
serve: {
|
|
119
|
+
port: 3000,
|
|
120
|
+
host: 'localhost'
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
},
|
|
124
|
+
defaultTarget: 'app'
|
|
125
|
+
}, null, 2) + '\n';
|
|
126
|
+
}
|
|
127
|
+
getIndexHtml(kebabName, titleName) {
|
|
128
|
+
return `<!DOCTYPE html>
|
|
129
|
+
<html lang="en">
|
|
130
|
+
<head>
|
|
131
|
+
<meta charset="UTF-8">
|
|
132
|
+
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
133
|
+
<title>${titleName} - Fluff.js</title>
|
|
134
|
+
<style>
|
|
135
|
+
* {
|
|
136
|
+
margin: 0;
|
|
137
|
+
padding: 0;
|
|
138
|
+
box-sizing: border-box;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
body {
|
|
142
|
+
min-height: 100vh;
|
|
143
|
+
}
|
|
144
|
+
</style>
|
|
145
|
+
</head>
|
|
146
|
+
<body>
|
|
147
|
+
<${kebabName}></${kebabName}>
|
|
148
|
+
<script type="module" src="./main.js"></script>
|
|
149
|
+
</body>
|
|
150
|
+
</html>
|
|
151
|
+
`;
|
|
152
|
+
}
|
|
153
|
+
getMainTs(kebabName, pascalName) {
|
|
154
|
+
return `import { ${pascalName}Component } from './app/${kebabName}.component.js';
|
|
155
|
+
|
|
156
|
+
customElements.define('${kebabName}', ${pascalName}Component);
|
|
157
|
+
`;
|
|
158
|
+
}
|
|
159
|
+
getComponentTs(kebabName, pascalName) {
|
|
160
|
+
return `import { Component, Reactive } from '@fluffjs/fluff';
|
|
161
|
+
|
|
162
|
+
@Component({
|
|
163
|
+
selector: '${kebabName}',
|
|
164
|
+
templateUrl: './${kebabName}.component.html',
|
|
165
|
+
styleUrl: './${kebabName}.component.css'
|
|
166
|
+
})
|
|
167
|
+
export class ${pascalName}Component extends HTMLElement
|
|
168
|
+
{
|
|
169
|
+
@Reactive() public name = 'World';
|
|
170
|
+
@Reactive() public count = 0;
|
|
171
|
+
|
|
172
|
+
public increment(): void
|
|
173
|
+
{
|
|
174
|
+
this.count++;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
`;
|
|
178
|
+
}
|
|
179
|
+
getComponentHtml() {
|
|
180
|
+
return `<div class="container">
|
|
181
|
+
<div class="card">
|
|
182
|
+
<div class="logo">🧸</div>
|
|
183
|
+
<h1>Hello, <span class="highlight">{{ name }}</span>!</h1>
|
|
184
|
+
<p class="tagline">Welcome to Fluff.js</p>
|
|
185
|
+
|
|
186
|
+
<div class="input-group">
|
|
187
|
+
<label for="name-input">What's your name?</label>
|
|
188
|
+
<input
|
|
189
|
+
id="name-input"
|
|
190
|
+
type="text"
|
|
191
|
+
[value]="name"
|
|
192
|
+
(input)="name = $event.target.value"
|
|
193
|
+
placeholder="Enter your name..."
|
|
194
|
+
/>
|
|
195
|
+
</div>
|
|
196
|
+
|
|
197
|
+
<div class="counter-section">
|
|
198
|
+
<p>You've clicked <strong>{{ count }}</strong> times</p>
|
|
199
|
+
<button class="btn" (click)="increment()">Click me! 🎉</button>
|
|
200
|
+
</div>
|
|
201
|
+
|
|
202
|
+
<footer>
|
|
203
|
+
<p>Built with Fluff.js — <em>"Just the good stuff"</em></p>
|
|
204
|
+
</footer>
|
|
205
|
+
</div>
|
|
206
|
+
</div>
|
|
207
|
+
`;
|
|
208
|
+
}
|
|
209
|
+
getComponentCss() {
|
|
210
|
+
return `:host {
|
|
211
|
+
display: block;
|
|
212
|
+
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, sans-serif;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
.container {
|
|
216
|
+
min-height: 100vh;
|
|
217
|
+
display: flex;
|
|
218
|
+
align-items: center;
|
|
219
|
+
justify-content: center;
|
|
220
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
221
|
+
padding: 20px;
|
|
222
|
+
box-sizing: border-box;
|
|
223
|
+
}
|
|
224
|
+
|
|
225
|
+
.card {
|
|
226
|
+
background: white;
|
|
227
|
+
border-radius: 20px;
|
|
228
|
+
padding: 40px 50px;
|
|
229
|
+
box-shadow: 0 25px 50px -12px rgba(0, 0, 0, 0.25);
|
|
230
|
+
text-align: center;
|
|
231
|
+
max-width: 450px;
|
|
232
|
+
width: 100%;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
.logo {
|
|
236
|
+
font-size: 4rem;
|
|
237
|
+
margin-bottom: 10px;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
h1 {
|
|
241
|
+
margin: 0 0 8px 0;
|
|
242
|
+
font-size: 2rem;
|
|
243
|
+
color: #1a1a2e;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.highlight {
|
|
247
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
248
|
+
-webkit-background-clip: text;
|
|
249
|
+
-webkit-text-fill-color: transparent;
|
|
250
|
+
background-clip: text;
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
.tagline {
|
|
254
|
+
color: #666;
|
|
255
|
+
margin: 0 0 30px 0;
|
|
256
|
+
font-size: 1.1rem;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
.input-group {
|
|
260
|
+
margin-bottom: 30px;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
.input-group label {
|
|
264
|
+
display: block;
|
|
265
|
+
margin-bottom: 8px;
|
|
266
|
+
color: #444;
|
|
267
|
+
font-weight: 500;
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
.input-group input {
|
|
271
|
+
width: 100%;
|
|
272
|
+
padding: 12px 16px;
|
|
273
|
+
font-size: 1rem;
|
|
274
|
+
border: 2px solid #e0e0e0;
|
|
275
|
+
border-radius: 10px;
|
|
276
|
+
outline: none;
|
|
277
|
+
transition: border-color 0.2s, box-shadow 0.2s;
|
|
278
|
+
box-sizing: border-box;
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
.input-group input:focus {
|
|
282
|
+
border-color: #667eea;
|
|
283
|
+
box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.2);
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
.counter-section {
|
|
287
|
+
background: #f8f9fa;
|
|
288
|
+
border-radius: 12px;
|
|
289
|
+
padding: 20px;
|
|
290
|
+
margin-bottom: 30px;
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
.counter-section p {
|
|
294
|
+
margin: 0 0 15px 0;
|
|
295
|
+
color: #444;
|
|
296
|
+
}
|
|
297
|
+
|
|
298
|
+
.counter-section strong {
|
|
299
|
+
color: #667eea;
|
|
300
|
+
font-size: 1.2em;
|
|
301
|
+
}
|
|
302
|
+
|
|
303
|
+
.btn {
|
|
304
|
+
background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
|
|
305
|
+
color: white;
|
|
306
|
+
border: none;
|
|
307
|
+
padding: 12px 30px;
|
|
308
|
+
font-size: 1rem;
|
|
309
|
+
font-weight: 600;
|
|
310
|
+
border-radius: 10px;
|
|
311
|
+
cursor: pointer;
|
|
312
|
+
transition: transform 0.2s, box-shadow 0.2s;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
.btn:hover {
|
|
316
|
+
transform: translateY(-2px);
|
|
317
|
+
box-shadow: 0 10px 20px rgba(102, 126, 234, 0.3);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
.btn:active {
|
|
321
|
+
transform: translateY(0);
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
footer {
|
|
325
|
+
color: #999;
|
|
326
|
+
font-size: 0.9rem;
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
footer p {
|
|
330
|
+
margin: 0;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
footer em {
|
|
334
|
+
color: #764ba2;
|
|
335
|
+
}
|
|
336
|
+
`;
|
|
337
|
+
}
|
|
338
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface TransformOptions {
|
|
2
|
+
jsBundle: string;
|
|
3
|
+
cssBundle?: string;
|
|
4
|
+
gzip?: boolean;
|
|
5
|
+
minify?: boolean;
|
|
6
|
+
liveReload?: boolean;
|
|
7
|
+
}
|
|
8
|
+
export declare function transformIndexHtml(html: string, options: TransformOptions): Promise<string>;
|
|
9
|
+
//# sourceMappingURL=IndexHtmlTransformer.d.ts.map
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { minify } from 'html-minifier-terser';
|
|
2
|
+
import * as parse5 from 'parse5';
|
|
3
|
+
import { html as parse5Html } from 'parse5';
|
|
4
|
+
export async function transformIndexHtml(html, options) {
|
|
5
|
+
const doc = parse5.parse(html);
|
|
6
|
+
const jsSrc = options.gzip ? `${options.jsBundle}.gz` : options.jsBundle;
|
|
7
|
+
const cssSrc = options.cssBundle
|
|
8
|
+
? (options.gzip ? `${options.cssBundle}.gz` : options.cssBundle)
|
|
9
|
+
: null;
|
|
10
|
+
const head = findElement(doc, 'head');
|
|
11
|
+
const body = findElement(doc, 'body');
|
|
12
|
+
if (head && cssSrc) {
|
|
13
|
+
appendChild(head, createLinkElement(cssSrc));
|
|
14
|
+
}
|
|
15
|
+
if (body) {
|
|
16
|
+
appendChild(body, createScriptElement(jsSrc));
|
|
17
|
+
}
|
|
18
|
+
let result = parse5.serialize(doc);
|
|
19
|
+
if (options.liveReload) {
|
|
20
|
+
result = result.replace('</body>', getLiveReloadScript() + '</body>');
|
|
21
|
+
}
|
|
22
|
+
if (options.minify) {
|
|
23
|
+
result = await minify(result, {
|
|
24
|
+
collapseWhitespace: true,
|
|
25
|
+
removeComments: true,
|
|
26
|
+
removeRedundantAttributes: true,
|
|
27
|
+
removeEmptyAttributes: true,
|
|
28
|
+
minifyCSS: true,
|
|
29
|
+
minifyJS: true
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
return result;
|
|
33
|
+
}
|
|
34
|
+
function findElement(node, tagName) {
|
|
35
|
+
if (isElement(node) && node.tagName === tagName) {
|
|
36
|
+
return node;
|
|
37
|
+
}
|
|
38
|
+
if ('childNodes' in node) {
|
|
39
|
+
for (const child of node.childNodes) {
|
|
40
|
+
const found = findElement(child, tagName);
|
|
41
|
+
if (found)
|
|
42
|
+
return found;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return null;
|
|
46
|
+
}
|
|
47
|
+
function isElement(node) {
|
|
48
|
+
return 'tagName' in node;
|
|
49
|
+
}
|
|
50
|
+
function appendChild(parent, child) {
|
|
51
|
+
child.parentNode = parent;
|
|
52
|
+
parent.childNodes.push(child);
|
|
53
|
+
}
|
|
54
|
+
function createLinkElement(href) {
|
|
55
|
+
return {
|
|
56
|
+
nodeName: 'link',
|
|
57
|
+
tagName: 'link',
|
|
58
|
+
attrs: [
|
|
59
|
+
{ name: 'rel', value: 'stylesheet' },
|
|
60
|
+
{ name: 'href', value: href }
|
|
61
|
+
],
|
|
62
|
+
childNodes: [],
|
|
63
|
+
namespaceURI: parse5Html.NS.HTML,
|
|
64
|
+
parentNode: null
|
|
65
|
+
};
|
|
66
|
+
}
|
|
67
|
+
function createScriptElement(src) {
|
|
68
|
+
return {
|
|
69
|
+
nodeName: 'script',
|
|
70
|
+
tagName: 'script',
|
|
71
|
+
attrs: [
|
|
72
|
+
{ name: 'type', value: 'module' },
|
|
73
|
+
{ name: 'src', value: src }
|
|
74
|
+
],
|
|
75
|
+
childNodes: [],
|
|
76
|
+
namespaceURI: parse5Html.NS.HTML,
|
|
77
|
+
parentNode: null
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
function getLiveReloadScript() {
|
|
81
|
+
return `<script>new EventSource('/esbuild').addEventListener('change', e => {
|
|
82
|
+
const { added, removed, updated } = JSON.parse(e.data);
|
|
83
|
+
if (!added.length && !removed.length && updated.length === 1) {
|
|
84
|
+
for (const link of document.getElementsByTagName("link")) {
|
|
85
|
+
const url = new URL(link.href);
|
|
86
|
+
if (url.host === location.host && url.pathname === updated[0]) {
|
|
87
|
+
const next = link.cloneNode();
|
|
88
|
+
next.href = updated[0] + '?' + Math.random().toString(36).slice(2);
|
|
89
|
+
next.onload = () => link.remove();
|
|
90
|
+
link.parentNode.insertBefore(next, link.nextSibling);
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
location.reload();
|
|
96
|
+
});</script>`;
|
|
97
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ParsedTemplate } from './types.js';
|
|
2
|
+
export declare class TemplateParser {
|
|
3
|
+
private bindingId;
|
|
4
|
+
private bindings;
|
|
5
|
+
private controlFlows;
|
|
6
|
+
private readonly controlFlowParser;
|
|
7
|
+
private templateRefs;
|
|
8
|
+
parse(html: string): ParsedTemplate;
|
|
9
|
+
private processControlFlowBlocks;
|
|
10
|
+
private processSwitchBlocksNew;
|
|
11
|
+
private processForBlocksNew;
|
|
12
|
+
private processIfBlocksNew;
|
|
13
|
+
private processWithParse5;
|
|
14
|
+
private walkNodes;
|
|
15
|
+
private isTextNode;
|
|
16
|
+
private processTextNode;
|
|
17
|
+
private createTextNode;
|
|
18
|
+
private createSpanElement;
|
|
19
|
+
private isElement;
|
|
20
|
+
private getOriginalAttrName;
|
|
21
|
+
private processElement;
|
|
22
|
+
private processControlFlowContent;
|
|
23
|
+
private walkControlFlowNodes;
|
|
24
|
+
private processControlFlowElement;
|
|
25
|
+
private createSpanWithTextBind;
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=TemplateParser.d.ts.map
|