11import getDebug from 'debug' ;
2- import { exec } from 'child_process' ;
2+ import { spawnSync } from 'child_process' ;
33import postgres from 'postgres' ;
4- import { promisify } from 'util' ;
5-
6- const asyncExec = promisify ( exec ) ;
7- import cwd from 'cwd' ;
84import { platform } from 'os' ;
95
106const debug = getDebug ( 'postgres-local' ) ;
11- const FILEPATH_PREFIX = `${ cwd ( ) } /node_modules/.cache/@shelf/ postgres-local` ;
7+ const PD_TEMP_DATA_PATH = `/tmp/ postgres-local- ${ Date . now ( ) } ` ;
128
13- type StartESOptions = {
9+ export async function start ( options : {
1410 seedPath ?: string ;
1511 version ?: number ;
16- } ;
17-
18- export async function start ( options : StartESOptions ) : Promise < string > {
19- const { seedPath, version = 14 } = options ;
12+ port ?: number ;
13+ includeInstallation ?: boolean ;
14+ } ) : Promise < string > {
15+ const { seedPath, version = 14 , port = 5555 , includeInstallation = false } = options ;
2016
21- const url = ' postgres://localhost:5432 /postgres' ;
17+ const url = ` postgres://localhost:${ port } /postgres` ;
2218
2319 try {
24- await asyncExec ( getInstallationScript ( version ) ) ;
20+ spawnSync ( getInstallationScript ( { version, port, includeInstallation} ) , {
21+ stdio : 'inherit' ,
22+ shell : true ,
23+ env : {
24+ ...process . env ,
25+ HOME : '/root' ,
26+ } ,
27+ } ) ;
2528
2629 debug ( 'Connecting to postgres...' ) ;
2730 const sql = postgres ( url ) ;
@@ -41,47 +44,60 @@ export async function start(options: StartESOptions): Promise<string> {
4144 }
4245}
4346
44- export async function stop ( version ?: string ) : Promise < { stdout : string ; stderr : string } > {
45- return asyncExec ( getStopScript ( version ) ) ;
47+ export function stop ( { version = 14 } : { version ?: number } ) : void {
48+ spawnSync ( getStopScript ( { version} ) , {
49+ stdio : 'inherit' ,
50+ shell : true ,
51+ } ) ;
4652}
4753
48- export function getInstallationScript ( version : number ) : string {
54+ export function getInstallationScript ( {
55+ version = 14 ,
56+ port = 5555 ,
57+ includeInstallation : includeInstallation = false ,
58+ } ) : string {
4959 switch ( platform ( ) ) {
5060 case 'darwin' : {
61+ const installation = includeInstallation ? `brew install postgresql@${ version } ;` : '' ;
62+
5163 return `
52- brew install postgresql@ ${ version }
53- mkdir -p ${ FILEPATH_PREFIX } /data;
54- initdb -D ${ FILEPATH_PREFIX } /data;
55- pg_ctl -D ${ FILEPATH_PREFIX } /data -l ${ FILEPATH_PREFIX } /logfile start;
64+ ${ installation }
65+ mkdir -p ${ PD_TEMP_DATA_PATH } /data;
66+ initdb -D ${ PD_TEMP_DATA_PATH } /data;
67+ pg_ctl -D ${ PD_TEMP_DATA_PATH } /data -o "-F -p ${ port } " - l ${ PD_TEMP_DATA_PATH } /logfile start;
5668 ` ;
5769 }
5870 case 'win32' : {
5971 throw new Error ( 'Unsupported OS, try run on OS X or Linux' ) ;
6072 }
6173 default : {
74+ // eslint-disable-next-line
75+ const installation = includeInstallation ? `sudo apt update; sudo apt install postgresql-${ version } ;` : '' ;
76+
6277 return `
63- apt-get update
64- apt-get install -y postgresql-${ version }
65- mkdir -p ${ FILEPATH_PREFIX } /data;
66- /usr/lib/postgresql/${ version } /bin/initdb -D ${ FILEPATH_PREFIX } /data;
67- /usr/lib/postgresql/${ version } /bin/pg_ctl -D ${ FILEPATH_PREFIX } /data -l ${ FILEPATH_PREFIX } logfile start;
78+ ${ installation }
79+ sudo -u postgres mkdir -p ${ PD_TEMP_DATA_PATH } /data;
80+ sudo -u postgres /usr/lib/postgresql/${ version } /bin/initdb -D ${ PD_TEMP_DATA_PATH } /data;
81+ sudo -u postgres /usr/lib/postgresql/${ version } /bin/pg_ctl -o "-F -p ${ port } " -D ${ PD_TEMP_DATA_PATH } /data -l ${ PD_TEMP_DATA_PATH } /logfile start;
82+ sudo -u postgres createuser -p ${ port } -s $(whoami);
83+ sudo -u postgres createdb -p ${ port } $(whoami);
6884 ` ;
6985 }
7086 }
7187}
7288
73- export function getStopScript ( version ?: string ) : string {
89+ export function getStopScript ( { version = 14 } ) : string {
7490 switch ( platform ( ) ) {
7591 case 'darwin' : {
7692 return `
77- pg_ctl stop -D ${ FILEPATH_PREFIX } /data
78- rm -rf ${ FILEPATH_PREFIX }
93+ pg_ctl stop -D ${ PD_TEMP_DATA_PATH } /data
94+ rm -rf ${ PD_TEMP_DATA_PATH }
7995 ` ;
8096 }
8197 default : {
8298 return `
83- /usr/lib/postgresql/${ version } /bin/pg_ctl -D ${ FILEPATH_PREFIX } /data
84- rm -rf ${ FILEPATH_PREFIX }
99+ sudo -u postgres /usr/lib/postgresql/${ version } /bin/pg_ctl stop -D ${ PD_TEMP_DATA_PATH } /data
100+ sudo -u postgres rm -rf ${ PD_TEMP_DATA_PATH }
85101 ` ;
86102 }
87103 }
0 commit comments