Skip to content

Commit

Permalink
refactor: code (#1003)
Browse files Browse the repository at this point in the history
  • Loading branch information
evilebottnawi committed Dec 3, 2019
1 parent 77e705c commit e662b61
Show file tree
Hide file tree
Showing 5 changed files with 213 additions and 277 deletions.
87 changes: 39 additions & 48 deletions src/index.js
Expand Up @@ -19,7 +19,6 @@ import {
getImportCode,
getModuleCode,
getExportCode,
prepareCode,
} from './utils';
import Warning from './Warning';
import CssSyntaxError from './CssSyntaxError';
Expand Down Expand Up @@ -58,19 +57,11 @@ export default function loader(content, map, meta) {
// Run other loader (`postcss-loader`, `sass-loader` and etc) for importing CSS
const importPrefix = getImportPrefix(this, options.importLoaders);

plugins.push(
icssParser({
loaderContext: this,
importPrefix,
localsConvention: options.localsConvention,
})
);
plugins.push(icssParser());

if (options.import !== false) {
plugins.push(
importParser({
loaderContext: this,
importPrefix,
filter: getFilter(options.import, this.resourcePath),
})
);
Expand All @@ -79,7 +70,6 @@ export default function loader(content, map, meta) {
if (options.url !== false) {
plugins.push(
urlParser({
loaderContext: this,
filter: getFilter(options.url, this.resourcePath, (value) =>
isUrlRequest(value)
),
Expand All @@ -92,54 +82,55 @@ export default function loader(content, map, meta) {
from: this.remainingRequest.split('!').pop(),
to: this.currentRequest.split('!').pop(),
map: options.sourceMap
? {
prev: map,
inline: false,
annotation: false,
}
: null,
? { prev: map, inline: false, annotation: false }
: false,
})
.then((result) => {
result
.warnings()
.forEach((warning) => this.emitWarning(new Warning(warning)));

if (!result.messages) {
// eslint-disable-next-line no-param-reassign
result.messages = [];
const imports = [];
const exports = [];
const replacers = [];

for (const message of result.messages) {
// eslint-disable-next-line default-case
switch (message.type) {
case 'import':
imports.push(message.value);
break;
case 'export':
exports.push(message.value);
break;
case 'replacer':
replacers.push(message.value);
break;
}
}

const { onlyLocals } = options;

const importItems = result.messages
.filter((message) => (message.type === 'import' ? message : false))
.reduce((accumulator, currentValue) => {
accumulator.push(currentValue.import);

return accumulator;
}, []);
const exportItems = result.messages
.filter((message) => (message.type === 'export' ? message : false))
.reduce((accumulator, currentValue) => {
accumulator.push(currentValue.export);

return accumulator;
}, []);

const importCode = getImportCode(importItems, onlyLocals);
const moduleCode = getModuleCode(result, sourceMap, onlyLocals);
const exportCode = getExportCode(exportItems, onlyLocals);
const apiCode = getApiCode(this, sourceMap, onlyLocals);
const isNormalMode = !options.onlyLocals;

const apiCode = isNormalMode ? getApiCode(this, sourceMap) : '';
const importCode =
isNormalMode && imports.length > 0
? getImportCode(this, imports, { importPrefix })
: '';
const moduleCode = isNormalMode
? getModuleCode(this, result, replacers, { sourceMap, importPrefix })
: '';
const exportCode =
exports.length > 0
? getExportCode(this, exports, replacers, {
importPrefix,
localsConvention: options.localsConvention,
onlyLocals: options.onlyLocals,
})
: '';

return callback(
null,
prepareCode(
{ apiCode, importCode, moduleCode, exportCode },
result.messages,
this,
importPrefix,
onlyLocals
)
[apiCode, importCode, moduleCode, exportCode].join('')
);
})
.catch((error) => {
Expand Down
35 changes: 16 additions & 19 deletions src/plugins/postcss-icss-parser.js
Expand Up @@ -2,23 +2,22 @@ import postcss from 'postcss';
import { extractICSS, replaceValueSymbols, replaceSymbols } from 'icss-utils';
import loaderUtils from 'loader-utils';

import { getExportItemCode, getImportItemCode } from '../utils';

const pluginName = 'postcss-icss-parser';

function hasImportMessage(messages, url) {
return messages.find(
(message) =>
message.pluginName === pluginName &&
message.type === 'import' &&
message.item.url === url &&
message.item.media === ''
message.value &&
message.value.url === url &&
message.value.media === ''
);
}

export default postcss.plugin(
pluginName,
(options = {}) =>
() =>
function process(css, result) {
const importReplacements = Object.create(null);
const { icssImports, icssExports } = extractICSS(css);
Expand All @@ -29,28 +28,27 @@ export default postcss.plugin(
const url = loaderUtils.parseString(importUrl);

for (const token of Object.keys(icssImports[importUrl])) {
const name = `___CSS_LOADER_IMPORT___${index}___`;

index += 1;
importReplacements[token] = `___CSS_LOADER_IMPORT___${index}___`;
importReplacements[token] = name;

result.messages.push({
pluginName,
type: 'icss-import',
item: { url, export: icssImports[importUrl][token], index },
type: 'replacer',
value: {
type: 'icss-import',
name,
url,
export: icssImports[importUrl][token],
},
});

if (!hasImportMessage(result.messages, url)) {
const media = '';
const { loaderContext, importPrefix } = options;

result.messages.push({
pluginName,
type: 'import',
import: getImportItemCode(
{ url, media },
loaderContext,
importPrefix
),
item: { url, media },
value: { type: 'icss-import', url, media: '', name },
});
}
}
Expand All @@ -67,9 +65,8 @@ export default postcss.plugin(

result.messages.push({
pluginName,
export: getExportItemCode(name, value, options.localsConvention),
type: 'export',
item: { name, value },
value: { name, value },
});
}
}
Expand Down
10 changes: 3 additions & 7 deletions src/plugins/postcss-import-parser.js
@@ -1,7 +1,7 @@
import postcss from 'postcss';
import valueParser from 'postcss-value-parser';

import { uniqWith, getImportItemCode } from '../utils';
import { uniqWith } from '../utils';

const pluginName = 'postcss-import-parser';

Expand Down Expand Up @@ -88,7 +88,7 @@ function walkAtRules(css, result, filter) {

export default postcss.plugin(
pluginName,
(options = {}) =>
(options) =>
function process(css, result) {
const traversed = walkAtRules(css, result, options.filter);
const paths = uniqWith(
Expand All @@ -100,11 +100,7 @@ export default postcss.plugin(
result.messages.push({
pluginName,
type: 'import',
import: getImportItemCode(
item,
options.loaderContext,
options.importPrefix
),
value: { type: '@import', url: item.url, media: item.media },
});
});
}
Expand Down
44 changes: 16 additions & 28 deletions src/plugins/postcss-url-parser.js
@@ -1,7 +1,7 @@
import postcss from 'postcss';
import valueParser from 'postcss-value-parser';

import { uniqWith, flatten, getUrlHelperCode, getUrlItemCode } from '../utils';
import { uniqWith, flatten } from '../utils';

const pluginName = 'postcss-url-parser';

Expand Down Expand Up @@ -106,7 +106,7 @@ function walkDeclsWithUrl(css, result, filter) {

export default postcss.plugin(
pluginName,
(options = {}) =>
(options) =>
function process(css, result) {
const traversed = walkDeclsWithUrl(css, result, options.filter);
const paths = uniqWith(
Expand All @@ -121,36 +121,24 @@ export default postcss.plugin(

const placeholders = [];

let hasUrlHelper = false;

paths.forEach((path, index) => {
const { loaderContext } = options;
const placeholder = `___CSS_LOADER_URL___${index}___`;
const name = `___CSS_LOADER_URL___${index}___`;
const { url, needQuotes } = path;

placeholders.push({ placeholder, path });
placeholders.push({ name, path });

if (!hasUrlHelper) {
result.messages.push({
result.messages.push(
{
pluginName,
type: 'import',
import: getUrlHelperCode(loaderContext),
});

// eslint-disable-next-line no-param-reassign
hasUrlHelper = true;
}

result.messages.push({
pluginName,
type: 'import',
import: getUrlItemCode(
{ url, placeholder, needQuotes },
loaderContext
),
importType: 'url',
placeholder,
});
value: { type: 'url', url, name, needQuotes },
},
{
pluginName,
type: 'replacer',
value: { type: 'url', name },
}
);
});

traversed.forEach((item) => {
Expand All @@ -165,12 +153,12 @@ export default postcss.plugin(
return;
}

const { placeholder } = value;
const { name } = value;

// eslint-disable-next-line no-param-reassign
node.type = 'word';
// eslint-disable-next-line no-param-reassign
node.value = placeholder;
node.value = name;
});

// eslint-disable-next-line no-param-reassign
Expand Down

0 comments on commit e662b61

Please sign in to comment.