1
1
use clap:: Parser ;
2
2
use cli:: Cli ;
3
3
use error:: { MainError , PnError } ;
4
- use indexmap:: IndexMap ;
5
4
use pipe_trait:: Pipe ;
6
- use serde:: { Deserialize , Serialize } ;
7
5
use shell_quoted:: ShellQuoted ;
8
6
use std:: {
9
7
env,
10
- ffi:: OsString ,
11
- fs:: File ,
12
- io:: { self , ErrorKind , Write } ,
13
- num:: NonZeroI32 ,
8
+ io:: { self , Write } ,
14
9
path:: Path ,
15
- process:: { exit, Command , Stdio } ,
10
+ process:: exit,
16
11
} ;
17
12
use yansi:: Color :: { Black , Red } ;
18
13
19
14
mod cli;
20
- mod error;
21
- mod passed_through;
22
- mod shell_quoted;
23
- mod workspace;
24
15
25
- /// Structure of `package.json`.
26
- #[ derive( Debug , Clone , Deserialize , Serialize , PartialEq ) ]
27
- #[ serde( rename_all = "kebab-case" ) ]
28
- struct NodeManifest {
29
- #[ serde( default ) ]
30
- name : String ,
31
-
32
- #[ serde( default ) ]
33
- version : String ,
34
-
35
- #[ serde( default ) ]
36
- scripts : IndexMap < String , String > ,
37
- }
16
+ use pn:: error;
17
+ use pn:: passed_through;
18
+ use pn:: shell_quoted;
19
+ use pn:: utils:: * ;
20
+ use pn:: workspace;
21
+ use pn:: NodeManifest ;
38
22
39
23
fn main ( ) {
40
24
match run ( ) {
@@ -113,34 +97,6 @@ fn run() -> Result<(), MainError> {
113
97
}
114
98
}
115
99
116
- fn run_script ( name : & str , command : ShellQuoted , cwd : & Path ) -> Result < ( ) , MainError > {
117
- let path_env = create_path_env ( ) ?;
118
- let status = Command :: new ( "sh" )
119
- . current_dir ( cwd)
120
- . env ( "PATH" , path_env)
121
- . arg ( "-c" )
122
- . arg ( & command)
123
- . stdin ( Stdio :: inherit ( ) )
124
- . stdout ( Stdio :: inherit ( ) )
125
- . stderr ( Stdio :: inherit ( ) )
126
- . spawn ( )
127
- . map_err ( PnError :: SpawnProcessError ) ?
128
- . wait ( )
129
- . map_err ( PnError :: WaitProcessError ) ?
130
- . code ( )
131
- . map ( NonZeroI32 :: new) ;
132
- match status {
133
- Some ( None ) => return Ok ( ( ) ) ,
134
- Some ( Some ( status) ) => PnError :: ScriptError {
135
- name : name. to_string ( ) ,
136
- status,
137
- } ,
138
- None => PnError :: UnexpectedTermination { command } ,
139
- }
140
- . pipe ( MainError :: Pn )
141
- . pipe ( Err )
142
- }
143
-
144
100
fn list_scripts (
145
101
mut stdout : impl Write ,
146
102
script_map : impl IntoIterator < Item = ( String , String ) > ,
@@ -153,82 +109,6 @@ fn list_scripts(
153
109
Ok ( ( ) )
154
110
}
155
111
156
- fn pass_to_pnpm ( args : & [ String ] ) -> Result < ( ) , MainError > {
157
- let status = Command :: new ( "pnpm" )
158
- . args ( args)
159
- . stdin ( Stdio :: inherit ( ) )
160
- . stdout ( Stdio :: inherit ( ) )
161
- . stderr ( Stdio :: inherit ( ) )
162
- . spawn ( )
163
- . map_err ( PnError :: SpawnProcessError ) ?
164
- . wait ( )
165
- . map_err ( PnError :: WaitProcessError ) ?
166
- . code ( )
167
- . map ( NonZeroI32 :: new) ;
168
- Err ( match status {
169
- Some ( None ) => return Ok ( ( ) ) ,
170
- Some ( Some ( status) ) => MainError :: Sub ( status) ,
171
- None => MainError :: Pn ( PnError :: UnexpectedTermination {
172
- command : ShellQuoted :: from_command_and_args ( "pnpm" . into ( ) , args) ,
173
- } ) ,
174
- } )
175
- }
176
-
177
- fn pass_to_sub ( command : ShellQuoted ) -> Result < ( ) , MainError > {
178
- let path_env = create_path_env ( ) ?;
179
- let status = Command :: new ( "sh" )
180
- . env ( "PATH" , path_env)
181
- . arg ( "-c" )
182
- . arg ( & command)
183
- . stdin ( Stdio :: inherit ( ) )
184
- . stdout ( Stdio :: inherit ( ) )
185
- . stderr ( Stdio :: inherit ( ) )
186
- . spawn ( )
187
- . map_err ( PnError :: SpawnProcessError ) ?
188
- . wait ( )
189
- . map_err ( PnError :: WaitProcessError ) ?
190
- . code ( )
191
- . map ( NonZeroI32 :: new) ;
192
- Err ( match status {
193
- Some ( None ) => return Ok ( ( ) ) ,
194
- Some ( Some ( status) ) => MainError :: Sub ( status) ,
195
- None => MainError :: Pn ( PnError :: UnexpectedTermination { command } ) ,
196
- } )
197
- }
198
-
199
- fn read_package_manifest ( manifest_path : & Path ) -> Result < NodeManifest , MainError > {
200
- manifest_path
201
- . pipe ( File :: open)
202
- . map_err ( |error| match error. kind ( ) {
203
- ErrorKind :: NotFound => PnError :: NoPkgManifest {
204
- file : manifest_path. to_path_buf ( ) ,
205
- } ,
206
- _ => PnError :: FsError {
207
- path : manifest_path. to_path_buf ( ) ,
208
- error,
209
- } ,
210
- } ) ?
211
- . pipe ( serde_json:: de:: from_reader :: < _ , NodeManifest > )
212
- . map_err ( |err| {
213
- MainError :: Pn ( PnError :: ParseJsonError {
214
- file : manifest_path. to_path_buf ( ) ,
215
- message : err. to_string ( ) ,
216
- } )
217
- } )
218
- }
219
-
220
- fn create_path_env ( ) -> Result < OsString , MainError > {
221
- let existing_paths = env:: var_os ( "PATH" ) ;
222
- let existing_paths = existing_paths. iter ( ) . flat_map ( env:: split_paths) ;
223
- Path :: new ( "node_modules" )
224
- . join ( ".bin" )
225
- . pipe ( std:: iter:: once)
226
- . chain ( existing_paths)
227
- . pipe ( env:: join_paths)
228
- . map_err ( PnError :: NodeBinPathError )
229
- . map_err ( MainError :: from)
230
- }
231
-
232
112
#[ cfg( test) ]
233
113
mod tests {
234
114
use super :: * ;
0 commit comments