1
1
import { type Token , tokenize } from './tokenizer.js'
2
+ import { GLSL_KEYWORDS , WGSL_KEYWORDS } from './constants.js'
2
3
3
4
export type MangleMatcher = ( token : Token , index : number , tokens : Token [ ] ) => boolean
4
5
@@ -19,6 +20,9 @@ const isStorage = /* @__PURE__ */ RegExp.prototype.test.bind(
19
20
/ ^ ( b i n d i n g | g r o u p | l a y o u t | u n i f o r m | i n | o u t | a t t r i b u t e | v a r y i n g ) $ / ,
20
21
)
21
22
23
+ // Checks for WGSL-specific `fn foo(`, `var bar =`, `let baz =`, `const qux =`
24
+ const WGSL_REGEX = / \b f n \s + \w + \s * \( | \b ( v a r | l e t | c o n s t ) \s + \w + \s * [: = ] /
25
+
22
26
const NEWLINE_REGEX = / \\ \s + / gm
23
27
const DIRECTIVE_REGEX = / ( ^ \s * # [ ^ \\ ] * ?) ( \n | \/ [ \/ \* ] ) / gm
24
28
@@ -35,6 +39,8 @@ export function minify(
35
39
// Escape newlines after directives, skip comments
36
40
code = code . replace ( DIRECTIVE_REGEX , '$1\\$2' )
37
41
42
+ const KEYWORDS = WGSL_REGEX . test ( code ) ? WGSL_KEYWORDS : GLSL_KEYWORDS
43
+
38
44
const mangleCache = new Map ( )
39
45
const tokens : Token [ ] = tokenize ( code ) . filter ( ( token ) => token . type !== 'whitespace' && token . type !== 'comment' )
40
46
@@ -127,7 +133,7 @@ export function minify(
127
133
( tokens [ i - 1 ] ?. value === 'fn' && ( tokens [ i - 2 ] ?. value === ')' || tokens [ i - 3 ] ?. value === '@' ) )
128
134
const cache = isExternal ? mangleMap : mangleCache
129
135
130
- while ( ! renamed || cache . has ( renamed ) ) {
136
+ while ( ! renamed || cache . has ( renamed ) || KEYWORDS . includes ( renamed ) ) {
131
137
renamed = ''
132
138
mangleIndex ++
133
139
0 commit comments