@@ -22,6 +22,13 @@ const databasePath = join(app.getPath('userData'), 'database');
22
22
const databaseFile = join ( databasePath , 'database.sqlite' ) ;
23
23
const argumentEnv = getArgumentEnv ( ) ;
24
24
const appPath = getAppPath ( ) ;
25
+ function runningSecureBuild ( ) {
26
+ return existsSync ( join ( appPath , 'build' , '__nativephp_app_bundle' ) ) ;
27
+ }
28
+ function shouldMigrateDatabase ( store ) {
29
+ return store . get ( 'migrated_version' ) !== app . getVersion ( )
30
+ && process . env . NODE_ENV !== 'development' ;
31
+ }
25
32
function getPhpPort ( ) {
26
33
return __awaiter ( this , void 0 , void 0 , function * ( ) {
27
34
return yield getPort ( {
@@ -41,7 +48,11 @@ function retrievePhpIniSettings() {
41
48
cwd : appPath ,
42
49
env
43
50
} ;
44
- return yield promisify ( execFile ) ( state . php , [ 'artisan' , 'native:php-ini' ] , phpOptions ) ;
51
+ let command = [ 'artisan' , 'native:php-ini' ] ;
52
+ if ( runningSecureBuild ( ) ) {
53
+ command . unshift ( join ( appPath , 'build' , '__nativephp_app_bundle' ) ) ;
54
+ }
55
+ return yield promisify ( execFile ) ( state . php , command , phpOptions ) ;
45
56
} ) ;
46
57
}
47
58
function retrieveNativePHPConfig ( ) {
@@ -55,14 +66,24 @@ function retrieveNativePHPConfig() {
55
66
cwd : appPath ,
56
67
env
57
68
} ;
58
- return yield promisify ( execFile ) ( state . php , [ 'artisan' , 'native:config' ] , phpOptions ) ;
69
+ let command = [ 'artisan' , 'native:config' ] ;
70
+ if ( runningSecureBuild ( ) ) {
71
+ command . unshift ( join ( appPath , 'build' , '__nativephp_app_bundle' ) ) ;
72
+ }
73
+ return yield promisify ( execFile ) ( state . php , command , phpOptions ) ;
59
74
} ) ;
60
75
}
61
76
function callPhp ( args , options , phpIniSettings = { } ) {
77
+ if ( args [ 0 ] === 'artisan' && runningSecureBuild ( ) ) {
78
+ args . unshift ( join ( appPath , 'build' , '__nativephp_app_bundle' ) ) ;
79
+ }
62
80
let iniSettings = Object . assign ( getDefaultPhpIniSettings ( ) , phpIniSettings ) ;
63
81
Object . keys ( iniSettings ) . forEach ( key => {
64
82
args . unshift ( '-d' , `${ key } =${ iniSettings [ key ] } ` ) ;
65
83
} ) ;
84
+ if ( parseInt ( process . env . SHELL_VERBOSITY ) > 0 ) {
85
+ console . log ( 'Calling PHP' , state . php , args ) ;
86
+ }
66
87
return spawn ( state . php , args , {
67
88
cwd : options . cwd ,
68
89
env : Object . assign ( Object . assign ( { } , process . env ) , options . env ) ,
@@ -116,6 +137,7 @@ function getDefaultEnvironmentVariables(secret, apiPort) {
116
137
return {
117
138
APP_ENV : process . env . NODE_ENV === 'development' ? 'local' : 'production' ,
118
139
APP_DEBUG : process . env . NODE_ENV === 'development' ? 'true' : 'false' ,
140
+ LARAVEL_STORAGE_PATH : storagePath ,
119
141
NATIVEPHP_STORAGE_PATH : storagePath ,
120
142
NATIVEPHP_DATABASE_PATH : databaseFile ,
121
143
NATIVEPHP_API_URL : `http://localhost:${ apiPort } /api/` ,
@@ -152,8 +174,10 @@ function serveApp(secret, apiPort, phpIniSettings) {
152
174
env
153
175
} ;
154
176
const store = new Store ( ) ;
155
- callPhp ( [ 'artisan' , 'storage:link' , '--force' ] , phpOptions , phpIniSettings ) ;
156
- if ( store . get ( 'migrated_version' ) !== app . getVersion ( ) && process . env . NODE_ENV !== 'development' ) {
177
+ if ( ! runningSecureBuild ( ) ) {
178
+ callPhp ( [ 'artisan' , 'storage:link' , '--force' ] , phpOptions , phpIniSettings ) ;
179
+ }
180
+ if ( shouldMigrateDatabase ( store ) ) {
157
181
console . log ( 'Migrating database...' ) ;
158
182
callPhp ( [ 'artisan' , 'migrate' , '--force' ] , phpOptions , phpIniSettings ) ;
159
183
store . set ( 'migrated_version' , app . getVersion ( ) ) ;
@@ -162,40 +186,36 @@ function serveApp(secret, apiPort, phpIniSettings) {
162
186
console . log ( 'Skipping Database migration while in development.' ) ;
163
187
console . log ( 'You may migrate manually by running: php artisan native:migrate' ) ;
164
188
}
189
+ console . log ( 'Starting PHP server...' ) ;
165
190
const phpPort = yield getPhpPort ( ) ;
166
- const serverPath = join ( appPath , 'vendor' , 'laravel' , 'framework' , 'src' , 'Illuminate' , 'Foundation' , 'resources' , 'server.php' ) ;
191
+ let serverPath = join ( appPath , 'build' , '__nativephp_app_bundle' ) ;
192
+ if ( ! runningSecureBuild ( ) ) {
193
+ console . log ( '* * * Running from source * * *' ) ;
194
+ serverPath = join ( appPath , 'vendor' , 'laravel' , 'framework' , 'src' , 'Illuminate' , 'Foundation' , 'resources' , 'server.php' ) ;
195
+ }
167
196
const phpServer = callPhp ( [ '-S' , `127.0.0.1:${ phpPort } ` , serverPath ] , {
168
197
cwd : join ( appPath , 'public' ) ,
169
198
env
170
199
} , phpIniSettings ) ;
171
200
const portRegex = / D e v e l o p m e n t S e r v e r \( .* : ( [ 0 - 9 ] + ) \) s t a r t e d / gm;
172
201
phpServer . stdout . on ( 'data' , ( data ) => {
173
- const match = portRegex . exec ( data . toString ( ) ) ;
174
- if ( match ) {
175
- console . log ( "PHP Server started on port: " , match [ 1 ] ) ;
176
- const port = parseInt ( match [ 1 ] ) ;
177
- resolve ( {
178
- port,
179
- process : phpServer
180
- } ) ;
181
- }
182
202
} ) ;
183
203
phpServer . stderr . on ( 'data' , ( data ) => {
184
204
const error = data . toString ( ) ;
185
- const match = portRegex . exec ( error ) ;
205
+ const match = portRegex . exec ( data . toString ( ) ) ;
186
206
if ( match ) {
187
207
const port = parseInt ( match [ 1 ] ) ;
188
208
console . log ( "PHP Server started on port: " , port ) ;
189
209
resolve ( {
190
210
port,
191
- process : phpServer
211
+ process : phpServer ,
192
212
} ) ;
193
213
}
194
214
else {
195
- if ( error . startsWith ( '[NATIVE_EXCEPTION]: ' , 27 ) ) {
215
+ if ( error . includes ( '[NATIVE_EXCEPTION]:' ) ) {
196
216
console . log ( ) ;
197
217
console . error ( 'Error in PHP:' ) ;
198
- console . error ( ' ' + error . slice ( 47 ) ) ;
218
+ console . error ( ' ' + error . split ( '[NATIVE_EXCEPTION]:' ) [ 1 ] . trim ( ) ) ;
199
219
console . log ( 'Please check your log file:' ) ;
200
220
console . log ( ' ' + join ( appPath , 'storage' , 'logs' , 'laravel.log' ) ) ;
201
221
console . log ( ) ;
@@ -205,6 +225,9 @@ function serveApp(secret, apiPort, phpIniSettings) {
205
225
phpServer . on ( 'error' , ( error ) => {
206
226
reject ( error ) ;
207
227
} ) ;
228
+ phpServer . on ( 'close' , ( code ) => {
229
+ console . log ( `PHP server exited with code ${ code } ` ) ;
230
+ } ) ;
208
231
} ) ) ;
209
232
}
210
233
export { startScheduler , serveApp , getAppPath , retrieveNativePHPConfig , retrievePhpIniSettings , getDefaultEnvironmentVariables , getDefaultPhpIniSettings } ;
0 commit comments