Skip to content

Commit

Permalink
feat: support webpack built-in resolver for modern and modern-compile…
Browse files Browse the repository at this point in the history
…r API
  • Loading branch information
alexander-akait committed Apr 10, 2024
1 parent cef40a8 commit bc7f447
Show file tree
Hide file tree
Showing 7 changed files with 8,260 additions and 52,389 deletions.
5 changes: 4 additions & 1 deletion src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,11 @@ async function loader(content) {
getWebpackImporter(this, implementation, includePaths),
);
} else {
// TODO loadsPaths
const { loadPaths } = sassOptions;

sassOptions.importers.push(
getModernWebpackImporter(this, implementation),
getModernWebpackImporter(this, implementation, loadPaths),
);
}
}
Expand Down
67 changes: 62 additions & 5 deletions src/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -612,13 +612,70 @@ function getWebpackResolver(

const MATCH_CSS = /\.css$/i;

function getModernWebpackImporter() {
function getModernWebpackImporter(loaderContext, implementation, loadPaths) {
const resolve = getWebpackResolver(
loaderContext.getResolve,
implementation,
loadPaths,
);

return {
async canonicalize() {
return null;
async canonicalize(originalUrl, context) {
const { fromImport } = context;
// TODO memorize?
const prev = url.fileURLToPath(context.containingUrl.toString());

let result;

try {
result = await resolve(prev, originalUrl, fromImport);
} catch (err) {
// If no stylesheets are found, the importer should return null.
return null;
}

loaderContext.addDependency(path.normalize(result));

return url.pathToFileURL(result);
},
load() {
// TODO implement
async load(canonicalUrl) {
const ext = path.extname(canonicalUrl.pathname);

let syntax;

if (ext && ext.toLowerCase() === ".scss") {
syntax = "scss";
} else if (ext && ext.toLowerCase() === ".sass") {
syntax = "indented";
} else if (ext && ext.toLowerCase() === ".css") {
syntax = "css";
} else {
// Fallback to default value
syntax = "scss";
}

try {
const contents = await new Promise((resolve, reject) => {
// Old version of `enhanced-resolve` supports only path as a string
// TODO simplify in the next major release and pass URL
// TODO memorize?
const canonicalPath = url.fileURLToPath(canonicalUrl);

loaderContext.fs.readFile(canonicalPath, "utf8", (err, content) => {
if (err) {
reject(err);
return;
}

resolve(content);
});
});

return { contents, syntax };
} catch (err) {
console.log(err);
return null;
}
},
};
}
Expand Down

0 comments on commit bc7f447

Please sign in to comment.