diff --git a/src/__tests__/baselines/minification-only/issue40.ts.baseline b/src/__tests__/baselines/minification-only/issue40.ts.baseline new file mode 100644 index 0000000..200e58b --- /dev/null +++ b/src/__tests__/baselines/minification-only/issue40.ts.baseline @@ -0,0 +1,26 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`issue40.ts 1`] = ` + +File: issue40.ts +Source code: + + declare const styled: any; + + styled.div\`padding: 0 0 13px \${'50px'};\` + + +TypeScript before transform: + + declare const styled: any; + styled.div \`padding: 0 0 13px \${"50px"};\`; + + +TypeScript after transform: + + declare const styled: any; + styled.div \`padding:0 0 13px \${'50px'};\`; + + + +`; diff --git a/src/__tests__/baselines/minification-only/simple.ts.baseline b/src/__tests__/baselines/minification-only/simple.ts.baseline index 667a159..697b38a 100644 --- a/src/__tests__/baselines/minification-only/simple.ts.baseline +++ b/src/__tests__/baselines/minification-only/simple.ts.baseline @@ -164,7 +164,7 @@ TypeScript after transform: styled.div \`this is a test\`; // returns the indices of removed placeholders (expressions) // \`this is some input with \${placeholder1} and //\${placeholder2}\` - styled.div \`this is some input with\${placeholder1} and//\${placeholder2}\`; + styled.div \`this is some input with \${placeholder1} and//\${placeholder2}\`; // works with raw escape codes // \`this\\\\nis\\\\na \\\\ntest\` styled.div \`this\\\\nis\\\\na \\\\ntest\`; diff --git a/src/__tests__/baselines/minification/issue40.ts.baseline b/src/__tests__/baselines/minification/issue40.ts.baseline new file mode 100644 index 0000000..200e58b --- /dev/null +++ b/src/__tests__/baselines/minification/issue40.ts.baseline @@ -0,0 +1,26 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`issue40.ts 1`] = ` + +File: issue40.ts +Source code: + + declare const styled: any; + + styled.div\`padding: 0 0 13px \${'50px'};\` + + +TypeScript before transform: + + declare const styled: any; + styled.div \`padding: 0 0 13px \${"50px"};\`; + + +TypeScript after transform: + + declare const styled: any; + styled.div \`padding:0 0 13px \${'50px'};\`; + + + +`; diff --git a/src/__tests__/baselines/minification/simple.ts.baseline b/src/__tests__/baselines/minification/simple.ts.baseline index 667a159..697b38a 100644 --- a/src/__tests__/baselines/minification/simple.ts.baseline +++ b/src/__tests__/baselines/minification/simple.ts.baseline @@ -164,7 +164,7 @@ TypeScript after transform: styled.div \`this is a test\`; // returns the indices of removed placeholders (expressions) // \`this is some input with \${placeholder1} and //\${placeholder2}\` - styled.div \`this is some input with\${placeholder1} and//\${placeholder2}\`; + styled.div \`this is some input with \${placeholder1} and//\${placeholder2}\`; // works with raw escape codes // \`this\\\\nis\\\\na \\\\ntest\` styled.div \`this\\\\nis\\\\na \\\\ntest\`; diff --git a/src/__tests__/fixtures/minification/issue40.ts b/src/__tests__/fixtures/minification/issue40.ts new file mode 100644 index 0000000..f2a322e --- /dev/null +++ b/src/__tests__/fixtures/minification/issue40.ts @@ -0,0 +1,3 @@ +declare const styled: any; + +styled.div`padding: 0 0 13px ${'50px'};` diff --git a/src/__tests__/minify.test.ts b/src/__tests__/minify.test.ts new file mode 100644 index 0000000..611b41b --- /dev/null +++ b/src/__tests__/minify.test.ts @@ -0,0 +1,12 @@ +import { createMinifier } from '../minify'; + +it.skip('debug', () => { + const minifer = createMinifier(); + + move(' w: '); + move(';\n '); + + function move(next: string, last?: boolean) { + console.log({ move: { next, last }, result: minifer(next, last) }); + } +}); diff --git a/src/minify.ts b/src/minify.ts index b7ea956..e862d27 100644 --- a/src/minify.ts +++ b/src/minify.ts @@ -32,7 +32,7 @@ const stateMachine: StateMachine = { if (ch == '\'' || ch == '"' || ch == '(') return { state: ch } if (ch == ' ' || ch == '\n' || ch == '\r') return { skipEmit: true, state: ' ' } // we may need a space if (ch == '/') return { state: '/', skipEmit: true } - if (isSymbol(ch)) return; + if (isSymbol(ch)) return { state: ';' }; return { state: 'x' } } }, @@ -51,6 +51,9 @@ const stateMachine: StateMachine = { if (ch == '/') return { state: '/', skipEmit: true } if (isSymbol(ch)) return { state: ';' }; return { state: 'x', emit: ' ' + ch }; + }, + flush(last) { + if (!last) return { emit: ' ' }; } }, '\n': { // may need new line @@ -170,7 +173,7 @@ const stateMachine: StateMachine = { } }; -function createMinifier(): (next: string, last?: boolean) => string { +export function createMinifier(): (next: string, last?: boolean) => string { let state: State = ';'; return (next, last = false) => { @@ -195,11 +198,17 @@ function createMinifier(): (next: string, last?: boolean) => string { while (pos < len) { const ch = next[pos++]; const reducer = stateMachine[state]; - apply(reducer.next && reducer.next(ch), ch) + const prevState = state; + const reducerResult = reducer.next && reducer.next(ch); + apply(reducerResult, ch) + //console.log('next(', { ch, state: prevState }, '): ', reducerResult, ' -> ', { state, minified }); } const reducer = stateMachine[state]; - apply(reducer.flush && reducer.flush(last)); + const prevState = state; + const reducerResult = reducer.flush && reducer.flush(last); + apply(reducerResult); + //console.log('flush', { state: prevState }, '): ', reducerResult, ' -> ', { state, minified }); return minified; }