@leverege/build-tools 2.8.12 → 2.8.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/lib/server/repo-init/config.tgz +0 -0
  2. package/package.json +5 -1
  3. package/src/anchor +41 -0
  4. package/src/dockreate +1 -1
  5. package/lib/server/service-man/Config.js +0 -45
  6. package/lib/server/service-man/ServiceMan.js +0 -42
  7. package/lib/server/service-man/index.js +0 -6
  8. package/lib/server/service-man/utils/Shell.js +0 -102
  9. package/lib/server/service-man/utils/VersionCheck.js +0 -82
  10. package/lib/server/service-man/utils/index.js +0 -67
  11. package/lib/web/service-man/Config.js +0 -45
  12. package/lib/web/service-man/ServiceMan.js +0 -42
  13. package/lib/web/service-man/index.js +0 -6
  14. package/lib/web/service-man/utils/Shell.js +0 -102
  15. package/lib/web/service-man/utils/VersionCheck.js +0 -82
  16. package/lib/web/service-man/utils/index.js +0 -67
  17. package/src/helm-starters/baseline/Chart.yaml +0 -4
  18. package/src/helm-starters/baseline/templates/NOTES.txt +0 -52
  19. package/src/helm-starters/baseline/templates/configmap.yaml +0 -6
  20. package/src/helm-starters/baseline/templates/deployment.yaml +0 -97
  21. package/src/helm-starters/baseline/templates/hpa.yaml +0 -12
  22. package/src/helm-starters/baseline/templates/ingress.yaml +0 -17
  23. package/src/helm-starters/baseline/templates/pdb.yaml +0 -9
  24. package/src/helm-starters/baseline/templates/service.yaml +0 -16
  25. package/src/helm-starters/baseline/templates/serviceaccount.yaml +0 -10
  26. package/src/helm-starters/baseline/values.yaml +0 -57
  27. package/src/helm-starters/deprecated/Chart.yaml +0 -4
  28. package/src/helm-starters/deprecated/templates/NOTES.txt +0 -52
  29. package/src/helm-starters/deprecated/templates/configmap.yaml +0 -11
  30. package/src/helm-starters/deprecated/templates/deployment.yaml +0 -103
  31. package/src/helm-starters/deprecated/templates/hpa.yaml +0 -12
  32. package/src/helm-starters/deprecated/templates/ingress.yaml +0 -17
  33. package/src/helm-starters/deprecated/templates/pdb.yaml +0 -9
  34. package/src/helm-starters/deprecated/templates/service.yaml +0 -13
  35. package/src/helm-starters/deprecated/templates/serviceaccount.yaml +0 -10
  36. package/src/helm-starters/deprecated/values.yaml +0 -44
  37. package/src/sa-tools/imp-sa +0 -26
  38. package/src/sa-tools/roles/baseline/leveregeBigQueryReader.json +0 -10
  39. package/src/sa-tools/roles/baseline/leveregeBigQueryWriter.json +0 -10
  40. package/src/sa-tools/roles/baseline/leveregeCloudFunctionsAdmin.json +0 -12
  41. package/src/sa-tools/roles/baseline/leveregeFirebaseUpdates.json +0 -8
  42. package/src/sa-tools/roles/baseline/leveregeLogsViewer.json +0 -8
  43. package/src/sa-tools/roles/baseline/leveregePubSub.json +0 -13
  44. package/src/sa-tools/roles/baseline/leveregeSecretsViewer.json +0 -8
  45. package/src/sa-tools/roles/baseline/leveregeStorageObjectAccess.json +0 -10
  46. package/src/sa-tools/roles/baseline/leveregeSvcAcctActor.json +0 -8
  47. package/src/sa-tools/roles/baseline/leveregeSvcAcctTokenCreator.json +0 -8
  48. package/src/sa-tools/roles/leverege-dev-john/20220113-121423/leveregeBigQueryReader.json +0 -10
  49. package/src/sa-tools/roles/leverege-dev-john/20220113-121423/leveregeBigQueryWriter.json +0 -10
  50. package/src/sa-tools/roles/leverege-dev-john/20220113-121423/leveregeCloudFunctionsAdmin.json +0 -12
  51. package/src/sa-tools/roles/leverege-dev-john/20220113-121423/leveregeFirebaseUpdates.json +0 -8
  52. package/src/sa-tools/roles/leverege-dev-john/20220113-121423/leveregeLogsViewer.json +0 -8
  53. package/src/sa-tools/roles/leverege-dev-john/20220113-121423/leveregePubSub.json +0 -13
  54. package/src/sa-tools/roles/leverege-dev-john/20220113-121423/leveregeSecretsViewer.json +0 -8
  55. package/src/sa-tools/roles/leverege-dev-john/20220113-121423/leveregeStorageObjectAccess.json +0 -10
  56. package/src/sa-tools/roles/leverege-dev-john/20220113-121423/leveregeSvcAcctActor.json +0 -8
  57. package/src/sa-tools/roles/leverege-dev-john/20220113-121423/leveregeSvcAcctTokenCreator.json +0 -8
  58. package/src/sa-tools/roles/prd-indoor-zoning/20220113-121935/leveregeBigQueryReader.json +0 -10
  59. package/src/sa-tools/roles/prd-indoor-zoning/20220113-121935/leveregeBigQueryWriter.json +0 -10
  60. package/src/sa-tools/roles/prd-indoor-zoning/20220113-121935/leveregeCloudFunctionsAdmin.json +0 -12
  61. package/src/sa-tools/roles/prd-indoor-zoning/20220113-121935/leveregeFirebaseUpdates.json +0 -8
  62. package/src/sa-tools/roles/prd-indoor-zoning/20220113-121935/leveregeLogsViewer.json +0 -8
  63. package/src/sa-tools/roles/prd-indoor-zoning/20220113-121935/leveregePubSub.json +0 -13
  64. package/src/sa-tools/roles/prd-indoor-zoning/20220113-121935/leveregeSecretsViewer.json +0 -8
  65. package/src/sa-tools/roles/prd-indoor-zoning/20220113-121935/leveregeStorageObjectAccess.json +0 -10
  66. package/src/sa-tools/roles/prd-indoor-zoning/20220113-121935/leveregeSvcAcctActor.json +0 -8
  67. package/src/sa-tools/roles/prd-indoor-zoning/20220113-121935/leveregeSvcAcctTokenCreator.json +0 -8
  68. package/src/sa-tools/roles-grab +0 -30
  69. package/src/sa-tools/roles-push +0 -19
  70. package/src/sa-tools/sh-make-sa +0 -58
  71. package/src/service-man/Config.js +0 -40
  72. package/src/service-man/ServiceMan.js +0 -32
  73. package/src/service-man/index.js +0 -5
  74. package/src/service-man/utils/Shell.js +0 -95
  75. package/src/service-man/utils/VersionCheck.js +0 -77
  76. package/src/service-man/utils/index.js +0 -54
@@ -1,10 +0,0 @@
1
- {
2
- "description": "Leverege Big Query Writer",
3
- "includedPermissions": [
4
- "bigquery.datasets.get",
5
- "bigquery.tables.get",
6
- "bigquery.tables.updateData"
7
- ],
8
- "stage": "BETA",
9
- "title": "Leverege Big Query Writer"
10
- }
@@ -1,12 +0,0 @@
1
- {
2
- "description": "Leverege limited Cloud Functions Admin",
3
- "includedPermissions": [
4
- "cloudfunctions.functions.create",
5
- "cloudfunctions.functions.delete",
6
- "cloudfunctions.functions.get",
7
- "cloudfunctions.functions.sourceCodeSet",
8
- "cloudfunctions.functions.update"
9
- ],
10
- "stage": "BETA",
11
- "title": "Leverege Cloud Functions Admin"
12
- }
@@ -1,8 +0,0 @@
1
- {
2
- "description": "Leverege Firebase Updates Access",
3
- "includedPermissions": [
4
- "firebasedatabase.instances.update"
5
- ],
6
- "stage": "BETA",
7
- "title": "Leverege Firebase Updates"
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "description": "Leverege view access to logs",
3
- "includedPermissions": [
4
- "logging.logEntries.list"
5
- ],
6
- "stage": "BETA",
7
- "title": "Leverege Logs Viewer"
8
- }
@@ -1,13 +0,0 @@
1
- {
2
- "description": "Leverege Pub/Sub",
3
- "includedPermissions": [
4
- "pubsub.subscriptions.consume",
5
- "pubsub.subscriptions.create",
6
- "pubsub.topics.attachSubscription",
7
- "pubsub.topics.create",
8
- "pubsub.topics.list",
9
- "pubsub.topics.publish"
10
- ],
11
- "stage": "BETA",
12
- "title": "Leverege Pub/Sub"
13
- }
@@ -1,8 +0,0 @@
1
- {
2
- "description": "Custom Secrets Manager Access",
3
- "includedPermissions": [
4
- "secretmanager.versions.access"
5
- ],
6
- "stage": "BETA",
7
- "title": "Leverege Secret Viewer"
8
- }
@@ -1,10 +0,0 @@
1
- {
2
- "description": "Leverege read / write access to Storage Objects",
3
- "includedPermissions": [
4
- "storage.objects.create",
5
- "storage.objects.delete",
6
- "storage.objects.get"
7
- ],
8
- "stage": "BETA",
9
- "title": "Leverege Storage Object Admin"
10
- }
@@ -1,8 +0,0 @@
1
- {
2
- "description": "Leverege service account act as other user",
3
- "includedPermissions": [
4
- "iam.serviceAccounts.actAs"
5
- ],
6
- "stage": "BETA",
7
- "title": "Leverege Svc Acct Impersonation"
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "description": "Leverege IAM blob signing access",
3
- "includedPermissions": [
4
- "iam.serviceAccounts.signBlob"
5
- ],
6
- "stage": "BETA",
7
- "title": "Leverege Svc Acct Token Creator"
8
- }
@@ -1,10 +0,0 @@
1
- {
2
- "description": "Leverege BQ data accessor",
3
- "includedPermissions": [
4
- "bigquery.jobs.create",
5
- "bigquery.tables.create",
6
- "bigquery.tables.getData"
7
- ],
8
- "stage": "BETA",
9
- "title": "Leverege Big Query Reader"
10
- }
@@ -1,10 +0,0 @@
1
- {
2
- "description": "Leverege Big Query Writer",
3
- "includedPermissions": [
4
- "bigquery.datasets.get",
5
- "bigquery.tables.get",
6
- "bigquery.tables.updateData"
7
- ],
8
- "stage": "BETA",
9
- "title": "Leverege Big Query Writer"
10
- }
@@ -1,12 +0,0 @@
1
- {
2
- "description": "Leverege limited Cloud Functions Admin",
3
- "includedPermissions": [
4
- "cloudfunctions.functions.create",
5
- "cloudfunctions.functions.delete",
6
- "cloudfunctions.functions.get",
7
- "cloudfunctions.functions.sourceCodeSet",
8
- "cloudfunctions.functions.update"
9
- ],
10
- "stage": "BETA",
11
- "title": "Leverege Cloud Functions Admin"
12
- }
@@ -1,8 +0,0 @@
1
- {
2
- "description": "Leverege Firebase Updates Access",
3
- "includedPermissions": [
4
- "firebasedatabase.instances.update"
5
- ],
6
- "stage": "BETA",
7
- "title": "Leverege Firebase Updates"
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "description": "Leverege view access to logs",
3
- "includedPermissions": [
4
- "logging.logEntries.list"
5
- ],
6
- "stage": "BETA",
7
- "title": "Leverege Logs Viewer"
8
- }
@@ -1,13 +0,0 @@
1
- {
2
- "description": "Leverege Pub/Sub",
3
- "includedPermissions": [
4
- "pubsub.subscriptions.consume",
5
- "pubsub.subscriptions.create",
6
- "pubsub.topics.attachSubscription",
7
- "pubsub.topics.create",
8
- "pubsub.topics.list",
9
- "pubsub.topics.publish"
10
- ],
11
- "stage": "BETA",
12
- "title": "Leverege Pub/Sub"
13
- }
@@ -1,8 +0,0 @@
1
- {
2
- "description": "Custom Secrets Manager Access",
3
- "includedPermissions": [
4
- "secretmanager.versions.access"
5
- ],
6
- "stage": "BETA",
7
- "title": "Leverege Secret Viewer"
8
- }
@@ -1,10 +0,0 @@
1
- {
2
- "description": "Leverege read / write access to Storage Objects",
3
- "includedPermissions": [
4
- "storage.objects.create",
5
- "storage.objects.delete",
6
- "storage.objects.get"
7
- ],
8
- "stage": "BETA",
9
- "title": "Leverege Storage Object Admin"
10
- }
@@ -1,8 +0,0 @@
1
- {
2
- "description": "Leverege service account act as other user",
3
- "includedPermissions": [
4
- "iam.serviceAccounts.actAs"
5
- ],
6
- "stage": "BETA",
7
- "title": "Leverege Svc Acct Impersonation"
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "description": "Leverege IAM blob signing access",
3
- "includedPermissions": [
4
- "iam.serviceAccounts.signBlob"
5
- ],
6
- "stage": "BETA",
7
- "title": "Leverege Svc Acct Token Creator"
8
- }
@@ -1,10 +0,0 @@
1
- {
2
- "description": "Leverege BQ data accessor",
3
- "includedPermissions": [
4
- "bigquery.jobs.create",
5
- "bigquery.tables.create",
6
- "bigquery.tables.getData"
7
- ],
8
- "stage": "BETA",
9
- "title": "Leverege Big Query Reader"
10
- }
@@ -1,10 +0,0 @@
1
- {
2
- "description": "Leverege Big Query Writer",
3
- "includedPermissions": [
4
- "bigquery.datasets.get",
5
- "bigquery.tables.get",
6
- "bigquery.tables.updateData"
7
- ],
8
- "stage": "BETA",
9
- "title": "Leverege Big Query Writer"
10
- }
@@ -1,12 +0,0 @@
1
- {
2
- "description": "Leverege limited Cloud Functions Admin",
3
- "includedPermissions": [
4
- "cloudfunctions.functions.create",
5
- "cloudfunctions.functions.delete",
6
- "cloudfunctions.functions.get",
7
- "cloudfunctions.functions.sourceCodeSet",
8
- "cloudfunctions.functions.update"
9
- ],
10
- "stage": "BETA",
11
- "title": "Leverege Cloud Functions Admin"
12
- }
@@ -1,8 +0,0 @@
1
- {
2
- "description": "Leverege Firebase Updates Access",
3
- "includedPermissions": [
4
- "firebasedatabase.instances.update"
5
- ],
6
- "stage": "BETA",
7
- "title": "Leverege Firebase Updates"
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "description": "Leverege view access to logs",
3
- "includedPermissions": [
4
- "logging.logEntries.list"
5
- ],
6
- "stage": "BETA",
7
- "title": "Leverege Logs Viewer"
8
- }
@@ -1,13 +0,0 @@
1
- {
2
- "description": "Leverege Pub/Sub",
3
- "includedPermissions": [
4
- "pubsub.subscriptions.consume",
5
- "pubsub.subscriptions.create",
6
- "pubsub.topics.attachSubscription",
7
- "pubsub.topics.create",
8
- "pubsub.topics.list",
9
- "pubsub.topics.publish"
10
- ],
11
- "stage": "BETA",
12
- "title": "Leverege Pub/Sub"
13
- }
@@ -1,8 +0,0 @@
1
- {
2
- "description": "Custom Secrets Manager Access",
3
- "includedPermissions": [
4
- "secretmanager.versions.access"
5
- ],
6
- "stage": "BETA",
7
- "title": "Leverege Secret Viewer"
8
- }
@@ -1,10 +0,0 @@
1
- {
2
- "description": "Leverege read / write access to Storage Objects",
3
- "includedPermissions": [
4
- "storage.objects.create",
5
- "storage.objects.delete",
6
- "storage.objects.get"
7
- ],
8
- "stage": "BETA",
9
- "title": "Leverege Storage Object Admin"
10
- }
@@ -1,8 +0,0 @@
1
- {
2
- "description": "Leverege service account act as other user",
3
- "includedPermissions": [
4
- "iam.serviceAccounts.actAs"
5
- ],
6
- "stage": "BETA",
7
- "title": "Leverege Svc Acct Impersonation"
8
- }
@@ -1,8 +0,0 @@
1
- {
2
- "description": "Leverege IAM blob signing access",
3
- "includedPermissions": [
4
- "iam.serviceAccounts.signBlob"
5
- ],
6
- "stage": "BETA",
7
- "title": "Leverege Svc Acct Token Creator"
8
- }
@@ -1,30 +0,0 @@
1
- #!/bin/bash
2
- #
3
- # To fetch Leverege custom role names:
4
- # gcloud --project=<PROJ_NAME> iam roles list --filter=Leverege | grep name
5
- #
6
- LEVEREGE_ROLES=(
7
- leveregeBigQueryReader
8
- leveregeBigQueryWriter
9
- leveregeCloudFunctionsAdmin
10
- leveregeFirebaseUpdates
11
- leveregeLogsViewer
12
- leveregePubSub
13
- leveregeSecretsViewer
14
- leveregeStorageObjectAccess
15
- leveregeSvcAcctActor
16
- leveregeSvcAcctTokenCreator
17
- )
18
-
19
- PROJ=${1:-leverege-sandbox}
20
- DTS="`date +\"%Y%m%d-%H%M%S\"`"
21
- ROLESDIR="roles/${PROJ}/${DTS}"
22
- mkdir -p $ROLESDIR
23
-
24
- for ROLE in "${LEVEREGE_ROLES[@]}";
25
- do
26
- JSON="${ROLESDIR}/${ROLE}.json"
27
- printf "Fetching role $ROLE\n"
28
- gcloud --project leverege-sandbox iam roles describe $ROLE \
29
- --format=json | jq '{description,includedPermissions,stage,title}' > $JSON
30
- done
@@ -1,19 +0,0 @@
1
- #!/bin/bash
2
-
3
- PROJ="${1:-leverege-sandbox}"
4
-
5
- printf "\n Create/Update IAM Roles for => $PROJ\n\n"
6
-
7
- cd roles/baseline
8
- for JSON in leverege*.json;
9
- do
10
- ROLE=`basename $JSON .json`
11
- IAM_VERB="create"
12
-
13
- gcloud --project $PROJ iam roles describe $ROLE &>/dev/null
14
- [ "$?" == "0" ] && IAM_VERB="update"
15
-
16
- printf "Attempting to $IAM_VERB role $ROLE on $PROJ\n"
17
- gcloud --project $PROJ iam roles $IAM_VERB $ROLE --file $JSON
18
- done
19
- cd -
@@ -1,58 +0,0 @@
1
- #!/bin/bash
2
-
3
- SVC_PROJ="leverege-dev-john"
4
-
5
- SVC_NAME="terraform"
6
- SVC_ACCT="${SVC_NAME}@${SVC_PROJ}.iam.gserviceaccount.com"
7
-
8
- function countdown() {
9
- local SEC=${1}
10
- shift
11
- local MSG=${@}
12
- while [ $SEC -ne 0 ];
13
- do
14
- printf "\r\033[KWaiting %.d seconds $MSG" $((SEC--))
15
- sleep 1
16
- done
17
- }
18
-
19
- gcloud config unset auth/impersonate_service_account
20
-
21
- gcloud iam service-accounts create ${SVC_NAME} \
22
- --project=${SVC_PROJ} --quiet \
23
- --description="${SVC_NAME} SA" \
24
- --display-name="${SVC_NAME}" &> /dev/null
25
-
26
- gcloud projects add-iam-policy-binding ${SVC_PROJ} \
27
- --project=${SVC_PROJ} --quiet \
28
- --member=serviceAccount:${SVC_ACCT} \
29
- --role=roles/editor &> /dev/null
30
-
31
- gcloud projects add-iam-policy-binding ${SVC_PROJ} \
32
- --project=${SVC_PROJ} --quiet \
33
- --member=serviceAccount:${SVC_ACCT} \
34
- --role=roles/iam.securityAdmin &> /dev/null
35
-
36
- gcloud projects add-iam-policy-binding ${SVC_PROJ} \
37
- --project=${SVC_PROJ} --quiet \
38
- --member=serviceAccount:${SVC_ACCT} \
39
- --role=roles/iam.serviceAccountTokenCreator &> /dev/null
40
-
41
- countdown 30 "will delete ${SVC_NAME} service account"
42
-
43
- gcloud projects remove-iam-policy-binding ${SVC_PROJ} \
44
- --project=${SVC_PROJ} --quiet \
45
- --member=serviceAccount:${SVC_ACCT} \
46
- --role=roles/iam.serviceAccountTokenCreator &> /dev/null
47
-
48
- gcloud projects remove-iam-policy-binding ${SVC_PROJ} \
49
- --project=${SVC_PROJ} --quiet \
50
- --member=serviceAccount:${SVC_ACCT} \
51
- --role=roles/iam.securityAdmin &> /dev/null
52
-
53
- gcloud projects remove-iam-policy-binding ${SVC_PROJ} \
54
- --project=${SVC_PROJ} --quiet \
55
- --member=serviceAccount:${SVC_ACCT} \
56
- --role=roles/editor &> /dev/null
57
-
58
- gcloud iam service-accounts delete ${SVC_ACCT} --quiet &> /dev/null
@@ -1,40 +0,0 @@
1
- const chalk = require( 'chalk' )
2
- const fs = require( 'fs' )
3
-
4
- class Config {
5
-
6
- constructor() {
7
- this.configDir = `${__dirname}/config`
8
- const jsonText = fs.readFileSync( `${this.configDir}/config.json` )
9
- this.config = JSON.parse( jsonText )
10
- this.verifyConfig( this.config )
11
- }
12
-
13
- verifyConfig( config ) {
14
- /**
15
- * Verify reference sources exist.
16
- */
17
- let errors
18
- config.templates.forEach( ( template ) => {
19
- if ( !template.enabled ) return
20
- template.sources.forEach( ( source ) => {
21
- if ( typeof source === 'object' ) {
22
- console.log( source, 'STILL TODO' )
23
- } else {
24
- const fullName = `${this.configDir}/${source}`
25
- if ( !fs.existsSync( fullName ) ) {
26
- console.log( chalk.red(
27
- `***ERROR: missing source ${fullName}`
28
- ) )
29
- errors = true
30
- }
31
- }
32
- } )
33
- } )
34
- if ( errors ) { process.exit( 1 ) }
35
- }
36
- }
37
-
38
- module.exports = {
39
- Config,
40
- }
@@ -1,32 +0,0 @@
1
- const chalk = require( 'chalk' )
2
- const cliArgs = require( 'command-line-args' )
3
- const cliHelp = require( 'command-line-usage' )
4
- const execa = require( 'execa' )
5
- const figlet = require( 'figlet' )
6
-
7
- const { Config } = require( './Config' )
8
- const { clear, condir, proceed, Shell, VersionCheck } = require( './utils' )
9
-
10
- const greet = async () => {
11
- clear()
12
- console.log(
13
- chalk.keyword( 'orange' ).bold(
14
- figlet.textSync( 'service-man', { horizontalLayout : 'full' } )
15
- ), chalk.green`
16
-
17
- This utility attempts to ease the pain of managing IAM roles and the
18
- creation of service accounts for new clusters and services.
19
- `
20
- )
21
- }
22
-
23
- const start = async () => {
24
-
25
- await greet()
26
-
27
- await proceed()
28
-
29
- console.log( 'Weeeeee....' )
30
- }
31
-
32
- exports.start = start
@@ -1,5 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- const ServiceMan = require( './ServiceMan' )
4
-
5
- ServiceMan.start()
@@ -1,95 +0,0 @@
1
- /**
2
- * Shell like things can go in here. I mostly created this to make it
3
- * easier to push and pop around the directory trees for repo-init. It
4
- * might make sense to add other things in here to make writing node CLI
5
- * commands a little less painful.
6
- */
7
- const fs = require( 'fs' )
8
- const process = require( 'process' )
9
-
10
- const dirStack = []
11
-
12
- /**
13
- * Simple wrapper functions for debugging.
14
- */
15
- const cwd = () => {
16
- return process.cwd()
17
- }
18
-
19
- const chdir = ( dir ) => {
20
- return process.chdir( dir )
21
- }
22
-
23
- const dirs = () => {
24
- console.log( dirStack )
25
- }
26
-
27
- const pushd = ( dir ) => {
28
- if ( !dir ) {
29
- throw new Error( 'pushd: no other directory' )
30
- }
31
-
32
- dirStack.push( cwd() )
33
- chdir( dir )
34
- }
35
-
36
- const throwIfEmptyStack = () => {
37
- if ( dirStack.length === 0 ) {
38
- throw new Error( 'popd: directory stack empty' )
39
- }
40
- }
41
-
42
- const popd = ( all ) => {
43
- throwIfEmptyStack()
44
- chdir( dirStack.pop() )
45
- }
46
-
47
- const popdAll = () => {
48
- throwIfEmptyStack()
49
- chdir( dirStack[0] )
50
- dirStack.length = 0
51
- }
52
-
53
- /**
54
- * This function will do an upwards traversal of a file tree looking for the
55
- * specified file. An error will be thrown if the file is not found within
56
- * maxLevels.
57
- */
58
- const reverseFindFile = ( findFile, options ) => {
59
- pushd( options.startDir || cwd() )
60
- let maxLevels = options.maxLevels || 5
61
- let fileRoot
62
- while ( maxLevels > 0 ) {
63
- if ( fs.existsSync( findFile ) ) {
64
- fileRoot = cwd()
65
- break
66
- }
67
- pushd( '..' ) // walk up the tree
68
- maxLevels -= 1
69
- }
70
-
71
- popdAll()
72
-
73
- if ( !fileRoot ) {
74
- throw new Error( `reverseFindFile: ${findFile} not found` )
75
- }
76
-
77
- return fileRoot
78
- }
79
-
80
- const findRepoRoot = () => {
81
- return reverseFindFile( 'package.json', { startDir : __dirname } )
82
- }
83
-
84
- module.exports = {
85
- dirs,
86
- pushd,
87
- popd,
88
- popdAll,
89
-
90
- reverseFindFile,
91
- findRepoRoot,
92
-
93
- cwd,
94
- chdir,
95
- }