Full Code of commitdev/zero for AI

main de71b8bd09b0 cached
126 files
24.6 MB
102.0k tokens
212 symbols
1 requests
Download .txt
Showing preview only (352K chars total). Download the full file or copy to clipboard to get everything.
Repository: commitdev/zero
Branch: main
Commit: de71b8bd09b0
Files: 126
Total size: 24.6 MB

Directory structure:
gitextract_gf3x61g3/

├── .circleci/
│   └── config.yml
├── .dockerignore
├── .github/
│   └── workflows/
│       ├── codeql-analysis.yml
│       ├── config.yml
│       └── doc-site.yml
├── .gitignore
├── .goreleaser.yml
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── LICENSE.spdx
├── Makefile
├── README.md
├── cmd/
│   ├── apply.go
│   ├── check.go
│   ├── create.go
│   ├── init.go
│   ├── version.go
│   └── zero.go
├── doc-site/
│   ├── .gitignore
│   ├── README.md
│   ├── babel.config.js
│   ├── docs/
│   │   ├── about/
│   │   │   ├── opensource.md
│   │   │   ├── overview.md
│   │   │   ├── real-world-usage.md
│   │   │   ├── roadmap.md
│   │   │   └── technology-choices.md
│   │   ├── concepts/
│   │   │   ├── core-concepts.md
│   │   │   └── project-life-cycle.md
│   │   ├── getting-started/
│   │   │   ├── installation.md
│   │   │   ├── prerequisites.md
│   │   │   ├── zero-apply.md
│   │   │   ├── zero-create.md
│   │   │   └── zero-init.md
│   │   └── reference/
│   │       ├── learning-resources.md
│   │       ├── module-definition.md
│   │       ├── project-definition.md
│   │       └── working-on-zero.md
│   ├── docusaurus.config.js
│   ├── package.json
│   ├── sidebars.js
│   ├── src/
│   │   ├── components/
│   │   │   ├── HomepageFeatures.js
│   │   │   ├── HomepageFeatures.module.scss
│   │   │   ├── HomepageOfferings.js
│   │   │   ├── HomepageOfferings.module.scss
│   │   │   ├── HomepageTrustedBy.js
│   │   │   ├── HomepageTrustedBy.module.scss
│   │   │   ├── HomepageVideo.js
│   │   │   ├── HomepageVideo.module.scss
│   │   │   ├── HomepageWhyZero.js
│   │   │   └── HomepageWhyZero.module.scss
│   │   ├── css/
│   │   │   └── custom.css
│   │   ├── pages/
│   │   │   ├── docs/
│   │   │   │   ├── index.js
│   │   │   │   └── zero/
│   │   │   │       └── index.js
│   │   │   ├── index.js
│   │   │   └── index.module.scss
│   │   └── theme/
│   │       └── DocSidebar/
│   │           ├── index.js
│   │           └── styles.module.css
│   └── static/
│       └── .nojekyll
├── go.mod
├── go.sum
├── internal/
│   ├── apply/
│   │   ├── apply.go
│   │   └── apply_test.go
│   ├── condition/
│   │   ├── condition.go
│   │   └── condition_test.go
│   ├── config/
│   │   ├── moduleconfig/
│   │   │   └── module_config.go
│   │   └── projectconfig/
│   │       ├── init.go
│   │       ├── init_test.go
│   │       ├── project_config.go
│   │       └── project_config_test.go
│   ├── constants/
│   │   └── constants.go
│   ├── generate/
│   │   ├── generate_modules.go
│   │   └── generate_test.go
│   ├── init/
│   │   ├── custom-prompts.go
│   │   ├── debug.test
│   │   ├── init.go
│   │   ├── prompts.go
│   │   └── prompts_test.go
│   ├── module/
│   │   ├── module.go
│   │   ├── module_internal_test.go
│   │   └── module_test.go
│   ├── registry/
│   │   ├── registry.go
│   │   └── registry_test.go
│   ├── util/
│   │   └── util.go
│   └── vcs/
│       └── create-git-repos.go
├── main.go
├── pkg/
│   ├── credentials/
│   │   ├── credentials.go
│   │   └── credentials_test.go
│   └── util/
│       ├── exit/
│       │   └── exit.go
│       ├── flog/
│       │   └── log.go
│       └── fs/
│           ├── fs.go
│           └── fs_test.go
├── registry.yaml
├── tests/
│   ├── integration/
│   │   └── ci/
│   │       └── ci_test.go
│   └── test_data/
│       ├── apply/
│       │   ├── project1/
│       │   │   ├── Makefile
│       │   │   └── zero-module.yml
│       │   ├── project2/
│       │   │   ├── Makefile
│       │   │   ├── check.sh
│       │   │   └── zero-module.yml
│       │   └── zero-project.yml
│       ├── apply-failing/
│       │   ├── project1/
│       │   │   ├── Makefile
│       │   │   ├── project.out
│       │   │   └── zero-module.yml
│       │   ├── project2/
│       │   │   ├── Makefile
│       │   │   ├── project.out
│       │   │   └── zero-module.yml
│       │   ├── project3/
│       │   │   ├── Makefile
│       │   │   ├── check.sh
│       │   │   ├── project.out
│       │   │   └── zero-module.yml
│       │   └── zero-project.yml
│       ├── aws/
│       │   └── mock_credentials.yml
│       ├── ci/
│       │   └── expected/
│       │       ├── .circleci/
│       │       │   └── config.yml
│       │       ├── .travis.yml
│       │       └── Jenkinsfile
│       ├── configs/
│       │   ├── commit0_submodules.yml
│       │   ├── credentials.yml
│       │   └── zero-basic.yml
│       ├── generate/
│       │   ├── file_to_template.txt
│       │   └── zero-module.yml
│       ├── modules/
│       │   ├── ci/
│       │   │   ├── config1.yml
│       │   │   ├── dir/
│       │   │   │   └── config2.yml
│       │   │   └── zero-module.yml
│       │   └── no-version-constraint/
│       │       └── zero-module.yml
│       └── projectconfig/
│           └── zero-project.yml
└── version/
    └── version.go

================================================
FILE CONTENTS
================================================

================================================
FILE: .circleci/config.yml
================================================
---
version: 2.1
orbs:
  slack-message: commitdev/slack-message@0.0.3
  version-tag: commitdev/version-tag@0.0.3

variables:
  - &workspace /home/circleci/project
  - &build-image circleci/golang:1.16.8

aliases:
  # Shallow Clone - this allows us to cut the 2 minute repo clone down to about 10 seconds for repos with 50,000 commits+
  - &checkout-shallow
    name: Checkout (Shallow)
    command: |
      #!/bin/sh
      set -e

      # Workaround old docker images with incorrect $HOME
      # check https://github.com/docker/docker/issues/2968 for details
      if [ "${HOME}" = "/" ]
      then
        export HOME=$(getent passwd $(id -un) | cut -d: -f6)
      fi

      mkdir -p ~/.ssh

      echo 'github.com ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAq2A7hRGmdnm9tUDbO9IDSwBK6TbQa+PXYPCPy6rbTrTtw7PHkccKrpp0yVhp5HdEIcKr6pLlVDBfOLX9QUsyCOV0wzfjIJNlGEYsdlLJizHhbn2mUjvSAHQqZETYP81eFzLQNnPHt4EVVUh7VfDESU84KezmD5QlWpXLmvU31/yMf+Se8xhHTvKSCZIFImWwoG6mbUoWf9nzpIoaSjB+weqqUUmpaaasXVal72J+UX2B+2RPW3RcT0eOzQgqlJL3RKrTJvdsjE3JEAvGq3lGHSZXy28G3skua2SmVi/w4yCE6gbODqnTWlg7+wC604ydGXA8VJiS5ap43JXiUFFAaQ==
      bitbucket.org ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAubiN81eDcafrgMeLzaFPsw2kNvEcqTKl/VqLat/MaB33pZy0y3rJZtnqwR2qOOvbwKZYKiEO1O6VqNEBxKvJJelCq0dTXWT5pbO2gDXC6h6QDXCaHo6pOHGPUy+YBaGQRGuSusMEASYiWunYN0vCAI8QaXnWMXNMdFP3jHAJH0eDsoiGnLPBlBp4TNm6rYI74nMzgz3B9IikW4WVK+dc8KZJZWYjAuORU3jc1c/NPskD2ASinf8v3xnfXeukU0sJ5N6m5E8VLjObPEO+mN2t/FZTMZLiFqPWc/ALSqnMnnhwrNi2rbfg/rd/IpL8Le3pSBne8+seeFVBoGqzHM9yXw==' >> ~/.ssh/known_hosts

      (umask 077; touch ~/.ssh/id_rsa)
      chmod 0600 ~/.ssh/id_rsa
      (cat \<<EOF > ~/.ssh/id_rsa
      $CHECKOUT_KEY
      EOF
      )

      # use git+ssh instead of https
      git config --global url."ssh://git@github.com".insteadOf "https://github.com" || true

      if [ -e /home/circleci/project/.git ]
      then
          cd /home/circleci/project
          git remote set-url origin "$CIRCLE_REPOSITORY_URL" || true
      else
          mkdir -p /home/circleci/project
          cd /home/circleci/project
          git clone --depth=1 "$CIRCLE_REPOSITORY_URL" .
      fi

      if [ -n "$CIRCLE_TAG" ]
      then
        git fetch --depth=10 --force origin "refs/tags/${CIRCLE_TAG}"
      elif [[ "$CIRCLE_BRANCH" =~ ^pull\/* ]]
      then
      # For PR from Fork
        git fetch --depth=10 --force origin "$CIRCLE_BRANCH/head:remotes/origin/$CIRCLE_BRANCH"
      else
        git fetch --depth=10 --force origin "$CIRCLE_BRANCH:remotes/origin/$CIRCLE_BRANCH"
      fi

      if [ -n "$CIRCLE_TAG" ]
      then
          git reset --hard "$CIRCLE_SHA1"
          git checkout -q "$CIRCLE_TAG"
      elif [ -n "$CIRCLE_BRANCH" ]
      then
          git reset --hard "$CIRCLE_SHA1"
          git checkout -q -B "$CIRCLE_BRANCH"
      fi

      git reset --hard "$CIRCLE_SHA1"
      pwd

jobs:
  checkout_code:
    docker:
      - image: *build-image
    steps:
      - run: *checkout-shallow
      - persist_to_workspace:
          root: /home/circleci/project
          paths:
            - .

  unit_test:
    docker:
      - image: *build-image
    working_directory: *workspace
    steps: # steps that comprise the `build` job
      - attach_workspace:
          at: *workspace

      - restore_cache: # restores saved cache if no changes are detected since last run
          keys:
            - v1-pkg-cache-{{ checksum "go.sum" }}
            - v1-pkg-cache-

      - run:
          name: Run unit tests
          # store the results of our tests in the $TEST_RESULTS directory
          command: |
            go get -u github.com/jstemmer/go-junit-report
            mkdir -p test-reports
            PACKAGE_NAMES=$(go list ./... | circleci tests split --split-by=timings --timings-type=classname)
            echo "Tests: $PACKAGE_NAMES"
            go test -v $PACKAGE_NAMES | go-junit-report > test-reports/junit.xml

      - save_cache: # Store cache in the /go/pkg directory
          key: v1-pkg-cache-{{ checksum "go.sum" }}
          paths:
            - "/go/pkg"

      - store_test_results:
          path: test-reports

      - store_artifacts:
          path: test-reports

      # Requires the SLACK_WEBHOOK
      # - slack/notify-on-failure

  build_and_push:
    machine:
      image: circleci/classic:latest
      # docker_layer_caching: true # only for performance plan circleci accounts
    steps:
      - attach_workspace:
          at: *workspace
      - run: *checkout-shallow
      - version-tag/create
      - run:
          name: Update Version command
          command: |
            ./updateVersion.sh "$VERSION_TAG"
      - run:
          name: Build Docker image
          command: |
            make ci-docker-build
      - run:
          name: Push to Docker Hub
          command: |
            make ci-docker-push


workflows:
    version: 2
    # The main workflow. Check out the code, build it, push it, deploy to staging, test, deploy to production
    build_test_and_deploy:
      jobs:
        - checkout_code

        - unit_test:
            requires:
              - checkout_code

        - build_and_push:
            requires:
              - unit_test
            filters:
              branches:
                only:  # only branches matching the below regex filters will run
                  - /^master$/



================================================
FILE: .dockerignore
================================================
Dockerfile
README.md
.history/
.travis.yml
.gitignore
.git
example/
tmp/


================================================
FILE: .github/workflows/codeql-analysis.yml
================================================
name: "CodeQL"

on:
  push:
    branches: [main]
  pull_request:
    # The branches below must be a subset of the branches above
    branches: [main]
  schedule:
    - cron: '0 4 * * 1'

jobs:
  analyze:
    name: Analyze
    runs-on: ubuntu-latest
    permissions:
      security-events: write

    steps:
    - name: Checkout repository
      uses: actions/checkout@v3
      with:
        # We must fetch at least the immediate parents so that if this is
        # a pull request then we can checkout the head.
        fetch-depth: 2

    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v2
      with:
        languages: go

    # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java).
    # If this step fails, then you should remove it and run the build manually (see below)
    - name: Autobuild
      uses: github/codeql-action/autobuild@v2

    # ℹ️ Command-line programs to run using the OS shell.
    # 📚 https://git.io/JvXDl

    # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
    #    and modify them (or add more) to build your code if your project
    #    uses a compiled language

    #- run: |
    #   make bootstrap
    #   make release

    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v2


================================================
FILE: .github/workflows/config.yml
================================================
on:
  pull_request:
    branches:
      - main

jobs:
  unit_test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - uses: actions/setup-go@v2
        with:
          go-version: 1.16
      - uses: actions/cache@v2
        with:
          path: ~/go/pkg/mod
          key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}
          restore-keys: |
            ${{ runner.os }}-go-
      - name: Run Go Tests
        run: |
          make check


================================================
FILE: .github/workflows/doc-site.yml
================================================
## The is a combination of sites where
## Zero serves on the root of the domain /
## and module serves on /docs/modules/<path>/
# from the same S3 bucket

name: "Build Documentation Site"
on:
  push:
    branches:
      - main
    paths:
      - doc-site/**

env:
  region: us-west-2
  s3_sync_path_to_exclude: docs/modules/*
  s3_sync_path: ""
  BUILD_DOMAIN: ${{ secrets.ZERO_DOC_SITE_DOMAIN_NAME }}
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
      - name: Setup node.js
        uses: actions/setup-node@v3
        with:
          node-version: 16
      # - name: Documentaiton site folder
      #   run: cd doc-site
      - name: Install Dependencies
        working-directory: doc-site
        run: npm install
      - name: Build website
        working-directory: doc-site
        run: |
          npm run build
          pwd
          ls -la
      - name: Upload build artifact to Github
        uses: actions/upload-artifact@v2
        with:
          name: build-artifact
          path: doc-site/build

  deploy:
    name: Deploy
    runs-on: ubuntu-latest
    needs: build
    # These permissions are needed to interact with GitHub's OIDC Token endpoint.
    permissions:
      id-token: write
      contents: read
      
    steps:
    # Once github action supports nested composite actions (anything `uses` is a composite action)
    # Therefore we cannot reuse the code as a separate composite action until it supports it,
    # current the deploy logic is in this file twice because of it
    ## https://github.com/actions/runner/issues/862
    - uses: actions/checkout@v2
    - name: Configure AWS credentials for S3 sync
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.ZERO_DOC_SITE_AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.ZERO_DOC_SITE_AWS_SECRET_ACCESS_KEY }}
        aws-region: ${{ env.region }}
    - name: Download build artifact from Github
      uses: actions/download-artifact@v1
      with:
        name: build-artifact
        path: build/
    - name: Sync with S3
      shell: bash
      run: |
        cd build
        aws s3 sync . "s3://${{ secrets.ZERO_DOC_SITE_BUCKET_NAME }}${{ env.s3_sync_path }}" --exclude "${{ env.s3_sync_path_to_exclude }}" --delete
    - name: Invalidate Cloudfront
      shell: bash
      run: |
        export DIST_ID=$(aws cloudfront list-distributions --query "DistributionList.Items[?Aliases.Items[?@=='${{ secrets.ZERO_DOC_SITE_BUCKET_NAME }}']].Id | [0]" | tr -d '"')
        aws cloudfront create-invalidation --distribution-id ${DIST_ID} --paths "/*"


================================================
FILE: .gitignore
================================================
main-packr.go
packrd
/zero
.history/
tmp
.vscode
example/
test-reports/
.circleci/config-compiled.yml
.idea/

================================================
FILE: .goreleaser.yml
================================================
# http://goreleaser.com
before:
  hooks:
    - go mod download
builds:
- env:
  - CGO_ENABLED=0
  ldflags:
    - -X github.com/commitdev/zero/version.AppVersion={{.Version}} -X github.com/commitdev/zero/version.AppBuild={{.ShortCommit}}
  goarch:
    - amd64
    - arm64
    - 386
archives:
- replacements:
    darwin: Darwin
    linux: Linux
    386: i386
    amd64: x86_64
checksum:
  name_template: 'checksums.txt'
snapshot:
  name_template: "{{ .Tag }}-next"
changelog:
  sort: asc
  filters:
    exclude:
    - '^docs:'
    - '^test:'

brews:
  - name: zero
    tap:
      owner: commitdev
      name: homebrew-zero
    commit_author:
      name: Commit.dev
      email: contact@commit.dev
    homepage: "https://github.com/commitdev/zero"
    description: "Allow startup developers to ship to production on day 1."
    dependencies:
      - name: git
        type: optional
      - name: terraform
        type: optional
      - name: jq
        type: optional
      - name: awscli
        type: optional
      - name: kubectl
        type: optional
      - name: wget
        type: optional
    test: |
      system "#{bin}/zero version"

nfpms:
  -
    id: zero
    package_name: zero
    vendor: Commit.dev
    homepage: https://github.com/commitdev/zero
    maintainer: commitdev <contact@commit.dev>
    description: "Allow startup developers to ship to production on day 1."
    formats:
      - apk
      - deb
      - rpm

    recommends:
      - awscli
      - git
      - jq
      - wget

    overrides:
      apk:
        recommends:
          - aws-cli
          - git
          - jq
          - wget


================================================
FILE: CONTRIBUTING.md
================================================
# Contributing to Zero

Thanks for your interest in Zero!

Zero is a fully open source project started by [Commit](https://commit.dev) but we are happy to be receiving support from our users and community.

If you have used Zero or are just interested in helping out there are a few key ways to contribute:

## Contribute some code
Zero is made up of a number of different, modular components. Eventually the idea is to make these more composable and discoverable with a module repository for anyone to supply their own, but for now we mostly organize the modules into predefined "stacks" combining the layers of infrastructure, backend, frontend, and static site.

Each module is in its own repo and has its own focus, language, etc. so there's plenty to contribute, regardless of your language of choice.
Here's a list of the core repositories:
|_Repo_|_Language_|_Description_|
|--|--|--|
| [zero](https://github.com/commitdev/zero) | Go | This repo - the application used to do prompting, module fetching, template rendering, and executing the commands of each module |
| [zero-aws-eks-stack](https://github.com/commitdev/zero-aws-eks-stack) | Terraform | The terraform code to create all infrastructure required to host the backend and frontend  applications in AWS (primarily using EKS) |
| [zero-backend-go](https://github.com/commitdev/zero-backend-go) | Go | A deployable backend service providing an API written in Go |
| [zero-backend-node](https://github.com/commitdev/zero-backend-node) | Node.js | A deployable backend service providing an API written in Node |
| [zero-frontend-react](https://github.com/commitdev/zero-frontend-react) | Javascript / React | A deployable web frontend meant to communicate with one of the zero backend services |
| [zero-static-site-gatsby](https://github.com/commitdev/zero-static-site-gatsby) | Javascript / Gatsby | A deployable static site / marketing site for your application |
| [zero-notification-service](https://github.com/commitdev/zero-notification-service) | Go | A service to abstract away some concepts around sending notifications (via Email, SMS, Slack, etc.) |
| [terraform-aws-zero](https://github.com/commitdev/zero-notification-service) | Terraform | Terraform modules that are exposed via the [Terrform Registry](https://registry.terraform.io/modules/commitdev/zero/aws/latest) and used in Zero modules. Typically functionality that is reusable and standalone |

There is a [GitHub Projects board](https://github.com/orgs/commitdev/projects/6/views/2) to aggregate the issues across all these repositories. This is a great way to get a sense of the work that is available and in the backlog across all the various modules and languages.

We are trying to make sure to keep a good amount of issues in the backlog with the "[good first issue](https://github.com/orgs/commitdev/projects/6/views/2?filterQuery=label%3A%22good+first+issue%22)" label and any issues with this label could be a good place to start either because they are relatively easy or have few dependencies. We also try to include an estimate (Fibonacci where 1 is trivial, probably just a couple lines of code, and 8 or 13 would be a huge undertaking that likely needs to be split up into smaller issues.)

### Pull Requests
If you're interested in taking on an issue please comment on it to let other people know that someone is working on it. Then you can fork the repo and start local development.

When committing code, please sign your commits and try to include relevant commit messages, starting with a tag indicating what type of change you are making. Some of the repositories use these tags to automatically generate changelogs. (`feat`, `fix`, `enhancement`, `docs`, etc.)
For example:
`fix: add proper encoding of billing parameters`
or
`enhancement: support new terraform kubernetes provider`

When submitting a pull request to one of the projects please try to follow any PR and style guidelines, and make sure any relevant GitHub Actions tests are passing. If one of the tests is failing and you don't think it's related to your change, please let us know.



## Contribute documentation
Any place you find the documentation to be lacking or incorrect we would be happy for someone to contribute a change. The documentation at our [public docs site](https://getzero.dev/docs/) is auto-generated using [Docusaurus](https://docusaurus.io/), and is updated automatically when any PR is merged into the main branch in one of the repositories.

## Write up a bug report
If you run into a problem when using Zero, please feel free to create a ticket in the relevant repository. Ideally it will be clear which repo the issue should be in, but if you're not sure you can create it in the main zero repo and we will move it around if necessary. Please include as much detail as possible and any reproduction steps that might be necessary.

## Request a feature
If there's something you think should be part of Zero but you don't see it yet, you can join the conversation in the [Zero community Slack](https://slack.getzero.dev) or [GitHub Discussions](https://github.com/commitdev/zero/discussions) and if we think it fits and it's not already covered in our roadmap we will add an issue for it.

## Tell a friend
If you like what we're doing, please share it with your network!


================================================
FILE: Dockerfile
================================================
FROM golang:1.12.12-alpine3.10 as builder

ENV GO111MODULE=on
ENV TERRAFORM_VERSION=0.12.13

RUN apk add --update --no-cache build-base curl git upx && \
  rm -rf /var/cache/apk/*

RUN apk add --update nodejs npm

RUN curl -sSL \
  https://amazon-eks.s3-us-west-2.amazonaws.com/1.14.6/2019-08-22/bin/linux/amd64/aws-iam-authenticator \
  -o /usr/local/bin/aws-iam-authenticator

RUN GO111MODULE=off go get -u github.com/grpc-ecosystem/grpc-gateway/protoc-gen-grpc-gateway

RUN curl -sSLo /tmp/terraform.zip "https://releases.hashicorp.com/terraform/${TERRAFORM_VERSION}/terraform_${TERRAFORM_VERSION}_linux_amd64.zip" && \
unzip -d /usr/local/bin/ /tmp/terraform.zip

RUN chmod +x /usr/local/bin/* && \
  upx --lzma /usr/local/bin/*

# Hydrate the dependency cache. This way, if the go.mod or go.sum files do not
# change we can cache the depdency layer without having to reinstall them.
WORKDIR /tmp/zero
COPY go.mod go.sum ./
RUN go mod download

COPY . .

RUN make build && \
  mv zero /usr/local/bin && \
  upx --lzma /usr/local/bin/zero

FROM alpine:3.10
ENV \
  PROTOBUF_VERSION=3.6.1-r1 \
  GOPATH=/proto-libs

RUN apk add --update bash ca-certificates git python && \
  apk add --update -t deps make py-pip

RUN mkdir ${GOPATH}
COPY --from=builder /usr/local/bin /usr/local/bin
COPY --from=builder /go/src/github.com/grpc-ecosystem/grpc-gateway ${GOPATH}/src/github.com/grpc-ecosystem/grpc-gateway
WORKDIR /project

ENTRYPOINT ["/usr/local/bin/zero"]


================================================
FILE: LICENSE
================================================
Mozilla Public License Version 2.0
==================================

1. Definitions
--------------

1.1. "Contributor"
    means each individual or legal entity that creates, contributes to
    the creation of, or owns Covered Software.

1.2. "Contributor Version"
    means the combination of the Contributions of others (if any) used
    by a Contributor and that particular Contributor's Contribution.

1.3. "Contribution"
    means Covered Software of a particular Contributor.

1.4. "Covered Software"
    means Source Code Form to which the initial Contributor has attached
    the notice in Exhibit A, the Executable Form of such Source Code
    Form, and Modifications of such Source Code Form, in each case
    including portions thereof.

1.5. "Incompatible With Secondary Licenses"
    means

    (a) that the initial Contributor has attached the notice described
        in Exhibit B to the Covered Software; or

    (b) that the Covered Software was made available under the terms of
        version 1.1 or earlier of the License, but not also under the
        terms of a Secondary License.

1.6. "Executable Form"
    means any form of the work other than Source Code Form.

1.7. "Larger Work"
    means a work that combines Covered Software with other material, in
    a separate file or files, that is not Covered Software.

1.8. "License"
    means this document.

1.9. "Licensable"
    means having the right to grant, to the maximum extent possible,
    whether at the time of the initial grant or subsequently, any and
    all of the rights conveyed by this License.

1.10. "Modifications"
    means any of the following:

    (a) any file in Source Code Form that results from an addition to,
        deletion from, or modification of the contents of Covered
        Software; or

    (b) any new file in Source Code Form that contains any Covered
        Software.

1.11. "Patent Claims" of a Contributor
    means any patent claim(s), including without limitation, method,
    process, and apparatus claims, in any patent Licensable by such
    Contributor that would be infringed, but for the grant of the
    License, by the making, using, selling, offering for sale, having
    made, import, or transfer of either its Contributions or its
    Contributor Version.

1.12. "Secondary License"
    means either the GNU General Public License, Version 2.0, the GNU
    Lesser General Public License, Version 2.1, the GNU Affero General
    Public License, Version 3.0, or any later versions of those
    licenses.

1.13. "Source Code Form"
    means the form of the work preferred for making modifications.

1.14. "You" (or "Your")
    means an individual or a legal entity exercising rights under this
    License. For legal entities, "You" includes any entity that
    controls, is controlled by, or is under common control with You. For
    purposes of this definition, "control" means (a) the power, direct
    or indirect, to cause the direction or management of such entity,
    whether by contract or otherwise, or (b) ownership of more than
    fifty percent (50%) of the outstanding shares or beneficial
    ownership of such entity.

2. License Grants and Conditions
--------------------------------

2.1. Grants

Each Contributor hereby grants You a world-wide, royalty-free,
non-exclusive license:

(a) under intellectual property rights (other than patent or trademark)
    Licensable by such Contributor to use, reproduce, make available,
    modify, display, perform, distribute, and otherwise exploit its
    Contributions, either on an unmodified basis, with Modifications, or
    as part of a Larger Work; and

(b) under Patent Claims of such Contributor to make, use, sell, offer
    for sale, have made, import, and otherwise transfer either its
    Contributions or its Contributor Version.

2.2. Effective Date

The licenses granted in Section 2.1 with respect to any Contribution
become effective for each Contribution on the date the Contributor first
distributes such Contribution.

2.3. Limitations on Grant Scope

The licenses granted in this Section 2 are the only rights granted under
this License. No additional rights or licenses will be implied from the
distribution or licensing of Covered Software under this License.
Notwithstanding Section 2.1(b) above, no patent license is granted by a
Contributor:

(a) for any code that a Contributor has removed from Covered Software;
    or

(b) for infringements caused by: (i) Your and any other third party's
    modifications of Covered Software, or (ii) the combination of its
    Contributions with other software (except as part of its Contributor
    Version); or

(c) under Patent Claims infringed by Covered Software in the absence of
    its Contributions.

This License does not grant any rights in the trademarks, service marks,
or logos of any Contributor (except as may be necessary to comply with
the notice requirements in Section 3.4).

2.4. Subsequent Licenses

No Contributor makes additional grants as a result of Your choice to
distribute the Covered Software under a subsequent version of this
License (see Section 10.2) or under the terms of a Secondary License (if
permitted under the terms of Section 3.3).

2.5. Representation

Each Contributor represents that the Contributor believes its
Contributions are its original creation(s) or it has sufficient rights
to grant the rights to its Contributions conveyed by this License.

2.6. Fair Use

This License is not intended to limit any rights You have under
applicable copyright doctrines of fair use, fair dealing, or other
equivalents.

2.7. Conditions

Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted
in Section 2.1.

3. Responsibilities
-------------------

3.1. Distribution of Source Form

All distribution of Covered Software in Source Code Form, including any
Modifications that You create or to which You contribute, must be under
the terms of this License. You must inform recipients that the Source
Code Form of the Covered Software is governed by the terms of this
License, and how they can obtain a copy of this License. You may not
attempt to alter or restrict the recipients' rights in the Source Code
Form.

3.2. Distribution of Executable Form

If You distribute Covered Software in Executable Form then:

(a) such Covered Software must also be made available in Source Code
    Form, as described in Section 3.1, and You must inform recipients of
    the Executable Form how they can obtain a copy of such Source Code
    Form by reasonable means in a timely manner, at a charge no more
    than the cost of distribution to the recipient; and

(b) You may distribute such Executable Form under the terms of this
    License, or sublicense it under different terms, provided that the
    license for the Executable Form does not attempt to limit or alter
    the recipients' rights in the Source Code Form under this License.

3.3. Distribution of a Larger Work

You may create and distribute a Larger Work under terms of Your choice,
provided that You also comply with the requirements of this License for
the Covered Software. If the Larger Work is a combination of Covered
Software with a work governed by one or more Secondary Licenses, and the
Covered Software is not Incompatible With Secondary Licenses, this
License permits You to additionally distribute such Covered Software
under the terms of such Secondary License(s), so that the recipient of
the Larger Work may, at their option, further distribute the Covered
Software under the terms of either this License or such Secondary
License(s).

3.4. Notices

You may not remove or alter the substance of any license notices
(including copyright notices, patent notices, disclaimers of warranty,
or limitations of liability) contained within the Source Code Form of
the Covered Software, except that You may alter any license notices to
the extent required to remedy known factual inaccuracies.

3.5. Application of Additional Terms

You may choose to offer, and to charge a fee for, warranty, support,
indemnity or liability obligations to one or more recipients of Covered
Software. However, You may do so only on Your own behalf, and not on
behalf of any Contributor. You must make it absolutely clear that any
such warranty, support, indemnity, or liability obligation is offered by
You alone, and You hereby agree to indemnify every Contributor for any
liability incurred by such Contributor as a result of warranty, support,
indemnity or liability terms You offer. You may include additional
disclaimers of warranty and limitations of liability specific to any
jurisdiction.

4. Inability to Comply Due to Statute or Regulation
---------------------------------------------------

If it is impossible for You to comply with any of the terms of this
License with respect to some or all of the Covered Software due to
statute, judicial order, or regulation then You must: (a) comply with
the terms of this License to the maximum extent possible; and (b)
describe the limitations and the code they affect. Such description must
be placed in a text file included with all distributions of the Covered
Software under this License. Except to the extent prohibited by statute
or regulation, such description must be sufficiently detailed for a
recipient of ordinary skill to be able to understand it.

5. Termination
--------------

5.1. The rights granted under this License will terminate automatically
if You fail to comply with any of its terms. However, if You become
compliant, then the rights granted under this License from a particular
Contributor are reinstated (a) provisionally, unless and until such
Contributor explicitly and finally terminates Your grants, and (b) on an
ongoing basis, if such Contributor fails to notify You of the
non-compliance by some reasonable means prior to 60 days after You have
come back into compliance. Moreover, Your grants from a particular
Contributor are reinstated on an ongoing basis if such Contributor
notifies You of the non-compliance by some reasonable means, this is the
first time You have received notice of non-compliance with this License
from such Contributor, and You become compliant prior to 30 days after
Your receipt of the notice.

5.2. If You initiate litigation against any entity by asserting a patent
infringement claim (excluding declaratory judgment actions,
counter-claims, and cross-claims) alleging that a Contributor Version
directly or indirectly infringes any patent, then the rights granted to
You by any and all Contributors for the Covered Software under Section
2.1 of this License shall terminate.

5.3. In the event of termination under Sections 5.1 or 5.2 above, all
end user license agreements (excluding distributors and resellers) which
have been validly granted by You or Your distributors under this License
prior to termination shall survive termination.

************************************************************************
*                                                                      *
*  6. Disclaimer of Warranty                                           *
*  -------------------------                                           *
*                                                                      *
*  Covered Software is provided under this License on an "as is"       *
*  basis, without warranty of any kind, either expressed, implied, or  *
*  statutory, including, without limitation, warranties that the       *
*  Covered Software is free of defects, merchantable, fit for a        *
*  particular purpose or non-infringing. The entire risk as to the     *
*  quality and performance of the Covered Software is with You.        *
*  Should any Covered Software prove defective in any respect, You     *
*  (not any Contributor) assume the cost of any necessary servicing,   *
*  repair, or correction. This disclaimer of warranty constitutes an   *
*  essential part of this License. No use of any Covered Software is   *
*  authorized under this License except under this disclaimer.         *
*                                                                      *
************************************************************************

************************************************************************
*                                                                      *
*  7. Limitation of Liability                                          *
*  --------------------------                                          *
*                                                                      *
*  Under no circumstances and under no legal theory, whether tort      *
*  (including negligence), contract, or otherwise, shall any           *
*  Contributor, or anyone who distributes Covered Software as          *
*  permitted above, be liable to You for any direct, indirect,         *
*  special, incidental, or consequential damages of any character      *
*  including, without limitation, damages for lost profits, loss of    *
*  goodwill, work stoppage, computer failure or malfunction, or any    *
*  and all other commercial damages or losses, even if such party      *
*  shall have been informed of the possibility of such damages. This   *
*  limitation of liability shall not apply to liability for death or   *
*  personal injury resulting from such party's negligence to the       *
*  extent applicable law prohibits such limitation. Some               *
*  jurisdictions do not allow the exclusion or limitation of           *
*  incidental or consequential damages, so this exclusion and          *
*  limitation may not apply to You.                                    *
*                                                                      *
************************************************************************

8. Litigation
-------------

Any litigation relating to this License may be brought only in the
courts of a jurisdiction where the defendant maintains its principal
place of business and such litigation shall be governed by laws of that
jurisdiction, without reference to its conflict-of-law provisions.
Nothing in this Section shall prevent a party's ability to bring
cross-claims or counter-claims.

9. Miscellaneous
----------------

This License represents the complete agreement concerning the subject
matter hereof. If any provision of this License is held to be
unenforceable, such provision shall be reformed only to the extent
necessary to make it enforceable. Any law or regulation which provides
that the language of a contract shall be construed against the drafter
shall not be used to construe this License against a Contributor.

10. Versions of the License
---------------------------

10.1. New Versions

Mozilla Foundation is the license steward. Except as provided in Section
10.3, no one other than the license steward has the right to modify or
publish new versions of this License. Each version will be given a
distinguishing version number.

10.2. Effect of New Versions

You may distribute the Covered Software under the terms of the version
of the License under which You originally received the Covered Software,
or under the terms of any subsequent version published by the license
steward.

10.3. Modified Versions

If you create software not governed by this License, and you want to
create a new license for such software, you may create and use a
modified version of this License if you rename the license and remove
any references to the name of the license steward (except to note that
such modified license differs from this License).

10.4. Distributing Source Code Form that is Incompatible With Secondary
Licenses

If You choose to distribute Source Code Form that is Incompatible With
Secondary Licenses under the terms of this version of the License, the
notice described in Exhibit B of this License must be attached.

Exhibit A - Source Code Form License Notice
-------------------------------------------

  This Source Code Form is subject to the terms of the Mozilla Public
  License, v. 2.0. If a copy of the MPL was not distributed with this
  file, You can obtain one at http://mozilla.org/MPL/2.0/.

If it is not possible or desirable to put the notice in a particular
file, then You may include the notice in a location (such as a LICENSE
file in a relevant directory) where a recipient would be likely to look
for such a notice.

You may add additional accurate notices of copyright ownership.

Exhibit B - "Incompatible With Secondary Licenses" Notice
---------------------------------------------------------

  This Source Code Form is "Incompatible With Secondary Licenses", as
  defined by the Mozilla Public License, v. 2.0.


================================================
FILE: LICENSE.spdx
================================================
SPDXVersion: SPDX-2.1
DataLicense: CC0-1.0
PackageName: Zero
PackageOriginator: Commit
PackageHomePage: https://github.com/commitdev/zero/
PackageLicenseDeclared: MPL-2.0

================================================
FILE: Makefile
================================================
VERSION = 0.0.1
BUILD ?=$(shell git rev-parse --short HEAD)
PKG ?=github.com/commitdev/zero
BUILD_ARGS=-v -trimpath -ldflags=all="-X ${PKG}/version.AppVersion=${VERSION} -X ${PKG}/version.AppBuild=${BUILD}"

deps:
	go mod download

check:
	go list -f '{{.Dir}}' ./... | grep -v /tmp/ | xargs go test -v

fmt:
	go fmt ./...

build-docker-local:
	docker build . -t zero:v0

build-example-docker: clean-example
	mkdir -p example
	docker run -v "$(shell pwd)/example:/project" --user $(shell id -u):$(shell id -g) zero:v0 create "hello-world"
	docker run -v "$(shell pwd)/example/hello-world:/project" --user $(shell id -u):$(shell id -g) zero:v0 generate -l go

build:
	go build ${BUILD_ARGS}

# Installs the CLI int your GOPATH
install-go:
	go build -o ${GOPATH}/bin/zero

# CI Commands used on CircleCI
ci-docker-build:
	docker build . -t commitdev/zero:${VERSION_TAG} -t commitdev/zero:latest

ci-docker-push:
	echo "${DOCKERHUB_PASS}" | docker login -u commitdev --password-stdin
	docker push commitdev/zero:${VERSION_TAG}


================================================
FILE: README.md
================================================
[![Tests](https://circleci.com/gh/commitdev/zero.svg?style=shield)](https://app.circleci.com/pipelines/github/commitdev/zero)
[![Go Report Card](https://goreportcard.com/badge/commitdev/zero)](https://goreportcard.com/report/commitdev/zero)
[![Slack](https://img.shields.io/badge/slack-join-brightgreen?logo=slack&style=social)](https://slack.getzero.dev)

<p align="center" width="100%">
    <img width="66%" src="https://raw.githubusercontent.com/commitdev/zero/main/doc-site/logo.png">
</p>

## What is Zero

Zero is an open source tool which makes it quick and easy for startup technical founders and developers to build everything they need to launch and grow high-quality SaaS applications faster and more cost-effectively.

Zero sets up everything you need so you can immediately start building your product.

Zero was created by [Commit](https://commit.dev).
## Why is Zero good for startups

As a technical founder or the first technical hire at a startup, your sole focus is to build the logic for your application and get it into customers’ hands as quickly and reliably as possible. Yet you immediately face multiple hurdles before even writing the first line of code. You’re forced to make many tech trade-offs, leading to decision fatigue. You waste countless hours building boilerplate SaaS features not adding direct value to your customers. You spend precious time picking up unfamiliar tech, make wrong choices that result in costly refactoring or rebuilding in the future, and are unaware of tools and best practices that would speed up your product iteration.

Zero was built by a team of engineers with many years of experience in building and scaling startups. We have faced all the problems you will and want to provide a way for new startups to avoid all those pitfalls. We also want to help you learn about the tech choices we made so your team can become proficient in some of the great tools we have included. The system you get starts small but allows you to scale well into the future when you need to.

Everything built by Zero is yours. After using Zero to generate your infrastructure, backend, and frontend, all the code is checked into your source control repositories and becomes the basis for your new system. We provide constant updates and new modules that you can pull in on an ongoing basis, but you can also feel free to customize as much as you like with no strings attached. If you do happen to make a change to core functionality and feel like contributing it back to the project, we'd love that too!

It's easy to get started, the only thing you'll need is an AWS account. Just enter your AWS CLI tokens or choose your existing profile during the setup process and everything is built for you automatically using infrastructure-as-code so you can see exactly what's happening and easily modify it if necessary.

[Read about the day-to-day experience of using a system set up using Zero](https://getzero.dev/docs/zero/about/real-world-usage)


## Why is Zero Reliable, Scalable, Performant, and Secure

Reliability: Your infrastructure will be set up in multiple availability zones making it highly available and fault tolerant. All production workloads will run with multiple instances by default, using AWS ELB and Nginx to load balance traffic. All infrastructure is represented with code using [HashiCorp Terraform][terraform] so your environments are reproducible, auditable, and easy to configure.

Scalability: Your services will be running in Kubernetes, with the EKS nodes running in an AWS [Auto Scaling Group][asg]. Both the application workloads and cluster size are ready to scale whenever the need arises. Your frontend assets will be stored in S3 and served from AWS' Cloudfront CDN which operates at global scale.

Security: Properly configured access-control to resources/security groups, using secret storage systems (AWS Secret Manager, Kubernetes secrets), and following best practices provides great security out of the box. Our practices are built on top of multiple security audits and penetration tests. Automatic certificate management using [Let's Encrypt][letsencrypt], database encryption, VPN support, and more means your traffic will always be encrypted. Built-in application features like user authentication help you bullet-proof your application by using existing, tested tools rather than reinventing the wheel when it comes to features like user management and auth.


## What do you get out of the box?
[Read about why we made these technology choices and where they are most applicable.](https://getzero.dev/docs/zero/about/technology-choices)

[Check out some resources for learning more about these technologies.](https://getzero.dev/docs/zero/reference/learning-resources)

### Infrastructure
- Fully configured infrastructure-as-code AWS environment including:
  - VPCs per environment (staging, production) with pre-configured subnets, security groups, etc.
  - EKS Kubernetes cluster per environment, pre-configured with helpful tools like cert-manager, external-dns, nginx-ingress-controller
  - RDS database for your application (Postgres or MySQL)
  - S3 buckets and Cloudfront distributions to serve your assets
- Logging and Metrics collected automatically using either Cloudwatch or Prometheus + Grafana, Elasticsearch + Kibana
- VPN using [Wireguard][wireguard] (Optional)
- User management and Identity / Access Proxy using Ory [Kratos][kratos] and [Oathkeeper][oathkeeper] (Optional)
- Tooling to make it easy to set up secure access for your dev team
- Local/Cloud Hybrid developer environment using Telepresence (Optional)

### Backend
- Golang or Node.js example project automatically set up, Dockerized, and deployed to your new Kubernetes cluster
- CI pipeline built with [CircleCI][circleci] or GitHub Actions. Just merge a PR and a deploy will start. Your code will be built and tested, deployed to staging, then prompt you to push to production
- File upload / download support using signed Cloudfront URLs (Optional)
- Email support using [SendGrid][sendgrid] or AWS SES (Optional)
- Notification support for sending and receiving messages in your application (web, mobile, SMS, Email, etc.) (Optional) (In Progress)
- User management integration with Kratos and Oathkeeper - No need to handle login, signup, authentication yourself (Optional)

### Frontend
- React example project automatically set up, deployed and served securely to your customers
- CI pipeline built with CircleCI or GitHub Actions. Just merge a PR and a deploy will start. Your code will be built and tested, deployed to staging, then prompt you to push to production
- File upload / download support using signed Cloudfront URLs (Optional)
- User management integration with Kratos - Just style the example login / signup flow to look the way you want (Optional)
- Static site example project using Gatsby to easily make a landing page, also set up with a CI Pipeline using CircleCI (Optional)

___

## Getting Started

[See the getting started guide at the Zero docs site.](https://getzero.dev/docs/zero/getting-started/installation)

### Building blocks of Zero

### Project Definition:
Each project is defined by this project definition file, this manifest contains your project details, and is the source of truth for the templating(`zero create`) and provision(`zero apply`) steps.

See [`zero-project.yml` reference](https://getzero.dev/docs/zero/reference/project-definition) for details.
### Module Definition
Module definition defines the information needed for the module to run (`zero apply`).
Also declares dependency used to determine the order of execution with other modules.

See [`zero-module.yml` reference](https://getzero.dev/docs/zero/reference/module-definition) for details.
___


## Zero Default Stack

[System Architecture Diagram](https://raw.githubusercontent.com/commitdev/zero-aws-eks-stack/main/docs/architecture-overview.svg)

The core zero modules currently available are:
| Project | URL |
|---|---|
| AWS Infrastructure | [https://github.com/commitdev/zero-aws-eks-stack](https://github.com/commitdev/zero-aws-eks-stack) |
| Backend (Go)  | [https://github.com/commitdev/zero-backend-go](https://github.com/commitdev/zero-backend-go) |
| Backend (Node.js)  | [https://github.com/commitdev/zero-backend-node](https://github.com/commitdev/zero-backend-node) |
| Frontend (React) | [https://github.com/commitdev/zero-frontend-react](https://github.com/commitdev/zero-frontend-react) |
| Static Site (Gatsby) | [https://github.com/commitdev/zero-static-site-gatsby](https://github.com/commitdev/zero-static-site-gatsby) |

___

## Contributing to Zero

Zero welcomes collaboration from the community; you can open new issues in our GitHub repo, Submit PRs' for bug fixes or browse through the tickets currently open to see what you can contribute too.

We use Zenhub to show us the entire project across all repositories, so if you are interested in seeing that or participating, you can can [check out our workspace](https://app.zenhub.com/workspaces/commit-zero-5da8decc7046a60001c6db44/board?repos=203630543,247773730,257676371,258369081,291818252,293942410,285931648,317656612)

### Building the tool

```shell
$ git clone git@github.com:commitdev/zero.git
$ cd zero && make build
```

### Running the tool locally

To install the CLI into your GOPATH and test it, run:

```shell
$ make install-go
$ zero --help
```

### Releasing a new version on GitHub and Brew

We are using a tool called `goreleaser` which you can get from brew if you're on MacOS:
`brew install goreleaser`

After you have the tool, you can follow these steps:
```
export GITHUB_TOKEN=<your token with access to write to the zero repo>
git tag -s -a <version number like v0.0.1> -m "Some message about this release"
git push origin <version number>
goreleaser release
```

This will create a new release in GitHub and automatically collect all the commits since the last release into a changelog.
It will also build binaries for various OSes and attach them to the release and push them to brew.
The configuration for goreleaser is in [.goreleaser.yml](.goreleaser.yml)


___
## FAQ

Why is my deployed application not yet accessible?

- It takes about 20 - 35 mins for your deployed application to be globally available through AWS CloudFront CDN.

<!-- links -->
[acw]:      https://aws.amazon.com/cloudwatch/
[vpc]:      https://aws.amazon.com/vpc/
[iam]:      https://aws.amazon.com/iam/
[asg]:      https://aws.amazon.com/autoscaling/
[zero binary]: https://github.com/commitdev/zero/releases/
[and more]: https://github.com/commitdev/zero-aws-eks-stack/blob/master/docs/resources.md
[terraform]: https://terraform.io
[letsencrypt]: https://letsencrypt.org/
[kratos]: https://www.ory.sh/kratos/
[oathkeeper]: https://www.ory.sh/oathkeeper/
[wireguard]: https://wireguard.com/
[circleci]: https://circleci.com/
[sendgrid]: https://sendgrid.com/
[launchdarkly]: https://launchdarkly.com/


================================================
FILE: cmd/apply.go
================================================
package cmd

import (
	"log"
	"os"

	"github.com/commitdev/zero/internal/apply"
	"github.com/commitdev/zero/internal/config/projectconfig"
	"github.com/commitdev/zero/internal/constants"
	"github.com/spf13/cobra"
)

var applyConfigPath string
var applyEnvironments []string

func init() {
	applyCmd.PersistentFlags().StringVarP(&applyConfigPath, "config", "c", constants.ZeroProjectYml, "config path")
	applyCmd.PersistentFlags().StringSliceVarP(&applyEnvironments, "env", "e", []string{}, "environments to set up (staging, production) - specify multiple times for multiple")

	rootCmd.AddCommand(applyCmd)
}

var applyCmd = &cobra.Command{
	Use:   "apply",
	Short: "Execute modules to create projects, infrastructure, etc.",
	Run: func(cmd *cobra.Command, args []string) {
		rootDir, err := os.Getwd()
		if err != nil {
			log.Println(err)
			rootDir = projectconfig.RootDir
		}
		applyErr := apply.Apply(rootDir, applyConfigPath, applyEnvironments)
		if applyErr != nil {
			log.Fatal(applyErr)
		}
	},
}


================================================
FILE: cmd/check.go
================================================
package cmd

import (
	"fmt"
	"os"
	"os/exec"
	"regexp"
	"strings"
	"text/tabwriter"

	"github.com/coreos/go-semver/semver"
	"github.com/spf13/cobra"
)

func init() {
	rootCmd.AddCommand(checkCmd)
}

type requirement struct {
	name       string
	command    string
	args       []string
	minVersion string
	regexStr   string
	docsURL    string
}

type versionError struct {
	errorText string
}

type commandError struct {
	Command    string
	ErrorText  string
	Suggestion string
}

func (e *versionError) Error() string {
	return fmt.Sprintf("%s", e.errorText)
}

func (e *commandError) Error() string {
	return fmt.Sprintf("%s", e.ErrorText)
}

func printErrors(errors []commandError) {
	// initialize tabwriter
	w := new(tabwriter.Writer)

	// minwidth, tabwidth, padding, padchar, flags
	w.Init(os.Stdout, 10, 12, 2, ' ', 0)

	defer w.Flush()

	fmt.Fprintf(w, "\n %s\t%s\t%s\t", "Command", "Error", "Info")
	fmt.Fprintf(w, "\n %s\t%s\t%s\t", "---------", "---------", "---------")

	for _, e := range errors {
		fmt.Fprintf(w, "\n%s\t%s\t%s\t", e.Command, e.ErrorText, e.Suggestion)
	}
}

// getSemver uses the regular expression from the requirement to parse the
// output of a command and extract the version from it. Returns the version
// or an error if the version string could not be parsed.
func getSemver(req requirement, out []byte) (*semver.Version, error) {
	re := regexp.MustCompile(req.regexStr)
	v := re.FindStringSubmatch(string(out))
	if len(v) < 4 {
		return nil, &commandError{
			req.command,
			"Could not find version number in output",
			fmt.Sprintf("Try running %s %s locally and checking it works.", req.command, strings.Join(req.args, " ")),
		}
	}

	// Default patch version number to 0 if it doesn't exist
	if v[3] == "" {
		v[3] = "0"
	}

	versionString := fmt.Sprintf("%s.%s.%s", v[1], v[2], v[3])
	version, err := semver.NewVersion(versionString)
	if err != nil {
		return version, err
	}
	return version, nil
}

// checkSemver validates that the version of a tool meets the minimum required
// version listed in your requirement. Returns a boolean.
// For more information on parsing semver, see semver.org
// If your tool doesn't do full semver then you may need to add custom logic
// to support it.
func checkSemver(req requirement, actualVersion *semver.Version) bool {
	requiredVersion := semver.New(req.minVersion)
	return actualVersion.LessThan(*requiredVersion)
}

var checkCmd = &cobra.Command{
	Use:   "check",
	Short: "Check Zero requirements",
	Run: func(cmd *cobra.Command, args []string) {
		// Add any new requirements to this slice.
		required := []requirement{
			{
				name:       "AWS CLI\t\t",
				command:    "aws",
				args:       []string{"--version"},
				regexStr:   `aws-cli\/(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)`,
				minVersion: "1.16.0",
				docsURL:    "https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html",
			},
			{
				name:       "Kubectl\t\t",
				command:    "kubectl",
				args:       []string{"version", "--client=true", "--short"},
				regexStr:   `Client Version: v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)`,
				minVersion: "1.15.2",
				docsURL:    "https://kubernetes.io/docs/tasks/tools/install-kubectl/",
			},
			{
				name:       "Docker\t\t",
				command:    "docker",
				args:       []string{"--version"},
				regexStr:   `Docker version (0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*), build ([a-f0-9]{7})`,
				minVersion: "18.0.0",
				docsURL:    "https://docs.docker.com/get-docker/",
			},
			{
				name:       "Terraform\t",
				command:    "terraform",
				args:       []string{"version"},
				regexStr:   `Terraform v(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)`,
				minVersion: "0.13.0",
				docsURL:    "https://www.terraform.io/downloads.html",
			},
			{
				name:       "jq\t\t",
				command:    "jq",
				args:       []string{"--version"},
				regexStr:   `jq-(0|[1-9]\d*)\.(0|[1-9]\d*)\-?(0|[1-9]\d*)?`,
				minVersion: "1.5.0",
				docsURL:    "https://stedolan.github.io/jq/download/",
			},
			{
				name:       "Git\t\t",
				command:    "git",
				args:       []string{"version"},
				regexStr:   `^git version (0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)`,
				minVersion: "2.17.1",
				docsURL:    "https://git-scm.com/book/en/v2/Getting-Started-Installing-Git",
			},
			{
				name:       "Wget\t\t",
				command:    "wget",
				args:       []string{"--version"},
				regexStr:   `^GNU Wget (0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)`,
				minVersion: "1.14.0",
				docsURL:    "https://www.gnu.org/software/wget/",
			},
		}

		// Store and errors from the commands we run.
		errors := []commandError{}

		fmt.Println("Checking Zero Requirements...")
		for _, r := range required {
			fmt.Printf("%s", r.name)
			// In future we could parse the stderr and stdout separately, but for now it's nice to see
			// the full output on a failure.
			out, err := exec.Command(r.command, r.args...).CombinedOutput()
			if err != nil {
				cerr := commandError{
					fmt.Sprintf("%s %s", r.command, strings.Join(r.args, " ")),
					err.Error(),
					r.docsURL,
				}
				errors = append(errors, cerr)
				fmt.Printf("\033[0;31mFAIL\033[0m\t\t%s\n", "-")
				continue
			}
			version, err := getSemver(r, out)
			if err != nil {
				cerr := commandError{
					r.command,
					err.Error(),
					r.docsURL,
				}
				errors = append(errors, cerr)
				fmt.Printf("\033[0;31mFAIL\033[0m\t\t%s\n", version)
				continue
			}
			if checkSemver(r, version) {
				cerr := commandError{
					r.command,
					fmt.Sprintf("Version does not meet required. Want: %s; Got: %s", r.minVersion, version),
					r.docsURL,
				}
				errors = append(errors, cerr)
				fmt.Printf("\033[0;31mFAIL\033[0m\t\t%s\n", version)
			} else {
				fmt.Printf("\033[0;32mPASS\033[0m\t\t%s\n", version)
			}
		}

		if len(errors) > 0 {
			printErrors(errors)
			os.Exit(1)
		}

		fmt.Println()
	},
}


================================================
FILE: cmd/create.go
================================================
package cmd

import (
	"fmt"
	"path"
	"strings"

	"github.com/commitdev/zero/internal/config/projectconfig"
	"github.com/commitdev/zero/internal/constants"
	"github.com/commitdev/zero/internal/generate"
	"github.com/commitdev/zero/internal/vcs"
	"github.com/commitdev/zero/pkg/util/exit"
	"github.com/commitdev/zero/pkg/util/flog"
	"github.com/spf13/cobra"
)

var (
	createConfigPath string
	overwriteFiles   bool
)

func init() {
	createCmd.PersistentFlags().StringVarP(&createConfigPath, "config", "c", constants.ZeroProjectYml, "The project.yml file to load. The default is the one in the current directory.")
	createCmd.PersistentFlags().BoolVarP(&overwriteFiles, "overwrite", "o", false, "overwrite pre-existing files")

	rootCmd.AddCommand(createCmd)
}

var createCmd = &cobra.Command{
	Use:   "create",
	Short: fmt.Sprintf("Create projects for modules and configuration specified in %s", constants.ZeroProjectYml),
	Run: func(cmd *cobra.Command, args []string) {
		Create(projectconfig.RootDir, createConfigPath)
	},
}

func Create(dir string, createConfigPath string) {
	if strings.Trim(createConfigPath, " ") == "" {
		exit.Fatal("config path cannot be empty!")
	}
	configFilePath := path.Join(dir, createConfigPath)
	projectConfig := projectconfig.LoadConfig(configFilePath)

	generate.Generate(*projectConfig, overwriteFiles)

	if projectConfig.ShouldPushRepositories {
		flog.Infof(":up_arrow: Done Rendering - committing repositories to version control.")

		for _, module := range projectConfig.Modules {
			err, githubApiKey := projectconfig.ReadVendorCredentialsFromModule(module, "github")
			if err != nil {
				flog.Errorf(err.Error())
			}
			vcs.InitializeRepository(module.Files.Repository, githubApiKey)
		}
	} else {
		flog.Infof(":up_arrow: Done Rendering - you will need to commit the created projects to version control.")
	}

	flog.Infof(":check_mark_button: Done - run zero apply to create any required infrastructure or execute any other remote commands to prepare your environments.")
}


================================================
FILE: cmd/init.go
================================================
package cmd

import (
	"fmt"

	"github.com/commitdev/zero/internal/config/projectconfig"
	initPrompts "github.com/commitdev/zero/internal/init"
	"github.com/commitdev/zero/pkg/util/exit"
	"github.com/commitdev/zero/pkg/util/flog"
	"github.com/spf13/cobra"
)

var localModulePath string
var registryFilePath string

func init() {
	initCmd.PersistentFlags().StringVarP(&localModulePath, "local-module-path", "m", "github.com/commitdev", "local module path - for using local modules instead of downloading from github")
	initCmd.PersistentFlags().StringVarP(&registryFilePath, "registry-file-path", "r", "https://raw.githubusercontent.com/commitdev/zero/main/registry.yaml", "registry file path - for using a custom list of stacks")
	rootCmd.AddCommand(initCmd)
}

var initCmd = &cobra.Command{
	Use:   "init",
	Short: "Create new project with provided name and initialize configuration based on user input.",
	Run: func(cmd *cobra.Command, args []string) {
		flog.Debugf("Root directory is %s", projectconfig.RootDir)
		projectContext := initPrompts.Init(projectconfig.RootDir, localModulePath, registryFilePath)
		projectConfigErr := projectconfig.CreateProjectConfigFile(projectconfig.RootDir, projectContext.Name, projectContext)

		if projectConfigErr != nil {
			exit.Fatal(fmt.Sprintf(" Init failed while creating the zero project config file %s", projectConfigErr.Error()))
		} else {
			flog.Infof(`:tada: Done - Your project definition file has been initialized with your choices. Please review it, make any required changes and then create your project.
cd %s
cat zero-project.yml
zero create`, projectContext.Name)
		}
	},
}


================================================
FILE: cmd/version.go
================================================
package cmd

import (
	"fmt"

	"github.com/commitdev/zero/version"
	"github.com/spf13/cobra"
)

func init() {
	rootCmd.AddCommand(versionCmd)
}

var versionCmd = &cobra.Command{
	Use:   "version",
	Short: "Print the version number of zero",
	Run: func(cmd *cobra.Command, args []string) {
		fmt.Printf("version: %v\n", version.AppVersion)
		fmt.Printf("build: %v\n", version.AppBuild)
	},
}


================================================
FILE: cmd/zero.go
================================================
package cmd

import (
	"os"

	"github.com/spf13/cobra"
)

var rootCmd = &cobra.Command{
	Use:   "zero",
	Short: "zero gets you to writing code quicker.",
	Long:  "Zero is an open-source CLI tool which makes it quick and easy for technical founders & developers \nto build high-quality, reliable infrastructure to launch, grow, and scale production-ready SaaS applications faster and more cost-effectively.\n https://getzero.dev\n",
	Run: func(cmd *cobra.Command, args []string) {
	},
}

func Execute() {
	if len(os.Args) > 1 {
		if err := rootCmd.Execute(); err != nil {
			os.Exit(1)
		}
	} else { // If no arguments were provided, print the usage message.
		rootCmd.Help()
	}
}


================================================
FILE: doc-site/.gitignore
================================================
# Dependencies
/node_modules

# Production
/build

# Generated files
.docusaurus
.cache-loader

# Misc
.DS_Store
.env.local
.env.development.local
.env.test.local
.env.production.local

npm-debug.log*
yarn-debug.log*
yarn-error.log*

# to test theme color for elements locally
docs/about/color-test.md*


================================================
FILE: doc-site/README.md
================================================
# Website

This website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator.

## Installation

```console
yarn install
```

## Local Development

```console
yarn start
```

This command starts a local development server and opens up a browser window. Most changes are reflected live without having to restart the server.

## Build

```console
yarn build
```

This command generates static content into the `build` directory and can be served using any static contents hosting service.

## Deployment

```console
GIT_USER=<Your GitHub username> USE_SSH=true yarn deploy
```

If you are using GitHub pages for hosting, this command is a convenient way to build the website and push to the `gh-pages` branch.


================================================
FILE: doc-site/babel.config.js
================================================
module.exports = {
  presets: [require.resolve('@docusaurus/core/lib/babel/preset')],
};


================================================
FILE: doc-site/docs/about/opensource.md
================================================
---
title: Opensource
sidebar_label: Opensource
sidebar_position: 2
---


## Contributing to Zero

Zero welcomes collaboration from the community; you can open new issues in our GitHub repo, Submit PRs' for bug fixes or browse through the tickets currently open to see what you can contribute too.

We use Zenhub to show us the entire project across all repositories, so if you are interested in seeing that or participating, you can can [check out our workspace](https://app.zenhub.com/workspaces/commit-zero-5da8decc7046a60001c6db44/board?repos=203630543,247773730,257676371,258369081,291818252,293942410,285931648,317656612)

================================================
FILE: doc-site/docs/about/overview.md
================================================
---
title: Overview
sidebar_label: Overview
sidebar_position: 1
---


## What is Zero

Zero is an open source tool which makes it quick and easy for startup technical founders and developers to build everything they need to launch and grow high-quality SaaS applications faster and more cost-effectively.

Zero sets up everything you need so you can immediately start building your product.

Zero was created by [Commit](https://commit.dev).
## Why is Zero good for startups

As a technical founder or the first technical hire at a startup, your sole focus is to build the logic for your application and get it into customers’ hands as quickly and reliably as possible. Yet you immediately face multiple hurdles before even writing the first line of code. You’re forced to make many tech trade-offs, leading to decision fatigue. You waste countless hours building boilerplate SaaS features not adding direct value to your customers. You spend precious time picking up unfamiliar tech, make wrong choices that result in costly refactoring or rebuilding in the future, and are unaware of tools and best practices that would speed up your product iteration.

Zero was built by a team of engineers with many years of experience in building and scaling startups. We have faced all the problems you will and want to provide a way for new startups to avoid all those pitfalls. We also want to help you learn about the tech choices we made so your team can become proficient in some of the great tools we have included. The system you get starts small but allows you to scale well into the future when you need to.

Everything built by Zero is yours. After using Zero to generate your infrastructure, backend, and frontend, all the code is checked into your source control repositories and becomes the basis for your new system. We provide constant updates and new modules that you can pull in on an ongoing basis, but you can also feel free to customize as much as you like with no strings attached. If you do happen to make a change to core functionality and feel like contributing it back to the project, we'd love that too!

It's easy to get started, the only thing you'll need is an AWS account. Just enter your AWS CLI tokens or choose your existing profile during the setup process and everything is built for you automatically using infrastructure-as-code so you can see exactly what's happening and easily modify it if necessary.

[Read about the day-to-day experience of using a system set up using Zero][real-world-usage]


## Why is Zero Reliable, Scalable, Performant, and Secure

Reliability: Your infrastructure will be set up in multiple availability zones making it highly available and fault tolerant. All production workloads will run with multiple instances by default, using AWS ELB and Nginx to load balance traffic. All infrastructure is represented with code using [HashiCorp Terraform][terraform] so your environments are reproducible, auditable, and easy to configure.

Scalability: Your services will be running in Kubernetes, with the EKS nodes running in an AWS [Auto Scaling Group][asg]. Both the application workloads and cluster size are ready to scale whenever the need arises. Your frontend assets will be stored in S3 and served from AWS' Cloudfront CDN which operates at global scale.

Security: Properly configured access-control to resources/security groups, using secret storage systems (AWS Secret Manager, Kubernetes secrets), and following best practices provides great security out of the box. Our practices are built on top of multiple security audits and penetration tests. Automatic certificate management using [Let's Encrypt][letsencrypt], database encryption, VPN support, and more means your traffic will always be encrypted. Built-in application features like user authentication help you bullet-proof your application by using existing, tested tools rather than reinventing the wheel when it comes to features like user management and auth.


## What do you get out of the box?
[Read about why we made these technology choices and where they are most applicable.][technology-choices]

[Check out some resources for learning more about these technologies.][learning-resources]

### [Infrastructure][docs-infra]
- Fully configured infrastructure-as-code AWS environment including:
  - VPCs per environment (staging, production) with pre-configured subnets, security groups, etc.
  - EKS Kubernetes cluster per environment, pre-configured with helpful tools like cert-manager, external-dns, nginx-ingress-controller
  - RDS database for your application (Postgres or MySQL)
  - S3 buckets and Cloudfront distributions to serve your assets
- Logging and Metrics collected automatically using either Cloudwatch or Prometheus + Grafana, Elasticsearch + Kibana
- VPN using [Wireguard][wireguard] (Optional)
- User management and Identity / Access Proxy using Ory [Kratos][kratos] and [Oathkeeper][oathkeeper] (Optional)
- Tooling to make it easy to set up secure access for your dev team
- Local/Cloud Hybrid developer environment using Telepresence (Optional)

### [Backend][docs-backend-go] ([Go][docs-backend-go] / [Node.js][docs-backend-nodejs])
- Golang or Node.js example project automatically set up, Dockerized, and deployed to your new Kubernetes cluster
- CI pipeline built with [CircleCI][circleci] or GitHub Actions. Just merge a PR and a deploy will start. Your code will be built and tested, deployed to staging, then prompt you to push to production
- File upload / download support using signed Cloudfront URLs (Optional)
- Email support using [SendGrid][sendgrid] or AWS SES (Optional)
- Notification support for sending and receiving messages in your application (web, mobile, SMS, Email, etc.) (Optional) (In Progress)
- User management integration with Kratos and Oathkeeper - No need to handle login, signup, authentication yourself (Optional)

### [Frontend][docs-frontend-react]
- React example project automatically set up, deployed and served securely to your customers
- CI pipeline built with CircleCI or GitHub Actions. Just merge a PR and a deploy will start. Your code will be built and tested, deployed to staging, then prompt you to push to production
- File upload / download support using signed Cloudfront URLs (Optional)
- User management integration with Kratos - Just style the example login / signup flow to look the way you want (Optional)
- Static site example project using Gatsby to easily make a landing page, also set up with a CI Pipeline using CircleCI (Optional)

<!-- internal links -->
[real-world-usage]: ./real-world-usage
[technology-choices]: ./technology-choices
[learning-resources]: ../reference/learning-resources
[docs-infra]: https://getzero.dev/docs/modules/aws-eks-stack/
[docs-backend-go]: https://getzero.dev/docs/modules/backend-go/
[docs-backend-nodejs]: https://getzero.dev/docs/modules/backend-nodejs/
[docs-frontend-react]: https://getzero.dev/docs/modules/frontend-react/
<!-- links -->


[git]:      https://git-scm.com
[kubectl]:  https://kubernetes.io/docs/tasks/tools/install-kubectl/
[terraform]:https://www.terraform.io/downloads.html
[jq]:       https://github.com/stedolan/jq
[AWS CLI]:  https://aws.amazon.com/cli/
[acw]:      https://aws.amazon.com/cloudwatch/
[vpc]:      https://aws.amazon.com/vpc/
[iam]:      https://aws.amazon.com/iam/
[asg]:      https://aws.amazon.com/autoscaling/
[zero binary]: https://github.com/commitdev/zero/releases/
[Wget]: https://stackoverflow.com/questions/33886917/how-to-install-wget-in-macos
[and more]: https://github.com/commitdev/zero-aws-eks-stack/blob/master/docs/resources.md
[terraform]: https://terraform.io
[letsencrypt]: https://letsencrypt.org/
[kratos]: https://www.ory.sh/kratos/
[oathkeeper]: https://www.ory.sh/oathkeeper/
[wireguard]: https://wireguard.com/
[circleci]: https://circleci.com/
[sendgrid]: https://sendgrid.com/
[launchdarkly]: https://launchdarkly.com/


================================================
FILE: doc-site/docs/about/real-world-usage.md
================================================
---
title: Real-world Usage Scenarios
sidebar_label: Real-world Usage
sidebar_position: 4
---

## Developing and deploying application changes
1. Clone your git repository.
2. Make a branch, start working on your code.
3. If using the Telepresence dev experience, run the `start-dev-env.sh` script to allow you to use the hybrid cloud environment as you work, to run and test your code in a realistic environment.
3. Commit your finished code, make a PR, have it reviewed. Lightweight tests will run against your branch and prevent merging if they fail.
4. Merge your branch to the main branch. A build will start automatically.
5. The pipeline will build an artifact, run tests, deploy your change to staging, then wait for your input to deploy to production.

## Debugging a problem on production
1. Check the logs of your service:
    - If using cloudwatch, log into the AWS console and go to the [Logs Insights tool](https://us-west-2.console.aws.amazon.com/cloudwatch/home#logsV2:logs-insights). Choose the log group for your production environment ending in `/application` and hit the "Run query" button.
    - If using kibana, make sure you are on the VPN and open the Kibana URL in your browser. Click the "Discover" tab and try searching for logs based on the name of your service.
    - Alternatively, watch the logs in realtime via the CLI using the command `kubectl logs -f -l app=<your service name>` or `stern <your service name>`
2. Check the state of your application pods. Look for strange events or errors from the pods:
```shell
$ kubectl get pods
$ kubectl get events
$ kubectl describe pods
```
3. Exec into your application pod. From here you can check connectivity with `ping` or `nc`, or inspect anything else application-specific.
```shell
$ kubectl get pods
NAME                             READY   STATUS    RESTARTS   AGE
your-service-6c5f6b56b7-2w447    1/1     Running   0          30m49s
$ kubectl exec -it your-service-6c5f6b56b7-2w447 sh
```


## Adding support for a new subdomain or site
1. Check the currently configured ingresses in your cluster:
```shell
$ kubectl get ingress -A
NAMESPACE      NAME               CLASS    HOSTS                   ADDRESS                                                                   PORTS     AGE
your-service   your-service       <none>   api.your-service.dev         abcd1234-1234.us-west-2.elb.amazonaws.com   80, 443   130d
```
2. If this is for a new service entirely, make sure there is an ingress defined in the `kubernetes/` directory of your repo. If you want to add a new domain pointing to an existing service, just go into the file `kubernetes/overlays/<environment>/ingress.yml` and add a section to `spec:` and `tls:`, specifying your new domain.
    - `spec` is where you can define the hostname, any special path rules, and which service you want traffic to be sent to
    - if your hostname is in the `tls` section, a TLS certificate will automatically be provisioned for it using Let's Encrypt
3. A number of things will happen once this is deployed to the cluster:
    - Routing rules will be created to let traffic in to the cluster and send it to the service based on the hostname and path
    - An AWS load balancer will be created if one doesn't already exist and it will be pointed to the cluster
    - In the case of a subdomain, a DNS record will be automatically created for you
    - A certificate will be provisioned using Let's Encrypt for the domain you specified


================================================
FILE: doc-site/docs/about/roadmap.md
================================================
---
title: Roadmap
sidebar_label: Roadmap
sidebar_position: 5
---

:::info
Coming soon
:::


================================================
FILE: doc-site/docs/about/technology-choices.md
================================================
---
title: Technology Choices
sidebar_label: Technology Choices
sidebar_position: 4
---

As we add features to Zero, we rely heavily on our years of experience with founding and growing startups, and judge tools and technologies based on the axes of:
- Quality - Is it the best tool for the job? Will it allow a project to start small and scale big?
- Simplicity - Is it easy to set up automatically and in a way that is easy to understand and maintain for the developers and operators of the project?
- Price - Ideally we look for open source tools, but there are some tools we integrate with that have a cost if we see it as providing enough value to justify that cost. In this case we will often try to also include an open source alternative.

When there are multiple technologies that we consider to be front-runners, we try to add multiple options, along with documentation and use cases to describe in which situations each tool might be the right choice for a project.

### Infrastructure
#### **Cloud Provider**

[AWS](https://aws.amazon.com)

AWS has been around much longer than the other large cloud providers, and while GCP or Azure may have some additional niceties in terms of developer experience, ML functionality, etc., most of the features and functionality are pretty common across all platforms. AWS is fairly low-cost, has many features, good API and CLI support, easy to set up, and with full support for infrastructure-as-code using Terraform. It can also be quite easy for startups to get credits to offset some of their initial costs.

GCP and Azure support are planned but not implemented.

#### **Orchestration**

[Kubernetes](https://kubernetes.io)

Initially developed by Google as a scaled-down, open source version of the Borg system that runs all their applications. It has become the de facto choice for container orchestration due to its huge community adoption, flexibility of deployment, and giant feature set. Between its native functionality, and various tools that we include by default, it's an incredibly powerful platform for easily deploying secure, stable, highly-available applications. It also has first-class support for managed clusters in all the major cloud providers.

We have used Kubernetes at startups in the past and have found it to be an incredible tool to allow you to start small, but scale up a huge amount. It offers a lot of native functionality that enables great developer flows, zero-downtime deploys, auto scaling, high availability, easy visibility, and more.

Compared to something like EC2, there are lots of benefits to deploying containers as immutable artifacts, good integration with load balancers, fast deploys, etc.

Compared to serverless, it is much easier to control, monitor, and have visibility, in addition to having much more flexibility, while giving you quite a similar experience in many ways.

#### **Database**

[RDS MySQL](https://aws.amazon.com/rds/mysql/) / [RDS Postgresql](https://aws.amazon.com/rds/postgresql/)

RDS MySQL and Postgres give you all the benefits of these RDBMS tools without the burden of managing them yourself. Either one of these database technologies are great for most startups, and allow you to scale quite large, depending on your schema design and data set.

For large or complex data you can also potentially move to [RDS Aurora](https://aws.amazon.com/rds/aurora/) which has additional functionality which allows you to scale further.

#### **Logging**

[Elasticsearch + Kibana](https://aws.amazon.com/elasticsearch-service/)

AWS Managed Elasticsearch with Kibana is a great tool for centralized logging from your system. We use a tool called [Fluentd](https://www.fluentd.org/) to collect all the logs from your system and send them to Elasticsearch. Then Kibana is used to run queries against that data, set up alerts, create dashboards, etc.

This is a great choice if you want more flexibility and more advanced features. It adds some complexity due to requiring an Elasticsearch cluster, but AWS' managed ES offering allows you to offload a lot of work that would typically be required.

_- OR -_

[Cloudwatch](https://aws.amazon.com/cloudwatch/)

Potentially a cheaper and lighter-weight option, Cloudwatch is an AWS tool that supports many (but not all) of the features of Kibana.

This is a good choice if you don't have too many requirements about logging yet.

#### **Monitoring**

[Prometheus](https://prometheus.io/) + [Grafana](https://grafana.com/)

Prometheus and Grafana run in the Kubernetes cluster. Prometheus provides metrics collection from your applications and Grafana provides graphing, dashboards, alerting, etc. on that data. It can also pull in data from many other sources.

This is a great choice if you want more flexibility and more advanced features. It adds some complexity due to requiring these tools to run in your cluster but does add a significant amount of features over Cloudwatch.

_- OR -_

[Cloudwatch](https://aws.amazon.com/cloudwatch/)

Potentially a lighter-weight option, Cloudwatch is an AWS tool that supports many (but not all) of the features of Grafana.

This is a good choice if you don't have too many requirements about monitoring yet.

#### **Access**
[VPN (Wireguard)](https://www.wireguard.com/)

It is a good policy to keep as much of your infrastructure as possible private, exposing only what is necessary to the public internet. When we set up the Kubernetes cluster and other resources, they are all on private VPC Subnets so they can reach each other but are not otherwise reachable. When dealing with Kubernetes there is already great tooling for being able to access your application (via [`kubectl exec`](https://kubernetes.io/docs/tasks/debug-application-cluster/get-shell-running-container/)) but you may find cases where you want to access other resources as if you were on the private network yourself.

To this end we are using Wireguard for VPN to allow your personal computer to act as if it were on the private network, having access to the things running inside your Kubernetes cluster, and within AWS.

Wireguard is a great secure, light-weight tool that runs well on Kubernetes, so it doesn't require us to set up any other infrastructure. You may be able to get by without it if you are comfortable with the Kubernetes tooling, but it would be very useful if you are using something like Kibana above, so you can access it directly through your web browser.

### Application

#### **User Management**
[Ory Kratos](https://github.com/ory/kratos)

Kratos is an open-source identity and user management tool. It can take the place of something like Auth0, or the user management that many startups end up writing themselves. By delegating this work to Kratos, you can save time and effort that you would otherwise have to put in to build a stable, secure user management system.

If you are building a system that will require authenticated users, it may make sense to use Kratos with Oathkeeper (below) to save a lot of effort that may otherwise be spent building user management and auth features that have been built a million times before.

#### **Authentication / Authorization**
[Ory Oathkeeper](https://github.com/ory/oathkeeper)

Oathkeeper is an open-source Identity & Access Proxy that can securely act as a gateway to your system, preventing unauthorized access. It uses Oauth & JWT to log a user in and maintain a session, and proxies traffic to your services for users with valid sessions.

This allows you to save time and effort by not having to write auth and session management code. If a specific header exists, the specified user is logged in. That's it.

#### **Dev Experience**
[Telepresence](https://www.telepresence.io/)

Telepresence is a great tool for creating a fast and effective "hybrid cloud/local" developer experience using Kubernetes. You can have your services, databases, and other dependencies running in the cloud, and then run the service you are working on locally, and have it override the one running in the cloud. In this way you can use all the same IDEs, debuggers, and local tools you usually do, but have your code running in a realistic environment much more like staging or production, complete with all the dependencies that can make local dev a pain.

It's a great tool even when starting a project to quickly and easily test things in a realistic environment but can also really shine if you are working in a system that has many dependencies (multiple state stores, microservices, etc.)

### Backend
While we offer ways to bootstrap your backend application in various languages, you can also choose to use whichever language you like and just make use of the infrastructure we set up, or use your custom backend with a bootstrapped frontend.

The backend application will have a build and deploy pipeline that will build a docker image and push it to AWS' ECR image repository. The image will be used to deploy containers in the Kubernetes cluster.

**Language**

Whichever language you choose will be automatically set up, Dockerized, and deployed into the Kubernetes cluster.

[Golang](https://golang.org/)

Go is a great language for backend application development, especially in a microservices environment. It is a typed, compiled language with powerful support for parallel processing, and can create small, self-contained binaries for any operating system. It has a huge community, and is used by some very significant open source projects such as Kubernetes, and the HashiCorp tools.

Being a compiled language may slightly raise the barrier to entry for newer developers. Lack of generic types and traditional object-oriented features, and preference for code generation may deter more experienced but unfamiliar developers.

_- OR -_

[Node.js](https://nodejs.org/en/)

Node.js is an extremely popular language for backend development. It has a huge community and tons of libraries available, since it is based on JavaScript. It can also be beneficial to use JavaScript for both the backend and frontend, in case developers are not familiar with other backend languages.

Being a [single-threaded](https://nodejs.org/en/docs/guides/event-loop-timers-and-nexttick/), interpreted language, Node may not be ideal for high-performance applications.


### Frontend
While we offer ways to bootstrap your frontend application in various languages, you can also choose to use whichever language you like and just make use of the infrastructure we set up, or use your custom frontend with a bootstrapped backend.

The frontend application will have a build and deploy pipeline that will build an artifact that will be uploaded to S3, and then hosted through AWS' Cloudfront CDN. This allows your application to be stable and fast from all over the world.

**Language**

[React.js](https://reactjs.org/)

One of the most popular modern libraries for building dynamic frontend applications. React is hugely popular, powerful, and is an obvious choice for most frontends.


### CI

We advocate for (and configure by default) build pipelines for deploying your application. As opposed to deploying manually via the command line which may work fine for a single developer, when you are working on a team there are huge benefits to making GitHub your source of truth, and relying on your version control system to trigger builds and deployments. Our preferred pipeline looks something like this:
```
merge to main branch -> build artifacts -> run tests -> deploy to staging -> ask for user input -> deploy to production
```
But you can also configure it to fit your desired workflow.

[CircleCI](https://circleci.com/)

CircleCI is a powerful tool for creating CI/CD pipelines. They have a free tier which is fully featured, with paid plans that add more concurrency and speed for builds. It requires a bit more setup at the beginning, as you need to create an account with them, but it does have some additional features compared to GitHub Actions.

_- OR -_

[GitHub Actions](https://github.com/features/actions)

GitHub Actions is newer than CircleCI, so it's features are a bit more limited, but the fact that it is integrated with GitHub makes it much easier to get started with. Also similar, it has a free tier with paid versions that add more concurrency. GHA would be useful for projects that don't require a lot of advanced features, visualization, etc.

### Fundamentals
**[Twelve-Factor App](https://12factor.net/)**

The Twelve-Factor App is a methodology for building Software-as-a-Service that encourages building applications in a way that inherently makes them more stable, secure, failure-safe, easier to measure, and easier to reason about. As much as possible we try to stick with these principles when building Zero, as we have seen it to be a very effective way to build scalable, manageable applications.

**[CNCF](https://www.cncf.io/)**

The Cloud Native Computing Foundation hosts and promotes a bunch of great open source software, including Kubernetes, Prometheus, Helm, Fluentd, and Envoy. Their principles and the design of many of the CNCF projects really resonate with the team behind Zero, and we try to make use of CNCF-backed tools whenever possible.


================================================
FILE: doc-site/docs/concepts/core-concepts.md
================================================
---
title: Core Concepts
sidebar_label: Core Concepts
sidebar_position: 1
---

## Project
A project defines a set of **modules** to use, along with a full set of config parameters for each module which were entered by the user during the `zero init` step. These config options are stored in `zero-project.yml`.

The project manifest (`zero-project.yml`) is the source of truth for the commands `create` and `apply`. It determines from where to fetch the modules, the execution order of modules, whether it will push your project to version control, module configuration, and other project information. Both staging and production environments are provisioned using the same manifest to ensure the environments are reproducible and controlled.

## Module
A module is a useful bundle of code and/or resources that can be templated out during the `create` step, then executes a provisioning flow. This could be templating out terraform infrastructure as code then provisioning the resources, or creating a backend application, making API calls to set up a build pipeline, and then deploying it.

A module is defined by the **module manifest** (`zero-module.yml`) in its root folder. It contains all the parameters required to render the templated files (during `zero create`) and execute any provisioning steps, and declares it's requirements and the commands to execute during provisioning (`zero apply`).

Modules can declare their dependencies, for example a backend that will be deployed can declare its dependency on the infrastructure repository so that the infrastructure will already exist by the time we want to deploy to it.


================================================
FILE: doc-site/docs/concepts/project-life-cycle.md
================================================
---
title: Project Life Cycle
sidebar_label: Project Life Cycle
sidebar_position: 2
---

## zero init
The goal of the `init` step is to create the project manifest (`zero-project.yml`).

`zero init` will fetch each **module** defined in `zero-project.yml` from their remote repository, and prompt the user through a series of questions to fill in parameters required by each module. In this phase, the module definition will be parsed and provide defaults, options, and extra context to guide users through filling in their project details.

:::note
It's recommended to review the `zero-project.yml` and make adjustments as needed before running `zero create` and `zero apply`.
:::

## zero create
`zero create` is run in the same folder as `zero-project.yml`. It will template out each module specified in the project manifest as the basis of your repositories, then push them to your version control repository (Github).

During the `create` step, Zero will also conditionally include or exclude certain sets of files, as defined by each module. For example, it will not scaffold the authentication examples if you opted not to use this feature.

## zero apply
`zero apply` is the provisioning step that starts to make real-world changes. By default, it runs a command defined by the module to check for any dependencies, and then runs a command to actually apply any changes.

### Check
`check` is run for all the modules in your project before attempting to do the `run` step, so if a dependent's `check` fails it will not start the actual provisioning for any of the modules. This is useful to check for missing binaries or API token permissions before starting to apply any changes.

### Apply
By default, the run step is to execute `make` in the root of the module, but that can be overridden in the module definition. Run should be the one-time setup commands that allow the module to function.
For example, in the infrastructure repository, this would be to **run terraform**, and for the backend repository, this could be to  **make API calls to CircleCI to set up your build pipeline**.


================================================
FILE: doc-site/docs/getting-started/installation.md
================================================
---
title: Installation
sidebar_label: Installation
sidebar_position: 1
---

## How to Install and Configure Zero

There are multiple ways to install Zero:

- Install Zero using your systems package manager.

```shell
# MacOS
brew tap commitdev/zero
brew install zero
```

- Install Zero by downloading the binary.

Download the latest [Zero binary](https://github.com/commitdev/zero/releases) for your systems architecture. Unzip your downloaded package and copy the Zero binary to the desired location and add it to your system PATH.

Zero currently supports:

| System | Support|  Package Manager |
|---------|:-----:|:------:|
| MacOS   |  ✅   | `brew` |
| Linux   |  ✅   |   `deb, rpm, apk`  |
| Windows |  ❌   |   n/a  |


================================================
FILE: doc-site/docs/getting-started/prerequisites.md
================================================
---
title: Prerequisites
sidebar_label: Prerequisites
sidebar_position: 2
---


Using Zero to spin up your infrastructure and application is easy and straightforward. Using just a few commands, you can configure and deploy your very own scalable, high-performance, production-ready infrastructure.

A few caveats before getting started:

- For Zero to provision resources, you will need to be [authenticated with the AWS CLI tool ](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-methods).

- It is recommended practice to [create a GitHub org](https://docs.github.com/en/github/setting-up-and-managing-organizations-and-teams/creating-a-new-organization-from-scratch) where your code is going to live. If you choose, after creating your codebases, Zero will automatically create repositories and check in your code for you. You will need to [create a Personal Access Token](https://docs.github.com/en/github/authenticating-to-github/creating-a-personal-access-token) to enable this.

<details>
  <summary>If using CircleCI as your build pipeline...</summary>
  <ul>
    <li>
    Grant <a href="https://github.com/settings/connections/applications/78a2ba87f071c28e65bb">CircleCi Organization access</a> to your repositories to allow pulling the code during the build pipeline.
    </li>
    <li>
    You will need to <a href="https://circleci.com/docs/2.0/managing-api-tokens/">create a CircleCi access token</a> and enter it during the setup process; you should store your generated tokens securely.
    </li>
    <li>
    For your CI build to work, you need to opt into the use of third-party orbs. You can find this in your CircleCi Org Setting &gt; Security &gt; Allow Uncertified Orbs.
    </li>
  </ul>
</details>


### `zero check`
In order to use Zero, run the `zero check` command on your system to find out which other tools / dependencies you might need to install.

<img src="/img/docs/zero-check.png" width="400" />

[AWS CLI], [Kubectl], [Terraform], [jq], [Git], [Wget]

You need to [register a new domain](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/domain-register.html) / [host a registered domain](https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/MigratingDNS.html) you will use to access your infrastructure on [Amazon Route 53](https://aws.amazon.com/route53/).

:::tip
 We recommended you have two domains - one for staging and another for production. For example, mydomain.com and mydomain-staging.com. This will lead to environments that are more similar, rather than trying to use a subdomain like staging.mydomain.com for staging which may cause issues in your app later on.
:::

[AWS CLI]:  https://aws.amazon.com/cli/
[git]:      https://git-scm.com
[kubectl]:  https://kubernetes.io/docs/tasks/tools/install-kubectl/
[terraform]:https://www.terraform.io/downloads.html
[jq]:       https://github.com/stedolan/jq
[Wget]: https://stackoverflow.com/questions/33886917/how-to-install-wget-in-macos


================================================
FILE: doc-site/docs/getting-started/zero-apply.md
================================================
---
title: zero apply
sidebar_label: zero apply
sidebar_position: 5
---

The `zero apply` command takes the templated modules generated based on your input and spins up a scalable & performant infrastructure for you!

:::note
This can take 20 minutes or more depending on your choices, as it must wait for all the provisioned infrastructure to be created
:::

```shell
$ zero apply

# Sample Output
Choose the environments to apply. This will create infrastructure, CI pipelines, etc.
At this point, real things will be generated that may cost money!
Only a single environment may be suitable for an initial test, but for a real system we suggest setting up both staging and production environments.
✔ Production
🎉  Bootstrapping project zero-init. Please use the zero-project.yml file to modify the project as needed.
Cloud provider: AWS
Runtime platform: Kubernetes
Infrastructure executor: Terraform

...
...


✅  Done.
Your projects and infrastructure have been successfully created.  Here are some useful links and commands to get you started:
zero-aws-eks-stack:
- Repository URL: github.com/myapp-org/infrastructure
- To see your kubernetes clusters, run: 'kubectl config get-contexts'
- To switch to a cluster, use the following commands:
- for production use: kubectl config use-context arn:aws:eks:us-west-2:123456789:cluster/myapp-infra-production-us-west-2

- To inspect the selected cluster, run 'kubectl get node,service,deployment,pods'
zero-frontend-react:
- Repository URL: github.com/myapp-org/frontend
- Deployment Pipeline URL: https://app.circleci.com/pipelines/github/myapp-org/frontend
- Production Landing Page: app.commitzero.com

zero-backend-go:
- Repository URL: github.com/myapp-org/backend-service
- Deployment Pipeline URL: https://app.circleci.com/pipelines/github/myapp-org/backend-service
- Production API: api.commitzero.com
```

***Your stack is now up and running, follow the links in your terminal to visit your application 🎉***


================================================
FILE: doc-site/docs/getting-started/zero-create.md
================================================
---
title: zero create
sidebar_label: zero create
sidebar_position: 4
---

The `zero create` command renders the infrastructure modules you've configured into your project folder and pushes your code to GitHub.

```shell
# Template the selected modules and configuration specified in zero-project.yml and push to the repository.
$ cd zero-init   # change your working dir to YOUR_PROJECT_NAME
$ zero create

## Sample Output
🕰  Fetching Modules
📝  Rendering Modules
  Finished templating : backend-service/.circleci/README.md
✅  Finished templating : backend-service/.circleci/config.yml
✅  Finished templating : backend-service/.gitignore
...
...
✅  Finished templating : infrastructure/terraform/modules/vpc/versions.tf
⬆  Done Rendering - committing repositories to version control.
✅  Repository created: github.com/myapp-org/infrastructure
✅  Repository created: github.com/myapp-org/backend-service
✅  Repository created: github.com/myapp-org/frontend
✅  Done - run zero apply to create any required infrastructure or execute any other remote commands to prepare your environments.


```

After this step you will be able to examine the created repositories before proceeding to `zero apply`. If you chose not to have zero create a repository for you, you can still use the `zero apply` command to create the infrastructure but you will need to check these repositories into your version control system of choice.


================================================
FILE: doc-site/docs/getting-started/zero-init.md
================================================
---
title: zero init
sidebar_label: zero init
sidebar_position: 3
---


The `zero init` command creates a new project and outputs an infrastructure configuration file with user input prompted responses into a file.  -> 📁 `YOUR_PROJECT_NAME/zero-project.yml`

```shell
# To create and customize a new project you run
$ zero init

## Sample project initialization
✔ Project Name: myapp-infra
🎉  Initializing project
✔ EKS + Go + React + Gatsby
✔ Should the created projects be checked into github automatically? (y/n): y
✔ What's the root of the github org to create repositories in?: github.com/myapp-org
✔ Existing AWS Profiles
✔ default

Github personal access token: used for creating repositories for your project
Requires the following permissions: [repo::public_repo, admin::orgread:org]
The token can be created at https://github.com/settings/tokens
✔ Github Personal Access Token with access to the above organization: <MY_GITHUB_ORG_ACCESS_TOKEN>

CircleCI api token: used for setting up CI/CD for your project
The token can be created at https://app.circleci.com/settings/user/tokens
✔ Circleci api key for CI/CD: <MY_CIRCLE_CI_ACCESS_TOKEN>
✔ us-west-2
✔ Production Root Host Name (e.g. mydomain.com) - this must be the root of the chosen domain, not a subdomain.: commitzero.com
✔ Production Frontend Host Name (e.g. app.): app.
✔ Production Backend Host Name (e.g. api.): api.
✔ Staging Root Host Name (e.g. mydomain-staging.com) - this must be the root of the chosen domain, not a subdomain.: commitzero-stage.com
✔ Staging Frontend Host Name (e.g. app.): app.
✔ Staging Backend Host Name (e.g. api.): api.
✔ What do you want to call the zero-aws-eks-stack project?: infrastructure
✔ What do you want to call the zero-backend-go project?: backend-service
✔ What do you want to call the zero-frontend-react project?: frontend

```

After this step you will be able to examine the `zero-project.yml` file to ensure your settings are correct before proceeding to `zero create`.


================================================
FILE: doc-site/docs/reference/learning-resources.md
================================================
---
title: Learning Resources
sidebar_label: Learning Resources
sidebar_position: 3
---


### AWS
- [Getting started with AWS](https://aws.amazon.com/getting-started/)

### Kubernetes
- [Kubernetes Basics](https://kubernetes.io/docs/tutorials/kubernetes-basics/)
- [Kubernetes Training and Certification](https://kubernetes.io/training/)

### Terraform
- [Getting started with Terraform in AWS](https://learn.hashicorp.com/collections/terraform/aws-get-started)

### Golang
- [A Tour of Go](https://tour.golang.org)

### Node.js
- [Getting started with Node.js](https://nodejs.org/en/docs/guides/getting-started-guide/)
- [Getting started with Express](https://expressjs.com/en/starter/installing.html)
- [Getting started with Apollo GraphQL](https://www.apollographql.com/docs/apollo-server/getting-started/)

### React
- [Getting started with React](https://reactjs.org/docs/getting-started.html)


================================================
FILE: doc-site/docs/reference/module-definition.md
================================================
---
title: Module Definition
sidebar_label: Module Definition
sidebar_position: 1
---

### `zero-module.yml`
This file is the definition of a Zero module. It contains a list of all the required parameters to be able to prompt a user for choices during `zero init`, information about how to template the contents of the module during `zero create`, and the information needed for the module to run (`zero apply`).
It also declares the module's dependencies to determine the order of execution in relation to other modules.

| Parameters    | type                 | Description                                      |
|---------------|----------------------|--------------------------------------------------|
| `name`        | `string`             | Name of module                                   |
| `description` | `string`             | Description of the module                        |
| `template`    | `template`           | default settings for templating out the module   |
| `author`      | `string`             | Author of the module                             |
| `icon`        | `string`             | Path to logo image                               |
| `parameters`  | `list(Parameter)`    | Parameters to prompt users                       |
| `commands`    | `Commands`           | Commands to use instead of makefile defaults     |
| `zeroVersion` | string([go-semver])  | Zero binary versions it's compatible with        |


### Commands
Commands are the lifecycle of `zero apply`, it will run all modules' `check` phase, then once satisfied, run in sequence the `apply` phase, then if successful run the `summary` phase.

| Parameters | Type     | Default        | Description                                                              |
|------------|----------|----------------|--------------------------------------------------------------------------|
| `check`    | `string` | `make check`   | Command to check module requirements. check is satisfied if exit code is 0 eg: `sh check-token.sh`, `zero apply` will check all modules before executing |
| `apply`    | `string` | `make`         | Command to execute the project provisioning.                             |
| `summary`  | `string` | `make summary` | Command to summarize to users the module's output and next steps.        |

#### Template
Control how module templates will be parsed during the `zero create` command.

| Parameters   | Type      | Description                                                           |
|--------------|-----------|-----------------------------------------------------------------------|
| `strictMode` | `boolean` | whether strict mode is enabled                                        |
| `delimiters` | `tuple`   | A tuple of open delimiter and ending delimiter eg: `<%` and `%>`      |
| `inputDir`   | `string`  | Folder to template from the module, becomes the module root for users |
| `outputDir`  | `string`  | local directory name for the module, gets commited to version control |

### Condition (module)
Module conditions are considered during the templating phase (`zero create`), based on parameters supplied from the project definition.
Modules can decide to have specific files or directories excluded from the user's project.
For example if the user picks `userAuth: no`, we can exclude all the auth resources via templating.

| Parameters   | Type           | Description                                                                                                                   |
|--------------|----------------|-------------------------------------------------------------------------------------------------------------------------------|
| `action`     | `enum(string)` | type of condition, currently supports [`ignoreFile`]                                                                          |
| `matchField` | `string`       | Allows us to check the contents of another parameter's value                                                                  |
| `WhenValue`  | `string`       | Matches for this value to satisfy the condition                                                                               |
| `data`       | `list(string)` | Supply extra data for the condition action. `ignoreFile`: list of paths (file or directory) to omit from the rendered project |

### Parameter
Parameter defines how the user will be prompted during the interview phase of `zero init`.
There are multiple ways of obtaining the value for each parameter.
Parameters may have `Conditions` that must be fulfilled, otherwise it skips the field entirely.

The precedence for different types of parameter prompts are as follow.
1. `execute`: If this parameter is supplied, the command will be executed and the value will be recorded
2. `type`: zero-defined special ways of obtaining values (for example `AWSProfilePicker` which will set 2 values to the map)
3. `value`: directly assigns a static value to a parameter
4. `prompt`: requires users to select an option OR input a string
Note: `default` specifies the value that will appear initially for that prompt, but the user could still choose a new string or entirely erase it

| Parameters            | Type              | Description                                                                                                               |
|-----------------------|-------------------|---------------------------------------------------------------------------------------------------------------------------|
| `field`               | `string`          | Key to store result for project definition                                                                                |
| `label`               | `string`          | Displayed name for the prompt                                                                                             |
| `options`             | `map`             | A map of `value: display name` pairs for users to pick from                                                               |
| `default`             | `string`          | Defaults to this value during prompt                                                                                      |
| `value`               | `string`          | Skips prompt entirely when set                                                                                            |
| `info`                | `string`          | Displays during prompt as extra information at the top of the screen guiding user's input                                 |
| `fieldValidation`     | `Validation`      | Validations for the prompt value                                                                                          |
| `type`                | `enum(string)`    | Built-in custom prompts: currently supports [`AWSProfilePicker`]                                                          |
| `execute`             | `string`          | Executes commands and takes stdout as prompt result                                                                       |
| `omitFromProjectFile` | `bool`            | Field is skipped from adding to project definition                                                                        |
| `conditions`          | `list(Condition)` | Conditions for prompt to run. If supplied, all conditions must pass. See below.                                           |
| `envVarName`          | `string`          | During `zero apply` parameters are available as env vars. Defaults to field name but can be overwritten with `envVarName` |

### Condition (parameter)
Parameter conditions are considered while running user prompts. Prompts are
executed in order of the yml, and will be skipped if conditions are not satisfied.
For example if a user decides to not use circleCI, a condition can be used to skip the circleCI_api_key prompt.

| Parameters   | Type           | Description                                                       |
|--------------|----------------|-------------------------------------------------------------------|
| `action`     | `enum(string)` | type of condition, currently supports [`KeyMatchCondition`]       |
| `matchField` | `string`       | The name of the parameter to check the value of                   |
| `whenValue`  | `string`       | The exact value to match                                          |
| `elseValue`  | `string`       | The value that will be set for this parameter if the condition match fails. Otherwise the value will be set to an empty string.  |
| `data`       | `list(string)` | Supply extra data for condition to run                            |

### Validation
Allows forcing the user to adhere to a certain format of value for a parameter, defined as a regular expression.

| Parameters     | type           | Description                         |
|----------------|----------------|-------------------------------------|
| `type`         | `enum(string)` | Currently supports [[regex](https://github.com/google/re2/wiki/Syntax)] |
| `value`        | `string`       | Regular expression string           |
| `errorMessage` | `string`       | Error message when validation fails |

[go-semver]: https://github.com/hashicorp/go-version/blob/master/README.md


================================================
FILE: doc-site/docs/reference/project-definition.md
================================================
---
title: Project Definition
sidebar_label: Project Definition
sidebar_position: 1
---

### `zero-project.yml`
Each project is defined by this file. This manifest reflects all the options a user chose during the `zero init` step. It defines which modules are part of the project, each of their parameters, and is the source of truth for the templating (`zero create`) and provision (`zero apply`) steps. 

_Note: This file contains credentials, so make sure it is not shared with others._

| Parameters               | Type         | Description                                    |
|--------------------------|--------------|------------------------------------------------|
| `name`                   | string       | name of the project                            |
| `shouldPushRepositories` | boolean      | whether to push the modules to version control |
| `modules`                | map(modules) | a map containing modules of your project       |


### Modules
| Parameters   | Type            | Description                                                             |
|--------------|-----------------|-------------------------------------------------------------------------|
| `parameters` | map(string)     | key-value map of all the parameters to run the module                   |
| `files`      | File            | Stores information such as source-module location and destination       |
| `dependsOn`  | list(string)    | a list of dependencies that should be fulfilled before this module      |
| `conditions` | list(condition) | conditions to apply while templating out the module based on parameters |

### Condition
| Parameters   | Type         | Description                                                                                                                                           |
|--------------|--------------|-------------------------------------------------------------------------------------------------------------------------------------------------------|
| `action`     | enum(string) | type of condition, currently supports [`ignoreFile`]                                                                                                  |
| `matchField` | string       | Allows you to condition prompt based on another parameter's value                                                                                     |
| `WhenValue`  | string       | Matches for this value to satisfy the condition                                                                                                       |
| `data`       | list(string) | Supply extra data for condition to run   `ignoreFile`: provide list of paths (file or directory path) to omit from module when condition is satisfied |


================================================
FILE: doc-site/docs/reference/working-on-zero.md
================================================
---
title: Working on Zero
sidebar_label: Working on Zero
sidebar_position: 3
---

### Building the tool

```shell
$ git clone git@github.com:commitdev/zero.git
$ cd zero && make build
```

### Releasing a new version on GitHub and Brew

We are using a tool called `goreleaser` which you can get from brew if you're on MacOS:
`brew install goreleaser`

After you have the tool, you can follow these steps:
```
export GITHUB_TOKEN=<your token with access to write to the zero repo>
git tag -s -a <version number like v0.0.1> -m "Some message about this release"
git push origin <version number>
goreleaser release
```

================================================
FILE: doc-site/docusaurus.config.js
================================================
/** @type {import('@docusaurus/types').DocusaurusConfig} */
const { stylesheets, misc } = require('@commitdev/zero-doc-site-common-elements');

const siteUrl = process.env.BUILD_DOMAIN ? `https://${process.env.BUILD_DOMAIN}` : 'https://staging.getzero.dev';
const baseUrl = '/';
const repositoryName = 'zero';

module.exports = {
  title: 'Zero',
  tagline: 'Opinionated infrastructure to take you from idea to production on day one',
  url: siteUrl,
  baseUrl,
  ...misc(),
  projectName: repositoryName,
  themeConfig: {
    colorMode: {
      defaultMode: 'dark',
    },
    navbar: {
      logo: {
        alt: 'Zero Logo',
        src: 'img/zero.svg',
      },
      items: [
        {
          to: '/docs/zero/about/overview',
          label: 'Docs',
          className: 'header-docs-link header-logo-24',
          position: 'right'
        },
        {
          href: 'https://slack.getzero.dev',
          label: 'Slack',
          className: 'header-slack-link header-logo-24',
          position: 'right',
        },
        {
          href: 'https://github.com/commitdev/zero',
          label: 'Github',
          className: 'header-github-link header-logo-24',
          position: 'right',
        },
      ],
    },
    footer: {
      links: [
        {
          items: [
            {
              to: '/docs/zero/about/overview',
              label: 'Docs',
              className: 'header-docs-link header-logo-24',
              position: 'right'
            },
            {
              href: 'https://slack.getzero.dev',
              label: 'Slack',
              className: 'header-slack-link header-logo-24',
              position: 'right',
            },
            {
              href: 'https://github.com/commitdev/zero',
              label: 'Github',
              className: 'header-github-link header-logo-24',
              position: 'right',
            },
          ],
        },
      ],
    },
  },
  presets: [
    [
      '@docusaurus/preset-classic',
      {
        docs: {
          sidebarPath: require.resolve('./sidebars.js'),
          path: 'docs',
          routeBasePath: 'docs/zero/',
          include: ['**/*.md', '**/*.mdx'],
          editUrl: 'https://github.com/commitdev/zero/blob/main/doc-site/',
        },
        theme: {
          customCss: require.resolve('./src/css/custom.css'),
        },
        gtag: {
          trackingID: 'G-6FN66NMDES',
        },
        debug: true,
      },
    ],
  ],
  plugins: [
    'docusaurus-plugin-sass'
  ],
  stylesheets: stylesheets(),
};


================================================
FILE: doc-site/package.json
================================================
{
  "name": "doc-site",
  "version": "0.0.0",
  "private": true,
  "scripts": {
    "docusaurus": "docusaurus",
    "start": "docusaurus start",
    "build": "docusaurus build",
    "swizzle": "docusaurus swizzle",
    "deploy": "docusaurus deploy",
    "clear": "docusaurus clear",
    "serve": "docusaurus serve",
    "write-translations": "docusaurus write-translations",
    "write-heading-ids": "docusaurus write-heading-ids"
  },
  "dependencies": {
    "@commitdev/zero-doc-site-common-elements": "0.0.7",
    "@docusaurus/core": "2.2.0",
    "@docusaurus/preset-classic": "2.0.0-beta.3",
    "@mdx-js/react": "^1.6.21",
    "@svgr/webpack": "^5.5.0",
    "clsx": "^1.1.1",
    "docusaurus-plugin-sass": "^0.2.1",
    "file-loader": "^6.2.0",
    "react": "^17.0.1",
    "react-dom": "^17.0.1",
    "sass": "^1.35.1",
    "url-loader": "^4.1.1"
  },
  "browserslist": {
    "production": [
      ">0.5%",
      "not dead",
      "not op_mini all"
    ],
    "development": [
      "last 1 chrome version",
      "last 1 firefox version",
      "last 1 safari version"
    ]
  }
}


================================================
FILE: doc-site/sidebars.js
================================================
const config = require('./docusaurus.config');
const { sidebarsNavModules } = require('@commitdev/zero-doc-site-common-elements');

module.exports = {
  zero: [
    {
      "About": [{
        type: 'autogenerated',
        dirName: 'about',
      }],
      "Getting started": [{
        type: 'autogenerated',
        dirName: 'getting-started',
      }],
      "Concepts": [{
        type: 'autogenerated',
        dirName: 'concepts',
      }],
      "Reference": [{
        type: 'autogenerated',
        dirName: 'reference',
      }],
    },
    sidebarsNavModules(config),
  ]
}



================================================
FILE: doc-site/src/components/HomepageFeatures.js
================================================
import React from 'react';
import clsx from 'clsx';
import styles from './HomepageFeatures.module.scss';

const FeatureList = [
  {
    title: 'Reliable',
    Svg: require('../../static/img/icons/attr-reliable.svg').default,
    description: (
      <>
        Fault-tolerant infrastructure. Production workloads will be 
        highly available, with traffic load balanced to multiple 
        instances of your application. All the infrastructure is 
        represented with code to be reproducible and easy to configure.
      </>
    ),
  },
  {
    title: 'Scalable',
    Svg: require('../../static/img/icons/attr-scalable.svg').default,
    description: (
      <>
        Your system will scale automatically based on your application’s 
        needs. For frontend assets, using a CDN will ensure availability 
        at global scale.
      </>
    ),
  },
  {
    title: 'Secure',
    Svg: require('../../static/img/icons/attr-secure.svg').default,
    description: (
      <>
        All your systems will follow security best practices backed up 
        by multiple security audits and penetration tests, and will be 
        properly configured to limit access to private networks, 
        secrets, and data. Bullet-proof your application by default 
        using existing, tested tools.
      </>
    ),
  },
];

const Feature = ({Svg, title, description}) => (
  <div className={clsx('col col--5') + " feature"}>
    <div className="text--center">
      <Svg className={styles.featureSvg} alt={title} />
    </div>
    <div className="text--center padding-horiz--md">
      <h3>{title}</h3>
      <p className="description">{description}</p>
    </div>
  </div>
)

export default function HomepageFeatures() {
  return (<>
    <section className={`${styles.features} featured-sections`}>

      <h2 className={styles.title}>Building something <strong>fast</strong> doesn't mean you can't also build it <strong>right</strong></h2>
      <div className={`${styles.row} row`}>
        {FeatureList.map((props, idx) => (
          <Feature key={idx} {...props} />
        ))}
      </div>
    </section>
  </>)
}


================================================
FILE: doc-site/src/components/HomepageFeatures.module.scss
================================================
.features {
  align-items: center;
  @media only screen and (max-width: 641px) {
    padding-left: 1rem;
    padding-right: 1rem;
  }

  .title {
    color: white;
    font-weight: 400;
    text-transform: inherit;
    max-width: 34rem;
  }
  @media screen and (max-width: 768px) {
    .title {
      padding: 0 2rem;
    }
  }

  .row {
    justify-content: center;
  }

  &>div{
    row-gap: 3rem;
  }

  h3 {
    line-height: 250%;
    color: var(--ifm-color-secondary);
    margin-bottom: 1rem;
  }

  p {
    color: white;
    font-size: 0.9rem;
    padding: 0 calc(var(--ifm-spacing-horizontal)*2);
  }

  .featureSvg {
    height: 2.5rem;
  }
  .featureSvg path {
    fill: var(--ifm-color-secondary);
  }
}



================================================
FILE: doc-site/src/components/HomepageOfferings.js
================================================
import React, { useState } from 'react';
import styles from './HomepageOfferings.module.scss';

const offerings = [
  {
    logo: require('../../static/img/icons/offering-infra.svg').default,
    label: 'Infrastructure',
    tools: [
      {
        name: 'Terraform',
        logo: 'img/tools/terraform.png',
        url: 'https://terraform.io',
      },
      {
        name: 'Kubernetes',
        logo: 'img/tools/kubernetes.png',
        url: 'https://kubernetes.io/',
        noCrop: true,
      },
      {
        name: 'Amazon Web Services',
        logo: 'img/tools/aws.png',
        url: 'https://aws.amazon.com/',
      },
      {
        name: 'Cert Manager',
        logo: 'img/tools/cert-manager.png',
        url: 'https://cert-manager.io/docs/',
      },
      {
        name: 'External DNS',
        logo: 'img/tools/external-dns.png',
        url: 'https://github.com/kubernetes-sigs/external-dns',
      },
      {
        name: 'Wireguard',
        logo: 'img/tools/wireguard.png',
        url: 'https://www.wireguard.com/',
      },
      {
        name: 'Prometheus',
        logo: 'img/tools/prometheus.png',
        url: 'https://prometheus.io/',
      },
      {
        name: 'Grafana',
        logo: 'img/tools/grafana.png',
        url: 'https://grafana.com/',
      },
    ]
  },
  {
    logo: require('../../static/img/icons/offering-cicd.svg').default,
    label: 'CI/CD',
    tools: [
      {
        name: 'Github Actions',
        logo: 'img/tools/github-actions.svg',
        noCrop: true,
        url: 'https://github.com/features/actions',
      },
      {
        name: 'CircleCI',
        logo: 'img/tools/circleci.png',
        url: 'https://circleci.com',
      },
      {
        name: 'Docker',
        logo: 'img/tools/docker.png',
        url: 'https://docker.com/',
      },
      {
        name: 'AWS ECR',
        logo: 'img/tools/ecr.png',
        url: 'https://aws.amazon.com/ecr/',
      },
    ]
  },
  {
    logo: require('../../static/img/icons/offering-frontend.svg').default,
    label: 'FRONTEND',
    tools: [
      {
        name: 'React js',
        logo: 'img/tools/react.png',
        url: 'https://reactjs.org',
      },
      {
        name: 'AWS S3',
        logo: 'img/tools/s3.png',
        url: 'https://aws.amazon.com/s3/',
      },
      {
        name: 'AWS Cloudfront',
        logo: 'img/tools/cloudfront.png',
        url: 'https://aws.amazon.com/cloudfront/',
      },
      {
        name: 'ECMAScript 2018',
        logo: 'img/tools/js.png',
        url: 'https://www.w3schools.com/js/js_2018.asp',
      },
    ]
  },
  {
    logo: require('../../static/img/icons/offering-backend.svg').default,
    label: 'BACKEND',
    tools: [
      {
        name: 'Golang',
        logo: 'img/tools/golang.png',
        url: 'https://golang.org',
      },
      {
        name: 'Node.js',
        logo: 'img/tools/nodejs.png',
        url: 'https://nodejs.org',
        noCrop: true,
      },
      {
        name: 'Open ID Connect',
        logo: 'img/tools/openid.png',
        url: 'https://openid.net/connect/',
      },
      {
        name: 'Ory Kratos & Oathkeeper',
        logo: 'img/tools/ory.png',
        url: 'https://www.ory.sh/kratos/docs/',
      },
      {
        name: 'Telepresence',
        logo: 'img/tools/telepresence.png',
        url: 'https://www.telepresence.io/',
        noCrop: true,
      },
      {
        name: 'Stripe',
        logo: 'img/tools/stripe.png',
        url: 'https://stripe.com',
        noCrop: true,
      },
    ]
  },
]

const Offerings = ({data, active, clickHandler}) => (
  <div className={styles.offering_box}>
    <div className={styles.left_box}>
      {
        data.map((i, idx) =>
          <Discipline
            key={idx}
            logo={i.logo}
            label={i.label}
            clickHandler={clickHandler}
            active={i.label == active}
          />
        )
      }
    </div>

    <div className={styles.right_box}>
      <ToolBox
        data={ data.find((i) => i.label == active).tools }
      />
    </div>
  </div>
)

const Discipline = ({logo: LogoSvg, label, clickHandler, active}) => (
  <div
    className={`${styles.discipline} ${active && styles.discipline_active}`}
    onClick={() => clickHandler({ active: label})}
  >
    <LogoSvg className={styles.logo} alt="logo" />
    <h3 className={styles.discipline_name}>{label}</h3>
  </div>
)

const ToolBox = ({data}) => <ul>
  {
    data.map((tool, idx) =>
      <Tool key={idx} tool={tool} idx={idx} />
    )
  }
</ul>

const Tool = ({tool, idx}) => (<li key={`tool-${idx}`}>
  <a href={tool.url} target="_blank">
    <img src={tool.logo} className={tool.noCrop && styles["no-crop"]} />
    <p>{tool.name}</p>
  </a>
</li>)

export default function FeaturedOfferings() {
  const title = "What do you get out of the box ?"
  const [state, setState] = useState({
    active: "Infrastructure",
  })

  return <div className={`${styles.offerings_container} featured-sections`}>
    <h2>{title}</h2>
    <Offerings data={offerings} active={state.active} clickHandler={setState} />
  </div>
}


================================================
FILE: doc-site/src/components/HomepageOfferings.module.scss
================================================
.offerings_container{
  text-align: center;
  padding: 9rem 8rem 5rem;
  margin: 0 auto;
  min-height: 53rem;
  background-color: #E8EDF4;
  color: var(--ifm-landing-page-inverse-font-color);


  .offering_box {
    display: flex;
    column-gap: 5rem;
    flex-wrap: wrap;
    justify-content: center;
  }
}

.left_box{
  flex: 0 1 270px;
  margin: 2rem 0px;
  display: flex;
  flex-direction: column;
  column-gap: 1rem;
  row-gap: 1rem;

  .discipline {
    display: flex;
    height: 5rem;
    column-gap: 1rem;
    position: relative;
    font-weight: bold;
    text-transform: uppercase;
    flex: 0 0 auto;
    cursor: pointer;
    border-radius: 12px;
    background: #D7DEE8;
    padding-right: 1rem;

    .logo {
      flex: 1;
      height: 3rem;
      align-self: center;
      margin: 1rem;
    }

    .discipline_name {
      flex: 4;
      align-self: center;
      line-height: 0;
      margin: 0;
      text-align: left;
      font-size: 1rem;
    }
    &:hover:not(.discipline_active) .discipline_name{
      color: var(--ifm-color-secondary);
    }
  }

  .discipline_active{
    background: var(--ifm-color-secondary);
    color: var(--ifm-color-dark-active);

    .logo path{
      fill: var(--ifm-color-dark-active);
    }

    &:after {
      content: "";
      width: 5rem;
      right: -5rem;
      height: 0px;
      align-self: center;
      position: absolute;
      border-top: 4px dashed var(--ifm-color-secondary);
    }
  }
}

.right_box{
  border: 4px dashed var(--ifm-color-secondary);
  border-radius: 12px;
  display: flex;
  padding: 2rem;

  ul{
    height: 100%;
    width: 100%;
    align-self: center;
    margin: 0;
    padding: 0;
    display: flex;
    flex-direction: column;
    row-gap: 1.2rem;

    li {
      list-style: none;
      justify-self: stretch;
      flex: 1 1 40px;

      a{
        display: flex;
        column-gap: 1rem;
        text-decoration: none;
        color: var(--ifm-landing-page-inverse-font-color);
        font-weight: bold;

        &:hover{
          color: var(--ifm-color-secondary);
        }
      }

      img{
        width: 32px;
        border-radius: 50%;
        padding: 0;

        &.no-crop{
          border-radius: 0;
        }
      }

      p{
        flex: 5;
        text-align: left;
        font-size: 1.1rem;
        margin: 0;
        align-self: center;
        font-family: 'Montserrat';
        font-weight: 600;
        white-space: nowrap;
      }
      @media only screen and (max-width: 400px) {
        p {
          font-size: 0.8rem;
        }
      }
    }
  }
}

/**
  box becomes stacked when screen is small
  and the dotted line is vertical instead of horizontal
**/
@media screen and (max-width: 967px) {
  .offerings_container {
    padding: 5rem 2rem;
    min-height: 62rem;
  }
  .left_box {
    justify-content: center;
    flex-direction: row;
    flex-wrap: wrap;
    flex: 1 1 auto;

    .discipline {

      .logo {
        flex: 1 1 33px;
        margin: 0.5rem;
      }
    }
    .discipline_active{
      order: 1;
      flex: 4 4 100%;
      margin: 0 16%;

      &:after {
        content: "";
        width: 0px;
        height: 2rem;
        right: 50%;
        position: absolute;
        border-right: var(--ifm-color-secondary) dashed 4px;
        bottom: -2rem;
        box-sizing: border-box;
        overflow: visible;
      }
    }
  }
}


================================================
FILE: doc-site/src/components/HomepageTrustedBy.js
================================================
import React from 'react';
import styles from './HomepageTrustedBy.module.scss';

const trustedByData = [
  {
    img: "img/partners/planworth.png",
    src: "https://www.planworth.co/",
  },
  {
    img: "img/partners/patch.png",
    src: "https://www.patch.io/",
  },
  {
    img: "img/partners/atlasone.png",
    src: "https://www.atlasone.ca/",
  },
  {
    img: "img/partners/placeholder.png",
    src: "https://placeholder.co/",
  },
]

const Carousel = ({data}) => (
  <ul className={styles.trusted}>
    {
      data.map((item, idx) => (
        <li key={idx}>
          <a href={item.src} target="_blank">
            <img src={item.img} />
          </a>
        </li>
      ))
    }
  </ul>
)

export default function TrustedByCarousel() {
  return <div className="featured-sections">
    <h3 className={styles.title}>Trusted By</h3>
    <Carousel data={trustedByData} />
  </div>
}


================================================
FILE: doc-site/src/components/HomepageTrustedBy.module.scss
================================================
h3.title {
  letter-spacing: 0.1rem;
  text-align: center;
  font-weight: 400;
  font-family: "Montserrat";
}

.trusted {
  display: flex;
  flex-direction: row;
  flex-wrap: wrap;
  justify-content: center;
  padding: 0;
  row-gap: 2em;

  li{
    list-style: none;
    margin: 0 1.25rem;
    height: 100px;
    width: 200px;
    background-color: rgba(196, 196, 196, 0.5);
    display: flex;
    border-radius: 5px;
    padding: 2rem;

    &:hover{
      background-color: rgba(220,235,245, 0.8);
    }

    a{
      align-self: center;
      line-height: 0;
    }
  }
}


================================================
FILE: doc-site/src/components/HomepageVideo.js
================================================
import React from 'react';
import styles from './HomepageVideo.module.scss';

export default function FeatureVideo () {
return <div className={styles.video}>
    <iframe width="850" height="450" src="https://www.youtube.com/embed/6rBM8L8dz4A" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
  </div>
}


================================================
FILE: doc-site/src/components/HomepageVideo.module.scss
================================================
.video {
  width: 100%;
  text-align: center;

  iframe {
    max-width: 65%;
  }
}


================================================
FILE: doc-site/src/components/HomepageWhyZero.js
================================================
import React, { useState } from 'react';
import clsx from 'clsx';
import styles from './HomepageWhyZero.module.scss';

const reasons = [
  {
    logo: require('../../static/img/icons/reason-diamond.svg').default,
    title: 'Quality',
    text: `Like the best DevOps engineer you’ve ever met - except open source and free.`,
    details: [
      `The devops skill gap is real. Why spend precious time picking up unfamiliar tech, 
      making wrong choices that result in costly refactoring or rebuilding in the future, 
      and missing tools and best practices that would speed up your product iteration?`,
      `Get real-time support for all your questions from Zero’s community.`
    ]
  },
  {
    logo: require('../../static/img/icons/reason-clockwise.svg').default,
    title: 'Speed',
    text: `Just as fast as other tools like Heroku to get up and running.`,
    details: [
      `Building foundational infrastructure the right way doesn’t have to take a long time. Our team has years of experience building and scaling startups and have poured that knowledge into Zero. What used to take us weeks of DevOps work can now take you 30 minutes.`,
      `We provide constant updates and new modules that you can pull in on an ongoing basis.`,
    ]
  },
  {
    logo: require('../../static/img/icons/reason-key.svg').default,
    title: 'Ownership',
    text: `You own 100% of the code. No lock-in!`,
    details: [
      `Everything built by Zero is yours. It’s your code to change or migrate off at any point.`,
      `Cloud application hosting tools are built to lock you in and don’t scale. `,
      `Infrastructure is created in your cloud provider account. You can customize as much 
      as you like with no strings attached. You control how much you spend.`
    ]
  }
];

const Reasons = ({ data, expanded, setExpanded }) => (
  <div className={`${styles.reasons} row`}>
    {
      data.map((i, idx) => (
        <div key={idx} className={`${styles.reason} ${clsx('col col--3') }`}>
          <i.logo className={styles.reason_logo} alt="logo" />
          <h4 className={styles.title}>{i.title}</h4>

          <p className={`${styles.description} description`}>{i.text}</p>
          {expanded && <ul className={`${styles.description} description`}>{i.details.map(content=> <li>{content}</li>)}</ul>}
        </div>
      ))
    }
  </div>
)

export default function FeatureWhyZero () {
  const [expanded, setExpanded] = useState(false)
const title = "Why is Zero good for startups ?"
return <div className={`${styles.reasons_container} featured-sections`}>
    <h2 className={styles.title}>
      {title}
      <h4 className={styles.subtitle}>
        As engineer #1, your sole priority is to build the logic for your application and get it into customers’ hands as quickly and reliably as possible.
      </h4>
    </h2>
    <Reasons data={reasons} expanded={expanded} setExpanded={setExpanded} />
    <div className={`${styles.expand} ${expanded && styles.expanded}`}>
      <a href="javascript:void(0);" onClick={()=>{setExpanded(!expanded)}}>{expanded ? "Less" : "More" } Details</a>
    </div>
  </div>
}


================================================
FILE: doc-site/src/components/HomepageWhyZero.module.scss
================================================
.reasons_container{
  text-align: center;
  background: white;
  color: var(--ifm-landing-page-inverse-font-color);
  @media only screen and (max-width: 641px) {
    padding-left: 3rem;
    padding-right: 3rem;
  }

  .title {
    margin-bottom: 5rem;
    letter-spacing: 0.05rem;
  }
  .subtitle {
    text-transform: none;
    margin: 1rem auto;
    font-family: 'lato';
    font-weight: 400;
    max-width: 34rem;
    letter-spacing: normal;
  }
  .expand {
    margin-top: 2rem;

    a{
      display: flex;
      justify-content: center;

      &:active, &:link, &:visited{
        text-decoration: none;
        color: var(--ifm-landing-page-inverse-font-color);
      }
      &:after {
        align-self: center;
        margin: 0 0.5rem;
        content: "";
        width: 18px;
        height: 18px;
        background:  url(../../static/img/icons/icon-plus.svg);
        background-size: cover;
      }
    }
    &.expanded a{
      &:after {
        background:  url(../../static/img/icons/icon-minus.svg);
        background-size: cover;
      }
    }
  }
}

.reasons {
  display: flex;
  flex-direction: row;
  row-gap: 3rem;
  justify-content: center;
  column-gap: 2rem;
}

.reason {
  max-width: 10rem;

  .title{
    color: var(--ifm-color-secondary);
    text-transform: uppercase;
    margin: 1rem;
  }

  .description{
    min-height: 2.5rem;
    font-size: 0.9rem;
    align-self: center;
  }
  ul.description {
    margin-top: 2rem;
    padding-left: 1rem;
  }
  .description li{
    text-align: left;
  }

  .reason_logo {
    height: 3rem;
    flex: 0 0 3rem;
    align-self: center;

    path {
      stroke: var(--ifm-color-secondary);
    }
  }
}


================================================
FILE: doc-site/src/css/custom.css
================================================
/**
 * Any CSS included here will be global. The classic template
 * bundles Infima by default. Infima is a CSS framework designed to
 * work well for content-centric websites.
 */

 /* You can override the default Infima variables here. */
:root {
  --ifm-color-primary-dark: rgb(33, 175, 144);
  --ifm-color-primary-darker: rgb(31, 165, 136);
  --ifm-color-primary-darkest: rgb(26, 136, 112);
  --ifm-color-primary-light: rgb(70, 203, 174);
  --ifm-color-primary-lighter: rgb(102, 212, 189);
  --ifm-color-primary-lightest: rgb(146, 224, 208);
  --ifm-navbar-link-hover-color: rgb(33, 175, 144);
  --ifm-code-font-size: 95%;
  --ifm-footer-padding-vertical: 20px;
  --ifm-footer-padding-horizontal: 10px;
  --ifm-footer-background-color: transparent;
  --ifm-color-secondary: rgb(255, 106, 185);
  --ifm-button-cta-background: linear-gradient(294.55deg, #F2BD6D 17.88%, #F17F84 65.95%, #FF3EA7 93.96%);
  --ifm--hero--text-background-gradient: linear-gradient(234.45deg, #12C6FF 0%, #6184C9 68.23%);
  --ifm-landing-page-inverse-font-color: #333;
  --ifm-color-dark-active: rgba(5, 6, 55, 1);
  --ifm-spacing-vertical: 0px;
  --ifm-navbar-sidebar-width: 15rem;
  --ifm-alert-padding-vertical: 1rem;
  --ifm-alert-padding-horizontal: 1rem;
}

html[data-theme='dark'] {
  --ifm-color-primary: #edc281;
  --ifm-font-color-base-inverse: white;
  --ifm-navbar-background-color: transparent;
  --ifm-background-color: linear-gradient(90deg, rgba(15, 16, 17, 1) 0%, rgba(1, 2, 66, 1) 100%);
  --ifm-color-info: rgba(255, 166, 0, 0.4);
  --ifm-menu-color-active: #edc281;
  --ifm-navbar-link-hover-color: #edc281;
  --ifm-link-color: #edc281;
  --ifm-code-background: rgba(140,140,140,0.5);
}

html[data-theme='light'] {
  --ifm-heading-color: navy;
  --ifm-font-color-base-inverse: navy;
  --ifm-color-secondary: #6184C9;
  --ifm-background-color: #fefefe;
}
html[data-theme='light'] .navbar--fixed-top, html[data-theme='light'] .navbar-sidebar__brand{
  background: linear-gradient(90deg, rgba(15, 16, 17, 0.3) 0%, rgba(1, 2, 66, 0.4) 100%);
}

/** PAGE BACKGROUND **/
html{
  background: var(--ifm-background-color);
}

.hero--primary{
  background: none;
}

/** FONTS **/
.navbar {
  font-family: 'lato';
  font-weight: 900;
}
.menu__list .menu__link--sublist {
  font-weight: 900;
}
.menu__list .menu__list-item {
  font-weight: 400;
}
.featured-sections h3 , .featured-sections h2, .featured-sections h4{
  font-family: 'Montserrat';
  font-weight: 800;
}
.button-cta{
  font-family: 'Montserrat';
  font-weight: 700;
}
.description {
  font-family: 'lato';
  font-weight: 400;
}

/** Small screen hamburger menu slideout background **/
.navbar-sidebar--show .navbar-sidebar {
  background-color: var(--ifm-code-background);
}
.navbar-sidebar__brand .navbar__brand {
  height: 1rem;
}
.navbar-sidebar__brand .navbar__brand img{
  margin: 1rem;
}
.navbar-sidebar__items .menu__link{
  column-gap: 1rem;
  justify-content: flex-start;
}
.navbar__brand img{
  height: 80%;
  margin-left: 0.6rem;
}

/** Docs sidebar - folder name capitalize */
.menu__link--sublist{
  text-transform: capitalize;
}

/** FLATTEN FOOTER ITEMS **/
.footer__items{
  display: flex;
  justify-content: flex-end;
}

.footer__item{
  padding:0 var(--ifm-spacing-horizontal);
}

@media only screen and (max-width: 400px) {
  .footer {
    display: none;
  }
}

/** LANDING PAGE SECTION **/
.featured-sections {
  text-align: center;
  padding: 6rem 0;
}

.featured-sections h3, .featured-sections h2 {
  text-transform: uppercase;
  letter-spacing: 0.05rem;
  padding: 0;
  margin: 0 auto 3rem auto;
}

.featured-sections h2 {
  margin: 0 auto 5rem auto;
}

/**
NAV BAR Icons
flattens footer icons
 */
.header-logo-24.navbar__link, .footer__item .header-logo-24 {
  display:flex;
  line-height: 24px;
  text-transform: uppercase;
  color: var(--ifm-font-color-base-inverse);
  font-weight: 700;
}

.header-logo-24:hover{
  text-decoration: none;
}

.header-logo-24:before{
  content: "";
  display: flex;
  height: 24px;
  width: 24px;
  margin: 0 3px;
  background-size: cover;
}

html[data-theme='dark'] .header-github-link:before {
  background: url(../../static/img/icons/octocat.svg) no-repeat;
}

html[data-theme='light'] .header-github-link:before  {
  background: url(../../static/img/icons/octocat-navy.svg) no-repeat;
}

html[data-theme='dark'] .header-slack-link:before {
  background: url(../../static/img/icons/slack.svg) no-repeat;
}

html[data-theme='light'] .header-slack-link:before  {
  background: url(../../static/img/icons/slack-navy.svg) no-repeat;
}

html[data-theme='dark'] .header-docs-link:before {
  background: url(../../static/img/icons/notes.svg) no-repeat;
}

html[data-theme='light'] .header-docs-link:before  {
  background: url(../../static/img/icons/notes-navy.svg) no-repeat;
}

/* alert - note */
.alert--secondary{
  --ifm-alert-background-color: rgb(200, 212, 226);
  --ifm-alert-border-color: rgb(200, 212, 226);
  --ifm-alert-color: var(--ifm-color-gray-900);
  --ra-admonition-icon-color: var(--ifm-color-gray-900);
}
/* alert - info */
.alert--info{
  --ifm-alert-background-color: rgb(117, 157, 209);
  --ifm-alert-border-color: rgb(117, 157, 209);
  --ifm-alert-color: var(--ifm-color-gray-900);
  --ra-admonition-icon-color: var(--ifm-color-gray-900);
}

.docs-main-toc .toc-item {
  margin: 2rem 1rem;
}

.header-logo-24 span svg {
  display: none;
}


================================================
FILE: doc-site/src/pages/docs/index.js
================================================
import React from 'react';
import { Redirect } from 'react-router-dom';

export default () => <Redirect to="/docs/zero/about/overview" />


================================================
FILE: doc-site/src/pages/docs/zero/index.js
================================================
import React from 'react';
import { Redirect } from 'react-router-dom';

export default () => <Redirect to="/docs/zero/about/overview" />


================================================
FILE: doc-site/src/pages/index.js
================================================
import React from 'react';
import clsx from 'clsx';
import Layout from '@theme/Layout';
import Link from '@docusaurus/Link';
import useDocusaurusContext from '@docusaurus/useDocusaurusContext';
import styles from './index.module.scss';
import HomepageFeatures from '../components/HomepageFeatures';
import HomepageTrustedBy from '../components/HomepageTrustedBy';
import HomepageVideo from '../components/HomepageVideo';
import HomepageWhyZero from '../components/HomepageWhyZero';
import HomepageOfferings from '../components/HomepageOfferings';

function HomepageHeader() {
  const {siteConfig} = useDocusaurusContext();

  return (
    <header className={clsx('hero hero--primary', styles.heroBanner)}>
      <p className={styles.hero__subtitle}>{siteConfig.tagline}</p>
    </header>
  );
}

function HomePageCallToAction () {
  return <div className={styles.buttons}>
    <Link
      className="button button-cta button--secondary button--lg"
      to="/docs/zero/getting-started/installation">
      Get Started
    </Link>
  </div>
}

export default function Home() {
  const landingPageOnlyGlobalItemStyle = `
  .navbar  {
    padding: 2.5rem 0 3.5rem;
    box-shadow: none;
    background: linear-gradient(90deg, rgba(15, 16, 17, 0.6) 0%, rgba(1, 2, 66, 0.6) 100%);
  }
  @media only screen and (max-width: 641px) {
    .navbar__items--right {
      display: none;
    }
  }
  .navbar__inner {
    padding: 0 3rem;
  }
  .navbar__brand img{
    height: 130%;
  }
  .react-toggle{
    display: none;
  }
  `;
  const {siteConfig} = useDocusaurusContext();
  return (
    <Layout
      title={`Build it Fast, Build it Right!`}
      description="Opinionated infrastructure to take you from idea to production on day one!"
      >
      <style>{landingPageOnlyGlobalItemStyle}</style>
      <HomepageHeader />
      <main>
        <HomepageVideo />
        <HomePageCallToAction />
        <HomepageTrustedBy />
        <HomepageWhyZero />
        <HomepageFeatures />
        <HomepageOfferings />
        <HomePageCallToAction />
      </main>
    </Layout>
  );
}


================================================
FILE: doc-site/src/pages/index.module.scss
================================================
/**
 * CSS files with the .module.css suffix will be treated as CSS modules
 * and scoped locally.
 */

.heroBanner {
  padding: 4rem 0 2rem;
  text-align: center;

  .hero__subtitle {
    background: var(--ifm--hero--text-background-gradient);
    background-clip: text;
    -webkit-background-clip: text;
    -webkit-text-fill-color: transparent;
    font-weight: 900;
    font-size: 2rem;
    max-width: 50rem;
    margin: 3rem auto;
  }
}

.buttons {
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 4rem auto 4rem;

  a {
    text-transform: uppercase;
    background: var(--ifm-button-cta-background);
    border-radius: 25px;
    border-color: transparent;
    border-style: none;
    background-size: 150% 100%;
  }
}

.hiring {
  display: flex;
  align-items: center;
  justify-content: center;
  margin: 4rem auto 4rem;
  text-align: center;
  a {
    font-size: 2rem;
    font-weight: bold;
    color: #ffffff;
  }
  @media only screen and (max-width: 600px) {
    a {
      padding: 0 2rem;
    }
  }
}

@media screen and (max-width: 966px) {
  .heroBanner {
    padding: 2rem;
  }
}


================================================
FILE: doc-site/src/theme/DocSidebar/index.js
================================================
/**
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */
import React, {useState, useCallback, useEffect, useRef, memo} from 'react';
import clsx from 'clsx';
import {useThemeConfig, isSamePath} from '@docusaurus/theme-common';
import useUserPreferencesContext from '@theme/hooks/useUserPreferencesContext';
import useLockBodyScroll from '@theme/hooks/useLockBodyScroll';
import useWindowSize, {windowSizes} from '@theme/hooks/useWindowSize';
import useScrollPosition from '@theme/hooks/useScrollPosition';
import Link from '@docusaurus/Link';
import isInternalUrl from '@docusaurus/isInternalUrl';
import Logo from '@theme/Logo';
import IconArrow from '@theme/IconArrow';
import IconMenu from '@theme/IconMenu';
import {translate} from '@docusaurus/Translate';
import styles from './styles.module.css';
const MOBILE_TOGGLE_SIZE = 24;

function usePrevious(value) {
  const ref = useRef(value);
  useEffect(() => {
    ref.current = value;
  }, [value]);
  return ref.current;
}

const isActiveSidebarItem = (item, activePath) => {
  if (item.type === 'link') {
    return isSamePath(item.href, activePath);
  }

  if (item.type === 'category') {
    return item.items.some((subItem) =>
      isActiveSidebarItem(subItem, activePath),
    );
  }

  return false;
}; // Optimize sidebar at each "level"
// TODO this item should probably not receive the "activePath" props
// TODO this triggers whole sidebar re-renders on navigation

const DocSidebarItems = memo(function DocSidebarItems({items, ...props}) {
  return items.map((item, index) => (
    <DocSidebarItem
      key={index} // sidebar is static, the index does not change
      item={item}
      {...props}
    />
  ));
});

function DocSidebarItem(props) {
  switch (props.item.type) {
    case 'category':
      return <DocSidebarItemCategory {...props} />;

    case 'link':
    default:
      return <DocSidebarItemLink {...props} />;
  }
}

function DocSidebarItemCategory({
  item,
  onItemClick,
  collapsible,
  activePath,
  ...props
}) {
  const {items, label} = item;
  const isActive = isActiveSidebarItem(item, activePath);
  const wasActive = usePrevious(isActive); // active categories are always initialized as expanded
  // the default (item.collapsed) is only used for non-active categories

  const [collapsed, setCollapsed] = useState(() => {
    if (!collapsible) {
      return false;
    }

    return isActive ? false : item.collapsed;
  });
  const menuListRef = useRef(null);
  const [menuListHeight, setMenuListHeight] = useState(undefined);

  const handleMenuListHeight = (calc = true) => {
    setMenuListHeight(
      calc ? `${menuListRef.current?.scrollHeight}px` : undefined,
    );
  }; // If we navigate to a category, it should automatically expand itself

  useEffect(() => {
    const justBecameActive = isActive && !wasActive;

    if (justBecameActive && collapsed) {
      setCollapsed(false);
    }
  }, [isActive, wasActive, collapsed]);
  const handleItemClick = useCallback(
    (e) => {
      e.preventDefault();

      if (!menuListHeight) {
        handleMenuListHeight();
      }

      setTimeout(() => setCollapsed((state) => !state), 100);
    },
    [menuListHeight],
  );

  if (items.length === 0) {
    return null;
  }

  return (
    <li
      className={clsx('menu__list-item', {
        'menu__list-item--collapsed': collapsed,
      })}>
      <a
        className={clsx('menu__link', {
          'menu__link--sublist': collapsible,
          'menu__link--active': collapsible && isActive,
          [styles.menuLinkText]: !collapsible,
        })}
        onClick={collapsible ? handleItemClick : undefined}
        href={collapsible ? '#!' : undefined}
        {...props}>
        {label}
      </a>
      <ul
        className="menu__list"
        ref={menuListRef}
        style={{
          height: menuListHeight,
        }}
        onTransitionEnd={() => {
          if (!collapsed) {
            handleMenuListHeight(false);
          }
        }}>
        <DocSidebarItems
          items={items}
          tabIndex={collapsed ? '-1' : '0'}
          onItemClick={onItemClick}
          collapsible={collapsible}
          activePath={activePath}
        />
      </ul>
    </li>
  );
}

function DocSidebarItemLink({
  item,
  onItemClick,
  activePath,
  collapsible: _collapsible,
  ...props
}) {
  const {href, label, customProps} = item;
  const isActive = isActiveSidebarItem(item, activePath);
  return (
    <li className="menu__list-item" key={label}>
      <Link
        className={clsx('menu__link', {
          'menu__link--active': isActive,
          [styles.menuLinkExternal]: !isInternalUrl(href),
        })}
        to={href}
        {...(isInternalUrl(href) && {
          isNavLink: true,
          exact: true,
          onClick: onItemClick,
        })}
        {...props}
        {...customProps}>
        {label}
      </Link>
    </li>
  );
}

function useShowAnnouncementBar() {
  const {isAnnouncementBarClosed} = useUserPreferencesContext();
  const [showAnnouncementBar, setShowAnnouncementBar] = useState(
    !isAnnouncementBarClosed,
  );
  useScrollPosition(({scrollY}) => {
    if (!isAnnouncementBarClosed) {
      setShowAnnouncementBar(scrollY === 0);
    }
  });
  return showAnnouncementBar;
}

function useResponsiveSidebar() {
  const [showResponsiveSidebar, setShowResponsiveSidebar] = useState(false);
  useLockBodyScroll(showResponsiveSidebar);
  const windowSize = useWindowSize();
  useEffect(() => {
    if (windowSize === windowSizes.desktop) {
      setShowResponsiveSidebar(false);
    }
  }, [windowSize]);
  const closeResponsiveSidebar = useCallback(
    (e) => {
      e.target.blur();
      setShowResponsiveSidebar(false);
    },
    [setShowResponsiveSidebar],
  );
  const toggleResponsiveSidebar = useCallback(() => {
    setShowResponsiveSidebar((value) => !value);
  }, [setShowResponsiveSidebar]);
  return {
    showResponsiveSidebar,
    closeResponsiveSidebar,
    toggleResponsiveSidebar,
  };
}

function HideableSidebarButton({onClick}) {
  return (
    <button
      type="button"
      title={translate({
        id: 'theme.docs.sidebar.collapseButtonTitle',
        message: 'Collapse sidebar',
        description: 'The title attribute for collapse button of doc sidebar',
      })}
      aria-label={translate({
        id: 'theme.docs.sidebar.collapseButtonAriaLabel',
        message: 'Collapse sidebar',
        description: 'The title attribute for collapse button of doc sidebar',
      })}
      className={clsx(
        'button button--secondary button--outline',
        styles.collapseSidebarButton,
      )}
      onClick={onClick}>
      <IconArrow className={styles.collapseSidebarButtonIcon} />
    </button>
  );
}

function ResponsiveSidebarButton({responsiveSidebarOpened, onClick}) {
  return (
    <button
      aria-label={
        responsiveSidebarOpened
          ? translate({
              id: 'theme.docs.sidebar.responsiveCloseButtonLabel',
              message: 'Close menu',
              description:
                'The ARIA label for close button of mobile doc sidebar',
            })
          : translate({
              id: 'theme.docs.sidebar.responsiveOpenButtonLabel',
              message: 'Open menu',
              description:
                'The ARIA label for open button of mobile doc sidebar',
            })
      }
      aria-haspopup="true"
      className="button button--secondary button--sm menu__button"
      type="button"
      onClick={onClick}>
      {responsiveSidebarOpened ? (
        <span
          className={clsx(styles.sidebarMenuIcon, styles.sidebarMenuCloseIcon)}>
          &times;
        </span>
      ) : (
        <IconMenu
          className={styles.sidebarMenuIcon}
          height={MOBILE_TOGGLE_SIZE}
          width={MOBILE_TOGGLE_SIZE}
        />
      )}
    </button>
  );
}

function DocSidebar({
  path,
  sidebar,
  sidebarCollapsible = true,
  onCollapse,
  isHidden,
}) {
  const showAnnouncementBar = useShowAnnouncementBar();
  const {
    navbar: {hideOnScroll},
    hideableSidebar,
  } = useThemeConfig();
  const {isAnnouncementBarClosed} = useUserPreferencesContext();
  const {
    showResponsiveSidebar,
    closeResponsiveSidebar,
    toggleResponsiveSidebar,
  } = useResponsiveSidebar();
  return (
    <div
      className={clsx(styles.sidebar, {
        [styles.sidebarWithHideableNavbar]: hideOnScroll,
        [styles.sidebarHidden]: isHidden,
      })}>
      {hideOnScroll && <Logo tabIndex={-1} className={styles.sidebarLogo} />}
      <div
        className={clsx(
          'menu',
          'menu--responsive',
          'thin-scrollbar',
          styles.menu,
          {
            'menu--show': showResponsiveSidebar,
            [styles.menuWithAnnouncementBar]:
              !isAnnouncementBarClosed && showAnnouncementBar,
          },
        )}>
        <ResponsiveSidebarButton
          responsiveSidebarOpened={showResponsiveSidebar}
          onClick={toggleResponsiveSidebar}
        />
        <ul className="menu__list">
          <DocSidebarItems
            items={sidebar}
            onItemClick={closeResponsiveSidebar}
            collapsible={sidebarCollapsible}
            activePath={path}
          />
        </ul>
      </div>
      {hideableSidebar && <HideableSidebarButton onClick={onCollapse} />}
    </div>
  );
}

export default DocSidebar;


================================================
FILE: doc-site/src/theme/DocSidebar/styles.module.css
================================================
/**
 * Copyright (c) Facebook, Inc. and its affiliates.
 *
 * This source code is licensed under the MIT license found in the
 * LICENSE file in the root directory of this source tree.
 */

:root {
  --collapse-button-bg-color-dark: #2e333a;
  overflow-x: hidden;
}

@media (min-width: 997px) {
  .sidebar {
    display: flex;
    flex-direction: column;
    max-height: 100vh;
    height: 100%;
    position: sticky;
    top: 0;
    padding-top: var(--ifm-navbar-height);
    width: var(--doc-sidebar-width);
    transition: opacity 50ms ease;
  }

  .sidebarWithHideableNavbar {
    padding-top: 0;
  }

  .sidebarHidden {
    opacity: 0;
    height: 0;
    overflow: hidden;
    visibility: hidden;
  }

  .sidebarLogo {
    display: flex !important;
    align-items: center;
    margin: 0 var(--ifm-navbar-padding-horizontal);
    min-height: var(--ifm-navbar-height);
    max-height: var(--ifm-navbar-height);
    color: inherit !important;
    text-decoration: none !important;
  }

  .sidebarLogo img {
    margin-right: 0.5rem;
    height: 2rem;
  }

  .menu {
    flex-grow: 1;
    padding: 0.5rem;
  }

  .menuLinkText {
    cursor: initial;
  }

  .menuLinkText:hover {
    background: none;
  }

  .menuWithAnnouncementBar {
    margin-bottom: var(--docusaurus-announcement-bar-height);
  }

  .collapseSidebarButton {
    display: block !important;
    background-color: var(--ifm-button-background-color);
    height: 40px;
    position: sticky;
    bottom: 0;
    border-radius: 0;
    border: 1px solid var(--ifm-toc-border-color);
  }

  .collapseSidebarButtonIcon {
    transform: rotate(180deg);
    margin-top: 4px;
  }
  html[dir='rtl'] .collapseSidebarButtonIcon {
    transform: rotate(0);
  }

  html[data-theme='dark'] .collapseSidebarButton {
    background-color: var(--collapse-button-bg-color-dark);
  }

  html[data-theme='dark'] .collapseSidebarButton:hover,
  html[data-theme='dark'] .collapseSidebarButton:focus {
    background-color: var(--ifm-color-emphasis-200);
  }
}

.sidebarLogo,
.collapseSidebarButton {
  display: none;
}

.sidebarMenuIcon {
  vertical-align: middle;
}

.sidebarMenuCloseIcon {
  display: inline-flex;
  justify-content: center;
  align-items: center;
  height: 24px;
  font-size: 1.5rem;
  font-weight: var(--ifm-font-weight-bold);
  line-height: 0.9;
  width: 24px;
}

:global(.menu__list) :global(.menu__list) {
  overflow-y: hidden;
  will-change: height;
  transition: height var(--ifm-transition-fast) linear;
}

:global(.menu__list-item--collapsed) :global(.menu__list) {
  height: 0 !important;
}

.menuLinkExternal {
  align-items: center;
}
.menuLinkExternal:after {
  content: '';
  height: 1.15rem;
  width: 1.15rem;
  min-width: 1.15rem;
  margin: 0 0 0 3%;
  background: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='16' height='16' viewBox='0 0 24 24'%3E%3Cpath fill='rgba(0,0,0,0.5)' d='M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z'/%3E%3C/svg%3E")
    no-repeat;
  filter: var(--ifm-menu-link-sublist-icon-filter);
}


================================================
FILE: doc-site/static/.nojekyll
================================================


================================================
FILE: go.mod
================================================
module github.com/commitdev/zero

go 1.16

require (
	github.com/aws/aws-sdk-go v1.30.12
	github.com/buger/goterm v1.0.0
	github.com/coreos/go-semver v0.3.0
	github.com/gabriel-vasile/mimetype v1.1.1
	github.com/google/go-cmp v0.3.1
	github.com/google/uuid v1.1.1
	github.com/hashicorp/go-getter v1.4.2-0.20200106182914-9813cbd4eb02
	github.com/hashicorp/go-version v1.2.1
	github.com/hashicorp/golang-lru v0.5.4 // indirect
	github.com/hashicorp/terraform v0.12.26
	github.com/iancoleman/strcase v0.1.2
	github.com/juju/ansiterm v0.0.0-20210706145210-9283cdf370b5 // indirect
	github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 // indirect
	github.com/k0kubun/pp v3.0.1+incompatible
	github.com/kyokomi/emoji v2.1.0+incompatible
	github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434
	github.com/lunixbochs/vtclean v1.0.0 // indirect
	github.com/machinebox/graphql v0.2.2
	github.com/manifoldco/promptui v0.8.0
	github.com/matryer/is v1.3.0 // indirect
	github.com/mattn/go-colorable v0.1.8 // indirect
	github.com/mattn/go-isatty v0.0.13 // indirect
	github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e // indirect
	github.com/sirupsen/logrus v1.6.0
	github.com/spf13/cobra v1.1.3
	github.com/stretchr/testify v1.7.0
	github.com/termie/go-shutil v0.0.0-20140729215957-bcacb06fecae
	golang.org/x/net v0.0.0-20200226121028-0de0cce0169b // indirect
	golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c // indirect
	golang.org/x/tools v0.0.0-20191127201027-ecd32218bd7f // indirect
	gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f // indirect
	gopkg.in/yaml.v2 v2.4.0

)

// Tencent cloud unpublished their version v3.0.82 and became v1.0.191
// https://github.com/hashicorp/terraform/issues/29021
replace github.com/tencentcloud/tencentcloud-sdk-go v3.0.82+incompatible => github.com/tencentcloud/tencentcloud-sdk-go v1.0.191


================================================
FILE: go.sum
================================================
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
cloud.google.com/go v0.46.3 h1:AVXDdKsrtX33oR9fbCMu/+c1o8Ofjq6Ku/MInaLVg5Y=
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
cloud.google.com/go/bigquery v1.0.1 h1:hL+ycaJpVE9M7nLoiXb/Pn10ENE2u+oddxbD8uu0ZVU=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/datastore v1.0.0 h1:Kt+gOPPp2LEPWp8CSfxhsM8ik9CcyE/gYu+0r+RnZvM=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/firestore v1.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk=
cloud.google.com/go/pubsub v1.0.1 h1:W9tAK3E57P75u0XLLR82LZyw8VpAnhmyTOxW9qzmyj8=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/storage v1.0.0 h1:VV2nUM3wwLLGh9lSABFgZMjInyUbJeaRSE64WuAIQ+4=
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
github.com/Azure/azure-sdk-for-go v35.0.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
github.com/Azure/azure-sdk-for-go v36.2.0+incompatible/go.mod h1:9XXNKU+eRnpl9moKnB4QOLf1HestfXbmab5FXxiDBjc=
github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
github.com/Azure/go-autorest/autorest v0.9.2/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI=
github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0=
github.com/Azure/go-autorest/autorest/adal v0.8.1-0.20191028180845-3492b2aff503/go.mod h1:Z6vX6WXXuyieHAXwMj0S6HY6e6wcHn37qQMBQlvY3lc=
github.com/Azure/go-autorest/autorest/azure/cli v0.2.0/go.mod h1:WWTbGPvkAg3I4ms2j2s+Zr5xCGwGqTQh+6M2ZqOczkE=
github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA=
github.com/Azure/go-autorest/autorest/date v0.2.0/go.mod h1:vcORJHLJEh643/Ioh9+vPmf1Ij9AEBM5FuBIXLmIy0g=
github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0=
github.com/Azure/go-autorest/autorest/mocks v0.3.0/go.mod h1:a8FDP3DYzQ4RYfVAxAN3SVSiiO77gL2j2ronKKP0syM=
github.com/Azure/go-autorest/autorest/to v0.3.0/go.mod h1:MgwOyqaIuKdG4TL/2ywSsIWKAfJfgHDo8ObuUk3t5sA=
github.com/Azure/go-autorest/autorest/validation v0.2.0/go.mod h1:3EEqHnBxQGHXRYq3HT1WyXAvT7LLY3tl70hw6tQIbjI=
github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc=
github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk=
github.com/Azure/go-ntlmssp v0.0.0-20180810175552-4a21cbd618b4/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/ChrisTrenkamp/goxpath v0.0.0-20170922090931-c385f95c6022/go.mod h1:nuWgzSkT5PnyOd+272uUmV0dnAnAn42Mk7PiQC5VzN4=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/QcloudApi/qcloud_sign_golang v0.0.0-20141224014652-e4130a326409/go.mod h1:1pk82RBxDY/JZnPQrtqHlUFfCctgdorsd9M06fMynOM=
github.com/Unknwon/com v0.0.0-20151008135407-28b053d5a292/go.mod h1:KYCjqMOeHpNuTOiFQU6WEcTG7poCJrUs0YgyHNtn1no=
github.com/abdullin/seq v0.0.0-20160510034733-d5467c17e7af/go.mod h1:5Jv4cbFiHJMsVxt52+i0Ha45fjshj6wxYr1r19tB9bw=
github.com/agext/levenshtein v1.2.1/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
github.com/agext/levenshtein v1.2.2 h1:0S/Yg6LYmFJ5stwQeRp6EeOcCbj7xiqQSdNelsXvaqE=
github.com/agext/levenshtein v1.2.2/go.mod h1:JEDfjyjHDjOF/1e4FlBE/PkbqA9OfWu2ki2W0IB5558=
github.com/agl/ed25519 v0.0.0-20150830182803-278e1ec8e8a6/go.mod h1:WPjqKcmVOxf0XSf3YxCJs6N6AOSrOx3obionmG7T0y0=
github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
github.com/aliyun/alibaba-cloud-sdk-go v0.0.0-20190329064014-6e358769c32a/go.mod h1:T9M45xf79ahXVelWoOBmH0y4aC1t5kXO5BxwyakgIGA=
github.com/aliyun/aliyun-oss-go-sdk v0.0.0-20190103054945-8205d1f41e70/go.mod h1:T/Aws4fEfogEE9v+HPhhw+CntffsBHJ8nXQCwKr0/g8=
github.com/aliyun/aliyun-tablestore-go-sdk v4.1.2+incompatible/go.mod h1:LDQHRZylxvcg8H7wBIDfvO5g/cy4/sz1iucBlc2l3Jw=
github.com/antchfx/xpath v0.0.0-20190129040759-c8489ed3251e/go.mod h1:Yee4kTMuNiPYJ7nSNorELQMr1J33uOpXDMByNYhvtNk=
github.com/antchfx/xquery v0.0.0-20180515051857-ad5b8c7a47b0/go.mod h1:LzD22aAzDP8/dyiCKFp31He4m2GPjl0AFyzDtZzUu9M=
github.com/apparentlymart/go-cidr v1.0.1/go.mod h1:EBcsNrHc3zQeuaeCeCtQruQm+n9/YjEn/vI25Lg7Gwc=
github.com/apparentlymart/go-dump v0.0.0-20180507223929-23540a00eaa3/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
github.com/apparentlymart/go-dump v0.0.0-20190214190832-042adf3cf4a0/go.mod h1:oL81AME2rN47vu18xqj1S1jPIPuN7afo62yKTNn3XMM=
github.com/apparentlymart/go-textseg v1.0.0 h1:rRmlIsPEEhUTIKQb7T++Nz/A5Q6C9IuX2wFoYVvnCs0=
github.com/apparentlymart/go-textseg v1.0.0/go.mod h1:z96Txxhf3xSFMPmb5X/1W05FF/Nj9VFpLOpjS5yuumk=
github.com/apparentlymart/go-versions v0.0.2-0.20180815153302-64b99f7cb171/go.mod h1:JXY95WvQrPJQtudvNARshgWajS7jNNlM90altXIPNyI=
github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
github.com/armon/circbuf v0.0.0-20190214190532-5111143e8da2/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o=
github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY=
github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8=
github.com/aws/aws-sdk-go v1.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3ATZkfNZeM=
github.com/aws/aws-sdk-go v1.25.3/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo=
github.com/aws/aws-sdk-go v1.30.12 h1:KrjyosZvkpJjcwMk0RNxMZewQ47v7+ZkbQDXjWsJMs8=
github.com/aws/aws-sdk-go v1.30.12/go.mod h1:5zCpMtNQVjRREroY7sYe8lOMRSxkhG6MZveU8YkpAk0=
github.com/baiyubin/aliyun-sts-go-sdk v0.0.0-20180326062324-cfa1a18b161f/go.mod h1:AuiFmCCPBSrqvVMvuqFuk0qogytodnVFVSN5CeJB8Gc=
github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d h1:xDfNPAt8lFiC1UJrqV3uuy861HCTo708pDMbjHHdCas=
github.com/bgentry/go-netrc v0.0.0-20140422174119-9fd32a8b3d3d/go.mod h1:6QX/PXZ00z/TKoufEY6K/a0k6AhaJrQKdFe6OfVXsa4=
github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs=
github.com/bketelsen/crypt v0.0.3-0.20200106085610-5cbc8cc4026c/go.mod h1:MKsuJmJgSg28kpZDP6UIiPt0e0Oz0kqKNGyRaWEPv84=
github.com/blang/semver v3.5.1+incompatible/go.mod h1:kRBLl5iJ+tD4TcOOxsy/0fnwebNt5EWlYSAyrTnjyyk=
github.com/bmatcuk/doublestar v1.1.5/go.mod h1:wiQtGV+rzVYxB7WIlirSN++5HPtPlXEo9MEoZQC/PmE=
github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps=
github.com/buger/goterm v1.0.0 h1:ZB6uUlY8+sjJyFGzz2WpRqX2XYPeXVgtZAOJMwOsTWM=
github.com/buger/goterm v1.0.0/go.mod h1:16STi3LquiscTIHA8SXUNKEa/Cnu4ZHBH8NsCaWgso0=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cheggaaa/pb v1.0.27/go.mod h1:pQciLPpbU0oxA0h+VJYYLxO+XeDQb5pZijXscXHm81s=
github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/coreos/bbolt v1.3.0/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM=
github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
github.com/coreos/go-systemd v0.0.0-20181012123002-c6f51f82210d/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
github.com/dimchansky/utfbom v1.1.0/go.mod h1:rO41eb7gLfo8SF1jd9F8HplJm1Fewwi4mQvIirEdv+8=
github.com/dnaeon/go-vcr v0.0.0-20180920040454-5637cf3d8a31/go.mod h1:aBB1+wY4s93YsC3HHjMBMrwTj2R9FHDzUr9KyGc8n1E=
github.com/dylanmei/iso8601 v0.1.0/go.mod h1:w9KhXSgIyROl1DefbMYIE7UVSIvELTbMrCfx+QkYnoQ=
github.com/dylanmei/winrmtest v0.0.0-20190225150635-99b7fe2fddf1/go.mod h1:lcy9/2gH1jn/VCLouHA6tOEwLoNVd4GW6zhuKLmHC2Y=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/gabriel-vasile/mimetype v1.1.1 h1:qbN9MPuRf3bstHu9zkI9jDWNfH//9+9kHxr9oRBBBOA=
github.com/gabriel-vasile/mimetype v1.1.1/go.mod h1:6CDPel/o/3/s4+bp6kIbsWATq8pmgOisOPG40CJa6To=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
github.com/go-sql-driver/mysql v1.5.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
github.com/go-test/deep v1.0.1/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
github.com/go-test/deep v1.0.3 h1:ZrJSEWsXzPOxaZnFteGEfooLba+ju3FYIbOrS+rQd68=
github.com/go-test/deep v1.0.3/go.mod h1:wGDj63lr65AM2AQyKZd/NYHGb0R+1RLqB8NKt3aSFNA=
github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.0/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b h1:VKtxabqXZkF25pY9ekfRL6a582T4P37/31XEstQ5p58=
github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
github.com/golang/groupcache v0.0.0-20180513044358-24b0969c4cb7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
github.com/golang/protobuf v1.1.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.4 h1:87PNWwrRvUSnqS4dlcBU/ftvOIBep4sYuBLlh6rX2wk=
github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-querystring v1.0.0/go.mod h1:odCYkC5MyYFN7vkCjXpyrEuKhc/BUO6wN/zVPAxq5ck=
github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no=
github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
github.com/google/uuid v1.1.1 h1:Gkbcsh/GbpXz7lPftLA3P6TYMwjCLYm83jiFQZF/3gY=
github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
github.com/googleapis/gax-go/v2 v2.0.5 h1:sjZBwGj9Jlw33ImPtvFviGYvseOtDM7hkSKB7+Tv3SM=
github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
github.com/gophercloud/gophercloud v0.0.0-20190208042652-bc37892e1968/go.mod h1:3WdhXV3rUYy9p6AUW8d94kr+HS62Y4VL9mBnFxsD8q4=
github.com/gophercloud/utils v0.0.0-20190128072930-fbb6ab446f01/go.mod h1:wjDF8z83zTeg5eMLml5EBSlAhbF7G8DobyI1YsMuyzw=
github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE=
github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
github.com/grpc-ecosystem/grpc-gateway v1.8.5/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
github.com/hashicorp/aws-sdk-go-base v0.4.0/go.mod h1:eRhlz3c4nhqxFZJAahJEFL7gh6Jyj5rQmQc7F9eHFyQ=
github.com/hashicorp/consul v0.0.0-20171026175957-610f3c86a089/go.mod h1:mFrjN1mfidgJfYP1xrJCF+AfRhr6Eaqhb2+sfyn/OOI=
github.com/hashicorp/consul/api v1.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q=
github.com/hashicorp/consul/sdk v0.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8=
github.com/hashicorp/errwrap v1.0.0 h1:hLrqtEDnRye3+sgx6z4qVLNuviH3MR5aQ0ykNJa/UYA=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/go-azure-helpers v0.10.0/go.mod h1:YuAtHxm2v74s+IjQwUG88dHBJPd5jL+cXr5BGVzSKhE=
github.com/hashicorp/go-checkpoint v0.5.0/go.mod h1:7nfLNL10NsxqO4iWuW6tWW0HjZuDrwkBuEQsVcpCOgg=
github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-cleanhttp v0.5.1 h1:dH3aiDG9Jvb5r5+bYHsikaOUIpcM0xvgMXVoDkXMzJM=
github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80=
github.com/hashicorp/go-getter v1.4.2-0.20200106182914-9813cbd4eb02 h1:l1KB3bHVdvegcIf5upQ5mjcHjs2qsWnKh4Yr9xgIuu8=
github.com/hashicorp/go-getter v1.4.2-0.20200106182914-9813cbd4eb02/go.mod h1:7qxyCd8rBfcShwsvxgIguu4KbS3l8bUCwg2Umn7RjeY=
github.com/hashicorp/go-hclog v0.0.0-20180709165350-ff2cf002a8dd/go.mod h1:9bjs9uLqI8l75knNv3lV1kA55veR+WUPSiKIWcQHudI=
github.com/hashicorp/go-hclog v0.0.0-20181001195459-61d530d6c27f/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ=
github.com/hashicorp/go-immutable-radix v0.0.0-20180129170900-7f3cd4390caa/go.mod h1:6ij3Z20p+OhOkCSrA0gImAWoHYQRGbnlcuk6XYTiaRw=
github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60=
github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
github.com/hashicorp/go-msgpack v0.5.4/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM=
github.com/hashicorp/go-multierror v1.0.0 h1:iVjPR7a6H0tWELX5NxNe7bYopibicUzc7uPribsnS6o=
github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk=
github.com/hashicorp/go-plugin v1.3.0/go.mod h1:F9eH4LrE/ZsRdbwhfjs9k9HoDUwAHnYtXdgmf1AVNs0=
github.com/hashicorp/go-retryablehttp v0.5.2/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs=
github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU=
github.com/hashicorp/go-safetemp v1.0.0 h1:2HR189eFNrjHQyENnQMMpCiBAsRxzbTMIgBhEyExpmo=
github.com/hashicorp/go-safetemp v1.0.0/go.mod h1:oaerMy3BhqiTbVye6QuFhFtIceqFoDHxNAB65b+Rj1I=
github.com/hashicorp/go-slug v0.4.1/go.mod h1:I5tq5Lv0E2xcNXNkmx7BSfzi1PsJ2cNjs3cC3LwyhK8=
github.com/hashicorp/go-sockaddr v0.0.0-20180320115054-6d291a969b86/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU=
github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4=
github.com/hashicorp/go-tfe v0.8.1/go.mod h1:XAV72S4O1iP8BDaqiaPLmL2B4EE6almocnOn8E8stHc=
github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro=
github.com/hashicorp/go-version v1.1.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/go-version v1.2.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/go-version v1.2.1 h1:zEfKbn2+PDgroKdiOzqiE8rsmLqU2uwi5PB5pBJ3TkI=
github.com/hashicorp/go-version v1.2.1/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA=
github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90=
github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
github.com/hashicorp/golang-lru v0.5.4 h1:YDjusn29QI/Das2iO9M0BHnIbxPeyuCHsjMW+lJfyTc=
github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4=
github.com/hashicorp/hcl v0.0.0-20170504190234-a4b07c25de5f/go.mod h1:oZtUIOe8dh44I2q6ScRibXws4Ajl+d+nod3AaR9vL5w=
github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4=
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
github.com/hashicorp/hcl/v2 v2.0.0/go.mod h1:oVVDG71tEinNGYCxinCYadcmKU9bglqW9pV3txagJ90=
github.com/hashicorp/hcl/v2 v2.3.0 h1:iRly8YaMwTBAKhn1Ybk7VSdzbnopghktCD031P8ggUE=
github.com/hashicorp/hcl/v2 v2.3.0/go.mod h1:d+FwDBbOLvpAM3Z6J7gPj/VoAGkNe/gm352ZhjJ/Zv8=
github.com/hashicorp/hil v0.0.0-20190212112733-ab17b08d6590/go.mod h1:n2TSygSNwsLJ76m8qFXTSc7beTb+auJxYdqrnoqwZWE=
github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64=
github.com/hashicorp/mdns v1.0.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ=
github.com/hashicorp/memberlist v0.1.0/go.mod h1:ncdBp14cuox2iFOq3kDiquKU6fqsTBc3W6JvZwjxxsE=
github.com/hashicorp/memberlist v0.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I=
github.com/hashicorp/serf v0.0.0-20160124182025-e4ec8cc423bb/go.mod h1:h/Ru6tmZazX7WO/GDmwdpS975F019L4t5ng5IgwbNrE=
github.com/hashicorp/serf v0.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc=
github.com/hashicorp/terraform v0.12.26 h1:FVsTCH1DMvTlzVSO2sKCzkwLczf/eZBO4GuY5IbHFk4=
github.com/hashicorp/terraform v0.12.26/go.mod h1:CBxNAiTW0pLap44/3GU4j7cYE2bMhkKZNlHPcr4P55U=
github.com/hashicorp/terraform-config-inspect v0.0.0-20191212124732-c6ae6269b9d7/go.mod h1:p+ivJws3dpqbp1iP84+npOyAmTTOLMgCzrXd3GSdn/A=
github.com/hashicorp/terraform-svchost v0.0.0-20191011084731-65d371908596/go.mod h1:kNDNcF7sN4DocDLBkQYz73HGKwN1ANB1blq4lIYLYvg=
github.com/hashicorp/vault v0.10.4/go.mod h1:KfSyffbKxoVyspOdlaGVjIuwLobi07qD1bAbosPMpP0=
github.com/hashicorp/yamux v0.0.0-20180604194846-3520598351bb/go.mod h1:+NfK9FKeTrX5uv1uIXGdwYDTeHna2qgaIlx54MXqjAM=
github.com/iancoleman/strcase v0.1.2 h1:gnomlvw9tnV3ITTAxzKSgTF+8kFWcU/f+TgttpXGz1U=
github.com/iancoleman/strcase v0.1.2/go.mod h1:SK73tn/9oHe+/Y0h39VT4UCxmurVJkR5NA7kMEAOgSE=
github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM=
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
github.com/jhump/protoreflect v1.6.0/go.mod h1:eaTn3RZAmMBcV0fifFvlm6VHNz3wSkYyXYWUh7ymB74=
github.com/jmespath/go-jmespath v0.0.0-20160202185014-0b12d6b521d8/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/jmespath/go-jmespath v0.0.0-20180206201540-c2b33e8439af/go.mod h1:Nht3zPeWKUH0NzdCt2Blrr5ys8VGpn0CEB0cQHVjt7k=
github.com/jmespath/go-jmespath v0.3.0 h1:OS12ieG61fsCg5+qLJ+SsW9NicxNkg3b25OyT2yCeUc=
github.com/jmespath/go-jmespath v0.3.0/go.mod h1:9QtRXoHjLGCJ5IBSaohpXITPlowMeeYCZ7fLUTSywik=
github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
github.com/joyent/triton-go v0.0.0-20180313100802-d8f9c0314926/go.mod h1:U+RSyWxWd04xTqnuOQxnai7XGS2PrPY2cfGoDKtMHjA=
github.com/json-iterator/go v1.1.5/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024 h1:rBMNdlhTLzJjJSDIjNEXX1Pz3Hmwmz91v+zycvx9PJc=
github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
github.com/jtolds/gls v4.2.1+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU=
github.com/juju/ansiterm v0.0.0-20210706145210-9283cdf370b5 h1:Q5klzs6BL5FkassBX65t+KkG0XjYcjxEm+GNcQAsuaw=
github.com/juju/ansiterm v0.0.0-20210706145210-9283cdf370b5/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU=
github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM=
github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
github.com/k0kubun/pp v3.0.1+incompatible h1:3tqvf7QgUnZ5tXO6pNAZlrvHgl6DvifjDrd9g2S9Z40=
github.com/k0kubun/pp v3.0.1+incompatible/go.mod h1:GWse8YhT0p8pT4ir3ZgBbfZild3tgzSScAn6HmfYukg=
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0/go.mod h1:1NbS8ALrpOvjt0rHPNLyCIeMtbizbir8U//inJ+zuB8=
github.com/keybase/go-crypto v0.0.0-20161004153544-93f5b35093ba/go.mod h1:ghbZscTyKdM07+Fw3KSi0hcJm+AlEUWj8QLlPtijN/M=
github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8=
github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
github.com/kylelemons/godebug v0.0.0-20170820004349-d65d576e9348/go.mod h1:B69LEHPfb2qLo0BaaOLcbitczOKLWTsrBG9LczfCD4k=
github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw=
github.com/kyokomi/emoji v2.1.0+incompatible h1:+DYU2RgpI6OHG4oQkM5KlqD3Wd3UPEsX8jamTo1Mp6o=
github.com/kyokomi/emoji v2.1.0+incompatible/go.mod h1:mZ6aGCD7yk8j6QY6KICwnZ2pxoszVseX1DNoGtU2tBA=
github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
github.com/likexian/gokit v0.0.0-20190309162924-0a377eecf7aa/go.mod h1:QdfYv6y6qPA9pbBA2qXtoT8BMKha6UyNbxWGWl/9Jfk=
github.com/likexian/gokit v0.0.0-20190418170008-ace88ad0983b/go.mod h1:KKqSnk/VVSW8kEyO2vVCXoanzEutKdlBAPohmGXkxCk=
github.com/likexian/gokit v0.0.0-20190501133040-e77ea8b19cdc/go.mod h1:3kvONayqCaj+UgrRZGpgfXzHdMYCAO0KAt4/8n0L57Y=
github.com/likexian/gokit v0.20.15/go.mod h1:kn+nTv3tqh6yhor9BC4Lfiu58SmH8NmQ2PmEl+uM6nU=
github.com/likexian/simplejson-go v0.0.0-20190409170913-40473a74d76d/go.mod h1:Typ1BfnATYtZ/+/shXfFYLrovhFyuKvzwrdOnIDHlmg=
github.com/likexian/simplejson-go v0.0.0-20190419151922-c1f9f0b4f084/go.mod h1:U4O1vIJvIKwbMZKUJ62lppfdvkCdVd2nfMimHK81eec=
github.com/likexian/simplejson-go v0.0.0-20190502021454-d8787b4bfa0b/go.mod h1:3BWwtmKP9cXWwYCr5bkoVDEfLywacOv0s06OBEDpyt8=
github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434 h1:im9kkmH0WWwxzegiv18gSUJbuXR9y028rXrWuPp6Jug=
github.com/logrusorgru/aurora v0.0.0-20191017060258-dc85c304c434/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
github.com/lunixbochs/vtclean v0.0.0-20180621232353-2d01aacdc34a/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
github.com/lunixbochs/vtclean v1.0.0 h1:xu2sLAri4lGiovBDQKxl5mrXyESr3gUr5m5SM5+LVb8=
github.com/lunixbochs/vtclean v1.0.0/go.mod h1:pHhQNgMf3btfWnGBVipUOjRYhoOsdGqdm/+2c2E2WMI=
github.com/lusis/go-artifactory v0.0.0-20160115162124-7e4ce345df82/go.mod h1:y54tfGmO3NKssKveTEFFzH8C/akrSOy/iW9qEAUDV84=
github.com/machinebox/graphql v0.2.2 h1:dWKpJligYKhYKO5A2gvNhkJdQMNZeChZYyBbrZkBZfo=
github.com/machinebox/graphql v0.2.2/go.mod h1:F+kbVMHuwrQ5tYgU9JXlnskM8nOaFxCAEolaQybkjWA=
github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
github.com/manifoldco/promptui v0.8.0 h1:R95mMF+McvXZQ7j1g8ucVZE1gLP3Sv6j9vlF9kyRqQo=
github.com/manifoldco/promptui v0.8.0/go.mod h1:n4zTdgP0vr0S3w7/O/g98U+e0gwLScEXGwov2nIKuGQ=
github.com/masterzen/simplexml v0.0.0-20160608183007-4572e39b1ab9/go.mod h1:kCEbxUJlNDEBNbdQMkPSp6yaKcRXVI6f4ddk8Riv4bc=
github.com/masterzen/winrm v0.0.0-20190223112901-5e5c9a7fe54b/go.mod h1:wr1VqkwW0AB5JS0QLy5GpVMS9E3VtRoSYXUYyVk46KY=
github.com/matryer/is v1.3.0 h1:9qiso3jaJrOe6qBRJRBt2Ldht05qDiFP9le0JOIhRSI=
github.com/matryer/is v1.3.0/go.mod h1:2fLPjFQM9rhQ15aVEtbuwhJinnOqrmgXPNdZsdwlWXA=
github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU=
github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
github.com/mattn/go-colorable v0.1.8 h1:c1ghPdyEDarC70ftn0y+A/Ee++9zz8ljHG1b13eJ0s8=
github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4=
github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-isatty v0.0.13 h1:qdl+GuBjcsKKDco5BsxPJlId98mSWNKqYA+Co0SC1yA=
github.com/mattn/go-isatty v0.0.13/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU=
github.com/mattn/go-shellwords v1.0.4/go.mod h1:3xCvwCdWdlDJUrvuMn7Wuy9eWs4pE8vqg+NOMyg4B2o=
github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
github.com/miekg/dns v1.0.8/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg=
github.com/mitchellh/cli v1.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc=
github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw=
github.com/mitchellh/copystructure v1.0.0/go.mod h1:SNtv71yrdKgLRyLFxmLdkAbkKEFWgYaq1OVrnRcwhnw=
github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y=
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
github.com/mitchellh/go-linereader v0.0.0-20190213213312-1b945b3263eb/go.mod h1:OaY7UOoTkkrX3wRwjpYRKafIkkyeD0UtweSHAWWiqQM=
github.com/mitchellh/go-testing-interface v0.0.0-20171004221916-a61a99592b77/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0=
github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI=
github.com/mitchellh/go-wordwrap v0.0.0-20150314170334-ad45545899c7/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
github.com/mitchellh/go-wordwrap v1.0.0 h1:6GlHJ/LTGMrIJbwgdqdl2eEH8o+Exx/0m8ir9Gns0u4=
github.com/mitchellh/go-wordwrap v1.0.0/go.mod h1:ZXFpozHsX6DPmq2I0TCekCxypsnAUbP2oI0UX1GXzOo=
github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg=
github.com/mitchellh/hashstructure v1.0.0/go.mod h1:QjSHrPWS+BGUVBYkbTZWEnOh3G1DutKwClXU/ABz6AQ=
github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY=
github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
github.com/mitchellh/panicwrap v1.0.0/go.mod h1:pKvZHwWrZowLUzftuFq7coarnxbBXU4aQh3N0BJOeeA=
github.com/mitchellh/prefixedio v0.0.0-20190213213902-5733675afd51/go.mod h1:kB1naBgV9ORnkiTVeyJOI1DavaJkG4oNIq0Af6ZVKUo=
github.com/mitchellh/reflectwalk v1.0.0/go.mod h1:mSTlrgnPZtwu0c4WaC2kGObEpuNDbx0jmZXqmk4esnw=
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
github.com/mozillazg/go-httpheader v0.2.1/go.mod h1:jJ8xECTlalr6ValeXYdOF8fFUISeBAdw6E61aqQma60=
github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs=
github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno=
github.com/nu7hatch/gouuid v0.0.0-20131221200532-179d4d0c4d8d/go.mod h1:YUTz3bUH2ZwIWBy3CJBeOBEugqcmXREj14T+iG/4k4U=
github.com/oklog/run v1.0.0/go.mod h1:dlhp/R75TPv97u0XWUtDeV/lRKWPKSdTuV0TZvrmrQA=
github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
github.com/packer-community/winrmcp v0.0.0-20180102160824-81144009af58/go.mod h1:f6Izs6JvFTdnRbziASagjZ2vmf55NSIkC/weStxCHqk=
github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc=
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
github.com/pkg/browser v0.0.0-20180916011732-0a3d74bf9ce4/go.mod h1:4OwLy04Bl9Ef3GJJCoec+30X3LQs/0/m4HFRt/2LUSA=
gi
Download .txt
gitextract_gf3x61g3/

├── .circleci/
│   └── config.yml
├── .dockerignore
├── .github/
│   └── workflows/
│       ├── codeql-analysis.yml
│       ├── config.yml
│       └── doc-site.yml
├── .gitignore
├── .goreleaser.yml
├── CONTRIBUTING.md
├── Dockerfile
├── LICENSE
├── LICENSE.spdx
├── Makefile
├── README.md
├── cmd/
│   ├── apply.go
│   ├── check.go
│   ├── create.go
│   ├── init.go
│   ├── version.go
│   └── zero.go
├── doc-site/
│   ├── .gitignore
│   ├── README.md
│   ├── babel.config.js
│   ├── docs/
│   │   ├── about/
│   │   │   ├── opensource.md
│   │   │   ├── overview.md
│   │   │   ├── real-world-usage.md
│   │   │   ├── roadmap.md
│   │   │   └── technology-choices.md
│   │   ├── concepts/
│   │   │   ├── core-concepts.md
│   │   │   └── project-life-cycle.md
│   │   ├── getting-started/
│   │   │   ├── installation.md
│   │   │   ├── prerequisites.md
│   │   │   ├── zero-apply.md
│   │   │   ├── zero-create.md
│   │   │   └── zero-init.md
│   │   └── reference/
│   │       ├── learning-resources.md
│   │       ├── module-definition.md
│   │       ├── project-definition.md
│   │       └── working-on-zero.md
│   ├── docusaurus.config.js
│   ├── package.json
│   ├── sidebars.js
│   ├── src/
│   │   ├── components/
│   │   │   ├── HomepageFeatures.js
│   │   │   ├── HomepageFeatures.module.scss
│   │   │   ├── HomepageOfferings.js
│   │   │   ├── HomepageOfferings.module.scss
│   │   │   ├── HomepageTrustedBy.js
│   │   │   ├── HomepageTrustedBy.module.scss
│   │   │   ├── HomepageVideo.js
│   │   │   ├── HomepageVideo.module.scss
│   │   │   ├── HomepageWhyZero.js
│   │   │   └── HomepageWhyZero.module.scss
│   │   ├── css/
│   │   │   └── custom.css
│   │   ├── pages/
│   │   │   ├── docs/
│   │   │   │   ├── index.js
│   │   │   │   └── zero/
│   │   │   │       └── index.js
│   │   │   ├── index.js
│   │   │   └── index.module.scss
│   │   └── theme/
│   │       └── DocSidebar/
│   │           ├── index.js
│   │           └── styles.module.css
│   └── static/
│       └── .nojekyll
├── go.mod
├── go.sum
├── internal/
│   ├── apply/
│   │   ├── apply.go
│   │   └── apply_test.go
│   ├── condition/
│   │   ├── condition.go
│   │   └── condition_test.go
│   ├── config/
│   │   ├── moduleconfig/
│   │   │   └── module_config.go
│   │   └── projectconfig/
│   │       ├── init.go
│   │       ├── init_test.go
│   │       ├── project_config.go
│   │       └── project_config_test.go
│   ├── constants/
│   │   └── constants.go
│   ├── generate/
│   │   ├── generate_modules.go
│   │   └── generate_test.go
│   ├── init/
│   │   ├── custom-prompts.go
│   │   ├── debug.test
│   │   ├── init.go
│   │   ├── prompts.go
│   │   └── prompts_test.go
│   ├── module/
│   │   ├── module.go
│   │   ├── module_internal_test.go
│   │   └── module_test.go
│   ├── registry/
│   │   ├── registry.go
│   │   └── registry_test.go
│   ├── util/
│   │   └── util.go
│   └── vcs/
│       └── create-git-repos.go
├── main.go
├── pkg/
│   ├── credentials/
│   │   ├── credentials.go
│   │   └── credentials_test.go
│   └── util/
│       ├── exit/
│       │   └── exit.go
│       ├── flog/
│       │   └── log.go
│       └── fs/
│           ├── fs.go
│           └── fs_test.go
├── registry.yaml
├── tests/
│   ├── integration/
│   │   └── ci/
│   │       └── ci_test.go
│   └── test_data/
│       ├── apply/
│       │   ├── project1/
│       │   │   ├── Makefile
│       │   │   └── zero-module.yml
│       │   ├── project2/
│       │   │   ├── Makefile
│       │   │   ├── check.sh
│       │   │   └── zero-module.yml
│       │   └── zero-project.yml
│       ├── apply-failing/
│       │   ├── project1/
│       │   │   ├── Makefile
│       │   │   ├── project.out
│       │   │   └── zero-module.yml
│       │   ├── project2/
│       │   │   ├── Makefile
│       │   │   ├── project.out
│       │   │   └── zero-module.yml
│       │   ├── project3/
│       │   │   ├── Makefile
│       │   │   ├── check.sh
│       │   │   ├── project.out
│       │   │   └── zero-module.yml
│       │   └── zero-project.yml
│       ├── aws/
│       │   └── mock_credentials.yml
│       ├── ci/
│       │   └── expected/
│       │       ├── .circleci/
│       │       │   └── config.yml
│       │       ├── .travis.yml
│       │       └── Jenkinsfile
│       ├── configs/
│       │   ├── commit0_submodules.yml
│       │   ├── credentials.yml
│       │   └── zero-basic.yml
│       ├── generate/
│       │   ├── file_to_template.txt
│       │   └── zero-module.yml
│       ├── modules/
│       │   ├── ci/
│       │   │   ├── config1.yml
│       │   │   ├── dir/
│       │   │   │   └── config2.yml
│       │   │   └── zero-module.yml
│       │   └── no-version-constraint/
│       │       └── zero-module.yml
│       └── projectconfig/
│           └── zero-project.yml
└── version/
    └── version.go
Download .txt
SYMBOL INDEX (212 symbols across 43 files)

FILE: cmd/apply.go
  function init (line 16) | func init() {

FILE: cmd/check.go
  function init (line 15) | func init() {
  type requirement (line 19) | type requirement struct
  type versionError (line 28) | type versionError struct
    method Error (line 38) | func (e *versionError) Error() string {
  type commandError (line 32) | type commandError struct
    method Error (line 42) | func (e *commandError) Error() string {
  function printErrors (line 46) | func printErrors(errors []commandError) {
  function getSemver (line 66) | func getSemver(req requirement, out []byte) (*semver.Version, error) {
  function checkSemver (line 95) | func checkSemver(req requirement, actualVersion *semver.Version) bool {

FILE: cmd/create.go
  function init (line 22) | func init() {
  function Create (line 37) | func Create(dir string, createConfigPath string) {

FILE: cmd/init.go
  function init (line 16) | func init() {

FILE: cmd/version.go
  function init (line 10) | func init() {

FILE: cmd/zero.go
  function Execute (line 17) | func Execute() {

FILE: doc-site/src/components/HomepageFeatures.js
  function HomepageFeatures (line 56) | function HomepageFeatures() {

FILE: doc-site/src/components/HomepageOfferings.js
  function FeaturedOfferings (line 195) | function FeaturedOfferings() {

FILE: doc-site/src/components/HomepageTrustedBy.js
  function TrustedByCarousel (line 37) | function TrustedByCarousel() {

FILE: doc-site/src/components/HomepageVideo.js
  function FeatureVideo (line 4) | function FeatureVideo () {

FILE: doc-site/src/components/HomepageWhyZero.js
  function FeatureWhyZero (line 55) | function FeatureWhyZero () {

FILE: doc-site/src/pages/index.js
  function HomepageHeader (line 13) | function HomepageHeader() {
  function HomePageCallToAction (line 23) | function HomePageCallToAction () {
  function Home (line 33) | function Home() {

FILE: doc-site/src/theme/DocSidebar/index.js
  constant MOBILE_TOGGLE_SIZE (line 21) | const MOBILE_TOGGLE_SIZE = 24;
  function usePrevious (line 23) | function usePrevious(value) {
  function DocSidebarItem (line 57) | function DocSidebarItem(props) {
  function DocSidebarItemCategory (line 68) | function DocSidebarItemCategory({
  function DocSidebarItemLink (line 159) | function DocSidebarItemLink({
  function useShowAnnouncementBar (line 189) | function useShowAnnouncementBar() {
  function useResponsiveSidebar (line 202) | function useResponsiveSidebar() {
  function HideableSidebarButton (line 228) | function HideableSidebarButton({onClick}) {
  function ResponsiveSidebarButton (line 252) | function ResponsiveSidebarButton({responsiveSidebarOpened, onClick}) {
  function DocSidebar (line 290) | function DocSidebar({

FILE: internal/apply/apply.go
  function Apply (line 24) | func Apply(rootDir string, configPath string, environments []string) err...
  function modulesWalkCmd (line 74) | func modulesWalkCmd(lifecycleName string, dir string, projectConfig *pro...
  function getModuleOperationCommand (line 137) | func getModuleOperationCommand(mod moduleconfig.ModuleConfig, operation ...
  function promptEnvironments (line 168) | func promptEnvironments() []string {
  function validateEnvironments (line 188) | func validateEnvironments(applyEnvironments []string) {

FILE: internal/apply/apply_test.go
  function TestApply (line 15) | func TestApply(t *testing.T) {
  function setupTmpDir (line 60) | func setupTmpDir(t *testing.T, exampleDirPath string) string {

FILE: internal/condition/condition.go
  function Perform (line 31) | func Perform(cond projectconfig.Condition, mod projectconfig.Module) {
  function ignoreFile (line 50) | func ignoreFile(paths []string, mod projectconfig.Module) {

FILE: internal/condition/condition_test.go
  function testSetup (line 13) | func testSetup(paramKey, paramValue string) (string, projectconfig.Modul...
  function TestPerformIgnoreFileConditionNotMet (line 34) | func TestPerformIgnoreFileConditionNotMet(t *testing.T) {
  function TestPerformIgnoreFileConditionMet (line 55) | func TestPerformIgnoreFileConditionMet(t *testing.T) {

FILE: internal/config/moduleconfig/module_config.go
  type ModuleConfig (line 21) | type ModuleConfig struct
    method collectMissing (line 108) | func (cfg ModuleConfig) collectMissing() []string {
    method GetParamEnvVarTranslationMap (line 119) | func (cfg ModuleConfig) GetParamEnvVarTranslationMap() map[string]stri...
  type ModuleCommands (line 34) | type ModuleCommands struct
  function checkVersionAgainstConstrains (line 40) | func checkVersionAgainstConstrains(vc VersionConstraints, versionString ...
  function ValidateZeroVersion (line 51) | func ValidateZeroVersion(mc ModuleConfig) bool {
  type Parameter (line 67) | type Parameter struct
  type Condition (line 82) | type Condition struct
  type Validate (line 90) | type Validate struct
  type TemplateConfig (line 96) | type TemplateConfig struct
  type VersionConstraints (line 103) | type VersionConstraints struct
    method UnmarshalYAML (line 280) | func (semVer *VersionConstraints) UnmarshalYAML(unmarshal func(interfa...
  function LoadModuleConfig (line 130) | func LoadModuleConfig(filePath string) (ModuleConfig, error) {
  function findMissing (line 176) | func findMissing(obj reflect.Value, path, metadata string, missing *[]st...
  function SummarizeParameters (line 236) | func SummarizeParameters(module ModuleConfig, allParams map[string]strin...
  function SummarizeConditions (line 255) | func SummarizeConditions(module ModuleConfig) []projectconfig.Condition {
  function GetFirstConditionElseValue (line 270) | func GetFirstConditionElseValue(parameter Parameter) string {

FILE: internal/config/projectconfig/init.go
  constant zeroProjectConfigTemplate (line 16) | zeroProjectConfigTemplate = `
  function SetRootDir (line 31) | func SetRootDir(dir string) {
  function CreateProjectConfigFile (line 36) | func CreateProjectConfigFile(dir string, projectName string, projectCont...
  function getProjectFileContent (line 52) | func getProjectFileContent(projectConfig ZeroProjectConfig) (string, err...

FILE: internal/config/projectconfig/init_test.go
  function TestCreateProjectConfigFile (line 15) | func TestCreateProjectConfigFile(t *testing.T) {

FILE: internal/config/projectconfig/project_config.go
  constant GraphRootName (line 16) | GraphRootName = "graphRoot"
  type ZeroProjectConfig (line 18) | type ZeroProjectConfig struct
    method Print (line 81) | func (c *ZeroProjectConfig) Print() {
    method GetDAG (line 86) | func (c *ZeroProjectConfig) GetDAG() dag.AcyclicGraph {
  type Modules (line 25) | type Modules
  type Module (line 27) | type Module struct
  function ReadVendorCredentialsFromModule (line 37) | func ReadVendorCredentialsFromModule(m Module, vendor string) (error, st...
  type Parameters (line 52) | type Parameters
  type Condition (line 54) | type Condition struct
  type Files (line 61) | type Files struct
  function LoadConfig (line 67) | func LoadConfig(filePath string) *ZeroProjectConfig {
  function NewModule (line 108) | func NewModule(parameters Parameters, directory string, repository strin...

FILE: internal/config/projectconfig/project_config_test.go
  function TestLoadConfig (line 17) | func TestLoadConfig(t *testing.T) {
  function eksGoReactSampleModules (line 40) | func eksGoReactSampleModules() projectconfig.Modules {
  function validConfigContent (line 49) | func validConfigContent() string {
  function TestProjectConfigModuleGraph (line 81) | func TestProjectConfigModuleGraph(t *testing.T) {

FILE: internal/constants/constants.go
  constant TmpRegistryYml (line 4) | TmpRegistryYml    = "tmp/registry.yaml"
  constant TemplatesDir (line 5) | TemplatesDir      = "tmp/templates"
  constant ZeroProjectYml (line 6) | ZeroProjectYml    = "zero-project.yml"
  constant ZeroModuleYml (line 7) | ZeroModuleYml     = "zero-module.yml"
  constant ZeroHomeDirectory (line 8) | ZeroHomeDirectory = ".zero"
  constant IgnoredPaths (line 9) | IgnoredPaths      = "(?i)zero.module.yml|.git/"
  constant TemplateExtn (line 10) | TemplateExtn      = ".tmpl"
  constant MaxPnameLength (line 14) | MaxPnameLength     = 16
  constant MaxOnameLength (line 15) | MaxOnameLength     = 39
  constant RegexValidation (line 16) | RegexValidation    = "regex"
  constant FunctionValidation (line 17) | FunctionValidation = "function"
  constant ZeroReleaseURL (line 18) | ZeroReleaseURL     = "https://github.com/commitdev/zero/releases"

FILE: internal/generate/generate_modules.go
  function Generate (line 26) | func Generate(projectConfig projectconfig.ZeroProjectConfig, overwriteFi...
  type fileConfig (line 74) | type fileConfig struct
  function sortFileType (line 81) | func sortFileType(moduleDir string, outputDir string, overwrite bool) ([...
  function getAllFilePathsInDirectory (line 143) | func getAllFilePathsInDirectory(moduleDir string) ([]string, error) {
  function executeTemplates (line 161) | func executeTemplates(templates []*fileConfig, data interface{}, delimit...
  function copyBinFiles (line 211) | func copyBinFiles(binTypeFiles []*fileConfig) {

FILE: internal/generate/generate_test.go
  constant baseTestFixturesDir (line 14) | baseTestFixturesDir = "../../tests/test_data/generate/"
  function setupTeardown (line 16) | func setupTeardown(t *testing.T) (func(t *testing.T), string) {
  function TestGenerateModules (line 25) | func TestGenerateModules(t *testing.T) {

FILE: internal/init/custom-prompts.go
  function CustomPromptHandler (line 14) | func CustomPromptHandler(promptType string, params map[string]string) er...
  function promptAWSProfilePicker (line 29) | func promptAWSProfilePicker(params map[string]string) error {

FILE: internal/init/init.go
  function Init (line 20) | func Init(outDir, localModulePath, registryFilePath string) *projectconf...
  function loadAllModules (line 84) | func loadAllModules(moduleSources []string) (map[string]moduleconfig.Mod...
  function getProjectNamePrompt (line 108) | func getProjectNamePrompt() PromptHandler {
  function getProjectPrompts (line 121) | func getProjectPrompts(projectName string, modules map[string]moduleconf...
  function chooseCloudProvider (line 166) | func chooseCloudProvider(projectConfig *projectconfig.ZeroProjectConfig) {
  function chooseStack (line 183) | func chooseStack(reg registry.Registry) []string {
  function defaultProjConfig (line 198) | func defaultProjConfig() projectconfig.ZeroProjectConfig {

FILE: internal/init/prompts.go
  constant cyanArrow (line 23) | cyanArrow = "\033[36m\U000025B6\033[0m"
  constant greenCheckMark (line 24) | greenCheckMark = "\033[32m\U00002714\033[0m"
  constant awsPickProfile (line 26) | awsPickProfile = "Existing AWS Profiles"
  constant awsManualInputCredentials (line 27) | awsManualInputCredentials = "Enter my own AWS credentials"
  type PromptHandler (line 30) | type PromptHandler struct
    method RunPrompt (line 144) | func (p PromptHandler) RunPrompt(projectParams map[string]string, envV...
  type CredentialPrompts (line 37) | type CredentialPrompts struct
  type CustomConditionSignature (line 43) | type CustomConditionSignature
  function NoCondition (line 46) | func NoCondition(map[string]string) bool {
  function KeyMatchCondition (line 51) | func KeyMatchCondition(key string, value string) CustomConditionSignature {
  function NoValidation (line 58) | func NoValidation(string) error {
  function SpecificValueValidation (line 63) | func SpecificValueValidation(values ...string) func(string) error {
  function ValidateAKID (line 75) | func ValidateAKID(input string) error {
  function ValidateSAK (line 85) | func ValidateSAK(input string) error {
  function ValidateProjectName (line 95) | func ValidateProjectName(input string) error {
  function ValidateOrganizationName (line 109) | func ValidateOrganizationName(input string) error {
  constant infoBoxHeight (line 123) | infoBoxHeight = 4
  function showInfoBox (line 128) | func showInfoBox(infoText string) {
  function promptParameter (line 193) | func promptParameter(prompt PromptHandler) (error, string) {
  function executeCmd (line 238) | func executeCmd(command string, envVars map[string]string, envVarTransla...
  function sanitizeParameterValue (line 253) | func sanitizeParameterValue(str string) string {
  function PromptModuleParams (line 259) | func PromptModuleParams(moduleConfig moduleconfig.ModuleConfig, paramete...
  function promptAllModules (line 304) | func promptAllModules(modules map[string]moduleconfig.ModuleConfig, proj...
  function availableProjectContext (line 318) | func availableProjectContext(projectConfig *projectconfig.ZeroProjectCon...
  function paramConditionsMapper (line 325) | func paramConditionsMapper(conditions []moduleconfig.Condition) CustomCo...
  function conditionHandler (line 344) | func conditionHandler(cond moduleconfig.Condition) CustomConditionSignat...
  function appendToSet (line 353) | func appendToSet(set []string, toAppend []string) []string {
  function listToPromptOptions (line 362) | func listToPromptOptions(list []string) yaml.MapSlice {

FILE: internal/init/prompts_test.go
  function TestGetParam (line 13) | func TestGetParam(t *testing.T) {
  function TestValidateProjectNam (line 198) | func TestValidateProjectNam(t *testing.T) {

FILE: internal/module/module.go
  function FetchModule (line 21) | func FetchModule(source string, wg *sync.WaitGroup) {
  function ParseModuleConfig (line 36) | func ParseModuleConfig(source string) (moduleconfig.ModuleConfig, error) {
  function GetSourceDir (line 45) | func GetSourceDir(source string) string {
  function IsLocal (line 57) | func IsLocal(source string) bool {
  function withPWD (line 71) | func withPWD(pwd string) func(*getter.Client) error {

FILE: internal/module/module_internal_test.go
  function TestIsLocal (line 7) | func TestIsLocal(t *testing.T) {

FILE: internal/module/module_test.go
  function TestGetSourceDir (line 15) | func TestGetSourceDir(t *testing.T) {
  function TestParseModuleConfig (line 32) | func TestParseModuleConfig(t *testing.T) {
  function TestModuleWithNoVersionConstraint (line 150) | func TestModuleWithNoVersionConstraint(t *testing.T) {
  function findParameter (line 167) | func findParameter(params []moduleconfig.Parameter, field string) (modul...

FILE: internal/registry/registry.go
  type Registry (line 12) | type Registry
  type Stack (line 14) | type Stack struct
  function GetRegistry (line 19) | func GetRegistry(localModulePath, registryFilePath string) (Registry, er...
  function GetModulesByName (line 46) | func GetModulesByName(registry Registry, name string) []string {
  function AvailableLabels (line 55) | func AvailableLabels(registry Registry) []string {

FILE: internal/registry/registry_test.go
  function TestAvailableLabels (line 10) | func TestAvailableLabels(t *testing.T) {
  function TestGetModulesByName (line 26) | func TestGetModulesByName(t *testing.T) {
  function testRegistry (line 38) | func testRegistry() registry.Registry {

FILE: internal/util/util.go
  function CreateDirIfDoesNotExist (line 25) | func CreateDirIfDoesNotExist(path string) error {
  function CleanGoIdentifier (line 33) | func CleanGoIdentifier(identifier string) string {
  function GetCwd (line 45) | func GetCwd() string {
  function ExecuteCommand (line 55) | func ExecuteCommand(cmd *exec.Cmd, pathPrefix string, envars []string, s...
  function ExecuteCommandOutput (line 123) | func ExecuteCommandOutput(cmd *exec.Cmd, pathPrefix string, envars []str...
  function AppendProjectEnvToCmdEnv (line 145) | func AppendProjectEnvToCmdEnv(envMap map[string]string, envList []string...
  function IndentString (line 160) | func IndentString(content string, spaces int) string {
  function ItemInSlice (line 169) | func ItemInSlice(slice []string, target string) bool {
  function ReflectStructValueIntoMap (line 187) | func ReflectStructValueIntoMap(resource interface{}, tagName string, par...
  function parseTag (line 202) | func parseTag(tag string) (string, string) {

FILE: internal/vcs/create-git-repos.go
  function InitializeRepository (line 15) | func InitializeRepository(repositoryUrl string, githubApiKey string) {
  function parseRepositoryUrl (line 64) | func parseRepositoryUrl(repositoryUrl string) (string, string, error) {
  constant createPersonalRepositoryMutation (line 80) | createPersonalRepositoryMutation = `mutation ($repoName: String!, $repoD...
  constant createOrganizationRepositoryMutation (line 92) | createOrganizationRepositoryMutation = `mutation ($repoName: String!, $r...
  function createRepository (line 106) | func createRepository(request *graphql.Request) error {
  constant getOrganizationQuery (line 116) | getOrganizationQuery = `query ($ownerName: String!) {
  type organizationQueryResponse (line 122) | type organizationQueryResponse struct
  function isOrganizationOwned (line 130) | func isOrganizationOwned(ownerName string, githubApiKey string) (bool, s...
  type initialCommands (line 151) | type initialCommands struct
  function getInitDefaultBranch (line 159) | func getInitDefaultBranch() string {
  function doInitialCommit (line 173) | func doInitialCommit(ownerName string, repositoryName string) error {

FILE: main.go
  function main (line 7) | func main() {

FILE: pkg/credentials/credentials.go
  type AWSResourceConfig (line 14) | type AWSResourceConfig struct
  function awsCredsPath (line 19) | func awsCredsPath() string {
  function fetchAWSConfig (line 27) | func fetchAWSConfig(awsPath string, profileName string) (error, AWSResou...
  function FillAWSProfile (line 41) | func FillAWSProfile(pathToCredentialsFile string, profileName string, pa...
  function GetAWSProfiles (line 55) | func GetAWSProfiles() ([]string, error) {

FILE: pkg/credentials/credentials_test.go
  function TestFillAWSProfileCredentials (line 10) | func TestFillAWSProfileCredentials(t *testing.T) {

FILE: pkg/util/exit/exit.go
  constant CodeOK (line 11) | CodeOK = 0
  constant CodeError (line 14) | CodeError = 1
  constant CodeFatal (line 17) | CodeFatal = 2
  function Fatal (line 21) | func Fatal(format string, a ...interface{}) {
  function Error (line 27) | func Error(format string, a ...interface{}) {
  function OK (line 33) | func OK(format string, a ...interface{}) {

FILE: pkg/util/flog/log.go
  constant LogEnvVariable (line 12) | LogEnvVariable = "LOG_LEVEL"
  constant defaultLogLevel (line 13) | defaultLogLevel = "info"
  function getLogger (line 23) | func getLogger() *logrus.Logger {
  function Infof (line 37) | func Infof(format string, a ...interface{}) {
  function Debugf (line 42) | func Debugf(format string, a ...interface{}) {
  function Guidef (line 48) | func Guidef(format string, a ...interface{}) {
  function Successf (line 53) | func Successf(format string, a ...interface{}) {
  function Warnf (line 58) | func Warnf(format string, a ...interface{}) {
  function Errorf (line 63) | func Errorf(format string, a ...interface{}) {
  type InfoFormatter (line 68) | type InfoFormatter struct
    method Format (line 71) | func (f *InfoFormatter) Format(entry *logrus.Entry) ([]byte, error) {

FILE: pkg/util/fs/fs.go
  function CreateDirs (line 12) | func CreateDirs(dirPaths ...string) error {
  function FileExists (line 23) | func FileExists(path string) (bool, error) {
  function ReplacePath (line 41) | func ReplacePath(p, old, new string) string {
  function PrependPath (line 46) | func PrependPath(filepath string, prefix string) string {

FILE: pkg/util/fs/fs_test.go
  function TestReplacePath (line 17) | func TestReplacePath(t *testing.T) {
  function TestPrependPath (line 41) | func TestPrependPath(t *testing.T) {
Condensed preview — 126 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (351K chars).
[
  {
    "path": ".circleci/config.yml",
    "chars": 5308,
    "preview": "---\nversion: 2.1\norbs:\n  slack-message: commitdev/slack-message@0.0.3\n  version-tag: commitdev/version-tag@0.0.3\n\nvariab"
  },
  {
    "path": ".dockerignore",
    "chars": 73,
    "preview": "Dockerfile\nREADME.md\n.history/\n.travis.yml\n.gitignore\n.git\nexample/\ntmp/\n"
  },
  {
    "path": ".github/workflows/codeql-analysis.yml",
    "chars": 1357,
    "preview": "name: \"CodeQL\"\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    # The branches below must be a subset of the branch"
  },
  {
    "path": ".github/workflows/config.yml",
    "chars": 475,
    "preview": "on:\n  pull_request:\n    branches:\n      - main\n\njobs:\n  unit_test:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: a"
  },
  {
    "path": ".github/workflows/doc-site.yml",
    "chars": 2642,
    "preview": "## The is a combination of sites where\n## Zero serves on the root of the domain /\n## and module serves on /docs/modules/"
  },
  {
    "path": ".gitignore",
    "chars": 108,
    "preview": "main-packr.go\npackrd\n/zero\n.history/\ntmp\n.vscode\nexample/\ntest-reports/\n.circleci/config-compiled.yml\n.idea/"
  },
  {
    "path": ".goreleaser.yml",
    "chars": 1619,
    "preview": "# http://goreleaser.com\nbefore:\n  hooks:\n    - go mod download\nbuilds:\n- env:\n  - CGO_ENABLED=0\n  ldflags:\n    - -X gith"
  },
  {
    "path": "CONTRIBUTING.md",
    "chars": 5320,
    "preview": "# Contributing to Zero\n\nThanks for your interest in Zero!\n\nZero is a fully open source project started by [Commit](https"
  },
  {
    "path": "Dockerfile",
    "chars": 1459,
    "preview": "FROM golang:1.12.12-alpine3.10 as builder\n\nENV GO111MODULE=on\nENV TERRAFORM_VERSION=0.12.13\n\nRUN apk add --update --no-c"
  },
  {
    "path": "LICENSE",
    "chars": 16725,
    "preview": "Mozilla Public License Version 2.0\n==================================\n\n1. Definitions\n--------------\n\n1.1. \"Contributor\""
  },
  {
    "path": "LICENSE.spdx",
    "chars": 170,
    "preview": "SPDXVersion: SPDX-2.1\nDataLicense: CC0-1.0\nPackageName: Zero\nPackageOriginator: Commit\nPackageHomePage: https://github.c"
  },
  {
    "path": "Makefile",
    "chars": 1024,
    "preview": "VERSION = 0.0.1\nBUILD ?=$(shell git rev-parse --short HEAD)\nPKG ?=github.com/commitdev/zero\nBUILD_ARGS=-v -trimpath -ldf"
  },
  {
    "path": "README.md",
    "chars": 10975,
    "preview": "[![Tests](https://circleci.com/gh/commitdev/zero.svg?style=shield)](https://app.circleci.com/pipelines/github/commitdev/"
  },
  {
    "path": "cmd/apply.go",
    "chars": 1007,
    "preview": "package cmd\n\nimport (\n\t\"log\"\n\t\"os\"\n\n\t\"github.com/commitdev/zero/internal/apply\"\n\t\"github.com/commitdev/zero/internal/con"
  },
  {
    "path": "cmd/check.go",
    "chars": 5871,
    "preview": "package cmd\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"os/exec\"\n\t\"regexp\"\n\t\"strings\"\n\t\"text/tabwriter\"\n\n\t\"github.com/coreos/go-semver/semv"
  },
  {
    "path": "cmd/create.go",
    "chars": 2018,
    "preview": "package cmd\n\nimport (\n\t\"fmt\"\n\t\"path\"\n\t\"strings\"\n\n\t\"github.com/commitdev/zero/internal/config/projectconfig\"\n\t\"github.com"
  },
  {
    "path": "cmd/init.go",
    "chars": 1634,
    "preview": "package cmd\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/commitdev/zero/internal/config/projectconfig\"\n\tinitPrompts \"github.com/commit"
  },
  {
    "path": "cmd/version.go",
    "chars": 391,
    "preview": "package cmd\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/commitdev/zero/version\"\n\t\"github.com/spf13/cobra\"\n)\n\nfunc init() {\n\trootCmd.A"
  },
  {
    "path": "cmd/zero.go",
    "chars": 680,
    "preview": "package cmd\n\nimport (\n\t\"os\"\n\n\t\"github.com/spf13/cobra\"\n)\n\nvar rootCmd = &cobra.Command{\n\tUse:   \"zero\",\n\tShort: \"zero ge"
  },
  {
    "path": "doc-site/.gitignore",
    "chars": 303,
    "preview": "# Dependencies\n/node_modules\n\n# Production\n/build\n\n# Generated files\n.docusaurus\n.cache-loader\n\n# Misc\n.DS_Store\n.env.lo"
  },
  {
    "path": "doc-site/README.md",
    "chars": 743,
    "preview": "# Website\n\nThis website is built using [Docusaurus 2](https://docusaurus.io/), a modern static website generator.\n\n## In"
  },
  {
    "path": "doc-site/babel.config.js",
    "chars": 89,
    "preview": "module.exports = {\n  presets: [require.resolve('@docusaurus/core/lib/babel/preset')],\n};\n"
  },
  {
    "path": "doc-site/docs/about/opensource.md",
    "chars": 627,
    "preview": "---\ntitle: Opensource\nsidebar_label: Opensource\nsidebar_position: 2\n---\n\n\n## Contributing to Zero\n\nZero welcomes collabo"
  },
  {
    "path": "doc-site/docs/about/overview.md",
    "chars": 7939,
    "preview": "---\ntitle: Overview\nsidebar_label: Overview\nsidebar_position: 1\n---\n\n\n## What is Zero\n\nZero is an open source tool which"
  },
  {
    "path": "doc-site/docs/about/real-world-usage.md",
    "chars": 3471,
    "preview": "---\ntitle: Real-world Usage Scenarios\nsidebar_label: Real-world Usage\nsidebar_position: 4\n---\n\n## Developing and deployi"
  },
  {
    "path": "doc-site/docs/about/roadmap.md",
    "chars": 91,
    "preview": "---\ntitle: Roadmap\nsidebar_label: Roadmap\nsidebar_position: 5\n---\n\n:::info\nComing soon\n:::\n"
  },
  {
    "path": "doc-site/docs/about/technology-choices.md",
    "chars": 13234,
    "preview": "---\ntitle: Technology Choices\nsidebar_label: Technology Choices\nsidebar_position: 4\n---\n\nAs we add features to Zero, we "
  },
  {
    "path": "doc-site/docs/concepts/core-concepts.md",
    "chars": 1632,
    "preview": "---\ntitle: Core Concepts\nsidebar_label: Core Concepts\nsidebar_position: 1\n---\n\n## Project\nA project defines a set of **m"
  },
  {
    "path": "doc-site/docs/concepts/project-life-cycle.md",
    "chars": 2098,
    "preview": "---\ntitle: Project Life Cycle\nsidebar_label: Project Life Cycle\nsidebar_position: 2\n---\n\n## zero init\nThe goal of the `i"
  },
  {
    "path": "doc-site/docs/getting-started/installation.md",
    "chars": 727,
    "preview": "---\ntitle: Installation\nsidebar_label: Installation\nsidebar_position: 1\n---\n\n## How to Install and Configure Zero\n\nThere"
  },
  {
    "path": "doc-site/docs/getting-started/prerequisites.md",
    "chars": 2992,
    "preview": "---\ntitle: Prerequisites\nsidebar_label: Prerequisites\nsidebar_position: 2\n---\n\n\nUsing Zero to spin up your infrastructur"
  },
  {
    "path": "doc-site/docs/getting-started/zero-apply.md",
    "chars": 1967,
    "preview": "---\ntitle: zero apply\nsidebar_label: zero apply\nsidebar_position: 5\n---\n\nThe `zero apply` command takes the templated mo"
  },
  {
    "path": "doc-site/docs/getting-started/zero-create.md",
    "chars": 1420,
    "preview": "---\ntitle: zero create\nsidebar_label: zero create\nsidebar_position: 4\n---\n\nThe `zero create` command renders the infrast"
  },
  {
    "path": "doc-site/docs/getting-started/zero-init.md",
    "chars": 1988,
    "preview": "---\ntitle: zero init\nsidebar_label: zero init\nsidebar_position: 3\n---\n\n\nThe `zero init` command creates a new project an"
  },
  {
    "path": "doc-site/docs/reference/learning-resources.md",
    "chars": 899,
    "preview": "---\ntitle: Learning Resources\nsidebar_label: Learning Resources\nsidebar_position: 3\n---\n\n\n### AWS\n- [Getting started wit"
  },
  {
    "path": "doc-site/docs/reference/module-definition.md",
    "chars": 9248,
    "preview": "---\ntitle: Module Definition\nsidebar_label: Module Definition\nsidebar_position: 1\n---\n\n### `zero-module.yml`\nThis file i"
  },
  {
    "path": "doc-site/docs/reference/project-definition.md",
    "chars": 2743,
    "preview": "---\ntitle: Project Definition\nsidebar_label: Project Definition\nsidebar_position: 1\n---\n\n### `zero-project.yml`\nEach pro"
  },
  {
    "path": "doc-site/docs/reference/working-on-zero.md",
    "chars": 616,
    "preview": "---\ntitle: Working on Zero\nsidebar_label: Working on Zero\nsidebar_position: 3\n---\n\n### Building the tool\n\n```shell\n$ git"
  },
  {
    "path": "doc-site/docusaurus.config.js",
    "chars": 2557,
    "preview": "/** @type {import('@docusaurus/types').DocusaurusConfig} */\nconst { stylesheets, misc } = require('@commitdev/zero-doc-s"
  },
  {
    "path": "doc-site/package.json",
    "chars": 1087,
    "preview": "{\n  \"name\": \"doc-site\",\n  \"version\": \"0.0.0\",\n  \"private\": true,\n  \"scripts\": {\n    \"docusaurus\": \"docusaurus\",\n    \"sta"
  },
  {
    "path": "doc-site/sidebars.js",
    "chars": 587,
    "preview": "const config = require('./docusaurus.config');\nconst { sidebarsNavModules } = require('@commitdev/zero-doc-site-common-e"
  },
  {
    "path": "doc-site/src/components/HomepageFeatures.js",
    "chars": 2129,
    "preview": "import React from 'react';\nimport clsx from 'clsx';\nimport styles from './HomepageFeatures.module.scss';\n\nconst FeatureL"
  },
  {
    "path": "doc-site/src/components/HomepageFeatures.module.scss",
    "chars": 716,
    "preview": ".features {\n  align-items: center;\n  @media only screen and (max-width: 641px) {\n    padding-left: 1rem;\n    padding-rig"
  },
  {
    "path": "doc-site/src/components/HomepageOfferings.js",
    "chars": 5099,
    "preview": "import React, { useState } from 'react';\nimport styles from './HomepageOfferings.module.scss';\n\nconst offerings = [\n  {\n"
  },
  {
    "path": "doc-site/src/components/HomepageOfferings.module.scss",
    "chars": 3379,
    "preview": ".offerings_container{\n  text-align: center;\n  padding: 9rem 8rem 5rem;\n  margin: 0 auto;\n  min-height: 53rem;\n  backgrou"
  },
  {
    "path": "doc-site/src/components/HomepageTrustedBy.js",
    "chars": 894,
    "preview": "import React from 'react';\nimport styles from './HomepageTrustedBy.module.scss';\n\nconst trustedByData = [\n  {\n    img: \""
  },
  {
    "path": "doc-site/src/components/HomepageTrustedBy.module.scss",
    "chars": 573,
    "preview": "h3.title {\n  letter-spacing: 0.1rem;\n  text-align: center;\n  font-weight: 400;\n  font-family: \"Montserrat\";\n}\n\n.trusted "
  },
  {
    "path": "doc-site/src/components/HomepageVideo.js",
    "chars": 422,
    "preview": "import React from 'react';\nimport styles from './HomepageVideo.module.scss';\n\nexport default function FeatureVideo () {\n"
  },
  {
    "path": "doc-site/src/components/HomepageVideo.module.scss",
    "chars": 84,
    "preview": ".video {\n  width: 100%;\n  text-align: center;\n\n  iframe {\n    max-width: 65%;\n  }\n}\n"
  },
  {
    "path": "doc-site/src/components/HomepageWhyZero.js",
    "chars": 3130,
    "preview": "import React, { useState } from 'react';\nimport clsx from 'clsx';\nimport styles from './HomepageWhyZero.module.scss';\n\nc"
  },
  {
    "path": "doc-site/src/components/HomepageWhyZero.module.scss",
    "chars": 1676,
    "preview": ".reasons_container{\n  text-align: center;\n  background: white;\n  color: var(--ifm-landing-page-inverse-font-color);\n  @m"
  },
  {
    "path": "doc-site/src/css/custom.css",
    "chars": 5370,
    "preview": "/**\n * Any CSS included here will be global. The classic template\n * bundles Infima by default. Infima is a CSS framewor"
  },
  {
    "path": "doc-site/src/pages/docs/index.js",
    "chars": 138,
    "preview": "import React from 'react';\nimport { Redirect } from 'react-router-dom';\n\nexport default () => <Redirect to=\"/docs/zero/a"
  },
  {
    "path": "doc-site/src/pages/docs/zero/index.js",
    "chars": 138,
    "preview": "import React from 'react';\nimport { Redirect } from 'react-router-dom';\n\nexport default () => <Redirect to=\"/docs/zero/a"
  },
  {
    "path": "doc-site/src/pages/index.js",
    "chars": 2073,
    "preview": "import React from 'react';\nimport clsx from 'clsx';\nimport Layout from '@theme/Layout';\nimport Link from '@docusaurus/Li"
  },
  {
    "path": "doc-site/src/pages/index.module.scss",
    "chars": 1124,
    "preview": "/**\n * CSS files with the .module.css suffix will be treated as CSS modules\n * and scoped locally.\n */\n\n.heroBanner {\n  "
  },
  {
    "path": "doc-site/src/theme/DocSidebar/index.js",
    "chars": 9526,
    "preview": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found i"
  },
  {
    "path": "doc-site/src/theme/DocSidebar/styles.module.css",
    "chars": 3087,
    "preview": "/**\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found i"
  },
  {
    "path": "doc-site/static/.nojekyll",
    "chars": 0,
    "preview": ""
  },
  {
    "path": "go.mod",
    "chars": 1866,
    "preview": "module github.com/commitdev/zero\n\ngo 1.16\n\nrequire (\n\tgithub.com/aws/aws-sdk-go v1.30.12\n\tgithub.com/buger/goterm v1.0.0"
  },
  {
    "path": "go.sum",
    "chars": 60033,
    "preview": "cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=\ncloud.google.com/go v0.34.0/go.mod h1"
  },
  {
    "path": "internal/apply/apply.go",
    "chars": 6573,
    "preview": "package apply\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"path/filepath\"\n\n\t\"log\"\n\t\"os/exec\"\n\t\"path\"\n\t\"strings\"\n\n\t\"github.com/commitdev/"
  },
  {
    "path": "internal/apply/apply_test.go",
    "chars": 2342,
    "preview": "package apply_test\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/commitdev/zero/internal/apply\""
  },
  {
    "path": "internal/condition/condition.go",
    "chars": 1627,
    "preview": "// This module is invoked when we do template rendering during \"zero create.\"\n//\n// Each module can have a \"conditions\" "
  },
  {
    "path": "internal/condition/condition_test.go",
    "chars": 1564,
    "preview": "package condition_test\n\nimport (\n\t\"encoding/base64\"\n\t\"math/rand\"\n\t\"os\"\n\t\"testing\"\n\n\t\"github.com/commitdev/zero/internal/"
  },
  {
    "path": "internal/config/moduleconfig/module_config.go",
    "chars": 9534,
    "preview": "package moduleconfig\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"log\"\n\t\"reflect\"\n\t\"strings\"\n\n\tgoVersion \"github.com/hashic"
  },
  {
    "path": "internal/config/projectconfig/init.go",
    "chars": 2118,
    "preview": "package projectconfig\n\nimport (\n\t\"bytes\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"path\"\n\t\"text/template\"\n\n\t\"github.com/commitdev/zero/inter"
  },
  {
    "path": "internal/config/projectconfig/init_test.go",
    "chars": 1668,
    "preview": "package projectconfig_test\n\nimport (\n\t\"os\"\n\t\"path\"\n\t\"testing\"\n\n\t\"github.com/commitdev/zero/internal/config/projectconfig"
  },
  {
    "path": "internal/config/projectconfig/project_config.go",
    "chars": 3181,
    "preview": "package projectconfig\n\nimport (\n\t\"errors\"\n\t\"io/ioutil\"\n\n\t\"github.com/hashicorp/terraform/dag\"\n\t\"github.com/k0kubun/pp\"\n\t"
  },
  {
    "path": "internal/config/projectconfig/project_config_test.go",
    "chars": 3061,
    "preview": "package projectconfig_test\n\nimport (\n\t\"io/ioutil\"\n\t\"log\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/commitdev/zero/"
  },
  {
    "path": "internal/constants/constants.go",
    "chars": 496,
    "preview": "package constants\n\nconst (\n\tTmpRegistryYml    = \"tmp/registry.yaml\"\n\tTemplatesDir      = \"tmp/templates\"\n\tZeroProjectYml"
  },
  {
    "path": "internal/generate/generate_modules.go",
    "chars": 6073,
    "preview": "package generate\n\nimport (\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"os\"\n\t\"path\"\n\t\"path/filepath\"\n\t\"regexp\"\n\t\"sync\"\n\t\"text/template\"\n\n\t\"gith"
  },
  {
    "path": "internal/generate/generate_test.go",
    "chars": 1201,
    "preview": "package generate_test\n\nimport (\n\t\"io/ioutil\"\n\t\"os\"\n\t\"path/filepath\"\n\t\"testing\"\n\n\t\"github.com/commitdev/zero/internal/con"
  },
  {
    "path": "internal/init/custom-prompts.go",
    "chars": 1321,
    "preview": "package init\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\n\t\"github.com/commitdev/zero/internal/config/moduleconfig\"\n\tproject \"github.com/"
  },
  {
    "path": "internal/init/init.go",
    "chars": 6600,
    "preview": "package init\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path\"\n\t\"sync\"\n\n\t\"github.com/commitdev/zero/internal/config/moduleconfig\"\n\t\"github."
  },
  {
    "path": "internal/init/prompts.go",
    "chars": 12376,
    "preview": "package init\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"log\"\n\t\"os\"\n\t\"os/exec\"\n\t\"regexp\"\n\t\"strings\"\n\n\ttm \"github.com/buger/goterm\"\n\t\"gi"
  },
  {
    "path": "internal/init/prompts_test.go",
    "chars": 5894,
    "preview": "package init_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/commitdev/zero/internal/config/moduleconfig\"\n\t// init is a reserved"
  },
  {
    "path": "internal/module/module.go",
    "chars": 2065,
    "preview": "package module\n\nimport (\n\t\"crypto/md5\"\n\t\"encoding/base64\"\n\t\"io\"\n\t\"log\"\n\t\"path\"\n\t\"regexp\"\n\t\"sync\"\n\n\t\"github.com/commitdev"
  },
  {
    "path": "internal/module/module_internal_test.go",
    "chars": 379,
    "preview": "package module\n\nimport (\n\t\"testing\"\n)\n\nfunc TestIsLocal(t *testing.T) {\n\tsource := \"./tests/test_data/modules\"\n\tres := I"
  },
  {
    "path": "internal/module/module_test.go",
    "chars": 5713,
    "preview": "package module_test\n\nimport (\n\t\"errors\"\n\t\"fmt\"\n\t\"testing\"\n\n\t\"github.com/commitdev/zero/internal/config/moduleconfig\"\n\t\"g"
  },
  {
    "path": "internal/registry/registry.go",
    "chars": 1231,
    "preview": "package registry\n\nimport (\n\t\"io/ioutil\"\n\n\t\"github.com/commitdev/zero/internal/constants\"\n\t\"github.com/hashicorp/go-gette"
  },
  {
    "path": "internal/registry/registry_test.go",
    "chars": 1340,
    "preview": "package registry_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/commitdev/zero/internal/registry\"\n\t\"github.com/stretchr/testify"
  },
  {
    "path": "internal/util/util.go",
    "chars": 5019,
    "preview": "package util\n\n// @TODO split up and move into /pkg directory\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"os\"\n\t\"os"
  },
  {
    "path": "internal/vcs/create-git-repos.go",
    "chars": 6615,
    "preview": "package vcs\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"os/exec\"\n\t\"strings\"\n\n\t\"github.com/commitdev/zero/pkg/util/flog\"\n\t\"github.com/m"
  },
  {
    "path": "main.go",
    "chars": 90,
    "preview": "package main\n\nimport (\n\t\"github.com/commitdev/zero/cmd\"\n)\n\nfunc main() {\n\tcmd.Execute()\n}\n"
  },
  {
    "path": "pkg/credentials/credentials.go",
    "chars": 1922,
    "preview": "package credentials\n\nimport (\n\t\"io/ioutil\"\n\t\"log\"\n\t\"os/user\"\n\t\"path/filepath\"\n\t\"regexp\"\n\n\t\"github.com/aws/aws-sdk-go/aws"
  },
  {
    "path": "pkg/credentials/credentials_test.go",
    "chars": 959,
    "preview": "package credentials_test\n\nimport (\n\t\"testing\"\n\n\t\"github.com/commitdev/zero/pkg/credentials\"\n\t\"github.com/stretchr/testif"
  },
  {
    "path": "pkg/util/exit/exit.go",
    "chars": 707,
    "preview": "package exit\n\nimport (\n\t\"os\"\n\n\t\"github.com/commitdev/zero/pkg/util/flog\"\n)\n\nconst (\n\t// CodeOK indicates successful exec"
  },
  {
    "path": "pkg/util/flog/log.go",
    "chars": 1997,
    "preview": "package flog\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\n\t\"github.com/kyokomi/emoji\"\n\t\"github.com/logrusorgru/aurora\"\n\t\"github.com/sirupsen/"
  },
  {
    "path": "pkg/util/fs/fs.go",
    "chars": 1237,
    "preview": "package fs\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"path\"\n\t\"regexp\"\n\t\"strings\"\n)\n\n// CreateDirs creates directories from the given direc"
  },
  {
    "path": "pkg/util/fs/fs_test.go",
    "chars": 1169,
    "preview": "package fs\n\nimport (\n\t\"testing\"\n)\n\nvar replacePathTest = []struct {\n\tpath string\n\told  string\n\tnew  string\n\tout  string\n"
  },
  {
    "path": "registry.yaml",
    "chars": 307,
    "preview": "- name: EKS + Go + React + Gatsby\n  moduleSources:\n  - /zero-aws-eks-stack\n  - /zero-static-site-gatsby\n  - /zero-backen"
  },
  {
    "path": "tests/integration/ci/ci_test.go",
    "chars": 4125,
    "preview": "package ci_test\n\n// @TODO refactor into new set of integration tests\n// import (\n// \t\"bytes\"\n// \t\"io/ioutil\"\n// \t\"os\"\n//"
  },
  {
    "path": "tests/test_data/apply/project1/Makefile",
    "chars": 180,
    "preview": "current_dir:\n\t@echo \"foo: ${foo}\" > project.out\n\t@echo \"repo: ${REPOSITORY}\" >> project.out\n\t@echo \"envVarName of viaEnv"
  },
  {
    "path": "tests/test_data/apply/project1/zero-module.yml",
    "chars": 290,
    "preview": "name: project1\ndescription: 'project1'\nauthor: 'Commit'\n\ntemplate:\n  strictMode: true\n  delimiters:\n    - \"<%\"\n    - \"%>"
  },
  {
    "path": "tests/test_data/apply/project2/Makefile",
    "chars": 66,
    "preview": "current_dir:\n\t@echo \"baz: ${baz}\" > project.out\n\nsummary:\n\ncheck:\n"
  },
  {
    "path": "tests/test_data/apply/project2/check.sh",
    "chars": 35,
    "preview": "pwd\necho \"custom check\" > check.out"
  },
  {
    "path": "tests/test_data/apply/project2/zero-module.yml",
    "chars": 272,
    "preview": "name: project2\ndescription: 'project2'\nauthor: 'Commit'\ncommands:\n  check: sh check.sh\ntemplate:\n  strictMode: true\n  de"
  },
  {
    "path": "tests/test_data/apply/zero-project.yml",
    "chars": 401,
    "preview": "name: sample_project\n\nmodules:\n    project1:\n        parameters:\n            foo: bar\n            param1: baz\n        fi"
  },
  {
    "path": "tests/test_data/apply-failing/project1/Makefile",
    "chars": 138,
    "preview": "current_dir:\n\t@echo \"foo: ${foo}\" > project.out\n\t@echo \"repo: ${REPOSITORY}\" >> project.out\n\nsummary:\n\ncheck:\n\t@$(error "
  },
  {
    "path": "tests/test_data/apply-failing/project1/project.out",
    "chars": 45,
    "preview": "foo: bar\nrepo: github.com/commitdev/project1\n"
  },
  {
    "path": "tests/test_data/apply-failing/project1/zero-module.yml",
    "chars": 242,
    "preview": "name: project1\ndescription: 'project1'\nauthor: 'Commit'\n\ntemplate:\n  strictMode: true\n  delimiters:\n    - \"<%\"\n    - \"%>"
  },
  {
    "path": "tests/test_data/apply-failing/project2/Makefile",
    "chars": 246,
    "preview": "REQUIRED_BINS := ls nonexisting-binary\n\ncurrent_dir:\n\t@echo \"baz: ${baz}\" > project.out\n\nsummary:\n\ncheck:\n\t$(foreach bin"
  },
  {
    "path": "tests/test_data/apply-failing/project2/project.out",
    "chars": 9,
    "preview": "baz: qux\n"
  },
  {
    "path": "tests/test_data/apply-failing/project2/zero-module.yml",
    "chars": 242,
    "preview": "name: project2\ndescription: 'project2'\nauthor: 'Commit'\n\ntemplate:\n  strictMode: true\n  delimiters:\n    - \"<%\"\n    - \"%>"
  },
  {
    "path": "tests/test_data/apply-failing/project3/Makefile",
    "chars": 63,
    "preview": "REQUIRED_BINS := ls nonexisting-binary\n\ncurrent_dir:\n\nsummary:\n"
  },
  {
    "path": "tests/test_data/apply-failing/project3/check.sh",
    "chars": 44,
    "preview": ">&2 echo \"Check script erroring out\";exit 1;"
  },
  {
    "path": "tests/test_data/apply-failing/project3/project.out",
    "chars": 9,
    "preview": "baz: qux\n"
  },
  {
    "path": "tests/test_data/apply-failing/project3/zero-module.yml",
    "chars": 273,
    "preview": "name: project3\ndescription: 'project3'\nauthor: 'Commit'\n\ncommands:\n  check: sh check.sh\ntemplate:\n  strictMode: true\n  d"
  },
  {
    "path": "tests/test_data/apply-failing/zero-project.yml",
    "chars": 509,
    "preview": "name: sample_project\n\nmodules:\n    project1:\n        parameters:\n            foo: bar\n        files:\n            dir: pr"
  },
  {
    "path": "tests/test_data/aws/mock_credentials.yml",
    "chars": 182,
    "preview": "[default]\naws_access_key_id=MOCK1_ACCESS_KEY\naws_secret_access_key=MOCK1_SECRET_ACCESS_KEY\n\n[foobar]\naws_access_key_id=M"
  },
  {
    "path": "tests/test_data/ci/expected/.circleci/config.yml",
    "chars": 411,
    "preview": "version: 2.1\njobs:\n  build:\n    docker:\n      - image: golang/golang:1.12\n    steps:\n      - checkout\n      - run:\n     "
  },
  {
    "path": "tests/test_data/ci/expected/.travis.yml",
    "chars": 59,
    "preview": "language: go\ngo:\n- 1.12\n\nscripts:\n- make build\n- make test\n"
  },
  {
    "path": "tests/test_data/ci/expected/Jenkinsfile",
    "chars": 736,
    "preview": "pipeline {\n    agent none\n    stages {\n        stage('Build and Test') {\n            parallel {\n                stage('B"
  },
  {
    "path": "tests/test_data/configs/commit0_submodules.yml",
    "chars": 524,
    "preview": "name: hello-world\n\n# Context will populated automatically or could be added manually\ncontext: \n  cognitoPoolID: 123\n  co"
  },
  {
    "path": "tests/test_data/configs/credentials.yml",
    "chars": 220,
    "preview": "another-project:\n    github:\n        accessToken: \"654\"\nmy-project:\n    aws:\n        accessKeyId: AKIAABCD\n        secre"
  },
  {
    "path": "tests/test_data/configs/zero-basic.yml",
    "chars": 529,
    "preview": "name: hello-world\n\n# Context will populated automatically or could be added manually\ncontext: \n  cognitoPoolID: 123\n  co"
  },
  {
    "path": "tests/test_data/generate/file_to_template.txt",
    "chars": 92,
    "preview": "Name is {{.Name}}\nParams.test is {{.Params.test}}\nFiles.Repository is {{.Files.Repository}}\n"
  },
  {
    "path": "tests/test_data/generate/zero-module.yml",
    "chars": 212,
    "preview": "name: test-generate\ndescription: 'generation test module'\nauthor: 'Commit'\n\ntemplate:\n  strictMode: true\n  delimiters:\n "
  },
  {
    "path": "tests/test_data/modules/ci/config1.yml",
    "chars": 19,
    "preview": "content1: {{ .ci }}"
  },
  {
    "path": "tests/test_data/modules/ci/dir/config2.yml",
    "chars": 10,
    "preview": "content2:\n"
  },
  {
    "path": "tests/test_data/modules/ci/zero-module.yml",
    "chars": 1919,
    "preview": "name: \"CI templates\"\ndescription: \"CI description\"\nauthor: \"CI author\"\nicon: \"\"\nthumbnail: \"\"\nzeroVersion: \">= 3.0.0, < "
  },
  {
    "path": "tests/test_data/modules/no-version-constraint/zero-module.yml",
    "chars": 310,
    "preview": "name: \"Test module\"\ndescription: \"a module for testing, with no zero version requirement\"\nauthor: \"Test module author\"\ni"
  },
  {
    "path": "tests/test_data/projectconfig/zero-project.yml",
    "chars": 531,
    "preview": "# Graph shape:\n#    2\n#  /  \\\n# 1    4\n#  \\  /\n#   3 - 5\n\nname: graph_test\n\nmodules:\n    project1:\n        parameters:\n "
  },
  {
    "path": "version/version.go",
    "chars": 131,
    "preview": "package version\n\n// These values are overridden by makefile during build\nvar (\n\tAppVersion = \"SNAPSHOT\"\n\tAppBuild   = \"S"
  }
]

// ... and 1 more files (download for full content)

About this extraction

This page contains the full source code of the commitdev/zero GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 126 files (24.6 MB), approximately 102.0k tokens, and a symbol index with 212 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.

Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.

Copied to clipboard!