Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: error handling #1141

Merged
merged 4 commits into from
May 25, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 1 addition & 5 deletions src/SassError.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ class SassError extends Error {
// Instruct webpack to hide the JS stack from the console.
// Usually you're only interested in the SASS error in this case.
this.hideStack = true;
Error.captureStackTrace(this, this.constructor);

if (
typeof sassError.line !== "undefined" ||
Expand All @@ -25,10 +24,7 @@ class SassError extends Error {
}`;

if (sassError.formatted) {
this.message = `${this.name}: ${sassError.formatted.replace(
/^Error: /,
""
)}`;
this.message = sassError.formatted.replace(/^Error: /, "");
}
}
}
Expand Down
18 changes: 14 additions & 4 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,13 @@ import SassError from "./SassError";
async function loader(content) {
const options = this.getOptions(schema);
const callback = this.async();
const implementation = getSassImplementation(this, options.implementation);

if (!implementation) {
callback();
let implementation;

try {
implementation = getSassImplementation(this, options.implementation);
} catch (error) {
callback(error);

return;
}
Expand Down Expand Up @@ -59,7 +62,14 @@ async function loader(content) {
}
}

const compile = getCompileFn(implementation, options);
let compile;

try {
compile = getCompileFn(implementation, options);
} catch (error) {
callback(error);
return;
}

let result;

Expand Down
33 changes: 6 additions & 27 deletions src/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -36,43 +36,24 @@ function getSassImplementation(loaderContext, implementation) {
let resolvedImplementation = implementation;

if (!resolvedImplementation) {
try {
resolvedImplementation = getDefaultSassImplementation();
} catch (error) {
loaderContext.emitError(error);

return;
}
resolvedImplementation = getDefaultSassImplementation();
}

if (typeof resolvedImplementation === "string") {
try {
// eslint-disable-next-line import/no-dynamic-require, global-require
resolvedImplementation = require(resolvedImplementation);
} catch (error) {
loaderContext.emitError(error);

// eslint-disable-next-line consistent-return
return;
}
// eslint-disable-next-line import/no-dynamic-require, global-require
resolvedImplementation = require(resolvedImplementation);
}

const { info } = resolvedImplementation;

if (!info) {
loaderContext.emitError(new Error("Unknown Sass implementation."));

return;
throw new Error("Unknown Sass implementation.");
}

const infoParts = info.split("\t");

if (infoParts.length < 2) {
loaderContext.emitError(
new Error(`Unknown Sass implementation "${info}".`)
);

return;
throw new Error(`Unknown Sass implementation "${info}".`);
}

const [implementationName] = infoParts;
Expand All @@ -88,9 +69,7 @@ function getSassImplementation(loaderContext, implementation) {
return resolvedImplementation;
}

loaderContext.emitError(
new Error(`Unknown Sass implementation "${implementationName}".`)
);
throw new Error(`Unknown Sass implementation "${implementationName}".`);
}

/**
Expand Down
20 changes: 10 additions & 10 deletions test/__snapshots__/implementation-option.test.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ exports[`implementation option not specify: warnings 1`] = `[]`;

exports[`implementation option should not swallow an error when trying to load a sass implementation: errors 1`] = `
[
"ModuleError: Module Error (from ../src/cjs.js):
"ModuleBuildError: Module build failed (from ../src/cjs.js):
Some error",
]
`;
Expand All @@ -47,43 +47,43 @@ exports[`implementation option should not swallow an error when trying to load a

exports[`implementation option should throw an error on an unknown sass implementation: errors 1`] = `
[
"ModuleError: Module Error (from ../src/cjs.js):
Unknown Sass implementation "strange-sass".",
"ModuleBuildError: Module build failed (from ../src/cjs.js):
Error: Unknown Sass implementation "strange-sass".",
]
`;

exports[`implementation option should throw an error on an unknown sass implementation: warnings 1`] = `[]`;

exports[`implementation option should throw an error when the "info" is unparseable: errors 1`] = `
[
"ModuleError: Module Error (from ../src/cjs.js):
Unknown Sass implementation "asdfj".",
"ModuleBuildError: Module build failed (from ../src/cjs.js):
Error: Unknown Sass implementation "asdfj".",
]
`;

exports[`implementation option should throw an error when the "info" is unparseable: warnings 1`] = `[]`;

exports[`implementation option should throw error when the "info" does not exist: errors 1`] = `
[
"ModuleError: Module Error (from ../src/cjs.js):
Unknown Sass implementation.",
"ModuleBuildError: Module build failed (from ../src/cjs.js):
Error: Unknown Sass implementation.",
]
`;

exports[`implementation option should throw error when the "info" does not exist: warnings 1`] = `[]`;

exports[`implementation option should throw error when unresolved package: errors 1`] = `
[
"ModuleError: Module Error (from ../src/cjs.js):
Cannot find module 'unresolved' from 'src/utils.js'",
"ModuleBuildError: Module build failed (from ../src/cjs.js):
Error: Cannot find module 'unresolved' from 'src/utils.js'",
]
`;

exports[`implementation option should throw error when unresolved package: warnings 1`] = `[]`;

exports[`implementation option should try to load using valid order: errors 1`] = `
[
"ModuleError: Module Error (from ../src/cjs.js):
"ModuleBuildError: Module build failed (from ../src/cjs.js):
Some error sass",
]
`;
Expand Down
Loading