├── .devcontainer ├── Dockerfile └── devcontainer.json ├── .gitattributes ├── .github ├── .github │ ├── ISSUE_TEMPLATE │ │ ├── bug_report.md │ │ ├── feature_request.md │ │ └── question.md │ └── PULL_REQUEST_TEMPLATE │ │ └── pull_request_template.md ├── dependabot.yml ├── release-drafter.yml └── workflows │ ├── build_github_action.yml │ ├── github_release_automation.yml │ ├── github_release_link.yml │ └── test_github_action.yml ├── .gitignore ├── .npmrc ├── CODE_OF_CONDUCT.md ├── CONTRIBUTING.md ├── LICENSE ├── README.md ├── action.yml ├── dist └── index.js ├── lib ├── index.js ├── installer.js └── system.js ├── matchers.json ├── package-lock.json ├── package.json ├── src ├── index.ts ├── installer.ts └── system.ts └── tsconfig.json /.devcontainer/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM debian:latest 2 | 3 | # Avoid warnings by switching to noninteractive 4 | ENV DEBIAN_FRONTEND=noninteractive 5 | 6 | ARG USERNAME=vscode 7 | ARG USER_UID=1000 8 | ARG USER_GID=$USER_UID 9 | 10 | # Set to false to skip installing zsh and Oh My ZSH! 11 | ARG INSTALL_ZSH="true" 12 | 13 | # Location and expected SHA for common setup script - SHA generated on release 14 | ARG COMMON_SCRIPT_SOURCE="https://raw.githubusercontent.com/microsoft/vscode-dev-containers/master/script-library/common-debian.sh" 15 | ARG COMMON_SCRIPT_SHA="dev-mode" 16 | 17 | # Configure apt and install packages 18 | RUN apt-get update \ 19 | # 20 | # Install C++ tools 21 | && apt-get install -y --no-install-recommends libssl-dev make cmake build-essential gcc cppcheck valgrind wget ca-certificates apt-utils nano zip unzip \ 22 | # 23 | # Update UID/GID and install deps and tools 24 | && wget -q -O /tmp/common-setup.sh $COMMON_SCRIPT_SOURCE \ 25 | && if [ "$COMMON_SCRIPT_SHA" != "dev-mode" ]; then echo "$COMMON_SCRIPT_SHA /tmp/common-setup.sh" | sha256sum -c - ; fi \ 26 | && /bin/bash /tmp/common-setup.sh "$INSTALL_ZSH" "$USERNAME" "$USER_UID" "$USER_GID" \ 27 | && rm /tmp/common-setup.sh \ 28 | && echo "${USERNAME} ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/010-vscode.conf \ 29 | # 30 | # Clean packages 31 | && apt-get autoremove -y \ 32 | && apt-get clean -y \ 33 | && rm -rf /var/lib/apt/lists/* 34 | 35 | USER $USERNAME 36 | 37 | RUN curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.35.3/install.sh | bash && \ 38 | echo 'export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"' >> ~/.zshrc && \ 39 | echo '[ -s "$NVM_DIR/nvm.sh" ] && \\. "$NVM_DIR/nvm.sh" # This loads nvm' >> ~/.zshrc 40 | 41 | # Switch back to dialog for any ad-hoc use of apt-get 42 | ENV DEBIAN_FRONTEND=dialog 43 | -------------------------------------------------------------------------------- /.devcontainer/devcontainer.json: -------------------------------------------------------------------------------- 1 | // For format details, see https://aka.ms/vscode-remote/devcontainer.json or this file's README at: 2 | // https://github.com/microsoft/vscode-dev-containers/tree/v0.106.0/containers/cpp 3 | { 4 | "name": "Typescript", 5 | "dockerFile": "Dockerfile", 6 | "runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined"], 7 | 8 | // Set *default* container specific settings.json values on container create. 9 | "settings": { 10 | "terminal.integrated.shell.linux": "/bin/zsh" 11 | }, 12 | 13 | // Add the IDs of extensions you want installed when the container is created. 14 | "extensions": [ 15 | "ms-vscode.vscode-typescript-tslint-plugin" 16 | ], 17 | 18 | // Use 'forwardPorts' to make a list of ports inside the container available locally. 19 | // "forwardPorts": [], 20 | 21 | // Use 'postCreateCommand' to run commands after the container is created. 22 | "postCreateCommand": "v version", 23 | 24 | // Uncomment to connect as a non-root user. See https://aka.ms/vscode-remote/containers/non-root. 25 | "remoteUser": "vscode" 26 | 27 | } -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | /.devcontainer/devcontainer.json linguist-language=JSON-with-Comments 2 | -------------------------------------------------------------------------------- /.github/.github/ISSUE_TEMPLATE/bug_report.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Bug report 3 | about: Create a report to help us improve 4 | title: '' 5 | labels: bug 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe the bug** 11 | A clear and concise description of what the bug is. 12 | 13 | **To Reproduce** 14 | Steps to reproduce the behavior: 15 | 1. Go to '...' 16 | 2. Click on '....' 17 | 3. Scroll down to '....' 18 | 4. See error 19 | 20 | **Expected behavior** 21 | A clear and concise description of what you expected to happen. 22 | 23 | **Screenshots and/or logs** 24 | If applicable, add screenshots and/or logs to help explain your problem. 25 | 26 | **Environment (please complete the following information):** 27 | - Version [e.g. 1.0.42] 28 | - Device: [e.g. Intel i9-9900k 64bit, 32Go of RAM, 128Go Free on 256Go SSD, ...] 29 | - OS: [e.g. Manjaro XFCE 19.0.2, MacOS Catalina 10.15.4] 30 | - Browser [e.g. chrome 82, safari 13.1] 31 | 32 | **Additional context** 33 | Add any other context about the problem here. 34 | -------------------------------------------------------------------------------- /.github/.github/ISSUE_TEMPLATE/feature_request.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Feature request 3 | about: Suggest an idea for this project 4 | title: '' 5 | labels: feature 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Is your feature request related to a problem? Please describe.** 11 | A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] 12 | 13 | **Describe the solution you'd like** 14 | A clear and concise description of what you want to happen. 15 | 16 | **Describe alternatives you've considered** 17 | A clear and concise description of any alternative solutions or features you've considered. 18 | 19 | **Additional context** 20 | Add any other context or screenshots about the feature request here. 21 | -------------------------------------------------------------------------------- /.github/.github/ISSUE_TEMPLATE/question.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Question 3 | about: Ask us help in something 4 | title: '' 5 | labels: question 6 | assignees: '' 7 | 8 | --- 9 | 10 | **Describe your aim** 11 | A clear and concise description of what you want. 12 | 13 | **Ask your question** 14 | I can't compile the project, can you help me? 15 | 16 | **What did you do ?** 17 | 1. I've clone the repository 18 | 2. Execute the make commands 19 | 3. That throw an error in the console 20 | 21 | **Screenshots and/or logs** 22 | If applicable, add screenshots to help explain your problem. 23 | 24 | **Environment (please complete the following information):** 25 | - Version [e.g. 1.0.42] 26 | - Device: [e.g. Intel i9-9900k 64bit, 32Go of RAM, 128Go Free on 256Go SSD, ...] 27 | - OS: [e.g. Manjaro XFCE 19.0.2, MacOS Catalina 10.15.4] 28 | - Browser [e.g. chrome 82, safari 13.1] 29 | 30 | **Additional context** 31 | Add any other context about the problem here. 32 | -------------------------------------------------------------------------------- /.github/.github/PULL_REQUEST_TEMPLATE/pull_request_template.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Pull Request 3 | about: Pull new feature 4 | labels: feature 5 | reviewers: Nocturlab/vlang-team 6 | 7 | --- 8 | 9 | #### Description of Change 10 | 14 | 15 | #### Checklist 16 | 17 | 18 | - [ ] PR description included and stakeholders cc'd 19 | - [ ] `v test .` passes 20 | - [ ] tests are changed or added 21 | - [ ] relevant documentation is changed or added 22 | - [ ] PR title is simple and clear 23 | - [ ] PR release notes describe the change in a way relevant to app developers, and are capitalized, punctuated, and past tense. 24 | 25 | #### Release Notes 26 | 27 | Notes: 28 | -------------------------------------------------------------------------------- /.github/dependabot.yml: -------------------------------------------------------------------------------- 1 | # To get started with Dependabot version updates, you'll need to specify which 2 | # package ecosystems to update and where the package manifests are located. 3 | # Please see the documentation for all configuration options: 4 | # https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates 5 | 6 | version: 2 7 | updates: 8 | - package-ecosystem: "npm" # See documentation for possible values 9 | directory: "/" # Location of package manifests 10 | schedule: 11 | interval: "daily" 12 | -------------------------------------------------------------------------------- /.github/release-drafter.yml: -------------------------------------------------------------------------------- 1 | name-template: 'Release v$NEXT_PATCH_VERSION' 2 | tag-template: 'v$NEXT_PATCH_VERSION' 3 | categories: 4 | - title: '🚀 Features' 5 | labels: 6 | - 'feature' 7 | - 'enhancement' 8 | - title: '🐛 Bug Fixes' 9 | labels: 10 | - 'fix' 11 | - 'bugfix' 12 | - 'bug' 13 | - title: '🧰 Maintenance' 14 | label: 'maintenance' 15 | change-template: '- $TITLE @$AUTHOR (#$NUMBER)' 16 | template: | 17 | ## Changes 18 | 19 | $CHANGES 20 | 21 | ## Contributors 22 | $CONTRIBUTORS 23 | 24 | -------------------------------------------------------------------------------- /.github/workflows/build_github_action.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | 3 | on: 4 | push: 5 | paths-ignore: 6 | - '**.md' 7 | - 'dist/**.js' 8 | - .github/workflows/test_github_action.yml 9 | pull_request: 10 | paths-ignore: 11 | - '**.md' 12 | - 'dist/**.js' 13 | - .github/workflows/test_github_action.yml 14 | 15 | jobs: 16 | build: 17 | name: Build GitHub Action 18 | runs-on: ubuntu-latest 19 | steps: 20 | - name: Checkout 21 | uses: actions/checkout@v2 22 | 23 | - name: Setup node 12 24 | uses: actions/setup-node@v1 25 | with: 26 | node-version: 12 27 | 28 | - name: npm install 29 | run: npm install 30 | 31 | - name: Clean old dist/ 32 | run: | 33 | rm -r dist/ 34 | rm .gitignore 35 | continue-on-error: true 36 | 37 | - name: npm build 38 | run: npm run build 39 | 40 | - name: git push dist 41 | run : | 42 | echo "${GITHUB_REF#refs/heads/}" 43 | git config --global user.email "bot@nocturlab.fr" 44 | git config --global user.name "BOT_WORKFLOW" 45 | git add dist -f 46 | git commit -m "WORKFLOW_COMMIT - update dist/index.js" 47 | git push 48 | continue-on-error: true 49 | -------------------------------------------------------------------------------- /.github/workflows/github_release_automation.yml: -------------------------------------------------------------------------------- 1 | name: Release 2 | 3 | on: 4 | push: 5 | branches: 6 | - master 7 | 8 | jobs: 9 | build: 10 | name: Release 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Checkout 14 | uses: actions/checkout@v2 15 | - id: draft_release 16 | name: Draft Release 17 | uses: toolmantim/release-drafter@v5 18 | env: 19 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 20 | - name: Change tag 21 | env: 22 | GITHUB_USER: ${{ github.actor }} 23 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 24 | run: | 25 | echo "Get the release name" 26 | output=${{ steps.draft_release.outputs.html_url }} 27 | output=$(hub release -d -f "%T;%U%n" | grep "${output}" | cut -d';' -f1) 28 | echo "${output}" 29 | 30 | echo "Get the package.json version" 31 | version=$(cat package.json | jq '.version') 32 | version=${version//\"} 33 | echo "${version}" 34 | 35 | echo "Edit the version in the release" 36 | hub release edit -m "v${version} 🌈" "${output}" 37 | echo "v${version} 🌈" 38 | 39 | echo "Get the new release tag" 40 | output=$(hub release -d -f "%T;%t%n" | grep "v${version}" | head -n1 | cut -d';' -f 1) 41 | echo "${output}" 42 | 43 | echo "Change the release tag to: v${version}" 44 | content="$(hub release show "${output}")" 45 | hub release delete "${output}" 46 | hub release create --draft=true -m "${content}" "v${version}" 47 | hub release -d 48 | -------------------------------------------------------------------------------- /.github/workflows/github_release_link.yml: -------------------------------------------------------------------------------- 1 | name: Link tags 2 | 3 | on: 4 | release: 5 | types: 6 | - published 7 | 8 | jobs: 9 | build: 10 | name: Link latest full tag to latest patch 11 | runs-on: ubuntu-latest 12 | steps: 13 | - name: Checkout 14 | uses: actions/checkout@v2 15 | - run: | 16 | # Extract the tag of the release 17 | LATEST_TAG=${GITHUB_REF##*/} 18 | # Get the patch version of the tag 19 | tag=$(echo "${LATEST_TAG%.*.*}") 20 | # Create git identity 21 | git config --global user.email "bot@nocturlab.fr" 22 | git config --global user.name "BOT_WORKFLOW" 23 | # Use -f to update the current tag version or create a new 24 | git push --delete origin ${tag} 2> /dev/null | true 25 | git tag -f -m "🔖 Release ${tag}" -a ${tag} 26 | git push --tags 27 | -------------------------------------------------------------------------------- /.github/workflows/test_github_action.yml: -------------------------------------------------------------------------------- 1 | name: Tests 2 | 3 | on: 4 | push: 5 | paths: 6 | - dist/ 7 | - .github/workflows/test_github_action.yml 8 | pull_request: 9 | paths: 10 | - dist/ 11 | - .github/workflows/test_github_action.yml 12 | schedule: 13 | - cron: '0 8 * * 3' 14 | 15 | jobs: 16 | test-ubuntu: 17 | name: Run tests on ${{ matrix.os }} ${{ matrix.v-version }} 18 | strategy: 19 | fail-fast: false 20 | matrix: 21 | os: [ubuntu-latest, macos-latest, windows-latest] 22 | v-version: [latest, master, 0.2] 23 | runs-on: ${{ matrix.os }} 24 | steps: 25 | - name: Checkout 26 | uses: actions/checkout@v2 27 | - name: Set up V version latest 28 | uses: ./ 29 | with: 30 | v-version: ${{ matrix.v-version }} 31 | id: v 32 | 33 | - name: Test V is present 34 | run: v version 35 | 36 | - name: Test V fmt 37 | run: v fmt word_counter.v 38 | working-directory: ${{ steps.v.outputs.v_home }}/examples/word_counter 39 | 40 | - name: Test V can compile something 41 | run: v word_counter.v 42 | working-directory: ${{ steps.v.outputs.v_home }}/examples/word_counter 43 | 44 | - name: Test compiled program 45 | run: ./word_counter cinderella.txt 46 | working-directory: ${{ steps.v.outputs.v_home }}/examples/word_counter 47 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | 2 | # Created by https://www.gitignore.io/api/node 3 | # Edit at https://www.gitignore.io/?templates=node 4 | 5 | ### Node ### 6 | # Logs 7 | logs 8 | *.log 9 | npm-debug.log* 10 | yarn-debug.log* 11 | yarn-error.log* 12 | lerna-debug.log* 13 | 14 | # Diagnostic reports (https://nodejs.org/api/report.html) 15 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 16 | 17 | # Runtime data 18 | pids 19 | *.pid 20 | *.seed 21 | *.pid.lock 22 | 23 | # Directory for instrumented libs generated by jscoverage/JSCover 24 | lib-cov 25 | 26 | # Coverage directory used by tools like istanbul 27 | coverage 28 | *.lcov 29 | 30 | # nyc test coverage 31 | .nyc_output 32 | 33 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 34 | .grunt 35 | 36 | # Bower dependency directory (https://bower.io/) 37 | bower_components 38 | 39 | # node-waf configuration 40 | .lock-wscript 41 | 42 | # Compiled binary addons (https://nodejs.org/api/addons.html) 43 | build/Release 44 | 45 | # Dependency directories 46 | node_modules/ 47 | jspm_packages/ 48 | 49 | # TypeScript v1 declaration files 50 | typings/ 51 | 52 | # TypeScript cache 53 | *.tsbuildinfo 54 | 55 | # Optional npm cache directory 56 | .npm 57 | 58 | # Optional eslint cache 59 | .eslintcache 60 | 61 | # Optional REPL history 62 | .node_repl_history 63 | 64 | # Output of 'npm pack' 65 | *.tgz 66 | 67 | # Yarn Integrity file 68 | .yarn-integrity 69 | 70 | # dotenv environment variables file 71 | .env 72 | .env.test 73 | 74 | # parcel-bundler cache (https://parceljs.org/) 75 | .cache 76 | 77 | # next.js build output 78 | .next 79 | 80 | # nuxt.js build output 81 | .nuxt 82 | 83 | # rollup.js default build output 84 | dist/ 85 | 86 | # Uncomment the public line if your project uses Gatsby 87 | # https://nextjs.org/blog/next-9-1#public-directory-support 88 | # https://create-react-app.dev/docs/using-the-public-folder/#docsNav 89 | # public 90 | 91 | # Storybook build outputs 92 | .out 93 | .storybook-out 94 | 95 | # vuepress build output 96 | .vuepress/dist 97 | 98 | # Serverless directories 99 | .serverless/ 100 | 101 | # FuseBox cache 102 | .fusebox/ 103 | 104 | # DynamoDB Local files 105 | .dynamodb/ 106 | 107 | # Temporary folders 108 | tmp/ 109 | temp/ 110 | 111 | # End of https://www.gitignore.io/api/node 112 | -------------------------------------------------------------------------------- /.npmrc: -------------------------------------------------------------------------------- 1 | message=":bookmark: Release v%s" 2 | -------------------------------------------------------------------------------- /CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | In the interest of fostering an open and welcoming environment, we as 6 | contributors and maintainers pledge to making participation in our project and 7 | our community a harassment-free experience for everyone, regardless of age, body 8 | size, disability, ethnicity, sex characteristics, gender identity and expression, 9 | level of experience, education, socio-economic status, nationality, personal 10 | appearance, race, religion, or sexual identity and orientation. 11 | 12 | ## Our Standards 13 | 14 | Examples of behavior that contributes to creating a positive environment 15 | include: 16 | 17 | - Using welcoming and inclusive language 18 | - Being respectful of differing viewpoints and experiences 19 | - Gracefully accepting constructive criticism 20 | - Focusing on what is best for the community 21 | - Showing empathy towards other community members 22 | 23 | Examples of unacceptable behavior by participants include: 24 | 25 | - The use of sexualized language or imagery and unwelcome sexual attention or 26 | advances 27 | - Trolling, insulting/derogatory comments, and personal or political attacks 28 | - Public or private harassment 29 | - Publishing others' private information, such as a physical or electronic 30 | address, without explicit permission 31 | - Other conduct which could reasonably be considered inappropriate in a 32 | professional setting 33 | 34 | ## Our Responsibilities 35 | 36 | Project maintainers are responsible for clarifying the standards of acceptable 37 | behavior and are expected to take appropriate and fair corrective action in 38 | response to any instances of unacceptable behavior. 39 | 40 | Project maintainers have the right and responsibility to remove, edit, or 41 | reject comments, commits, code, wiki edits, issues, and other contributions 42 | that are not aligned to this Code of Conduct, or to ban temporarily or 43 | permanently any contributor for other behaviors that they deem inappropriate, 44 | threatening, offensive, or harmful. 45 | 46 | ## Scope 47 | 48 | This Code of Conduct applies both within project spaces and in public spaces 49 | when an individual is representing the project or its community. Examples of 50 | representing a project or community include using an official project e-mail 51 | address, posting via an official social media account, or acting as an appointed 52 | representative at an online or offline event. Representation of a project may be 53 | further defined and clarified by project maintainers. 54 | 55 | ## Enforcement 56 | 57 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 58 | reported by contacting the project team at flavien.cadet@nocturlab.fr. All 59 | complaints will be reviewed and investigated and will result in a response that 60 | is deemed necessary and appropriate to the circumstances. The project team is 61 | obligated to maintain confidentiality with regard to the reporter of an incident. 62 | Further details of specific enforcement policies may be posted separately. 63 | 64 | Project maintainers who do not follow or enforce the Code of Conduct in good 65 | faith may face temporary or permanent repercussions as determined by other 66 | members of the project's leadership. 67 | 68 | ## Attribution 69 | 70 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, 71 | available at https://www.contributor-covenant.org/version/1/4/code-of-conduct.html 72 | 73 | [homepage]: https://www.contributor-covenant.org 74 | 75 | For answers to common questions about this code of conduct, see 76 | https://www.contributor-covenant.org/faq 77 | -------------------------------------------------------------------------------- /CONTRIBUTING.md: -------------------------------------------------------------------------------- 1 | # ✨ Contributing to setup-vlang-action ✨ 2 | 3 | ## Structure of the repository 4 | We'll use the Git method called `Gitflow'. 5 | 6 | The Git flow method results in the creation of a branch for each feature. 7 | Each feature can be the object of multiple pull requests (PRs). 8 | 9 | A branch should be called by `-`. 10 | 11 | For example: 12 | 13 | `1-create-a-simple-neuron` 14 | 15 | ## GitHub Projects 16 | 17 | GitHub project is a Kanban board connected to GitHub exits! 18 | For the best progress of the project, please create your tasks in the Backlog or To Do box. 19 | 20 | ### Using Kanban 21 | - [x] If you wish to perform a task, click the `Assign Yourself' button. 22 | - [x] To display keyboard shortcuts press the ? key. 23 | - [x] To change the status of a task drag and drop it to an other column. 24 | - [x] To create an issue, create a task and do `Convert to Issue'. 25 | - [x] To make a Merge Request, make sure the branch you are trying to use has the following format: 26 | ` - ` 27 | For example: `1-create-a-simple-neurone` 28 | 29 | ## Using Git 30 | 31 | To start, clone the repository into a folder with your name. 32 | 33 | For me: `git clone https://github.com/nocturlab/setup-vlang-action.git` 34 | 35 | Now several cases are possible: 36 | - You want to retrieve someone else's modifications: 37 | `git pull` 38 | - You have conflicts: 39 | Conflicts marked with a `C` in the vscode git tab must be resolved. 40 | You must choose between incomming and current for each file conflict. 41 | To commit them, save your files and click the "+" on the vscode git tab. 42 | - You want to send your changes: 43 | git status will list the modified files, you can also see them in the vscode git tab. 44 | `git add [ ...]` will prepare your files for upload. You can also do this via the `+` in the vscode git tab. 45 | `git commit -m ""` add files to a commit, you can do this via the `✓` button at the top of the vscode git tab. 46 | git push will send all your pending commits to git so that others can get them back, you can do this via the reload button at the bottom left of the blue vscode bar. 47 | - You want to send your changes to the main git branch: 48 | On the github.com project page, click `new pull request`, 49 | Choose the start branch (the one you want to send your changes to) and the end branch (the one you want to send your changes to). 50 | Put an understandable name, click on `Assign Yourself` on the right, 51 | At the bottom of the description, note the id of your github issue like this: `Related issues: #1` or `Close #1`. 52 | 53 | ## Create new Release 54 | 55 | Before releasing a new version make sure you have the local repository up-to-date. So you can use this command: 56 | 57 | ```sh 58 | git checkout master && git pull && npm version minor 59 | ``` 60 | 61 | - `git checkout` to be sure that we are on master. 62 | - `git pull` to be sure to have the latest changes on master. 63 | - `npm version [major | minor | patch]` to create the new version. `minor` will increment the number at the second position. 64 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Nocturlab 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # This repository will be ARCHIVED soon !! Check the official [action](https://github.com/vlang/setup-v) 2 | 3 | # Setup V environment [![Latest version][githubBadge]](https://github.com/nocturlab/setup-vlang-action/releases/) [![Build][Build]](https://github.com/nocturlab/setup-vlang-action/actions?query=workflow%3ABuild) [![Tests][Tests]](https://github.com/nocturlab/setup-vlang-action/actions?query=workflow%3ATests) 4 | 5 | GitHub Action that allows you to compile V programs without the use of Docker (because it's very slow). 6 | 7 | [githubBadge]: https://img.shields.io/github/v/release/nocturlab/setup-vlang-action 8 | [Build]: https://github.com/nocturlab/setup-vlang-action/workflows/Build/badge.svg 9 | [Tests]: https://github.com/nocturlab/setup-vlang-action/workflows/Tests/badge.svg 10 | 11 | ## Usage 12 | You just have to setup your workflow like this: 13 | 14 | ```yml 15 | # file: .github/workflows/vlang-build-pipeline.yml 16 | name: vlang-build-pipeline 17 | 18 | on: 19 | push: 20 | paths-ignore: 21 | - '**.md' 22 | 23 | jobs: 24 | run: 25 | name: Run 26 | runs-on: ubuntu-latest 27 | steps: 28 | - name: Checkout 29 | uses: actions/checkout@v2 30 | - name: Set up V version latest 31 | uses: nocturlab/setup-vlang-action@v1 32 | with: 33 | v-version: latest 34 | id: v 35 | - name: Build repository app 36 | run: v . 37 | - name: Run V tests 38 | run: v test . 39 | ``` 40 | 41 | ## Inputs 42 | 43 | - `v-version`: V version. Can be either exact version number, `latest` (by default), or `master` (use the master branch instead of release). 44 | -------------------------------------------------------------------------------- /action.yml: -------------------------------------------------------------------------------- 1 | name: 'Setup V environment' 2 | description: 'Setup a V environment and add it to the PATH' 3 | author: 'shiipou' 4 | inputs: 5 | v-version: 6 | description: 'The V version to download and use.' 7 | default: 'latest' 8 | output: 9 | v_home: 10 | description: 'The path where V is located.' 11 | runs: 12 | using: 'node12' 13 | main: 'dist/index.js' 14 | -------------------------------------------------------------------------------- /lib/index.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | // Inspired by https://github.com/actions/setup-go 3 | var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { 4 | if (k2 === undefined) k2 = k; 5 | Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); 6 | }) : (function(o, m, k, k2) { 7 | if (k2 === undefined) k2 = k; 8 | o[k2] = m[k]; 9 | })); 10 | var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { 11 | Object.defineProperty(o, "default", { enumerable: true, value: v }); 12 | }) : function(o, v) { 13 | o["default"] = v; 14 | }); 15 | var __importStar = (this && this.__importStar) || function (mod) { 16 | if (mod && mod.__esModule) return mod; 17 | var result = {}; 18 | if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); 19 | __setModuleDefault(result, mod); 20 | return result; 21 | }; 22 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 23 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 24 | return new (P || (P = Promise))(function (resolve, reject) { 25 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 26 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 27 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 28 | step((generator = generator.apply(thisArg, _arguments || [])).next()); 29 | }); 30 | }; 31 | Object.defineProperty(exports, "__esModule", { value: true }); 32 | exports.run = void 0; 33 | const core = __importStar(require("@actions/core")); 34 | const tc = __importStar(require("@actions/tool-cache")); 35 | const installer = __importStar(require("./installer")); 36 | const path = __importStar(require("path")); 37 | function run() { 38 | return __awaiter(this, void 0, void 0, function* () { 39 | // try { 40 | let v_version = core.getInput('v-version'); 41 | console.log(`Setup V with version ${v_version}`); 42 | if (v_version) { 43 | let cache_dir = tc.find('nocturlab/setup-vlang-action', v_version); 44 | let install_dir; 45 | if (!cache_dir) { 46 | console.log(`V ${v_version} can't be found using cache, attempting to download ...`); 47 | install_dir = yield installer.download_v(v_version); 48 | console.log(`V Installed to ${install_dir}`); 49 | } 50 | if (install_dir) { 51 | core.exportVariable('V_HOME', install_dir); 52 | core.setOutput('v_home', install_dir); 53 | core.addPath(install_dir); 54 | console.log('Added V to the path'); 55 | } 56 | else { 57 | throw new Error(`Could not find a version that satisfied version spec: ${v_version}`); 58 | } 59 | } 60 | // add problem matchers 61 | const matchersPath = path.join(__dirname, '..', 'matchers.json'); 62 | console.log(`##[add-matcher]${matchersPath}`); 63 | /* } catch (error) { 64 | console.log(error); 65 | // core.setFailed(error.message); 66 | }*/ 67 | }); 68 | } 69 | exports.run = run; 70 | run(); 71 | -------------------------------------------------------------------------------- /lib/installer.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { 3 | if (k2 === undefined) k2 = k; 4 | Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); 5 | }) : (function(o, m, k, k2) { 6 | if (k2 === undefined) k2 = k; 7 | o[k2] = m[k]; 8 | })); 9 | var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { 10 | Object.defineProperty(o, "default", { enumerable: true, value: v }); 11 | }) : function(o, v) { 12 | o["default"] = v; 13 | }); 14 | var __importStar = (this && this.__importStar) || function (mod) { 15 | if (mod && mod.__esModule) return mod; 16 | var result = {}; 17 | if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); 18 | __setModuleDefault(result, mod); 19 | return result; 20 | }; 21 | var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { 22 | function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } 23 | return new (P || (P = Promise))(function (resolve, reject) { 24 | function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } 25 | function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } 26 | function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } 27 | step((generator = generator.apply(thisArg, _arguments || [])).next()); 28 | }); 29 | }; 30 | Object.defineProperty(exports, "__esModule", { value: true }); 31 | exports.download_v = void 0; 32 | const tc = __importStar(require("@actions/tool-cache")); 33 | const path = __importStar(require("path")); 34 | const sys = __importStar(require("./system")); 35 | const child_process_1 = require("child_process"); 36 | function download_v(v_version) { 37 | return __awaiter(this, void 0, void 0, function* () { 38 | let download_path; 39 | let ext_path; 40 | let cache_path; 41 | try { 42 | // download 43 | let download_url = `https://github.com/vlang/v/releases/`; 44 | if (v_version.includes('latest')) 45 | download_url += `${v_version}/download/v_${sys.getPlatform()}.zip`; 46 | else if (v_version.includes('master')) { 47 | download_url = `https://github.com/vlang/v/archive/master.zip`; 48 | } 49 | else 50 | download_url += `download/${v_version}/v_${sys.getPlatform()}.zip`; 51 | console.log(`Downloading V from ${download_url}`); 52 | download_path = yield tc.downloadTool(download_url); 53 | console.log(`V downloaded to ${download_path}`); 54 | } 55 | catch (error) { 56 | throw new Error(`Failed to download V version ${v_version}: ${error}`); 57 | } 58 | try { 59 | // extract 60 | console.log('Extracting V...'); 61 | ext_path = yield tc.extractZip(download_path, './.vlang_tmp_build'); 62 | console.log(`V extracted to ${ext_path}`); 63 | if (v_version.includes('master')) { 64 | console.log(`Building V from sources`); 65 | ext_path = path.join(ext_path, 'v-master/'); 66 | console.log((0, child_process_1.execSync)(`make`, { cwd: ext_path }).toString()); 67 | } 68 | else { 69 | ext_path = path.join(ext_path, 'v/'); 70 | } 71 | // extracts with a root folder that matches the fileName downloaded 72 | console.log(`Add V to cache`); 73 | cache_path = yield tc.cacheDir(ext_path, 'nocturlab/setup-vlang-action', v_version); 74 | console.log(`V was added to cache using dir: ${cache_path}`); 75 | } 76 | catch (error) { 77 | throw new Error(`Failed to extract V version ${v_version}: ${error}`); 78 | } 79 | return cache_path; 80 | }); 81 | } 82 | exports.download_v = download_v; 83 | -------------------------------------------------------------------------------- /lib/system.js: -------------------------------------------------------------------------------- 1 | "use strict"; 2 | Object.defineProperty(exports, "__esModule", { value: true }); 3 | exports.getArch = exports.getPlatform = void 0; 4 | let os = require('os'); 5 | function getPlatform() { 6 | // darwin and linux match already 7 | // freebsd not supported yet but future proofed. 8 | // 'aix', 'darwin', 'freebsd', 'linux', 'openbsd', 'sunos', and 'win32' 9 | let plat = os.platform(); 10 | // wants 'macos', 'freebsd', 'linux', 'windows' 11 | if (plat === 'win32') { 12 | plat = 'windows'; 13 | } 14 | else if (plat === 'darwin') { 15 | plat = 'macos'; 16 | } 17 | return plat; 18 | } 19 | exports.getPlatform = getPlatform; 20 | function getArch() { 21 | // 'arm', 'arm64', 'ia32', 'mips', 'mipsel', 'ppc', 'ppc64', 's390', 's390x', 'x32', and 'x64'. 22 | let arch = os.arch(); 23 | // wants amd64, 386, arm64, armv61, ppc641e, s390x 24 | // currently not supported by runner but future proofed mapping 25 | switch (arch) { 26 | case 'x64': 27 | arch = 'amd64'; 28 | break; 29 | // case 'ppc': 30 | // arch = 'ppc64'; 31 | // break; 32 | case 'x32': 33 | arch = '386'; 34 | break; 35 | } 36 | return arch; 37 | } 38 | exports.getArch = getArch; 39 | -------------------------------------------------------------------------------- /matchers.json: -------------------------------------------------------------------------------- 1 | { 2 | "problemMatcher": [ 3 | { 4 | "owner": "v", 5 | "pattern": [ 6 | { 7 | "regexp": "^([^:]*: )?((.:)?[^:]*):(\\d+)(:(\\d+))?: (.*)$", 8 | "file": 2, 9 | "line": 4, 10 | "column": 6, 11 | "message": 7 12 | } 13 | ] 14 | } 15 | ] 16 | } 17 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "setup-vlang-action", 3 | "version": "1.2.2", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "@actions/core": { 8 | "version": "1.6.0", 9 | "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.6.0.tgz", 10 | "integrity": "sha512-NB1UAZomZlCV/LmJqkLhNTqtKfFXJZAUPcfl/zqG7EfsQdeUJtaWO98SGbuQ3pydJ3fHl2CvI/51OKYlCYYcaw==", 11 | "requires": { 12 | "@actions/http-client": "^1.0.11" 13 | } 14 | }, 15 | "@actions/exec": { 16 | "version": "1.1.1", 17 | "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.1.1.tgz", 18 | "integrity": "sha512-+sCcHHbVdk93a0XT19ECtO/gIXoxvdsgQLzb2fE2/5sIZmWQuluYyjPQtrtTHdU1YzTZ7bAPN4sITq2xi1679w==", 19 | "requires": { 20 | "@actions/io": "^1.0.1" 21 | } 22 | }, 23 | "@actions/http-client": { 24 | "version": "1.0.11", 25 | "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.11.tgz", 26 | "integrity": "sha512-VRYHGQV1rqnROJqdMvGUbY/Kn8vriQe/F9HR2AlYHzmKuM/p3kjNuXhmdBfcVgsvRWTz5C5XW5xvndZrVBuAYg==", 27 | "requires": { 28 | "tunnel": "0.0.6" 29 | } 30 | }, 31 | "@actions/io": { 32 | "version": "1.1.2", 33 | "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.1.2.tgz", 34 | "integrity": "sha512-d+RwPlMp+2qmBfeLYPLXuSRykDIFEwdTA0MMxzS9kh4kvP1ftrc/9fzy6pX6qAjthdXruHQ6/6kjT/DNo5ALuw==" 35 | }, 36 | "@actions/tool-cache": { 37 | "version": "1.7.2", 38 | "resolved": "https://registry.npmjs.org/@actions/tool-cache/-/tool-cache-1.7.2.tgz", 39 | "integrity": "sha512-GYlcgg/PK2RWBrGG2sFg6s7im3S94LMKuqAv8UPDq/pGTZbuEvmN4a95Fn1Z19OE+vt7UbUHeewOD5tEBT+4TQ==", 40 | "requires": { 41 | "@actions/core": "^1.2.6", 42 | "@actions/exec": "^1.0.0", 43 | "@actions/http-client": "^1.0.8", 44 | "@actions/io": "^1.1.1", 45 | "semver": "^6.1.0", 46 | "uuid": "^3.3.2" 47 | } 48 | }, 49 | "@babel/code-frame": { 50 | "version": "7.15.8", 51 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.15.8.tgz", 52 | "integrity": "sha512-2IAnmn8zbvC/jKYhq5Ki9I+DwjlrtMPUCH/CpHvqI4dNnlwHwsxoIhlc8WcYY5LSYknXQtAlFYuHfqAFCvQ4Wg==", 53 | "optional": true, 54 | "requires": { 55 | "@babel/highlight": "^7.14.5" 56 | } 57 | }, 58 | "@babel/helper-validator-identifier": { 59 | "version": "7.15.7", 60 | "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.15.7.tgz", 61 | "integrity": "sha512-K4JvCtQqad9OY2+yTU8w+E82ywk/fe+ELNlt1G8z3bVGlZfn/hOcQQsUhGhW/N+tb3fxK800wLtKOE/aM0m72w==", 62 | "optional": true 63 | }, 64 | "@babel/highlight": { 65 | "version": "7.14.5", 66 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.14.5.tgz", 67 | "integrity": "sha512-qf9u2WFWVV0MppaL877j2dBtQIDgmidgjGk5VIMw3OadXvYaXn66U1BFlH2t4+t3i+8PhedppRv+i40ABzd+gg==", 68 | "optional": true, 69 | "requires": { 70 | "@babel/helper-validator-identifier": "^7.14.5", 71 | "chalk": "^2.0.0", 72 | "js-tokens": "^4.0.0" 73 | } 74 | }, 75 | "@types/node": { 76 | "version": "17.0.23", 77 | "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.23.tgz", 78 | "integrity": "sha512-UxDxWn7dl97rKVeVS61vErvw086aCYhDLyvRQZ5Rk65rZKepaFdm53GeqXaKBuOhED4e9uWq34IC3TdSdJJ2Gw==", 79 | "dev": true 80 | }, 81 | "@zeit/ncc": { 82 | "version": "0.22.3", 83 | "resolved": "https://registry.npmjs.org/@zeit/ncc/-/ncc-0.22.3.tgz", 84 | "integrity": "sha512-jnCLpLXWuw/PAiJiVbLjA8WBC0IJQbFeUwF4I9M+23MvIxTxk5pD4Q8byQBSPmHQjz5aBoA7AKAElQxMpjrCLQ==", 85 | "dev": true 86 | }, 87 | "ansi-styles": { 88 | "version": "3.2.1", 89 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 90 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 91 | "optional": true, 92 | "requires": { 93 | "color-convert": "^1.9.0" 94 | } 95 | }, 96 | "argparse": { 97 | "version": "1.0.10", 98 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 99 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 100 | "optional": true, 101 | "requires": { 102 | "sprintf-js": "~1.0.2" 103 | } 104 | }, 105 | "array-find-index": { 106 | "version": "1.0.2", 107 | "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", 108 | "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" 109 | }, 110 | "arrify": { 111 | "version": "1.0.1", 112 | "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", 113 | "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" 114 | }, 115 | "axios": { 116 | "version": "0.26.1", 117 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.26.1.tgz", 118 | "integrity": "sha512-fPwcX4EvnSHuInCMItEhAGnaSEXRBjtzh9fOtsE6E1G6p7vl7edEeZe11QHf18+6+9gR5PbKV/sGKNaD8YaMeA==", 119 | "requires": { 120 | "follow-redirects": "^1.14.8" 121 | } 122 | }, 123 | "balanced-match": { 124 | "version": "1.0.2", 125 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 126 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 127 | }, 128 | "brace-expansion": { 129 | "version": "1.1.11", 130 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 131 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 132 | "requires": { 133 | "balanced-match": "^1.0.0", 134 | "concat-map": "0.0.1" 135 | } 136 | }, 137 | "builtin-modules": { 138 | "version": "1.1.1", 139 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 140 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 141 | "optional": true 142 | }, 143 | "camelcase": { 144 | "version": "4.1.0", 145 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", 146 | "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=" 147 | }, 148 | "camelcase-keys": { 149 | "version": "4.2.0", 150 | "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", 151 | "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", 152 | "requires": { 153 | "camelcase": "^4.1.0", 154 | "map-obj": "^2.0.0", 155 | "quick-lru": "^1.0.0" 156 | } 157 | }, 158 | "chalk": { 159 | "version": "2.4.2", 160 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 161 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 162 | "optional": true, 163 | "requires": { 164 | "ansi-styles": "^3.2.1", 165 | "escape-string-regexp": "^1.0.5", 166 | "supports-color": "^5.3.0" 167 | } 168 | }, 169 | "color-convert": { 170 | "version": "1.9.3", 171 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 172 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 173 | "optional": true, 174 | "requires": { 175 | "color-name": "1.1.3" 176 | } 177 | }, 178 | "color-name": { 179 | "version": "1.1.3", 180 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 181 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 182 | "optional": true 183 | }, 184 | "commander": { 185 | "version": "2.20.3", 186 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", 187 | "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", 188 | "optional": true 189 | }, 190 | "concat-map": { 191 | "version": "0.0.1", 192 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 193 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 194 | }, 195 | "currently-unhandled": { 196 | "version": "0.4.1", 197 | "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", 198 | "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", 199 | "requires": { 200 | "array-find-index": "^1.0.1" 201 | } 202 | }, 203 | "debug": { 204 | "version": "3.1.0", 205 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 206 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 207 | "requires": { 208 | "ms": "2.0.0" 209 | } 210 | }, 211 | "decamelize": { 212 | "version": "1.2.0", 213 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", 214 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" 215 | }, 216 | "decamelize-keys": { 217 | "version": "1.1.0", 218 | "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", 219 | "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", 220 | "requires": { 221 | "decamelize": "^1.1.0", 222 | "map-obj": "^1.0.0" 223 | }, 224 | "dependencies": { 225 | "map-obj": { 226 | "version": "1.0.1", 227 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", 228 | "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" 229 | } 230 | } 231 | }, 232 | "diff": { 233 | "version": "4.0.2", 234 | "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", 235 | "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", 236 | "optional": true 237 | }, 238 | "error-ex": { 239 | "version": "1.3.2", 240 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", 241 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", 242 | "requires": { 243 | "is-arrayish": "^0.2.1" 244 | } 245 | }, 246 | "escape-string-regexp": { 247 | "version": "1.0.5", 248 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 249 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" 250 | }, 251 | "esprima": { 252 | "version": "4.0.1", 253 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 254 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 255 | "optional": true 256 | }, 257 | "figures": { 258 | "version": "2.0.0", 259 | "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", 260 | "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", 261 | "requires": { 262 | "escape-string-regexp": "^1.0.5" 263 | } 264 | }, 265 | "find-package-json": { 266 | "version": "1.2.0", 267 | "resolved": "https://registry.npmjs.org/find-package-json/-/find-package-json-1.2.0.tgz", 268 | "integrity": "sha512-+SOGcLGYDJHtyqHd87ysBhmaeQ95oWspDKnMXBrnQ9Eq4OkLNqejgoaD8xVWu6GPa0B6roa6KinCMEMcVeqONw==" 269 | }, 270 | "find-up": { 271 | "version": "2.1.0", 272 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", 273 | "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", 274 | "requires": { 275 | "locate-path": "^2.0.0" 276 | } 277 | }, 278 | "follow-redirects": { 279 | "version": "1.14.9", 280 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.14.9.tgz", 281 | "integrity": "sha512-MQDfihBQYMcyy5dhRDJUHcw7lb2Pv/TuE6xP1vyraLukNDHKbDxDNaOE3NbCAdKQApno+GPRyo1YAp89yCjK4w==" 282 | }, 283 | "fs.realpath": { 284 | "version": "1.0.0", 285 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 286 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 287 | }, 288 | "function-bind": { 289 | "version": "1.1.1", 290 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", 291 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" 292 | }, 293 | "g": { 294 | "version": "2.0.1", 295 | "resolved": "https://registry.npmjs.org/g/-/g-2.0.1.tgz", 296 | "integrity": "sha1-C1lj69DKcOO8jGdmk0oCGCHIuFc=" 297 | }, 298 | "glob": { 299 | "version": "7.2.0", 300 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", 301 | "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", 302 | "requires": { 303 | "fs.realpath": "^1.0.0", 304 | "inflight": "^1.0.4", 305 | "inherits": "2", 306 | "minimatch": "^3.0.4", 307 | "once": "^1.3.0", 308 | "path-is-absolute": "^1.0.0" 309 | } 310 | }, 311 | "graceful-fs": { 312 | "version": "4.2.8", 313 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.8.tgz", 314 | "integrity": "sha512-qkIilPUYcNhJpd33n0GBXTB1MMPp14TxEsEs0pTrsSVucApsYzW5V+Q8Qxhik6KU3evy+qkAAowTByymK0avdg==" 315 | }, 316 | "has": { 317 | "version": "1.0.3", 318 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", 319 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", 320 | "requires": { 321 | "function-bind": "^1.1.1" 322 | } 323 | }, 324 | "has-flag": { 325 | "version": "3.0.0", 326 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 327 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 328 | "optional": true 329 | }, 330 | "hosted-git-info": { 331 | "version": "2.8.9", 332 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", 333 | "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" 334 | }, 335 | "indent-string": { 336 | "version": "3.2.0", 337 | "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", 338 | "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=" 339 | }, 340 | "inflight": { 341 | "version": "1.0.6", 342 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 343 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 344 | "requires": { 345 | "once": "^1.3.0", 346 | "wrappy": "1" 347 | } 348 | }, 349 | "inherits": { 350 | "version": "2.0.4", 351 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 352 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 353 | }, 354 | "is-arrayish": { 355 | "version": "0.2.1", 356 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", 357 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=" 358 | }, 359 | "is-buffer": { 360 | "version": "2.0.5", 361 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.5.tgz", 362 | "integrity": "sha512-i2R6zNFDwgEHJyQUtJEk0XFi1i0dPFn/oqjK3/vPCcDeJvW5NQ83V8QbicfF1SupOaB0h8ntgBC2YiE7dfyctQ==" 363 | }, 364 | "is-core-module": { 365 | "version": "2.7.0", 366 | "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.7.0.tgz", 367 | "integrity": "sha512-ByY+tjCciCr+9nLryBYcSD50EOGWt95c7tIsKTG1J2ixKKXPvF7Ej3AVd+UfDydAJom3biBGDBALaO79ktwgEQ==", 368 | "requires": { 369 | "has": "^1.0.3" 370 | } 371 | }, 372 | "is-plain-obj": { 373 | "version": "1.1.0", 374 | "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", 375 | "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=" 376 | }, 377 | "js-tokens": { 378 | "version": "4.0.0", 379 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 380 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 381 | "optional": true 382 | }, 383 | "js-yaml": { 384 | "version": "3.14.1", 385 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", 386 | "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", 387 | "optional": true, 388 | "requires": { 389 | "argparse": "^1.0.7", 390 | "esprima": "^4.0.0" 391 | } 392 | }, 393 | "json-parse-better-errors": { 394 | "version": "1.0.2", 395 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", 396 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" 397 | }, 398 | "jsonfile-updater": { 399 | "version": "3.1.0", 400 | "resolved": "https://registry.npmjs.org/jsonfile-updater/-/jsonfile-updater-3.1.0.tgz", 401 | "integrity": "sha512-G6DB55KX4Cc5t0Zpg4kfy2b3N592fahyoUJz5rk4VmS8lccXskgUbjUEX51iXMc6gh6sE7urmXWJsW6EqDozVQ==" 402 | }, 403 | "load-json-file": { 404 | "version": "4.0.0", 405 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz", 406 | "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=", 407 | "requires": { 408 | "graceful-fs": "^4.1.2", 409 | "parse-json": "^4.0.0", 410 | "pify": "^3.0.0", 411 | "strip-bom": "^3.0.0" 412 | } 413 | }, 414 | "locate-path": { 415 | "version": "2.0.0", 416 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", 417 | "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", 418 | "requires": { 419 | "p-locate": "^2.0.0", 420 | "path-exists": "^3.0.0" 421 | } 422 | }, 423 | "loud-rejection": { 424 | "version": "1.6.0", 425 | "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", 426 | "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", 427 | "requires": { 428 | "currently-unhandled": "^0.4.1", 429 | "signal-exit": "^3.0.0" 430 | } 431 | }, 432 | "map-obj": { 433 | "version": "2.0.0", 434 | "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", 435 | "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=" 436 | }, 437 | "meow": { 438 | "version": "5.0.0", 439 | "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", 440 | "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", 441 | "requires": { 442 | "camelcase-keys": "^4.0.0", 443 | "decamelize-keys": "^1.0.0", 444 | "loud-rejection": "^1.0.0", 445 | "minimist-options": "^3.0.1", 446 | "normalize-package-data": "^2.3.4", 447 | "read-pkg-up": "^3.0.0", 448 | "redent": "^2.0.0", 449 | "trim-newlines": "^2.0.0", 450 | "yargs-parser": "^10.0.0" 451 | }, 452 | "dependencies": { 453 | "trim-newlines": { 454 | "version": "2.0.0", 455 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", 456 | "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=" 457 | }, 458 | "yargs-parser": { 459 | "version": "10.1.0", 460 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", 461 | "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", 462 | "requires": { 463 | "camelcase": "^4.1.0" 464 | } 465 | } 466 | } 467 | }, 468 | "minimatch": { 469 | "version": "3.0.4", 470 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 471 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 472 | "requires": { 473 | "brace-expansion": "^1.1.7" 474 | } 475 | }, 476 | "minimist": { 477 | "version": "1.2.6", 478 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", 479 | "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", 480 | "optional": true 481 | }, 482 | "minimist-options": { 483 | "version": "3.0.2", 484 | "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", 485 | "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", 486 | "requires": { 487 | "arrify": "^1.0.1", 488 | "is-plain-obj": "^1.1.0" 489 | } 490 | }, 491 | "mkdirp": { 492 | "version": "0.5.5", 493 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", 494 | "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", 495 | "optional": true, 496 | "requires": { 497 | "minimist": "^1.2.5" 498 | } 499 | }, 500 | "ms": { 501 | "version": "2.0.0", 502 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 503 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 504 | }, 505 | "normalize-package-data": { 506 | "version": "2.5.0", 507 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", 508 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", 509 | "requires": { 510 | "hosted-git-info": "^2.1.4", 511 | "resolve": "^1.10.0", 512 | "semver": "2 || 3 || 4 || 5", 513 | "validate-npm-package-license": "^3.0.1" 514 | }, 515 | "dependencies": { 516 | "semver": { 517 | "version": "5.7.1", 518 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 519 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 520 | } 521 | } 522 | }, 523 | "once": { 524 | "version": "1.4.0", 525 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 526 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 527 | "requires": { 528 | "wrappy": "1" 529 | } 530 | }, 531 | "p-limit": { 532 | "version": "1.3.0", 533 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", 534 | "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", 535 | "requires": { 536 | "p-try": "^1.0.0" 537 | } 538 | }, 539 | "p-locate": { 540 | "version": "2.0.0", 541 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", 542 | "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", 543 | "requires": { 544 | "p-limit": "^1.1.0" 545 | } 546 | }, 547 | "p-try": { 548 | "version": "1.0.0", 549 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", 550 | "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=" 551 | }, 552 | "parse-json": { 553 | "version": "4.0.0", 554 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", 555 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", 556 | "requires": { 557 | "error-ex": "^1.3.1", 558 | "json-parse-better-errors": "^1.0.1" 559 | } 560 | }, 561 | "path-exists": { 562 | "version": "3.0.0", 563 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", 564 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=" 565 | }, 566 | "path-is-absolute": { 567 | "version": "1.0.1", 568 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 569 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 570 | }, 571 | "path-parse": { 572 | "version": "1.0.7", 573 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", 574 | "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" 575 | }, 576 | "path-type": { 577 | "version": "3.0.0", 578 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz", 579 | "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==", 580 | "requires": { 581 | "pify": "^3.0.0" 582 | } 583 | }, 584 | "pify": { 585 | "version": "3.0.0", 586 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz", 587 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=" 588 | }, 589 | "quick-lru": { 590 | "version": "1.1.0", 591 | "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", 592 | "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=" 593 | }, 594 | "read-pkg": { 595 | "version": "3.0.0", 596 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz", 597 | "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=", 598 | "requires": { 599 | "load-json-file": "^4.0.0", 600 | "normalize-package-data": "^2.3.2", 601 | "path-type": "^3.0.0" 602 | } 603 | }, 604 | "read-pkg-up": { 605 | "version": "3.0.0", 606 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", 607 | "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", 608 | "requires": { 609 | "find-up": "^2.0.0", 610 | "read-pkg": "^3.0.0" 611 | } 612 | }, 613 | "redent": { 614 | "version": "2.0.0", 615 | "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", 616 | "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", 617 | "requires": { 618 | "indent-string": "^3.0.0", 619 | "strip-indent": "^2.0.0" 620 | } 621 | }, 622 | "resolve": { 623 | "version": "1.20.0", 624 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz", 625 | "integrity": "sha512-wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==", 626 | "requires": { 627 | "is-core-module": "^2.2.0", 628 | "path-parse": "^1.0.6" 629 | } 630 | }, 631 | "semver": { 632 | "version": "6.3.0", 633 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", 634 | "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" 635 | }, 636 | "signal-exit": { 637 | "version": "3.0.5", 638 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.5.tgz", 639 | "integrity": "sha512-KWcOiKeQj6ZyXx7zq4YxSMgHRlod4czeBQZrPb8OKcohcqAXShm7E20kEMle9WBt26hFcAf0qLOcp5zmY7kOqQ==" 640 | }, 641 | "spdx-correct": { 642 | "version": "3.1.1", 643 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", 644 | "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", 645 | "requires": { 646 | "spdx-expression-parse": "^3.0.0", 647 | "spdx-license-ids": "^3.0.0" 648 | } 649 | }, 650 | "spdx-exceptions": { 651 | "version": "2.3.0", 652 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", 653 | "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" 654 | }, 655 | "spdx-expression-parse": { 656 | "version": "3.0.1", 657 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", 658 | "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", 659 | "requires": { 660 | "spdx-exceptions": "^2.1.0", 661 | "spdx-license-ids": "^3.0.0" 662 | } 663 | }, 664 | "spdx-license-ids": { 665 | "version": "3.0.10", 666 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.10.tgz", 667 | "integrity": "sha512-oie3/+gKf7QtpitB0LYLETe+k8SifzsX4KixvpOsbI6S0kRiRQ5MKOio8eMSAKQ17N06+wdEOXRiId+zOxo0hA==" 668 | }, 669 | "sprintf-js": { 670 | "version": "1.0.3", 671 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 672 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 673 | "optional": true 674 | }, 675 | "strip-bom": { 676 | "version": "3.0.0", 677 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", 678 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=" 679 | }, 680 | "strip-indent": { 681 | "version": "2.0.0", 682 | "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", 683 | "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" 684 | }, 685 | "supports-color": { 686 | "version": "5.5.0", 687 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", 688 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", 689 | "optional": true, 690 | "requires": { 691 | "has-flag": "^3.0.0" 692 | } 693 | }, 694 | "trim-newlines": { 695 | "version": "4.0.2", 696 | "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-4.0.2.tgz", 697 | "integrity": "sha512-GJtWyq9InR/2HRiLZgpIKv+ufIKrVrvjQWEj7PxAXNc5dwbNJkqhAUoAGgzRmULAnoOM5EIpveYd3J2VeSAIew==" 698 | }, 699 | "ts": { 700 | "version": "0.2.2", 701 | "resolved": "https://registry.npmjs.org/ts/-/ts-0.2.2.tgz", 702 | "integrity": "sha512-cftcjXvrxBi6TJxwXjKZXm9g8eNClLQuEN+Yt90o0baDCpRDCCYsDEz3Uhpc5D2Wx1IZE1G1B4M8GY3OLsczzQ==", 703 | "requires": { 704 | "axios": "^0.18.0", 705 | "figures": "^2.0.0", 706 | "find-package-json": "^1.1.0", 707 | "glob": "^7.1.3", 708 | "jsonfile-updater": "^3.1.0", 709 | "meow": "^5.0.0", 710 | "tslint": "5.*" 711 | }, 712 | "dependencies": { 713 | "axios": { 714 | "version": "0.18.1", 715 | "resolved": "https://registry.npmjs.org/axios/-/axios-0.18.1.tgz", 716 | "integrity": "sha512-0BfJq4NSfQXd+SkFdrvFbG7addhYSBA2mQwISr46pD6E5iqkWg02RAs8vyTT/j0RTnoYmeXauBuSv1qKwR179g==", 717 | "requires": { 718 | "follow-redirects": "1.5.10", 719 | "is-buffer": "^2.0.2" 720 | } 721 | }, 722 | "follow-redirects": { 723 | "version": "1.5.10", 724 | "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz", 725 | "integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==", 726 | "requires": { 727 | "debug": "=3.1.0" 728 | } 729 | } 730 | } 731 | }, 732 | "tslib": { 733 | "version": "1.14.1", 734 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", 735 | "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", 736 | "optional": true 737 | }, 738 | "tslint": { 739 | "version": "5.20.1", 740 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.20.1.tgz", 741 | "integrity": "sha512-EcMxhzCFt8k+/UP5r8waCf/lzmeSyVlqxqMEDQE7rWYiQky8KpIBz1JAoYXfROHrPZ1XXd43q8yQnULOLiBRQg==", 742 | "optional": true, 743 | "requires": { 744 | "@babel/code-frame": "^7.0.0", 745 | "builtin-modules": "^1.1.1", 746 | "chalk": "^2.3.0", 747 | "commander": "^2.12.1", 748 | "diff": "^4.0.1", 749 | "glob": "^7.1.1", 750 | "js-yaml": "^3.13.1", 751 | "minimatch": "^3.0.4", 752 | "mkdirp": "^0.5.1", 753 | "resolve": "^1.3.2", 754 | "semver": "^5.3.0", 755 | "tslib": "^1.8.0", 756 | "tsutils": "^2.29.0" 757 | }, 758 | "dependencies": { 759 | "semver": { 760 | "version": "5.7.1", 761 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 762 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", 763 | "optional": true 764 | } 765 | } 766 | }, 767 | "tsutils": { 768 | "version": "2.29.0", 769 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 770 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 771 | "optional": true, 772 | "requires": { 773 | "tslib": "^1.8.1" 774 | } 775 | }, 776 | "tunnel": { 777 | "version": "0.0.6", 778 | "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", 779 | "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" 780 | }, 781 | "typescript": { 782 | "version": "4.6.3", 783 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.6.3.tgz", 784 | "integrity": "sha512-yNIatDa5iaofVozS/uQJEl3JRWLKKGJKh6Yaiv0GLGSuhpFJe7P3SbHZ8/yjAHRQwKRoA6YZqlfjXWmVzoVSMw==", 785 | "dev": true 786 | }, 787 | "uuid": { 788 | "version": "3.4.0", 789 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", 790 | "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" 791 | }, 792 | "validate-npm-package-license": { 793 | "version": "3.0.4", 794 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", 795 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", 796 | "requires": { 797 | "spdx-correct": "^3.0.0", 798 | "spdx-expression-parse": "^3.0.0" 799 | } 800 | }, 801 | "wrappy": { 802 | "version": "1.0.2", 803 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 804 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 805 | }, 806 | "yargs-parser": { 807 | "version": "21.0.1", 808 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.0.1.tgz", 809 | "integrity": "sha512-9BK1jFpLzJROCI5TzwZL/TU4gqjK5xiHV/RfWLOahrjAko/e4DJkRDZQXfvqAsiZzzYhgAzbgz6lg48jcm4GLg==" 810 | } 811 | } 812 | } 813 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "setup-vlang-action", 3 | "version": "1.2.2", 4 | "private": true, 5 | "description": "setup vlang action", 6 | "main": "src/index.ts", 7 | "scripts": { 8 | "build": "tsc && ncc build", 9 | "pre-checkin": "npm run build && npm test", 10 | "postversion": "git push && git push --tags", 11 | "release": "git checkout && npm version" 12 | }, 13 | "repository": { 14 | "type": "git", 15 | "url": "git+https://github.com/nocturlab/setup-vlang-action.git" 16 | }, 17 | "keywords": [ 18 | "actions", 19 | "vlang", 20 | "setup" 21 | ], 22 | "author": "shiipou", 23 | "license": "MIT", 24 | "dependencies": { 25 | "@actions/core": "^1.6.0", 26 | "@actions/http-client": "^1.0.11", 27 | "@actions/tool-cache": "^1.7.2", 28 | "axios": ">=0.26.1", 29 | "g": "^2.0.1", 30 | "trim-newlines": ">=3.0.1", 31 | "ts": "^0.2.2", 32 | "yargs-parser": ">=21.0.1" 33 | }, 34 | "devDependencies": { 35 | "@types/node": "^17.0.23", 36 | "@zeit/ncc": "^0.22.3", 37 | "typescript": "^4.6.3" 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /src/index.ts: -------------------------------------------------------------------------------- 1 | // Inspired by https://github.com/actions/setup-go 2 | 3 | import * as core from '@actions/core'; 4 | import * as tc from '@actions/tool-cache'; 5 | import * as installer from './installer'; 6 | import * as path from 'path'; 7 | import * as fs from 'fs'; 8 | 9 | export async function run() { 10 | // try { 11 | let v_version = core.getInput('v-version'); 12 | 13 | console.log(`Setup V with version ${v_version}`); 14 | 15 | if (v_version) { 16 | let cache_dir: string | undefined = tc.find('nocturlab/setup-vlang-action', v_version); 17 | let install_dir: string | undefined; 18 | 19 | if (!cache_dir) { 20 | console.log(`V ${v_version} can't be found using cache, attempting to download ...`); 21 | install_dir = await installer.download_v(v_version); 22 | console.log(`V Installed to ${install_dir}`); 23 | } 24 | 25 | if (install_dir) { 26 | core.exportVariable('V_HOME', install_dir); 27 | core.setOutput('v_home', install_dir); 28 | core.addPath(install_dir); 29 | console.log('Added V to the path'); 30 | } else { 31 | throw new Error(`Could not find a version that satisfied version spec: ${v_version}`); 32 | } 33 | } 34 | 35 | // add problem matchers 36 | const matchersPath = path.join(__dirname, '..', 'matchers.json'); 37 | console.log(`##[add-matcher]${matchersPath}`); 38 | /* } catch (error) { 39 | console.log(error); 40 | // core.setFailed(error.message); 41 | }*/ 42 | } 43 | 44 | run(); 45 | -------------------------------------------------------------------------------- /src/installer.ts: -------------------------------------------------------------------------------- 1 | import * as tc from '@actions/tool-cache'; 2 | import * as path from 'path'; 3 | import * as httpm from '@actions/http-client'; 4 | import * as sys from './system'; 5 | import {debug} from '@actions/core'; 6 | import {execSync} from 'child_process'; 7 | 8 | export async function download_v(v_version: string): Promise { 9 | let download_path: string | undefined; 10 | let ext_path: string | undefined; 11 | let cache_path: string | undefined; 12 | 13 | try { 14 | // download 15 | let download_url: string = `https://github.com/vlang/v/releases/` 16 | if(v_version.includes('latest')) 17 | download_url+= `${v_version}/download/v_${sys.getPlatform()}.zip` 18 | else if(v_version.includes('master')){ 19 | download_url = `https://github.com/vlang/v/archive/master.zip` 20 | }else 21 | download_url+= `download/${v_version}/v_${sys.getPlatform()}.zip` 22 | 23 | console.log(`Downloading V from ${download_url}`); 24 | 25 | download_path = await tc.downloadTool(download_url); 26 | console.log(`V downloaded to ${download_path}`); 27 | } catch (error) { 28 | throw new Error(`Failed to download V version ${v_version}: ${error}`); 29 | } 30 | 31 | try { 32 | // extract 33 | console.log('Extracting V...'); 34 | ext_path = await tc.extractZip(download_path, './.vlang_tmp_build'); 35 | console.log(`V extracted to ${ext_path}`); 36 | 37 | if(v_version.includes('master')) { 38 | console.log(`Building V from sources`); 39 | ext_path = path.join(ext_path, 'v-master/'); 40 | console.log(execSync(`make`, { cwd: ext_path }).toString()); 41 | }else{ 42 | ext_path = path.join(ext_path, 'v/'); 43 | } 44 | 45 | // extracts with a root folder that matches the fileName downloaded 46 | console.log(`Add V to cache`); 47 | cache_path = await tc.cacheDir(ext_path, 'nocturlab/setup-vlang-action', v_version); 48 | console.log(`V was added to cache using dir: ${cache_path}`); 49 | } catch (error) { 50 | throw new Error(`Failed to extract V version ${v_version}: ${error}`); 51 | } 52 | 53 | return cache_path; 54 | } 55 | -------------------------------------------------------------------------------- /src/system.ts: -------------------------------------------------------------------------------- 1 | let os = require('os'); 2 | 3 | export function getPlatform(): string { 4 | // darwin and linux match already 5 | // freebsd not supported yet but future proofed. 6 | 7 | // 'aix', 'darwin', 'freebsd', 'linux', 'openbsd', 'sunos', and 'win32' 8 | let plat: string = os.platform(); 9 | 10 | // wants 'macos', 'freebsd', 'linux', 'windows' 11 | if (plat === 'win32') { 12 | plat = 'windows'; 13 | }else if (plat === 'darwin') { 14 | plat = 'macos'; 15 | } 16 | 17 | return plat; 18 | } 19 | 20 | export function getArch(): string { 21 | // 'arm', 'arm64', 'ia32', 'mips', 'mipsel', 'ppc', 'ppc64', 's390', 's390x', 'x32', and 'x64'. 22 | let arch: string = os.arch(); 23 | 24 | // wants amd64, 386, arm64, armv61, ppc641e, s390x 25 | // currently not supported by runner but future proofed mapping 26 | switch (arch) { 27 | case 'x64': 28 | arch = 'amd64'; 29 | break; 30 | // case 'ppc': 31 | // arch = 'ppc64'; 32 | // break; 33 | case 'x32': 34 | arch = '386'; 35 | break; 36 | } 37 | 38 | return arch; 39 | } 40 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Basic Options */ 4 | // "incremental": true, /* Enable incremental compilation */ 5 | "target": "es6", /* Specify ECMAScript target version: 'ES3' (default), 'ES5', 'ES2015', 'ES2016', 'ES2017', 'ES2018', 'ES2019' or 'ESNEXT'. */ 6 | "module": "commonjs", /* Specify module code generation: 'none', 'commonjs', 'amd', 'system', 'umd', 'es2015', or 'ESNext'. */ 7 | // "allowJs": true, /* Allow javascript files to be compiled. */ 8 | // "checkJs": true, /* Report errors in .js files. */ 9 | // "jsx": "preserve", /* Specify JSX code generation: 'preserve', 'react-native', or 'react'. */ 10 | // "declaration": true, /* Generates corresponding '.d.ts' file. */ 11 | // "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ 12 | // "sourceMap": true, /* Generates corresponding '.map' file. */ 13 | // "outFile": "./", /* Concatenate and emit output to single file. */ 14 | "outDir": "./lib", /* Redirect output structure to the directory. */ 15 | "rootDir": "./src", /* Specify the root directory of input files. Use to control the output directory structure with --outDir. */ 16 | // "composite": true, /* Enable project compilation */ 17 | // "tsBuildInfoFile": "./", /* Specify file to store incremental compilation information */ 18 | // "removeComments": true, /* Do not emit comments to output. */ 19 | // "noEmit": true, /* Do not emit outputs. */ 20 | // "importHelpers": true, /* Import emit helpers from 'tslib'. */ 21 | // "downlevelIteration": true, /* Provide full support for iterables in 'for-of', spread, and destructuring when targeting 'ES5' or 'ES3'. */ 22 | // "isolatedModules": true, /* Transpile each file as a separate module (similar to 'ts.transpileModule'). */ 23 | 24 | /* Strict Type-Checking Options */ 25 | "strict": true, /* Enable all strict type-checking options. */ 26 | // "noImplicitAny": true, /* Raise error on expressions and declarations with an implied 'any' type. */ 27 | // "strictNullChecks": true, /* Enable strict null checks. */ 28 | // "strictFunctionTypes": true, /* Enable strict checking of function types. */ 29 | // "strictBindCallApply": true, /* Enable strict 'bind', 'call', and 'apply' methods on functions. */ 30 | // "strictPropertyInitialization": true, /* Enable strict checking of property initialization in classes. */ 31 | // "noImplicitThis": true, /* Raise error on 'this' expressions with an implied 'any' type. */ 32 | // "alwaysStrict": true, /* Parse in strict mode and emit "use strict" for each source file. */ 33 | 34 | /* Additional Checks */ 35 | // "noUnusedLocals": true, /* Report errors on unused locals. */ 36 | // "noUnusedParameters": true, /* Report errors on unused parameters. */ 37 | // "noImplicitReturns": true, /* Report error when not all code paths in function return a value. */ 38 | // "noFallthroughCasesInSwitch": true, /* Report errors for fallthrough cases in switch statement. */ 39 | 40 | /* Module Resolution Options */ 41 | // "moduleResolution": "node", /* Specify module resolution strategy: 'node' (Node.js) or 'classic' (TypeScript pre-1.6). */ 42 | // "baseUrl": "./", /* Base directory to resolve non-absolute module names. */ 43 | // "paths": {}, /* A series of entries which re-map imports to lookup locations relative to the 'baseUrl'. */ 44 | // "rootDirs": [], /* List of root folders whose combined content represents the structure of the project at runtime. */ 45 | // "typeRoots": [], /* List of folders to include type definitions from. */ 46 | // "types": [], /* Type declaration files to be included in compilation. */ 47 | // "allowSyntheticDefaultImports": true, /* Allow default imports from modules with no default export. This does not affect code emit, just typechecking. */ 48 | "esModuleInterop": true /* Enables emit interoperability between CommonJS and ES Modules via creation of namespace objects for all imports. Implies 'allowSyntheticDefaultImports'. */ 49 | // "preserveSymlinks": true, /* Do not resolve the real path of symlinks. */ 50 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 51 | 52 | /* Source Map Options */ 53 | // "sourceRoot": "", /* Specify the location where debugger should locate TypeScript files instead of source locations. */ 54 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 55 | // "inlineSourceMap": true, /* Emit a single file with source maps instead of having a separate file. */ 56 | // "inlineSources": true, /* Emit the source alongside the sourcemaps within a single file; requires '--inlineSourceMap' or '--sourceMap' to be set. */ 57 | 58 | /* Experimental Options */ 59 | // "experimentalDecorators": true, /* Enables experimental support for ES7 decorators. */ 60 | // "emitDecoratorMetadata": true, /* Enables experimental support for emitting type metadata for decorators. */ 61 | }, 62 | "exclude": ["node_modules", "**/*.test.ts"] 63 | } 64 | --------------------------------------------------------------------------------