@jsenv/core
Version:
Tool to develop, test and build js projects
60 lines (59 loc) • 1.96 kB
JavaScript
export const urlSpecifierEncoding = {
encode: (reference) => {
const { generatedSpecifier } = reference;
if (generatedSpecifier.then) {
return generatedSpecifier.then((value) => {
reference.generatedSpecifier = value;
return urlSpecifierEncoding.encode(reference);
});
}
// allow plugin to return a function to bypas default formatting
// (which is to use JSON.stringify when url is referenced inside js)
if (typeof generatedSpecifier === "function") {
return generatedSpecifier();
}
const formatter = formatters[reference.type];
const value = formatter
? formatter.encode(generatedSpecifier)
: generatedSpecifier;
if (reference.escape) {
return reference.escape(value);
}
return value;
},
decode: (reference) => {
const formatter = formatters[reference.type];
return formatter
? formatter.decode(reference.generatedSpecifier)
: reference.generatedSpecifier;
},
};
const formatters = {
"js_import": { encode: JSON.stringify, decode: JSON.parse },
"js_url": { encode: JSON.stringify, decode: JSON.parse },
"css_@import": { encode: JSON.stringify, decode: JSON.stringify },
// https://github.com/webpack-contrib/css-loader/pull/627/files
"css_url": {
encode: (url) => {
// If url is already wrapped in quotes, remove them
url = formatters.css_url.decode(url);
// Should url be wrapped?
// See https://drafts.csswg.org/css-values-3/#urls
if (/["'() \t\n]/.test(url)) {
return `"${url.replace(/"/g, '\\"').replace(/\n/g, "\\n")}"`;
}
return url;
},
decode: (url) => {
const firstChar = url[0];
const lastChar = url[url.length - 1];
if (firstChar === `"` && lastChar === `"`) {
return url.slice(1, -1);
}
if (firstChar === `'` && lastChar === `'`) {
return url.slice(1, -1);
}
return url;
},
},
};