@@ -310,19 +310,19 @@ FOO=foo
310
310
it ( "never affects the filesystem if the list of keys to write is empty" , ( ) => {
311
311
env . writeUserEnvs (
312
312
{ } ,
313
- { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir } ,
313
+ { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir , codebase : "default" } ,
314
314
) ;
315
315
env . writeUserEnvs (
316
316
{ } ,
317
- { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir , isEmulator : true } ,
317
+ { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir , isEmulator : true , codebase : "default" } ,
318
318
) ;
319
319
expect ( ( ) => fs . statSync ( path . join ( tmpdir , ".env.alias" ) ) ) . to . throw ;
320
320
expect ( ( ) => fs . statSync ( path . join ( tmpdir , ".env.project" ) ) ) . to . throw ;
321
321
expect ( ( ) => fs . statSync ( path . join ( tmpdir , ".env.local" ) ) ) . to . throw ;
322
322
} ) ;
323
323
324
324
it ( "touches .env.projectId if it doesn't already exist" , ( ) => {
325
- env . writeUserEnvs ( { FOO : "bar" } , { projectId : "project" , functionsSource : tmpdir } ) ;
325
+ env . writeUserEnvs ( { FOO : "bar" } , { projectId : "project" , functionsSource : tmpdir , codebase : "default" } ) ;
326
326
expect ( ( ) => fs . statSync ( path . join ( tmpdir , ".env.alias" ) ) ) . to . throw ;
327
327
expect ( ! ! fs . statSync ( path . join ( tmpdir , ".env.project" ) ) ) . to . be . true ;
328
328
expect ( ( ) => fs . statSync ( path . join ( tmpdir , ".env.local" ) ) ) . to . throw ;
@@ -331,7 +331,7 @@ FOO=foo
331
331
it ( "touches .env.local if it doesn't already exist in emulator mode" , ( ) => {
332
332
env . writeUserEnvs (
333
333
{ FOO : "bar" } ,
334
- { projectId : "project" , functionsSource : tmpdir , isEmulator : true } ,
334
+ { projectId : "project" , functionsSource : tmpdir , isEmulator : true , codebase : "default" } ,
335
335
) ;
336
336
expect ( ( ) => fs . statSync ( path . join ( tmpdir , ".env.alias" ) ) ) . to . throw ;
337
337
expect ( ( ) => fs . statSync ( path . join ( tmpdir , ".env.project" ) ) ) . to . throw ;
@@ -343,7 +343,7 @@ FOO=foo
343
343
[ ".env.project" ] : "FOO=foo" ,
344
344
} ) ;
345
345
expect ( ( ) =>
346
- env . writeUserEnvs ( { FOO : "bar" } , { projectId : "project" , functionsSource : tmpdir } ) ,
346
+ env . writeUserEnvs ( { FOO : "bar" } , { projectId : "project" , functionsSource : tmpdir , codebase : "default" } ) ,
347
347
) . to . throw ( FirebaseError ) ;
348
348
} ) ;
349
349
@@ -353,14 +353,15 @@ FOO=foo
353
353
} ) ;
354
354
env . writeUserEnvs (
355
355
{ FOO : "bar" } ,
356
- { projectId : "project" , functionsSource : tmpdir , isEmulator : true } ,
356
+ { projectId : "project" , functionsSource : tmpdir , isEmulator : true , codebase : "default" } ,
357
357
) ;
358
358
expect (
359
359
env . loadUserEnvs ( {
360
360
projectId : "project" ,
361
361
projectAlias : "alias" ,
362
362
functionsSource : tmpdir ,
363
363
isEmulator : true ,
364
+ codebase : "default" ,
364
365
} ) [ "FOO" ] ,
365
366
) . to . equal ( "bar" ) ;
366
367
} ) ;
@@ -372,7 +373,7 @@ FOO=foo
372
373
expect ( ( ) =>
373
374
env . writeUserEnvs (
374
375
{ FOO : "baz" } ,
375
- { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir } ,
376
+ { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir , codebase : "default" } ,
376
377
) ,
377
378
) . to . throw ( FirebaseError ) ;
378
379
} ) ;
@@ -383,14 +384,15 @@ FOO=foo
383
384
} ) ;
384
385
env . writeUserEnvs (
385
386
{ FOO : "baz" } ,
386
- { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir , isEmulator : true } ,
387
+ { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir , isEmulator : true , codebase : "default" } ,
387
388
) ;
388
389
expect (
389
390
env . loadUserEnvs ( {
390
391
projectId : "project" ,
391
392
projectAlias : "alias" ,
392
393
functionsSource : tmpdir ,
393
394
isEmulator : true ,
395
+ codebase : "default" ,
394
396
} ) [ "FOO" ] ,
395
397
) . to . equal ( "baz" ) ;
396
398
} ) ;
@@ -402,7 +404,7 @@ FOO=foo
402
404
expect ( ( ) =>
403
405
env . writeUserEnvs (
404
406
{ ASDF : "bar" } ,
405
- { projectId : "project" , functionsSource : tmpdir , isEmulator : true } ,
407
+ { projectId : "project" , functionsSource : tmpdir , isEmulator : true , codebase : "default" } ,
406
408
) ,
407
409
) . to . throw ( FirebaseError ) ;
408
410
} ) ;
@@ -411,30 +413,30 @@ FOO=foo
411
413
expect ( ( ) =>
412
414
env . writeUserEnvs (
413
415
{ lowercase : "bar" } ,
414
- { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir } ,
416
+ { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir , codebase : "default" } ,
415
417
) ,
416
418
) . to . throw ( env . KeyValidationError ) ;
417
419
expect ( ( ) =>
418
420
env . writeUserEnvs (
419
421
{ GCP_PROJECT : "bar" } ,
420
- { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir } ,
422
+ { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir , codebase : "default" } ,
421
423
) ,
422
424
) . to . throw ( env . KeyValidationError ) ;
423
425
expect ( ( ) =>
424
426
env . writeUserEnvs (
425
427
{ FIREBASE_KEY : "bar" } ,
426
- { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir } ,
428
+ { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir , codebase : "default" } ,
427
429
) ,
428
430
) . to . throw ( env . KeyValidationError ) ;
429
431
} ) ;
430
432
431
433
it ( "writes the specified key to a .env.projectId that it created" , ( ) => {
432
434
env . writeUserEnvs (
433
435
{ FOO : "bar" } ,
434
- { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir } ,
436
+ { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir , codebase : "default" } ,
435
437
) ;
436
438
expect (
437
- env . loadUserEnvs ( { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir } ) [
439
+ env . loadUserEnvs ( { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir , codebase : "default" } ) [
438
440
"FOO"
439
441
] ,
440
442
) . to . equal ( "bar" ) ;
@@ -446,10 +448,10 @@ FOO=foo
446
448
} ) ;
447
449
env . writeUserEnvs (
448
450
{ FOO : "bar" } ,
449
- { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir } ,
451
+ { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir , codebase : "default" } ,
450
452
) ;
451
453
expect (
452
- env . loadUserEnvs ( { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir } ) [
454
+ env . loadUserEnvs ( { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir , codebase : "default" } ) [
453
455
"FOO"
454
456
] ,
455
457
) . to . equal ( "bar" ) ;
@@ -458,12 +460,13 @@ FOO=foo
458
460
it ( "writes multiple keys at once" , ( ) => {
459
461
env . writeUserEnvs (
460
462
{ FOO : "foo" , BAR : "bar" } ,
461
- { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir } ,
463
+ { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir , codebase : "default" } ,
462
464
) ;
463
465
const envs = env . loadUserEnvs ( {
464
466
projectId : "project" ,
465
467
projectAlias : "alias" ,
466
468
functionsSource : tmpdir ,
469
+ codebase : "default" ,
467
470
} ) ;
468
471
expect ( envs [ "FOO" ] ) . to . equal ( "foo" ) ;
469
472
expect ( envs [ "BAR" ] ) . to . equal ( "bar" ) ;
@@ -476,12 +479,13 @@ FOO=foo
476
479
WITH_SLASHES : "\n\\\r\\\t\\\v" ,
477
480
QUOTES : "'\"'" ,
478
481
} ,
479
- { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir } ,
482
+ { projectId : "project" , projectAlias : "alias" , functionsSource : tmpdir , codebase : "default" } ,
480
483
) ;
481
484
const envs = env . loadUserEnvs ( {
482
485
projectId : "project" ,
483
486
projectAlias : "alias" ,
484
487
functionsSource : tmpdir ,
488
+ codebase : "default" ,
485
489
} ) ;
486
490
expect ( envs [ "ESCAPES" ] ) . to . equal ( "\n\r\t\v" ) ;
487
491
expect ( envs [ "WITH_SLASHES" ] ) . to . equal ( "\n\\\r\\\t\\\v" ) ;
@@ -492,12 +496,12 @@ FOO=foo
492
496
try {
493
497
env . writeUserEnvs (
494
498
{ FOO : "bar" , lowercase : "bar" } ,
495
- { projectId : "project" , functionsSource : tmpdir } ,
499
+ { projectId : "project" , functionsSource : tmpdir , codebase : "default" } ,
496
500
) ;
497
501
} catch ( err : any ) {
498
502
// no-op
499
503
}
500
- expect ( env . loadUserEnvs ( { projectId : "project" , functionsSource : tmpdir } ) [ "FOO" ] ) . to . be
504
+ expect ( env . loadUserEnvs ( { projectId : "project" , functionsSource : tmpdir , codebase : "default" } ) [ "FOO" ] ) . to . be
501
505
. undefined ;
502
506
} ) ;
503
507
} ) ;
@@ -511,6 +515,7 @@ FOO=foo
511
515
const projectInfo : Omit < env . UserEnvsOpts , "functionsSource" > = {
512
516
projectId : "my-project" ,
513
517
projectAlias : "dev" ,
518
+ codebase : "default" ,
514
519
} ;
515
520
let tmpdir : string ;
516
521
@@ -695,6 +700,78 @@ FOO=foo
695
700
env . loadUserEnvs ( { ...projectInfo , functionsSource : tmpdir } ) ;
696
701
} ) . to . throw ( "Failed to load" ) ;
697
702
} ) ;
703
+
704
+ describe ( "codebase environment variables" , ( ) => {
705
+ it ( "loads envs from .env.<codebase> file" , ( ) => {
706
+ createEnvFiles ( tmpdir , {
707
+ [ `.env.${ projectInfo . codebase } ` ] : "FOO=codebase-foo\nBAR=codebase-bar" ,
708
+ } ) ;
709
+
710
+ expect ( env . loadUserEnvs ( { ...projectInfo , functionsSource : tmpdir } ) ) . to . be . deep . equal ( {
711
+ FOO : "codebase-foo" ,
712
+ BAR : "codebase-bar" ,
713
+ } ) ;
714
+ } ) ;
715
+
716
+ it ( "loads envs with correct precedence: .env < .env.<codebase> < .env.<project>" , ( ) => {
717
+ createEnvFiles ( tmpdir , {
718
+ ".env" : "FOO=global\nBAR=global\nBAZ=global" ,
719
+ [ `.env.${ projectInfo . codebase } ` ] : "FOO=codebase\nBAR=codebase" ,
720
+ [ `.env.${ projectInfo . projectId } ` ] : "FOO=project" ,
721
+ } ) ;
722
+
723
+ expect ( env . loadUserEnvs ( { ...projectInfo , functionsSource : tmpdir } ) ) . to . be . deep . equal ( {
724
+ FOO : "project" , // project overrides codebase
725
+ BAR : "codebase" , // codebase overrides global
726
+ BAZ : "global" , // only defined in global
727
+ } ) ;
728
+ } ) ;
729
+
730
+ it ( "loads envs with correct precedence: .env < .env.<codebase> < .env.<alias>" , ( ) => {
731
+ createEnvFiles ( tmpdir , {
732
+ ".env" : "FOO=global\nBAR=global\nBAZ=global" ,
733
+ [ `.env.${ projectInfo . codebase } ` ] : "FOO=codebase\nBAR=codebase" ,
734
+ [ `.env.${ projectInfo . projectAlias } ` ] : "FOO=alias" ,
735
+ } ) ;
736
+
737
+ expect ( env . loadUserEnvs ( { ...projectInfo , functionsSource : tmpdir } ) ) . to . be . deep . equal ( {
738
+ FOO : "alias" , // alias overrides codebase
739
+ BAR : "codebase" , // codebase overrides global
740
+ BAZ : "global" , // only defined in global
741
+ } ) ;
742
+ } ) ;
743
+
744
+ it ( "works with custom codebase names" , ( ) => {
745
+ const customProjectInfo = { ...projectInfo , codebase : "profile-pics-resizer" } ;
746
+ createEnvFiles ( tmpdir , {
747
+ ".env" : "FOO=global" ,
748
+ ".env.profile-pics-resizer" : "FOO=custom-codebase\nCUSTOM=value" ,
749
+ } ) ;
750
+
751
+ expect ( env . loadUserEnvs ( { ...customProjectInfo , functionsSource : tmpdir } ) ) . to . be . deep . equal ( {
752
+ FOO : "custom-codebase" ,
753
+ CUSTOM : "value" ,
754
+ } ) ;
755
+ } ) ;
756
+
757
+ it ( "loads envs correctly for emulator with .env.local precedence" , ( ) => {
758
+ createEnvFiles ( tmpdir , {
759
+ ".env" : "FOO=global\nBAR=global\nBAZ=global" ,
760
+ [ `.env.${ projectInfo . codebase } ` ] : "FOO=codebase\nBAR=codebase" ,
761
+ [ `.env.${ projectInfo . projectId } ` ] : "FOO=project" ,
762
+ ".env.local" : "FOO=local" ,
763
+ } ) ;
764
+
765
+ expect (
766
+ env . loadUserEnvs ( { ...projectInfo , functionsSource : tmpdir , isEmulator : true } ) ,
767
+ ) . to . be . deep . equal ( {
768
+ FOO : "local" , // .env.local has highest precedence in emulator
769
+ BAR : "codebase" , // codebase overrides global
770
+ BAZ : "global" , // only defined in global
771
+ } ) ;
772
+ } ) ;
773
+
774
+ } ) ;
698
775
} ) ;
699
776
700
777
describe ( "parseStrict" , ( ) => {
0 commit comments