11use std:: fs;
2- use std:: io:: Write ;
2+ use std:: io:: { self , Write } ;
33use std:: path:: Path ;
4- use std:: collections:: HashMap ;
5- use clap:: Args ;
4+ use std:: collections:: { HashMap , BTreeMap } ;
65use anyhow:: Context ;
76
8- #[ derive( Debug , Args ) ]
9- pub ( super ) struct CodegenCmd { }
10-
11- impl CodegenCmd {
12- pub fn run ( self ) -> anyhow:: Result < ( ) > {
13- let dir = Path :: new ( env ! ( "CARGO_MANIFEST_DIR" ) ) ;
14- let dir = dir. parent ( ) . unwrap ( ) ;
15-
16- es_preset_env_corejs3_entry ( dir)
17- }
7+ fn main ( ) -> anyhow:: Result < ( ) > {
8+ es_preset_env_corejs3_entry ( )
189}
1910
20- fn es_preset_env_corejs3_entry ( dir : & Path ) -> anyhow:: Result < ( ) > {
21- use std :: collections :: BTreeMap ;
11+ fn es_preset_env_corejs3_entry ( ) -> anyhow:: Result < ( ) > {
12+ const SEED : u64 = 16416001479773392852 ;
2213
23- let crate_dir = dir. join ( "crates/swc_ecma_preset_env/" ) ;
14+ let crate_dir = std:: env:: var ( "CARGO_MANIFEST_DIR" ) ?;
15+ let crate_dir = Path :: new ( & crate_dir) ;
16+
17+ let out_dir = std:: env:: var ( "OUT_DIR" ) . unwrap ( ) ;
18+ let out_dir = Path :: new ( & out_dir) ;
19+ let out_dir = out_dir. join ( "corejs3_entries" ) ;
20+
21+
22+ let entry_path = crate_dir. join ( "data/core-js-compat/entries.json" ) ;
23+ println ! ( "cargo::rerun-if-changed={}" , entry_path. display( ) ) ;
2424
25- let entry_data = fs:: read_to_string ( crate_dir . join ( "data/core-js-compat/entries.json" ) ) ?;
25+ let entry_data = fs:: read_to_string ( entry_path ) ?;
2626 let entry_data: BTreeMap < & str , Vec < & str > > = serde_json:: from_str ( & entry_data)
2727 . context ( "failed to parse entries.json from core js 3" ) ?;
2828 let ( keys, values) : ( Vec < _ > , Vec < _ > ) = entry_data. into_iter ( ) . unzip ( ) ;
@@ -32,6 +32,7 @@ fn es_preset_env_corejs3_entry(dir: &Path) -> anyhow::Result<()> {
3232 let mut values_index = Vec :: new ( ) ;
3333 for list in values {
3434 let start: u32 = values_strid. len ( ) . try_into ( ) . unwrap ( ) ;
35+
3536 for s in list {
3637 values_strid. push ( strpool. insert ( s) ) ;
3738 }
@@ -40,7 +41,7 @@ fn es_preset_env_corejs3_entry(dir: &Path) -> anyhow::Result<()> {
4041 }
4142
4243 let mapout = precomputed_map:: builder:: MapBuilder :: < & str > :: new ( )
43- . set_seed ( 16416001479773392852 )
44+ . set_seed ( SEED )
4445 . set_hash ( & |seed, & v| {
4546 use std:: hash:: { Hash , Hasher } ;
4647
@@ -52,32 +53,30 @@ fn es_preset_env_corejs3_entry(dir: &Path) -> anyhow::Result<()> {
5253 seed + c
5354 } )
5455 . build ( & keys) ?;
55- println ! ( "seed: {:?}" , mapout. seed( ) ) ;
56+
57+ if let Some ( seed) = mapout. seed ( ) {
58+ if seed != SEED {
59+ println ! ( "cargo::warning=The seed has changed, please update the seed to {} for faster builds" , seed) ;
60+ }
61+ }
5662
5763 // clean file
5864 {
59- for entry in fs:: read_dir ( crate_dir. join ( "src/generated" ) ) . ok ( ) . into_iter ( ) . flatten ( ) {
60- let entry = entry?;
61- let path = entry. path ( ) ;
62-
63- if entry. file_type ( ) ?. is_file ( )
64- && path. file_name ( )
65- . and_then ( |name| name. to_str ( ) )
66- . filter ( |name| !name. starts_with ( '.' ) )
67- . is_some ( )
68- {
69- fs:: remove_file ( entry. path ( ) ) ?;
70- }
71- }
65+ fs:: remove_dir_all ( & out_dir)
66+ . or_else ( |err| match err. kind ( ) {
67+ io:: ErrorKind :: NotFound => Ok ( ( ) ) ,
68+ _ => Err ( err)
69+ } ) ?;
70+ fs:: create_dir ( & out_dir) ?;
7271 }
7372
7473 let mut u8seq = precomputed_map:: builder:: U8SeqWriter :: new (
7574 "PrecomputedU8Seq" . into ( ) ,
76- crate_dir . join ( "src/generated/corejs3_entries.u8 " )
75+ out_dir . join ( "u8.bin " )
7776 ) ;
7877 let mut u32seq = precomputed_map:: builder:: U32SeqWriter :: new (
7978 "PrecomputedU32Seq" . into ( ) ,
80- crate_dir . join ( "src/generated/corejs3_entries. u32" )
79+ out_dir . join ( "u32.bin " )
8180 ) ;
8281
8382 let mut builder = precomputed_map:: builder:: CodeBuilder :: new (
@@ -91,15 +90,15 @@ fn es_preset_env_corejs3_entry(dir: &Path) -> anyhow::Result<()> {
9190 builder. create_u32_seq ( "EntryValuesStringId" . into ( ) , values_strid. iter ( ) . copied ( ) ) ?;
9291 mapout. create_map ( "ENTRY_INDEX" . into ( ) , k, & mut builder) ?;
9392
94- let mut codeout = fs:: File :: create ( crate_dir . join ( "src/generated/corejs3_entries .rs" ) ) ?;
93+ let mut codeout = fs:: File :: create ( out_dir . join ( "lib .rs" ) ) ?;
9594 builder. write_to ( & mut codeout) ?;
9695 u8seq. write_to ( & mut codeout) ?;
9796 u32seq. write_to ( & mut codeout) ?;
9897
99- fs:: write ( crate_dir . join ( "src/generated/corejs3_entries.strpool " ) , strpool. pool . as_bytes ( ) ) ?;
98+ fs:: write ( out_dir . join ( "str.bin " ) , strpool. pool . as_bytes ( ) ) ?;
10099
101100 writeln ! ( codeout,
102- "static ENTRY_VALUES_STRING_STORE: &str = include_str!(\" corejs3_entries.strpool \" );
101+ "static ENTRY_VALUES_STRING_STORE: &str = include_str!(\" str.bin \" );
103102 static ENTRY_VALUES_LIST: &[Range<u32>] = &["
104103 ) ?;
105104 for range in mapout. reorder ( & values_index) {
0 commit comments