1
1
#!/usr/bin/env node
2
- "use strict" ;
3
2
4
- //require("dotenv").config({ path: ".env" });
5
- //require("dotenv").config({ path: ".env.secret" });
3
+ //import Dotenv from "dotenv";
4
+ //Dotenv.config({ path: ".env" });
5
+ //Dotenv.config({ path: ".env.secret" });
6
6
7
7
const PKG_NAME = "package.json" ;
8
8
const TSC_NAME = "tsconfig.json" ;
9
9
const JSC_NAME = "jsconfig.json" ;
10
10
11
- var Fs = require ( "node:fs" ) . promises ;
12
- var Path = require ( "node:path" ) ;
13
- var spawn = require ( "node:child_process" ) . spawn ;
11
+ import Fs from "node:fs/promises" ;
12
+ import Path from "node:path" ;
13
+ import ChildProcess from "node:child_process" ;
14
+
15
+ let modulePath = import . meta. url . slice ( "file://" . length ) ;
16
+ let moduleDir = Path . dirname ( modulePath ) ;
14
17
15
18
async function main ( ) {
16
19
/* jshint maxcomplexity: 25 */
@@ -31,12 +34,6 @@ async function main() {
31
34
pkgName = pkgName . slice ( index ) ;
32
35
}
33
36
34
- let jsconfig = await readJsConfig ( ) ;
35
- if ( ! jsconfig ) {
36
- let tsconfigTxt = await createTsConfig ( ) ;
37
- jsconfig = await createJsConfig ( pkg , tsconfigTxt ) ;
38
- }
39
-
40
37
// await Fs.mkdir("./docs", { recursive: true });
41
38
// let fh = await Fs.open("./docs/.gitkeep", "a");
42
39
// await fh.close();
@@ -81,23 +78,35 @@ async function main() {
81
78
await initFile (
82
79
"./index.js" ,
83
80
[
84
- `"use strict";` ,
85
81
"// auto-generated by `jswt reexport`" ,
86
82
"// DO NOT EDIT" ,
87
83
"" ,
88
- `module.exports = require("${ prefix } /${ pkgName } .js");` ,
84
+ `import ${ pkgName } from "${ prefix } /${ pkgName } .js";` ,
85
+ "" ,
86
+ `export default ${ pkgName } ;` ,
89
87
"" ,
90
88
] . join ( "\n" ) ,
91
89
) ;
92
90
}
93
91
92
+ let jsconfig = await readJsConfig ( ) ;
93
+ if ( ! jsconfig ) {
94
+ let tsconfigTxt = await createTsConfig ( ) ;
95
+ jsconfig = await createJsConfig (
96
+ pkg ,
97
+ tsconfigTxt ,
98
+ `${ prefix } /${ pkgName } .js` ,
99
+ ) ;
100
+ }
101
+
94
102
let eslintFile = await whichEslint ( "." , pkg ) ;
95
103
let initJshint = ! flags . noJshint && ! eslintFile ;
96
104
if ( initJshint ) {
97
105
await initFile (
98
106
"./.jshintrc" ,
99
107
[
100
108
`{` ,
109
+ ` "module": true,` ,
101
110
` "browser": true,` ,
102
111
` "node": true,` ,
103
112
` "esversion": 11,` ,
@@ -115,7 +124,6 @@ async function main() {
115
124
` "plusplus": true,` ,
116
125
` "undef": true,` ,
117
126
` "unused": "vars",` ,
118
- ` "strict": true,` ,
119
127
` "maxdepth": 4,` ,
120
128
` "maxstatements": 100,` ,
121
129
` "maxcomplexity": 20` ,
@@ -145,7 +153,7 @@ async function main() {
145
153
let hasTestRunnerScript = script . includes ( testRunnerScript ) ;
146
154
if ( hasTestRunnerScript ) {
147
155
await Fs . mkdir ( "./tests" , { recursive : true } ) ;
148
- let testRunnerPath = Path . join ( __dirname , "../tests/index.js" ) ;
156
+ let testRunnerPath = Path . join ( moduleDir , "../tests/index.js" ) ;
149
157
let testRunnerText = await Fs . readFile ( testRunnerPath , "utf8" ) ;
150
158
await initFile ( "./tests/index.js" , testRunnerText ) ;
151
159
}
@@ -169,7 +177,7 @@ async function main() {
169
177
let ghaDir = `.github/workflows` ;
170
178
let ghaFile = `.github/workflows/node.js.yml` ;
171
179
await Fs . mkdir ( `./${ ghaDir } ` , { recursive : true } ) ;
172
- let ghActionPath = Path . join ( __dirname , `../${ ghaFile } ` ) ;
180
+ let ghActionPath = Path . join ( moduleDir , `../${ ghaFile } ` ) ;
173
181
let ghActionText = await Fs . readFile ( ghActionPath , "utf8" ) ;
174
182
await initFile ( `./${ ghaFile } ` , ghActionText ) ;
175
183
}
@@ -214,12 +222,12 @@ async function main() {
214
222
await initFile (
215
223
mainPath ,
216
224
[
217
- `"use strict";` ,
218
- "" ,
219
- `let ${ mainName } = module.exports;` ,
225
+ `let ${ mainName } = {};` ,
220
226
"" ,
221
227
`${ mainName } .answer = 42;` ,
222
228
"" ,
229
+ `export default ${ mainName } ;` ,
230
+ "" ,
223
231
] . join ( "\n" ) ,
224
232
) ;
225
233
}
@@ -229,6 +237,7 @@ async function main() {
229
237
if ( mainIsIndex ) {
230
238
let allArgs = [ "pkg" , "set" , `main=${ mainPath } ` ] ;
231
239
await exec ( "npm" , allArgs ) ;
240
+ await sortAndWritePackageJson ( ) ;
232
241
}
233
242
}
234
243
@@ -278,6 +287,7 @@ async function main() {
278
287
`files[]=tests/*.js` ,
279
288
] ;
280
289
await exec ( "npm" , allArgs ) ;
290
+ await sortAndWritePackageJson ( ) ;
281
291
}
282
292
}
283
293
@@ -290,10 +300,57 @@ async function main() {
290
300
void ( await upsertNpmScript (
291
301
"prepublish" ,
292
302
"reexport-types" ,
293
- "npx -p jswt@1 .x -- reexport" ,
303
+ "npx -p jswt@2 .x -- reexport" ,
294
304
"reexport" ,
295
305
) ) ;
296
306
307
+ {
308
+ let result = await exec ( "npm" , [ "pkg" , "get" , "exports" ] ) ;
309
+ let curScript = result . stdout . trim ( ) ;
310
+ if ( "{}" === curScript ) {
311
+ let allArgs = [
312
+ "pkg" ,
313
+ "set" ,
314
+ "type=module" ,
315
+ `exports[.]=${ mainPath } ` ,
316
+ `exports[./*]=./*` ,
317
+ ] ;
318
+ await exec ( "npm" , allArgs ) ;
319
+ await sortAndWritePackageJson ( ) ;
320
+ }
321
+ }
322
+
323
+ {
324
+ let result = await exec ( "npm" , [ "pkg" , "get" , "imports" ] ) ;
325
+ let curScript = result . stdout . trim ( ) ;
326
+ if ( "{}" === curScript ) {
327
+ let allArgs = [
328
+ "pkg" ,
329
+ "set" ,
330
+ "type=module" ,
331
+ `imports[${ pkg . name } ]=${ mainPath } ` ,
332
+ ] ;
333
+ await exec ( "npm" , allArgs ) ;
334
+ await sortAndWritePackageJson ( ) ;
335
+
336
+ await initFile (
337
+ "./importmap.html" ,
338
+ [
339
+ `<script type="importmap">` ,
340
+ ` {` ,
341
+ ` "imports": {` ,
342
+ ` "@root/passkey": "./passkey.js",` ,
343
+ ` "@root/passkey/": "./lib/",` ,
344
+ ` "localstore": "./vendor/localstore.js"` ,
345
+ ` }` ,
346
+ ` }` ,
347
+ `</script>` ,
348
+ "" ,
349
+ ] . join ( "\n" ) ,
350
+ ) ;
351
+ }
352
+ }
353
+
297
354
let jsconfigTxt = JSON . stringify ( jsconfig , null , 2 ) ;
298
355
// for stderr / debug output
299
356
console . error ( `./jsconfig.json:` ) ;
@@ -505,13 +562,14 @@ async function createTsConfig() {
505
562
"--allowJs" ,
506
563
"--alwaysStrict" ,
507
564
"--checkJs" ,
565
+ "--module" ,
566
+ "nodenext" ,
508
567
"--moduleResolution" ,
509
- "node " ,
568
+ "nodenext " ,
510
569
"--noEmit" ,
511
570
"--noImplicitAny" ,
512
571
"--target" ,
513
- // can't be 'esnext' due to some resolution issues
514
- version || "es2022" ,
572
+ version || "es2022" , // can't be 'esnext' due to some resolution issues
515
573
"--typeRoots" ,
516
574
"./typings,./node_modules/@types" ,
517
575
] ;
@@ -556,18 +614,20 @@ async function getLatest20xx() {
556
614
return version ;
557
615
}
558
616
version = m [ 0 ] ;
559
- //console.log("version", version);
617
+ //console.log("DEBUG version", version);
560
618
}
561
619
return version ;
562
620
} ) ;
563
621
}
564
622
565
623
/**
566
624
* @param {Object } pkg
625
+ * @param {String } pkg.name
567
626
* @param {String } tsconfigTxt
627
+ * @param {String } mainPath
568
628
* @returns
569
629
*/
570
- async function createJsConfig ( pkg , tsconfigTxt ) {
630
+ async function createJsConfig ( pkg , tsconfigTxt , mainPath ) {
571
631
if ( ! tsconfigTxt . includes ( `"include":` ) ) {
572
632
let includables = [
573
633
"*.js" ,
@@ -584,6 +644,18 @@ async function createJsConfig(pkg, tsconfigTxt) {
584
644
tsconfigTxt = tsconfigTxt . replace ( / \n } [ \s \n ] * $ / m, `${ includeLine } \n}` ) ;
585
645
}
586
646
647
+ {
648
+ let lines = [
649
+ ` "${ pkg . name } ": ["${ mainPath } "]` ,
650
+ ` "${ pkg . name } /*": ["./*"]` ,
651
+ ] ;
652
+ let str = lines . join ( `,\n` ) ;
653
+ tsconfigTxt = tsconfigTxt . replace (
654
+ `// "paths": {},` ,
655
+ `"paths": {\n${ str } \n }, ` ,
656
+ ) ;
657
+ }
658
+
587
659
if ( ! tsconfigTxt . includes ( `"exclude":` ) ) {
588
660
let excludeLine = `,\n "exclude": ["node_modules"]` ;
589
661
tsconfigTxt = tsconfigTxt . replace ( / \n } [ \s \n ] * $ / m, `${ excludeLine } \n}` ) ;
@@ -665,6 +737,54 @@ async function initFile(fileName, initValue) {
665
737
await Fs . writeFile ( fileName , initValue , "utf8" ) ;
666
738
}
667
739
740
+ async function sortAndWritePackageJson ( ) {
741
+ let pkg = await readPackageJson ( ) ;
742
+
743
+ /** @type {Object.<String, any> } */
744
+ let newPkg = { } ;
745
+ let pkgKeys = Object . keys ( pkg ) ;
746
+
747
+ let orderedKeys = [
748
+ "name" ,
749
+ "version" ,
750
+ "description" ,
751
+ "main" ,
752
+ "files" ,
753
+ "type" ,
754
+ "imports" ,
755
+ "exports" ,
756
+ "scripts" ,
757
+ ] ;
758
+ for ( let key of orderedKeys ) {
759
+ let hasKey = remove ( pkgKeys , key ) ;
760
+ if ( hasKey ) {
761
+ newPkg [ key ] = pkg [ key ] ;
762
+ }
763
+ }
764
+ for ( let key of pkgKeys ) {
765
+ newPkg [ key ] = pkg [ key ] ;
766
+ }
767
+
768
+ let pkgJson = JSON . stringify ( newPkg , null , 2 ) ;
769
+ await Fs . writeFile ( PKG_NAME , pkgJson , "utf8" ) ;
770
+ }
771
+
772
+ /**
773
+ * @param {Array<String> } arr
774
+ * @param {String } str
775
+ * @returns {String? }
776
+ */
777
+ function remove ( arr , str ) {
778
+ let index = arr . indexOf ( str ) ;
779
+ if ( index > - 1 ) {
780
+ let removed = arr . splice ( index , 1 ) ;
781
+ let el = removed [ 0 ] || null ;
782
+ return el ;
783
+ }
784
+
785
+ return null ;
786
+ }
787
+
668
788
/**
669
789
* @param {String } metaKey - ex: lint, fmt, start
670
790
* @param {String } scriptKey - ex: jshint, prettier
@@ -723,8 +843,8 @@ async function upsertNpmScript(
723
843
* @param {Array<String> } args
724
844
*/
725
845
async function exec ( exe , args ) {
726
- return new Promise ( function ( resolve , reject ) {
727
- let cmd = spawn ( exe , args ) ;
846
+ return await new Promise ( function ( resolve , reject ) {
847
+ let cmd = ChildProcess . spawn ( exe , args ) ;
728
848
729
849
/** @type {Array<String> } */
730
850
let stdout = [ ] ;
0 commit comments