├── .gitignore ├── README.md ├── configs └── trellis │ ├── .vault_pass │ ├── ansible.cfg │ ├── build-before.yml │ ├── main.dev.yml │ ├── main.production.yml │ ├── main.staging.yml │ ├── server.yml │ ├── vault.dev.yml │ ├── vault.production.yml │ ├── vault.staging.yml │ ├── wordpress_sites.dev.yml │ ├── wordpress_sites.production.yml │ └── wordpress_sites.staging.yml ├── gardener.js ├── package.json └── yarn.lock /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Gardener 2 | Configuration of Roots stack (Trellis/Bedrock/Sage/Soil) based on command-line prompts. 3 | 4 | ## Why? 5 | I had to transfer approximately 80 million sites out of a multisite after a panic attack about my egg to basket ratio. I got really tired of cloning Trellis. 6 | 7 | ## How? 8 | * `yarn` 9 | * `node gardener.js` 10 | * Answer the prompts. 11 | * Be prepared to grant permissions. 12 | 13 | ## Why is this so garbage? 14 | Because it's garbage, ok? Hot, useful garbage. Submit a PR. I have things to tend to (ha!) 15 | 16 | ## Things to know? 17 | This script DOES NOT configure WP salts. Maybe one day I'll have time to return and automate this as well. But, yeah, you know how "maybe one day" tends to go. 18 | 19 | I'm assuming you've followed the Trellis docs and your machine is flush to the vagrants with all the Ansibles. Honestly, if this is a shortcut for you I would strongly suggest doing an install or twelve and then using this as a jumping off point once you're comfy (and sick of installing). 20 | 21 | You can play around with the config files in `~./configs/trellis/...` to your liking. What's in there is what's in there because that's what I needed to customize. 22 | 23 | ## License 24 | Be free. Be kind to others. Especially those who get the short end of the societal stick. Give your money to Roots. 25 | -------------------------------------------------------------------------------- /configs/trellis/.vault_pass: -------------------------------------------------------------------------------- 1 | {{ VAULT_PASS }} -------------------------------------------------------------------------------- /configs/trellis/ansible.cfg: -------------------------------------------------------------------------------- 1 | [defaults] 2 | callback_plugins = ~/.ansible/plugins/callback:/usr/share/ansible/plugins/callback:lib/trellis/plugins/callback 3 | stdout_callback = output 4 | filter_plugins = ~/.ansible/plugins/filter:/usr/share/ansible/plugins/filter:lib/trellis/plugins/filter 5 | force_color = True 6 | force_handlers = True 7 | inventory = hosts 8 | nocows = 1 9 | roles_path = vendor/roles 10 | vars_plugins = ~/.ansible/plugins/vars:/usr/share/ansible/plugins/vars:lib/trellis/plugins/vars 11 | vault_password_file = .vault_pass 12 | 13 | [ssh_connection] 14 | ssh_args = -o ForwardAgent=yes -o ControlMaster=auto -o ControlPersist=60s 15 | pipelining = True 16 | retries = 1 -------------------------------------------------------------------------------- /configs/trellis/build-before.yml: -------------------------------------------------------------------------------- 1 | - name: Install npm dependencies 2 | command: yarn 3 | connection: local 4 | args: 5 | chdir: "{{ project_local_path }}/web/app/themes/{{ SITE_DOMAIN }}" 6 | 7 | - name: Install Composer dependencies 8 | command: composer install --no-ansi --no-dev --no-interaction --no-progress --optimize-autoloader --no-scripts 9 | args: 10 | chdir: "{{ deploy_helper.new_release_path }}/web/app/themes/{{ SITE_DOMAIN }}" 11 | 12 | - name: Compile assets for production 13 | command: yarn build:production 14 | connection: local 15 | args: 16 | chdir: "{{ project_local_path }}/web/app/themes/{{ SITE_DOMAIN }}" 17 | 18 | - name: Copy production assets 19 | synchronize: 20 | src: "{{ project_local_path }}/web/app/themes/{{ SITE_DOMAIN }}/dist" 21 | dest: "{{ deploy_helper.new_release_path }}/web/app/themes/{{ SITE_DOMAIN }}" 22 | group: no 23 | owner: no 24 | rsync_opts: --chmod=Du=rwx,--chmod=Dg=rx,--chmod=Do=rx,--chmod=Fu=rw,--chmod=Fg=r,--chmod=Fo=r 25 | -------------------------------------------------------------------------------- /configs/trellis/main.dev.yml: -------------------------------------------------------------------------------- 1 | acme_tiny_challenges_directory: "{{ www_root }}/letsencrypt" 2 | env: development 3 | ferm_enabled: false 4 | mysql_root_password: "{{ vault_mysql_root_password }}" 5 | web_user: vagrant 6 | php_memory_limit: 256M 7 | php_post_max_size: 128M 8 | php_upload_max_filesize: 128M -------------------------------------------------------------------------------- /configs/trellis/main.production.yml: -------------------------------------------------------------------------------- 1 | mysql_root_password: "{{ vault_mysql_root_password }}" 2 | php_memory_limit: 256M 3 | php_post_max_size: 128M 4 | php_upload_max_filesize: 128M -------------------------------------------------------------------------------- /configs/trellis/main.staging.yml: -------------------------------------------------------------------------------- 1 | mysql_root_password: "{{ vault_mysql_root_password }}" 2 | php_memory_limit: 256M 3 | php_post_max_size: 128M 4 | php_upload_max_filesize: 128M -------------------------------------------------------------------------------- /configs/trellis/server.yml: -------------------------------------------------------------------------------- 1 | --- 2 | - import_playbook: variable-check.yml 3 | vars: 4 | playbook: server.yml 5 | 6 | - name: Test Connection and Determine Remote User 7 | hosts: web:&{{ env }} 8 | gather_facts: false 9 | roles: 10 | - { role: connection, tags: [connection, always] } 11 | 12 | - name: Install prerequisites 13 | hosts: web:&{{ env }} 14 | gather_facts: false 15 | become: yes 16 | tasks: 17 | - name: Install Python 2.x 18 | raw: which python || sudo apt-get update && sudo apt-get install -qq -y python-simplejson 19 | register: python_check 20 | changed_when: python_check.stdout is not search('/usr/bin/python') 21 | 22 | - name: WordPress Server - Install LEMP Stack with PHP 7.2 and MariaDB MySQL 23 | hosts: web:&{{ env }} 24 | become: yes 25 | roles: 26 | - { role: common, tags: [common] } 27 | - { role: swapfile, swapfile_size: 1GB, swapfile_file: /swapfile, tags: [swapfile] } 28 | - { role: fail2ban, tags: [fail2ban] } 29 | - { role: ferm, tags: [ferm] } 30 | - { role: ntp, tags: [ntp] } 31 | - { role: users, tags: [users] } 32 | - { role: sshd, tags: [sshd] } 33 | - { role: mariadb, tags: [mariadb] } 34 | - { role: ssmtp, tags: [ssmtp, mail] } 35 | - { role: php, tags: [php] } 36 | - { role: memcached, tags: [memcached] } 37 | - { role: nginx, tags: [nginx] } 38 | - { role: logrotate, tags: [logrotate] } 39 | - { role: composer, tags: [composer] } 40 | - { role: wp-cli, tags: [wp-cli] } 41 | - { role: letsencrypt, tags: [letsencrypt], when: sites_using_letsencrypt | count } 42 | - { role: wordpress-setup, tags: [wordpress, wordpress-setup, letsencrypt] } 43 | - { role: trellis-backup, tags: [backup] } -------------------------------------------------------------------------------- /configs/trellis/vault.dev.yml: -------------------------------------------------------------------------------- 1 | vault_mysql_root_password: devpw 2 | 3 | vault_wordpress_sites: 4 | {{ SITE_URL }}: 5 | admin_password: admin 6 | env: 7 | db_password: example_dbpassword -------------------------------------------------------------------------------- /configs/trellis/vault.production.yml: -------------------------------------------------------------------------------- 1 | vault_mysql_root_password: {{ MYSQL_ROOT_PASS }} 2 | 3 | vault_users: 4 | - name: "{{ admin_user }}" 5 | password: {{ VAULT_PASS }} 6 | salt: {{ VAULT_SALT }} 7 | 8 | vault_wordpress_sites: 9 | {{ SITE_URL }}: 10 | env: 11 | db_password: {{ DB_PASSWORD }} 12 | auth_key: "{{ AUTH_KEY }}" 13 | secure_auth_key: "{{ SECURE_AUTH_KEY }}" 14 | logged_in_key: "{{ LOGGED_IN_KEY }}" 15 | nonce_key: "{{ NONCE_KEY }}" 16 | auth_salt: "{{ AUTH_SALT }}" 17 | secure_auth_salt: "{{ SECURE_AUTH_SALT }}" 18 | logged_in_salt: "{{ LOGGED_IN_SALT }}" 19 | nonce_salt: "{{ NONCE_SALT }}" -------------------------------------------------------------------------------- /configs/trellis/vault.staging.yml: -------------------------------------------------------------------------------- 1 | vault_mysql_root_password: {{ MYSQL_ROOT_PASS }} 2 | 3 | vault_users: 4 | - name: "{{ admin_user }}" 5 | password: {{ VAULT_PASS }} 6 | salt: {{ VAULT_SALT }} 7 | 8 | vault_wordpress_sites: 9 | {{ SITE_URL }}: 10 | env: 11 | db_password: {{ DB_PASSWORD }} 12 | auth_key: "{{ AUTH_KEY }}" 13 | secure_auth_key: "{{ SECURE_AUTH_KEY }}" 14 | logged_in_key: "{{ LOGGED_IN_KEY }}" 15 | nonce_key: "{{ NONCE_KEY }}" 16 | auth_salt: "{{ AUTH_SALT }}" 17 | secure_auth_salt: "{{ SECURE_AUTH_SALT }}" 18 | logged_in_salt: "{{ LOGGED_IN_SALT }}" 19 | nonce_salt: "{{ NONCE_SALT }}" -------------------------------------------------------------------------------- /configs/trellis/wordpress_sites.dev.yml: -------------------------------------------------------------------------------- 1 | wordpress_sites: 2 | {{ SITE_URL }}: 3 | site_hosts: 4 | - canonical: {{ DOMAIN }}.{{ TEST_TLD }} 5 | redirects: 6 | - www.{{ DOMAIN }}.{{ TEST_TLD }} 7 | local_path: ../site 8 | admin_email: {{ ADMIN_EMAIL }} 9 | multisite: 10 | enabled: false 11 | ssl: 12 | enabled: false 13 | provider: self-signed 14 | cache: 15 | enabled: false -------------------------------------------------------------------------------- /configs/trellis/wordpress_sites.production.yml: -------------------------------------------------------------------------------- 1 | wordpress_sites: 2 | {{ SITE_URL }}: 3 | site_hosts: 4 | - canonical: {{ SITE_URL }} 5 | local_path: ../site 6 | repo: git@github.com:{{ GITHUB_USER }}/{{ SITE_URL }}.git 7 | repo_subtree_path: site 8 | branch: staging 9 | multisite: 10 | enabled: false 11 | ssl: 12 | enabled: true 13 | provider: letsencrypt 14 | cache: 15 | enabled: true 16 | backup: 17 | enabled: true 18 | auto: true 19 | target: b2://account_id:application_key@{{ SITE_DOMAIN }}-{{ SITE_TLD }}/ 20 | schedule: '0 0 3 * * ?' 21 | purge: true -------------------------------------------------------------------------------- /configs/trellis/wordpress_sites.staging.yml: -------------------------------------------------------------------------------- 1 | wordpress_sites: 2 | {{ SITE_URL }}: 3 | site_hosts: 4 | - canonical: staging.{{ SITE_URL }} 5 | local_path: ../site 6 | repo: git@github.com:{{ GITHUB_USER }}/{{ SITE_URL }}.git 7 | repo_subtree_path: site 8 | branch: staging 9 | multisite: 10 | enabled: false 11 | ssl: 12 | enabled: false 13 | provider: letsencrypt 14 | cache: 15 | enabled: false 16 | backup: 17 | enabled: true 18 | auto: false 19 | target: b2://account_id:application_key@{{ SITE_DOMAIN }}-{{ SITE_TLD }}/ 20 | schedule: '0 0 3 * * ?' 21 | purge: true -------------------------------------------------------------------------------- /gardener.js: -------------------------------------------------------------------------------- 1 | var shell = require('shelljs'); 2 | var colors = require('colors'); 3 | var inquirer = require('inquirer'); 4 | var pad = require('pad'); 5 | 6 | inquirer 7 | .prompt([ 8 | { type: 'input', name: 'basePath', message: 'What is the path you\'d like to install into? Include a trailing slash. (example: ~/sites/)' }, 9 | { type: 'input', name: 'siteHost', message: 'What is your domain? (`example` in example.com)' }, 10 | { type: 'input', name: 'siteTLD', message: 'What is your TLD? (`com` in example.com)' }, 11 | { type: 'input', name: 'testTLD', message: 'What is your desired local TLD? (`test` in example.test)' }, 12 | { type: 'input', name: 'githubUsername', message: 'What is your github username?' }, 13 | { type: 'input', name: 'adminEmail', message: 'What is your email? (used for WP admin)' } 14 | ]) 15 | .then(function (answers) { 16 | gardener = process.cwd(); 17 | basePath = answers.basePath; 18 | domain = answers.siteHost; 19 | tld = answers.siteTLD; 20 | test_tld = answers.testTLD; 21 | github_username = answers.githubUsername; 22 | admin_email = answers.adminEmail; 23 | site = { 24 | url: domain +'.'+ tld , 25 | path: basePath + domain +'.'+ tld +'/', 26 | bedrock: basePath + domain +'.'+ tld +'/site', 27 | trellis: basePath + domain +'.'+ tld +'/trellis', 28 | sage: basePath + domain +'.'+ tld +'/site/web/app/themes/' + domain +'/', 29 | }; 30 | 31 | shell.echo('Let\'s kick things off\n--------------------------------'); 32 | if(cloneRootsStack(gardener, basePath, domain, tld, test_tld, github_username, admin_email, site) !== false) { 33 | console.log(colors.red('Bummer! Could not clone Roots.')); 34 | shell.exit(1); 35 | } 36 | if(configureAnsible(gardener, basePath, domain, tld, test_tld, github_username, admin_email, site) !== false) { 37 | console.log(colors.red('Bummer! Could not configure Ansible.')); 38 | shell.exit(1); 39 | } 40 | if(configureDevelopment(gardener, basePath, domain, tld, test_tld, github_username, admin_email, site) !== false) { 41 | console.log(colors.red('Bummer! Could not configure Development')); 42 | shell.exit(1); 43 | } 44 | if(configureStaging(gardener, basePath, domain, tld, test_tld, github_username, admin_email, site) !== false) { 45 | console.log(colors.red('Bummer! Could not configure Staging.')); 46 | shell.exit(1); 47 | } 48 | if(configureProduction(gardener, basePath, domain, tld, test_tld, github_username, admin_email, site) !== false) { 49 | console.log(colors.red('Bummer! Could not configure Production.')); 50 | shell.exit(1); 51 | } 52 | if(configureSage(gardener, basePath, domain, tld, test_tld, github_username, admin_email, site) !== false) { 53 | console.log(colors.red('Bummer! Could not configure Sage')); 54 | shell.exit(1); 55 | } 56 | if(createVaultPass(gardener, basePath, domain, tld, test_tld, github_username, admin_email, site) !== false) { 57 | console.log(colors.red('Bummer! Could not create and configure vault pass')); 58 | shell.exit(1); 59 | } 60 | if(encryptVaults(gardener, basePath, domain, tld, test_tld, github_username, admin_email, site) !== false) { 61 | console.log(colors.red('Bummer! Could not encrypt the vaults')); 62 | shell.exit(1); 63 | } 64 | if(gitIt(gardener, basePath, domain, tld, test_tld, github_username, admin_email, site) !== false) { 65 | console.log(colors.red('Bummer! Could not instantiate git repository.')); 66 | shell.exit(1); 67 | } 68 | if(startAnsible(gardener, basePath, domain, tld, test_tld, github_username, admin_email, site) !== false) { 69 | console.log(colors.red('Bummer! Could not start VM')); 70 | shell.exit(1); 71 | } 72 | }); 73 | 74 | function cloneRootsStack() { 75 | console.log(pad(colors.green('Cloning Roots.io stack'))); 76 | var code = false; 77 | 78 | if(shell.mkdir(site.path).code !== 0) code = true; 79 | if(shell.exec('git clone --depth=1 git@github.com:roots/trellis.git '+ site.trellis).code !== 0) code = true; 80 | if(shell.rm('-rf', site.trellis +'/.git').code !== 0) code = true; 81 | if(shell.exec('git clone --depth=1 git@github.com:roots/bedrock.git '+ site.bedrock).code !== 0) code = true; 82 | if(shell.rm('-rf', site.bedrock +'/.git').code !== 0) code = true; 83 | if(shell.cd(site.bedrock +'/web/app/themes').code !== 0) code = true; 84 | if(shell.exec('git clone --depth=1 git@github.com:roots/sage.git '+ domain).code !== 0) code = true; 85 | if(shell.cd('./'+ domain).code !== 0) code = true; 86 | if(shell.rm('-rf', site.bedrock +'/web/app/themes/' + domain +'/.git').code !== 0) code = true; 87 | if(shell.cd(site.bedrock +'/web/app/plugins').code !== 0) code = true; 88 | if(shell.exec('git clone git@github.com:roots/soil.git '+ site.bedrock +'/web/app/plugins/soil').code !== 0) code = true; 89 | if(shell.rm('-rf', site.bedrock + '/web/app/plugins/soil/.git').code !== 0) code = true; 90 | 91 | return code; 92 | } 93 | 94 | function configureAnsible() { 95 | console.log(pad(colors.yellow('Configuring Ansible'))); 96 | var code = false; 97 | 98 | if(shell.cd(site.trellis).code !== 0) code = true; 99 | if(shell.rm(site.trellis + '/ansible.cfg').code !== 0) code = true; 100 | if(shell.cp(gardener + '/configs/trellis/ansible.cfg', site.trellis + '/ansible.cfg').code !== 0) code = true; 101 | if(shell.rm('server.yml').code !== 0) code = true; 102 | if(shell.cp(gardener + '/configs/trellis/server.yml', site.trellis + '/server.yml').code !== 0) code = true; 103 | 104 | return code; 105 | } 106 | 107 | function configureDevelopment() { 108 | console.log(pad(colors.green('Configuring Development'))); 109 | var code = false; 110 | 111 | if(shell.rm(site.trellis +'/group_vars/development/wordpress_sites.yml').code !== 0) code = true; 112 | if(shell.cp(gardener +'/configs/trellis/wordpress_sites.dev.yml', site.trellis + '/group_vars/development/wordpress_sites.yml').code !== 0) code = true; 113 | if(shell.sed('-i', '{{ ADMIN_EMAIL }}', admin_email, site.trellis + '/group_vars/development/wordpress_sites.yml').code !== 0) code = true; 114 | if(shell.sed('-i', '{{ DOMAIN }}', domain, site.trellis + '/group_vars/development/wordpress_sites.yml').code !== 0) code = true; 115 | if(shell.sed('-i', '{{ SITE_URL }}', site.url, site.trellis + '/group_vars/development/wordpress_sites.yml').code !== 0) code = true; 116 | if(shell.sed('-i', '{{ TEST_TLD }}', test_tld, site.trellis + '/group_vars/development/wordpress_sites.yml').code !== 0) code = true; 117 | 118 | if(shell.rm(site.trellis + '/group_vars/development/vault.yml').code !== 0) code = true; 119 | if(shell.cp(gardener +'/configs/trellis/vault.dev.yml', site.trellis + '/group_vars/development/vault.yml').code !== 0) code = true; 120 | if(shell.sed('-i', '{{ SITE_URL }}', site.url, site.trellis + '/group_vars/development/vault.yml').code !== 0) code = true; 121 | 122 | if(shell.rm(site.trellis + '/group_vars/development/main.yml').code !== 0) code = true; 123 | if(shell.cp(gardener +'/configs/trellis/main.dev.yml', site.trellis + '/group_vars/development/main.yml').code !== 0) code = true; 124 | 125 | return code; 126 | } 127 | 128 | function configureStaging() { 129 | console.log(pad(colors.blue('Configuring Staging'))); 130 | var code = false; 131 | 132 | if(shell.rm(site.trellis +'/group_vars/staging/wordpress_sites.yml').code !== 0) code = true; 133 | if(shell.cp(gardener +'/configs/trellis/wordpress_sites.staging.yml', site.trellis + '/group_vars/staging/wordpress_sites.yml').code !== 0) code = true; 134 | if(shell.sed('-i', '{{ GITHUB_USER }}', github_username, site.trellis + '/group_vars/staging/wordpress_sites.yml').code !== 0) code = true; 135 | if(shell.sed('-i', '{{ SITE_URL }}', site.url, site.trellis + '/group_vars/staging/wordpress_sites.yml').code !== 0) code = true; 136 | if(shell.sed('-i', '{{ SITE_DOMAIN }}', domain, site.trellis + '/group_vars/staging/wordpress_sites.yml').code !== 0) code = true; 137 | if(shell.sed('-i', '{{ SITE_TLD }}', tld, site.trellis + '/group_vars/staging/wordpress_sites.yml').code !== 0) code = true; 138 | 139 | if(shell.rm(site.trellis + '/group_vars/staging/vault.yml').code !== 0) code = true; 140 | if(shell.cp(gardener +'/configs/trellis/vault.staging.yml', site.trellis + '/group_vars/staging/vault.yml').code !== 0) code = true; 141 | 142 | if(shell.sed('-i', '{{ SITE_URL }}', site.url, site.trellis + '/group_vars/staging/vault.yml').code !== 0) code = true; 143 | if(shell.sed('-i', '{{ MYSQL_ROOT_PASS }}', shell.exec('pwgen -Bs 20 1').stdout, site.trellis + '/group_vars/staging/vault.yml').code !== 0) code = true; 144 | if(shell.sed('-i', '{{ VAULT_PASS }}', shell.exec('pwgen -Bs 20 1').stdout, site.trellis + '/group_vars/staging/vault.yml').code !== 0) code = true; 145 | if(shell.sed('-i', '{{ VAULT_SALT }}', '"' + shell.exec('pwgen -Bs 20 1').stdout + '"', site.trellis + '/group_vars/staging/vault.yml').code !== 0) code = true; 146 | if(shell.sed('-i', '{{ DB_PASSWORD }}', shell.exec('pwgen -Bs 20 1').stdout, site.trellis + '/group_vars/staging/vault.yml').code !== 0) code = true; 147 | 148 | if(shell.rm(site.trellis + '/group_vars/staging/main.yml').code !== 0) code = true; 149 | if(shell.cp(gardener +'/configs/trellis/main.staging.yml', site.trellis + '/group_vars/staging/main.yml').code !== 0) code = true; 150 | 151 | return code; 152 | } 153 | 154 | function configureProduction() { 155 | console.log(pad(colors.cyan('Configuring Production'))); 156 | var code = false; 157 | 158 | if(shell.rm(site.trellis +'/group_vars/production/wordpress_sites.yml').code !== 0) code = true; 159 | if(shell.cp(gardener + '/configs/trellis/wordpress_sites.production.yml', site.trellis + '/group_vars/production/wordpress_sites.yml').code !== 0) code = true; 160 | if(shell.sed('-i', '{{ GITHUB_USER }}', github_username, site.trellis + '/group_vars/production/wordpress_sites.yml').code !== 0) code = true; 161 | if(shell.sed('-i', '{{ SITE_URL }}', site.url, site.trellis + '/group_vars/production/wordpress_sites.yml').code !== 0) code = true; 162 | if(shell.sed('-i', '{{ SITE_DOMAIN }}', domain, site.trellis + '/group_vars/production/wordpress_sites.yml').code !== 0) code = true; 163 | if(shell.sed('-i', '{{ SITE_TLD }}', tld, site.trellis + '/group_vars/production/wordpress_sites.yml').code !== 0) code = true; 164 | 165 | if(shell.rm(site.trellis + '/group_vars/production/vault.yml').code !== 0) code = true; 166 | if(shell.cp(gardener +'/configs/trellis/vault.production.yml', site.trellis + '/group_vars/production/vault.yml').code !== 0) code = true; 167 | 168 | if(shell.sed('-i', '{{ SITE_URL }}', site.url, site.trellis + '/group_vars/production/vault.yml').code !== 0) code = true; 169 | if(shell.sed('-i', '{{ MYSQL_ROOT_PASS }}', shell.exec('pwgen -Bs 20 1').stdout, site.trellis + '/group_vars/production/vault.yml').code !== 0) code = true; 170 | if(shell.sed('-i', '{{ VAULT_PASS }}', shell.exec('pwgen -Bs 20 1').stdout, site.trellis + '/group_vars/production/vault.yml').code !== 0) code = true; 171 | if(shell.sed('-i', '{{ VAULT_SALT }}', '"'+shell.exec('pwgen -Bs 20 1').stdout+'"', site.trellis + '/group_vars/production/vault.yml').code !== 0) code = true; 172 | if(shell.sed('-i', '{{ DB_PASSWORD }}', shell.exec('pwgen -Bs 20 1').stdout, site.trellis + '/group_vars/production/vault.yml').code !== 0) code = true; 173 | 174 | if(shell.rm(site.trellis + '/group_vars/production/main.yml').code !== 0) code = true; 175 | if(shell.cp(gardener +'/configs/trellis/main.production.yml', site.trellis + '/group_vars/production/main.yml').code !== 0) code = true; 176 | 177 | return code; 178 | } 179 | 180 | function configureSage() { 181 | console.log(pad(colors.magenta('Configuring Sage'))); 182 | var code = false; 183 | 184 | if(shell.rm(site.trellis +'/deploy-hooks/build-before.yml').code !== 0) code = true; 185 | if(shell.cp(gardener +'/configs/trellis/build-before.yml', site.trellis + '/deploy-hooks/build-before.yml').code !== 0) code = true; 186 | if(shell.sed('-i', '{{ SITE_URL }}', site.url, site.trellis + '/deploy-hooks/build-before.yml').code !== 0) code = true; 187 | 188 | return code; 189 | } 190 | 191 | function createVaultPass() { 192 | console.log(pad(colors.blue('Configuring Vault Pass'))); 193 | var code = false; 194 | 195 | if(shell.cd(site.trellis).code !== 0) code = true 196 | if(shell.cp(gardener +'/configs/trellis/.vault_pass', site.trellis + '/.vault_pass').code !== 0) code = true; 197 | if(shell.sed('-i', '{{ VAULT_PASS }}', shell.exec('pwgen -Bs 20 1').stdout, site.trellis + '/.vault_pass').code !== 0) code = true; 198 | 199 | return code; 200 | } 201 | 202 | function encryptVaults() { 203 | console.log(pad(colors.yellow('Encrypting Vaults'))); 204 | var code = false; 205 | 206 | if(shell.cd(site.trellis).code !== 0) code = true; 207 | if(shell.exec('ansible-vault encrypt group_vars/staging/vault.yml').code !== 0) code = true; 208 | if(shell.exec('ansible-vault encrypt group_vars/production/vault.yml').code !== 0) code = true; 209 | 210 | return code; 211 | } 212 | 213 | function gitIt() { 214 | console.log(pad(colors.green('Version Control'))); 215 | var code = false; 216 | 217 | if(shell.cd(site.path).code !== 0) code = true; 218 | if(shell.exec('git init').code !== 0) code = true; 219 | if(shell.exec('git checkout -b development').code !== 0) code = true; 220 | if(shell.exec('git add -A').code !== 0) code = true; 221 | if(shell.exec('git commit -m "Initial commit"').code !== 0) code = true; 222 | 223 | return code; 224 | } 225 | 226 | function startAnsible() { 227 | console.log(pad(colors.cyan('Start VM'))); 228 | var code = false; 229 | 230 | if(shell.cd(site.trellis).code !== 0) code = true; 231 | if(shell.exec('vagrant up').code !== 0) code = true; 232 | 233 | return code; 234 | } 235 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "gardener", 3 | "version": "0.1.0", 4 | "preferGlobal": true, 5 | "description": "Automated configuration of Trellis/Bedrock/Sage/Soil", 6 | "main": "gardener", 7 | "author": "Tiny Pixel Collective", 8 | "license": "MIT", 9 | "private": false, 10 | "repository": "pixelcollective/gardener", 11 | "dependencies": { 12 | "colors": "^1.3.2", 13 | "inquirer": "^6.2.2", 14 | "pad": "^2.2.1", 15 | "shelljs": "^0.8.2" 16 | }, 17 | "devDependencies": { 18 | "eslint": "^5.13.0" 19 | }, 20 | "scripts": { 21 | "gardener": "bin/gardener.js" 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /yarn.lock: -------------------------------------------------------------------------------- 1 | # THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. 2 | # yarn lockfile v1 3 | 4 | 5 | "@babel/code-frame@^7.0.0": 6 | version "7.0.0" 7 | resolved "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.0.0.tgz#06e2ab19bdb535385559aabb5ba59729482800f8" 8 | integrity sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA== 9 | dependencies: 10 | "@babel/highlight" "^7.0.0" 11 | 12 | "@babel/highlight@^7.0.0": 13 | version "7.0.0" 14 | resolved "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.0.0.tgz#f710c38c8d458e6dd9a201afb637fcb781ce99e4" 15 | integrity sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw== 16 | dependencies: 17 | chalk "^2.0.0" 18 | esutils "^2.0.2" 19 | js-tokens "^4.0.0" 20 | 21 | acorn-jsx@^5.0.0: 22 | version "5.0.0" 23 | resolved "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.0.0.tgz#958584ddb60990c02c97c1bd9d521fce433bb101" 24 | integrity sha512-XkB50fn0MURDyww9+UYL3c1yLbOBz0ZFvrdYlGB8l+Ije1oSC75qAqrzSPjYQbdnQUzhlUGNKuesryAv0gxZOg== 25 | 26 | acorn@^6.0.2: 27 | version "6.0.2" 28 | resolved "https://registry.yarnpkg.com/acorn/-/acorn-6.0.2.tgz#6a459041c320ab17592c6317abbfdf4bbaa98ca4" 29 | integrity sha512-GXmKIvbrN3TV7aVqAzVFaMW8F8wzVX7voEBRO3bDA64+EX37YSayggRJP5Xig6HYHBkWKpFg9W5gg6orklubhg== 30 | 31 | ajv@^6.5.3: 32 | version "6.5.4" 33 | resolved "https://registry.yarnpkg.com/ajv/-/ajv-6.5.4.tgz#247d5274110db653706b550fcc2b797ca28cfc59" 34 | integrity sha512-4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg== 35 | dependencies: 36 | fast-deep-equal "^2.0.1" 37 | fast-json-stable-stringify "^2.0.0" 38 | json-schema-traverse "^0.4.1" 39 | uri-js "^4.2.2" 40 | 41 | ansi-escapes@^3.2.0: 42 | version "3.2.0" 43 | resolved "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-3.2.0.tgz#8780b98ff9dbf5638152d1f1fe5c1d7b4442976b" 44 | integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== 45 | 46 | ansi-regex@^3.0.0: 47 | version "3.0.0" 48 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz#ed0317c322064f79466c02966bddb605ab37d998" 49 | integrity sha1-7QMXwyIGT3lGbAKWa922Bas32Zg= 50 | 51 | ansi-regex@^4.0.0: 52 | version "4.0.0" 53 | resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.0.0.tgz#70de791edf021404c3fd615aa89118ae0432e5a9" 54 | integrity sha512-iB5Dda8t/UqpPI/IjsejXu5jOGDrzn41wJyljwPH65VCIbk6+1BzFIMJGFwTNrYXT1CrD+B4l19U7awiQ8rk7w== 55 | 56 | ansi-styles@^3.2.1: 57 | version "3.2.1" 58 | resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz#41fbb20243e50b12be0f04b8dedbf07520ce841d" 59 | integrity sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA== 60 | dependencies: 61 | color-convert "^1.9.0" 62 | 63 | argparse@^1.0.7: 64 | version "1.0.10" 65 | resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" 66 | integrity sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg== 67 | dependencies: 68 | sprintf-js "~1.0.2" 69 | 70 | array-union@^1.0.1: 71 | version "1.0.2" 72 | resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" 73 | integrity sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk= 74 | dependencies: 75 | array-uniq "^1.0.1" 76 | 77 | array-uniq@^1.0.1: 78 | version "1.0.3" 79 | resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" 80 | integrity sha1-r2rId6Jcx/dOBYiUdThY39sk/bY= 81 | 82 | arrify@^1.0.0: 83 | version "1.0.1" 84 | resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" 85 | integrity sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0= 86 | 87 | balanced-match@^1.0.0: 88 | version "1.0.0" 89 | resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767" 90 | integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c= 91 | 92 | brace-expansion@^1.1.7: 93 | version "1.1.11" 94 | resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz#3c7fcbf529d87226f3d2f52b966ff5271eb441dd" 95 | integrity sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA== 96 | dependencies: 97 | balanced-match "^1.0.0" 98 | concat-map "0.0.1" 99 | 100 | callsites@^3.0.0: 101 | version "3.0.0" 102 | resolved "https://registry.yarnpkg.com/callsites/-/callsites-3.0.0.tgz#fb7eb569b72ad7a45812f93fd9430a3e410b3dd3" 103 | integrity sha512-tWnkwu9YEq2uzlBDI4RcLn8jrFvF9AOi8PxDNU3hZZjJcjkcRAq3vCI+vZcg1SuxISDYe86k9VZFwAxDiJGoAw== 104 | 105 | chalk@^2.0.0, chalk@^2.1.0, chalk@^2.4.2: 106 | version "2.4.2" 107 | resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" 108 | integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== 109 | dependencies: 110 | ansi-styles "^3.2.1" 111 | escape-string-regexp "^1.0.5" 112 | supports-color "^5.3.0" 113 | 114 | chardet@^0.7.0: 115 | version "0.7.0" 116 | resolved "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz#90094849f0937f2eedc2425d0d28a9e5f0cbad9e" 117 | integrity sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA== 118 | 119 | circular-json@^0.3.1: 120 | version "0.3.3" 121 | resolved "https://registry.yarnpkg.com/circular-json/-/circular-json-0.3.3.tgz#815c99ea84f6809529d2f45791bdf82711352d66" 122 | integrity sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A== 123 | 124 | cli-cursor@^2.1.0: 125 | version "2.1.0" 126 | resolved "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz#b35dac376479facc3e94747d41d0d0f5238ffcb5" 127 | integrity sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU= 128 | dependencies: 129 | restore-cursor "^2.0.0" 130 | 131 | cli-width@^2.0.0: 132 | version "2.2.0" 133 | resolved "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.0.tgz#ff19ede8a9a5e579324147b0c11f0fbcbabed639" 134 | integrity sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk= 135 | 136 | clone@^1.0.2: 137 | version "1.0.4" 138 | resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e" 139 | integrity sha1-2jCcwmPfFZlMaIypAheco8fNfH4= 140 | 141 | color-convert@^1.9.0: 142 | version "1.9.3" 143 | resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8" 144 | integrity sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg== 145 | dependencies: 146 | color-name "1.1.3" 147 | 148 | color-name@1.1.3: 149 | version "1.1.3" 150 | resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz#a7d0558bd89c42f795dd42328f740831ca53bc25" 151 | integrity sha1-p9BVi9icQveV3UIyj3QIMcpTvCU= 152 | 153 | colors@^1.3.2: 154 | version "1.3.2" 155 | resolved "https://registry.yarnpkg.com/colors/-/colors-1.3.2.tgz#2df8ff573dfbf255af562f8ce7181d6b971a359b" 156 | integrity sha512-rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ== 157 | 158 | concat-map@0.0.1: 159 | version "0.0.1" 160 | resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" 161 | integrity sha1-2Klr13/Wjfd5OnMDajug1UBdR3s= 162 | 163 | cross-spawn@^6.0.5: 164 | version "6.0.5" 165 | resolved "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz#4a5ec7c64dfae22c3a14124dbacdee846d80cbc4" 166 | integrity sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ== 167 | dependencies: 168 | nice-try "^1.0.4" 169 | path-key "^2.0.1" 170 | semver "^5.5.0" 171 | shebang-command "^1.2.0" 172 | which "^1.2.9" 173 | 174 | debug@^4.0.1: 175 | version "4.1.0" 176 | resolved "https://registry.yarnpkg.com/debug/-/debug-4.1.0.tgz#373687bffa678b38b1cd91f861b63850035ddc87" 177 | integrity sha512-heNPJUJIqC+xB6ayLAMHaIrmN9HKa7aQO8MGqKpvCA+uJYVcvR6l5kgdrhRuwPFHU7P5/A1w0BjByPHwpfTDKg== 178 | dependencies: 179 | ms "^2.1.1" 180 | 181 | deep-is@~0.1.3: 182 | version "0.1.3" 183 | resolved "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz#b369d6fb5dbc13eecf524f91b070feedc357cf34" 184 | integrity sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ= 185 | 186 | defaults@^1.0.3: 187 | version "1.0.3" 188 | resolved "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz#c656051e9817d9ff08ed881477f3fe4019f3ef7d" 189 | integrity sha1-xlYFHpgX2f8I7YgUd/P+QBnz730= 190 | dependencies: 191 | clone "^1.0.2" 192 | 193 | del@^2.0.2: 194 | version "2.2.2" 195 | resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" 196 | integrity sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag= 197 | dependencies: 198 | globby "^5.0.0" 199 | is-path-cwd "^1.0.0" 200 | is-path-in-cwd "^1.0.0" 201 | object-assign "^4.0.1" 202 | pify "^2.0.0" 203 | pinkie-promise "^2.0.0" 204 | rimraf "^2.2.8" 205 | 206 | doctrine@^2.1.0: 207 | version "2.1.0" 208 | resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-2.1.0.tgz#5cd01fc101621b42c4cd7f5d1a66243716d3f39d" 209 | integrity sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw== 210 | dependencies: 211 | esutils "^2.0.2" 212 | 213 | escape-string-regexp@^1.0.5: 214 | version "1.0.5" 215 | resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" 216 | integrity sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ= 217 | 218 | eslint-scope@^4.0.0: 219 | version "4.0.0" 220 | resolved "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.0.tgz#50bf3071e9338bcdc43331794a0cb533f0136172" 221 | integrity sha512-1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA== 222 | dependencies: 223 | esrecurse "^4.1.0" 224 | estraverse "^4.1.1" 225 | 226 | eslint-utils@^1.3.1: 227 | version "1.3.1" 228 | resolved "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-1.3.1.tgz#9a851ba89ee7c460346f97cf8939c7298827e512" 229 | integrity sha512-Z7YjnIldX+2XMcjr7ZkgEsOj/bREONV60qYeB/bjMAqqqZ4zxKyWX+BOUkdmRmA9riiIPVvo5x86m5elviOk0Q== 230 | 231 | eslint-visitor-keys@^1.0.0: 232 | version "1.0.0" 233 | resolved "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz#3f3180fb2e291017716acb4c9d6d5b5c34a6a81d" 234 | integrity sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ== 235 | 236 | eslint@^5.13.0: 237 | version "5.13.0" 238 | resolved "https://registry.yarnpkg.com/eslint/-/eslint-5.13.0.tgz#ce71cc529c450eed9504530939aa97527861ede9" 239 | integrity sha512-nqD5WQMisciZC5EHZowejLKQjWGuFS5c70fxqSKlnDME+oz9zmE8KTlX+lHSg+/5wsC/kf9Q9eMkC8qS3oM2fg== 240 | dependencies: 241 | "@babel/code-frame" "^7.0.0" 242 | ajv "^6.5.3" 243 | chalk "^2.1.0" 244 | cross-spawn "^6.0.5" 245 | debug "^4.0.1" 246 | doctrine "^2.1.0" 247 | eslint-scope "^4.0.0" 248 | eslint-utils "^1.3.1" 249 | eslint-visitor-keys "^1.0.0" 250 | espree "^5.0.0" 251 | esquery "^1.0.1" 252 | esutils "^2.0.2" 253 | file-entry-cache "^2.0.0" 254 | functional-red-black-tree "^1.0.1" 255 | glob "^7.1.2" 256 | globals "^11.7.0" 257 | ignore "^4.0.6" 258 | import-fresh "^3.0.0" 259 | imurmurhash "^0.1.4" 260 | inquirer "^6.1.0" 261 | js-yaml "^3.12.0" 262 | json-stable-stringify-without-jsonify "^1.0.1" 263 | levn "^0.3.0" 264 | lodash "^4.17.5" 265 | minimatch "^3.0.4" 266 | mkdirp "^0.5.1" 267 | natural-compare "^1.4.0" 268 | optionator "^0.8.2" 269 | path-is-inside "^1.0.2" 270 | progress "^2.0.0" 271 | regexpp "^2.0.1" 272 | semver "^5.5.1" 273 | strip-ansi "^4.0.0" 274 | strip-json-comments "^2.0.1" 275 | table "^5.0.2" 276 | text-table "^0.2.0" 277 | 278 | espree@^5.0.0: 279 | version "5.0.0" 280 | resolved "https://registry.yarnpkg.com/espree/-/espree-5.0.0.tgz#fc7f984b62b36a0f543b13fb9cd7b9f4a7f5b65c" 281 | integrity sha512-1MpUfwsdS9MMoN7ZXqAr9e9UKdVHDcvrJpyx7mm1WuQlx/ygErEQBzgi5Nh5qBHIoYweprhtMkTCb9GhcAIcsA== 282 | dependencies: 283 | acorn "^6.0.2" 284 | acorn-jsx "^5.0.0" 285 | eslint-visitor-keys "^1.0.0" 286 | 287 | esprima@^4.0.0: 288 | version "4.0.1" 289 | resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz#13b04cdb3e6c5d19df91ab6987a8695619b0aa71" 290 | integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== 291 | 292 | esquery@^1.0.1: 293 | version "1.0.1" 294 | resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.1.tgz#406c51658b1f5991a5f9b62b1dc25b00e3e5c708" 295 | integrity sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA== 296 | dependencies: 297 | estraverse "^4.0.0" 298 | 299 | esrecurse@^4.1.0: 300 | version "4.2.1" 301 | resolved "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz#007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf" 302 | integrity sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ== 303 | dependencies: 304 | estraverse "^4.1.0" 305 | 306 | estraverse@^4.0.0, estraverse@^4.1.0, estraverse@^4.1.1: 307 | version "4.2.0" 308 | resolved "https://registry.yarnpkg.com/estraverse/-/estraverse-4.2.0.tgz#0dee3fed31fcd469618ce7342099fc1afa0bdb13" 309 | integrity sha1-De4/7TH81GlhjOc0IJn8GvoL2xM= 310 | 311 | esutils@^2.0.2: 312 | version "2.0.2" 313 | resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" 314 | integrity sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs= 315 | 316 | external-editor@^3.0.3: 317 | version "3.0.3" 318 | resolved "https://registry.yarnpkg.com/external-editor/-/external-editor-3.0.3.tgz#5866db29a97826dbe4bf3afd24070ead9ea43a27" 319 | integrity sha512-bn71H9+qWoOQKyZDo25mOMVpSmXROAsTJVVVYzrrtol3d4y+AsKjf4Iwl2Q+IuT0kFSQ1qo166UuIwqYq7mGnA== 320 | dependencies: 321 | chardet "^0.7.0" 322 | iconv-lite "^0.4.24" 323 | tmp "^0.0.33" 324 | 325 | fast-deep-equal@^2.0.1: 326 | version "2.0.1" 327 | resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" 328 | integrity sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk= 329 | 330 | fast-json-stable-stringify@^2.0.0: 331 | version "2.0.0" 332 | resolved "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz#d5142c0caee6b1189f87d3a76111064f86c8bbf2" 333 | integrity sha1-1RQsDK7msRifh9OnYREGT4bIu/I= 334 | 335 | fast-levenshtein@~2.0.4: 336 | version "2.0.6" 337 | resolved "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz#3d8a5c66883a16a30ca8643e851f19baa7797917" 338 | integrity sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc= 339 | 340 | figures@^2.0.0: 341 | version "2.0.0" 342 | resolved "https://registry.yarnpkg.com/figures/-/figures-2.0.0.tgz#3ab1a2d2a62c8bfb431a0c94cb797a2fce27c962" 343 | integrity sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI= 344 | dependencies: 345 | escape-string-regexp "^1.0.5" 346 | 347 | file-entry-cache@^2.0.0: 348 | version "2.0.0" 349 | resolved "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-2.0.0.tgz#c392990c3e684783d838b8c84a45d8a048458361" 350 | integrity sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E= 351 | dependencies: 352 | flat-cache "^1.2.1" 353 | object-assign "^4.0.1" 354 | 355 | flat-cache@^1.2.1: 356 | version "1.3.0" 357 | resolved "https://registry.yarnpkg.com/flat-cache/-/flat-cache-1.3.0.tgz#d3030b32b38154f4e3b7e9c709f490f7ef97c481" 358 | integrity sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE= 359 | dependencies: 360 | circular-json "^0.3.1" 361 | del "^2.0.2" 362 | graceful-fs "^4.1.2" 363 | write "^0.2.1" 364 | 365 | fs.realpath@^1.0.0: 366 | version "1.0.0" 367 | resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" 368 | integrity sha1-FQStJSMVjKpA20onh8sBQRmU6k8= 369 | 370 | functional-red-black-tree@^1.0.1: 371 | version "1.0.1" 372 | resolved "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz#1b0ab3bd553b2a0d6399d29c0e3ea0b252078327" 373 | integrity sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc= 374 | 375 | glob@^7.0.0, glob@^7.0.3, glob@^7.0.5, glob@^7.1.2: 376 | version "7.1.3" 377 | resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" 378 | integrity sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ== 379 | dependencies: 380 | fs.realpath "^1.0.0" 381 | inflight "^1.0.4" 382 | inherits "2" 383 | minimatch "^3.0.4" 384 | once "^1.3.0" 385 | path-is-absolute "^1.0.0" 386 | 387 | globals@^11.7.0: 388 | version "11.8.0" 389 | resolved "https://registry.yarnpkg.com/globals/-/globals-11.8.0.tgz#c1ef45ee9bed6badf0663c5cb90e8d1adec1321d" 390 | integrity sha512-io6LkyPVuzCHBSQV9fmOwxZkUk6nIaGmxheLDgmuFv89j0fm2aqDbIXKAGfzCMHqz3HLF2Zf8WSG6VqMh2qFmA== 391 | 392 | globby@^5.0.0: 393 | version "5.0.0" 394 | resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" 395 | integrity sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0= 396 | dependencies: 397 | array-union "^1.0.1" 398 | arrify "^1.0.0" 399 | glob "^7.0.3" 400 | object-assign "^4.0.1" 401 | pify "^2.0.0" 402 | pinkie-promise "^2.0.0" 403 | 404 | graceful-fs@^4.1.2: 405 | version "4.1.11" 406 | resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" 407 | integrity sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg= 408 | 409 | has-flag@^3.0.0: 410 | version "3.0.0" 411 | resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" 412 | integrity sha1-tdRU3CGZriJWmfNGfloH87lVuv0= 413 | 414 | iconv-lite@^0.4.24: 415 | version "0.4.24" 416 | resolved "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz#2022b4b25fbddc21d2f524974a474aafe733908b" 417 | integrity sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA== 418 | dependencies: 419 | safer-buffer ">= 2.1.2 < 3" 420 | 421 | ignore@^4.0.6: 422 | version "4.0.6" 423 | resolved "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz#750e3db5862087b4737ebac8207ffd1ef27b25fc" 424 | integrity sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg== 425 | 426 | import-fresh@^3.0.0: 427 | version "3.0.0" 428 | resolved "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.0.0.tgz#a3d897f420cab0e671236897f75bc14b4885c390" 429 | integrity sha512-pOnA9tfM3Uwics+SaBLCNyZZZbK+4PTu0OPZtLlMIrv17EdBoC15S9Kn8ckJ9TZTyKb3ywNE5y1yeDxxGA7nTQ== 430 | dependencies: 431 | parent-module "^1.0.0" 432 | resolve-from "^4.0.0" 433 | 434 | imurmurhash@^0.1.4: 435 | version "0.1.4" 436 | resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" 437 | integrity sha1-khi5srkoojixPcT7a21XbyMUU+o= 438 | 439 | inflight@^1.0.4: 440 | version "1.0.6" 441 | resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" 442 | integrity sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk= 443 | dependencies: 444 | once "^1.3.0" 445 | wrappy "1" 446 | 447 | inherits@2: 448 | version "2.0.3" 449 | resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" 450 | integrity sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4= 451 | 452 | inquirer@^6.1.0, inquirer@^6.2.2: 453 | version "6.2.2" 454 | resolved "https://registry.yarnpkg.com/inquirer/-/inquirer-6.2.2.tgz#46941176f65c9eb20804627149b743a218f25406" 455 | integrity sha512-Z2rREiXA6cHRR9KBOarR3WuLlFzlIfAEIiB45ll5SSadMg7WqOh1MKEjjndfuH5ewXdixWCxqnVfGOQzPeiztA== 456 | dependencies: 457 | ansi-escapes "^3.2.0" 458 | chalk "^2.4.2" 459 | cli-cursor "^2.1.0" 460 | cli-width "^2.0.0" 461 | external-editor "^3.0.3" 462 | figures "^2.0.0" 463 | lodash "^4.17.11" 464 | mute-stream "0.0.7" 465 | run-async "^2.2.0" 466 | rxjs "^6.4.0" 467 | string-width "^2.1.0" 468 | strip-ansi "^5.0.0" 469 | through "^2.3.6" 470 | 471 | interpret@^1.0.0: 472 | version "1.1.0" 473 | resolved "https://registry.yarnpkg.com/interpret/-/interpret-1.1.0.tgz#7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614" 474 | integrity sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ= 475 | 476 | is-fullwidth-code-point@^2.0.0: 477 | version "2.0.0" 478 | resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" 479 | integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8= 480 | 481 | is-path-cwd@^1.0.0: 482 | version "1.0.0" 483 | resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" 484 | integrity sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0= 485 | 486 | is-path-in-cwd@^1.0.0: 487 | version "1.0.1" 488 | resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.1.tgz#5ac48b345ef675339bd6c7a48a912110b241cf52" 489 | integrity sha512-FjV1RTW48E7CWM7eE/J2NJvAEEVektecDBVBE5Hh3nM1Jd0kvhHtX68Pr3xsDf857xt3Y4AkwVULK1Vku62aaQ== 490 | dependencies: 491 | is-path-inside "^1.0.0" 492 | 493 | is-path-inside@^1.0.0: 494 | version "1.0.1" 495 | resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.1.tgz#8ef5b7de50437a3fdca6b4e865ef7aa55cb48036" 496 | integrity sha1-jvW33lBDej/cprToZe96pVy0gDY= 497 | dependencies: 498 | path-is-inside "^1.0.1" 499 | 500 | is-promise@^2.1.0: 501 | version "2.1.0" 502 | resolved "https://registry.yarnpkg.com/is-promise/-/is-promise-2.1.0.tgz#79a2a9ece7f096e80f36d2b2f3bc16c1ff4bf3fa" 503 | integrity sha1-eaKp7OfwlugPNtKy87wWwf9L8/o= 504 | 505 | isexe@^2.0.0: 506 | version "2.0.0" 507 | resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" 508 | integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA= 509 | 510 | js-tokens@^4.0.0: 511 | version "4.0.0" 512 | resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" 513 | integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ== 514 | 515 | js-yaml@^3.12.0: 516 | version "3.12.0" 517 | resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" 518 | integrity sha512-PIt2cnwmPfL4hKNwqeiuz4bKfnzHTBv6HyVgjahA6mPLwPDzjDWrplJBMjHUFxku/N3FlmrbyPclad+I+4mJ3A== 519 | dependencies: 520 | argparse "^1.0.7" 521 | esprima "^4.0.0" 522 | 523 | json-schema-traverse@^0.4.1: 524 | version "0.4.1" 525 | resolved "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz#69f6a87d9513ab8bb8fe63bdb0979c448e684660" 526 | integrity sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg== 527 | 528 | json-stable-stringify-without-jsonify@^1.0.1: 529 | version "1.0.1" 530 | resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651" 531 | integrity sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE= 532 | 533 | levn@^0.3.0, levn@~0.3.0: 534 | version "0.3.0" 535 | resolved "https://registry.yarnpkg.com/levn/-/levn-0.3.0.tgz#3b09924edf9f083c0490fdd4c0bc4421e04764ee" 536 | integrity sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4= 537 | dependencies: 538 | prelude-ls "~1.1.2" 539 | type-check "~0.3.2" 540 | 541 | lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.5: 542 | version "4.17.11" 543 | resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" 544 | integrity sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg== 545 | 546 | mimic-fn@^1.0.0: 547 | version "1.2.0" 548 | resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" 549 | integrity sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ== 550 | 551 | minimatch@^3.0.4: 552 | version "3.0.4" 553 | resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" 554 | integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA== 555 | dependencies: 556 | brace-expansion "^1.1.7" 557 | 558 | minimist@0.0.8: 559 | version "0.0.8" 560 | resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" 561 | integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0= 562 | 563 | mkdirp@^0.5.1: 564 | version "0.5.1" 565 | resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" 566 | integrity sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM= 567 | dependencies: 568 | minimist "0.0.8" 569 | 570 | ms@^2.1.1: 571 | version "2.1.1" 572 | resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" 573 | integrity sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg== 574 | 575 | mute-stream@0.0.7: 576 | version "0.0.7" 577 | resolved "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab" 578 | integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s= 579 | 580 | natural-compare@^1.4.0: 581 | version "1.4.0" 582 | resolved "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7" 583 | integrity sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc= 584 | 585 | nice-try@^1.0.4: 586 | version "1.0.5" 587 | resolved "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz#a3378a7696ce7d223e88fc9b764bd7ef1089e366" 588 | integrity sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ== 589 | 590 | object-assign@^4.0.1: 591 | version "4.1.1" 592 | resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" 593 | integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM= 594 | 595 | once@^1.3.0: 596 | version "1.4.0" 597 | resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" 598 | integrity sha1-WDsap3WWHUsROsF9nFC6753Xa9E= 599 | dependencies: 600 | wrappy "1" 601 | 602 | onetime@^2.0.0: 603 | version "2.0.1" 604 | resolved "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz#067428230fd67443b2794b22bba528b6867962d4" 605 | integrity sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ= 606 | dependencies: 607 | mimic-fn "^1.0.0" 608 | 609 | optionator@^0.8.2: 610 | version "0.8.2" 611 | resolved "https://registry.yarnpkg.com/optionator/-/optionator-0.8.2.tgz#364c5e409d3f4d6301d6c0b4c05bba50180aeb64" 612 | integrity sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q= 613 | dependencies: 614 | deep-is "~0.1.3" 615 | fast-levenshtein "~2.0.4" 616 | levn "~0.3.0" 617 | prelude-ls "~1.1.2" 618 | type-check "~0.3.2" 619 | wordwrap "~1.0.0" 620 | 621 | os-tmpdir@~1.0.2: 622 | version "1.0.2" 623 | resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" 624 | integrity sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ= 625 | 626 | pad@^2.2.1: 627 | version "2.2.1" 628 | resolved "https://registry.yarnpkg.com/pad/-/pad-2.2.1.tgz#e53e5de1304bc4c6c38004cad803f7641cff3220" 629 | integrity sha512-lVia7rFne82Flf8V5Szzw2oP2zcQBGtCUXvo0pF1c6CmUHc9QLSZ1NQM/YujaM5YdQBsLJ1u90om+T1zKF42HQ== 630 | dependencies: 631 | wcwidth "^1.0.1" 632 | 633 | parent-module@^1.0.0: 634 | version "1.0.0" 635 | resolved "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.0.tgz#df250bdc5391f4a085fb589dad761f5ad6b865b5" 636 | integrity sha512-8Mf5juOMmiE4FcmzYc4IaiS9L3+9paz2KOiXzkRviCP6aDmN49Hz6EMWz0lGNp9pX80GvvAuLADtyGfW/Em3TA== 637 | dependencies: 638 | callsites "^3.0.0" 639 | 640 | path-is-absolute@^1.0.0: 641 | version "1.0.1" 642 | resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" 643 | integrity sha1-F0uSaHNVNP+8es5r9TpanhtcX18= 644 | 645 | path-is-inside@^1.0.1, path-is-inside@^1.0.2: 646 | version "1.0.2" 647 | resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" 648 | integrity sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM= 649 | 650 | path-key@^2.0.1: 651 | version "2.0.1" 652 | resolved "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz#411cadb574c5a140d3a4b1910d40d80cc9f40b40" 653 | integrity sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A= 654 | 655 | path-parse@^1.0.5: 656 | version "1.0.6" 657 | resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz#d62dbb5679405d72c4737ec58600e9ddcf06d24c" 658 | integrity sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw== 659 | 660 | pify@^2.0.0: 661 | version "2.3.0" 662 | resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" 663 | integrity sha1-7RQaasBDqEnqWISY59yosVMw6Qw= 664 | 665 | pinkie-promise@^2.0.0: 666 | version "2.0.1" 667 | resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" 668 | integrity sha1-ITXW36ejWMBprJsXh3YogihFD/o= 669 | dependencies: 670 | pinkie "^2.0.0" 671 | 672 | pinkie@^2.0.0: 673 | version "2.0.4" 674 | resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" 675 | integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA= 676 | 677 | prelude-ls@~1.1.2: 678 | version "1.1.2" 679 | resolved "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.1.2.tgz#21932a549f5e52ffd9a827f570e04be62a97da54" 680 | integrity sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ= 681 | 682 | progress@^2.0.0: 683 | version "2.0.1" 684 | resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.1.tgz#c9242169342b1c29d275889c95734621b1952e31" 685 | integrity sha512-OE+a6vzqazc+K6LxJrX5UPyKFvGnL5CYmq2jFGNIBWHpc4QyE49/YOumcrpQFJpfejmvRtbJzgO1zPmMCqlbBg== 686 | 687 | punycode@^2.1.0: 688 | version "2.1.1" 689 | resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec" 690 | integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A== 691 | 692 | rechoir@^0.6.2: 693 | version "0.6.2" 694 | resolved "https://registry.yarnpkg.com/rechoir/-/rechoir-0.6.2.tgz#85204b54dba82d5742e28c96756ef43af50e3384" 695 | integrity sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q= 696 | dependencies: 697 | resolve "^1.1.6" 698 | 699 | regexpp@^2.0.1: 700 | version "2.0.1" 701 | resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-2.0.1.tgz#8d19d31cf632482b589049f8281f93dbcba4d07f" 702 | integrity sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw== 703 | 704 | resolve-from@^4.0.0: 705 | version "4.0.0" 706 | resolved "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz#4abcd852ad32dd7baabfe9b40e00a36db5f392e6" 707 | integrity sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g== 708 | 709 | resolve@^1.1.6: 710 | version "1.8.1" 711 | resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.8.1.tgz#82f1ec19a423ac1fbd080b0bab06ba36e84a7a26" 712 | integrity sha512-AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA== 713 | dependencies: 714 | path-parse "^1.0.5" 715 | 716 | restore-cursor@^2.0.0: 717 | version "2.0.0" 718 | resolved "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz#9f7ee287f82fd326d4fd162923d62129eee0dfaf" 719 | integrity sha1-n37ih/gv0ybU/RYpI9YhKe7g368= 720 | dependencies: 721 | onetime "^2.0.0" 722 | signal-exit "^3.0.2" 723 | 724 | rimraf@^2.2.8: 725 | version "2.6.2" 726 | resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.2.tgz#2ed8150d24a16ea8651e6d6ef0f47c4158ce7a36" 727 | integrity sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w== 728 | dependencies: 729 | glob "^7.0.5" 730 | 731 | run-async@^2.2.0: 732 | version "2.3.0" 733 | resolved "https://registry.yarnpkg.com/run-async/-/run-async-2.3.0.tgz#0371ab4ae0bdd720d4166d7dfda64ff7a445a6c0" 734 | integrity sha1-A3GrSuC91yDUFm19/aZP96RFpsA= 735 | dependencies: 736 | is-promise "^2.1.0" 737 | 738 | rxjs@^6.4.0: 739 | version "6.4.0" 740 | resolved "https://registry.yarnpkg.com/rxjs/-/rxjs-6.4.0.tgz#f3bb0fe7bda7fb69deac0c16f17b50b0b8790504" 741 | integrity sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw== 742 | dependencies: 743 | tslib "^1.9.0" 744 | 745 | "safer-buffer@>= 2.1.2 < 3": 746 | version "2.1.2" 747 | resolved "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz#44fa161b0187b9549dd84bb91802f9bd8385cd6a" 748 | integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== 749 | 750 | semver@^5.5.0, semver@^5.5.1: 751 | version "5.6.0" 752 | resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" 753 | integrity sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg== 754 | 755 | shebang-command@^1.2.0: 756 | version "1.2.0" 757 | resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" 758 | integrity sha1-RKrGW2lbAzmJaMOfNj/uXer98eo= 759 | dependencies: 760 | shebang-regex "^1.0.0" 761 | 762 | shebang-regex@^1.0.0: 763 | version "1.0.0" 764 | resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" 765 | integrity sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM= 766 | 767 | shelljs@^0.8.2: 768 | version "0.8.2" 769 | resolved "https://registry.yarnpkg.com/shelljs/-/shelljs-0.8.2.tgz#345b7df7763f4c2340d584abb532c5f752ca9e35" 770 | integrity sha512-pRXeNrCA2Wd9itwhvLp5LZQvPJ0wU6bcjaTMywHHGX5XWhVN2nzSu7WV0q+oUY7mGK3mgSkDDzP3MgjqdyIgbQ== 771 | dependencies: 772 | glob "^7.0.0" 773 | interpret "^1.0.0" 774 | rechoir "^0.6.2" 775 | 776 | signal-exit@^3.0.2: 777 | version "3.0.2" 778 | resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" 779 | integrity sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0= 780 | 781 | slice-ansi@1.0.0: 782 | version "1.0.0" 783 | resolved "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-1.0.0.tgz#044f1a49d8842ff307aad6b505ed178bd950134d" 784 | integrity sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg== 785 | dependencies: 786 | is-fullwidth-code-point "^2.0.0" 787 | 788 | sprintf-js@~1.0.2: 789 | version "1.0.3" 790 | resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" 791 | integrity sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw= 792 | 793 | string-width@^2.1.0, string-width@^2.1.1: 794 | version "2.1.1" 795 | resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz#ab93f27a8dc13d28cac815c462143a6d9012ae9e" 796 | integrity sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw== 797 | dependencies: 798 | is-fullwidth-code-point "^2.0.0" 799 | strip-ansi "^4.0.0" 800 | 801 | strip-ansi@^4.0.0: 802 | version "4.0.0" 803 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz#a8479022eb1ac368a871389b635262c505ee368f" 804 | integrity sha1-qEeQIusaw2iocTibY1JixQXuNo8= 805 | dependencies: 806 | ansi-regex "^3.0.0" 807 | 808 | strip-ansi@^5.0.0: 809 | version "5.0.0" 810 | resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.0.0.tgz#f78f68b5d0866c20b2c9b8c61b5298508dc8756f" 811 | integrity sha512-Uu7gQyZI7J7gn5qLn1Np3G9vcYGTVqB+lFTytnDJv83dd8T22aGH451P3jueT2/QemInJDfxHB5Tde5OzgG1Ow== 812 | dependencies: 813 | ansi-regex "^4.0.0" 814 | 815 | strip-json-comments@^2.0.1: 816 | version "2.0.1" 817 | resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" 818 | integrity sha1-PFMZQukIwml8DsNEhYwobHygpgo= 819 | 820 | supports-color@^5.3.0: 821 | version "5.5.0" 822 | resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz#e2e69a44ac8772f78a1ec0b35b689df6530efc8f" 823 | integrity sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow== 824 | dependencies: 825 | has-flag "^3.0.0" 826 | 827 | table@^5.0.2: 828 | version "5.1.0" 829 | resolved "https://registry.yarnpkg.com/table/-/table-5.1.0.tgz#69a54644f6f01ad1628f8178715b408dc6bf11f7" 830 | integrity sha512-e542in22ZLhD/fOIuXs/8yDZ9W61ltF8daM88rkRNtgTIct+vI2fTnAyu/Db2TCfEcI8i7mjZz6meLq0nW7TYg== 831 | dependencies: 832 | ajv "^6.5.3" 833 | lodash "^4.17.10" 834 | slice-ansi "1.0.0" 835 | string-width "^2.1.1" 836 | 837 | text-table@^0.2.0: 838 | version "0.2.0" 839 | resolved "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz#7f5ee823ae805207c00af2df4a84ec3fcfa570b4" 840 | integrity sha1-f17oI66AUgfACvLfSoTsP8+lcLQ= 841 | 842 | through@^2.3.6: 843 | version "2.3.8" 844 | resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" 845 | integrity sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU= 846 | 847 | tmp@^0.0.33: 848 | version "0.0.33" 849 | resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz#6d34335889768d21b2bcda0aa277ced3b1bfadf9" 850 | integrity sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw== 851 | dependencies: 852 | os-tmpdir "~1.0.2" 853 | 854 | tslib@^1.9.0: 855 | version "1.9.3" 856 | resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286" 857 | integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ== 858 | 859 | type-check@~0.3.2: 860 | version "0.3.2" 861 | resolved "https://registry.yarnpkg.com/type-check/-/type-check-0.3.2.tgz#5884cab512cf1d355e3fb784f30804b2b520db72" 862 | integrity sha1-WITKtRLPHTVeP7eE8wgEsrUg23I= 863 | dependencies: 864 | prelude-ls "~1.1.2" 865 | 866 | uri-js@^4.2.2: 867 | version "4.2.2" 868 | resolved "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz#94c540e1ff772956e2299507c010aea6c8838eb0" 869 | integrity sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ== 870 | dependencies: 871 | punycode "^2.1.0" 872 | 873 | wcwidth@^1.0.1: 874 | version "1.0.1" 875 | resolved "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz#f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8" 876 | integrity sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g= 877 | dependencies: 878 | defaults "^1.0.3" 879 | 880 | which@^1.2.9: 881 | version "1.3.1" 882 | resolved "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz#a45043d54f5805316da8d62f9f50918d3da70b0a" 883 | integrity sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ== 884 | dependencies: 885 | isexe "^2.0.0" 886 | 887 | wordwrap@~1.0.0: 888 | version "1.0.0" 889 | resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-1.0.0.tgz#27584810891456a4171c8d0226441ade90cbcaeb" 890 | integrity sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus= 891 | 892 | wrappy@1: 893 | version "1.0.2" 894 | resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" 895 | integrity sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8= 896 | 897 | write@^0.2.1: 898 | version "0.2.1" 899 | resolved "https://registry.yarnpkg.com/write/-/write-0.2.1.tgz#5fc03828e264cea3fe91455476f7a3c566cb0757" 900 | integrity sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c= 901 | dependencies: 902 | mkdirp "^0.5.1" 903 | --------------------------------------------------------------------------------