Take dynamic imports into account for CSS ordering (#6176)
* Take dynamic imports into account for CSS ordering * Adding a changeset * updated lockfile
This commit is contained in:
parent
334da38c56
commit
8bbdcf17dd
12 changed files with 101 additions and 3 deletions
5
.changeset/happy-dragons-invite.md
Normal file
5
.changeset/happy-dragons-invite.md
Normal file
|
@ -0,0 +1,5 @@
|
|||
---
|
||||
'astro': patch
|
||||
---
|
||||
|
||||
Take dynamic import into account in CSS ordering
|
|
@ -16,8 +16,17 @@ export function* walkParentInfos(
|
|||
const info = ctx.getModuleInfo(id);
|
||||
if (info) {
|
||||
if (childId) {
|
||||
order += info.importedIds.indexOf(childId);
|
||||
const idx = info.importedIds.indexOf(childId);
|
||||
if(idx === -1) {
|
||||
// Dynamic imports come after all normal imports. So first add the number of normal imports.
|
||||
order += info.importedIds.length;
|
||||
// Then add on the dynamic ones.
|
||||
order += info.dynamicallyImportedIds.indexOf(childId);
|
||||
} else {
|
||||
order += idx;
|
||||
}
|
||||
}
|
||||
|
||||
yield [info, depth, order];
|
||||
}
|
||||
if (until?.(id)) return;
|
||||
|
|
|
@ -39,8 +39,8 @@ describe('CSS ordering - import order', () => {
|
|||
* @param {string} href
|
||||
* @returns {Promise<{ href: string; css: string; }>}
|
||||
*/
|
||||
async function getLinkContent(href) {
|
||||
const css = await fixture.readFile(href);
|
||||
async function getLinkContent(href, f = fixture) {
|
||||
const css = await f.readFile(href);
|
||||
return { href, css };
|
||||
}
|
||||
|
||||
|
@ -107,4 +107,23 @@ describe('CSS ordering - import order', () => {
|
|||
expect(idx2).to.be.greaterThan(idx3);
|
||||
});
|
||||
});
|
||||
|
||||
describe('Dynamic import', () => {
|
||||
// eslint-disable-next-line @typescript-eslint/no-shadow
|
||||
let fixture;
|
||||
before(async () => {
|
||||
fixture = await loadFixture({
|
||||
root: './fixtures/css-order-dynamic-import/',
|
||||
});
|
||||
await fixture.build();
|
||||
});
|
||||
|
||||
it('dynamic imports taken into account', async () => {
|
||||
let html = await fixture.readFile('/one/index.html');
|
||||
const content = await Promise.all(getLinks(html).map((href) => getLinkContent(href, fixture)));
|
||||
let [link1, link2] = content;
|
||||
expect(link1.css).to.contain('aliceblue');
|
||||
expect(link2.css).to.contain('yellow');
|
||||
});
|
||||
});
|
||||
});
|
||||
|
|
6
packages/astro/test/fixtures/css-order-dynamic-import/package.json
vendored
Normal file
6
packages/astro/test/fixtures/css-order-dynamic-import/package.json
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
{
|
||||
"name": "@test/css-order-import",
|
||||
"dependencies": {
|
||||
"astro": "workspace:*"
|
||||
}
|
||||
}
|
4
packages/astro/test/fixtures/css-order-dynamic-import/src/components/One.astro
vendored
Normal file
4
packages/astro/test/fixtures/css-order-dynamic-import/src/components/One.astro
vendored
Normal file
|
@ -0,0 +1,4 @@
|
|||
---
|
||||
import '../styles/One.css';
|
||||
---
|
||||
<link>
|
6
packages/astro/test/fixtures/css-order-dynamic-import/src/components/Three.astro
vendored
Normal file
6
packages/astro/test/fixtures/css-order-dynamic-import/src/components/Three.astro
vendored
Normal file
|
@ -0,0 +1,6 @@
|
|||
---
|
||||
---
|
||||
<style>
|
||||
body { background: yellow;}
|
||||
</style>
|
||||
<div>testing</div>
|
5
packages/astro/test/fixtures/css-order-dynamic-import/src/components/Two.astro
vendored
Normal file
5
packages/astro/test/fixtures/css-order-dynamic-import/src/components/Two.astro
vendored
Normal file
|
@ -0,0 +1,5 @@
|
|||
<style>
|
||||
body {
|
||||
background: aliceblue;
|
||||
}
|
||||
</style>
|
13
packages/astro/test/fixtures/css-order-dynamic-import/src/pages/one.astro
vendored
Normal file
13
packages/astro/test/fixtures/css-order-dynamic-import/src/pages/one.astro
vendored
Normal file
|
@ -0,0 +1,13 @@
|
|||
---
|
||||
import '../components/One.astro';
|
||||
import '../components/Two.astro';
|
||||
await import('../components/Three.astro');
|
||||
---
|
||||
<html>
|
||||
<head>
|
||||
<title>Test</title>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Test</h1>
|
||||
</body>
|
||||
</html>
|
19
packages/astro/test/fixtures/css-order-dynamic-import/src/pages/two.astro
vendored
Normal file
19
packages/astro/test/fixtures/css-order-dynamic-import/src/pages/two.astro
vendored
Normal file
|
@ -0,0 +1,19 @@
|
|||
---
|
||||
import One from '../components/One.astro';
|
||||
import Two from '../components/Two.astro';
|
||||
---
|
||||
<html>
|
||||
<head>
|
||||
<title>Test</title>
|
||||
<One />
|
||||
<Two />
|
||||
<style>
|
||||
body {
|
||||
background: whitesmoke;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Test</h1>
|
||||
</body>
|
||||
</html>
|
3
packages/astro/test/fixtures/css-order-dynamic-import/src/styles/One.css
vendored
Normal file
3
packages/astro/test/fixtures/css-order-dynamic-import/src/styles/One.css
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
body {
|
||||
background: burlywood;
|
||||
}
|
3
packages/astro/test/fixtures/css-order-dynamic-import/src/styles/base.css
vendored
Normal file
3
packages/astro/test/fixtures/css-order-dynamic-import/src/styles/base.css
vendored
Normal file
|
@ -0,0 +1,3 @@
|
|||
body {
|
||||
background: green;
|
||||
}
|
|
@ -1708,6 +1708,12 @@ importers:
|
|||
dependencies:
|
||||
astro: link:../../..
|
||||
|
||||
packages/astro/test/fixtures/css-order-dynamic-import:
|
||||
specifiers:
|
||||
astro: workspace:*
|
||||
dependencies:
|
||||
astro: link:../../..
|
||||
|
||||
packages/astro/test/fixtures/css-order-import:
|
||||
specifiers:
|
||||
astro: workspace:*
|
||||
|
|
Loading…
Reference in a new issue