Skip to content

Commit 5446667

Browse files
authored
Add node resolver to pgml-components (#1037)
1 parent 69caeea commit 5446667

File tree

8 files changed

+136
-43
lines changed

8 files changed

+136
-43
lines changed

pgml-apps/cargo-pgml-components/Cargo.lock

Lines changed: 3 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pgml-apps/cargo-pgml-components/Cargo.toml

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "cargo-pgml-components"
3-
version = "0.1.15"
3+
version = "0.1.16"
44
edition = "2021"
55
authors = ["PostgresML <team@postgresml.org>"]
66
license = "MIT"
@@ -19,6 +19,8 @@ anyhow = "1"
1919
owo-colors = "3"
2020
sailfish = "0.8"
2121
regex = "1"
22+
toml = "0.7"
23+
serde = { version = "1", features = ["derive"] }
2224

2325
[dev-dependencies]
2426
assert_cmd = "2"
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
use serde::{Deserialize, Serialize};
2+
3+
#[derive(Serialize, Deserialize, Default, Clone)]
4+
pub struct Javascript {
5+
#[serde(default = "Javascript::default_additional_paths")]
6+
pub additional_paths: Vec<String>,
7+
}
8+
9+
impl Javascript {
10+
fn default_additional_paths() -> Vec<String> {
11+
vec![]
12+
}
13+
}
14+
15+
#[derive(Serialize, Deserialize, Default, Clone)]
16+
pub struct Config {
17+
pub javascript: Javascript,
18+
}
19+
20+
impl Config {
21+
pub fn from_path(path: &str) -> anyhow::Result<Config> {
22+
let config_str = std::fs::read_to_string(path)?;
23+
let config: Config = toml::from_str(&config_str)?;
24+
Ok(config)
25+
}
26+
27+
pub fn load() -> Config {
28+
match Self::from_path("pgml-components.toml") {
29+
Ok(config) => config,
30+
Err(_) => Config::default(),
31+
}
32+
}
33+
}

pgml-apps/cargo-pgml-components/src/frontend/components.rs

Lines changed: 4 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -191,10 +191,7 @@ fn update_module(path: &Path) {
191191
}
192192

193193
if has_more_modules(&path) {
194-
debug!("{} has more modules", path.display());
195194
update_module(&path);
196-
} else {
197-
debug!("it does not really no");
198195
}
199196

200197
let component_path = path.components().skip(2).collect::<PathBuf>();
@@ -205,8 +202,7 @@ fn update_module(path: &Path) {
205202
debug!("writing {} modules to mod.rs", modules.len());
206203

207204
let components_mod = path.join("mod.rs");
208-
let modules =
209-
unwrap_or_exit!(templates::Mod { modules }.render_once()).replace("\n\n", "\n");
205+
let modules = unwrap_or_exit!(templates::Mod { modules }.render_once()).replace("\n\n", "\n");
210206

211207
let existing_modules = if components_mod.is_file() {
212208
unwrap_or_exit!(read_to_string(&components_mod))
@@ -220,15 +216,15 @@ fn update_module(path: &Path) {
220216
info(&format!("written {}", components_mod.display().to_string()));
221217
}
222218

223-
debug!("mod.rs is the same");
219+
debug!("{}/mod.rs is different", components_mod.display());
224220
}
225221

226222
/// Check that the path has more Rust modules.
227223
fn has_more_modules(path: &Path) -> bool {
228224
debug!("checking if {} has more modules", path.display());
229225

230226
if !path.exists() {
231-
debug!("path does not exist");
227+
debug!("path {} does not exist", path.display());
232228
return false;
233229
}
234230

@@ -244,13 +240,12 @@ fn has_more_modules(path: &Path) -> bool {
244240

245241
if let Some(file_name) = path.file_name() {
246242
if file_name != "mod.rs" {
247-
debug!("it has another file that's not mod.rs");
243+
debug!("{} has another file that's not mod.rs", path.display());
248244
return false;
249245
}
250246
}
251247
}
252248

253-
debug!("it does");
254249
true
255250
}
256251

pgml-apps/cargo-pgml-components/src/frontend/javascript.rs

Lines changed: 56 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use std::process::{exit, Command};
99

1010
use convert_case::{Case, Casing};
1111

12+
use crate::config::Config;
1213
use crate::frontend::tools::execute_with_nvm;
1314
use crate::util::{error, info, unwrap_or_exit, warn};
1415

@@ -42,16 +43,26 @@ fn cleanup_old_bundles() {
4243
}
4344
}
4445

45-
fn assemble_modules() {
46+
fn assemble_modules(config: Config) {
4647
let js = unwrap_or_exit!(glob(MODULES_GLOB));
47-
let js = js.chain(unwrap_or_exit!(glob(STATIC_JS_GLOB)));
48+
let mut js = js
49+
.chain(unwrap_or_exit!(glob(STATIC_JS_GLOB)))
50+
.collect::<Vec<_>>();
51+
52+
for path in &config.javascript.additional_paths {
53+
debug!("adding additional path to javascript bundle: {}", path);
54+
js = js
55+
.into_iter()
56+
.chain(unwrap_or_exit!(glob(path)))
57+
.collect::<Vec<_>>();
58+
}
4859

4960
// Don't bundle artifacts we produce.
50-
let js = js.filter(|path| {
61+
let js = js.iter().filter(|path| {
5162
let path = path.as_ref().unwrap();
5263
let path = path.display().to_string();
5364

54-
!path.contains("main.js") && !path.contains("bundle.js") && !path.contains("modules.js")
65+
!path.contains("main.") && !path.contains("bundle.") && !path.contains("modules.")
5566
});
5667

5768
let mut modules = unwrap_or_exit!(File::create(MODULES_FILE));
@@ -75,27 +86,37 @@ fn assemble_modules() {
7586

7687
let full_path = source.display().to_string();
7788

78-
let path = source
79-
.components()
80-
.skip(2) // skip src/components or static/js
81-
.collect::<Vec<_>>();
89+
let path = source.components().collect::<Vec<_>>();
8290

8391
assert!(!path.is_empty());
8492

8593
let path = path.iter().collect::<PathBuf>();
8694
let components = path.components();
87-
let controller_name = if components.clone().count() > 1 {
88-
components
95+
let file_stem = path.file_stem().unwrap().to_str().unwrap().to_string();
96+
let controller_name = if file_stem.ends_with("controller") {
97+
let mut parts = vec![];
98+
99+
let pp = components
89100
.map(|c| c.as_os_str().to_str().expect("component to be valid utf-8"))
90101
.filter(|c| !c.ends_with(".js"))
91-
.collect::<Vec<&str>>()
92-
.join("_")
102+
.collect::<Vec<&str>>();
103+
let mut saw_src = false;
104+
let mut saw_components = false;
105+
for p in pp {
106+
if p == "src" {
107+
saw_src = true;
108+
} else if p == "components" {
109+
saw_components = true;
110+
} else if saw_src && saw_components {
111+
parts.push(p);
112+
}
113+
}
114+
115+
assert!(!parts.is_empty());
116+
117+
parts.join("_")
93118
} else {
94-
path.file_stem()
95-
.expect("old controllers to be a single file")
96-
.to_str()
97-
.expect("stemp to be valid utf-8")
98-
.to_string()
119+
file_stem
99120
};
100121
let upper_camel = controller_name.to_case(Case::UpperCamel).to_string();
101122
let controller_name = controller_name.replace("_", "-");
@@ -121,20 +142,28 @@ fn assemble_modules() {
121142
info(&format!("written {}", MODULES_FILE));
122143
}
123144

124-
pub fn bundle() {
145+
pub fn bundle(config: Config, minify: bool) {
125146
cleanup_old_bundles();
126-
assemble_modules();
147+
assemble_modules(config.clone());
148+
149+
let mut command = Command::new(JS_COMPILER);
150+
151+
command
152+
.arg(MODULES_FILE)
153+
.arg("--file")
154+
.arg(JS_FILE)
155+
.arg("--format")
156+
.arg("es")
157+
.arg("-p")
158+
.arg("@rollup/plugin-node-resolve");
159+
160+
if minify {
161+
command.arg("-p").arg("@rollup/plugin-terser");
162+
}
127163

128164
// Bundle JavaScript.
129165
info("bundling javascript with rollup");
130-
unwrap_or_exit!(execute_with_nvm(
131-
Command::new(JS_COMPILER)
132-
.arg(MODULES_FILE)
133-
.arg("--file")
134-
.arg(JS_FILE)
135-
.arg("--format")
136-
.arg("es"),
137-
));
166+
unwrap_or_exit!(execute_with_nvm(&mut command));
138167

139168
info(&format!("written {}", JS_FILE));
140169

pgml-apps/cargo-pgml-components/src/frontend/tools.rs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,14 @@
11
//! Tools required by us to build stuff.
22
3-
use crate::util::{debug1, error, execute_command, unwrap_or_exit, warn};
3+
use crate::util::{debug1, error, execute_command, info, unwrap_or_exit, warn};
44
use std::fs::File;
55
use std::io::Write;
6+
use std::path::Path;
67
use std::process::{exit, Command};
78

89
/// Required tools.
910
static TOOLS: &[&str] = &["sass", "rollup"];
11+
static ROLLUP_PLUGINS: &[&str] = &["@rollup/plugin-terser", "@rollup/plugin-node-resolve"];
1012
static NVM_EXEC: &'static str = "/tmp/pgml-components-nvm.sh";
1113
static NVM_SOURCE: &'static str = "https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.5/install.sh";
1214
static NVM_SOURCE_DOWNLOADED: &'static str = "/tmp/pgml-components-nvm-source.sh";
@@ -30,6 +32,27 @@ pub fn install() {
3032
}
3133
}
3234
}
35+
36+
for plugin in ROLLUP_PLUGINS {
37+
if execute_with_nvm(
38+
Command::new("rollup")
39+
.arg("-p")
40+
.arg(plugin)
41+
.arg("--version"),
42+
)
43+
.is_err()
44+
{
45+
warn(&format!("installing rollup plugin {}", plugin));
46+
unwrap_or_exit!(execute_with_nvm(
47+
Command::new("npm").arg("install").arg("-g").arg(plugin)
48+
));
49+
}
50+
}
51+
52+
if Path::new("package.json").exists() {
53+
info("installing dependencies from package.json");
54+
unwrap_or_exit!(execute_with_nvm(Command::new("npm").arg("install")));
55+
}
3356
}
3457

3558
/// Execute a command making sure that nvm is available.

pgml-apps/cargo-pgml-components/src/main.rs

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@ use std::path::Path;
99
extern crate log;
1010

1111
mod backend;
12+
mod config;
1213
mod frontend;
1314
mod util;
15+
16+
use config::Config;
1417
use util::{info, unwrap_or_exit};
1518

1619
/// These paths are exepcted to exist in the project directory.
@@ -51,7 +54,10 @@ struct PgmlCommands {
5154
#[derive(Subcommand, Debug)]
5255
enum Commands {
5356
/// Bundle SASS and JavaScript into neat bundle files.
54-
Bundle {},
57+
Bundle {
58+
#[arg(short, long, default_value = "false")]
59+
minify: bool,
60+
},
5561

5662
/// Add new elements to the project.
5763
#[command(subcommand)]
@@ -65,14 +71,15 @@ enum AddCommands {
6571
}
6672

6773
fn main() {
74+
let config = Config::load();
6875
env_logger::init();
6976
let cli = Cli::parse();
7077

7178
match cli.subcomand {
7279
CargoSubcommands::PgmlComponents(pgml_commands) => {
7380
validate_project(pgml_commands.project_path);
7481
match pgml_commands.command {
75-
Commands::Bundle {} => bundle(),
82+
Commands::Bundle { minify } => bundle(config, minify),
7683
Commands::Add(command) => match command {
7784
AddCommands::Component { name } => {
7885
crate::frontend::components::add(&Path::new(&name), pgml_commands.overwrite)
@@ -108,9 +115,9 @@ fn validate_project(project_path: Option<String>) {
108115
}
109116

110117
/// Bundle SASS and JavaScript into neat bundle files.
111-
fn bundle() {
118+
fn bundle(config: Config, minify: bool) {
112119
frontend::sass::bundle();
113-
frontend::javascript::bundle();
120+
frontend::javascript::bundle(config, minify);
114121
frontend::components::update_modules();
115122

116123
info("bundle complete");

pgml-apps/cargo-pgml-components/src/util.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ pub fn warn(value: &str) {
3939
}
4040

4141
pub fn execute_command(command: &mut Command) -> std::io::Result<String> {
42+
debug!("Executing {:?}", command);
43+
4244
let output = match command.output() {
4345
Ok(output) => output,
4446
Err(err) => {

0 commit comments

Comments
 (0)