From 4f802c2ab1b58308820ee70d42712b279835c8cb Mon Sep 17 00:00:00 2001 From: Markus Oberlehner Date: Thu, 14 Dec 2017 18:08:41 +0100 Subject: [PATCH] Fix import url parsing when `from` is a filter The `from` keyword could be used as a node import filter, in such cases and if whitespace is added around filters, extracting filters was not working correctly. Fixes #159 --- .../src/functions/parse-node-filters.spec.ts | 14 ++++++++++++++ .../src/functions/parse-node-filters.ts | 2 +- .../src/functions/parse-selector-filters.ts | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/packages/node-sass-magic-importer/src/functions/parse-node-filters.spec.ts b/packages/node-sass-magic-importer/src/functions/parse-node-filters.spec.ts index 014263f..7ed2338 100644 --- a/packages/node-sass-magic-importer/src/functions/parse-node-filters.spec.ts +++ b/packages/node-sass-magic-importer/src/functions/parse-node-filters.spec.ts @@ -77,6 +77,20 @@ describe(`parseNodeFilters()`, () => { expect(nodeFilters).toEqual(expectedResult); }); + test(`It should handle spaces in node filters.`, () => { + const parseNodeFilters = parseNodeFiltersFactory(); + const urlWithFilters = `[ at-rules, mixins, from ] from style.scss`; + + const nodeFilters = parseNodeFilters(urlWithFilters); + const expectedResult = [ + `at-rules`, + `mixins`, + `from`, + ]; + + expect(nodeFilters).toEqual(expectedResult); + }); + test(`It should trim empty filter from multi line URL.`, () => { const parseNodeFilters = parseNodeFiltersFactory(); const urlWithFilters = `[ diff --git a/packages/node-sass-magic-importer/src/functions/parse-node-filters.ts b/packages/node-sass-magic-importer/src/functions/parse-node-filters.ts index da5fb73..a4746fd 100644 --- a/packages/node-sass-magic-importer/src/functions/parse-node-filters.ts +++ b/packages/node-sass-magic-importer/src/functions/parse-node-filters.ts @@ -2,7 +2,7 @@ import { IFilterParser } from '../interfaces/IFilterParser'; export function parseNodeFiltersFactory(): IFilterParser { return (url: string) => { - const filterDivider = /[\s]+from[\s]+/; + const filterDivider = /[\s]+from[\s]+(?!.*from)/; if (!filterDivider.test(url)) { return []; diff --git a/packages/node-sass-magic-importer/src/functions/parse-selector-filters.ts b/packages/node-sass-magic-importer/src/functions/parse-selector-filters.ts index f27b414..22d45cb 100644 --- a/packages/node-sass-magic-importer/src/functions/parse-selector-filters.ts +++ b/packages/node-sass-magic-importer/src/functions/parse-selector-filters.ts @@ -7,7 +7,7 @@ export function parseSelectorFiltersFactory( splitSelectorFilter: ISplitSelectorFilter, ): IParseSelectorFilters { return (url: string) => { - const filterDivider = /[\s]+from[\s]+/; + const filterDivider = /[\s]+from[\s]+(?!.*from)/; if (!filterDivider.test(url)) { return [];