Skip to content

Commit c03c3ca

Browse files
committed
chore: CascadingError is useful for wrapping upstream errors.
1 parent ec1c749 commit c03c3ca

File tree

2 files changed

+58
-41
lines changed

2 files changed

+58
-41
lines changed

packages/@css-blocks/core/src/BlockParser/features/export-blocks.ts

+50-41
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ export async function exportBlocks(block: Block, factory: BlockFactory, file: st
2929

3030
// For each `@block` expression, read in the block file, parse and
3131
// push to block references Promise array.
32-
root.walkAtRules(BLOCK_EXPORT, async (atRule: postcss.AtRule) => {
32+
root.walkAtRules(BLOCK_EXPORT, (atRule: postcss.AtRule) => {
3333
let exports = atRule.params;
3434

3535
let [exportList = "", blockPath = ""] = exports.split(FROM_EXPR);
@@ -50,54 +50,63 @@ export async function exportBlocks(block: Block, factory: BlockFactory, file: st
5050

5151
// Validate our imported block name is a valid CSS identifier.
5252
const blockNames = parseBlockNames(exportList, !!blockPath);
53-
const exportPromise = srcBlockPromise.then((srcBlock) => {
54-
for (let remoteName of Object.keys(blockNames)) {
55-
if (remoteNames.has(remoteName)) {
56-
block.addError(new errors.InvalidBlockSyntax(
57-
`Cannot have duplicate Block export of same name: "${remoteName}".`,
58-
sourceRange(factory.configuration, block.stylesheet, file, atRule),
59-
));
60-
} else {
61-
let localName = blockNames[remoteName];
62-
if (!CLASS_NAME_IDENT.test(localName)) {
63-
block.addError(new errors.InvalidBlockSyntax(
64-
`Illegal block name in export. "${localName}" is not a legal CSS identifier.`,
65-
sourceRange(factory.configuration, block.stylesheet, file, atRule),
66-
));
67-
}
68-
else if (!CLASS_NAME_IDENT.test(remoteName)) {
69-
block.addError(new errors.InvalidBlockSyntax(
70-
`Illegal block name in import. "${remoteName}" is not a legal CSS identifier.`,
71-
sourceRange(factory.configuration, block.stylesheet, file, atRule),
72-
));
73-
}
74-
else if (localName === DEFAULT_EXPORT && remoteName === DEFAULT_EXPORT) {
53+
const exportPromise = srcBlockPromise.then(
54+
(srcBlock) => {
55+
for (let remoteName of Object.keys(blockNames)) {
56+
if (remoteNames.has(remoteName)) {
7557
block.addError(new errors.InvalidBlockSyntax(
76-
`Unnecessary re-export of default Block.`,
58+
`Cannot have duplicate Block export of same name: "${remoteName}".`,
7759
sourceRange(factory.configuration, block.stylesheet, file, atRule),
7860
));
79-
}
61+
} else {
62+
let localName = blockNames[remoteName];
63+
if (!CLASS_NAME_IDENT.test(localName)) {
64+
block.addError(new errors.InvalidBlockSyntax(
65+
`Illegal block name in export. "${localName}" is not a legal CSS identifier.`,
66+
sourceRange(factory.configuration, block.stylesheet, file, atRule),
67+
));
68+
}
69+
else if (!CLASS_NAME_IDENT.test(remoteName)) {
70+
block.addError(new errors.InvalidBlockSyntax(
71+
`Illegal block name in import. "${remoteName}" is not a legal CSS identifier.`,
72+
sourceRange(factory.configuration, block.stylesheet, file, atRule),
73+
));
74+
}
75+
else if (localName === DEFAULT_EXPORT && remoteName === DEFAULT_EXPORT) {
76+
block.addError(new errors.InvalidBlockSyntax(
77+
`Unnecessary re-export of default Block.`,
78+
sourceRange(factory.configuration, block.stylesheet, file, atRule),
79+
));
80+
}
8081

81-
else if (RESERVED_BLOCK_NAMES.has(remoteName)) {
82-
block.addError (new errors.InvalidBlockSyntax(
83-
`Cannot export "${localName}" as reserved word "${remoteName}"`,
84-
sourceRange(factory.configuration, block.stylesheet, file, atRule),
85-
));
86-
}
82+
else if (RESERVED_BLOCK_NAMES.has(remoteName)) {
83+
block.addError(new errors.InvalidBlockSyntax(
84+
`Cannot export "${localName}" as reserved word "${remoteName}"`,
85+
sourceRange(factory.configuration, block.stylesheet, file, atRule),
86+
));
87+
}
8788

88-
let referencedBlock = srcBlock.getReferencedBlock(localName);
89-
if (!referencedBlock) {
90-
block.addError (new errors.InvalidBlockSyntax(
91-
`Cannot export Block "${localName}". No Block named "${localName}" in "${file}".`,
92-
sourceRange(factory.configuration, block.stylesheet, file, atRule),
93-
));
94-
} else {
95-
// Save exported blocks
96-
block.addBlockExport(remoteName, referencedBlock);
89+
let referencedBlock = srcBlock.getReferencedBlock(localName);
90+
if (!referencedBlock) {
91+
block.addError(new errors.InvalidBlockSyntax(
92+
`Cannot export Block "${localName}". No Block named "${localName}" in "${file}".`,
93+
sourceRange(factory.configuration, block.stylesheet, file, atRule),
94+
));
95+
} else {
96+
// Save exported blocks
97+
block.addBlockExport(remoteName, referencedBlock);
98+
}
9799
}
98100
}
101+
},
102+
(error) => {
103+
block.addError(new errors.CascadingError(
104+
`Error in exported block "${blockPath}"`,
105+
error,
106+
sourceRange(factory.configuration, block.stylesheet, file, atRule),
107+
));
99108
}
100-
});
109+
);
101110

102111
exportPromises.push(exportPromise);
103112

packages/@css-blocks/core/src/errors.ts

+8
Original file line numberDiff line numberDiff line change
@@ -162,3 +162,11 @@ export class MultipleCssBlockErrors extends CssBlockError {
162162
this._errors = [];
163163
}
164164
}
165+
166+
export class CascadingError extends CssBlockError {
167+
cause: CssBlockError;
168+
constructor(message: string, rootCause: CssBlockError, location?: ErrorLocation) {
169+
super(message, location);
170+
this.cause = rootCause;
171+
}
172+
}

0 commit comments

Comments
 (0)