Skip to content

Commit 253cf48

Browse files
committed
feat: use vue-sfc-transformer/mkdist as vue transformer
1 parent 574b782 commit 253cf48

File tree

4 files changed

+76
-12
lines changed

4 files changed

+76
-12
lines changed

src/builders/transformers/index.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,18 @@ import { consola } from "consola";
22
import { oxcTransformer, type OxcTransformerOptions } from "./oxc.ts";
33
import type { BuildContext } from "../../types.ts";
44
import type { ResolveOptions } from "exsolve";
5+
import { vueTransformer } from "./vue.ts";
56

67
type MaybePromise<T> = T | Promise<T>;
78

89
const transformers: Record<TransformerName, Transformer> = {
910
oxc: oxcTransformer,
11+
vue: vueTransformer,
1012
};
1113

12-
const defaultTransformers: Transformer[] = [oxcTransformer];
14+
const defaultTransformers: Transformer[] = [oxcTransformer, vueTransformer];
1315

14-
export type TransformerName = "oxc" | (string & {});
16+
export type TransformerName = "oxc" | "vue" | (string & {});
1517

1618
export interface TransformerOptions extends OxcTransformerOptions {
1719
build: BuildContext;
@@ -24,6 +26,12 @@ export interface CreateTransformerOptions extends TransformerOptions {
2426

2527
export interface TransformerContext {
2628
transformFile: TransformFile;
29+
/**
30+
* For compatibility with `mkdist` loaders
31+
*
32+
* @deprecated Use `transformFile()` instead
33+
*/
34+
loadFile: TransformFile;
2735
options: TransformerOptions;
2836
}
2937

@@ -88,6 +96,7 @@ export function resolveTransformers(
8896

8997
export function createTransformer(options: CreateTransformerOptions): {
9098
transformFile: TransformFile;
99+
loadFile: TransformFile;
91100
} {
92101
const transformers = resolveTransformers([
93102
// Provided transformers have higher priority
@@ -100,6 +109,7 @@ export function createTransformer(options: CreateTransformerOptions): {
100109
): Promise<OutputFile[]> {
101110
const context: TransformerContext = {
102111
transformFile,
112+
loadFile: transformFile,
103113
options,
104114
};
105115

@@ -122,5 +132,6 @@ export function createTransformer(options: CreateTransformerOptions): {
122132

123133
return {
124134
transformFile,
135+
loadFile: transformFile,
125136
};
126137
}

src/builders/transformers/vue.ts

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import consola from "consola";
2+
import type { InputFile, Transformer, TransformerContext } from "./index.ts";
3+
4+
let cachedVueTransformer: Transformer | undefined;
5+
6+
export const vueTransformer: Transformer = async (
7+
file: InputFile,
8+
ctx: TransformerContext,
9+
) => {
10+
if (!cachedVueTransformer) {
11+
cachedVueTransformer = await import("vue-sfc-transformer/mkdist").then(
12+
(r) => r.vueLoader,
13+
(error) => {
14+
consola.error(
15+
`Failed to transform "${file.path}" because vue-sfc-transformer is not installed.`,
16+
);
17+
18+
throw error;
19+
},
20+
);
21+
}
22+
return cachedVueTransformer!(file, ctx);
23+
};
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<template>
2+
<div :data-test="toValue('hello')" />
3+
</template>
4+
5+
<script>
6+
export default { name: "App" };
7+
</script>
8+
9+
<script setup lang="ts">
10+
import { toValue, ref, type Ref } from "vue";
11+
defineProps<{ msg: string }>();
12+
const msg: Ref<number> = ref(1);
13+
</script>
14+
15+
<style scoped>
16+
#main {
17+
.foo {
18+
color: --var-red;
19+
}
20+
}
21+
</style>

test/obuild.test.ts

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,11 @@ describe("obuild", () => {
2727
},
2828
},
2929
"src/utils.ts",
30+
{
31+
type: "transform",
32+
input: "src/vue",
33+
outDir: "dist/vue",
34+
},
3035
],
3136
});
3237
});
@@ -42,24 +47,28 @@ describe("obuild", () => {
4247
"index.d.mts",
4348
"index.mjs",
4449
"runtime",
50+
"runtime/components",
51+
"runtime/components/jsx-component.jsx",
52+
"runtime/components/jsx-component.jsx.map",
53+
"runtime/components/tsx-component.d.mts",
54+
"runtime/components/tsx-component.jsx",
55+
"runtime/components/tsx-component.jsx.map",
4556
"runtime/index.d.mts",
4657
"runtime/index.mjs",
4758
"runtime/index.mjs.map",
48-
"runtime/js-module.mjs",
49-
"runtime/js-module.mjs.map",
50-
"runtime/jsx-component.jsx",
51-
"runtime/jsx-component.jsx.map",
59+
"runtime/modules",
60+
"runtime/modules/js-module.mjs",
61+
"runtime/modules/js-module.mjs.map",
62+
"runtime/modules/ts-module.d.mts",
63+
"runtime/modules/ts-module.mjs",
64+
"runtime/modules/ts-module.mjs.map",
5265
"runtime/test.d.mts",
5366
"runtime/test.mjs",
5467
"runtime/test.mjs.map",
55-
"runtime/ts-module.d.mts",
56-
"runtime/ts-module.mjs",
57-
"runtime/ts-module.mjs.map",
58-
"runtime/tsx-component.d.mts",
59-
"runtime/tsx-component.jsx",
60-
"runtime/tsx-component.jsx.map",
6168
"utils.d.mts",
6269
"utils.mjs",
70+
"vue",
71+
"vue/TestComponent.vue",
6372
]
6473
`);
6574
});

0 commit comments

Comments
 (0)