From aff479683471b9ce1ef9c5089bc32cabe3ec7bff Mon Sep 17 00:00:00 2001 From: Igor Oleinikov Date: Tue, 26 Mar 2019 09:44:57 -0700 Subject: [PATCH 1/4] Add repro test cases --- .../issue36-extended.ts.baseline | 28 ++++++++++++ .../minification-only/issue36.tsx.baseline | 45 +++++++++++++++++++ .../minification/issue36-extended.ts.baseline | 28 ++++++++++++ .../minification/issue36.tsx.baseline | 45 +++++++++++++++++++ .../fixtures/minification/issue36-extended.ts | 5 +++ .../fixtures/minification/issue36.tsx | 18 ++++++++ 6 files changed, 169 insertions(+) create mode 100644 src/__tests__/baselines/minification-only/issue36-extended.ts.baseline create mode 100644 src/__tests__/baselines/minification-only/issue36.tsx.baseline create mode 100644 src/__tests__/baselines/minification/issue36-extended.ts.baseline create mode 100644 src/__tests__/baselines/minification/issue36.tsx.baseline create mode 100644 src/__tests__/fixtures/minification/issue36-extended.ts create mode 100644 src/__tests__/fixtures/minification/issue36.tsx diff --git a/src/__tests__/baselines/minification-only/issue36-extended.ts.baseline b/src/__tests__/baselines/minification-only/issue36-extended.ts.baseline new file mode 100644 index 0000000..952a023 --- /dev/null +++ b/src/__tests__/baselines/minification-only/issue36-extended.ts.baseline @@ -0,0 +1,28 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`issue36-extended.ts 1`] = ` + +File: issue36-extended.ts +Source code: + + declare const styled: any; + + export const A = styled.div\` + border: \${'solid'} 10px; + \` + + +TypeScript before transform: + + declare const styled: any; + export const A = styled.div \`\\n border: \${"solid"} 10px;\\n\`; + + +TypeScript after transform: + + declare const styled: any; + export const A = styled.div \`border:\${'solid'}10px;\`; + + + +`; diff --git a/src/__tests__/baselines/minification-only/issue36.tsx.baseline b/src/__tests__/baselines/minification-only/issue36.tsx.baseline new file mode 100644 index 0000000..254466f --- /dev/null +++ b/src/__tests__/baselines/minification-only/issue36.tsx.baseline @@ -0,0 +1,45 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`issue36.tsx 1`] = ` + +File: issue36.tsx +Source code: + + declare const keyframes: any; + declare const styled: any; + + const rotate360 = keyframes\` + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } + \`; + + export const StyledDiv = styled.div\` + width: 100px; + height: 100px; + background-color: greenyellow; + animation: \${rotate360} 2s linear infinite; + \`; + + +TypeScript before transform: + + declare const keyframes: any; + declare const styled: any; + const rotate360 = keyframes \`\\n from {\\n transform: rotate(0deg);\\n }\\n to {\\n transform: rotate(360deg);\\n }\\n\`; + export const StyledDiv = styled.div \`\\n width: 100px;\\n height: 100px;\\n background-color: greenyellow;\\n animation: \${rotate360} 2s linear infinite;\\n\`; + + +TypeScript after transform: + + declare const keyframes: any; + declare const styled: any; + const rotate360 = keyframes \`from{transform:rotate(0deg);}to{transform:rotate(360deg);}\`; + export const StyledDiv = styled.div \`width:100px;height:100px;background-color:greenyellow;animation:\${rotate360}2s linear infinite;\`; + + + +`; diff --git a/src/__tests__/baselines/minification/issue36-extended.ts.baseline b/src/__tests__/baselines/minification/issue36-extended.ts.baseline new file mode 100644 index 0000000..5488cd5 --- /dev/null +++ b/src/__tests__/baselines/minification/issue36-extended.ts.baseline @@ -0,0 +1,28 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`issue36-extended.ts 1`] = ` + +File: issue36-extended.ts +Source code: + + declare const styled: any; + + export const A = styled.div\` + border: \${'solid'} 10px; + \` + + +TypeScript before transform: + + declare const styled: any; + export const A = styled.div \`\\n border: \${"solid"} 10px;\\n\`; + + +TypeScript after transform: + + declare const styled: any; + export const A = styled.div.withConfig({ displayName: "A" }) \`border:\${'solid'}10px;\`; + + + +`; diff --git a/src/__tests__/baselines/minification/issue36.tsx.baseline b/src/__tests__/baselines/minification/issue36.tsx.baseline new file mode 100644 index 0000000..64feaa9 --- /dev/null +++ b/src/__tests__/baselines/minification/issue36.tsx.baseline @@ -0,0 +1,45 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`issue36.tsx 1`] = ` + +File: issue36.tsx +Source code: + + declare const keyframes: any; + declare const styled: any; + + const rotate360 = keyframes\` + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } + \`; + + export const StyledDiv = styled.div\` + width: 100px; + height: 100px; + background-color: greenyellow; + animation: \${rotate360} 2s linear infinite; + \`; + + +TypeScript before transform: + + declare const keyframes: any; + declare const styled: any; + const rotate360 = keyframes \`\\n from {\\n transform: rotate(0deg);\\n }\\n to {\\n transform: rotate(360deg);\\n }\\n\`; + export const StyledDiv = styled.div \`\\n width: 100px;\\n height: 100px;\\n background-color: greenyellow;\\n animation: \${rotate360} 2s linear infinite;\\n\`; + + +TypeScript after transform: + + declare const keyframes: any; + declare const styled: any; + const rotate360 = keyframes \`from{transform:rotate(0deg);}to{transform:rotate(360deg);}\`; + export const StyledDiv = styled.div.withConfig({ displayName: "StyledDiv" }) \`width:100px;height:100px;background-color:greenyellow;animation:\${rotate360}2s linear infinite;\`; + + + +`; diff --git a/src/__tests__/fixtures/minification/issue36-extended.ts b/src/__tests__/fixtures/minification/issue36-extended.ts new file mode 100644 index 0000000..a059062 --- /dev/null +++ b/src/__tests__/fixtures/minification/issue36-extended.ts @@ -0,0 +1,5 @@ +declare const styled: any; + +export const A = styled.div` + border: ${'solid'} 10px; +` diff --git a/src/__tests__/fixtures/minification/issue36.tsx b/src/__tests__/fixtures/minification/issue36.tsx new file mode 100644 index 0000000..611c4e2 --- /dev/null +++ b/src/__tests__/fixtures/minification/issue36.tsx @@ -0,0 +1,18 @@ +declare const keyframes: any; +declare const styled: any; + +const rotate360 = keyframes` + from { + transform: rotate(0deg); + } + to { + transform: rotate(360deg); + } +`; + +export const StyledDiv = styled.div` + width: 100px; + height: 100px; + background-color: greenyellow; + animation: ${rotate360} 2s linear infinite; +`; From 0b7dfc4548f5e6bb42cbadc16bb4924e555f3a13 Mon Sep 17 00:00:00 2001 From: Igor Oleinikov Date: Tue, 26 Mar 2019 21:23:17 -0700 Subject: [PATCH 2/4] Fix missing space after placeholder --- .../issue36-extended.ts.baseline | 2 +- .../minification-only/issue36.tsx.baseline | 2 +- .../minification/issue36-extended.ts.baseline | 2 +- .../minification/issue36.tsx.baseline | 2 +- src/minify.ts | 22 ++++++++++++++++--- 5 files changed, 23 insertions(+), 7 deletions(-) diff --git a/src/__tests__/baselines/minification-only/issue36-extended.ts.baseline b/src/__tests__/baselines/minification-only/issue36-extended.ts.baseline index 952a023..499e33e 100644 --- a/src/__tests__/baselines/minification-only/issue36-extended.ts.baseline +++ b/src/__tests__/baselines/minification-only/issue36-extended.ts.baseline @@ -21,7 +21,7 @@ TypeScript before transform: TypeScript after transform: declare const styled: any; - export const A = styled.div \`border:\${'solid'}10px;\`; + export const A = styled.div \`border:\${'solid'} 10px;\`; diff --git a/src/__tests__/baselines/minification-only/issue36.tsx.baseline b/src/__tests__/baselines/minification-only/issue36.tsx.baseline index 254466f..4464da1 100644 --- a/src/__tests__/baselines/minification-only/issue36.tsx.baseline +++ b/src/__tests__/baselines/minification-only/issue36.tsx.baseline @@ -38,7 +38,7 @@ TypeScript after transform: declare const keyframes: any; declare const styled: any; const rotate360 = keyframes \`from{transform:rotate(0deg);}to{transform:rotate(360deg);}\`; - export const StyledDiv = styled.div \`width:100px;height:100px;background-color:greenyellow;animation:\${rotate360}2s linear infinite;\`; + export const StyledDiv = styled.div \`width:100px;height:100px;background-color:greenyellow;animation:\${rotate360} 2s linear infinite;\`; diff --git a/src/__tests__/baselines/minification/issue36-extended.ts.baseline b/src/__tests__/baselines/minification/issue36-extended.ts.baseline index 5488cd5..3c100c8 100644 --- a/src/__tests__/baselines/minification/issue36-extended.ts.baseline +++ b/src/__tests__/baselines/minification/issue36-extended.ts.baseline @@ -21,7 +21,7 @@ TypeScript before transform: TypeScript after transform: declare const styled: any; - export const A = styled.div.withConfig({ displayName: "A" }) \`border:\${'solid'}10px;\`; + export const A = styled.div.withConfig({ displayName: "A" }) \`border:\${'solid'} 10px;\`; diff --git a/src/__tests__/baselines/minification/issue36.tsx.baseline b/src/__tests__/baselines/minification/issue36.tsx.baseline index 64feaa9..2f1e92a 100644 --- a/src/__tests__/baselines/minification/issue36.tsx.baseline +++ b/src/__tests__/baselines/minification/issue36.tsx.baseline @@ -38,7 +38,7 @@ TypeScript after transform: declare const keyframes: any; declare const styled: any; const rotate360 = keyframes \`from{transform:rotate(0deg);}to{transform:rotate(360deg);}\`; - export const StyledDiv = styled.div.withConfig({ displayName: "StyledDiv" }) \`width:100px;height:100px;background-color:greenyellow;animation:\${rotate360}2s linear infinite;\`; + export const StyledDiv = styled.div.withConfig({ displayName: "StyledDiv" }) \`width:100px;height:100px;background-color:greenyellow;animation:\${rotate360} 2s linear infinite;\`; diff --git a/src/minify.ts b/src/minify.ts index 8ec5708..2797fb3 100644 --- a/src/minify.ts +++ b/src/minify.ts @@ -1,12 +1,13 @@ import * as ts from 'typescript'; import { isNoSubstitutionTemplateLiteral, isTemplateExpression } from './ts-is-kind'; -type State = ';' | 'x' | ' ' | '\n' | '"' | '(' | '\'' | '/' | '//' | '/$' | '//$' | '/*' | '/**' | '/*$' | '/*$*'; +type State = ';' | ';$' | 'x' | ' ' | '\n' | '"' | '(' | '\'' | '/' | '//' | '/$' | '//$' | '/*' | '/**' | '/*$' | '/*$*'; type ReducerResult = { emit?: string; skipEmit?: boolean; state?: State } | void; type StateMachine = { [K in State]: { next?(ch: string): ReducerResult; flush?(last: boolean): ReducerResult; + placeholder?(): ReducerResult; } }; @@ -22,6 +23,18 @@ const stateMachine: StateMachine = { if (ch == '/') return { state: '/', skipEmit: true } if (isSymbol(ch)) return; return { state: 'x' } + }, + flush() { + return { state: ';$' } + } + }, + ';$': { // after placeholder + next(ch) { + 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; + return { state: 'x' } } }, 'x': { @@ -141,16 +154,19 @@ function createMinifier(): (next: string, last?: boolean) => string { minified += ch; } } + + let reducer = stateMachine[state]; + apply(reducer.placeholder && reducer.placeholder()); let pos = 0; let len = next.length; while (pos < len) { const ch = next[pos++]; - const reducer = stateMachine[state]; + reducer = stateMachine[state]; apply(reducer.next && reducer.next(ch), ch) } - const reducer = stateMachine[state]; + reducer = stateMachine[state]; apply(reducer.flush && reducer.flush(last)); return minified; From eebc404109428b01db3dae88fb9321b8c14404ea Mon Sep 17 00:00:00 2001 From: Igor Oleinikov Date: Tue, 26 Mar 2019 21:27:32 -0700 Subject: [PATCH 3/4] Add more tests with broken cases --- .../issue36-extended.ts.baseline | 18 ++++++++++++++++++ .../minification/issue36-extended.ts.baseline | 18 ++++++++++++++++++ .../fixtures/minification/issue36-extended.ts | 14 ++++++++++++++ 3 files changed, 50 insertions(+) diff --git a/src/__tests__/baselines/minification-only/issue36-extended.ts.baseline b/src/__tests__/baselines/minification-only/issue36-extended.ts.baseline index 499e33e..0bcecb8 100644 --- a/src/__tests__/baselines/minification-only/issue36-extended.ts.baseline +++ b/src/__tests__/baselines/minification-only/issue36-extended.ts.baseline @@ -11,17 +11,35 @@ Source code: border: \${'solid'} 10px; \` + styled.div\` + border: \${'solid'}// comment here + 10px; + border: solid// comment here + 10px; + \` + + styled.div\` + border: \${'solid'}/* comment here + */10px; + border: \${'solid'}/* comment here + */ 10px; + \` + TypeScript before transform: declare const styled: any; export const A = styled.div \`\\n border: \${"solid"} 10px;\\n\`; + styled.div \`\\n border: \${"solid"}// comment here\\n10px;\\n border: solid// comment here\\n10px;\\n\`; + styled.div \`\\n border: \${"solid"}/* comment here\\n*/10px;\\n border: \${"solid"}/* comment here\\n*/ 10px;\\n\`; TypeScript after transform: declare const styled: any; export const A = styled.div \`border:\${'solid'} 10px;\`; + styled.div \`border:\${'solid'}10px;border:solid10px;\`; + styled.div \`border:\${'solid'} 10px;border:\${'solid'} 10px;\`; diff --git a/src/__tests__/baselines/minification/issue36-extended.ts.baseline b/src/__tests__/baselines/minification/issue36-extended.ts.baseline index 3c100c8..0dfcf89 100644 --- a/src/__tests__/baselines/minification/issue36-extended.ts.baseline +++ b/src/__tests__/baselines/minification/issue36-extended.ts.baseline @@ -11,17 +11,35 @@ Source code: border: \${'solid'} 10px; \` + styled.div\` + border: \${'solid'}// comment here + 10px; + border: solid// comment here + 10px; + \` + + styled.div\` + border: \${'solid'}/* comment here + */10px; + border: \${'solid'}/* comment here + */ 10px; + \` + TypeScript before transform: declare const styled: any; export const A = styled.div \`\\n border: \${"solid"} 10px;\\n\`; + styled.div \`\\n border: \${"solid"}// comment here\\n10px;\\n border: solid// comment here\\n10px;\\n\`; + styled.div \`\\n border: \${"solid"}/* comment here\\n*/10px;\\n border: \${"solid"}/* comment here\\n*/ 10px;\\n\`; TypeScript after transform: declare const styled: any; export const A = styled.div.withConfig({ displayName: "A" }) \`border:\${'solid'} 10px;\`; + styled.div \`border:\${'solid'}10px;border:solid10px;\`; + styled.div \`border:\${'solid'} 10px;border:\${'solid'} 10px;\`; diff --git a/src/__tests__/fixtures/minification/issue36-extended.ts b/src/__tests__/fixtures/minification/issue36-extended.ts index a059062..5493de8 100644 --- a/src/__tests__/fixtures/minification/issue36-extended.ts +++ b/src/__tests__/fixtures/minification/issue36-extended.ts @@ -3,3 +3,17 @@ declare const styled: any; export const A = styled.div` border: ${'solid'} 10px; ` + +styled.div` + border: ${'solid'}// comment here +10px; + border: solid// comment here +10px; +` + +styled.div` + border: ${'solid'}/* comment here +*/10px; + border: ${'solid'}/* comment here +*/ 10px; +` From a8bee3fddd9d986befb80e12bdbe2c6f08aa6831 Mon Sep 17 00:00:00 2001 From: Igor Oleinikov Date: Tue, 26 Mar 2019 22:06:08 -0700 Subject: [PATCH 4/4] Fix broken cases --- .../issue36-extended.ts.baseline | 2 +- ...s-to-use-without-transpilation.ts.baseline | 2 +- .../minification-only/simple.ts.baseline | 2 +- .../minification/issue36-extended.ts.baseline | 2 +- ...s-to-use-without-transpilation.ts.baseline | 2 +- .../baselines/minification/simple.ts.baseline | 2 +- src/minify.ts | 50 +++++++++++++++---- 7 files changed, 47 insertions(+), 15 deletions(-) diff --git a/src/__tests__/baselines/minification-only/issue36-extended.ts.baseline b/src/__tests__/baselines/minification-only/issue36-extended.ts.baseline index 0bcecb8..ceab77a 100644 --- a/src/__tests__/baselines/minification-only/issue36-extended.ts.baseline +++ b/src/__tests__/baselines/minification-only/issue36-extended.ts.baseline @@ -38,7 +38,7 @@ TypeScript after transform: declare const styled: any; export const A = styled.div \`border:\${'solid'} 10px;\`; - styled.div \`border:\${'solid'}10px;border:solid10px;\`; + styled.div \`border:\${'solid'} 10px;border:solid 10px;\`; styled.div \`border:\${'solid'} 10px;border:\${'solid'} 10px;\`; diff --git a/src/__tests__/baselines/minification-only/minify-css-to-use-without-transpilation.ts.baseline b/src/__tests__/baselines/minification-only/minify-css-to-use-without-transpilation.ts.baseline index 9c6652a..0d35718 100644 --- a/src/__tests__/baselines/minification-only/minify-css-to-use-without-transpilation.ts.baseline +++ b/src/__tests__/baselines/minification-only/minify-css-to-use-without-transpilation.ts.baseline @@ -65,7 +65,7 @@ TypeScript after transform: const SpecialCharacters = styled.div \`content:" \${props => props.text} ";color:red;\`; const Comment = styled.div \`width:100%;color:red;\`; const Parens = styled.div \`&:hover{color:blue;}color:red;\`; - const UrlComments = styled.div \`color:red; background:red;border:1px solid green;\`; + const UrlComments = styled.div \`color:red;background:red;border:1px solid green;\`; export {}; diff --git a/src/__tests__/baselines/minification-only/simple.ts.baseline b/src/__tests__/baselines/minification-only/simple.ts.baseline index be2a568..667a159 100644 --- a/src/__tests__/baselines/minification-only/simple.ts.baseline +++ b/src/__tests__/baselines/minification-only/simple.ts.baseline @@ -158,7 +158,7 @@ TypeScript after transform: styled.div \`line one{line:two;}\`; // removes line comments at the end of lines of code // \`valid line with out comments\` - styled.div \`valid line without comments\`; + styled.div \`valid line with out comments\`; // preserves multi-line comments starting with /*! // \`this is a /*! dont ignore me please */ test\` styled.div \`this is a test\`; diff --git a/src/__tests__/baselines/minification/issue36-extended.ts.baseline b/src/__tests__/baselines/minification/issue36-extended.ts.baseline index 0dfcf89..37ce843 100644 --- a/src/__tests__/baselines/minification/issue36-extended.ts.baseline +++ b/src/__tests__/baselines/minification/issue36-extended.ts.baseline @@ -38,7 +38,7 @@ TypeScript after transform: declare const styled: any; export const A = styled.div.withConfig({ displayName: "A" }) \`border:\${'solid'} 10px;\`; - styled.div \`border:\${'solid'}10px;border:solid10px;\`; + styled.div \`border:\${'solid'} 10px;border:solid 10px;\`; styled.div \`border:\${'solid'} 10px;border:\${'solid'} 10px;\`; diff --git a/src/__tests__/baselines/minification/minify-css-to-use-without-transpilation.ts.baseline b/src/__tests__/baselines/minification/minify-css-to-use-without-transpilation.ts.baseline index 22c310e..6ea4700 100644 --- a/src/__tests__/baselines/minification/minify-css-to-use-without-transpilation.ts.baseline +++ b/src/__tests__/baselines/minification/minify-css-to-use-without-transpilation.ts.baseline @@ -65,7 +65,7 @@ TypeScript after transform: const SpecialCharacters = styled.div.withConfig({ displayName: "SpecialCharacters" }) \`content:" \${props => props.text} ";color:red;\`; const Comment = styled.div.withConfig({ displayName: "Comment" }) \`width:100%;color:red;\`; const Parens = styled.div.withConfig({ displayName: "Parens" }) \`&:hover{color:blue;}color:red;\`; - const UrlComments = styled.div.withConfig({ displayName: "UrlComments" }) \`color:red; background:red;border:1px solid green;\`; + const UrlComments = styled.div.withConfig({ displayName: "UrlComments" }) \`color:red;background:red;border:1px solid green;\`; export {}; diff --git a/src/__tests__/baselines/minification/simple.ts.baseline b/src/__tests__/baselines/minification/simple.ts.baseline index be2a568..667a159 100644 --- a/src/__tests__/baselines/minification/simple.ts.baseline +++ b/src/__tests__/baselines/minification/simple.ts.baseline @@ -158,7 +158,7 @@ TypeScript after transform: styled.div \`line one{line:two;}\`; // removes line comments at the end of lines of code // \`valid line with out comments\` - styled.div \`valid line without comments\`; + styled.div \`valid line with out comments\`; // preserves multi-line comments starting with /*! // \`this is a /*! dont ignore me please */ test\` styled.div \`this is a test\`; diff --git a/src/minify.ts b/src/minify.ts index 2797fb3..b7ea956 100644 --- a/src/minify.ts +++ b/src/minify.ts @@ -1,13 +1,12 @@ import * as ts from 'typescript'; import { isNoSubstitutionTemplateLiteral, isTemplateExpression } from './ts-is-kind'; -type State = ';' | ';$' | 'x' | ' ' | '\n' | '"' | '(' | '\'' | '/' | '//' | '/$' | '//$' | '/*' | '/**' | '/*$' | '/*$*'; -type ReducerResult = { emit?: string; skipEmit?: boolean; state?: State } | void; +type State = ';' | ';$' | 'x' | ' ' | '\n' | '"' | '(' | '\'' | '/' | '//' | ';/' | ';//' | '/$' | '//$' | '/*' | '/**' | ';/*' | ';/**' | '/*$' | '/*$*'; +type ReducerResult = { emit?: string; skipEmit?: boolean; state?: State; } | void; type StateMachine = { [K in State]: { next?(ch: string): ReducerResult; flush?(last: boolean): ReducerResult; - placeholder?(): ReducerResult; } }; @@ -20,7 +19,7 @@ const stateMachine: StateMachine = { next(ch) { if (ch == '\'' || ch == '"' || ch == '(') return { state: ch } if (ch == ' ' || ch == '\n' || ch == '\r') return { skipEmit: true } - if (ch == '/') return { state: '/', skipEmit: true } + if (ch == '/') return { state: ';/', skipEmit: true } if (isSymbol(ch)) return; return { state: 'x' } }, @@ -89,6 +88,26 @@ const stateMachine: StateMachine = { } }, '//': { + next(ch) { + if (ch == '\n') return { state: ' ', skipEmit: true } + return { skipEmit: true }; + }, + flush(last) { + if (last) return { skipEmit: true } + return { state: '//$', emit: '//' } + } + }, + ';/': { + next(ch) { + if (ch == '/') return { state: ';//', skipEmit: true } + if (ch == '*') return { state: ';/*', skipEmit: true } + return { state: ';', emit: '/' + ch } + }, + flush() { + return { state: '/$', emit: '/' } + } + }, + ';//': { next(ch) { if (ch == '\n') return { state: ';', skipEmit: true } return { skipEmit: true }; @@ -121,6 +140,22 @@ const stateMachine: StateMachine = { return { state: '/*', skipEmit: true } } }, + ';/*': { + next(ch) { + if (ch == '*') return { state: ';/**', skipEmit: true } + return { skipEmit: true }; + }, + flush(last) { + if (last) return { skipEmit: true } + return { state: '/*$', emit: '/*' } + } + }, + ';/**': { + next(ch) { + if (ch == '/') return { state: ';', skipEmit: true } + return { state: ';/*', skipEmit: true } + } + }, '/*$': { next(ch) { if (ch == '*') return { state: '/*$*', skipEmit: true }; @@ -155,18 +190,15 @@ function createMinifier(): (next: string, last?: boolean) => string { } } - let reducer = stateMachine[state]; - apply(reducer.placeholder && reducer.placeholder()); - let pos = 0; let len = next.length; while (pos < len) { const ch = next[pos++]; - reducer = stateMachine[state]; + const reducer = stateMachine[state]; apply(reducer.next && reducer.next(ch), ch) } - reducer = stateMachine[state]; + const reducer = stateMachine[state]; apply(reducer.flush && reducer.flush(last)); return minified;