-
Notifications
You must be signed in to change notification settings - Fork 3
/
compiler.ts
108 lines (100 loc) · 2.74 KB
/
compiler.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import { type Plugin } from 'vite';
import { Preprocessor } from 'content-tag';
import { transform } from './test';
// import { MAIN_IMPORT } from './symbols';
import { type Flags, defaultFlags } from './flags.ts';
import { HMR, fixExportsForHMR, shouldHotReloadFile } from './hmr.ts';
export { stripGXTDebug } from './babel.ts';
const p = new Preprocessor();
function fixContentTagOutput(code: string): string {
return code.split('static{').join('$static() {');
}
const extensionsToResolve = [
'.mjs',
'.js',
'.mts',
'.ts',
'.jsx',
'.tsx',
'.json',
'.gts',
'.gjs',
];
const templateFileRegex = /\.(gts|gjs)$/;
const scriptFileRegex = /\.(ts|js)$/;
type Options = {
authorMode?: boolean;
disableHMR?: boolean;
flags?: Partial<Flags>;
};
export function compiler(mode: string, options: Options = {}): Plugin {
let isLibBuild = false;
let flags = defaultFlags();
return {
enforce: 'pre',
name: 'glimmer-next',
config(config, mode) {
if (options.authorMode === true) {
isLibBuild = config.build?.lib !== undefined;
}
flags = { ...flags, ...(options.flags ?? {}) };
let defineValues: Record<string, boolean> = flags;
if (!isLibBuild) {
defineValues['IS_DEV_MODE'] = mode.mode === 'development';
} else {
defineValues = {};
}
defineValues['process.env.BABEL_TYPES_8_BREAKING'] = false;
return {
define: defineValues,
resolve: {
extensions: extensionsToResolve,
},
};
},
transform(code: string, file: string) {
if (templateFileRegex.test(file)) {
const intermediate = fixContentTagOutput(p.process(code, file));
if (mode === 'development') {
const shouldHotRelaod = options.disableHMR
? false
: shouldHotReloadFile(file);
return transform(
fixExportsForHMR(intermediate) + (shouldHotRelaod ? HMR : ''),
file,
mode as 'development' | 'production',
isLibBuild,
flags,
);
} else {
return transform(
intermediate,
file,
mode as 'development' | 'production',
isLibBuild,
flags,
);
}
}
// if (!code.includes(MAIN_IMPORT)) {
// return;
// }
let result: string | undefined = undefined;
if (scriptFileRegex.test(file)) {
const source = code;
// if (code.includes('precompileTemplate')) {
// console.log(code);
// }
const result = transform(
source,
file,
mode as 'development' | 'production',
false,
flags,
);
return result;
}
return result;
},
};
}