├── .github └── workflows │ └── build-and-deploy-image.yaml ├── .gitignore ├── .vscode └── settings.json ├── LICENSE ├── README.md ├── action.yml ├── build_commands.txt ├── container ├── Dockerfile ├── server.ts ├── sshd_config └── startup.sh ├── dist └── index.js ├── index.js ├── package-lock.json └── package.json /.github/workflows/build-and-deploy-image.yaml: -------------------------------------------------------------------------------- 1 | name: Build and push Docker image 2 | 3 | on: 4 | workflow_dispatch: 5 | inputs: 6 | denoVersion: 7 | description: 'Deno Version' 8 | required: true 9 | default: '1.3.1' 10 | pushLatest: 11 | description: 'Also push latest' 12 | required: true 13 | default: 'false' 14 | 15 | jobs: 16 | buildAndPush: 17 | name: Build and push Deno ${{ github.event.inputs.denoVersion }} 18 | runs-on: ubuntu-latest 19 | 20 | steps: 21 | 22 | - name: Checkout code 23 | uses: actions/checkout@v2 24 | 25 | - name: Build and push Docker image 26 | uses: docker/build-push-action@v1 27 | with: 28 | username: anthonychu 29 | password: ${{ secrets.DOCKER_HUB_PASSWORD }} 30 | repository: anthonychu/azure-webapps-deno 31 | build_args: DENO_VERSION=${{ github.event.inputs.denoVersion }} 32 | tags: ${{ github.event.inputs.denoVersion }} 33 | path: container 34 | 35 | - name: Push latest tag 36 | if: github.event.inputs.pushLatest == 'true' 37 | uses: docker/build-push-action@v1 38 | with: 39 | username: anthonychu 40 | password: ${{ secrets.DOCKER_HUB_PASSWORD }} 41 | repository: anthonychu/azure-webapps-deno 42 | build_args: DENO_VERSION=${{ github.event.inputs.denoVersion }} 43 | tags: latest 44 | path: container 45 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Logs 2 | logs 3 | *.log 4 | npm-debug.log* 5 | yarn-debug.log* 6 | yarn-error.log* 7 | lerna-debug.log* 8 | 9 | # Diagnostic reports (https://nodejs.org/api/report.html) 10 | report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json 11 | 12 | # Runtime data 13 | pids 14 | *.pid 15 | *.seed 16 | *.pid.lock 17 | 18 | # Directory for instrumented libs generated by jscoverage/JSCover 19 | lib-cov 20 | 21 | # Coverage directory used by tools like istanbul 22 | coverage 23 | *.lcov 24 | 25 | # nyc test coverage 26 | .nyc_output 27 | 28 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 29 | .grunt 30 | 31 | # Bower dependency directory (https://bower.io/) 32 | bower_components 33 | 34 | # node-waf configuration 35 | .lock-wscript 36 | 37 | # Compiled binary addons (https://nodejs.org/api/addons.html) 38 | build/Release 39 | 40 | # Dependency directories 41 | node_modules/ 42 | jspm_packages/ 43 | 44 | # Snowpack dependency directory (https://snowpack.dev/) 45 | web_modules/ 46 | 47 | # TypeScript cache 48 | *.tsbuildinfo 49 | 50 | # Optional npm cache directory 51 | .npm 52 | 53 | # Optional eslint cache 54 | .eslintcache 55 | 56 | # Microbundle cache 57 | .rpt2_cache/ 58 | .rts2_cache_cjs/ 59 | .rts2_cache_es/ 60 | .rts2_cache_umd/ 61 | 62 | # Optional REPL history 63 | .node_repl_history 64 | 65 | # Output of 'npm pack' 66 | *.tgz 67 | 68 | # Yarn Integrity file 69 | .yarn-integrity 70 | 71 | # dotenv environment variables file 72 | .env 73 | .env.test 74 | 75 | # parcel-bundler cache (https://parceljs.org/) 76 | .cache 77 | .parcel-cache 78 | 79 | # Next.js build output 80 | .next 81 | out 82 | 83 | # Nuxt.js build / generate output 84 | .nuxt 85 | #dist 86 | 87 | # Gatsby files 88 | .cache/ 89 | # Comment in the public line in if your project uses Gatsby and not Next.js 90 | # https://nextjs.org/blog/next-9-1#public-directory-support 91 | # public 92 | 93 | # vuepress build output 94 | .vuepress/dist 95 | 96 | # Serverless directories 97 | .serverless/ 98 | 99 | # FuseBox cache 100 | .fusebox/ 101 | 102 | # DynamoDB Local files 103 | .dynamodb/ 104 | 105 | # TernJS port file 106 | .tern-port 107 | 108 | # Stores VSCode versions used for testing VSCode extensions 109 | .vscode-test 110 | 111 | # yarn v2 112 | .yarn/cache 113 | .yarn/unplugged 114 | .yarn/build-state.yml 115 | .yarn/install-state.gz 116 | .pnp.* 117 | -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "deno.enable": false 3 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 Anthony Chu 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 | # Azure Web Apps Deno Deploy action 2 | 3 | This action deploys a Deno app to Azure Web Apps (Linux). 4 | 5 | ## Inputs 6 | 7 | ### `app-name` 8 | 9 | **Required** Name of the Azure Web App. 10 | 11 | ### `resource-group` 12 | 13 | **Required** Name of the resource group. 14 | 15 | ### `package` 16 | 17 | **Required** Path to zip package to deploy. 18 | 19 | ### `script-file` 20 | 21 | **Required** Path to the script file to pass to `deno run`. 22 | 23 | ### `deno-version` 24 | 25 | **Optional** Deno version to use (default: `latest`). 26 | 27 | See the [image tags](https://hub.docker.com/r/anthonychu/azure-webapps-deno/tags) for valid versions. 28 | 29 | ## Outputs 30 | 31 | None 32 | 33 | ## Example usage 34 | 35 | ```yaml 36 | on: [push] 37 | 38 | name: Deploy to Azure 39 | 40 | jobs: 41 | 42 | build-and-deploy: 43 | runs-on: ubuntu-latest 44 | steps: 45 | 46 | - uses: actions/checkout@v2 47 | 48 | - uses: azure/login@v1.1 49 | with: 50 | creds: ${{ secrets.AZURE_CREDENTIALS }} 51 | 52 | - name: Set up Deno 53 | uses: denolib/setup-deno@master 54 | with: 55 | deno-version: "1.2.0" 56 | 57 | - name: Bundle and zip Deno app 58 | run: | 59 | deno bundle server.ts server.bundle.js 60 | zip app.zip server.bundle.js 61 | 62 | - name: Deploy to Azure Web Apps 63 | uses: anthonychu/azure-webapps-deno-deploy@main 64 | with: 65 | app-name: my-app 66 | resource-group: my-resource-group 67 | package: app.zip 68 | script-file: server.bundle.js 69 | deno-version: "1.2.0" 70 | ``` 71 | 72 | ## How it works 73 | 74 | This action configures an Azure Web App for Linux to use a [custom runtime image](https://hub.docker.com/r/anthonychu/azure-webapps-deno) and deploys your code using [Run From Package](https://docs.microsoft.com/azure/azure-functions/run-functions-from-deployment-package). 75 | 76 | It calls the Azure CLI. Ensure your workflow first authenticates `azure/login`. 77 | 78 | --- 79 | 80 | *This is a community open source project. No official support is provided by Microsoft.* 81 | -------------------------------------------------------------------------------- /action.yml: -------------------------------------------------------------------------------- 1 | name: Deploy Deno to Azure App Service 2 | description: Publish a Deno 🦕 web app to Azure App Service on Linux 3 | branding: 4 | icon: arrow-up-circle 5 | color: blue 6 | inputs: 7 | app-name: 8 | description: Name of the Azure Web App 9 | required: true 10 | resource-group: 11 | description: Name of the resource group 12 | required: true 13 | package: 14 | description: Path to zip package to deploy 15 | required: true 16 | script-file: 17 | description: Path to script to pass to deno run 18 | required: true 19 | deno-version: 20 | description: Version of deno to use 21 | required: false 22 | default: latest 23 | runs: 24 | using: node12 25 | main: dist/index.js -------------------------------------------------------------------------------- /build_commands.txt: -------------------------------------------------------------------------------- 1 | docker build --build-arg DENO_VERSION=1.0.4 -t anthonychu/azure-webapps-deno:1.0.4 . 2 | npm run build 3 | 4 | # move tag 5 | git tag -f -a 6 | git push -f --tags -------------------------------------------------------------------------------- /container/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM debian:stable-20200514-slim 2 | 3 | ARG DENO_VERSION=1.0.2 4 | ENV DENO_VERSION=${DENO_VERSION} 5 | ARG DEBIAN_FRONTEND=noninteractive 6 | 7 | RUN apt-get -qq update \ 8 | && apt-get -qq install -y --no-install-recommends curl ca-certificates unzip openssh-server \ 9 | && curl -fsSL https://github.com/denoland/deno/releases/download/v${DENO_VERSION}/deno-x86_64-unknown-linux-gnu.zip \ 10 | --output deno.zip \ 11 | && unzip deno.zip \ 12 | && rm deno.zip \ 13 | && chmod +x deno \ 14 | && mv deno /usr/bin/deno \ 15 | && apt-get -qq remove --purge -y curl ca-certificates unzip \ 16 | && apt-get -y -qq autoremove \ 17 | && apt-get -qq clean \ 18 | && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/* \ 19 | && mkdir -p /home/site/wwwroot /opt/defaultsite \ 20 | && echo "root:Docker!" | chpasswd \ 21 | && rm -f /etc/ssh/sshd_config \ 22 | && mkdir -p /var/run/sshd \ 23 | && chmod 0755 /var/run/sshd 24 | 25 | ENV DENO_DIR /deno-dir/ 26 | ENV PORT 80 27 | ENV SSH_PORT 2222 28 | EXPOSE 80 2222 29 | 30 | COPY sshd_config /etc/ssh/ 31 | 32 | WORKDIR /home/site/wwwroot 33 | COPY . /opt/defaultsite 34 | RUN chmod +x /opt/defaultsite/startup.sh 35 | 36 | ENTRYPOINT [ "/opt/defaultsite/startup.sh" ] 37 | CMD ["deno", "run", "-A", "/opt/defaultsite/server.ts"] 38 | -------------------------------------------------------------------------------- /container/server.ts: -------------------------------------------------------------------------------- 1 | import { Application, Context } from "https://deno.land/x/oak@v4.0.0/mod.ts"; 2 | 3 | const app = new Application(); 4 | 5 | app.use((ctx: any) => { 6 | ctx.response.body = "Welcome to Azure Web Apps"; 7 | console.log(`request received: ${ctx.request.url}`); 8 | }); 9 | 10 | const port = Deno.env.get("PORT") || "8080"; 11 | console.log(`Starting server at port: ${port}`); 12 | await app.listen({ port: +port }); -------------------------------------------------------------------------------- /container/sshd_config: -------------------------------------------------------------------------------- 1 | # This is ssh server systemwide configuration file. 2 | # 3 | # /etc/sshd_config 4 | 5 | Port SSH_PORT 6 | ListenAddress 0.0.0.0 7 | LoginGraceTime 180 8 | X11Forwarding yes 9 | Ciphers aes128-cbc,3des-cbc,aes256-cbc,aes128-ctr,aes192-ctr,aes256-ctr 10 | MACs hmac-sha1,hmac-sha1-96 11 | StrictModes yes 12 | SyslogFacility DAEMON 13 | PasswordAuthentication yes 14 | PermitEmptyPasswords no 15 | PermitRootLogin yes 16 | Subsystem sftp internal-sftp 17 | -------------------------------------------------------------------------------- /container/startup.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -e 3 | 4 | # starting sshd process 5 | sed -i "s/SSH_PORT/$SSH_PORT/g" /etc/ssh/sshd_config 6 | /usr/sbin/sshd 7 | 8 | echo deno version `deno --version` 9 | exec "$@" 10 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | const core = require('@actions/core'); 2 | const github = require('@actions/github'); 3 | const exec = require('@actions/exec'); 4 | const fetch = require('node-fetch'); 5 | 6 | async function main() { 7 | try { 8 | const appName = core.getInput('app-name'); 9 | const resourceGroup = core.getInput('resource-group'); 10 | const package = core.getInput('package'); 11 | const scriptFile = core.getInput('script-file'); 12 | const denoVersion = core.getInput('deno-version') || 'latest'; 13 | 14 | const tags = await getImageTags(); 15 | if (!tags.includes(denoVersion)) { 16 | core.error(`${denoVersion} is not valid.`); 17 | core.info('Please use one of the following versions:'); 18 | core.info(tags.sort().join('\n')); 19 | core.setFailed(); 20 | return; 21 | } 22 | 23 | const imageName = `anthonychu/azure-webapps-deno:${denoVersion}`; 24 | 25 | const { output: containerInfoJson } = await runAzCommand([ 'webapp', 'config', 'container', 'show', '-n', appName, '-g', resourceGroup ]); 26 | const containerInfo = JSON.parse(containerInfoJson); 27 | 28 | const webAppImageName = containerInfo.find(i => i.name === 'DOCKER_CUSTOM_IMAGE_NAME'); 29 | const webAppEnableStorage = containerInfo.find(s => s.name === 'WEBSITES_ENABLE_APP_SERVICE_STORAGE'); 30 | 31 | const { output: appSettingsJson } = await runAzCommand([ 'webapp', 'config', 'appsettings', 'list', '-n', appName, '-g', resourceGroup ]); 32 | const appSettings = JSON.parse(appSettingsJson); 33 | 34 | const webAppRunFromPackage = appSettings.find(s => s.name === 'WEBSITE_RUN_FROM_PACKAGE'); 35 | 36 | const hasCorrectImage = webAppImageName && webAppImageName.value === imageName; 37 | const isAppServiceStorageEnabled = webAppEnableStorage && webAppEnableStorage === 'true'; 38 | if (!hasCorrectImage || !isAppServiceStorageEnabled) { 39 | core.info('Configuring custom Deno runtime image...'); 40 | await runAzCommand([ 'webapp', 'config', 'container', 'set', '-n', appName, '-g', resourceGroup, '-i', imageName, '-r', 'https://index.docker.io', '-u', '', '-p', '', '-t', 'true' ]); 41 | await runAzCommand([ 'webapp', 'config', 'set', '-n', appName, '-g', resourceGroup, '--startup-file', '' ]); 42 | } 43 | 44 | const isRunFromPackageEnabled = webAppRunFromPackage && webAppRunFromPackage.value === '1'; 45 | if (!isRunFromPackageEnabled) { 46 | core.info('Configuring run from package...'); 47 | await runAzCommand([ 'webapp', 'config', 'appsettings', 'set', '-n', appName, '-g', resourceGroup, '--settings', 'WEBSITE_RUN_FROM_PACKAGE=1' ]); 48 | } 49 | 50 | let retryCount = 0; 51 | while (retryCount < 3) { 52 | try { 53 | core.info('Uploading package...') 54 | await runAzCommand([ 'webapp', 'deployment', 'source', 'config-zip', '-n', appName, '-g', resourceGroup, '--src', package ]); 55 | break; 56 | } catch (ex) { 57 | // sometimes deployment fails transiently 58 | core.error(ex); 59 | retryCount += 1; 60 | } 61 | } 62 | await runAzCommand([ 'webapp', 'config', 'set', '-n', appName, '-g', resourceGroup, '--startup-file', `deno run -A --unstable ${scriptFile}` ]); 63 | 64 | } catch (error) { 65 | core.setFailed(error.message); 66 | } 67 | 68 | async function runAzCommand(args) { 69 | let output = ''; 70 | let error = ''; 71 | 72 | const options = { 73 | listeners: { 74 | stdout: (data) => { 75 | output += data.toString(); 76 | }, 77 | stderr: (data) => { 78 | error += data.toString(); 79 | } 80 | }, 81 | silent: false 82 | }; 83 | 84 | const exitCode = await exec.exec('az', [...args, '-o', 'json'], options); 85 | 86 | return { 87 | exitCode, 88 | output, 89 | error 90 | }; 91 | } 92 | 93 | async function getImageTags() { 94 | const tags = []; 95 | let url = 'https://registry.hub.docker.com/v2/repositories/anthonychu/azure-webapps-deno/tags'; 96 | while(true) { 97 | const resp = await fetch(url); 98 | const { next, results } = await resp.json(); 99 | tags.push(...(results.map(r => r.name))); 100 | if (!next) { 101 | return tags; 102 | } 103 | url = next; 104 | } 105 | } 106 | } 107 | 108 | main(); -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "azure-webapps-deno-deploy", 3 | "requires": true, 4 | "lockfileVersion": 1, 5 | "dependencies": { 6 | "@actions/core": { 7 | "version": "1.2.4", 8 | "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.4.tgz", 9 | "integrity": "sha512-YJCEq8BE3CdN8+7HPZ/4DxJjk/OkZV2FFIf+DlZTC/4iBlzYCD5yjRR6eiOS5llO11zbRltIRuKAjMKaWTE6cg==" 10 | }, 11 | "@actions/exec": { 12 | "version": "1.0.4", 13 | "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.0.4.tgz", 14 | "integrity": "sha512-4DPChWow9yc9W3WqEbUj8Nr86xkpyE29ZzWjXucHItclLbEW6jr80Zx4nqv18QL6KK65+cifiQZXvnqgTV6oHw==", 15 | "requires": { 16 | "@actions/io": "^1.0.1" 17 | } 18 | }, 19 | "@actions/github": { 20 | "version": "2.2.0", 21 | "resolved": "https://registry.npmjs.org/@actions/github/-/github-2.2.0.tgz", 22 | "integrity": "sha512-9UAZqn8ywdR70n3GwVle4N8ALosQs4z50N7XMXrSTUVOmVpaBC5kE3TRTT7qQdi3OaQV24mjGuJZsHUmhD+ZXw==", 23 | "requires": { 24 | "@actions/http-client": "^1.0.3", 25 | "@octokit/graphql": "^4.3.1", 26 | "@octokit/rest": "^16.43.1" 27 | } 28 | }, 29 | "@actions/http-client": { 30 | "version": "1.0.8", 31 | "resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.8.tgz", 32 | "integrity": "sha512-G4JjJ6f9Hb3Zvejj+ewLLKLf99ZC+9v+yCxoYf9vSyH+WkzPLB2LuUtRMGNkooMqdugGBFStIKXOuvH1W+EctA==", 33 | "requires": { 34 | "tunnel": "0.0.6" 35 | } 36 | }, 37 | "@actions/io": { 38 | "version": "1.0.2", 39 | "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.0.2.tgz", 40 | "integrity": "sha512-J8KuFqVPr3p6U8W93DOXlXW6zFvrQAJANdS+vw0YhusLIq+bszW8zmK2Fh1C2kDPX8FMvwIl1OUcFgvJoXLbAg==" 41 | }, 42 | "@octokit/auth-token": { 43 | "version": "2.4.1", 44 | "resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.1.tgz", 45 | "integrity": "sha512-NB81O5h39KfHYGtgfWr2booRxp2bWOJoqbWwbyUg2hw6h35ArWYlAST5B3XwAkbdcx13yt84hFXyFP5X0QToWA==", 46 | "requires": { 47 | "@octokit/types": "^4.0.1" 48 | } 49 | }, 50 | "@octokit/endpoint": { 51 | "version": "6.0.2", 52 | "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-6.0.2.tgz", 53 | "integrity": "sha512-xs1mmCEZ2y4shXCpFjNq3UbmNR+bLzxtZim2L0zfEtj9R6O6kc4qLDvYw66hvO6lUsYzPTM5hMkltbuNAbRAcQ==", 54 | "requires": { 55 | "@octokit/types": "^4.0.1", 56 | "is-plain-object": "^3.0.0", 57 | "universal-user-agent": "^5.0.0" 58 | } 59 | }, 60 | "@octokit/graphql": { 61 | "version": "4.5.0", 62 | "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.5.0.tgz", 63 | "integrity": "sha512-StJWfn0M1QfhL3NKBz31e1TdDNZrHLLS57J2hin92SIfzlOVBuUaRkp31AGkGOAFOAVtyEX6ZiZcsjcJDjeb5g==", 64 | "requires": { 65 | "@octokit/request": "^5.3.0", 66 | "@octokit/types": "^4.0.1", 67 | "universal-user-agent": "^5.0.0" 68 | } 69 | }, 70 | "@octokit/plugin-paginate-rest": { 71 | "version": "1.1.2", 72 | "resolved": "https://registry.npmjs.org/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-1.1.2.tgz", 73 | "integrity": "sha512-jbsSoi5Q1pj63sC16XIUboklNw+8tL9VOnJsWycWYR78TKss5PVpIPb1TUUcMQ+bBh7cY579cVAWmf5qG+dw+Q==", 74 | "requires": { 75 | "@octokit/types": "^2.0.1" 76 | }, 77 | "dependencies": { 78 | "@octokit/types": { 79 | "version": "2.16.2", 80 | "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", 81 | "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", 82 | "requires": { 83 | "@types/node": ">= 8" 84 | } 85 | } 86 | } 87 | }, 88 | "@octokit/plugin-request-log": { 89 | "version": "1.0.0", 90 | "resolved": "https://registry.npmjs.org/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz", 91 | "integrity": "sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw==" 92 | }, 93 | "@octokit/plugin-rest-endpoint-methods": { 94 | "version": "2.4.0", 95 | "resolved": "https://registry.npmjs.org/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-2.4.0.tgz", 96 | "integrity": "sha512-EZi/AWhtkdfAYi01obpX0DF7U6b1VRr30QNQ5xSFPITMdLSfhcBqjamE3F+sKcxPbD7eZuMHu3Qkk2V+JGxBDQ==", 97 | "requires": { 98 | "@octokit/types": "^2.0.1", 99 | "deprecation": "^2.3.1" 100 | }, 101 | "dependencies": { 102 | "@octokit/types": { 103 | "version": "2.16.2", 104 | "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", 105 | "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", 106 | "requires": { 107 | "@types/node": ">= 8" 108 | } 109 | } 110 | } 111 | }, 112 | "@octokit/request": { 113 | "version": "5.4.4", 114 | "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.4.4.tgz", 115 | "integrity": "sha512-vqv1lz41c6VTxUvF9nM+a6U+vvP3vGk7drDpr0DVQg4zyqlOiKVrY17DLD6de5okj+YLHKcoqaUZTBtlNZ1BtQ==", 116 | "requires": { 117 | "@octokit/endpoint": "^6.0.1", 118 | "@octokit/request-error": "^2.0.0", 119 | "@octokit/types": "^4.0.1", 120 | "deprecation": "^2.0.0", 121 | "is-plain-object": "^3.0.0", 122 | "node-fetch": "^2.3.0", 123 | "once": "^1.4.0", 124 | "universal-user-agent": "^5.0.0" 125 | } 126 | }, 127 | "@octokit/request-error": { 128 | "version": "2.0.1", 129 | "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-2.0.1.tgz", 130 | "integrity": "sha512-5lqBDJ9/TOehK82VvomQ6zFiZjPeSom8fLkFVLuYL3sKiIb5RB8iN/lenLkY7oBmyQcGP7FBMGiIZTO8jufaRQ==", 131 | "requires": { 132 | "@octokit/types": "^4.0.1", 133 | "deprecation": "^2.0.0", 134 | "once": "^1.4.0" 135 | } 136 | }, 137 | "@octokit/rest": { 138 | "version": "16.43.1", 139 | "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.43.1.tgz", 140 | "integrity": "sha512-gfFKwRT/wFxq5qlNjnW2dh+qh74XgTQ2B179UX5K1HYCluioWj8Ndbgqw2PVqa1NnVJkGHp2ovMpVn/DImlmkw==", 141 | "requires": { 142 | "@octokit/auth-token": "^2.4.0", 143 | "@octokit/plugin-paginate-rest": "^1.1.1", 144 | "@octokit/plugin-request-log": "^1.0.0", 145 | "@octokit/plugin-rest-endpoint-methods": "2.4.0", 146 | "@octokit/request": "^5.2.0", 147 | "@octokit/request-error": "^1.0.2", 148 | "atob-lite": "^2.0.0", 149 | "before-after-hook": "^2.0.0", 150 | "btoa-lite": "^1.0.0", 151 | "deprecation": "^2.0.0", 152 | "lodash.get": "^4.4.2", 153 | "lodash.set": "^4.3.2", 154 | "lodash.uniq": "^4.5.0", 155 | "octokit-pagination-methods": "^1.1.0", 156 | "once": "^1.4.0", 157 | "universal-user-agent": "^4.0.0" 158 | }, 159 | "dependencies": { 160 | "@octokit/request-error": { 161 | "version": "1.2.1", 162 | "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-1.2.1.tgz", 163 | "integrity": "sha512-+6yDyk1EES6WK+l3viRDElw96MvwfJxCt45GvmjDUKWjYIb3PJZQkq3i46TwGwoPD4h8NmTrENmtyA1FwbmhRA==", 164 | "requires": { 165 | "@octokit/types": "^2.0.0", 166 | "deprecation": "^2.0.0", 167 | "once": "^1.4.0" 168 | } 169 | }, 170 | "@octokit/types": { 171 | "version": "2.16.2", 172 | "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.16.2.tgz", 173 | "integrity": "sha512-O75k56TYvJ8WpAakWwYRN8Bgu60KrmX0z1KqFp1kNiFNkgW+JW+9EBKZ+S33PU6SLvbihqd+3drvPxKK68Ee8Q==", 174 | "requires": { 175 | "@types/node": ">= 8" 176 | } 177 | }, 178 | "universal-user-agent": { 179 | "version": "4.0.1", 180 | "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.1.tgz", 181 | "integrity": "sha512-LnST3ebHwVL2aNe4mejI9IQh2HfZ1RLo8Io2HugSif8ekzD1TlWpHpColOB/eh8JHMLkGH3Akqf040I+4ylNxg==", 182 | "requires": { 183 | "os-name": "^3.1.0" 184 | } 185 | } 186 | } 187 | }, 188 | "@octokit/types": { 189 | "version": "4.0.2", 190 | "resolved": "https://registry.npmjs.org/@octokit/types/-/types-4.0.2.tgz", 191 | "integrity": "sha512-+4X6qfhT/fk/5FD66395NrFLxCzD6FsGlpPwfwvnukdyfYbhiZB/FJltiT1XM5Q63rGGBSf9FPaNV3WpNHm54A==", 192 | "requires": { 193 | "@types/node": ">= 8" 194 | } 195 | }, 196 | "@types/node": { 197 | "version": "14.0.5", 198 | "resolved": "https://registry.npmjs.org/@types/node/-/node-14.0.5.tgz", 199 | "integrity": "sha512-90hiq6/VqtQgX8Sp0EzeIsv3r+ellbGj4URKj5j30tLlZvRUpnAe9YbYnjl3pJM93GyXU0tghHhvXHq+5rnCKA==" 200 | }, 201 | "@zeit/ncc": { 202 | "version": "0.22.3", 203 | "resolved": "https://registry.npmjs.org/@zeit/ncc/-/ncc-0.22.3.tgz", 204 | "integrity": "sha512-jnCLpLXWuw/PAiJiVbLjA8WBC0IJQbFeUwF4I9M+23MvIxTxk5pD4Q8byQBSPmHQjz5aBoA7AKAElQxMpjrCLQ==", 205 | "dev": true 206 | }, 207 | "atob-lite": { 208 | "version": "2.0.0", 209 | "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", 210 | "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=" 211 | }, 212 | "before-after-hook": { 213 | "version": "2.1.0", 214 | "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz", 215 | "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==" 216 | }, 217 | "btoa-lite": { 218 | "version": "1.0.0", 219 | "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", 220 | "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=" 221 | }, 222 | "cross-spawn": { 223 | "version": "6.0.5", 224 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", 225 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", 226 | "requires": { 227 | "nice-try": "^1.0.4", 228 | "path-key": "^2.0.1", 229 | "semver": "^5.5.0", 230 | "shebang-command": "^1.2.0", 231 | "which": "^1.2.9" 232 | } 233 | }, 234 | "deprecation": { 235 | "version": "2.3.1", 236 | "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", 237 | "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" 238 | }, 239 | "end-of-stream": { 240 | "version": "1.4.4", 241 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 242 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 243 | "requires": { 244 | "once": "^1.4.0" 245 | } 246 | }, 247 | "execa": { 248 | "version": "1.0.0", 249 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", 250 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", 251 | "requires": { 252 | "cross-spawn": "^6.0.0", 253 | "get-stream": "^4.0.0", 254 | "is-stream": "^1.1.0", 255 | "npm-run-path": "^2.0.0", 256 | "p-finally": "^1.0.0", 257 | "signal-exit": "^3.0.0", 258 | "strip-eof": "^1.0.0" 259 | } 260 | }, 261 | "get-stream": { 262 | "version": "4.1.0", 263 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", 264 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", 265 | "requires": { 266 | "pump": "^3.0.0" 267 | } 268 | }, 269 | "is-plain-object": { 270 | "version": "3.0.0", 271 | "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", 272 | "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", 273 | "requires": { 274 | "isobject": "^4.0.0" 275 | } 276 | }, 277 | "is-stream": { 278 | "version": "1.1.0", 279 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", 280 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" 281 | }, 282 | "isexe": { 283 | "version": "2.0.0", 284 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", 285 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" 286 | }, 287 | "isobject": { 288 | "version": "4.0.0", 289 | "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", 290 | "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==" 291 | }, 292 | "lodash.get": { 293 | "version": "4.4.2", 294 | "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", 295 | "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" 296 | }, 297 | "lodash.set": { 298 | "version": "4.3.2", 299 | "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", 300 | "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" 301 | }, 302 | "lodash.uniq": { 303 | "version": "4.5.0", 304 | "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", 305 | "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" 306 | }, 307 | "macos-release": { 308 | "version": "2.3.0", 309 | "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.3.0.tgz", 310 | "integrity": "sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA==" 311 | }, 312 | "nice-try": { 313 | "version": "1.0.5", 314 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", 315 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==" 316 | }, 317 | "node-fetch": { 318 | "version": "2.6.0", 319 | "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", 320 | "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" 321 | }, 322 | "npm-run-path": { 323 | "version": "2.0.2", 324 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", 325 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", 326 | "requires": { 327 | "path-key": "^2.0.0" 328 | } 329 | }, 330 | "octokit-pagination-methods": { 331 | "version": "1.1.0", 332 | "resolved": "https://registry.npmjs.org/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz", 333 | "integrity": "sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==" 334 | }, 335 | "once": { 336 | "version": "1.4.0", 337 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 338 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 339 | "requires": { 340 | "wrappy": "1" 341 | } 342 | }, 343 | "os-name": { 344 | "version": "3.1.0", 345 | "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", 346 | "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", 347 | "requires": { 348 | "macos-release": "^2.2.0", 349 | "windows-release": "^3.1.0" 350 | } 351 | }, 352 | "p-finally": { 353 | "version": "1.0.0", 354 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", 355 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=" 356 | }, 357 | "path-key": { 358 | "version": "2.0.1", 359 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", 360 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=" 361 | }, 362 | "pump": { 363 | "version": "3.0.0", 364 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 365 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 366 | "requires": { 367 | "end-of-stream": "^1.1.0", 368 | "once": "^1.3.1" 369 | } 370 | }, 371 | "semver": { 372 | "version": "5.7.1", 373 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", 374 | "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" 375 | }, 376 | "shebang-command": { 377 | "version": "1.2.0", 378 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", 379 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", 380 | "requires": { 381 | "shebang-regex": "^1.0.0" 382 | } 383 | }, 384 | "shebang-regex": { 385 | "version": "1.0.0", 386 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", 387 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=" 388 | }, 389 | "signal-exit": { 390 | "version": "3.0.3", 391 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", 392 | "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==" 393 | }, 394 | "strip-eof": { 395 | "version": "1.0.0", 396 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", 397 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=" 398 | }, 399 | "tunnel": { 400 | "version": "0.0.6", 401 | "resolved": "https://registry.npmjs.org/tunnel/-/tunnel-0.0.6.tgz", 402 | "integrity": "sha512-1h/Lnq9yajKY2PEbBadPXj3VxsDDu844OnaAo52UVmIzIvwwtBPIuNvkjuzBlTWpfJyUbG3ez0KSBibQkj4ojg==" 403 | }, 404 | "universal-user-agent": { 405 | "version": "5.0.0", 406 | "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-5.0.0.tgz", 407 | "integrity": "sha512-B5TPtzZleXyPrUMKCpEHFmVhMN6EhmJYjG5PQna9s7mXeSqGTLap4OpqLl5FCEFUI3UBmllkETwKf/db66Y54Q==", 408 | "requires": { 409 | "os-name": "^3.1.0" 410 | } 411 | }, 412 | "which": { 413 | "version": "1.3.1", 414 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", 415 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", 416 | "requires": { 417 | "isexe": "^2.0.0" 418 | } 419 | }, 420 | "windows-release": { 421 | "version": "3.3.0", 422 | "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.3.0.tgz", 423 | "integrity": "sha512-2HetyTg1Y+R+rUgrKeUEhAG/ZuOmTrI1NBb3ZyAGQMYmOJjBBPe4MTodghRkmLJZHwkuPi02anbeGP+Zf401LQ==", 424 | "requires": { 425 | "execa": "^1.0.0" 426 | } 427 | }, 428 | "wrappy": { 429 | "version": "1.0.2", 430 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 431 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 432 | } 433 | } 434 | } 435 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "azure-webapps-deno-deploy", 3 | "description": "", 4 | "main": "index.js", 5 | "scripts": { 6 | "test": "echo \"Error: no test specified\" && exit 1", 7 | "build": "ncc build index.js" 8 | }, 9 | "keywords": [], 10 | "author": "Anthony Chu", 11 | "license": "ISC", 12 | "dependencies": { 13 | "@actions/core": "^1.2.4", 14 | "@actions/exec": "^1.0.4", 15 | "@actions/github": "^2.2.0", 16 | "node-fetch": "^2.6.0" 17 | }, 18 | "devDependencies": { 19 | "@zeit/ncc": "^0.22.3" 20 | } 21 | } 22 | --------------------------------------------------------------------------------