Build css with rust
This commit is contained in:
parent
a4ab4a7a42
commit
7c5b63fa2c
122
Cargo.lock
generated
122
Cargo.lock
generated
@ -967,6 +967,18 @@ dependencies = [
|
|||||||
"ascii_utils",
|
"ascii_utils",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "filetime"
|
||||||
|
version = "0.2.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f59efc38004c988e4201d11d263b8171f49a2e7ec0bdbb71773433f271504a5e"
|
||||||
|
dependencies = [
|
||||||
|
"cfg-if",
|
||||||
|
"libc",
|
||||||
|
"redox_syscall",
|
||||||
|
"winapi 0.3.8",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "flate2"
|
name = "flate2"
|
||||||
version = "1.0.14"
|
version = "1.0.14"
|
||||||
@ -1000,6 +1012,25 @@ version = "0.1.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
|
checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fsevent"
|
||||||
|
version = "0.4.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "5ab7d1bd1bd33cc98b0889831b72da23c0aa4df9cec7e0702f46ecea04b35db6"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags",
|
||||||
|
"fsevent-sys",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "fsevent-sys"
|
||||||
|
version = "2.0.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "f41b048a94555da0f42f1d632e2e19510084fb8e303b0daa2816e733fb3644a0"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fuchsia-cprng"
|
name = "fuchsia-cprng"
|
||||||
version = "0.1.1"
|
version = "0.1.1"
|
||||||
@ -1157,6 +1188,12 @@ dependencies = [
|
|||||||
"wasi",
|
"wasi",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "glob"
|
||||||
|
version = "0.3.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "gloo-timers"
|
name = "gloo-timers"
|
||||||
version = "0.2.1"
|
version = "0.2.1"
|
||||||
@ -1283,6 +1320,26 @@ dependencies = [
|
|||||||
"autocfg 1.0.0",
|
"autocfg 1.0.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "inotify"
|
||||||
|
version = "0.7.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "24e40d6fd5d64e2082e0c796495c8ef5ad667a96d03e5aaa0becfd9d47bcbfb8"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags",
|
||||||
|
"inotify-sys",
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "inotify-sys"
|
||||||
|
version = "0.1.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "e74a1aa87c59aeff6ef2cc2fa62d41bc43f54952f55652656b18a02fd5e356c0"
|
||||||
|
dependencies = [
|
||||||
|
"libc",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "iovec"
|
name = "iovec"
|
||||||
version = "0.1.4"
|
version = "0.1.4"
|
||||||
@ -1341,6 +1398,15 @@ dependencies = [
|
|||||||
"web-sys",
|
"web-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "jirs-css"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"clap",
|
||||||
|
"glob",
|
||||||
|
"notify",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "jirs-data"
|
name = "jirs-data"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
@ -1424,6 +1490,12 @@ version = "1.4.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lazycell"
|
||||||
|
version = "1.2.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b294d6fa9ee409a054354afc4352b0b9ef7ca222c69b8812cbea9e7d2bf3783f"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "lettre"
|
name = "lettre"
|
||||||
version = "0.9.2"
|
version = "0.9.2"
|
||||||
@ -1577,6 +1649,18 @@ dependencies = [
|
|||||||
"winapi 0.2.8",
|
"winapi 0.2.8",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "mio-extras"
|
||||||
|
version = "2.0.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "52403fe290012ce777c4626790c8951324a2b9e3316b3143779c72b029742f19"
|
||||||
|
dependencies = [
|
||||||
|
"lazycell",
|
||||||
|
"log 0.4.8",
|
||||||
|
"mio",
|
||||||
|
"slab",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "mio-uds"
|
name = "mio-uds"
|
||||||
version = "0.6.7"
|
version = "0.6.7"
|
||||||
@ -1639,6 +1723,24 @@ dependencies = [
|
|||||||
"version_check 0.1.5",
|
"version_check 0.1.5",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "notify"
|
||||||
|
version = "4.0.15"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "80ae4a7688d1fab81c5bf19c64fc8db920be8d519ce6336ed4e7efe024724dbd"
|
||||||
|
dependencies = [
|
||||||
|
"bitflags",
|
||||||
|
"filetime",
|
||||||
|
"fsevent",
|
||||||
|
"fsevent-sys",
|
||||||
|
"inotify",
|
||||||
|
"libc",
|
||||||
|
"mio",
|
||||||
|
"mio-extras",
|
||||||
|
"walkdir",
|
||||||
|
"winapi 0.3.8",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num-bigint"
|
name = "num-bigint"
|
||||||
version = "0.2.6"
|
version = "0.2.6"
|
||||||
@ -2189,6 +2291,15 @@ version = "0.3.3"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072"
|
checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "same-file"
|
||||||
|
version = "1.0.6"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502"
|
||||||
|
dependencies = [
|
||||||
|
"winapi-util",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "schannel"
|
name = "schannel"
|
||||||
version = "0.1.18"
|
version = "0.1.18"
|
||||||
@ -2713,6 +2824,17 @@ version = "0.9.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce"
|
checksum = "078775d0255232fb988e6fccf26ddc9d1ac274299aaedcedce21c6f72cc533ce"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "walkdir"
|
||||||
|
version = "2.3.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "777182bc735b6424e1a57516d35ed72cb8019d85c8c9bf536dccb3445c1a2f7d"
|
||||||
|
dependencies = [
|
||||||
|
"same-file",
|
||||||
|
"winapi 0.3.8",
|
||||||
|
"winapi-util",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasi"
|
name = "wasi"
|
||||||
version = "0.9.0+wasi-snapshot-preview1"
|
version = "0.9.0+wasi-snapshot-preview1"
|
||||||
|
@ -14,5 +14,6 @@ members = [
|
|||||||
"./jirs-server",
|
"./jirs-server",
|
||||||
"./jirs-client",
|
"./jirs-client",
|
||||||
"./jirs-data",
|
"./jirs-data",
|
||||||
|
"./jirs-css",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
"svgo": "^1.3.2",
|
"svgo": "^1.3.2",
|
||||||
"svgo-loader": "^2.2.1",
|
"svgo-loader": "^2.2.1",
|
||||||
"swc-loader": "^0.1.8",
|
"swc-loader": "^0.1.8",
|
||||||
|
"watchpack": "^1.6.1",
|
||||||
"webpack": "^4.42.1",
|
"webpack": "^4.42.1",
|
||||||
"webpack-cli": "^3.3.11",
|
"webpack-cli": "^3.3.11",
|
||||||
"webpack-dev-server": "^3.10.3"
|
"webpack-dev-server": "^3.10.3"
|
||||||
|
@ -40,9 +40,7 @@ module.exports = {
|
|||||||
MiniCssExtractPlugin.loader,
|
MiniCssExtractPlugin.loader,
|
||||||
{
|
{
|
||||||
loader: 'css-loader',
|
loader: 'css-loader',
|
||||||
// options: { importLoaders: 1 }
|
|
||||||
},
|
},
|
||||||
// 'postcss-loader'
|
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -6155,7 +6155,7 @@ vm-browserify@^1.0.1:
|
|||||||
resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
|
resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz#78641c488b8e6ca91a75f511e7a3b32a86e5dda0"
|
||||||
integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
|
integrity sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==
|
||||||
|
|
||||||
watchpack@^1.6.0:
|
watchpack@^1.6.0, watchpack@^1.6.1:
|
||||||
version "1.6.1"
|
version "1.6.1"
|
||||||
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.1.tgz#280da0a8718592174010c078c7585a74cd8cd0e2"
|
resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-1.6.1.tgz#280da0a8718592174010c078c7585a74cd8cd0e2"
|
||||||
integrity sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==
|
integrity sha512-+IF9hfUFOrYOOaKyfaI7h7dquUIOgyEMoQMLA7OP5FxegKA2+XdXThAZ9TU2kucfhDH7rfMHs1oPYziVGWRnZA==
|
||||||
|
12
jirs-css/Cargo.toml
Normal file
12
jirs-css/Cargo.toml
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
[package]
|
||||||
|
name = "jirs-css"
|
||||||
|
version = "0.1.0"
|
||||||
|
authors = ["Adrian Woźniak <adrian.wozniak.1986@gmail.com>"]
|
||||||
|
edition = "2018"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
clap = { version = "*", features = [] }
|
||||||
|
glob = { version = "*" }
|
||||||
|
notify = { version = "*" }
|
144
jirs-css/src/main.rs
Normal file
144
jirs-css/src/main.rs
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
use std::fs::*;
|
||||||
|
use std::io::Read;
|
||||||
|
use std::path::Path;
|
||||||
|
use std::time::SystemTime;
|
||||||
|
|
||||||
|
const INPUT: &str = "./jirs-client/js/styles.css";
|
||||||
|
|
||||||
|
#[derive(Debug, Default)]
|
||||||
|
struct Configuration {
|
||||||
|
input: String,
|
||||||
|
output: Option<String>,
|
||||||
|
watch: bool,
|
||||||
|
prelude_selector: bool,
|
||||||
|
files: Vec<String>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Configuration {
|
||||||
|
pub fn scan_fs(&mut self) -> Result<(), String> {
|
||||||
|
let input_dir = Path::new(self.input.as_str())
|
||||||
|
.parent()
|
||||||
|
.ok_or_else(|| format!("Not a valid path {:?}", self.input))?;
|
||||||
|
|
||||||
|
let path = input_dir.to_str().unwrap();
|
||||||
|
let paths =
|
||||||
|
glob::glob(format!("{}/**/*.css", path).as_str()).map_err(|e| format!("{}", e))?;
|
||||||
|
for path in paths.filter_map(Result::ok) {
|
||||||
|
self.files.push(path.display().to_string());
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn merge_files(input: &Path, out: &mut Vec<String>) -> Result<(), String> {
|
||||||
|
let input_dir = input
|
||||||
|
.clone()
|
||||||
|
.parent()
|
||||||
|
.ok_or_else(|| format!("Not a valid path {:?}", input))?;
|
||||||
|
let contents: String =
|
||||||
|
read_to_string(input).map_err(|_| format!("File cannot be read {:?}", input))?;
|
||||||
|
|
||||||
|
for line in contents.lines() {
|
||||||
|
if line.trim().is_empty() {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if !line.starts_with("@import ") {
|
||||||
|
out.push(line.to_string());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let imported = {
|
||||||
|
line.replace("@import ", "")
|
||||||
|
.trim()
|
||||||
|
.replace("\"", "")
|
||||||
|
.replace(";", "")
|
||||||
|
.to_string()
|
||||||
|
};
|
||||||
|
let child = input_dir.clone().join(imported.as_str());
|
||||||
|
merge_files(child.as_path(), out)?;
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_timestamp(input: &Path) -> Result<SystemTime, String> {
|
||||||
|
std::fs::File::open(input)
|
||||||
|
.and_then(|file| file.metadata())
|
||||||
|
.and_then(|meta| meta.modified())
|
||||||
|
.map_err(|e| format!("{}", e))
|
||||||
|
}
|
||||||
|
|
||||||
|
fn check_timestamps(input: &Path, output_timestamp: SystemTime) -> Result<bool, String> {
|
||||||
|
let input_dir = input
|
||||||
|
.clone()
|
||||||
|
.parent()
|
||||||
|
.ok_or_else(|| format!("Not a valid path {:?}", input))?;
|
||||||
|
|
||||||
|
let path = input_dir.to_str().unwrap();
|
||||||
|
let paths = glob::glob(format!("{}/**/*.css", path).as_str()).map_err(|e| format!("{}", e))?;
|
||||||
|
for path in paths.filter_map(Result::ok) {
|
||||||
|
if read_timestamp(path.as_path())? > output_timestamp {
|
||||||
|
return Ok(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(true)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn main() -> Result<(), String> {
|
||||||
|
let matches = clap::App::new("jirs-css")
|
||||||
|
.arg(
|
||||||
|
clap::Arg::with_name("input")
|
||||||
|
.short("i")
|
||||||
|
.default_value(INPUT)
|
||||||
|
.takes_value(true),
|
||||||
|
)
|
||||||
|
.arg(clap::Arg::with_name("output").short("O").takes_value(true))
|
||||||
|
.arg(clap::Arg::with_name("watch").short("W"))
|
||||||
|
.arg(
|
||||||
|
clap::Arg::with_name("prelude")
|
||||||
|
.short("p")
|
||||||
|
.help("Prepend file name as class to each selector"),
|
||||||
|
)
|
||||||
|
.get_matches();
|
||||||
|
|
||||||
|
let mut config = Configuration {
|
||||||
|
input: matches.value_of("input").unwrap().to_string(),
|
||||||
|
output: matches.value_of("output").map(|s| s.to_string()),
|
||||||
|
watch: matches.is_present("watch"),
|
||||||
|
prelude_selector: matches.is_present("prelude"),
|
||||||
|
files: vec![],
|
||||||
|
};
|
||||||
|
config.scan_fs()?;
|
||||||
|
println!("{:?}", config);
|
||||||
|
|
||||||
|
let output_timestamp = matches
|
||||||
|
.value_of("output")
|
||||||
|
.ok_or(std::io::Error::from_raw_os_error(0))
|
||||||
|
.and_then(|path| File::open(path))
|
||||||
|
.and_then(|file| file.metadata())
|
||||||
|
.and_then(|meta| meta.modified())
|
||||||
|
.unwrap_or_else(|_| SystemTime::UNIX_EPOCH.clone());
|
||||||
|
|
||||||
|
let mut file =
|
||||||
|
std::fs::File::open(matches.value_of("input").unwrap()).map_err(|e| format!("{}", e))?;
|
||||||
|
let input = matches.value_of("input").unwrap();
|
||||||
|
|
||||||
|
if check_timestamps(Path::new(input), output_timestamp)? {
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
|
let mut contents: String = String::new();
|
||||||
|
file.read_to_string(&mut contents)
|
||||||
|
.map_err(|e| format!("{}", e))?;
|
||||||
|
|
||||||
|
let mut out = vec![];
|
||||||
|
merge_files(std::path::Path::new(input), &mut out)?;
|
||||||
|
|
||||||
|
match matches.value_of("output") {
|
||||||
|
Some(output) => {
|
||||||
|
std::fs::create_dir_all(Path::new(output).parent().unwrap()).unwrap();
|
||||||
|
std::fs::write(output, out.join("\n")).unwrap()
|
||||||
|
}
|
||||||
|
None => println!("{}", out.join("\n")),
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user