Skip to content

Commit 1a1f8dc

Browse files
committed
testing progress
1 parent 86c8121 commit 1a1f8dc

File tree

6 files changed

+71
-26
lines changed

6 files changed

+71
-26
lines changed

src/index.ts

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import { devNameGeneratorContext, prodNameGeneratorContext } from "./nameGenerat
44

55
import { parse as sfcParse } from "@vue/compiler-sfc";
66
import { transformPug } from "./transformPug.js";
7+
import { transformHtml } from "./transformHtml.js";
78

89
// import type { Options as TPugOptions } from "pug";
910

@@ -68,25 +69,39 @@ function plugin({
6869
} = sfcParse(code);
6970

7071
//skip sfc if there's no module styles
71-
// @todo let styleModule = s.module;
72+
// @todo let styleModule: string | boolean = s.module;
7273
if (!styles.find(s => s.module)) {
7374
return;
7475
}
7576

7677
let localNameGenerator = (name: string) => nameGenerator(name, id, "");
7778

79+
// undefined means html as well
80+
template.lang ??= "html";
81+
82+
let transformedTemplate;
83+
7884
if (template.lang === "pug") {
79-
return transformPug(template.content, pugLocals, {
85+
transformedTemplate = transformPug(template.content, pugLocals, {
86+
preservePrefix,
87+
localNameGenerator,
88+
module: scriptTransform ? false : "$style",
89+
});
90+
} else if (template.lang === "html") {
91+
transformedTemplate = transformHtml(template.content, {
8092
preservePrefix,
8193
localNameGenerator,
8294
module: scriptTransform ? false : "$style",
8395
});
96+
} else {
97+
console.error(`Unsupported template language "${template.lang}"! Skipped`);
98+
return;
8499
}
85100

86-
return code;
101+
return code //
102+
.replace('lang="pug"', "") // pug transform returns html
103+
.replace(template.content, transformedTemplate);
87104
}
88-
89-
return null;
90105
},
91106
};
92107
// @todo satisfies Plugin;

src/transformHtml.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
import type { TLocalTransformOptions } from "./types";
22

3+
import { transformJsValue } from "./transformJsValue.js";
4+
5+
import { createRequire } from "module";
6+
const require = createRequire(import.meta.url);
7+
8+
// parse5 supports require
9+
310
export const transformHtml = (
411
source: string,
512
{ preservePrefix, localNameGenerator, module }: TLocalTransformOptions

src/transformPug.ts

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,9 @@ import type { Options as TPugOptions } from "pug";
22

33
import type { TLocalTransformOptions } from "./types";
44

5+
import { transformJsValue } from "./transformJsValue.js";
6+
57
import { createRequire } from "module";
6-
import { transformJsValue } from "./transformJsValue";
78
const require = createRequire(import.meta.url);
89

910
let pug: {
@@ -17,7 +18,7 @@ let pug: {
1718
const resolvePug = () => {
1819
pug = {
1920
lex: require("pug-lexer"),
20-
parse: require("pug-parse"),
21+
parse: require("pug-parser"),
2122
walk: require("pug-walk"),
2223
generate: require("pug-code-gen"),
2324
wrap: require("pug-runtime/wrap"),
@@ -46,7 +47,7 @@ export const transformPug = (
4647

4748
let ast = parse(lex(source));
4849

49-
ast = walk(ast, node => {
50+
walk(ast, node => {
5051
// if node has attributes
5152
if (node.attrs?.length) {
5253
// mutate class and id attributes
@@ -83,9 +84,12 @@ export const transformPug = (
8384

8485
value = transformJsValue(value, { preservePrefix, localNameGenerator, module });
8586

86-
// attr.val = "`" + value + "`";
87+
attr.val = "`" + value.replace(/`/g, "'") + "`";
8788
attr.val = value;
88-
// attr.mustEscape = false;
89+
90+
console.log(value);
91+
92+
attr.mustEscape = false;
8993
}
9094
break;
9195
}

test/index.js

Lines changed: 5 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,13 @@
1-
import generateCode from "pug-code-gen";
2-
import wrap from "pug-runtime/wrap.js";
3-
41
import { readFileSync, writeFileSync } from "fs";
52

6-
import { transform } from "../dist/transform3.js";
3+
import pluginFactory from "../dist/index.js";
74

8-
let preservePrefix = "--";
95
let nameGenerator = name => "TEST__" + name;
106

11-
let testVue = readFileSync("./test/test.vue").toString();
12-
13-
let ast = transform(testVue, { preservePrefix, nameGenerator });
7+
const plugin = pluginFactory({ nameGenerator });
148

15-
writeFileSync("./test/ast.json", JSON.stringify(ast, null, 4));
16-
17-
let funcStr = generateCode(ast, {});
18-
19-
let template = wrap(funcStr);
9+
let testVue = readFileSync("./test/test.vue").toString();
2010

21-
let htmlTemplateCode = template({});
11+
let result = plugin.transform(testVue, "test.vue");
2212

23-
writeFileSync("./test/result.html", htmlTemplateCode);
13+
writeFileSync("./test/result.vue", result);

test/result.vue

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<template ><div class="TEST__class0"> </div><div class="TEST__class0 TEST__class2"></div><div class="TEST__class3" id="TEST__id0">test</div><div :class='[{},{},"TEST__c","TEST__d",null]'></div><span :class="{}"></span><div></div><div :class="class4"></div><div :class="class5"></div><div :class="TEST__class7"></div><div :class="TEST__class11"></div><div>@todo This won't be processed</div><div class="escaped0"> </div><div id="escaped1"> </div><div :class="someRawVar"></div><div :id="someRawVar2"></div></template>
2+
3+
<script lang="ts">
4+
import { defineComponent } from "vue";
5+
6+
export default defineComponent({
7+
props: {
8+
9+
},
10+
async setup(props, { emit }) {
11+
alert('test!')
12+
return {}
13+
}
14+
})
15+
</script>
16+
17+
<style lang="less" module="a">
18+
.class0 {
19+
display: flex;
20+
}
21+
22+
.class2 {
23+
display: grid;
24+
}
25+
26+
.class1 {
27+
display: ruby;
28+
}
29+
</style>

test/test.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ span(:class=`{
99
'string-const':toggle2,
1010
"another-one" :toggle3
1111
}`)
12-
div(:class="class")
12+
div(:class="varClass")
1313
div(:class="'class4'")
1414
div(:class='"class5"')
1515
div(:class="v ? 'class6' : `class7`")

0 commit comments

Comments
 (0)