Skip to content
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
5 changes: 5 additions & 0 deletions .changeset/icy-turkeys-joke.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'@css-modules-kit/core': minor
---

feat!: remove `Cannot import module 'xxx'` error
57 changes: 25 additions & 32 deletions packages/codegen/src/project.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -91,21 +91,23 @@ describe('addFile', () => {
// - The check stage cache for files that indirectly import the added file should also be invalidated.
const iff = await createIFF({
'tsconfig.json': '{ "cmkOptions": { "enabled": true } }',
'src/b.module.css': '@import "./a.module.css";', // directly
'src/c.module.css': '@value a_1 from "./b.module.css";', // indirectly
'src/a.module.css': '',
'src/b.module.css': '@value a_1 from "./a.module.css";', // directly
'src/re-export.module.css': '@import "./a.module.css";',
'src/c.module.css': '@value a_1 from "./re-export.module.css";', // indirectly
});
const project = createProject({ project: iff.rootDir });
expect(formatDiagnostics(project.getDiagnostics(), iff.rootDir)).toMatchInlineSnapshot(`
[
{
"category": "error",
"fileName": "<rootDir>/src/b.module.css",
"length": 14,
"length": 3,
"start": {
"column": 10,
"column": 8,
"line": 1,
},
"text": "Cannot import module './a.module.css'",
"text": "Module './a.module.css' has no exported token 'a_1'.",
},
{
"category": "error",
Expand All @@ -115,12 +117,12 @@ describe('addFile', () => {
"column": 8,
"line": 1,
},
"text": "Module './b.module.css' has no exported token 'a_1'.",
"text": "Module './re-export.module.css' has no exported token 'a_1'.",
},
]
`);
await writeFile(iff.join('src/a.module.css'), '@value a_1: red;');
project.addFile(iff.join('src/a.module.css'));
project.updateFile(iff.join('src/a.module.css'));
expect(formatDiagnostics(project.getDiagnostics(), iff.rootDir)).toMatchInlineSnapshot(`[]`);
});
test('changes the resolution results of import specifiers in other files', async () => {
Expand Down Expand Up @@ -204,19 +206,19 @@ describe('updateFile', () => {
`);

// New semantic diagnostics are reported
await writeFile(iff.join('src/a.module.css'), `@import './non-existent.module.css';`);
await writeFile(iff.join('src/a.module.css'), `.a-1 {}`);
project.updateFile(iff.join('src/a.module.css'));
expect(formatDiagnostics(project.getDiagnostics(), iff.rootDir)).toMatchInlineSnapshot(`
[
{
"category": "error",
"fileName": "<rootDir>/src/a.module.css",
"length": 25,
"length": 3,
"start": {
"column": 10,
"column": 2,
"line": 1,
},
"text": "Cannot import module './non-existent.module.css'",
"text": "css-modules-kit does not support invalid names as JavaScript identifiers.",
},
]
`);
Expand Down Expand Up @@ -311,25 +313,16 @@ describe('removeFile', () => {
const iff = await createIFF({
'tsconfig.json': '{ "cmkOptions": { "enabled": true } }',
'src/a.module.css': '@value a_1: red;',
'src/b.module.css': '@import "./a.module.css";', // directly
'src/c.module.css': '@value a_1 from "./b.module.css";', // indirectly
'src/b.module.css': '@value a_1 from "./a.module.css";', // directly
'src/re-export.module.css': '@import "./a.module.css";',
'src/c.module.css': '@value a_1 from "./re-export.module.css";', // indirectly
});
const project = createProject({ project: iff.rootDir });
expect(formatDiagnostics(project.getDiagnostics(), iff.rootDir)).toMatchInlineSnapshot(`[]`);
await rm(iff.join('src/a.module.css'));
project.removeFile(iff.join('src/a.module.css'));
expect(formatDiagnostics(project.getDiagnostics(), iff.rootDir)).toMatchInlineSnapshot(`
[
{
"category": "error",
"fileName": "<rootDir>/src/b.module.css",
"length": 14,
"start": {
"column": 10,
"line": 1,
},
"text": "Cannot import module './a.module.css'",
},
{
"category": "error",
"fileName": "<rootDir>/src/c.module.css",
Expand All @@ -338,7 +331,7 @@ describe('removeFile', () => {
"column": 8,
"line": 1,
},
"text": "Module './b.module.css' has no exported token 'a_1'.",
"text": "Module './re-export.module.css' has no exported token 'a_1'.",
},
]
`);
Expand Down Expand Up @@ -466,8 +459,8 @@ describe('getDiagnostics', () => {
test('returns semantic diagnostics', async () => {
const iff = await createIFF({
'tsconfig.json': '{ "cmkOptions": { "enabled": true } }',
'src/a.module.css': `@import './non-existent-1.module.css';`,
'src/b.module.css': `@import './non-existent-2.module.css';`,
'src/a.module.css': `.a-1 {}`,
'src/b.module.css': `.b-1 {}`,
});
const project = createProject({ project: iff.rootDir });
const diagnostics = project.getDiagnostics();
Expand All @@ -476,22 +469,22 @@ describe('getDiagnostics', () => {
{
"category": "error",
"fileName": "<rootDir>/src/a.module.css",
"length": 27,
"length": 3,
"start": {
"column": 10,
"column": 2,
"line": 1,
},
"text": "Cannot import module './non-existent-1.module.css'",
"text": "css-modules-kit does not support invalid names as JavaScript identifiers.",
},
{
"category": "error",
"fileName": "<rootDir>/src/b.module.css",
"length": 27,
"length": 3,
"start": {
"column": 10,
"column": 2,
"line": 1,
},
"text": "Cannot import module './non-existent-2.module.css'",
"text": "css-modules-kit does not support invalid names as JavaScript identifiers.",
},
]
`);
Expand Down
53 changes: 0 additions & 53 deletions packages/core/src/checker.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -285,59 +285,6 @@ describe('checkCSSModule', () => {
]
`);
});
test('report diagnostics for non-existing module', () => {
const args = prepareCheckerArgs([
fakeCSSModule({
fileName: '/a.module.css',
tokenImporters: [
fakeAtImportTokenImporter({ from: './b.module.css', fromLoc: fakeLoc({ column: 1 }) }),
fakeAtValueTokenImporter({
from: './c.module.css',
fromLoc: fakeLoc({ column: 2 }),
values: [fakeAtValueTokenImporterValue({ name: 'c_1', loc: fakeLoc({ column: 3 }) })],
}),
],
}),
]);
const diagnostics = checkCSSModule(
args.cssModules[0],
args.config,
args.exportBuilder,
args.matchesPattern,
args.resolver,
args.getCSSModule,
);
expect(diagnostics).toMatchInlineSnapshot(`
[
{
"category": "error",
"file": {
"fileName": "/a.module.css",
"text": "",
},
"length": 0,
"start": {
"column": 1,
"line": 1,
},
"text": "Cannot import module './b.module.css'",
},
{
"category": "error",
"file": {
"fileName": "/a.module.css",
"text": "",
},
"length": 0,
"start": {
"column": 2,
"line": 1,
},
"text": "Cannot import module './c.module.css'",
},
]
`);
});
test('report diagnostics for non-exported token', () => {
const args = prepareCheckerArgs([
fakeCSSModule({
Expand Down
16 changes: 1 addition & 15 deletions packages/core/src/checker.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import type {
Location,
MatchesPattern,
Resolver,
TokenImporter,
} from './type.js';
import { isValidAsJSIdentifier } from './util.js';

Expand Down Expand Up @@ -40,10 +39,7 @@ export function checkCSSModule(
const from = resolver(tokenImporter.from, { request: cssModule.fileName });
if (!from || !matchesPattern(from)) continue;
const imported = getCSSModule(from);
if (!imported) {
diagnostics.push(createCannotImportModuleDiagnostic(cssModule, tokenImporter));
continue;
}
if (!imported) continue;

if (tokenImporter.type === 'value') {
const exportRecord = exportBuilder.build(imported);
Expand Down Expand Up @@ -77,16 +73,6 @@ export function checkCSSModule(
return diagnostics;
}

function createCannotImportModuleDiagnostic(cssModule: CSSModule, tokenImporter: TokenImporter): Diagnostic {
return {
text: `Cannot import module '${tokenImporter.from}'`,
category: 'error',
file: { fileName: cssModule.fileName, text: cssModule.text },
start: { line: tokenImporter.fromLoc.start.line, column: tokenImporter.fromLoc.start.column },
length: tokenImporter.fromLoc.end.offset - tokenImporter.fromLoc.start.offset,
};
}

function createModuleHasNoExportedTokenDiagnostic(
cssModule: CSSModule,
tokenImporter: AtValueTokenImporter,
Expand Down
14 changes: 0 additions & 14 deletions packages/ts-plugin/e2e-test/feature/semantic-diagnostics.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -79,20 +79,6 @@ test('Semantic Diagnostics', async () => {
},
"text": "Module './c.module.css' has no exported token 'c_3'.",
},
{
"category": "error",
"code": 0,
"end": {
"line": 5,
"offset": 24,
},
"source": "css-modules-kit",
"start": {
"line": 5,
"offset": 10,
},
"text": "Cannot import module './d.module.css'",
},
]
`);
});