1+ const path = require ( 'path' )
2+ const os = require ( 'os' )
3+ const { readJson, writeJson, copy, rm, ensureDir } = require ( 'fs-extra' )
4+ const execute = require ( './execute.js' )
5+
6+ const ppack = async function ppack ( dir , opts ) {
7+ const packageFolder = dir ? path . resolve ( dir ) : process . cwd ( )
8+ const targetFolder = opts [ 'pack-destination' ] ? path . resolve ( opts [ 'pack-destination' ] ) : packageFolder
9+ const tempFolder = path . resolve ( os . tmpdir ( ) , '_ppack_' + Math . random ( ) . toString ( 36 ) . replace ( / [ ^ a - z ] + / g, '' ) )
10+ const log = opts . log || ( ( ) => { } )
11+
12+ // load package file
13+ const packageFile = path . resolve ( packageFolder , 'package.json' )
14+ const package = await readJson ( packageFile )
15+
16+ log ( `Packing package ${ package . name } :${ package . version } started` )
17+
18+ try {
19+ // copy package to temp folder
20+ await copy ( packageFolder , tempFolder , {
21+ filter : src => {
22+ return ! src . match ( 'node_modules' )
23+ }
24+ } )
25+
26+ // set pnpm config
27+ await execute ( 'pnpm' , [ 'config' , '--location' , 'project' , 'set' , 'shamefully-hoist=true' ] , {
28+ cwd : tempFolder
29+ } )
30+
31+ // update package info
32+ package . bundledDependencies = true
33+ if ( package . dependencies ) {
34+ await Promise . all (
35+ Object . entries ( package . dependencies ) . map (
36+ async ( [ name , version ] ) => {
37+ if ( version . match ( / ^ w o r k s p a c e : / ) ) {
38+ const path = await execute ( 'pnpm' , [ '--filter' , name , 'exec' , 'pwd' ] )
39+ package . dependencies [ name ] = `link:${ path } `
40+ }
41+ }
42+ )
43+ )
44+ }
45+ await writeJson ( path . resolve ( tempFolder , 'package.json' ) , package )
46+
47+ // install packages
48+ await execute ( 'pnpm' , [ 'i' , '--prefer-offline' ] , {
49+ cwd : tempFolder
50+ } )
51+
52+ // remove dev packages
53+ await execute ( 'pnpm' , [ 'prune' ] , {
54+ cwd : tempFolder
55+ } )
56+
57+ // create targetFolder
58+ await ensureDir ( targetFolder )
59+
60+ // create the tarball
61+ await execute ( 'pnpm' , [ 'pack' , '--pack-destination' , path . resolve ( targetFolder ) ] , {
62+ cwd : tempFolder
63+ } )
64+
65+ log ( `Packing package ${ package . name } :${ package . version } successful` )
66+ } catch ( err ) {
67+ log ( `Packing package ${ package . name } :${ package . version } failed with error ${ err . message } ` )
68+ throw err
69+ } finally {
70+ // cleanup
71+ await rm ( tempFolder , { recursive : true , force : true } ) ;
72+ }
73+ }
74+
75+ module . exports = ppack
0 commit comments