Add Sass tests (#1919)
This commit is contained in:
parent
1304518b74
commit
d3476f24d4
37 changed files with 483 additions and 200 deletions
5
.changeset/cool-knives-fry.md
Normal file
5
.changeset/cool-knives-fry.md
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
---
|
||||||
|
'astro': patch
|
||||||
|
---
|
||||||
|
|
||||||
|
Bump Sass dependency version
|
|
@ -90,7 +90,7 @@
|
||||||
"rehype-slug": "^5.0.0",
|
"rehype-slug": "^5.0.0",
|
||||||
"resolve": "^1.20.0",
|
"resolve": "^1.20.0",
|
||||||
"rollup": "^2.57.0",
|
"rollup": "^2.57.0",
|
||||||
"sass": "^1.43.3",
|
"sass": "^1.43.4",
|
||||||
"semver": "^7.3.5",
|
"semver": "^7.3.5",
|
||||||
"send": "^0.17.1",
|
"send": "^0.17.1",
|
||||||
"shiki": "^0.9.10",
|
"shiki": "^0.9.10",
|
||||||
|
|
269
packages/astro/test/0-css.test.js
Normal file
269
packages/astro/test/0-css.test.js
Normal file
|
@ -0,0 +1,269 @@
|
||||||
|
/**
|
||||||
|
* CSS test
|
||||||
|
* Run this test first! This uses quite a bit of memory, so prefixing with `0-` helps it start and finish early,
|
||||||
|
* rather than trying to start up when all other threads are busy and having to fight for resources
|
||||||
|
*/
|
||||||
|
|
||||||
|
import { expect } from 'chai';
|
||||||
|
import cheerio from 'cheerio';
|
||||||
|
import { loadFixture } from './test-utils.js';
|
||||||
|
|
||||||
|
describe('Styles SSR', function () {
|
||||||
|
this.timeout(30000); // test needs a little more time in CI
|
||||||
|
|
||||||
|
let fixture;
|
||||||
|
let index$;
|
||||||
|
let bundledCSS;
|
||||||
|
|
||||||
|
before(async () => {
|
||||||
|
fixture = await loadFixture({
|
||||||
|
projectRoot: './fixtures/0-css/',
|
||||||
|
renderers: ['@astrojs/renderer-react', '@astrojs/renderer-svelte', '@astrojs/renderer-vue'],
|
||||||
|
});
|
||||||
|
await fixture.build();
|
||||||
|
|
||||||
|
// get bundled CSS (will be hashed, hence DOM query)
|
||||||
|
const html = await fixture.readFile('/index.html');
|
||||||
|
index$ = cheerio.load(html);
|
||||||
|
const bundledCSSHREF = index$('link[rel=stylesheet][href^=assets/]').attr('href');
|
||||||
|
bundledCSS = await fixture.readFile(bundledCSSHREF.replace(/^\/?/, '/'));
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Astro styles', () => {
|
||||||
|
it('HTML and CSS scoped correctly', async () => {
|
||||||
|
const $ = index$;
|
||||||
|
|
||||||
|
const el1 = $('#dynamic-class');
|
||||||
|
const el2 = $('#dynamic-vis');
|
||||||
|
const classes = $('#class').attr('class').split(' ');
|
||||||
|
const scopedClass = classes.find((name) => /^astro-[A-Za-z0-9-]+/.test(name));
|
||||||
|
|
||||||
|
// 1. check HTML
|
||||||
|
expect(el1.attr('class')).to.equal(`blue ${scopedClass}`);
|
||||||
|
expect(el2.attr('class')).to.equal(`visible ${scopedClass}`);
|
||||||
|
|
||||||
|
// 2. check CSS
|
||||||
|
expect(bundledCSS).to.include(`.blue.${scopedClass}{color:#b0e0e6}.color\\:blue.${scopedClass}{color:#b0e0e6}.visible.${scopedClass}{display:block}`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('No <style> skips scoping', async () => {
|
||||||
|
const $ = index$;
|
||||||
|
|
||||||
|
// Astro component without <style> should not include scoped class
|
||||||
|
expect($('#no-scope').attr('class')).to.equal(undefined);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Child inheritance', async () => {
|
||||||
|
const $ = index$;
|
||||||
|
|
||||||
|
expect($('#passed-in').attr('class')).to.match(/outer astro-[A-Z0-9]+ astro-[A-Z0-9]+/);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('Using hydrated components adds astro-root styles', async () => {
|
||||||
|
expect(bundledCSS).to.include('display:contents');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('<style lang="sass">', async () => {
|
||||||
|
expect(bundledCSS).to.match(new RegExp('h1.astro-[^{]*{color:#90ee90}'));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('<style lang="scss">', async () => {
|
||||||
|
expect(bundledCSS).to.match(new RegExp('h1.astro-[^{]*{color:#ff69b4}'));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Styles in src/', () => {
|
||||||
|
it('.css', async () => {
|
||||||
|
expect(bundledCSS).to.match(new RegExp('.linked-css[^{]*{color:gold'));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('.sass', async () => {
|
||||||
|
expect(bundledCSS).to.match(new RegExp('.linked-sass[^{]*{color:#789'));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('.scss', async () => {
|
||||||
|
expect(bundledCSS).to.match(new RegExp('.linked-scss[^{]*{color:#6b8e23'));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('JSX', () => {
|
||||||
|
it('.css', async () => {
|
||||||
|
const $ = index$;
|
||||||
|
const el = $('#react-css');
|
||||||
|
|
||||||
|
// 1. check HTML
|
||||||
|
expect(el.attr('class')).to.include('react-title');
|
||||||
|
|
||||||
|
// 2. check CSS
|
||||||
|
expect(bundledCSS).to.include('.react-title{');
|
||||||
|
});
|
||||||
|
|
||||||
|
it('.module.css', async () => {
|
||||||
|
const $ = index$;
|
||||||
|
const el = $('#react-module-css');
|
||||||
|
const classes = el.attr('class').split(' ');
|
||||||
|
const moduleClass = classes.find((name) => /^_title_[A-Za-z0-9-_]+/.test(name));
|
||||||
|
|
||||||
|
// 1. check HTML
|
||||||
|
expect(el.attr('class')).to.include(moduleClass);
|
||||||
|
|
||||||
|
// 2. check CSS
|
||||||
|
expect(bundledCSS).to.match(new RegExp(`.${moduleClass}[^{]*{font-family:fantasy}`));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('.sass', async () => {
|
||||||
|
const $ = index$;
|
||||||
|
const el = $('#react-sass');
|
||||||
|
|
||||||
|
// 1. check HTML
|
||||||
|
expect(el.attr('class')).to.include('react-sass-title');
|
||||||
|
|
||||||
|
// 2. check CSS
|
||||||
|
expect(bundledCSS).to.match(new RegExp(`.react-sass-title[^{]*{font-family:fantasy}`));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('.scss', async () => {
|
||||||
|
const $ = index$;
|
||||||
|
const el = $('#react-scss');
|
||||||
|
|
||||||
|
// 1. check HTML
|
||||||
|
expect(el.attr('class')).to.include('react-scss-title');
|
||||||
|
|
||||||
|
// 2. check CSS
|
||||||
|
expect(bundledCSS).to.match(new RegExp(`.react-scss-title[^{]*{font-family:fantasy}`));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('.module.sass', async () => {
|
||||||
|
const $ = index$;
|
||||||
|
const el = $('#react-module-sass');
|
||||||
|
const classes = el.attr('class').split(' ');
|
||||||
|
const moduleClass = classes.find((name) => /^_title_[A-Za-z0-9-_]+/.test(name));
|
||||||
|
|
||||||
|
// 1. check HTML
|
||||||
|
expect(el.attr('class')).to.include(moduleClass);
|
||||||
|
|
||||||
|
// 2. check CSS
|
||||||
|
expect(bundledCSS).to.match(new RegExp(`.${moduleClass}[^{]*{font-family:fantasy}`));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('.module.scss', async () => {
|
||||||
|
const $ = index$;
|
||||||
|
const el = $('#react-module-scss');
|
||||||
|
const classes = el.attr('class').split(' ');
|
||||||
|
const moduleClass = classes.find((name) => /^_title_[A-Za-z0-9-_]+/.test(name));
|
||||||
|
|
||||||
|
// 1. check HTML
|
||||||
|
expect(el.attr('class')).to.include(moduleClass);
|
||||||
|
|
||||||
|
// 2. check CSS
|
||||||
|
expect(bundledCSS).to.match(new RegExp(`.${moduleClass}[^{]*{font-family:fantasy}`));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Vue', () => {
|
||||||
|
it('<style>', async () => {
|
||||||
|
const $ = index$;
|
||||||
|
const el = $('#vue-css');
|
||||||
|
|
||||||
|
// 1. check HTML
|
||||||
|
expect(el.attr('class')).to.include('vue-css');
|
||||||
|
|
||||||
|
// 2. check CSS
|
||||||
|
expect(bundledCSS).to.match(new RegExp(`.vue-css[^{]*{font-family:cursive`));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('<style scoped>', async () => {
|
||||||
|
const $ = index$;
|
||||||
|
const el = $('#vue-scoped');
|
||||||
|
|
||||||
|
// find data-v-* attribute (how Vue CSS scoping works)
|
||||||
|
const { attribs } = el.get(0);
|
||||||
|
const scopeId = Object.keys(attribs).find((k) => k.startsWith('data-v-'));
|
||||||
|
expect(scopeId).to.be.ok;
|
||||||
|
|
||||||
|
// 1. check HTML
|
||||||
|
expect(el.attr('class')).to.include('vue-scoped');
|
||||||
|
|
||||||
|
// 2. check CSS
|
||||||
|
expect(bundledCSS).to.include(`.vue-scoped[${scopeId}]`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('<style module>', async () => {
|
||||||
|
const $ = index$;
|
||||||
|
const el = $('#vue-modules');
|
||||||
|
const classes = el.attr('class').split(' ');
|
||||||
|
const moduleClass = classes.find((name) => /^_title_[A-Za-z0-9-_]+/.test(name));
|
||||||
|
|
||||||
|
// 1. check HTML
|
||||||
|
expect(el.attr('class')).to.include(moduleClass);
|
||||||
|
|
||||||
|
// 2. check CSS
|
||||||
|
expect(bundledCSS).to.include(`${moduleClass}{`);
|
||||||
|
});
|
||||||
|
|
||||||
|
it('<style lang="sass">', async () => {
|
||||||
|
const $ = index$;
|
||||||
|
const el = $('#vue-sass');
|
||||||
|
|
||||||
|
// 1. check HTML
|
||||||
|
expect(el.attr('class')).to.include('vue-sass');
|
||||||
|
|
||||||
|
// 2. check CSS
|
||||||
|
expect(bundledCSS).to.match(new RegExp(`.vue-sass[^{]*{font-family:cursive`));
|
||||||
|
});
|
||||||
|
|
||||||
|
it('<style lang="scss">', async () => {
|
||||||
|
const $ = index$;
|
||||||
|
const el = $('#vue-scss');
|
||||||
|
|
||||||
|
// 1. check HTML
|
||||||
|
expect(el.attr('class')).to.include('vue-scss');
|
||||||
|
|
||||||
|
// 2. check CSS
|
||||||
|
expect(bundledCSS).to.match(new RegExp(`.vue-scss[^{]*{font-family:cursive`));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
describe('Svelte', () => {
|
||||||
|
it('<style>', async () => {
|
||||||
|
const $ = index$;
|
||||||
|
const el = $('#svelte-css');
|
||||||
|
const classes = el.attr('class').split(' ');
|
||||||
|
const scopedClass = classes.find((name) => /^s-[A-Za-z0-9-]+/.test(name));
|
||||||
|
|
||||||
|
// 1. check HTML
|
||||||
|
expect(el.attr('class')).to.include('svelte-css');
|
||||||
|
|
||||||
|
// 2. check CSS
|
||||||
|
expect(bundledCSS).to.match(new RegExp(`.svelte-css.${scopedClass}[^{]*{font-family:"Comic Sans MS"`));
|
||||||
|
});
|
||||||
|
|
||||||
|
// TODO: fix Sass in Svelte
|
||||||
|
it.skip('<style lang="sass">', async () => {
|
||||||
|
const $ = index$;
|
||||||
|
const el = $('#svelte-sass');
|
||||||
|
const classes = el.attr('class').split(' ');
|
||||||
|
const scopedClass = classes.find((name) => /^s-[A-Za-z0-9-]+/.test(name));
|
||||||
|
|
||||||
|
// 1. check HTML
|
||||||
|
expect(el.attr('class')).to.include('svelte-sass');
|
||||||
|
|
||||||
|
// 2. check CSS
|
||||||
|
expect(bundledCSS).to.match(new RegExp(`.svelte-sass.${scopedClass}[^{]*{font-family:"Comic Sans MS"`));
|
||||||
|
});
|
||||||
|
|
||||||
|
// TODO: fix Sass in Svelte
|
||||||
|
it.skip('<style lang="scss">', async () => {
|
||||||
|
const $ = index$;
|
||||||
|
const el = $('#svelte-scss');
|
||||||
|
const classes = el.attr('class').split(' ');
|
||||||
|
const scopedClass = classes.find((name) => /^s-[A-Za-z0-9-]+/.test(name));
|
||||||
|
|
||||||
|
// 1. check HTML
|
||||||
|
expect(el.attr('class')).to.include('svelte-scss');
|
||||||
|
|
||||||
|
// 2. check CSS
|
||||||
|
expect(bundledCSS).to.match(new RegExp(`.svelte-scss.${scopedClass}[^{]*{font-family:"Comic Sans MS"`));
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
|
@ -1,141 +0,0 @@
|
||||||
import { expect } from 'chai';
|
|
||||||
import cheerio from 'cheerio';
|
|
||||||
import { loadFixture } from './test-utils.js';
|
|
||||||
|
|
||||||
describe('Styles SSR', function () {
|
|
||||||
let fixture;
|
|
||||||
let index$;
|
|
||||||
let bundledCSS;
|
|
||||||
|
|
||||||
before(async () => {
|
|
||||||
fixture = await loadFixture({
|
|
||||||
projectRoot: './fixtures/astro-styles-ssr/',
|
|
||||||
renderers: ['@astrojs/renderer-react', '@astrojs/renderer-svelte', '@astrojs/renderer-vue'],
|
|
||||||
});
|
|
||||||
await fixture.build();
|
|
||||||
|
|
||||||
// get bundled CSS (will be hashed, hence DOM query)
|
|
||||||
const html = await fixture.readFile('/index.html');
|
|
||||||
index$ = cheerio.load(html);
|
|
||||||
const bundledCSSHREF = index$('link[rel=stylesheet][href^=assets/]').attr('href');
|
|
||||||
bundledCSS = await fixture.readFile(bundledCSSHREF.replace(/^\/?/, '/'));
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Astro styles', () => {
|
|
||||||
it('HTML and CSS scoped correctly', async () => {
|
|
||||||
const $ = index$;
|
|
||||||
|
|
||||||
const el1 = $('#dynamic-class');
|
|
||||||
const el2 = $('#dynamic-vis');
|
|
||||||
const classes = $('#class').attr('class').split(' ');
|
|
||||||
const scopedClass = classes.find((name) => /^astro-[A-Za-z0-9-]+/.test(name));
|
|
||||||
|
|
||||||
// 1. check HTML
|
|
||||||
expect(el1.attr('class')).to.equal(`blue ${scopedClass}`);
|
|
||||||
expect(el2.attr('class')).to.equal(`visible ${scopedClass}`);
|
|
||||||
|
|
||||||
// 2. check CSS
|
|
||||||
expect(bundledCSS).to.include(`.blue.${scopedClass}{color:#b0e0e6}.color\\:blue.${scopedClass}{color:#b0e0e6}.visible.${scopedClass}{display:block}`);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('No <style> skips scoping', async () => {
|
|
||||||
const $ = index$;
|
|
||||||
|
|
||||||
// Astro component without <style> should not include scoped class
|
|
||||||
expect($('#no-scope').attr('class')).to.equal(undefined);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Child inheritance', async () => {
|
|
||||||
const $ = index$;
|
|
||||||
|
|
||||||
expect($('#passed-in').attr('class')).to.match(/outer astro-[A-Z0-9]+ astro-[A-Z0-9]+/);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Using hydrated components adds astro-root styles', async () => {
|
|
||||||
expect(bundledCSS).to.include('display:contents');
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('JSX', () => {
|
|
||||||
it('CSS', async () => {
|
|
||||||
const $ = index$;
|
|
||||||
const el = $('#react-css');
|
|
||||||
|
|
||||||
// 1. check HTML
|
|
||||||
expect(el.attr('class')).to.include('react-title');
|
|
||||||
|
|
||||||
// 2. check CSS
|
|
||||||
expect(bundledCSS).to.include('.react-title{');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('CSS Modules', async () => {
|
|
||||||
const $ = index$;
|
|
||||||
const el = $('#react-modules');
|
|
||||||
const classes = el.attr('class').split(' ');
|
|
||||||
const moduleClass = classes.find((name) => /^_title_[A-Za-z0-9-_]+/.test(name));
|
|
||||||
|
|
||||||
// 1. check HTML
|
|
||||||
expect(el.attr('class')).to.include(moduleClass);
|
|
||||||
|
|
||||||
// 2. check CSS
|
|
||||||
expect(bundledCSS).to.include(`.${moduleClass}{`);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Vue', () => {
|
|
||||||
it('CSS', async () => {
|
|
||||||
const $ = index$;
|
|
||||||
const el = $('#vue-css');
|
|
||||||
|
|
||||||
// 1. check HTML
|
|
||||||
expect(el.attr('class')).to.include('vue-title');
|
|
||||||
|
|
||||||
// 2. check CSS
|
|
||||||
expect(bundledCSS).to.include('.vue-title{');
|
|
||||||
});
|
|
||||||
|
|
||||||
it('Scoped styles', async () => {
|
|
||||||
const $ = index$;
|
|
||||||
const el = $('#vue-scoped');
|
|
||||||
|
|
||||||
// find data-v-* attribute (how Vue CSS scoping works)
|
|
||||||
const { attribs } = el.get(0);
|
|
||||||
const scopeId = Object.keys(attribs).find((k) => k.startsWith('data-v-'));
|
|
||||||
expect(scopeId).to.be.ok;
|
|
||||||
|
|
||||||
// 1. check HTML
|
|
||||||
expect(el.attr('class')).to.include('vue-scoped');
|
|
||||||
|
|
||||||
// 2. check CSS
|
|
||||||
expect(bundledCSS).to.include(`.vue-scoped[${scopeId}]`);
|
|
||||||
});
|
|
||||||
|
|
||||||
it('CSS Modules', async () => {
|
|
||||||
const $ = index$;
|
|
||||||
const el = $('#vue-modules');
|
|
||||||
const classes = el.attr('class').split(' ');
|
|
||||||
const moduleClass = classes.find((name) => /^_title_[A-Za-z0-9-_]+/.test(name));
|
|
||||||
|
|
||||||
// 1. check HTML
|
|
||||||
expect(el.attr('class')).to.include(moduleClass);
|
|
||||||
|
|
||||||
// 2. check CSS
|
|
||||||
expect(bundledCSS).to.include(`${moduleClass}{`);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Svelte', () => {
|
|
||||||
it('Scoped styles', async () => {
|
|
||||||
const $ = index$;
|
|
||||||
const el = $('#svelte-scoped');
|
|
||||||
const classes = el.attr('class').split(' ');
|
|
||||||
const scopedClass = classes.find((name) => /^s-[A-Za-z0-9-]+/.test(name));
|
|
||||||
|
|
||||||
// 1. check HTML
|
|
||||||
expect(el.attr('class')).to.include('svelte-title');
|
|
||||||
|
|
||||||
// 2. check CSS
|
|
||||||
expect(bundledCSS).to.include(`.svelte-title.${scopedClass}`);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
8
packages/astro/test/fixtures/0-css/src/components/AstroSass.astro
vendored
Normal file
8
packages/astro/test/fixtures/0-css/src/components/AstroSass.astro
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
<style lang="sass">
|
||||||
|
$color: #90ee90
|
||||||
|
|
||||||
|
h1
|
||||||
|
color: $color
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<h1>Color</h1>
|
9
packages/astro/test/fixtures/0-css/src/components/AstroScss.astro
vendored
Normal file
9
packages/astro/test/fixtures/0-css/src/components/AstroScss.astro
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<style lang="scss">
|
||||||
|
$color: #ff69b4;
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
color: $color;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<h1>Color</h1>
|
|
@ -3,7 +3,7 @@ import Styles from './ReactModules.module.css';
|
||||||
|
|
||||||
function ReactModules() {
|
function ReactModules() {
|
||||||
return (
|
return (
|
||||||
<h1 id="react-modules" className={Styles.title}>
|
<h1 id="react-module-css" className={Styles.title}>
|
||||||
React Modules
|
React Modules
|
||||||
</h1>
|
</h1>
|
||||||
);
|
);
|
4
packages/astro/test/fixtures/0-css/src/components/ReactModules.module.sass
vendored
Normal file
4
packages/astro/test/fixtures/0-css/src/components/ReactModules.module.sass
vendored
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
$font-family: fantasy
|
||||||
|
|
||||||
|
.title
|
||||||
|
font-family: $font-family
|
5
packages/astro/test/fixtures/0-css/src/components/ReactModules.module.scss
vendored
Normal file
5
packages/astro/test/fixtures/0-css/src/components/ReactModules.module.scss
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
$font-family: fantasy;
|
||||||
|
|
||||||
|
.title {
|
||||||
|
font-family: $font-family;
|
||||||
|
}
|
11
packages/astro/test/fixtures/0-css/src/components/ReactModulesSass.jsx
vendored
Normal file
11
packages/astro/test/fixtures/0-css/src/components/ReactModulesSass.jsx
vendored
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
import React from 'react';
|
||||||
|
import Styles from './ReactModules.module.sass';
|
||||||
|
|
||||||
|
function ReactModules() {
|
||||||
|
return (
|
||||||
|
<h1 id="react-module-sass" className={Styles.title}>
|
||||||
|
React Modules
|
||||||
|
</h1>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
export default ReactModules;
|
11
packages/astro/test/fixtures/0-css/src/components/ReactModulesScss.jsx
vendored
Normal file
11
packages/astro/test/fixtures/0-css/src/components/ReactModulesScss.jsx
vendored
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
import React from 'react';
|
||||||
|
import Styles from './ReactModules.module.scss';
|
||||||
|
|
||||||
|
function ReactModules() {
|
||||||
|
return (
|
||||||
|
<h1 id="react-module-scss" className={Styles.title}>
|
||||||
|
React Modules
|
||||||
|
</h1>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
export default ReactModules;
|
11
packages/astro/test/fixtures/0-css/src/components/ReactSass.jsx
vendored
Normal file
11
packages/astro/test/fixtures/0-css/src/components/ReactSass.jsx
vendored
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
import React from 'react';
|
||||||
|
import './ReactSass.sass';
|
||||||
|
|
||||||
|
function ReactCSS() {
|
||||||
|
return (
|
||||||
|
<h1 id="react-sass" className="react-sass-title">
|
||||||
|
React Global Sass
|
||||||
|
</h1>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
export default ReactCSS;
|
5
packages/astro/test/fixtures/0-css/src/components/ReactSass.sass
vendored
Normal file
5
packages/astro/test/fixtures/0-css/src/components/ReactSass.sass
vendored
Normal file
|
@ -0,0 +1,5 @@
|
||||||
|
$font-family: fantasy
|
||||||
|
|
||||||
|
.react-sass-title
|
||||||
|
font-family: $font-family
|
||||||
|
|
11
packages/astro/test/fixtures/0-css/src/components/ReactScss.jsx
vendored
Normal file
11
packages/astro/test/fixtures/0-css/src/components/ReactScss.jsx
vendored
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
import React from 'react';
|
||||||
|
import './ReactScss.scss';
|
||||||
|
|
||||||
|
function ReactCSS() {
|
||||||
|
return (
|
||||||
|
<h1 id="react-scss" className="react-scss-title">
|
||||||
|
React Global Scss
|
||||||
|
</h1>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
export default ReactCSS;
|
6
packages/astro/test/fixtures/0-css/src/components/ReactScss.scss
vendored
Normal file
6
packages/astro/test/fixtures/0-css/src/components/ReactScss.scss
vendored
Normal file
|
@ -0,0 +1,6 @@
|
||||||
|
$font-family: fantasy;
|
||||||
|
|
||||||
|
.react-scss-title {
|
||||||
|
font-family: $font-family;
|
||||||
|
}
|
||||||
|
|
7
packages/astro/test/fixtures/0-css/src/components/SvelteCSS.svelte
vendored
Normal file
7
packages/astro/test/fixtures/0-css/src/components/SvelteCSS.svelte
vendored
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
<h1 id="svelte-css" class="svelte-css">Svelte Scoped CSS</h1>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.svelte-css {
|
||||||
|
font-family: 'Comic Sans MS', sans-serif;
|
||||||
|
}
|
||||||
|
</style>
|
8
packages/astro/test/fixtures/0-css/src/components/SvelteSass.svelte
vendored
Normal file
8
packages/astro/test/fixtures/0-css/src/components/SvelteSass.svelte
vendored
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
<h1 id="svelte-sass" class="svelte-sass">Svelte Scoped Sass</h1>
|
||||||
|
|
||||||
|
<style lang="sass">
|
||||||
|
$font-family: 'Comic Sans MS', sans-serif
|
||||||
|
|
||||||
|
.svelte-sass
|
||||||
|
font-family: $font-family
|
||||||
|
</style>
|
9
packages/astro/test/fixtures/0-css/src/components/SvelteScss.svelte
vendored
Normal file
9
packages/astro/test/fixtures/0-css/src/components/SvelteScss.svelte
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<h1 id="svelte-scss" class="svelte-scss">Svelte Scoped Scss</h1>
|
||||||
|
|
||||||
|
<style lang="scss">
|
||||||
|
$font-family: 'Comic Sans MS', sans-serif;
|
||||||
|
|
||||||
|
.svelte-scss {
|
||||||
|
font-family: $font-family;
|
||||||
|
}
|
||||||
|
</style>
|
9
packages/astro/test/fixtures/0-css/src/components/VueCSS.vue
vendored
Normal file
9
packages/astro/test/fixtures/0-css/src/components/VueCSS.vue
vendored
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
<style>
|
||||||
|
.vue-css {
|
||||||
|
font-family: cursive;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<h1 id="vue-css" class="vue-css">Vue Global CSS</h1>
|
||||||
|
</template>
|
10
packages/astro/test/fixtures/0-css/src/components/VueSass.vue
vendored
Normal file
10
packages/astro/test/fixtures/0-css/src/components/VueSass.vue
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
<style lang="sass">
|
||||||
|
$font-family: cursive
|
||||||
|
|
||||||
|
.vue-sass
|
||||||
|
font-family: $font-family
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<h1 id="vue-sass" class="vue-sass">Vue Sass</h1>
|
||||||
|
</template>
|
11
packages/astro/test/fixtures/0-css/src/components/VueScss.vue
vendored
Normal file
11
packages/astro/test/fixtures/0-css/src/components/VueScss.vue
vendored
Normal file
|
@ -0,0 +1,11 @@
|
||||||
|
<style lang="scss">
|
||||||
|
$font-family: cursive;
|
||||||
|
|
||||||
|
.vue-scss {
|
||||||
|
font-family: $font-family;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<h1 id="vue-scss" class="vue-scss">Vue Sass</h1>
|
||||||
|
</template>
|
63
packages/astro/test/fixtures/0-css/src/pages/index.astro
vendored
Normal file
63
packages/astro/test/fixtures/0-css/src/pages/index.astro
vendored
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
---
|
||||||
|
import AstroComponent from '../components/Astro.astro';
|
||||||
|
import AstroComponentNone from '../components/AstroNone.astro';
|
||||||
|
import AstroSass from '../components/AstroSass.astro';
|
||||||
|
import AstroScss from '../components/AstroScss.astro';
|
||||||
|
import ReactCSS from '../components/ReactCSS.jsx';
|
||||||
|
import ReactModules from '../components/ReactModules.jsx';
|
||||||
|
import ReactModulesSass from '../components/ReactModulesSass.jsx';
|
||||||
|
import ReactModulesScss from '../components/ReactModulesScss.jsx';
|
||||||
|
import ReactSass from '../components/ReactSass.jsx';
|
||||||
|
import ReactScss from '../components/ReactScss.jsx';
|
||||||
|
import VueCSS from '../components/VueCSS.vue';
|
||||||
|
import VueModules from '../components/VueModules.vue';
|
||||||
|
import VueSass from '../components/VueSass.vue';
|
||||||
|
import VueScoped from '../components/VueScoped.vue';
|
||||||
|
import VueScss from '../components/VueScss.vue';
|
||||||
|
import SvelteCSS from '../components/SvelteCSS.svelte';
|
||||||
|
// import SvelteSass from '../components/SvelteSass.svelte';
|
||||||
|
// import SvelteScss from '../components/SvelteScss.svelte';
|
||||||
|
import ReactDynamic from '../components/ReactDynamic.jsx';
|
||||||
|
---
|
||||||
|
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8" />
|
||||||
|
<style lang="scss">
|
||||||
|
.wrapper {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
max-width: 1200px;
|
||||||
|
}
|
||||||
|
.outer {
|
||||||
|
color: red;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
<link rel="stylesheet" type="text/css" href={Astro.resolve('../styles/linked.css')}>
|
||||||
|
<link rel="stylesheet" type="text/css" href={Astro.resolve('../styles/linked.scss')}>
|
||||||
|
<link rel="stylesheet" type="text/css" href={Astro.resolve('../styles/linked.sass')}>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div class="wrapper">
|
||||||
|
<AstroComponent class="outer" />
|
||||||
|
<AstroComponentNone />
|
||||||
|
<AstroSass />
|
||||||
|
<AstroScss />
|
||||||
|
<ReactCSS />
|
||||||
|
<ReactModules />
|
||||||
|
<ReactModulesSass />
|
||||||
|
<ReactModulesScss />
|
||||||
|
<ReactSass />
|
||||||
|
<ReactScss />
|
||||||
|
<VueCSS />
|
||||||
|
<VueModules />
|
||||||
|
<VueSass />
|
||||||
|
<VueScoped />
|
||||||
|
<VueScss />
|
||||||
|
<SvelteCSS />
|
||||||
|
<!-- <SvelteSass />
|
||||||
|
<SvelteScss /> -->
|
||||||
|
<ReactDynamic client:load />
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
3
packages/astro/test/fixtures/0-css/src/styles/linked.css
vendored
Normal file
3
packages/astro/test/fixtures/0-css/src/styles/linked.css
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
.linked-css {
|
||||||
|
color: gold;
|
||||||
|
}
|
2
packages/astro/test/fixtures/0-css/src/styles/linked.sass
vendored
Normal file
2
packages/astro/test/fixtures/0-css/src/styles/linked.sass
vendored
Normal file
|
@ -0,0 +1,2 @@
|
||||||
|
.linked-sass
|
||||||
|
color: #778899
|
3
packages/astro/test/fixtures/0-css/src/styles/linked.scss
vendored
Normal file
3
packages/astro/test/fixtures/0-css/src/styles/linked.scss
vendored
Normal file
|
@ -0,0 +1,3 @@
|
||||||
|
.linked-scss {
|
||||||
|
color: #6b8e23;
|
||||||
|
}
|
|
@ -1,7 +0,0 @@
|
||||||
<h1 id="svelte-scoped" class="svelte-title">Svelte Scoped CSS</h1>
|
|
||||||
|
|
||||||
<style lang="scss">
|
|
||||||
.svelte-title {
|
|
||||||
font-family: 'Comic Sans MS', sans-serif;
|
|
||||||
}
|
|
||||||
</style>
|
|
|
@ -1,9 +0,0 @@
|
||||||
<style>
|
|
||||||
.vue-title {
|
|
||||||
font-family: cursive;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<h1 id="vue-css" class="vue-title">Vue Global CSS</h1>
|
|
||||||
</template>
|
|
|
@ -1,40 +0,0 @@
|
||||||
---
|
|
||||||
import AstroComponent from '../components/Astro.astro';
|
|
||||||
import AstroComponentNone from '../components/AstroNone.astro';
|
|
||||||
import ReactCSS from '../components/ReactCSS.jsx';
|
|
||||||
import ReactModules from '../components/ReactModules.jsx';
|
|
||||||
import VueCSS from '../components/VueCSS.vue';
|
|
||||||
import VueScoped from '../components/VueScoped.vue';
|
|
||||||
import VueModules from '../components/VueModules.vue';
|
|
||||||
import SvelteScoped from '../components/SvelteScoped.svelte';
|
|
||||||
import ReactDynamic from '../components/ReactDynamic.jsx';
|
|
||||||
---
|
|
||||||
|
|
||||||
<html>
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<style lang="scss">
|
|
||||||
.wrapper {
|
|
||||||
margin-left: auto;
|
|
||||||
margin-right: auto;
|
|
||||||
max-width: 1200px;
|
|
||||||
}
|
|
||||||
.outer {
|
|
||||||
color: red;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div class="wrapper">
|
|
||||||
<AstroComponent class="outer" />
|
|
||||||
<AstroComponentNone />
|
|
||||||
<ReactCSS />
|
|
||||||
<ReactModules />
|
|
||||||
<VueCSS />
|
|
||||||
<VueScoped />
|
|
||||||
<VueModules />
|
|
||||||
<SvelteScoped />
|
|
||||||
<ReactDynamic client:load />
|
|
||||||
</div>
|
|
||||||
</body>
|
|
||||||
</html>
|
|
|
@ -8906,7 +8906,7 @@ safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.2, safe-buffer@^5.2.1,
|
||||||
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
|
resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a"
|
||||||
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
|
integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==
|
||||||
|
|
||||||
sass@^1.43.3:
|
sass@^1.43.4:
|
||||||
version "1.43.4"
|
version "1.43.4"
|
||||||
resolved "https://registry.yarnpkg.com/sass/-/sass-1.43.4.tgz#68c7d6a1b004bef49af0d9caf750e9b252105d1f"
|
resolved "https://registry.yarnpkg.com/sass/-/sass-1.43.4.tgz#68c7d6a1b004bef49af0d9caf750e9b252105d1f"
|
||||||
integrity sha512-/ptG7KE9lxpGSYiXn7Ar+lKOv37xfWsZRtFYal2QHNigyVQDx685VFT/h7ejVr+R8w7H4tmUgtulsKl5YpveOg==
|
integrity sha512-/ptG7KE9lxpGSYiXn7Ar+lKOv37xfWsZRtFYal2QHNigyVQDx685VFT/h7ejVr+R8w7H4tmUgtulsKl5YpveOg==
|
||||||
|
|
Loading…
Reference in a new issue