mirror of
https://github.com/bcomnes/deploy-to-neocities.git
synced 2026-01-21 17:01:54 +00:00
Compare commits
40 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
31484af044 | ||
|
|
7bb0bdec75 | ||
|
|
70de063f7f | ||
|
|
cc11705059 | ||
|
|
43dc04f030 | ||
|
|
7b4bdb680c | ||
|
|
b0dba38c69 | ||
|
|
028d293da6 | ||
|
|
14f0feaed2 | ||
|
|
7f3db0b932 | ||
|
|
91c25ab722 | ||
|
|
2ac7b56408 | ||
|
|
3024afb807 | ||
|
|
60d959d7ed | ||
|
|
6d0a96de91 | ||
|
|
da5f527254 | ||
|
|
6bcb1bafa6 | ||
|
|
df9c0b9fe1 | ||
|
|
bcc9d90095 | ||
|
|
7092d0c55c | ||
|
|
6b86fa30b4 | ||
|
|
74e6c4a57e | ||
|
|
8b470dbfd8 | ||
|
|
0dd3a06ef7 | ||
|
|
bf2d333152 | ||
|
|
f13458cc2d | ||
|
|
5e6f9848c7 | ||
|
|
fad2c4a165 | ||
|
|
1638c39428 | ||
|
|
c50fdeb3e6 | ||
|
|
48d2e5e4e0 | ||
|
|
aaf8a90973 | ||
|
|
34601c4927 | ||
|
|
ce8f0e70b0 | ||
|
|
22ef26e851 | ||
|
|
b96571b8ad | ||
|
|
bc86874ede | ||
|
|
4a9e7f6a6d | ||
|
|
2c52eeaa2b | ||
|
|
19246fac79 |
1
.gitignore
vendored
1
.gitignore
vendored
@@ -3,3 +3,4 @@ sandbox.js
|
|||||||
config.json
|
config.json
|
||||||
public
|
public
|
||||||
node_modules
|
node_modules
|
||||||
|
tmp_modules
|
||||||
|
|||||||
87
CHANGELOG.md
87
CHANGELOG.md
@@ -7,6 +7,93 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
|||||||
|
|
||||||
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
Generated by [`auto-changelog`](https://github.com/CookPete/auto-changelog).
|
||||||
|
|
||||||
|
## [v1.0.3](https://github.com/bcomnes/deploy-to-neocities/compare/v1.0.2...v1.0.3) - 2020-02-18
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
|
||||||
|
- docs: add FAQ section and tweak docs [`b0dba38`](https://github.com/bcomnes/deploy-to-neocities/commit/b0dba38c697d29f6dbede68b1a9dea7a219471b1)
|
||||||
|
- refactor: clean up pacakge.json a bit [`7bb0bde`](https://github.com/bcomnes/deploy-to-neocities/commit/7bb0bdec75f6ec26707d036479c84b40f20f6ba8)
|
||||||
|
- docs: improve docs [`cc11705`](https://github.com/bcomnes/deploy-to-neocities/commit/cc11705059c58406f070b67a4f3456a040599ae5)
|
||||||
|
|
||||||
|
## [v1.0.2](https://github.com/bcomnes/deploy-to-neocities/compare/v1.0.1...v1.0.2) - 2020-02-18
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
|
||||||
|
- bug: fix input name [`14f0fea`](https://github.com/bcomnes/deploy-to-neocities/commit/14f0feaed2b52c65b7a9fac2a8c5437f75a3b033)
|
||||||
|
|
||||||
|
## [v1.0.1](https://github.com/bcomnes/deploy-to-neocities/compare/v1.0.0...v1.0.1) - 2020-02-18
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
|
||||||
|
- docs: typos [`91c25ab`](https://github.com/bcomnes/deploy-to-neocities/commit/91c25ab7221a139f318ed7ef4a6518d5a64debe8)
|
||||||
|
|
||||||
|
## [v1.0.0](https://github.com/bcomnes/deploy-to-neocities/compare/v0.0.11...v1.0.0) - 2020-02-18
|
||||||
|
|
||||||
|
### Merged
|
||||||
|
|
||||||
|
- Update dependencies to enable Greenkeeper 🌴 [`#1`](https://github.com/bcomnes/deploy-to-neocities/pull/1)
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
|
||||||
|
- docs: Document action, inputs and outputs. [`da5f527`](https://github.com/bcomnes/deploy-to-neocities/commit/da5f52725420f64188f5130c7bb54fda5252e3ec)
|
||||||
|
- docs: add missing example [`3024afb`](https://github.com/bcomnes/deploy-to-neocities/commit/3024afb80791888e8c0fd04cf23ba6e7560a5f40)
|
||||||
|
- Update README.md [`df9c0b9`](https://github.com/bcomnes/deploy-to-neocities/commit/df9c0b9fe144eb76092e3998b2013e130756c950)
|
||||||
|
|
||||||
|
## [v0.0.11](https://github.com/bcomnes/deploy-to-neocities/compare/v0.0.10...v0.0.11) - 2020-02-13
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
|
||||||
|
- bug: fix time formatting [`8b470db`](https://github.com/bcomnes/deploy-to-neocities/commit/8b470dbfd876d61b6bd72327952bd1d9b0b49c9b)
|
||||||
|
|
||||||
|
## [v0.0.10](https://github.com/bcomnes/deploy-to-neocities/compare/v0.0.9...v0.0.10) - 2020-02-13
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
|
||||||
|
- chore: deps [`bf2d333`](https://github.com/bcomnes/deploy-to-neocities/commit/bf2d333152be116ec87d35592c8cb9ee4ef6821b)
|
||||||
|
|
||||||
|
## [v0.0.9](https://github.com/bcomnes/deploy-to-neocities/compare/v0.0.8...v0.0.9) - 2020-02-13
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
|
||||||
|
- chore: update deps [`5e6f984`](https://github.com/bcomnes/deploy-to-neocities/commit/5e6f9848c78a5f3a668b47a27dc14835005bf98c)
|
||||||
|
|
||||||
|
## [v0.0.8](https://github.com/bcomnes/deploy-to-neocities/compare/v0.0.7...v0.0.8) - 2020-02-13
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
|
||||||
|
- chore: update async-neocities to 1.1.3 [`1638c39`](https://github.com/bcomnes/deploy-to-neocities/commit/1638c394287dcf61bcf439a387dbefc2e68b2128)
|
||||||
|
|
||||||
|
## [v0.0.7](https://github.com/bcomnes/deploy-to-neocities/compare/v0.0.6...v0.0.7) - 2020-02-13
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
|
||||||
|
- refactor: Remove core calls [`48d2e5e`](https://github.com/bcomnes/deploy-to-neocities/commit/48d2e5e4e064176c8c4d27eddea40d0009446dba)
|
||||||
|
|
||||||
|
## [v0.0.6](https://github.com/bcomnes/deploy-to-neocities/compare/v0.0.5...v0.0.6) - 2020-02-13
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
|
||||||
|
- bug: update async-neocities to 1.1.2 [`34601c4`](https://github.com/bcomnes/deploy-to-neocities/commit/34601c49277891d15395a79b28eeb21781a019da)
|
||||||
|
|
||||||
|
## [v0.0.5](https://github.com/bcomnes/deploy-to-neocities/compare/v0.0.4...v0.0.5) - 2020-02-13
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
|
||||||
|
- bug: Use correct version of async-neocities [`22ef26e`](https://github.com/bcomnes/deploy-to-neocities/commit/22ef26e851efa57357d731a73a1f606dc212608a)
|
||||||
|
|
||||||
|
## [v0.0.4](https://github.com/bcomnes/deploy-to-neocities/compare/v0.0.3...v0.0.4) - 2020-02-13
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
|
||||||
|
- refactor: Dramatically simplify logging [`bc86874`](https://github.com/bcomnes/deploy-to-neocities/commit/bc86874ede188f9c33f0b6dfd2e54b25328b1285)
|
||||||
|
|
||||||
|
## [v0.0.3](https://github.com/bcomnes/deploy-to-neocities/compare/v0.0.2...v0.0.3) - 2020-02-13
|
||||||
|
|
||||||
|
### Commits
|
||||||
|
|
||||||
|
- Fix boolean parsing [`19246fa`](https://github.com/bcomnes/deploy-to-neocities/commit/19246fac798151a3ab80666412f72394c0615c32)
|
||||||
|
- bug: Fix reference bug in logging [`2c52eea`](https://github.com/bcomnes/deploy-to-neocities/commit/2c52eeaa2badbb1bcb3c2520e358fcc088bc3879)
|
||||||
|
|
||||||
## [v0.0.2](https://github.com/bcomnes/deploy-to-neocities/compare/v0.0.1...v0.0.2) - 2020-02-13
|
## [v0.0.2](https://github.com/bcomnes/deploy-to-neocities/compare/v0.0.1...v0.0.2) - 2020-02-13
|
||||||
|
|
||||||
### Commits
|
### Commits
|
||||||
|
|||||||
104
README.md
104
README.md
@@ -2,8 +2,110 @@
|
|||||||
|
|
||||||
[](https://github.com/bcomnes/deploy-to-neocities/actions)
|
[](https://github.com/bcomnes/deploy-to-neocities/actions)
|
||||||
|
|
||||||
|
<center><img src="logo.png"></center>
|
||||||
|
|
||||||
|
Efficiently deploy a website to [Neocities][nc].
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
name: Deploy to neocities
|
||||||
|
|
||||||
|
# only run on changes to master
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
deploy:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v1
|
||||||
|
# Set up any tools and build steps here
|
||||||
|
# This example uses a Node.js toolchain to build a site
|
||||||
|
- name: Use Node.js
|
||||||
|
uses: actions/setup-node@v1
|
||||||
|
with:
|
||||||
|
node-version: 12
|
||||||
|
- name: Install deps and build
|
||||||
|
run: |
|
||||||
|
npm i
|
||||||
|
npm run build
|
||||||
|
# When the dist_dir is ready, deploy it to neocities
|
||||||
|
- name: Deploy to neocities
|
||||||
|
uses: bcomnes/deploy-to-neocities@v1
|
||||||
|
with:
|
||||||
|
api_token: ${{ secrets.NEOCITIES_API_TOKEN }}
|
||||||
|
cleanup: false
|
||||||
|
dist_dir: public
|
||||||
|
```
|
||||||
|
|
||||||
|
Create a workflow `.yml` file in your repositories `.github/workflows` directory. An [example workflow](#example-workflow) is available below. For more information, reference the GitHub Help Documentation for [Creating a workflow file](https://help.github.com/en/articles/configuring-a-workflow#creating-a-workflow-file).
|
||||||
|
|
||||||
|
Get your sites API token and set a [secret][sec] called `NEOCITIES_API_TOKEN`. Set the `api_token` input on your `deploy-to-neocities` action to `NEOCITIES_API_TOKEN`.
|
||||||
|
|
||||||
|
```
|
||||||
|
https://neocities.org/settings/{{sitename}}#api_key
|
||||||
|
```
|
||||||
|
|
||||||
|
During your workflow, generate the files you want to deploy to [Neocities][nc] into a `dist_dir` directory. You can use any tools that can be installed or brought into the Github actions environment.
|
||||||
|
|
||||||
|
Once the build is complete, `deploy-to-neocities` will efficiently upload all new and all changed files to Neocities. Any files on Neocities that don't exist in the `dist_dir` are considered 'orphaned' files. To destructively remove these 'orphaned' files, set the `cleanup` input to `true`.
|
||||||
|
|
||||||
|
You most likely only want to run this on the `master` branch so that only changes committed to `master` result in website updates.
|
||||||
|
|
||||||
|
### Inputs
|
||||||
|
|
||||||
|
- `api_token` (**REQUIRED**): The API token for your [Neocities][nc] website to deploy to.
|
||||||
|
- `dist_dir`: The directory to deploy to [Neocities][nc]. Default: `public`.
|
||||||
|
- `cleanup`: Boolean string (`true` or `false`). If `true`, `deploy-to-neocities` will destructively delete files found on [Neocities][nc] not found in your `dist_dir`. Default: `false`.
|
||||||
|
|
||||||
|
### Outputs
|
||||||
|
|
||||||
|
None.
|
||||||
|
|
||||||
|
## FAQ
|
||||||
|
|
||||||
|
### Why should I deploy to Neocities?
|
||||||
|
|
||||||
|
[Neocities][nc] offers a bunch of nice properties:
|
||||||
|
|
||||||
|
- Neocities CDN uses a pure [anycast](https://en.wikipedia.org/wiki/Anycast) network providing efficient content serving no matter where your visitors are located around the world.
|
||||||
|
- Anycast doesn't require special DNS records to achieve geolocation routing characteristics. Simple `A` and `AAAA` records are all you need.
|
||||||
|
- Neocities owns its own [ARIN](https://en.wikipedia.org/wiki/American_Registry_for_Internet_Numbers) IP block and has its own [BGP](https://en.wikipedia.org/wiki/Border_Gateway_Protocol) peering agreements, eliminating entire layers of bureaucracy between your content and the rest of the Internet typical of all major cloud providers.
|
||||||
|
- Far faster cold cache access than other popular static hosting services. Perfect for personal websites, projects and other infrequently accessed documents.
|
||||||
|
- Simple and understandable feature set. You can hand upload and edit files along side built/deployed assets.
|
||||||
|
- First class IPv6 support.
|
||||||
|
- Fun, friendly, creative and organic community with an [interesting social network](https://neocities.org/browse).
|
||||||
|
- Independent, sustainable and altruistic service run by [@kyledrake](https://github.com/kyledrake/) and word on the street is that the service is profitable.
|
||||||
|
- [Affordable and predictable pricing](https://neocities.org/supporter). There is a generous free tier and you can get custom domains and additional sites for $5/mo.
|
||||||
|
- Offers simple, Google-free site analytics.
|
||||||
|
- Makes accepting tips a breeze.
|
||||||
|
- Bring your own CI environment, or don't.
|
||||||
|
- Cute cat logo.
|
||||||
|
- [Support the distributed web](https://neocities.org/distributed-web). Built in IPFS support.
|
||||||
|
- [Beginner friendly docs](https://neocities.org/tutorials) for learning how to make your own websites.
|
||||||
|
|
||||||
|
### What are some of the drawbacks compared to Netlify/Zeit?
|
||||||
|
|
||||||
|
- Not appropriate for hyper traffic commercial sites most likely.
|
||||||
|
- No concept of a Deploy or atomicity when changing files.
|
||||||
|
- Most features of these services are not included. Neocities is just static file hosting and a few basic features around that.
|
||||||
|
- Doesn't offer support.
|
||||||
|
- No deploy previews.
|
||||||
|
- No Github Deploys API support (yet).
|
||||||
|
|
||||||
|
|
||||||
## See also
|
## See also
|
||||||
|
|
||||||
|
- [async-neocities](https://ghub.io/async-neocities): diffing engine used for action.
|
||||||
- [Neocities API Docs](https://neocities.org/api)
|
- [Neocities API Docs](https://neocities.org/api)
|
||||||
- [neocities/neocities-node](https://github.com/neocities/neocities-node): Node api
|
- [neocities/neocities-node](https://github.com/neocities/neocities-node): Official Node API
|
||||||
|
|
||||||
|
[qs]: https://ghub.io/qs
|
||||||
|
[nf]: https://ghub.io/node-fetch
|
||||||
|
[fd]: https://ghub.io/form-data
|
||||||
|
[nc]: https://neocities.org
|
||||||
|
[sec]: https://help.github.com/en/actions/configuring-and-managing-workflows/creating-and-storing-encrypted-secrets
|
||||||
|
|||||||
10
action.yml
10
action.yml
@@ -1,13 +1,13 @@
|
|||||||
name: 'Deploy to Neocities'
|
name: 'Deploy to Neocities'
|
||||||
description: 'Github Action to deplpoy a folder to Neocities.org'
|
description: 'Efficiently deplpoy a folder to Neocities.org'
|
||||||
branding:
|
branding:
|
||||||
icon: cat
|
icon: aperture
|
||||||
color: yellow
|
color: orange
|
||||||
inputs:
|
inputs:
|
||||||
api-token: # api token for site to deploy to
|
api_token: # api token for site to deploy to
|
||||||
description: 'Neocities API token for site to deploy to'
|
description: 'Neocities API token for site to deploy to'
|
||||||
required: true
|
required: true
|
||||||
dist-dir:
|
dist_dir:
|
||||||
description: 'Local folder to deploy to neocities'
|
description: 'Local folder to deploy to neocities'
|
||||||
default: 'public'
|
default: 'public'
|
||||||
required: true
|
required: true
|
||||||
|
|||||||
103
index.js
103
index.js
@@ -2,102 +2,33 @@ const core = require('@actions/core')
|
|||||||
// const github = require('@actions/github')
|
// const github = require('@actions/github')
|
||||||
const Neocities = require('async-neocities')
|
const Neocities = require('async-neocities')
|
||||||
const path = require('path')
|
const path = require('path')
|
||||||
const prettyTime = require('pretty-time')
|
const ms = require('ms')
|
||||||
const prettyBytes = require('pretty-bytes')
|
const assert = require('nanoassert')
|
||||||
|
const fsp = require('fs').promises
|
||||||
|
|
||||||
async function doDeploy () {
|
async function doDeploy () {
|
||||||
const token = core.getInput('api-token')
|
const token = core.getInput('api_token')
|
||||||
const distDir = path.join(process.cwd(), core.getInput('dist-dir'))
|
const distDir = path.join(process.cwd(), core.getInput('dist_dir'))
|
||||||
const cleanup = core.getInput('cleanup')
|
const cleanup = core.getInput('cleanup')
|
||||||
console.log(typeof cleanup)
|
|
||||||
|
assert(typeof cleanup === 'boolean', 'Cleanup input must be a boolean "true" or "false"')
|
||||||
|
const stat = await fsp.stat()
|
||||||
|
assert(stat.isDirectory(), 'dist_dir must be a directory that exists')
|
||||||
|
|
||||||
const client = new Neocities(token)
|
const client = new Neocities(token)
|
||||||
|
|
||||||
const finalStats = await client.deploy(distDir, {
|
const stats = await client.deploy(distDir, {
|
||||||
cleanup,
|
cleanup,
|
||||||
statsCb: statsHandler({ cleanup, distDir })
|
statsCb: Neocities.statsHandler()
|
||||||
})
|
})
|
||||||
|
|
||||||
return finalStats
|
console.log(`Deployed to Neocities in ${ms(stats.time)}:`)
|
||||||
|
console.log(` Uploaded ${stats.filesToUpload.length} files`)
|
||||||
|
console.log(` ${cleanup ? 'Deleted' : 'Orphaned'} ${stats.filesToDelete.length} files`)
|
||||||
|
console.log(` Skipped ${stats.filesSkipped.length} files`)
|
||||||
}
|
}
|
||||||
|
|
||||||
doDeploy().then((finalStats) => {}).catch(err => {
|
doDeploy().catch(err => {
|
||||||
|
console.error(err)
|
||||||
core.setFailed(err.message)
|
core.setFailed(err.message)
|
||||||
})
|
})
|
||||||
|
|
||||||
function statsHandler (opts = {}) {
|
|
||||||
return (stats) => {
|
|
||||||
switch (stats.stage) {
|
|
||||||
case 'inspecting': {
|
|
||||||
switch (stats.status) {
|
|
||||||
case 'start': {
|
|
||||||
core.startGroup('Inspecting files')
|
|
||||||
console.log('Inspecting local and remote files...')
|
|
||||||
console.log(`Dist directory: ${opts.distDir})`)
|
|
||||||
break
|
|
||||||
}
|
|
||||||
case 'progress': {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
case 'stop': {
|
|
||||||
console.log(`Done inspecting local and remote files in ${prettyTime([0, stats.timer.elapsed])}`)
|
|
||||||
const { tasks: { localScan, remoteScan } } = stats
|
|
||||||
console.log(`Scanned ${localScan.numberOfFiles} local files (${prettyBytes(localScan.totalSize)}) in ${prettyTime([0, localScan.timer.elapsed])}`)
|
|
||||||
console.log(`Scanned ${remoteScan.numberOfFiles} remote files (${prettyBytes(remoteScan.totalSize)}) in ${prettyTime([0, remoteScan.timer.elapsed])}`)
|
|
||||||
core.endGroup()
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
case 'diffing': {
|
|
||||||
switch (stats.status) {
|
|
||||||
case 'start': {
|
|
||||||
core.startGroup('Diffing files')
|
|
||||||
console.log('Diffing local and remote files...')
|
|
||||||
break
|
|
||||||
}
|
|
||||||
case 'progress': {
|
|
||||||
// No progress on diffing
|
|
||||||
break
|
|
||||||
}
|
|
||||||
case 'stop': {
|
|
||||||
const { tasks: { diffing } } = stats
|
|
||||||
console.log(`Done diffing local and remote files in ${prettyTime([0, stats.timer.elapsed])}`)
|
|
||||||
console.log(`${diffing.uploadCount} files to upload`)
|
|
||||||
console.log(`${diffing.deleteCount} ` + (opts.cleanup ? 'files to delete' : 'orphaned files'))
|
|
||||||
console.log(`${diffing.skipCoount} files to skip`)
|
|
||||||
core.endGroup()
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
case 'applying': {
|
|
||||||
switch (stats.status) {
|
|
||||||
case 'start': {
|
|
||||||
core.startGroup('Applying diff')
|
|
||||||
console.log('Uploading changes' + (opts.cleanup ? ' and deleting orphaned files...' : '...'))
|
|
||||||
break
|
|
||||||
}
|
|
||||||
case 'progress': {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
case 'stop': {
|
|
||||||
const { tasks: { uploadFiles, deleteFiles, skippedFiles } } = stats
|
|
||||||
console.log('Done uploading changes' + (opts.cleanup ? ' and deleting orphaned files' : '') + ` in ${prettyTime([0, stats.timer.elapsed])}`)
|
|
||||||
console.log(`Average upload speed: ${prettyBytes(uploadFiles.speed)}/s`)
|
|
||||||
if (opts.cleanup) console.log(`Average delete speed: ${prettyBytes(deleteFiles.speed)}/s`)
|
|
||||||
console.log(`Skipped ${skippedFiles.count} files (${prettyBytes(skippedFiles.size)})`)
|
|
||||||
core.endGroup()
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
console.log(stats)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|||||||
1
node_modules/.bin/semver
generated
vendored
1
node_modules/.bin/semver
generated
vendored
@@ -1 +0,0 @@
|
|||||||
../semver/bin/semver
|
|
||||||
1
node_modules/.bin/which
generated
vendored
1
node_modules/.bin/which
generated
vendored
@@ -1 +0,0 @@
|
|||||||
../which/bin/which
|
|
||||||
74
node_modules/@actions/github/README.md
generated
vendored
74
node_modules/@actions/github/README.md
generated
vendored
@@ -1,74 +0,0 @@
|
|||||||
# `@actions/github`
|
|
||||||
|
|
||||||
> A hydrated Octokit client.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
Returns an authenticated Octokit client that follows the machine [proxy settings](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/about-self-hosted-runners#using-a-proxy-server-with-self-hosted-runners). See https://octokit.github.io/rest.js for the API.
|
|
||||||
|
|
||||||
```js
|
|
||||||
const github = require('@actions/github');
|
|
||||||
const core = require('@actions/core');
|
|
||||||
|
|
||||||
async function run() {
|
|
||||||
// This should be a token with access to your repository scoped in as a secret.
|
|
||||||
// The YML workflow will need to set myToken with the GitHub Secret Token
|
|
||||||
// myToken: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
// https://help.github.com/en/actions/automating-your-workflow-with-github-actions/authenticating-with-the-github_token#about-the-github_token-secret
|
|
||||||
const myToken = core.getInput('myToken');
|
|
||||||
|
|
||||||
const octokit = new github.GitHub(myToken);
|
|
||||||
|
|
||||||
const { data: pullRequest } = await octokit.pulls.get({
|
|
||||||
owner: 'octokit',
|
|
||||||
repo: 'rest.js',
|
|
||||||
pull_number: 123,
|
|
||||||
mediaType: {
|
|
||||||
format: 'diff'
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
console.log(pullRequest);
|
|
||||||
}
|
|
||||||
|
|
||||||
run();
|
|
||||||
```
|
|
||||||
|
|
||||||
You can pass client options, as specified by [Octokit](https://octokit.github.io/rest.js/), as a second argument to the `GitHub` constructor.
|
|
||||||
|
|
||||||
You can also make GraphQL requests. See https://github.com/octokit/graphql.js for the API.
|
|
||||||
|
|
||||||
```js
|
|
||||||
const result = await octokit.graphql(query, variables);
|
|
||||||
```
|
|
||||||
|
|
||||||
Finally, you can get the context of the current action:
|
|
||||||
|
|
||||||
```js
|
|
||||||
const github = require('@actions/github');
|
|
||||||
|
|
||||||
const context = github.context;
|
|
||||||
|
|
||||||
const newIssue = await octokit.issues.create({
|
|
||||||
...context.repo,
|
|
||||||
title: 'New issue!',
|
|
||||||
body: 'Hello Universe!'
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
## Webhook payload typescript definitions
|
|
||||||
|
|
||||||
The npm module `@octokit/webhooks` provides type definitions for the response payloads. You can cast the payload to these types for better type information.
|
|
||||||
|
|
||||||
First, install the npm module `npm install @octokit/webhooks`
|
|
||||||
|
|
||||||
Then, assert the type based on the eventName
|
|
||||||
```ts
|
|
||||||
import * as core from '@actions/core'
|
|
||||||
import * as github from '@actions/github'
|
|
||||||
import * as Webhooks from '@octokit/webhooks'
|
|
||||||
if (github.context.eventName === 'push') {
|
|
||||||
const pushPayload = github.context.payload as Webhooks.WebhookPayloadPush
|
|
||||||
core.info(`The head commit is: ${pushPayload.head}`)
|
|
||||||
}
|
|
||||||
```
|
|
||||||
26
node_modules/@actions/github/lib/context.d.ts
generated
vendored
26
node_modules/@actions/github/lib/context.d.ts
generated
vendored
@@ -1,26 +0,0 @@
|
|||||||
import { WebhookPayload } from './interfaces';
|
|
||||||
export declare class Context {
|
|
||||||
/**
|
|
||||||
* Webhook payload object that triggered the workflow
|
|
||||||
*/
|
|
||||||
payload: WebhookPayload;
|
|
||||||
eventName: string;
|
|
||||||
sha: string;
|
|
||||||
ref: string;
|
|
||||||
workflow: string;
|
|
||||||
action: string;
|
|
||||||
actor: string;
|
|
||||||
/**
|
|
||||||
* Hydrate the context from the environment
|
|
||||||
*/
|
|
||||||
constructor();
|
|
||||||
get issue(): {
|
|
||||||
owner: string;
|
|
||||||
repo: string;
|
|
||||||
number: number;
|
|
||||||
};
|
|
||||||
get repo(): {
|
|
||||||
owner: string;
|
|
||||||
repo: string;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
46
node_modules/@actions/github/lib/context.js
generated
vendored
46
node_modules/@actions/github/lib/context.js
generated
vendored
@@ -1,46 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
const fs_1 = require("fs");
|
|
||||||
const os_1 = require("os");
|
|
||||||
class Context {
|
|
||||||
/**
|
|
||||||
* Hydrate the context from the environment
|
|
||||||
*/
|
|
||||||
constructor() {
|
|
||||||
this.payload = {};
|
|
||||||
if (process.env.GITHUB_EVENT_PATH) {
|
|
||||||
if (fs_1.existsSync(process.env.GITHUB_EVENT_PATH)) {
|
|
||||||
this.payload = JSON.parse(fs_1.readFileSync(process.env.GITHUB_EVENT_PATH, { encoding: 'utf8' }));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
const path = process.env.GITHUB_EVENT_PATH;
|
|
||||||
process.stdout.write(`GITHUB_EVENT_PATH ${path} does not exist${os_1.EOL}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
this.eventName = process.env.GITHUB_EVENT_NAME;
|
|
||||||
this.sha = process.env.GITHUB_SHA;
|
|
||||||
this.ref = process.env.GITHUB_REF;
|
|
||||||
this.workflow = process.env.GITHUB_WORKFLOW;
|
|
||||||
this.action = process.env.GITHUB_ACTION;
|
|
||||||
this.actor = process.env.GITHUB_ACTOR;
|
|
||||||
}
|
|
||||||
get issue() {
|
|
||||||
const payload = this.payload;
|
|
||||||
return Object.assign(Object.assign({}, this.repo), { number: (payload.issue || payload.pull_request || payload).number });
|
|
||||||
}
|
|
||||||
get repo() {
|
|
||||||
if (process.env.GITHUB_REPOSITORY) {
|
|
||||||
const [owner, repo] = process.env.GITHUB_REPOSITORY.split('/');
|
|
||||||
return { owner, repo };
|
|
||||||
}
|
|
||||||
if (this.payload.repository) {
|
|
||||||
return {
|
|
||||||
owner: this.payload.repository.owner.login,
|
|
||||||
repo: this.payload.repository.name
|
|
||||||
};
|
|
||||||
}
|
|
||||||
throw new Error("context.repo requires a GITHUB_REPOSITORY environment variable like 'owner/repo'");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.Context = Context;
|
|
||||||
//# sourceMappingURL=context.js.map
|
|
||||||
1
node_modules/@actions/github/lib/context.js.map
generated
vendored
1
node_modules/@actions/github/lib/context.js.map
generated
vendored
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":";;AAEA,2BAA2C;AAC3C,2BAAsB;AAEtB,MAAa,OAAO;IAalB;;OAEG;IACH;QACE,IAAI,CAAC,OAAO,GAAG,EAAE,CAAA;QACjB,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE;YACjC,IAAI,eAAU,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE;gBAC7C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CACvB,iBAAY,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,EAAC,QAAQ,EAAE,MAAM,EAAC,CAAC,CAChE,CAAA;aACF;iBAAM;gBACL,MAAM,IAAI,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAA;gBAC1C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,qBAAqB,IAAI,kBAAkB,QAAG,EAAE,CAAC,CAAA;aACvE;SACF;QACD,IAAI,CAAC,SAAS,GAAG,OAAO,CAAC,GAAG,CAAC,iBAA2B,CAAA;QACxD,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,UAAoB,CAAA;QAC3C,IAAI,CAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,UAAoB,CAAA;QAC3C,IAAI,CAAC,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,eAAyB,CAAA;QACrD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,aAAuB,CAAA;QACjD,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAsB,CAAA;IACjD,CAAC;IAED,IAAI,KAAK;QACP,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAA;QAE5B,uCACK,IAAI,CAAC,IAAI,KACZ,MAAM,EAAE,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,YAAY,IAAI,OAAO,CAAC,CAAC,MAAM,IAClE;IACH,CAAC;IAED,IAAI,IAAI;QACN,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE;YACjC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;YAC9D,OAAO,EAAC,KAAK,EAAE,IAAI,EAAC,CAAA;SACrB;QAED,IAAI,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE;YAC3B,OAAO;gBACL,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,KAAK;gBAC1C,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI;aACnC,CAAA;SACF;QAED,MAAM,IAAI,KAAK,CACb,kFAAkF,CACnF,CAAA;IACH,CAAC;CACF;AA9DD,0BA8DC"}
|
|
||||||
25
node_modules/@actions/github/lib/github.d.ts
generated
vendored
25
node_modules/@actions/github/lib/github.d.ts
generated
vendored
@@ -1,25 +0,0 @@
|
|||||||
import { graphql as GraphQL } from '@octokit/graphql/dist-types/types';
|
|
||||||
import Octokit from '@octokit/rest';
|
|
||||||
import * as Context from './context';
|
|
||||||
export declare const context: Context.Context;
|
|
||||||
export declare class GitHub extends Octokit {
|
|
||||||
graphql: GraphQL;
|
|
||||||
/**
|
|
||||||
* Sets up the REST client and GraphQL client with auth and proxy support.
|
|
||||||
* The parameter `token` or `opts.auth` must be supplied. The GraphQL client
|
|
||||||
* authorization is not setup when `opts.auth` is a function or object.
|
|
||||||
*
|
|
||||||
* @param token Auth token
|
|
||||||
* @param opts Octokit options
|
|
||||||
*/
|
|
||||||
constructor(token: string, opts?: Omit<Octokit.Options, 'auth'>);
|
|
||||||
constructor(opts: Octokit.Options);
|
|
||||||
/**
|
|
||||||
* Disambiguates the constructor overload parameters
|
|
||||||
*/
|
|
||||||
private static disambiguate;
|
|
||||||
private static getOctokitOptions;
|
|
||||||
private static getGraphQL;
|
|
||||||
private static getAuthString;
|
|
||||||
private static getProxyAgent;
|
|
||||||
}
|
|
||||||
94
node_modules/@actions/github/lib/github.js
generated
vendored
94
node_modules/@actions/github/lib/github.js
generated
vendored
@@ -1,94 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
||||||
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
||||||
};
|
|
||||||
var __importStar = (this && this.__importStar) || function (mod) {
|
|
||||||
if (mod && mod.__esModule) return mod;
|
|
||||||
var result = {};
|
|
||||||
if (mod != null) for (var k in mod) if (Object.hasOwnProperty.call(mod, k)) result[k] = mod[k];
|
|
||||||
result["default"] = mod;
|
|
||||||
return result;
|
|
||||||
};
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
// Originally pulled from https://github.com/JasonEtco/actions-toolkit/blob/master/src/github.ts
|
|
||||||
const graphql_1 = require("@octokit/graphql");
|
|
||||||
const rest_1 = __importDefault(require("@octokit/rest"));
|
|
||||||
const Context = __importStar(require("./context"));
|
|
||||||
const httpClient = __importStar(require("@actions/http-client"));
|
|
||||||
// We need this in order to extend Octokit
|
|
||||||
rest_1.default.prototype = new rest_1.default();
|
|
||||||
exports.context = new Context.Context();
|
|
||||||
class GitHub extends rest_1.default {
|
|
||||||
constructor(token, opts) {
|
|
||||||
super(GitHub.getOctokitOptions(GitHub.disambiguate(token, opts)));
|
|
||||||
this.graphql = GitHub.getGraphQL(GitHub.disambiguate(token, opts));
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Disambiguates the constructor overload parameters
|
|
||||||
*/
|
|
||||||
static disambiguate(token, opts) {
|
|
||||||
return [
|
|
||||||
typeof token === 'string' ? token : '',
|
|
||||||
typeof token === 'object' ? token : opts || {}
|
|
||||||
];
|
|
||||||
}
|
|
||||||
static getOctokitOptions(args) {
|
|
||||||
const token = args[0];
|
|
||||||
const options = Object.assign({}, args[1]); // Shallow clone - don't mutate the object provided by the caller
|
|
||||||
// Auth
|
|
||||||
const auth = GitHub.getAuthString(token, options);
|
|
||||||
if (auth) {
|
|
||||||
options.auth = auth;
|
|
||||||
}
|
|
||||||
// Proxy
|
|
||||||
const agent = GitHub.getProxyAgent(options);
|
|
||||||
if (agent) {
|
|
||||||
// Shallow clone - don't mutate the object provided by the caller
|
|
||||||
options.request = options.request ? Object.assign({}, options.request) : {};
|
|
||||||
// Set the agent
|
|
||||||
options.request.agent = agent;
|
|
||||||
}
|
|
||||||
return options;
|
|
||||||
}
|
|
||||||
static getGraphQL(args) {
|
|
||||||
const defaults = {};
|
|
||||||
const token = args[0];
|
|
||||||
const options = args[1];
|
|
||||||
// Authorization
|
|
||||||
const auth = this.getAuthString(token, options);
|
|
||||||
if (auth) {
|
|
||||||
defaults.headers = {
|
|
||||||
authorization: auth
|
|
||||||
};
|
|
||||||
}
|
|
||||||
// Proxy
|
|
||||||
const agent = GitHub.getProxyAgent(options);
|
|
||||||
if (agent) {
|
|
||||||
defaults.request = { agent };
|
|
||||||
}
|
|
||||||
return graphql_1.graphql.defaults(defaults);
|
|
||||||
}
|
|
||||||
static getAuthString(token, options) {
|
|
||||||
// Validate args
|
|
||||||
if (!token && !options.auth) {
|
|
||||||
throw new Error('Parameter token or opts.auth is required');
|
|
||||||
}
|
|
||||||
else if (token && options.auth) {
|
|
||||||
throw new Error('Parameters token and opts.auth may not both be specified');
|
|
||||||
}
|
|
||||||
return typeof options.auth === 'string' ? options.auth : `token ${token}`;
|
|
||||||
}
|
|
||||||
static getProxyAgent(options) {
|
|
||||||
var _a;
|
|
||||||
if (!((_a = options.request) === null || _a === void 0 ? void 0 : _a.agent)) {
|
|
||||||
const serverUrl = 'https://api.github.com';
|
|
||||||
if (httpClient.getProxyUrl(serverUrl)) {
|
|
||||||
const hc = new httpClient.HttpClient();
|
|
||||||
return hc.getAgent(serverUrl);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.GitHub = GitHub;
|
|
||||||
//# sourceMappingURL=github.js.map
|
|
||||||
1
node_modules/@actions/github/lib/github.js.map
generated
vendored
1
node_modules/@actions/github/lib/github.js.map
generated
vendored
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"github.js","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,gGAAgG;AAChG,8CAAwC;AAUxC,yDAAmC;AACnC,mDAAoC;AAEpC,iEAAkD;AAElD,0CAA0C;AAC1C,cAAO,CAAC,SAAS,GAAG,IAAI,cAAO,EAAE,CAAA;AAEpB,QAAA,OAAO,GAAG,IAAI,OAAO,CAAC,OAAO,EAAE,CAAA;AAE5C,MAAa,MAAO,SAAQ,cAAO;IAiBjC,YAAY,KAA+B,EAAE,IAAsB;QACjE,KAAK,CAAC,MAAM,CAAC,iBAAiB,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC,CAAA;QAEjE,IAAI,CAAC,OAAO,GAAG,MAAM,CAAC,UAAU,CAAC,MAAM,CAAC,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAA;IACpE,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,YAAY,CACzB,KAA+B,EAC/B,IAAsB;QAEtB,OAAO;YACL,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE;YACtC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE;SAC/C,CAAA;IACH,CAAC;IAEO,MAAM,CAAC,iBAAiB,CAC9B,IAA+B;QAE/B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACrB,MAAM,OAAO,qBAAO,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA,CAAC,iEAAiE;QAE9F,OAAO;QACP,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QACjD,IAAI,IAAI,EAAE;YACR,OAAO,CAAC,IAAI,GAAG,IAAI,CAAA;SACpB;QAED,QAAQ;QACR,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QAC3C,IAAI,KAAK,EAAE;YACT,iEAAiE;YACjE,OAAO,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,mBAAK,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAA;YAE7D,gBAAgB;YAChB,OAAO,CAAC,OAAO,CAAC,KAAK,GAAG,KAAK,CAAA;SAC9B;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAEO,MAAM,CAAC,UAAU,CAAC,IAA+B;QACvD,MAAM,QAAQ,GAA6B,EAAE,CAAA;QAC7C,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QACrB,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,CAAA;QAEvB,gBAAgB;QAChB,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,CAAA;QAC/C,IAAI,IAAI,EAAE;YACR,QAAQ,CAAC,OAAO,GAAG;gBACjB,aAAa,EAAE,IAAI;aACpB,CAAA;SACF;QAED,QAAQ;QACR,MAAM,KAAK,GAAG,MAAM,CAAC,aAAa,CAAC,OAAO,CAAC,CAAA;QAC3C,IAAI,KAAK,EAAE;YACT,QAAQ,CAAC,OAAO,GAAG,EAAC,KAAK,EAAC,CAAA;SAC3B;QAED,OAAO,iBAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAA;IACnC,CAAC;IAEO,MAAM,CAAC,aAAa,CAC1B,KAAa,EACb,OAAwB;QAExB,gBAAgB;QAChB,IAAI,CAAC,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE;YAC3B,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAA;SAC5D;aAAM,IAAI,KAAK,IAAI,OAAO,CAAC,IAAI,EAAE;YAChC,MAAM,IAAI,KAAK,CACb,0DAA0D,CAC3D,CAAA;SACF;QAED,OAAO,OAAO,OAAO,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,KAAK,EAAE,CAAA;IAC3E,CAAC;IAEO,MAAM,CAAC,aAAa,CAC1B,OAAwB;;QAExB,IAAI,QAAC,OAAO,CAAC,OAAO,0CAAE,KAAK,CAAA,EAAE;YAC3B,MAAM,SAAS,GAAG,wBAAwB,CAAA;YAC1C,IAAI,UAAU,CAAC,WAAW,CAAC,SAAS,CAAC,EAAE;gBACrC,MAAM,EAAE,GAAG,IAAI,UAAU,CAAC,UAAU,EAAE,CAAA;gBACtC,OAAO,EAAE,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAA;aAC9B;SACF;QAED,OAAO,SAAS,CAAA;IAClB,CAAC;CACF;AAhHD,wBAgHC"}
|
|
||||||
36
node_modules/@actions/github/lib/interfaces.d.ts
generated
vendored
36
node_modules/@actions/github/lib/interfaces.d.ts
generated
vendored
@@ -1,36 +0,0 @@
|
|||||||
export interface PayloadRepository {
|
|
||||||
[key: string]: any;
|
|
||||||
full_name?: string;
|
|
||||||
name: string;
|
|
||||||
owner: {
|
|
||||||
[key: string]: any;
|
|
||||||
login: string;
|
|
||||||
name?: string;
|
|
||||||
};
|
|
||||||
html_url?: string;
|
|
||||||
}
|
|
||||||
export interface WebhookPayload {
|
|
||||||
[key: string]: any;
|
|
||||||
repository?: PayloadRepository;
|
|
||||||
issue?: {
|
|
||||||
[key: string]: any;
|
|
||||||
number: number;
|
|
||||||
html_url?: string;
|
|
||||||
body?: string;
|
|
||||||
};
|
|
||||||
pull_request?: {
|
|
||||||
[key: string]: any;
|
|
||||||
number: number;
|
|
||||||
html_url?: string;
|
|
||||||
body?: string;
|
|
||||||
};
|
|
||||||
sender?: {
|
|
||||||
[key: string]: any;
|
|
||||||
type: string;
|
|
||||||
};
|
|
||||||
action?: string;
|
|
||||||
installation?: {
|
|
||||||
id: number;
|
|
||||||
[key: string]: any;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
4
node_modules/@actions/github/lib/interfaces.js
generated
vendored
4
node_modules/@actions/github/lib/interfaces.js
generated
vendored
@@ -1,4 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
//# sourceMappingURL=interfaces.js.map
|
|
||||||
1
node_modules/@actions/github/lib/interfaces.js.map
generated
vendored
1
node_modules/@actions/github/lib/interfaces.js.map
generated
vendored
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"interfaces.js","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":";AAAA,uDAAuD"}
|
|
||||||
74
node_modules/@actions/github/package.json
generated
vendored
74
node_modules/@actions/github/package.json
generated
vendored
@@ -1,74 +0,0 @@
|
|||||||
{
|
|
||||||
"_from": "@actions/github@2.1.0",
|
|
||||||
"_id": "@actions/github@2.1.0",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha512-G4ncMlh4pLLAvNgHUYUtpWQ1zPf/VYqmRH9oshxLabdaOOnp7i1hgSgzr2xne2YUaSND3uqemd3YYTIsm2f/KQ==",
|
|
||||||
"_location": "/@actions/github",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "version",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "@actions/github@2.1.0",
|
|
||||||
"name": "@actions/github",
|
|
||||||
"escapedName": "@actions%2fgithub",
|
|
||||||
"scope": "@actions",
|
|
||||||
"rawSpec": "2.1.0",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "2.1.0"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"/"
|
|
||||||
],
|
|
||||||
"_resolved": "https://registry.npmjs.org/@actions/github/-/github-2.1.0.tgz",
|
|
||||||
"_shasum": "ca36cfb146b4c8955f3d5f88d8dde5f89194de21",
|
|
||||||
"_spec": "@actions/github@2.1.0",
|
|
||||||
"_where": "/Users/bret/repos/deploy-to-neocities",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/actions/toolkit/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"dependencies": {
|
|
||||||
"@actions/http-client": "^1.0.3",
|
|
||||||
"@octokit/graphql": "^4.3.1",
|
|
||||||
"@octokit/rest": "^16.15.0"
|
|
||||||
},
|
|
||||||
"deprecated": false,
|
|
||||||
"description": "Actions github lib",
|
|
||||||
"devDependencies": {
|
|
||||||
"jest": "^24.7.1",
|
|
||||||
"proxy": "^1.0.1"
|
|
||||||
},
|
|
||||||
"directories": {
|
|
||||||
"lib": "lib",
|
|
||||||
"test": "__tests__"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"lib"
|
|
||||||
],
|
|
||||||
"homepage": "https://github.com/actions/toolkit/tree/master/packages/github",
|
|
||||||
"keywords": [
|
|
||||||
"github",
|
|
||||||
"actions"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"main": "lib/github.js",
|
|
||||||
"name": "@actions/github",
|
|
||||||
"publishConfig": {
|
|
||||||
"access": "public"
|
|
||||||
},
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/actions/toolkit.git",
|
|
||||||
"directory": "packages/github"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"audit-moderate": "npm install && npm audit --audit-level=moderate",
|
|
||||||
"build": "tsc",
|
|
||||||
"format": "prettier --write **/*.ts",
|
|
||||||
"format-check": "prettier --check **/*.ts",
|
|
||||||
"test": "jest",
|
|
||||||
"tsc": "tsc"
|
|
||||||
},
|
|
||||||
"types": "lib/github.d.ts",
|
|
||||||
"version": "2.1.0"
|
|
||||||
}
|
|
||||||
21
node_modules/@actions/http-client/LICENSE
generated
vendored
21
node_modules/@actions/http-client/LICENSE
generated
vendored
@@ -1,21 +0,0 @@
|
|||||||
Actions Http Client for Node.js
|
|
||||||
|
|
||||||
Copyright (c) GitHub, Inc.
|
|
||||||
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
MIT License
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
|
|
||||||
associated documentation files (the "Software"), to deal in the Software without restriction,
|
|
||||||
including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
||||||
and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so,
|
|
||||||
subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT
|
|
||||||
LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
|
||||||
NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
|
||||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
|
||||||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
79
node_modules/@actions/http-client/README.md
generated
vendored
79
node_modules/@actions/http-client/README.md
generated
vendored
@@ -1,79 +0,0 @@
|
|||||||
|
|
||||||
<p align="center">
|
|
||||||
<img src="actions.png">
|
|
||||||
</p>
|
|
||||||
|
|
||||||
# Actions Http-Client
|
|
||||||
|
|
||||||
[](https://github.com/actions/http-client/actions)
|
|
||||||
|
|
||||||
A lightweight HTTP client optimized for use with actions, TypeScript with generics and async await.
|
|
||||||
|
|
||||||
## Features
|
|
||||||
|
|
||||||
- HTTP client with TypeScript generics and async/await/Promises
|
|
||||||
- Typings included so no need to acquire separately (great for intellisense and no versioning drift)
|
|
||||||
- [Proxy support](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/about-self-hosted-runners#using-a-proxy-server-with-self-hosted-runners) just works with actions and the runner
|
|
||||||
- Targets ES2019 (runner runs actions with node 12+). Only supported on node 12+.
|
|
||||||
- Basic, Bearer and PAT Support out of the box. Extensible handlers for others.
|
|
||||||
- Redirects supported
|
|
||||||
|
|
||||||
Features and releases [here](./RELEASES.md)
|
|
||||||
|
|
||||||
## Install
|
|
||||||
|
|
||||||
```
|
|
||||||
npm install @actions/http-client --save
|
|
||||||
```
|
|
||||||
|
|
||||||
## Samples
|
|
||||||
|
|
||||||
See the [HTTP](./__tests__) tests for detailed examples.
|
|
||||||
|
|
||||||
## Errors
|
|
||||||
|
|
||||||
### HTTP
|
|
||||||
|
|
||||||
The HTTP client does not throw unless truly exceptional.
|
|
||||||
|
|
||||||
* A request that successfully executes resulting in a 404, 500 etc... will return a response object with a status code and a body.
|
|
||||||
* Redirects (3xx) will be followed by default.
|
|
||||||
|
|
||||||
See [HTTP tests](./__tests__) for detailed examples.
|
|
||||||
|
|
||||||
## Debugging
|
|
||||||
|
|
||||||
To enable detailed console logging of all HTTP requests and responses, set the NODE_DEBUG environment varible:
|
|
||||||
|
|
||||||
```
|
|
||||||
export NODE_DEBUG=http
|
|
||||||
```
|
|
||||||
|
|
||||||
## Node support
|
|
||||||
|
|
||||||
The http-client is built using the latest LTS version of Node 12. It may work on previous node LTS versions but it's tested and officially supported on Node12+.
|
|
||||||
|
|
||||||
## Support and Versioning
|
|
||||||
|
|
||||||
We follow semver and will hold compatibility between major versions and increment the minor version with new features and capabilities (while holding compat).
|
|
||||||
|
|
||||||
## Contributing
|
|
||||||
|
|
||||||
We welcome PRs. Please create an issue and if applicable, a design before proceeding with code.
|
|
||||||
|
|
||||||
once:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ npm install
|
|
||||||
```
|
|
||||||
|
|
||||||
To build:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
$ npm run build
|
|
||||||
```
|
|
||||||
|
|
||||||
To run all tests:
|
|
||||||
```bash
|
|
||||||
$ npm test
|
|
||||||
```
|
|
||||||
13
node_modules/@actions/http-client/RELEASES.md
generated
vendored
13
node_modules/@actions/http-client/RELEASES.md
generated
vendored
@@ -1,13 +0,0 @@
|
|||||||
## Releases
|
|
||||||
|
|
||||||
## 1.0.6
|
|
||||||
Automatically sends Content-Type and Accept application/json headers for \<verb>Json() helper methods if not set in the client or parameters.
|
|
||||||
|
|
||||||
## 1.0.5
|
|
||||||
Adds \<verb>Json() helper methods for json over http scenarios.
|
|
||||||
|
|
||||||
## 1.0.4
|
|
||||||
Started to add \<verb>Json() helper methods. Do not use this release for that. Use >= 1.0.5 since there was an issue with types.
|
|
||||||
|
|
||||||
## 1.0.1 to 1.0.3
|
|
||||||
Adds proxy support.
|
|
||||||
BIN
node_modules/@actions/http-client/actions.png
generated
vendored
BIN
node_modules/@actions/http-client/actions.png
generated
vendored
Binary file not shown.
|
Before Width: | Height: | Size: 33 KiB |
23
node_modules/@actions/http-client/auth.d.ts
generated
vendored
23
node_modules/@actions/http-client/auth.d.ts
generated
vendored
@@ -1,23 +0,0 @@
|
|||||||
import ifm = require('./interfaces');
|
|
||||||
export declare class BasicCredentialHandler implements ifm.IRequestHandler {
|
|
||||||
username: string;
|
|
||||||
password: string;
|
|
||||||
constructor(username: string, password: string);
|
|
||||||
prepareRequest(options: any): void;
|
|
||||||
canHandleAuthentication(response: ifm.IHttpClientResponse): boolean;
|
|
||||||
handleAuthentication(httpClient: ifm.IHttpClient, requestInfo: ifm.IRequestInfo, objs: any): Promise<ifm.IHttpClientResponse>;
|
|
||||||
}
|
|
||||||
export declare class BearerCredentialHandler implements ifm.IRequestHandler {
|
|
||||||
token: string;
|
|
||||||
constructor(token: string);
|
|
||||||
prepareRequest(options: any): void;
|
|
||||||
canHandleAuthentication(response: ifm.IHttpClientResponse): boolean;
|
|
||||||
handleAuthentication(httpClient: ifm.IHttpClient, requestInfo: ifm.IRequestInfo, objs: any): Promise<ifm.IHttpClientResponse>;
|
|
||||||
}
|
|
||||||
export declare class PersonalAccessTokenCredentialHandler implements ifm.IRequestHandler {
|
|
||||||
token: string;
|
|
||||||
constructor(token: string);
|
|
||||||
prepareRequest(options: any): void;
|
|
||||||
canHandleAuthentication(response: ifm.IHttpClientResponse): boolean;
|
|
||||||
handleAuthentication(httpClient: ifm.IHttpClient, requestInfo: ifm.IRequestInfo, objs: any): Promise<ifm.IHttpClientResponse>;
|
|
||||||
}
|
|
||||||
55
node_modules/@actions/http-client/auth.js
generated
vendored
55
node_modules/@actions/http-client/auth.js
generated
vendored
@@ -1,55 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
class BasicCredentialHandler {
|
|
||||||
constructor(username, password) {
|
|
||||||
this.username = username;
|
|
||||||
this.password = password;
|
|
||||||
}
|
|
||||||
prepareRequest(options) {
|
|
||||||
options.headers['Authorization'] = 'Basic ' + Buffer.from(this.username + ':' + this.password).toString('base64');
|
|
||||||
}
|
|
||||||
// This handler cannot handle 401
|
|
||||||
canHandleAuthentication(response) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
handleAuthentication(httpClient, requestInfo, objs) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.BasicCredentialHandler = BasicCredentialHandler;
|
|
||||||
class BearerCredentialHandler {
|
|
||||||
constructor(token) {
|
|
||||||
this.token = token;
|
|
||||||
}
|
|
||||||
// currently implements pre-authorization
|
|
||||||
// TODO: support preAuth = false where it hooks on 401
|
|
||||||
prepareRequest(options) {
|
|
||||||
options.headers['Authorization'] = 'Bearer ' + this.token;
|
|
||||||
}
|
|
||||||
// This handler cannot handle 401
|
|
||||||
canHandleAuthentication(response) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
handleAuthentication(httpClient, requestInfo, objs) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.BearerCredentialHandler = BearerCredentialHandler;
|
|
||||||
class PersonalAccessTokenCredentialHandler {
|
|
||||||
constructor(token) {
|
|
||||||
this.token = token;
|
|
||||||
}
|
|
||||||
// currently implements pre-authorization
|
|
||||||
// TODO: support preAuth = false where it hooks on 401
|
|
||||||
prepareRequest(options) {
|
|
||||||
options.headers['Authorization'] = 'Basic ' + Buffer.from('PAT:' + this.token).toString('base64');
|
|
||||||
}
|
|
||||||
// This handler cannot handle 401
|
|
||||||
canHandleAuthentication(response) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
handleAuthentication(httpClient, requestInfo, objs) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.PersonalAccessTokenCredentialHandler = PersonalAccessTokenCredentialHandler;
|
|
||||||
118
node_modules/@actions/http-client/index.d.ts
generated
vendored
118
node_modules/@actions/http-client/index.d.ts
generated
vendored
@@ -1,118 +0,0 @@
|
|||||||
/// <reference types="node" />
|
|
||||||
import http = require("http");
|
|
||||||
import ifm = require('./interfaces');
|
|
||||||
export declare enum HttpCodes {
|
|
||||||
OK = 200,
|
|
||||||
MultipleChoices = 300,
|
|
||||||
MovedPermanently = 301,
|
|
||||||
ResourceMoved = 302,
|
|
||||||
SeeOther = 303,
|
|
||||||
NotModified = 304,
|
|
||||||
UseProxy = 305,
|
|
||||||
SwitchProxy = 306,
|
|
||||||
TemporaryRedirect = 307,
|
|
||||||
PermanentRedirect = 308,
|
|
||||||
BadRequest = 400,
|
|
||||||
Unauthorized = 401,
|
|
||||||
PaymentRequired = 402,
|
|
||||||
Forbidden = 403,
|
|
||||||
NotFound = 404,
|
|
||||||
MethodNotAllowed = 405,
|
|
||||||
NotAcceptable = 406,
|
|
||||||
ProxyAuthenticationRequired = 407,
|
|
||||||
RequestTimeout = 408,
|
|
||||||
Conflict = 409,
|
|
||||||
Gone = 410,
|
|
||||||
InternalServerError = 500,
|
|
||||||
NotImplemented = 501,
|
|
||||||
BadGateway = 502,
|
|
||||||
ServiceUnavailable = 503,
|
|
||||||
GatewayTimeout = 504
|
|
||||||
}
|
|
||||||
export declare enum Headers {
|
|
||||||
Accept = "accept",
|
|
||||||
ContentType = "content-type"
|
|
||||||
}
|
|
||||||
export declare enum MediaTypes {
|
|
||||||
ApplicationJson = "application/json"
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Returns the proxy URL, depending upon the supplied url and proxy environment variables.
|
|
||||||
* @param serverUrl The server URL where the request will be sent. For example, https://api.github.com
|
|
||||||
*/
|
|
||||||
export declare function getProxyUrl(serverUrl: string): string;
|
|
||||||
export declare class HttpClientResponse implements ifm.IHttpClientResponse {
|
|
||||||
constructor(message: http.IncomingMessage);
|
|
||||||
message: http.IncomingMessage;
|
|
||||||
readBody(): Promise<string>;
|
|
||||||
}
|
|
||||||
export declare function isHttps(requestUrl: string): boolean;
|
|
||||||
export declare class HttpClient {
|
|
||||||
userAgent: string | undefined;
|
|
||||||
handlers: ifm.IRequestHandler[];
|
|
||||||
requestOptions: ifm.IRequestOptions;
|
|
||||||
private _ignoreSslError;
|
|
||||||
private _socketTimeout;
|
|
||||||
private _allowRedirects;
|
|
||||||
private _allowRedirectDowngrade;
|
|
||||||
private _maxRedirects;
|
|
||||||
private _allowRetries;
|
|
||||||
private _maxRetries;
|
|
||||||
private _agent;
|
|
||||||
private _proxyAgent;
|
|
||||||
private _keepAlive;
|
|
||||||
private _disposed;
|
|
||||||
constructor(userAgent?: string, handlers?: ifm.IRequestHandler[], requestOptions?: ifm.IRequestOptions);
|
|
||||||
options(requestUrl: string, additionalHeaders?: ifm.IHeaders): Promise<ifm.IHttpClientResponse>;
|
|
||||||
get(requestUrl: string, additionalHeaders?: ifm.IHeaders): Promise<ifm.IHttpClientResponse>;
|
|
||||||
del(requestUrl: string, additionalHeaders?: ifm.IHeaders): Promise<ifm.IHttpClientResponse>;
|
|
||||||
post(requestUrl: string, data: string, additionalHeaders?: ifm.IHeaders): Promise<ifm.IHttpClientResponse>;
|
|
||||||
patch(requestUrl: string, data: string, additionalHeaders?: ifm.IHeaders): Promise<ifm.IHttpClientResponse>;
|
|
||||||
put(requestUrl: string, data: string, additionalHeaders?: ifm.IHeaders): Promise<ifm.IHttpClientResponse>;
|
|
||||||
head(requestUrl: string, additionalHeaders?: ifm.IHeaders): Promise<ifm.IHttpClientResponse>;
|
|
||||||
sendStream(verb: string, requestUrl: string, stream: NodeJS.ReadableStream, additionalHeaders?: ifm.IHeaders): Promise<ifm.IHttpClientResponse>;
|
|
||||||
/**
|
|
||||||
* Gets a typed object from an endpoint
|
|
||||||
* Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise
|
|
||||||
*/
|
|
||||||
getJson<T>(requestUrl: string, additionalHeaders?: ifm.IHeaders): Promise<ifm.ITypedResponse<T>>;
|
|
||||||
postJson<T>(requestUrl: string, obj: any, additionalHeaders?: ifm.IHeaders): Promise<ifm.ITypedResponse<T>>;
|
|
||||||
putJson<T>(requestUrl: string, obj: any, additionalHeaders?: ifm.IHeaders): Promise<ifm.ITypedResponse<T>>;
|
|
||||||
patchJson<T>(requestUrl: string, obj: any, additionalHeaders?: ifm.IHeaders): Promise<ifm.ITypedResponse<T>>;
|
|
||||||
/**
|
|
||||||
* Makes a raw http request.
|
|
||||||
* All other methods such as get, post, patch, and request ultimately call this.
|
|
||||||
* Prefer get, del, post and patch
|
|
||||||
*/
|
|
||||||
request(verb: string, requestUrl: string, data: string | NodeJS.ReadableStream, headers: ifm.IHeaders): Promise<ifm.IHttpClientResponse>;
|
|
||||||
/**
|
|
||||||
* Needs to be called if keepAlive is set to true in request options.
|
|
||||||
*/
|
|
||||||
dispose(): void;
|
|
||||||
/**
|
|
||||||
* Raw request.
|
|
||||||
* @param info
|
|
||||||
* @param data
|
|
||||||
*/
|
|
||||||
requestRaw(info: ifm.IRequestInfo, data: string | NodeJS.ReadableStream): Promise<ifm.IHttpClientResponse>;
|
|
||||||
/**
|
|
||||||
* Raw request with callback.
|
|
||||||
* @param info
|
|
||||||
* @param data
|
|
||||||
* @param onResult
|
|
||||||
*/
|
|
||||||
requestRawWithCallback(info: ifm.IRequestInfo, data: string | NodeJS.ReadableStream, onResult: (err: any, res: ifm.IHttpClientResponse) => void): void;
|
|
||||||
/**
|
|
||||||
* Gets an http agent. This function is useful when you need an http agent that handles
|
|
||||||
* routing through a proxy server - depending upon the url and proxy environment variables.
|
|
||||||
* @param serverUrl The server URL where the request will be sent. For example, https://api.github.com
|
|
||||||
*/
|
|
||||||
getAgent(serverUrl: string): http.Agent;
|
|
||||||
private _prepareRequest;
|
|
||||||
private _mergeHeaders;
|
|
||||||
private _getExistingOrDefaultHeader;
|
|
||||||
private _getAgent;
|
|
||||||
private _performExponentialBackoff;
|
|
||||||
private static dateTimeDeserializer;
|
|
||||||
private _processResponse;
|
|
||||||
}
|
|
||||||
500
node_modules/@actions/http-client/index.js
generated
vendored
500
node_modules/@actions/http-client/index.js
generated
vendored
@@ -1,500 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
const url = require("url");
|
|
||||||
const http = require("http");
|
|
||||||
const https = require("https");
|
|
||||||
const pm = require("./proxy");
|
|
||||||
let tunnel;
|
|
||||||
var HttpCodes;
|
|
||||||
(function (HttpCodes) {
|
|
||||||
HttpCodes[HttpCodes["OK"] = 200] = "OK";
|
|
||||||
HttpCodes[HttpCodes["MultipleChoices"] = 300] = "MultipleChoices";
|
|
||||||
HttpCodes[HttpCodes["MovedPermanently"] = 301] = "MovedPermanently";
|
|
||||||
HttpCodes[HttpCodes["ResourceMoved"] = 302] = "ResourceMoved";
|
|
||||||
HttpCodes[HttpCodes["SeeOther"] = 303] = "SeeOther";
|
|
||||||
HttpCodes[HttpCodes["NotModified"] = 304] = "NotModified";
|
|
||||||
HttpCodes[HttpCodes["UseProxy"] = 305] = "UseProxy";
|
|
||||||
HttpCodes[HttpCodes["SwitchProxy"] = 306] = "SwitchProxy";
|
|
||||||
HttpCodes[HttpCodes["TemporaryRedirect"] = 307] = "TemporaryRedirect";
|
|
||||||
HttpCodes[HttpCodes["PermanentRedirect"] = 308] = "PermanentRedirect";
|
|
||||||
HttpCodes[HttpCodes["BadRequest"] = 400] = "BadRequest";
|
|
||||||
HttpCodes[HttpCodes["Unauthorized"] = 401] = "Unauthorized";
|
|
||||||
HttpCodes[HttpCodes["PaymentRequired"] = 402] = "PaymentRequired";
|
|
||||||
HttpCodes[HttpCodes["Forbidden"] = 403] = "Forbidden";
|
|
||||||
HttpCodes[HttpCodes["NotFound"] = 404] = "NotFound";
|
|
||||||
HttpCodes[HttpCodes["MethodNotAllowed"] = 405] = "MethodNotAllowed";
|
|
||||||
HttpCodes[HttpCodes["NotAcceptable"] = 406] = "NotAcceptable";
|
|
||||||
HttpCodes[HttpCodes["ProxyAuthenticationRequired"] = 407] = "ProxyAuthenticationRequired";
|
|
||||||
HttpCodes[HttpCodes["RequestTimeout"] = 408] = "RequestTimeout";
|
|
||||||
HttpCodes[HttpCodes["Conflict"] = 409] = "Conflict";
|
|
||||||
HttpCodes[HttpCodes["Gone"] = 410] = "Gone";
|
|
||||||
HttpCodes[HttpCodes["InternalServerError"] = 500] = "InternalServerError";
|
|
||||||
HttpCodes[HttpCodes["NotImplemented"] = 501] = "NotImplemented";
|
|
||||||
HttpCodes[HttpCodes["BadGateway"] = 502] = "BadGateway";
|
|
||||||
HttpCodes[HttpCodes["ServiceUnavailable"] = 503] = "ServiceUnavailable";
|
|
||||||
HttpCodes[HttpCodes["GatewayTimeout"] = 504] = "GatewayTimeout";
|
|
||||||
})(HttpCodes = exports.HttpCodes || (exports.HttpCodes = {}));
|
|
||||||
var Headers;
|
|
||||||
(function (Headers) {
|
|
||||||
Headers["Accept"] = "accept";
|
|
||||||
Headers["ContentType"] = "content-type";
|
|
||||||
})(Headers = exports.Headers || (exports.Headers = {}));
|
|
||||||
var MediaTypes;
|
|
||||||
(function (MediaTypes) {
|
|
||||||
MediaTypes["ApplicationJson"] = "application/json";
|
|
||||||
})(MediaTypes = exports.MediaTypes || (exports.MediaTypes = {}));
|
|
||||||
/**
|
|
||||||
* Returns the proxy URL, depending upon the supplied url and proxy environment variables.
|
|
||||||
* @param serverUrl The server URL where the request will be sent. For example, https://api.github.com
|
|
||||||
*/
|
|
||||||
function getProxyUrl(serverUrl) {
|
|
||||||
let proxyUrl = pm.getProxyUrl(url.parse(serverUrl));
|
|
||||||
return proxyUrl ? proxyUrl.href : '';
|
|
||||||
}
|
|
||||||
exports.getProxyUrl = getProxyUrl;
|
|
||||||
const HttpRedirectCodes = [HttpCodes.MovedPermanently, HttpCodes.ResourceMoved, HttpCodes.SeeOther, HttpCodes.TemporaryRedirect, HttpCodes.PermanentRedirect];
|
|
||||||
const HttpResponseRetryCodes = [HttpCodes.BadGateway, HttpCodes.ServiceUnavailable, HttpCodes.GatewayTimeout];
|
|
||||||
const RetryableHttpVerbs = ['OPTIONS', 'GET', 'DELETE', 'HEAD'];
|
|
||||||
const ExponentialBackoffCeiling = 10;
|
|
||||||
const ExponentialBackoffTimeSlice = 5;
|
|
||||||
class HttpClientResponse {
|
|
||||||
constructor(message) {
|
|
||||||
this.message = message;
|
|
||||||
}
|
|
||||||
readBody() {
|
|
||||||
return new Promise(async (resolve, reject) => {
|
|
||||||
let output = Buffer.alloc(0);
|
|
||||||
this.message.on('data', (chunk) => {
|
|
||||||
output = Buffer.concat([output, chunk]);
|
|
||||||
});
|
|
||||||
this.message.on('end', () => {
|
|
||||||
resolve(output.toString());
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.HttpClientResponse = HttpClientResponse;
|
|
||||||
function isHttps(requestUrl) {
|
|
||||||
let parsedUrl = url.parse(requestUrl);
|
|
||||||
return parsedUrl.protocol === 'https:';
|
|
||||||
}
|
|
||||||
exports.isHttps = isHttps;
|
|
||||||
class HttpClient {
|
|
||||||
constructor(userAgent, handlers, requestOptions) {
|
|
||||||
this._ignoreSslError = false;
|
|
||||||
this._allowRedirects = true;
|
|
||||||
this._allowRedirectDowngrade = false;
|
|
||||||
this._maxRedirects = 50;
|
|
||||||
this._allowRetries = false;
|
|
||||||
this._maxRetries = 1;
|
|
||||||
this._keepAlive = false;
|
|
||||||
this._disposed = false;
|
|
||||||
this.userAgent = userAgent;
|
|
||||||
this.handlers = handlers || [];
|
|
||||||
this.requestOptions = requestOptions;
|
|
||||||
if (requestOptions) {
|
|
||||||
if (requestOptions.ignoreSslError != null) {
|
|
||||||
this._ignoreSslError = requestOptions.ignoreSslError;
|
|
||||||
}
|
|
||||||
this._socketTimeout = requestOptions.socketTimeout;
|
|
||||||
if (requestOptions.allowRedirects != null) {
|
|
||||||
this._allowRedirects = requestOptions.allowRedirects;
|
|
||||||
}
|
|
||||||
if (requestOptions.allowRedirectDowngrade != null) {
|
|
||||||
this._allowRedirectDowngrade = requestOptions.allowRedirectDowngrade;
|
|
||||||
}
|
|
||||||
if (requestOptions.maxRedirects != null) {
|
|
||||||
this._maxRedirects = Math.max(requestOptions.maxRedirects, 0);
|
|
||||||
}
|
|
||||||
if (requestOptions.keepAlive != null) {
|
|
||||||
this._keepAlive = requestOptions.keepAlive;
|
|
||||||
}
|
|
||||||
if (requestOptions.allowRetries != null) {
|
|
||||||
this._allowRetries = requestOptions.allowRetries;
|
|
||||||
}
|
|
||||||
if (requestOptions.maxRetries != null) {
|
|
||||||
this._maxRetries = requestOptions.maxRetries;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
options(requestUrl, additionalHeaders) {
|
|
||||||
return this.request('OPTIONS', requestUrl, null, additionalHeaders || {});
|
|
||||||
}
|
|
||||||
get(requestUrl, additionalHeaders) {
|
|
||||||
return this.request('GET', requestUrl, null, additionalHeaders || {});
|
|
||||||
}
|
|
||||||
del(requestUrl, additionalHeaders) {
|
|
||||||
return this.request('DELETE', requestUrl, null, additionalHeaders || {});
|
|
||||||
}
|
|
||||||
post(requestUrl, data, additionalHeaders) {
|
|
||||||
return this.request('POST', requestUrl, data, additionalHeaders || {});
|
|
||||||
}
|
|
||||||
patch(requestUrl, data, additionalHeaders) {
|
|
||||||
return this.request('PATCH', requestUrl, data, additionalHeaders || {});
|
|
||||||
}
|
|
||||||
put(requestUrl, data, additionalHeaders) {
|
|
||||||
return this.request('PUT', requestUrl, data, additionalHeaders || {});
|
|
||||||
}
|
|
||||||
head(requestUrl, additionalHeaders) {
|
|
||||||
return this.request('HEAD', requestUrl, null, additionalHeaders || {});
|
|
||||||
}
|
|
||||||
sendStream(verb, requestUrl, stream, additionalHeaders) {
|
|
||||||
return this.request(verb, requestUrl, stream, additionalHeaders);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Gets a typed object from an endpoint
|
|
||||||
* Be aware that not found returns a null. Other errors (4xx, 5xx) reject the promise
|
|
||||||
*/
|
|
||||||
async getJson(requestUrl, additionalHeaders = {}) {
|
|
||||||
additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);
|
|
||||||
let res = await this.get(requestUrl, additionalHeaders);
|
|
||||||
return this._processResponse(res, this.requestOptions);
|
|
||||||
}
|
|
||||||
async postJson(requestUrl, obj, additionalHeaders = {}) {
|
|
||||||
let data = JSON.stringify(obj, null, 2);
|
|
||||||
additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);
|
|
||||||
additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);
|
|
||||||
let res = await this.post(requestUrl, data, additionalHeaders);
|
|
||||||
return this._processResponse(res, this.requestOptions);
|
|
||||||
}
|
|
||||||
async putJson(requestUrl, obj, additionalHeaders = {}) {
|
|
||||||
let data = JSON.stringify(obj, null, 2);
|
|
||||||
additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);
|
|
||||||
additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);
|
|
||||||
let res = await this.put(requestUrl, data, additionalHeaders);
|
|
||||||
return this._processResponse(res, this.requestOptions);
|
|
||||||
}
|
|
||||||
async patchJson(requestUrl, obj, additionalHeaders = {}) {
|
|
||||||
let data = JSON.stringify(obj, null, 2);
|
|
||||||
additionalHeaders[Headers.Accept] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.Accept, MediaTypes.ApplicationJson);
|
|
||||||
additionalHeaders[Headers.ContentType] = this._getExistingOrDefaultHeader(additionalHeaders, Headers.ContentType, MediaTypes.ApplicationJson);
|
|
||||||
let res = await this.patch(requestUrl, data, additionalHeaders);
|
|
||||||
return this._processResponse(res, this.requestOptions);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Makes a raw http request.
|
|
||||||
* All other methods such as get, post, patch, and request ultimately call this.
|
|
||||||
* Prefer get, del, post and patch
|
|
||||||
*/
|
|
||||||
async request(verb, requestUrl, data, headers) {
|
|
||||||
if (this._disposed) {
|
|
||||||
throw new Error("Client has already been disposed.");
|
|
||||||
}
|
|
||||||
let parsedUrl = url.parse(requestUrl);
|
|
||||||
let info = this._prepareRequest(verb, parsedUrl, headers);
|
|
||||||
// Only perform retries on reads since writes may not be idempotent.
|
|
||||||
let maxTries = (this._allowRetries && RetryableHttpVerbs.indexOf(verb) != -1) ? this._maxRetries + 1 : 1;
|
|
||||||
let numTries = 0;
|
|
||||||
let response;
|
|
||||||
while (numTries < maxTries) {
|
|
||||||
response = await this.requestRaw(info, data);
|
|
||||||
// Check if it's an authentication challenge
|
|
||||||
if (response && response.message && response.message.statusCode === HttpCodes.Unauthorized) {
|
|
||||||
let authenticationHandler;
|
|
||||||
for (let i = 0; i < this.handlers.length; i++) {
|
|
||||||
if (this.handlers[i].canHandleAuthentication(response)) {
|
|
||||||
authenticationHandler = this.handlers[i];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (authenticationHandler) {
|
|
||||||
return authenticationHandler.handleAuthentication(this, info, data);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
// We have received an unauthorized response but have no handlers to handle it.
|
|
||||||
// Let the response return to the caller.
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
let redirectsRemaining = this._maxRedirects;
|
|
||||||
while (HttpRedirectCodes.indexOf(response.message.statusCode) != -1
|
|
||||||
&& this._allowRedirects
|
|
||||||
&& redirectsRemaining > 0) {
|
|
||||||
const redirectUrl = response.message.headers["location"];
|
|
||||||
if (!redirectUrl) {
|
|
||||||
// if there's no location to redirect to, we won't
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
let parsedRedirectUrl = url.parse(redirectUrl);
|
|
||||||
if (parsedUrl.protocol == 'https:' && parsedUrl.protocol != parsedRedirectUrl.protocol && !this._allowRedirectDowngrade) {
|
|
||||||
throw new Error("Redirect from HTTPS to HTTP protocol. This downgrade is not allowed for security reasons. If you want to allow this behavior, set the allowRedirectDowngrade option to true.");
|
|
||||||
}
|
|
||||||
// we need to finish reading the response before reassigning response
|
|
||||||
// which will leak the open socket.
|
|
||||||
await response.readBody();
|
|
||||||
// let's make the request with the new redirectUrl
|
|
||||||
info = this._prepareRequest(verb, parsedRedirectUrl, headers);
|
|
||||||
response = await this.requestRaw(info, data);
|
|
||||||
redirectsRemaining--;
|
|
||||||
}
|
|
||||||
if (HttpResponseRetryCodes.indexOf(response.message.statusCode) == -1) {
|
|
||||||
// If not a retry code, return immediately instead of retrying
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
numTries += 1;
|
|
||||||
if (numTries < maxTries) {
|
|
||||||
await response.readBody();
|
|
||||||
await this._performExponentialBackoff(numTries);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return response;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Needs to be called if keepAlive is set to true in request options.
|
|
||||||
*/
|
|
||||||
dispose() {
|
|
||||||
if (this._agent) {
|
|
||||||
this._agent.destroy();
|
|
||||||
}
|
|
||||||
this._disposed = true;
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Raw request.
|
|
||||||
* @param info
|
|
||||||
* @param data
|
|
||||||
*/
|
|
||||||
requestRaw(info, data) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
let callbackForResult = function (err, res) {
|
|
||||||
if (err) {
|
|
||||||
reject(err);
|
|
||||||
}
|
|
||||||
resolve(res);
|
|
||||||
};
|
|
||||||
this.requestRawWithCallback(info, data, callbackForResult);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Raw request with callback.
|
|
||||||
* @param info
|
|
||||||
* @param data
|
|
||||||
* @param onResult
|
|
||||||
*/
|
|
||||||
requestRawWithCallback(info, data, onResult) {
|
|
||||||
let socket;
|
|
||||||
if (typeof (data) === 'string') {
|
|
||||||
info.options.headers["Content-Length"] = Buffer.byteLength(data, 'utf8');
|
|
||||||
}
|
|
||||||
let callbackCalled = false;
|
|
||||||
let handleResult = (err, res) => {
|
|
||||||
if (!callbackCalled) {
|
|
||||||
callbackCalled = true;
|
|
||||||
onResult(err, res);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
let req = info.httpModule.request(info.options, (msg) => {
|
|
||||||
let res = new HttpClientResponse(msg);
|
|
||||||
handleResult(null, res);
|
|
||||||
});
|
|
||||||
req.on('socket', (sock) => {
|
|
||||||
socket = sock;
|
|
||||||
});
|
|
||||||
// If we ever get disconnected, we want the socket to timeout eventually
|
|
||||||
req.setTimeout(this._socketTimeout || 3 * 60000, () => {
|
|
||||||
if (socket) {
|
|
||||||
socket.end();
|
|
||||||
}
|
|
||||||
handleResult(new Error('Request timeout: ' + info.options.path), null);
|
|
||||||
});
|
|
||||||
req.on('error', function (err) {
|
|
||||||
// err has statusCode property
|
|
||||||
// res should have headers
|
|
||||||
handleResult(err, null);
|
|
||||||
});
|
|
||||||
if (data && typeof (data) === 'string') {
|
|
||||||
req.write(data, 'utf8');
|
|
||||||
}
|
|
||||||
if (data && typeof (data) !== 'string') {
|
|
||||||
data.on('close', function () {
|
|
||||||
req.end();
|
|
||||||
});
|
|
||||||
data.pipe(req);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
req.end();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Gets an http agent. This function is useful when you need an http agent that handles
|
|
||||||
* routing through a proxy server - depending upon the url and proxy environment variables.
|
|
||||||
* @param serverUrl The server URL where the request will be sent. For example, https://api.github.com
|
|
||||||
*/
|
|
||||||
getAgent(serverUrl) {
|
|
||||||
let parsedUrl = url.parse(serverUrl);
|
|
||||||
return this._getAgent(parsedUrl);
|
|
||||||
}
|
|
||||||
_prepareRequest(method, requestUrl, headers) {
|
|
||||||
const info = {};
|
|
||||||
info.parsedUrl = requestUrl;
|
|
||||||
const usingSsl = info.parsedUrl.protocol === 'https:';
|
|
||||||
info.httpModule = usingSsl ? https : http;
|
|
||||||
const defaultPort = usingSsl ? 443 : 80;
|
|
||||||
info.options = {};
|
|
||||||
info.options.host = info.parsedUrl.hostname;
|
|
||||||
info.options.port = info.parsedUrl.port ? parseInt(info.parsedUrl.port) : defaultPort;
|
|
||||||
info.options.path = (info.parsedUrl.pathname || '') + (info.parsedUrl.search || '');
|
|
||||||
info.options.method = method;
|
|
||||||
info.options.headers = this._mergeHeaders(headers);
|
|
||||||
if (this.userAgent != null) {
|
|
||||||
info.options.headers["user-agent"] = this.userAgent;
|
|
||||||
}
|
|
||||||
info.options.agent = this._getAgent(info.parsedUrl);
|
|
||||||
// gives handlers an opportunity to participate
|
|
||||||
if (this.handlers) {
|
|
||||||
this.handlers.forEach((handler) => {
|
|
||||||
handler.prepareRequest(info.options);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return info;
|
|
||||||
}
|
|
||||||
_mergeHeaders(headers) {
|
|
||||||
const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => (c[k.toLowerCase()] = obj[k], c), {});
|
|
||||||
if (this.requestOptions && this.requestOptions.headers) {
|
|
||||||
return Object.assign({}, lowercaseKeys(this.requestOptions.headers), lowercaseKeys(headers));
|
|
||||||
}
|
|
||||||
return lowercaseKeys(headers || {});
|
|
||||||
}
|
|
||||||
_getExistingOrDefaultHeader(additionalHeaders, header, _default) {
|
|
||||||
const lowercaseKeys = obj => Object.keys(obj).reduce((c, k) => (c[k.toLowerCase()] = obj[k], c), {});
|
|
||||||
let clientHeader;
|
|
||||||
if (this.requestOptions && this.requestOptions.headers) {
|
|
||||||
clientHeader = lowercaseKeys(this.requestOptions.headers)[header];
|
|
||||||
}
|
|
||||||
return additionalHeaders[header] || clientHeader || _default;
|
|
||||||
}
|
|
||||||
_getAgent(parsedUrl) {
|
|
||||||
let agent;
|
|
||||||
let proxyUrl = pm.getProxyUrl(parsedUrl);
|
|
||||||
let useProxy = proxyUrl && proxyUrl.hostname;
|
|
||||||
if (this._keepAlive && useProxy) {
|
|
||||||
agent = this._proxyAgent;
|
|
||||||
}
|
|
||||||
if (this._keepAlive && !useProxy) {
|
|
||||||
agent = this._agent;
|
|
||||||
}
|
|
||||||
// if agent is already assigned use that agent.
|
|
||||||
if (!!agent) {
|
|
||||||
return agent;
|
|
||||||
}
|
|
||||||
const usingSsl = parsedUrl.protocol === 'https:';
|
|
||||||
let maxSockets = 100;
|
|
||||||
if (!!this.requestOptions) {
|
|
||||||
maxSockets = this.requestOptions.maxSockets || http.globalAgent.maxSockets;
|
|
||||||
}
|
|
||||||
if (useProxy) {
|
|
||||||
// If using proxy, need tunnel
|
|
||||||
if (!tunnel) {
|
|
||||||
tunnel = require('tunnel');
|
|
||||||
}
|
|
||||||
const agentOptions = {
|
|
||||||
maxSockets: maxSockets,
|
|
||||||
keepAlive: this._keepAlive,
|
|
||||||
proxy: {
|
|
||||||
proxyAuth: proxyUrl.auth,
|
|
||||||
host: proxyUrl.hostname,
|
|
||||||
port: proxyUrl.port
|
|
||||||
},
|
|
||||||
};
|
|
||||||
let tunnelAgent;
|
|
||||||
const overHttps = proxyUrl.protocol === 'https:';
|
|
||||||
if (usingSsl) {
|
|
||||||
tunnelAgent = overHttps ? tunnel.httpsOverHttps : tunnel.httpsOverHttp;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
tunnelAgent = overHttps ? tunnel.httpOverHttps : tunnel.httpOverHttp;
|
|
||||||
}
|
|
||||||
agent = tunnelAgent(agentOptions);
|
|
||||||
this._proxyAgent = agent;
|
|
||||||
}
|
|
||||||
// if reusing agent across request and tunneling agent isn't assigned create a new agent
|
|
||||||
if (this._keepAlive && !agent) {
|
|
||||||
const options = { keepAlive: this._keepAlive, maxSockets: maxSockets };
|
|
||||||
agent = usingSsl ? new https.Agent(options) : new http.Agent(options);
|
|
||||||
this._agent = agent;
|
|
||||||
}
|
|
||||||
// if not using private agent and tunnel agent isn't setup then use global agent
|
|
||||||
if (!agent) {
|
|
||||||
agent = usingSsl ? https.globalAgent : http.globalAgent;
|
|
||||||
}
|
|
||||||
if (usingSsl && this._ignoreSslError) {
|
|
||||||
// we don't want to set NODE_TLS_REJECT_UNAUTHORIZED=0 since that will affect request for entire process
|
|
||||||
// http.RequestOptions doesn't expose a way to modify RequestOptions.agent.options
|
|
||||||
// we have to cast it to any and change it directly
|
|
||||||
agent.options = Object.assign(agent.options || {}, { rejectUnauthorized: false });
|
|
||||||
}
|
|
||||||
return agent;
|
|
||||||
}
|
|
||||||
_performExponentialBackoff(retryNumber) {
|
|
||||||
retryNumber = Math.min(ExponentialBackoffCeiling, retryNumber);
|
|
||||||
const ms = ExponentialBackoffTimeSlice * Math.pow(2, retryNumber);
|
|
||||||
return new Promise(resolve => setTimeout(() => resolve(), ms));
|
|
||||||
}
|
|
||||||
static dateTimeDeserializer(key, value) {
|
|
||||||
if (typeof value === 'string') {
|
|
||||||
let a = new Date(value);
|
|
||||||
if (!isNaN(a.valueOf())) {
|
|
||||||
return a;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
async _processResponse(res, options) {
|
|
||||||
return new Promise(async (resolve, reject) => {
|
|
||||||
const statusCode = res.message.statusCode;
|
|
||||||
const response = {
|
|
||||||
statusCode: statusCode,
|
|
||||||
result: null,
|
|
||||||
headers: {}
|
|
||||||
};
|
|
||||||
// not found leads to null obj returned
|
|
||||||
if (statusCode == HttpCodes.NotFound) {
|
|
||||||
resolve(response);
|
|
||||||
}
|
|
||||||
let obj;
|
|
||||||
let contents;
|
|
||||||
// get the result from the body
|
|
||||||
try {
|
|
||||||
contents = await res.readBody();
|
|
||||||
if (contents && contents.length > 0) {
|
|
||||||
if (options && options.deserializeDates) {
|
|
||||||
obj = JSON.parse(contents, HttpClient.dateTimeDeserializer);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
obj = JSON.parse(contents);
|
|
||||||
}
|
|
||||||
response.result = obj;
|
|
||||||
}
|
|
||||||
response.headers = res.message.headers;
|
|
||||||
}
|
|
||||||
catch (err) {
|
|
||||||
// Invalid resource (contents not json); leaving result obj null
|
|
||||||
}
|
|
||||||
// note that 3xx redirects are handled by the http layer.
|
|
||||||
if (statusCode > 299) {
|
|
||||||
let msg;
|
|
||||||
// if exception/error in body, attempt to get better error
|
|
||||||
if (obj && obj.message) {
|
|
||||||
msg = obj.message;
|
|
||||||
}
|
|
||||||
else if (contents && contents.length > 0) {
|
|
||||||
// it may be the case that the exception is in the body message as string
|
|
||||||
msg = contents;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
msg = "Failed request: (" + statusCode + ")";
|
|
||||||
}
|
|
||||||
let err = new Error(msg);
|
|
||||||
// attach statusCode and body obj (if available) to the error object
|
|
||||||
err['statusCode'] = statusCode;
|
|
||||||
if (response.result) {
|
|
||||||
err['result'] = response.result;
|
|
||||||
}
|
|
||||||
reject(err);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
resolve(response);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
exports.HttpClient = HttpClient;
|
|
||||||
50
node_modules/@actions/http-client/interfaces.d.ts
generated
vendored
50
node_modules/@actions/http-client/interfaces.d.ts
generated
vendored
@@ -1,50 +0,0 @@
|
|||||||
/// <reference types="node" />
|
|
||||||
import http = require("http");
|
|
||||||
import url = require("url");
|
|
||||||
export interface IHeaders {
|
|
||||||
[key: string]: any;
|
|
||||||
}
|
|
||||||
export interface IHttpClient {
|
|
||||||
options(requestUrl: string, additionalHeaders?: IHeaders): Promise<IHttpClientResponse>;
|
|
||||||
get(requestUrl: string, additionalHeaders?: IHeaders): Promise<IHttpClientResponse>;
|
|
||||||
del(requestUrl: string, additionalHeaders?: IHeaders): Promise<IHttpClientResponse>;
|
|
||||||
post(requestUrl: string, data: string, additionalHeaders?: IHeaders): Promise<IHttpClientResponse>;
|
|
||||||
patch(requestUrl: string, data: string, additionalHeaders?: IHeaders): Promise<IHttpClientResponse>;
|
|
||||||
put(requestUrl: string, data: string, additionalHeaders?: IHeaders): Promise<IHttpClientResponse>;
|
|
||||||
sendStream(verb: string, requestUrl: string, stream: NodeJS.ReadableStream, additionalHeaders?: IHeaders): Promise<IHttpClientResponse>;
|
|
||||||
request(verb: string, requestUrl: string, data: string | NodeJS.ReadableStream, headers: IHeaders): Promise<IHttpClientResponse>;
|
|
||||||
requestRaw(info: IRequestInfo, data: string | NodeJS.ReadableStream): Promise<IHttpClientResponse>;
|
|
||||||
requestRawWithCallback(info: IRequestInfo, data: string | NodeJS.ReadableStream, onResult: (err: any, res: IHttpClientResponse) => void): void;
|
|
||||||
}
|
|
||||||
export interface IRequestHandler {
|
|
||||||
prepareRequest(options: http.RequestOptions): void;
|
|
||||||
canHandleAuthentication(response: IHttpClientResponse): boolean;
|
|
||||||
handleAuthentication(httpClient: IHttpClient, requestInfo: IRequestInfo, objs: any): Promise<IHttpClientResponse>;
|
|
||||||
}
|
|
||||||
export interface IHttpClientResponse {
|
|
||||||
message: http.IncomingMessage;
|
|
||||||
readBody(): Promise<string>;
|
|
||||||
}
|
|
||||||
export interface IRequestInfo {
|
|
||||||
options: http.RequestOptions;
|
|
||||||
parsedUrl: url.Url;
|
|
||||||
httpModule: any;
|
|
||||||
}
|
|
||||||
export interface IRequestOptions {
|
|
||||||
headers?: IHeaders;
|
|
||||||
socketTimeout?: number;
|
|
||||||
ignoreSslError?: boolean;
|
|
||||||
allowRedirects?: boolean;
|
|
||||||
allowRedirectDowngrade?: boolean;
|
|
||||||
maxRedirects?: number;
|
|
||||||
maxSockets?: number;
|
|
||||||
keepAlive?: boolean;
|
|
||||||
deserializeDates?: boolean;
|
|
||||||
allowRetries?: boolean;
|
|
||||||
maxRetries?: number;
|
|
||||||
}
|
|
||||||
export interface ITypedResponse<T> {
|
|
||||||
statusCode: number;
|
|
||||||
result: T | null;
|
|
||||||
headers: Object;
|
|
||||||
}
|
|
||||||
3
node_modules/@actions/http-client/interfaces.js
generated
vendored
3
node_modules/@actions/http-client/interfaces.js
generated
vendored
@@ -1,3 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
;
|
|
||||||
63
node_modules/@actions/http-client/package.json
generated
vendored
63
node_modules/@actions/http-client/package.json
generated
vendored
@@ -1,63 +0,0 @@
|
|||||||
{
|
|
||||||
"_from": "@actions/http-client@^1.0.3",
|
|
||||||
"_id": "@actions/http-client@1.0.6",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha512-LGmio4w98UyGX33b/W6V6Nx/sQHRXZ859YlMkn36wPsXPB82u8xTVlA/Dq2DXrm6lEq9RVmisRJa1c+HETAIJA==",
|
|
||||||
"_location": "/@actions/http-client",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "range",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "@actions/http-client@^1.0.3",
|
|
||||||
"name": "@actions/http-client",
|
|
||||||
"escapedName": "@actions%2fhttp-client",
|
|
||||||
"scope": "@actions",
|
|
||||||
"rawSpec": "^1.0.3",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "^1.0.3"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"/@actions/github"
|
|
||||||
],
|
|
||||||
"_resolved": "https://registry.npmjs.org/@actions/http-client/-/http-client-1.0.6.tgz",
|
|
||||||
"_shasum": "6f9267ca50e1d74d8581f4a894a943cd4c97b49a",
|
|
||||||
"_spec": "@actions/http-client@^1.0.3",
|
|
||||||
"_where": "/Users/bret/repos/deploy-to-neocities/node_modules/@actions/github",
|
|
||||||
"author": {
|
|
||||||
"name": "GitHub, Inc."
|
|
||||||
},
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/actions/http-client/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"dependencies": {
|
|
||||||
"tunnel": "0.0.6"
|
|
||||||
},
|
|
||||||
"deprecated": false,
|
|
||||||
"description": "Actions Http Client",
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/jest": "^24.0.25",
|
|
||||||
"@types/node": "^12.12.24",
|
|
||||||
"jest": "^24.9.0",
|
|
||||||
"proxy": "^1.0.1",
|
|
||||||
"ts-jest": "^24.3.0",
|
|
||||||
"typescript": "^3.7.4"
|
|
||||||
},
|
|
||||||
"homepage": "https://github.com/actions/http-client#readme",
|
|
||||||
"keywords": [
|
|
||||||
"Actions",
|
|
||||||
"Http"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"main": "index.js",
|
|
||||||
"name": "@actions/http-client",
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/actions/http-client.git"
|
|
||||||
},
|
|
||||||
"scripts": {
|
|
||||||
"build": "rm -Rf ./_out && tsc && cp package*.json ./_out && cp *.md ./_out && cp LICENSE ./_out && cp actions.png ./_out",
|
|
||||||
"test": "jest"
|
|
||||||
},
|
|
||||||
"version": "1.0.6"
|
|
||||||
}
|
|
||||||
4
node_modules/@actions/http-client/proxy.d.ts
generated
vendored
4
node_modules/@actions/http-client/proxy.d.ts
generated
vendored
@@ -1,4 +0,0 @@
|
|||||||
/// <reference types="node" />
|
|
||||||
import * as url from 'url';
|
|
||||||
export declare function getProxyUrl(reqUrl: url.Url): url.Url | undefined;
|
|
||||||
export declare function checkBypass(reqUrl: url.Url): boolean;
|
|
||||||
57
node_modules/@actions/http-client/proxy.js
generated
vendored
57
node_modules/@actions/http-client/proxy.js
generated
vendored
@@ -1,57 +0,0 @@
|
|||||||
"use strict";
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
|
||||||
const url = require("url");
|
|
||||||
function getProxyUrl(reqUrl) {
|
|
||||||
let usingSsl = reqUrl.protocol === 'https:';
|
|
||||||
let proxyUrl;
|
|
||||||
if (checkBypass(reqUrl)) {
|
|
||||||
return proxyUrl;
|
|
||||||
}
|
|
||||||
let proxyVar;
|
|
||||||
if (usingSsl) {
|
|
||||||
proxyVar = process.env["https_proxy"] ||
|
|
||||||
process.env["HTTPS_PROXY"];
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
proxyVar = process.env["http_proxy"] ||
|
|
||||||
process.env["HTTP_PROXY"];
|
|
||||||
}
|
|
||||||
if (proxyVar) {
|
|
||||||
proxyUrl = url.parse(proxyVar);
|
|
||||||
}
|
|
||||||
return proxyUrl;
|
|
||||||
}
|
|
||||||
exports.getProxyUrl = getProxyUrl;
|
|
||||||
function checkBypass(reqUrl) {
|
|
||||||
if (!reqUrl.hostname) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
let noProxy = process.env["no_proxy"] || process.env["NO_PROXY"] || '';
|
|
||||||
if (!noProxy) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
// Determine the request port
|
|
||||||
let reqPort;
|
|
||||||
if (reqUrl.port) {
|
|
||||||
reqPort = Number(reqUrl.port);
|
|
||||||
}
|
|
||||||
else if (reqUrl.protocol === 'http:') {
|
|
||||||
reqPort = 80;
|
|
||||||
}
|
|
||||||
else if (reqUrl.protocol === 'https:') {
|
|
||||||
reqPort = 443;
|
|
||||||
}
|
|
||||||
// Format the request hostname and hostname with port
|
|
||||||
let upperReqHosts = [reqUrl.hostname.toUpperCase()];
|
|
||||||
if (typeof reqPort === 'number') {
|
|
||||||
upperReqHosts.push(`${upperReqHosts[0]}:${reqPort}`);
|
|
||||||
}
|
|
||||||
// Compare request host against noproxy
|
|
||||||
for (let upperNoProxyItem of noProxy.split(',').map(x => x.trim().toUpperCase()).filter(x => x)) {
|
|
||||||
if (upperReqHosts.some(x => x === upperNoProxyItem)) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
exports.checkBypass = checkBypass;
|
|
||||||
21
node_modules/@octokit/auth-token/LICENSE
generated
vendored
21
node_modules/@octokit/auth-token/LICENSE
generated
vendored
@@ -1,21 +0,0 @@
|
|||||||
The MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2019 Octokit contributors
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
257
node_modules/@octokit/auth-token/README.md
generated
vendored
257
node_modules/@octokit/auth-token/README.md
generated
vendored
@@ -1,257 +0,0 @@
|
|||||||
# auth-token.js
|
|
||||||
|
|
||||||
> GitHub API token authentication for browsers and Node.js
|
|
||||||
|
|
||||||
[](https://www.npmjs.com/package/@octokit/auth-token)
|
|
||||||
[](https://travis-ci.com/octokit/auth-token.js)
|
|
||||||
[](https://greenkeeper.io/)
|
|
||||||
|
|
||||||
`@octokit/auth-token` is the simplest of [GitHub’s authentication strategies](https://github.com/octokit/auth.js).
|
|
||||||
|
|
||||||
It is useful if you want to support multiple authentication strategies, as it’s API is compatible with its sibling packages for [basic](https://github.com/octokit/auth-basic.js), [GitHub App](https://github.com/octokit/auth-app.js) and [OAuth app](https://github.com/octokit/auth.js) authentication.
|
|
||||||
|
|
||||||
<!-- toc -->
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
<table>
|
|
||||||
<tbody valign=top align=left>
|
|
||||||
<tr><th>
|
|
||||||
Browsers
|
|
||||||
</th><td width=100%>
|
|
||||||
|
|
||||||
Load `@octokit/auth-token` directly from [cdn.pika.dev](https://cdn.pika.dev)
|
|
||||||
|
|
||||||
```html
|
|
||||||
<script type="module">
|
|
||||||
import { createTokenAuth } from "https://cdn.pika.dev/@octokit/auth-token";
|
|
||||||
</script>
|
|
||||||
```
|
|
||||||
|
|
||||||
</td></tr>
|
|
||||||
<tr><th>
|
|
||||||
Node
|
|
||||||
</th><td>
|
|
||||||
|
|
||||||
Install with <code>npm install @octokit/auth-token</code>
|
|
||||||
|
|
||||||
```js
|
|
||||||
const { createTokenAuth } = require("@octokit/auth-token");
|
|
||||||
// or: import { createTokenAuth } from "@octokit/auth-token";
|
|
||||||
```
|
|
||||||
|
|
||||||
</td></tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
```js
|
|
||||||
const auth = createTokenAuth("1234567890abcdef1234567890abcdef12345678");
|
|
||||||
const authentication = await auth();
|
|
||||||
// {
|
|
||||||
// type: 'token',
|
|
||||||
// token: '1234567890abcdef1234567890abcdef12345678',
|
|
||||||
// tokenType: 'oauth'
|
|
||||||
```
|
|
||||||
|
|
||||||
## `createTokenAuth(token) options`
|
|
||||||
|
|
||||||
The `createTokenAuth` method accepts a single argument of type string, which is the token. The passed token can be one of the following:
|
|
||||||
|
|
||||||
- [Personal access token](https://help.github.com/en/articles/creating-a-personal-access-token-for-the-command-line)
|
|
||||||
- [OAuth access token](https://developer.github.com/apps/building-oauth-apps/authorizing-oauth-apps/)
|
|
||||||
- Installation access token ([GitHub App Installation](https://developer.github.com/apps/building-github-apps/authenticating-with-github-apps/#authenticating-as-an-installation))
|
|
||||||
- [GITHUB_TOKEN provided to GitHub Actions](https://developer.github.com/actions/creating-github-actions/accessing-the-runtime-environment/#environment-variables)
|
|
||||||
|
|
||||||
Examples
|
|
||||||
|
|
||||||
```js
|
|
||||||
// Personal access token or OAuth access token
|
|
||||||
createTokenAuth("1234567890abcdef1234567890abcdef12345678");
|
|
||||||
|
|
||||||
// Installation access token or GitHub Action token
|
|
||||||
createTokenAuth("v1.d3d433526f780fbcc3129004e2731b3904ad0b86");
|
|
||||||
```
|
|
||||||
|
|
||||||
## `auth()`
|
|
||||||
|
|
||||||
The `auth()` method has no options. It returns a promise which resolves with the the authentication object.
|
|
||||||
|
|
||||||
## Authentication object
|
|
||||||
|
|
||||||
<table width="100%">
|
|
||||||
<thead align=left>
|
|
||||||
<tr>
|
|
||||||
<th width=150>
|
|
||||||
name
|
|
||||||
</th>
|
|
||||||
<th width=70>
|
|
||||||
type
|
|
||||||
</th>
|
|
||||||
<th>
|
|
||||||
description
|
|
||||||
</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody align=left valign=top>
|
|
||||||
<tr>
|
|
||||||
<th>
|
|
||||||
<code>type</code>
|
|
||||||
</th>
|
|
||||||
<th>
|
|
||||||
<code>string</code>
|
|
||||||
</th>
|
|
||||||
<td>
|
|
||||||
<code>"token"</code>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th>
|
|
||||||
<code>token</code>
|
|
||||||
</th>
|
|
||||||
<th>
|
|
||||||
<code>string</code>
|
|
||||||
</th>
|
|
||||||
<td>
|
|
||||||
The provided token.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th>
|
|
||||||
<code>tokenType</code>
|
|
||||||
</th>
|
|
||||||
<th>
|
|
||||||
<code>string</code>
|
|
||||||
</th>
|
|
||||||
<td>
|
|
||||||
Can be either <code>"oauth"</code> for personal access tokens and OAuth tokens, or <code>"installation"</code> for installation access tokens (includes <code>GITHUB_TOKEN</code> provided to GitHub Actions)
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
## `auth.hook(request, route, options)` or `auth.hook(request, options)`
|
|
||||||
|
|
||||||
`auth.hook()` hooks directly into the request life cycle. It authenticates the request using the provided token.
|
|
||||||
|
|
||||||
The `request` option is an instance of [`@octokit/request`](https://github.com/octokit/request.js#readme). The `route`/`options` parameters are the same as for the [`request()` method](https://github.com/octokit/request.js#request).
|
|
||||||
|
|
||||||
`auth.hook()` can be called directly to send an authenticated request
|
|
||||||
|
|
||||||
```js
|
|
||||||
const { data: authorizations } = await auth.hook(
|
|
||||||
request,
|
|
||||||
"GET /authorizations"
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
Or it can be passed as option to [`request()`](https://github.com/octokit/request.js#request).
|
|
||||||
|
|
||||||
```js
|
|
||||||
const requestWithAuth = request.defaults({
|
|
||||||
request: {
|
|
||||||
hook: auth.hook
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const { data: authorizations } = await requestWithAuth("GET /authorizations");
|
|
||||||
```
|
|
||||||
|
|
||||||
## Find more information
|
|
||||||
|
|
||||||
`auth()` does not send any requests, it only transforms the provided token string into an authentication object.
|
|
||||||
|
|
||||||
Here is a list of things you can do to retrieve further information
|
|
||||||
|
|
||||||
### Find out what scopes are enabled for oauth tokens
|
|
||||||
|
|
||||||
Note that this does not work for installations. There is no way to retrieve permissions based on an installation access tokens.
|
|
||||||
|
|
||||||
```js
|
|
||||||
const TOKEN = "1234567890abcdef1234567890abcdef12345678";
|
|
||||||
|
|
||||||
const auth = createTokenAuth(TOKEN);
|
|
||||||
const authentication = await auth();
|
|
||||||
|
|
||||||
const response = await request("HEAD /", {
|
|
||||||
headers: authentication.headers
|
|
||||||
});
|
|
||||||
const scopes = response.headers["x-oauth-scopes"].split(/,\s+/);
|
|
||||||
|
|
||||||
if (scopes.length) {
|
|
||||||
console.log(
|
|
||||||
`"${TOKEN}" has ${scopes.length} scopes enabled: ${scopes.join(", ")}`
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
console.log(`"${TOKEN}" has no scopes enabled`);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Find out if token is a personal access token or if it belongs to an OAuth app
|
|
||||||
|
|
||||||
```js
|
|
||||||
const TOKEN = "1234567890abcdef1234567890abcdef12345678";
|
|
||||||
|
|
||||||
const auth = createTokenAuth(TOKEN);
|
|
||||||
const authentication = await auth();
|
|
||||||
|
|
||||||
const response = await request("HEAD /", {
|
|
||||||
headers: authentication.headers
|
|
||||||
});
|
|
||||||
const clientId = response.headers["x-oauth-client-id"];
|
|
||||||
|
|
||||||
if (clientId) {
|
|
||||||
console.log(
|
|
||||||
`"${token}" is an OAuth token, its app’s client_id is ${clientId}.`
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
console.log(`"${token}" is a personal access token`);
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Find out what permissions are enabled for a repository
|
|
||||||
|
|
||||||
Note that the `permissions` key is not set when authenticated using an installation access token.
|
|
||||||
|
|
||||||
```js
|
|
||||||
const TOKEN = "1234567890abcdef1234567890abcdef12345678";
|
|
||||||
|
|
||||||
const auth = createTokenAuth(TOKEN);
|
|
||||||
const authentication = await auth();
|
|
||||||
|
|
||||||
const response = await request("GET /repos/:owner/:repo", {
|
|
||||||
owner: 'octocat',
|
|
||||||
repo: 'hello-world'
|
|
||||||
headers: authentication.headers
|
|
||||||
});
|
|
||||||
|
|
||||||
console.log(response.data.permissions)
|
|
||||||
// {
|
|
||||||
// admin: true,
|
|
||||||
// push: true,
|
|
||||||
// pull: true
|
|
||||||
// }
|
|
||||||
```
|
|
||||||
|
|
||||||
### Use token for git operations
|
|
||||||
|
|
||||||
Both OAuth and installation access tokens can be used for git operations. However, when using with an installation, [the token must be prefixed with `x-access-token`](https://developer.github.com/apps/building-github-apps/authenticating-with-github-apps/#http-based-git-access-by-an-installation).
|
|
||||||
|
|
||||||
This example is using the [`execa`](https://github.com/sindresorhus/execa) package to run a `git push` command.
|
|
||||||
|
|
||||||
```js
|
|
||||||
const TOKEN = "1234567890abcdef1234567890abcdef12345678";
|
|
||||||
|
|
||||||
const auth = createTokenAuth(TOKEN);
|
|
||||||
const { token, tokenType } = await auth();
|
|
||||||
const tokenWithPrefix =
|
|
||||||
tokenType === "installation" ? `x-access-token:${token}` : token;
|
|
||||||
|
|
||||||
const repositoryUrl = `https://${tokenWithPrefix}@github.com/octocat/hello-world.git`;
|
|
||||||
|
|
||||||
const { stdout } = await execa("git", ["push", repositoryUrl]);
|
|
||||||
console.log(stdout);
|
|
||||||
```
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
[MIT](LICENSE)
|
|
||||||
49
node_modules/@octokit/auth-token/dist-node/index.js
generated
vendored
49
node_modules/@octokit/auth-token/dist-node/index.js
generated
vendored
@@ -1,49 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
Object.defineProperty(exports, '__esModule', { value: true });
|
|
||||||
|
|
||||||
async function auth(token) {
|
|
||||||
const tokenType = token.split(/\./).length === 3 ? "app" : /^v\d+\./.test(token) ? "installation" : "oauth";
|
|
||||||
return {
|
|
||||||
type: "token",
|
|
||||||
token: token,
|
|
||||||
tokenType
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prefix token for usage in the Authorization header
|
|
||||||
*
|
|
||||||
* @param token OAuth token or JSON Web Token
|
|
||||||
*/
|
|
||||||
function withAuthorizationPrefix(token) {
|
|
||||||
if (token.split(/\./).length === 3) {
|
|
||||||
return `bearer ${token}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
return `token ${token}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function hook(token, request, route, parameters) {
|
|
||||||
const endpoint = request.endpoint.merge(route, parameters);
|
|
||||||
endpoint.headers.authorization = withAuthorizationPrefix(token);
|
|
||||||
return request(endpoint);
|
|
||||||
}
|
|
||||||
|
|
||||||
const createTokenAuth = function createTokenAuth(token) {
|
|
||||||
if (!token) {
|
|
||||||
throw new Error("[@octokit/auth-token] No token passed to createTokenAuth");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (typeof token !== "string") {
|
|
||||||
throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string");
|
|
||||||
}
|
|
||||||
|
|
||||||
token = token.replace(/^(token|bearer) +/i, "");
|
|
||||||
return Object.assign(auth.bind(null, token), {
|
|
||||||
hook: hook.bind(null, token)
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
exports.createTokenAuth = createTokenAuth;
|
|
||||||
//# sourceMappingURL=index.js.map
|
|
||||||
1
node_modules/@octokit/auth-token/dist-node/index.js.map
generated
vendored
1
node_modules/@octokit/auth-token/dist-node/index.js.map
generated
vendored
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"index.js","sources":["../dist-src/auth.js","../dist-src/with-authorization-prefix.js","../dist-src/hook.js","../dist-src/index.js"],"sourcesContent":["export async function auth(token) {\n const tokenType = token.split(/\\./).length === 3\n ? \"app\"\n : /^v\\d+\\./.test(token)\n ? \"installation\"\n : \"oauth\";\n return {\n type: \"token\",\n token: token,\n tokenType\n };\n}\n","/**\n * Prefix token for usage in the Authorization header\n *\n * @param token OAuth token or JSON Web Token\n */\nexport function withAuthorizationPrefix(token) {\n if (token.split(/\\./).length === 3) {\n return `bearer ${token}`;\n }\n return `token ${token}`;\n}\n","import { withAuthorizationPrefix } from \"./with-authorization-prefix\";\nexport async function hook(token, request, route, parameters) {\n const endpoint = request.endpoint.merge(route, parameters);\n endpoint.headers.authorization = withAuthorizationPrefix(token);\n return request(endpoint);\n}\n","import { auth } from \"./auth\";\nimport { hook } from \"./hook\";\nexport const createTokenAuth = function createTokenAuth(token) {\n if (!token) {\n throw new Error(\"[@octokit/auth-token] No token passed to createTokenAuth\");\n }\n if (typeof token !== \"string\") {\n throw new Error(\"[@octokit/auth-token] Token passed to createTokenAuth is not a string\");\n }\n token = token.replace(/^(token|bearer) +/i, \"\");\n return Object.assign(auth.bind(null, token), {\n hook: hook.bind(null, token)\n });\n};\n"],"names":["auth","token","tokenType","split","length","test","type","withAuthorizationPrefix","hook","request","route","parameters","endpoint","merge","headers","authorization","createTokenAuth","Error","replace","Object","assign","bind"],"mappings":";;;;AAAO,eAAeA,IAAf,CAAoBC,KAApB,EAA2B;QACxBC,SAAS,GAAGD,KAAK,CAACE,KAAN,CAAY,IAAZ,EAAkBC,MAAlB,KAA6B,CAA7B,GACZ,KADY,GAEZ,UAAUC,IAAV,CAAeJ,KAAf,IACI,cADJ,GAEI,OAJV;SAKO;IACHK,IAAI,EAAE,OADH;IAEHL,KAAK,EAAEA,KAFJ;IAGHC;GAHJ;;;ACNJ;;;;;AAKA,AAAO,SAASK,uBAAT,CAAiCN,KAAjC,EAAwC;MACvCA,KAAK,CAACE,KAAN,CAAY,IAAZ,EAAkBC,MAAlB,KAA6B,CAAjC,EAAoC;WACxB,UAASH,KAAM,EAAvB;;;SAEI,SAAQA,KAAM,EAAtB;;;ACRG,eAAeO,IAAf,CAAoBP,KAApB,EAA2BQ,OAA3B,EAAoCC,KAApC,EAA2CC,UAA3C,EAAuD;QACpDC,QAAQ,GAAGH,OAAO,CAACG,QAAR,CAAiBC,KAAjB,CAAuBH,KAAvB,EAA8BC,UAA9B,CAAjB;EACAC,QAAQ,CAACE,OAAT,CAAiBC,aAAjB,GAAiCR,uBAAuB,CAACN,KAAD,CAAxD;SACOQ,OAAO,CAACG,QAAD,CAAd;;;MCFSI,eAAe,GAAG,SAASA,eAAT,CAAyBf,KAAzB,EAAgC;MACvD,CAACA,KAAL,EAAY;UACF,IAAIgB,KAAJ,CAAU,0DAAV,CAAN;;;MAEA,OAAOhB,KAAP,KAAiB,QAArB,EAA+B;UACrB,IAAIgB,KAAJ,CAAU,uEAAV,CAAN;;;EAEJhB,KAAK,GAAGA,KAAK,CAACiB,OAAN,CAAc,oBAAd,EAAoC,EAApC,CAAR;SACOC,MAAM,CAACC,MAAP,CAAcpB,IAAI,CAACqB,IAAL,CAAU,IAAV,EAAgBpB,KAAhB,CAAd,EAAsC;IACzCO,IAAI,EAAEA,IAAI,CAACa,IAAL,CAAU,IAAV,EAAgBpB,KAAhB;GADH,CAAP;CARG;;;;"}
|
|
||||||
12
node_modules/@octokit/auth-token/dist-src/auth.js
generated
vendored
12
node_modules/@octokit/auth-token/dist-src/auth.js
generated
vendored
@@ -1,12 +0,0 @@
|
|||||||
export async function auth(token) {
|
|
||||||
const tokenType = token.split(/\./).length === 3
|
|
||||||
? "app"
|
|
||||||
: /^v\d+\./.test(token)
|
|
||||||
? "installation"
|
|
||||||
: "oauth";
|
|
||||||
return {
|
|
||||||
type: "token",
|
|
||||||
token: token,
|
|
||||||
tokenType
|
|
||||||
};
|
|
||||||
}
|
|
||||||
6
node_modules/@octokit/auth-token/dist-src/hook.js
generated
vendored
6
node_modules/@octokit/auth-token/dist-src/hook.js
generated
vendored
@@ -1,6 +0,0 @@
|
|||||||
import { withAuthorizationPrefix } from "./with-authorization-prefix";
|
|
||||||
export async function hook(token, request, route, parameters) {
|
|
||||||
const endpoint = request.endpoint.merge(route, parameters);
|
|
||||||
endpoint.headers.authorization = withAuthorizationPrefix(token);
|
|
||||||
return request(endpoint);
|
|
||||||
}
|
|
||||||
14
node_modules/@octokit/auth-token/dist-src/index.js
generated
vendored
14
node_modules/@octokit/auth-token/dist-src/index.js
generated
vendored
@@ -1,14 +0,0 @@
|
|||||||
import { auth } from "./auth";
|
|
||||||
import { hook } from "./hook";
|
|
||||||
export const createTokenAuth = function createTokenAuth(token) {
|
|
||||||
if (!token) {
|
|
||||||
throw new Error("[@octokit/auth-token] No token passed to createTokenAuth");
|
|
||||||
}
|
|
||||||
if (typeof token !== "string") {
|
|
||||||
throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string");
|
|
||||||
}
|
|
||||||
token = token.replace(/^(token|bearer) +/i, "");
|
|
||||||
return Object.assign(auth.bind(null, token), {
|
|
||||||
hook: hook.bind(null, token)
|
|
||||||
});
|
|
||||||
};
|
|
||||||
0
node_modules/@octokit/auth-token/dist-src/types.js
generated
vendored
0
node_modules/@octokit/auth-token/dist-src/types.js
generated
vendored
11
node_modules/@octokit/auth-token/dist-src/with-authorization-prefix.js
generated
vendored
11
node_modules/@octokit/auth-token/dist-src/with-authorization-prefix.js
generated
vendored
@@ -1,11 +0,0 @@
|
|||||||
/**
|
|
||||||
* Prefix token for usage in the Authorization header
|
|
||||||
*
|
|
||||||
* @param token OAuth token or JSON Web Token
|
|
||||||
*/
|
|
||||||
export function withAuthorizationPrefix(token) {
|
|
||||||
if (token.split(/\./).length === 3) {
|
|
||||||
return `bearer ${token}`;
|
|
||||||
}
|
|
||||||
return `token ${token}`;
|
|
||||||
}
|
|
||||||
2
node_modules/@octokit/auth-token/dist-types/auth.d.ts
generated
vendored
2
node_modules/@octokit/auth-token/dist-types/auth.d.ts
generated
vendored
@@ -1,2 +0,0 @@
|
|||||||
import { Token, Authentication } from "./types";
|
|
||||||
export declare function auth(token: Token): Promise<Authentication>;
|
|
||||||
2
node_modules/@octokit/auth-token/dist-types/hook.d.ts
generated
vendored
2
node_modules/@octokit/auth-token/dist-types/hook.d.ts
generated
vendored
@@ -1,2 +0,0 @@
|
|||||||
import { AnyResponse, EndpointOptions, RequestInterface, RequestParameters, Route, Token } from "./types";
|
|
||||||
export declare function hook(token: Token, request: RequestInterface, route: Route | EndpointOptions, parameters?: RequestParameters): Promise<AnyResponse>;
|
|
||||||
7
node_modules/@octokit/auth-token/dist-types/index.d.ts
generated
vendored
7
node_modules/@octokit/auth-token/dist-types/index.d.ts
generated
vendored
@@ -1,7 +0,0 @@
|
|||||||
import { StrategyInterface, Token, Authentication } from "./types";
|
|
||||||
export declare type Types = {
|
|
||||||
StrategyOptions: Token;
|
|
||||||
AuthOptions: never;
|
|
||||||
Authentication: Authentication;
|
|
||||||
};
|
|
||||||
export declare const createTokenAuth: StrategyInterface;
|
|
||||||
25
node_modules/@octokit/auth-token/dist-types/types.d.ts
generated
vendored
25
node_modules/@octokit/auth-token/dist-types/types.d.ts
generated
vendored
@@ -1,25 +0,0 @@
|
|||||||
import * as OctokitTypes from "@octokit/types";
|
|
||||||
export declare type AnyResponse = OctokitTypes.OctokitResponse<any>;
|
|
||||||
export declare type StrategyInterface = OctokitTypes.StrategyInterface<[Token], [], Authentication>;
|
|
||||||
export declare type EndpointDefaults = OctokitTypes.EndpointDefaults;
|
|
||||||
export declare type EndpointOptions = OctokitTypes.EndpointOptions;
|
|
||||||
export declare type RequestParameters = OctokitTypes.RequestParameters;
|
|
||||||
export declare type RequestInterface = OctokitTypes.RequestInterface;
|
|
||||||
export declare type Route = OctokitTypes.Route;
|
|
||||||
export declare type Token = string;
|
|
||||||
export declare type OAuthTokenAuthentication = {
|
|
||||||
type: "token";
|
|
||||||
tokenType: "oauth";
|
|
||||||
token: Token;
|
|
||||||
};
|
|
||||||
export declare type InstallationTokenAuthentication = {
|
|
||||||
type: "token";
|
|
||||||
tokenType: "installation";
|
|
||||||
token: Token;
|
|
||||||
};
|
|
||||||
export declare type AppAuthentication = {
|
|
||||||
type: "token";
|
|
||||||
tokenType: "app";
|
|
||||||
token: Token;
|
|
||||||
};
|
|
||||||
export declare type Authentication = OAuthTokenAuthentication | InstallationTokenAuthentication | AppAuthentication;
|
|
||||||
6
node_modules/@octokit/auth-token/dist-types/with-authorization-prefix.d.ts
generated
vendored
6
node_modules/@octokit/auth-token/dist-types/with-authorization-prefix.d.ts
generated
vendored
@@ -1,6 +0,0 @@
|
|||||||
/**
|
|
||||||
* Prefix token for usage in the Authorization header
|
|
||||||
*
|
|
||||||
* @param token OAuth token or JSON Web Token
|
|
||||||
*/
|
|
||||||
export declare function withAuthorizationPrefix(token: string): string;
|
|
||||||
46
node_modules/@octokit/auth-token/dist-web/index.js
generated
vendored
46
node_modules/@octokit/auth-token/dist-web/index.js
generated
vendored
@@ -1,46 +0,0 @@
|
|||||||
async function auth(token) {
|
|
||||||
const tokenType = token.split(/\./).length === 3
|
|
||||||
? "app"
|
|
||||||
: /^v\d+\./.test(token)
|
|
||||||
? "installation"
|
|
||||||
: "oauth";
|
|
||||||
return {
|
|
||||||
type: "token",
|
|
||||||
token: token,
|
|
||||||
tokenType
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Prefix token for usage in the Authorization header
|
|
||||||
*
|
|
||||||
* @param token OAuth token or JSON Web Token
|
|
||||||
*/
|
|
||||||
function withAuthorizationPrefix(token) {
|
|
||||||
if (token.split(/\./).length === 3) {
|
|
||||||
return `bearer ${token}`;
|
|
||||||
}
|
|
||||||
return `token ${token}`;
|
|
||||||
}
|
|
||||||
|
|
||||||
async function hook(token, request, route, parameters) {
|
|
||||||
const endpoint = request.endpoint.merge(route, parameters);
|
|
||||||
endpoint.headers.authorization = withAuthorizationPrefix(token);
|
|
||||||
return request(endpoint);
|
|
||||||
}
|
|
||||||
|
|
||||||
const createTokenAuth = function createTokenAuth(token) {
|
|
||||||
if (!token) {
|
|
||||||
throw new Error("[@octokit/auth-token] No token passed to createTokenAuth");
|
|
||||||
}
|
|
||||||
if (typeof token !== "string") {
|
|
||||||
throw new Error("[@octokit/auth-token] Token passed to createTokenAuth is not a string");
|
|
||||||
}
|
|
||||||
token = token.replace(/^(token|bearer) +/i, "");
|
|
||||||
return Object.assign(auth.bind(null, token), {
|
|
||||||
hook: hook.bind(null, token)
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
export { createTokenAuth };
|
|
||||||
//# sourceMappingURL=index.js.map
|
|
||||||
1
node_modules/@octokit/auth-token/dist-web/index.js.map
generated
vendored
1
node_modules/@octokit/auth-token/dist-web/index.js.map
generated
vendored
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"index.js","sources":["../dist-src/auth.js","../dist-src/with-authorization-prefix.js","../dist-src/hook.js","../dist-src/index.js"],"sourcesContent":["export async function auth(token) {\n const tokenType = token.split(/\\./).length === 3\n ? \"app\"\n : /^v\\d+\\./.test(token)\n ? \"installation\"\n : \"oauth\";\n return {\n type: \"token\",\n token: token,\n tokenType\n };\n}\n","/**\n * Prefix token for usage in the Authorization header\n *\n * @param token OAuth token or JSON Web Token\n */\nexport function withAuthorizationPrefix(token) {\n if (token.split(/\\./).length === 3) {\n return `bearer ${token}`;\n }\n return `token ${token}`;\n}\n","import { withAuthorizationPrefix } from \"./with-authorization-prefix\";\nexport async function hook(token, request, route, parameters) {\n const endpoint = request.endpoint.merge(route, parameters);\n endpoint.headers.authorization = withAuthorizationPrefix(token);\n return request(endpoint);\n}\n","import { auth } from \"./auth\";\nimport { hook } from \"./hook\";\nexport const createTokenAuth = function createTokenAuth(token) {\n if (!token) {\n throw new Error(\"[@octokit/auth-token] No token passed to createTokenAuth\");\n }\n if (typeof token !== \"string\") {\n throw new Error(\"[@octokit/auth-token] Token passed to createTokenAuth is not a string\");\n }\n token = token.replace(/^(token|bearer) +/i, \"\");\n return Object.assign(auth.bind(null, token), {\n hook: hook.bind(null, token)\n });\n};\n"],"names":[],"mappings":"AAAO,eAAe,IAAI,CAAC,KAAK,EAAE;IAC9B,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC;UAC1C,KAAK;UACL,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC;cACjB,cAAc;cACd,OAAO,CAAC;IAClB,OAAO;QACH,IAAI,EAAE,OAAO;QACb,KAAK,EAAE,KAAK;QACZ,SAAS;KACZ,CAAC;CACL;;ACXD;;;;;AAKA,AAAO,SAAS,uBAAuB,CAAC,KAAK,EAAE;IAC3C,IAAI,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE;QAChC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;KAC5B;IACD,OAAO,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC;CAC3B;;ACTM,eAAe,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,UAAU,EAAE;IAC1D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,EAAE,UAAU,CAAC,CAAC;IAC3D,QAAQ,CAAC,OAAO,CAAC,aAAa,GAAG,uBAAuB,CAAC,KAAK,CAAC,CAAC;IAChE,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC;CAC5B;;ACHW,MAAC,eAAe,GAAG,SAAS,eAAe,CAAC,KAAK,EAAE;IAC3D,IAAI,CAAC,KAAK,EAAE;QACR,MAAM,IAAI,KAAK,CAAC,0DAA0D,CAAC,CAAC;KAC/E;IACD,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE;QAC3B,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;KAC5F;IACD,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IAChD,OAAO,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE;QACzC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC;KAC/B,CAAC,CAAC;CACN;;;;"}
|
|
||||||
76
node_modules/@octokit/auth-token/package.json
generated
vendored
76
node_modules/@octokit/auth-token/package.json
generated
vendored
@@ -1,76 +0,0 @@
|
|||||||
{
|
|
||||||
"_from": "@octokit/auth-token@^2.4.0",
|
|
||||||
"_id": "@octokit/auth-token@2.4.0",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha512-eoOVMjILna7FVQf96iWc3+ZtE/ZT6y8ob8ZzcqKY1ibSQCnu4O/B7pJvzMx5cyZ/RjAff6DAdEb0O0Cjcxidkg==",
|
|
||||||
"_location": "/@octokit/auth-token",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "range",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "@octokit/auth-token@^2.4.0",
|
|
||||||
"name": "@octokit/auth-token",
|
|
||||||
"escapedName": "@octokit%2fauth-token",
|
|
||||||
"scope": "@octokit",
|
|
||||||
"rawSpec": "^2.4.0",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "^2.4.0"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"/@octokit/rest"
|
|
||||||
],
|
|
||||||
"_resolved": "https://registry.npmjs.org/@octokit/auth-token/-/auth-token-2.4.0.tgz",
|
|
||||||
"_shasum": "b64178975218b99e4dfe948253f0673cbbb59d9f",
|
|
||||||
"_spec": "@octokit/auth-token@^2.4.0",
|
|
||||||
"_where": "/Users/bret/repos/deploy-to-neocities/node_modules/@octokit/rest",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/octokit/auth-token.js/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/types": "^2.0.0"
|
|
||||||
},
|
|
||||||
"deprecated": false,
|
|
||||||
"description": "GitHub API token authentication for browsers and Node.js",
|
|
||||||
"devDependencies": {
|
|
||||||
"@octokit/request": "^5.3.0",
|
|
||||||
"@pika/pack": "^0.5.0",
|
|
||||||
"@pika/plugin-build-node": "^0.7.0",
|
|
||||||
"@pika/plugin-build-web": "^0.7.0",
|
|
||||||
"@pika/plugin-ts-standard-pkg": "^0.7.0",
|
|
||||||
"@types/fetch-mock": "^7.3.1",
|
|
||||||
"@types/jest": "^24.0.13",
|
|
||||||
"fetch-mock": "^7.3.7",
|
|
||||||
"jest": "^24.8.0",
|
|
||||||
"semantic-release": "^15.13.12",
|
|
||||||
"ts-jest": "^24.0.2",
|
|
||||||
"typescript": "^3.5.1"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"dist-*/",
|
|
||||||
"bin/"
|
|
||||||
],
|
|
||||||
"homepage": "https://github.com/octokit/auth-token.js#readme",
|
|
||||||
"keywords": [
|
|
||||||
"github",
|
|
||||||
"octokit",
|
|
||||||
"authentication",
|
|
||||||
"api"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"main": "dist-node/index.js",
|
|
||||||
"module": "dist-web/index.js",
|
|
||||||
"name": "@octokit/auth-token",
|
|
||||||
"pika": true,
|
|
||||||
"publishConfig": {
|
|
||||||
"access": "public"
|
|
||||||
},
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/octokit/auth-token.js.git"
|
|
||||||
},
|
|
||||||
"sideEffects": false,
|
|
||||||
"source": "dist-src/index.js",
|
|
||||||
"types": "dist-types/index.d.ts",
|
|
||||||
"version": "2.4.0"
|
|
||||||
}
|
|
||||||
21
node_modules/@octokit/endpoint/LICENSE
generated
vendored
21
node_modules/@octokit/endpoint/LICENSE
generated
vendored
@@ -1,21 +0,0 @@
|
|||||||
The MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2018 Octokit contributors
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
421
node_modules/@octokit/endpoint/README.md
generated
vendored
421
node_modules/@octokit/endpoint/README.md
generated
vendored
@@ -1,421 +0,0 @@
|
|||||||
# endpoint.js
|
|
||||||
|
|
||||||
> Turns GitHub REST API endpoints into generic request options
|
|
||||||
|
|
||||||
[](https://www.npmjs.com/package/@octokit/endpoint)
|
|
||||||

|
|
||||||
[](https://greenkeeper.io/)
|
|
||||||
|
|
||||||
`@octokit/endpoint` combines [GitHub REST API routes](https://developer.github.com/v3/) with your parameters and turns them into generic request options that can be used in any request library.
|
|
||||||
|
|
||||||
<!-- update table of contents by running `npx markdown-toc README.md -i` -->
|
|
||||||
<!-- toc -->
|
|
||||||
|
|
||||||
- [Usage](#usage)
|
|
||||||
- [API](#api)
|
|
||||||
- [endpoint()](#endpointroute-options-or-endpointoptions)
|
|
||||||
- [endpoint.defaults()](#endpointdefaults)
|
|
||||||
- [endpoint.DEFAULTS](#endpointdefaults-1)
|
|
||||||
- [endpoint.merge()](#endpointmergeroute-options-or-endpointmergeoptions)
|
|
||||||
- [endpoint.parse()](#endpointparse)
|
|
||||||
- [Special cases](#special-cases)
|
|
||||||
- [The `data` parameter – set request body directly](#the-data-parameter--set-request-body-directly)
|
|
||||||
- [Set parameters for both the URL/query and the request body](#set-parameters-for-both-the-urlquery-and-the-request-body)
|
|
||||||
- [LICENSE](#license)
|
|
||||||
|
|
||||||
<!-- tocstop -->
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
<table>
|
|
||||||
<tbody valign=top align=left>
|
|
||||||
<tr><th>
|
|
||||||
Browsers
|
|
||||||
</th><td width=100%>
|
|
||||||
Load <code>@octokit/endpoint</code> directly from <a href="https://cdn.pika.dev">cdn.pika.dev</a>
|
|
||||||
|
|
||||||
```html
|
|
||||||
<script type="module">
|
|
||||||
import { endpoint } from "https://cdn.pika.dev/@octokit/endpoint";
|
|
||||||
</script>
|
|
||||||
```
|
|
||||||
|
|
||||||
</td></tr>
|
|
||||||
<tr><th>
|
|
||||||
Node
|
|
||||||
</th><td>
|
|
||||||
|
|
||||||
Install with <code>npm install @octokit/endpoint</code>
|
|
||||||
|
|
||||||
```js
|
|
||||||
const { endpoint } = require("@octokit/endpoint");
|
|
||||||
// or: import { endpoint } from "@octokit/endpoint";
|
|
||||||
```
|
|
||||||
|
|
||||||
</td></tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
Example for [List organization repositories](https://developer.github.com/v3/repos/#list-organization-repositories)
|
|
||||||
|
|
||||||
```js
|
|
||||||
const requestOptions = endpoint("GET /orgs/:org/repos", {
|
|
||||||
headers: {
|
|
||||||
authorization: "token 0000000000000000000000000000000000000001"
|
|
||||||
},
|
|
||||||
org: "octokit",
|
|
||||||
type: "private"
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
The resulting `requestOptions` looks as follows
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"method": "GET",
|
|
||||||
"url": "https://api.github.com/orgs/octokit/repos?type=private",
|
|
||||||
"headers": {
|
|
||||||
"accept": "application/vnd.github.v3+json",
|
|
||||||
"authorization": "token 0000000000000000000000000000000000000001",
|
|
||||||
"user-agent": "octokit/endpoint.js v1.2.3"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
You can pass `requestOptions` to common request libraries
|
|
||||||
|
|
||||||
```js
|
|
||||||
const { url, ...options } = requestOptions;
|
|
||||||
// using with fetch (https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API)
|
|
||||||
fetch(url, options);
|
|
||||||
// using with request (https://github.com/request/request)
|
|
||||||
request(requestOptions);
|
|
||||||
// using with got (https://github.com/sindresorhus/got)
|
|
||||||
got[options.method](url, options);
|
|
||||||
// using with axios
|
|
||||||
axios(requestOptions);
|
|
||||||
```
|
|
||||||
|
|
||||||
## API
|
|
||||||
|
|
||||||
### `endpoint(route, options)` or `endpoint(options)`
|
|
||||||
|
|
||||||
<table>
|
|
||||||
<thead align=left>
|
|
||||||
<tr>
|
|
||||||
<th>
|
|
||||||
name
|
|
||||||
</th>
|
|
||||||
<th>
|
|
||||||
type
|
|
||||||
</th>
|
|
||||||
<th width=100%>
|
|
||||||
description
|
|
||||||
</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody align=left valign=top>
|
|
||||||
<tr>
|
|
||||||
<th>
|
|
||||||
<code>route</code>
|
|
||||||
</th>
|
|
||||||
<td>
|
|
||||||
String
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
If set, it has to be a string consisting of URL and the request method, e.g., <code>GET /orgs/:org</code>. If it’s set to a URL, only the method defaults to <code>GET</code>.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th>
|
|
||||||
<code>options.method</code>
|
|
||||||
</th>
|
|
||||||
<td>
|
|
||||||
String
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<strong>Required unless <code>route</code> is set.</strong> Any supported <a href="https://developer.github.com/v3/#http-verbs">http verb</a>. <em>Defaults to <code>GET</code></em>.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th>
|
|
||||||
<code>options.url</code>
|
|
||||||
</th>
|
|
||||||
<td>
|
|
||||||
String
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<strong>Required unless <code>route</code> is set.</strong> A path or full URL which may contain <code>:variable</code> or <code>{variable}</code> placeholders,
|
|
||||||
e.g., <code>/orgs/:org/repos</code>. The <code>url</code> is parsed using <a href="https://github.com/bramstein/url-template">url-template</a>.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th>
|
|
||||||
<code>options.baseUrl</code>
|
|
||||||
</th>
|
|
||||||
<td>
|
|
||||||
String
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
<em>Defaults to <code>https://api.github.com</code></em>.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th>
|
|
||||||
<code>options.headers</code>
|
|
||||||
</th>
|
|
||||||
<td>
|
|
||||||
Object
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
Custom headers. Passed headers are merged with defaults:<br>
|
|
||||||
<em><code>headers['user-agent']</code> defaults to <code>octokit-endpoint.js/1.2.3</code> (where <code>1.2.3</code> is the released version)</em>.<br>
|
|
||||||
<em><code>headers['accept']</code> defaults to <code>application/vnd.github.v3+json</code></em>.<br>
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th>
|
|
||||||
<code>options.mediaType.format</code>
|
|
||||||
</th>
|
|
||||||
<td>
|
|
||||||
String
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
Media type param, such as <code>raw</code>, <code>diff</code>, or <code>text+json</code>. See <a href="https://developer.github.com/v3/media/">Media Types</a>. Setting <code>options.mediaType.format</code> will amend the <code>headers.accept</code> value.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th>
|
|
||||||
<code>options.mediaType.previews</code>
|
|
||||||
</th>
|
|
||||||
<td>
|
|
||||||
Array of Strings
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
Name of previews, such as <code>mercy</code>, <code>symmetra</code>, or <code>scarlet-witch</code>. See <a href="https://developer.github.com/v3/previews/">API Previews</a>. If <code>options.mediaType.previews</code> was set as default, the new previews will be merged into the default ones. Setting <code>options.mediaType.previews</code> will amend the <code>headers.accept</code> value. <code>options.mediaType.previews</code> will be merged with an existing array set using <code>.defaults()</code>.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th>
|
|
||||||
<code>options.data</code>
|
|
||||||
</th>
|
|
||||||
<td>
|
|
||||||
Any
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
Set request body directly instead of setting it to JSON based on additional parameters. See <a href="#data-parameter">"The <code>data</code> parameter"</a> below.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th>
|
|
||||||
<code>options.request</code>
|
|
||||||
</th>
|
|
||||||
<td>
|
|
||||||
Object
|
|
||||||
</td>
|
|
||||||
<td>
|
|
||||||
Pass custom meta information for the request. The <code>request</code> object will be returned as is.
|
|
||||||
</td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
All other options will be passed depending on the `method` and `url` options.
|
|
||||||
|
|
||||||
1. If the option key has a placeholder in the `url`, it will be used as the replacement. For example, if the passed options are `{url: '/orgs/:org/repos', org: 'foo'}` the returned `options.url` is `https://api.github.com/orgs/foo/repos`.
|
|
||||||
2. If the `method` is `GET` or `HEAD`, the option is passed as a query parameter.
|
|
||||||
3. Otherwise, the parameter is passed in the request body as a JSON key.
|
|
||||||
|
|
||||||
**Result**
|
|
||||||
|
|
||||||
`endpoint()` is a synchronous method and returns an object with the following keys:
|
|
||||||
|
|
||||||
<table>
|
|
||||||
<thead align=left>
|
|
||||||
<tr>
|
|
||||||
<th>
|
|
||||||
key
|
|
||||||
</th>
|
|
||||||
<th>
|
|
||||||
type
|
|
||||||
</th>
|
|
||||||
<th width=100%>
|
|
||||||
description
|
|
||||||
</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody align=left valign=top>
|
|
||||||
<tr>
|
|
||||||
<th><code>method</code></th>
|
|
||||||
<td>String</td>
|
|
||||||
<td>The http method. Always lowercase.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th><code>url</code></th>
|
|
||||||
<td>String</td>
|
|
||||||
<td>The url with placeholders replaced with passed parameters.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th><code>headers</code></th>
|
|
||||||
<td>Object</td>
|
|
||||||
<td>All header names are lowercased.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th><code>body</code></th>
|
|
||||||
<td>Any</td>
|
|
||||||
<td>The request body if one is present. Only for <code>PATCH</code>, <code>POST</code>, <code>PUT</code>, <code>DELETE</code> requests.</td>
|
|
||||||
</tr>
|
|
||||||
<tr>
|
|
||||||
<th><code>request</code></th>
|
|
||||||
<td>Object</td>
|
|
||||||
<td>Request meta option, it will be returned as it was passed into <code>endpoint()</code></td>
|
|
||||||
</tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
### `endpoint.defaults()`
|
|
||||||
|
|
||||||
Override or set default options. Example:
|
|
||||||
|
|
||||||
```js
|
|
||||||
const request = require("request");
|
|
||||||
const myEndpoint = require("@octokit/endpoint").defaults({
|
|
||||||
baseUrl: "https://github-enterprise.acme-inc.com/api/v3",
|
|
||||||
headers: {
|
|
||||||
"user-agent": "myApp/1.2.3",
|
|
||||||
authorization: `token 0000000000000000000000000000000000000001`
|
|
||||||
},
|
|
||||||
org: "my-project",
|
|
||||||
per_page: 100
|
|
||||||
});
|
|
||||||
|
|
||||||
request(myEndpoint(`GET /orgs/:org/repos`));
|
|
||||||
```
|
|
||||||
|
|
||||||
You can call `.defaults()` again on the returned method, the defaults will cascade.
|
|
||||||
|
|
||||||
```js
|
|
||||||
const myProjectEndpoint = endpoint.defaults({
|
|
||||||
baseUrl: "https://github-enterprise.acme-inc.com/api/v3",
|
|
||||||
headers: {
|
|
||||||
"user-agent": "myApp/1.2.3"
|
|
||||||
},
|
|
||||||
org: "my-project"
|
|
||||||
});
|
|
||||||
const myProjectEndpointWithAuth = myProjectEndpoint.defaults({
|
|
||||||
headers: {
|
|
||||||
authorization: `token 0000000000000000000000000000000000000001`
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
`myProjectEndpointWithAuth` now defaults the `baseUrl`, `headers['user-agent']`,
|
|
||||||
`org` and `headers['authorization']` on top of `headers['accept']` that is set
|
|
||||||
by the global default.
|
|
||||||
|
|
||||||
### `endpoint.DEFAULTS`
|
|
||||||
|
|
||||||
The current default options.
|
|
||||||
|
|
||||||
```js
|
|
||||||
endpoint.DEFAULTS.baseUrl; // https://api.github.com
|
|
||||||
const myEndpoint = endpoint.defaults({
|
|
||||||
baseUrl: "https://github-enterprise.acme-inc.com/api/v3"
|
|
||||||
});
|
|
||||||
myEndpoint.DEFAULTS.baseUrl; // https://github-enterprise.acme-inc.com/api/v3
|
|
||||||
```
|
|
||||||
|
|
||||||
### `endpoint.merge(route, options)` or `endpoint.merge(options)`
|
|
||||||
|
|
||||||
Get the defaulted endpoint options, but without parsing them into request options:
|
|
||||||
|
|
||||||
```js
|
|
||||||
const myProjectEndpoint = endpoint.defaults({
|
|
||||||
baseUrl: "https://github-enterprise.acme-inc.com/api/v3",
|
|
||||||
headers: {
|
|
||||||
"user-agent": "myApp/1.2.3"
|
|
||||||
},
|
|
||||||
org: "my-project"
|
|
||||||
});
|
|
||||||
myProjectEndpoint.merge("GET /orgs/:org/repos", {
|
|
||||||
headers: {
|
|
||||||
authorization: `token 0000000000000000000000000000000000000001`
|
|
||||||
},
|
|
||||||
org: "my-secret-project",
|
|
||||||
type: "private"
|
|
||||||
});
|
|
||||||
|
|
||||||
// {
|
|
||||||
// baseUrl: 'https://github-enterprise.acme-inc.com/api/v3',
|
|
||||||
// method: 'GET',
|
|
||||||
// url: '/orgs/:org/repos',
|
|
||||||
// headers: {
|
|
||||||
// accept: 'application/vnd.github.v3+json',
|
|
||||||
// authorization: `token 0000000000000000000000000000000000000001`,
|
|
||||||
// 'user-agent': 'myApp/1.2.3'
|
|
||||||
// },
|
|
||||||
// org: 'my-secret-project',
|
|
||||||
// type: 'private'
|
|
||||||
// }
|
|
||||||
```
|
|
||||||
|
|
||||||
### `endpoint.parse()`
|
|
||||||
|
|
||||||
Stateless method to turn endpoint options into request options. Calling
|
|
||||||
`endpoint(options)` is the same as calling `endpoint.parse(endpoint.merge(options))`.
|
|
||||||
|
|
||||||
## Special cases
|
|
||||||
|
|
||||||
<a name="data-parameter"></a>
|
|
||||||
|
|
||||||
### The `data` parameter – set request body directly
|
|
||||||
|
|
||||||
Some endpoints such as [Render a Markdown document in raw mode](https://developer.github.com/v3/markdown/#render-a-markdown-document-in-raw-mode) don’t have parameters that are sent as request body keys, instead, the request body needs to be set directly. In these cases, set the `data` parameter.
|
|
||||||
|
|
||||||
```js
|
|
||||||
const options = endpoint("POST /markdown/raw", {
|
|
||||||
data: "Hello world github/linguist#1 **cool**, and #1!",
|
|
||||||
headers: {
|
|
||||||
accept: "text/html;charset=utf-8",
|
|
||||||
"content-type": "text/plain"
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
// options is
|
|
||||||
// {
|
|
||||||
// method: 'post',
|
|
||||||
// url: 'https://api.github.com/markdown/raw',
|
|
||||||
// headers: {
|
|
||||||
// accept: 'text/html;charset=utf-8',
|
|
||||||
// 'content-type': 'text/plain',
|
|
||||||
// 'user-agent': userAgent
|
|
||||||
// },
|
|
||||||
// body: 'Hello world github/linguist#1 **cool**, and #1!'
|
|
||||||
// }
|
|
||||||
```
|
|
||||||
|
|
||||||
### Set parameters for both the URL/query and the request body
|
|
||||||
|
|
||||||
There are API endpoints that accept both query parameters as well as a body. In that case, you need to add the query parameters as templates to `options.url`, as defined in the [RFC 6570 URI Template specification](https://tools.ietf.org/html/rfc6570).
|
|
||||||
|
|
||||||
Example
|
|
||||||
|
|
||||||
```js
|
|
||||||
endpoint(
|
|
||||||
"POST https://uploads.github.com/repos/octocat/Hello-World/releases/1/assets{?name,label}",
|
|
||||||
{
|
|
||||||
name: "example.zip",
|
|
||||||
label: "short description",
|
|
||||||
headers: {
|
|
||||||
"content-type": "text/plain",
|
|
||||||
"content-length": 14,
|
|
||||||
authorization: `token 0000000000000000000000000000000000000001`
|
|
||||||
},
|
|
||||||
data: "Hello, world!"
|
|
||||||
}
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
## LICENSE
|
|
||||||
|
|
||||||
[MIT](LICENSE)
|
|
||||||
379
node_modules/@octokit/endpoint/dist-node/index.js
generated
vendored
379
node_modules/@octokit/endpoint/dist-node/index.js
generated
vendored
@@ -1,379 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
Object.defineProperty(exports, '__esModule', { value: true });
|
|
||||||
|
|
||||||
function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'default' in ex) ? ex['default'] : ex; }
|
|
||||||
|
|
||||||
var isPlainObject = _interopDefault(require('is-plain-object'));
|
|
||||||
var universalUserAgent = require('universal-user-agent');
|
|
||||||
|
|
||||||
function lowercaseKeys(object) {
|
|
||||||
if (!object) {
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
|
|
||||||
return Object.keys(object).reduce((newObj, key) => {
|
|
||||||
newObj[key.toLowerCase()] = object[key];
|
|
||||||
return newObj;
|
|
||||||
}, {});
|
|
||||||
}
|
|
||||||
|
|
||||||
function mergeDeep(defaults, options) {
|
|
||||||
const result = Object.assign({}, defaults);
|
|
||||||
Object.keys(options).forEach(key => {
|
|
||||||
if (isPlainObject(options[key])) {
|
|
||||||
if (!(key in defaults)) Object.assign(result, {
|
|
||||||
[key]: options[key]
|
|
||||||
});else result[key] = mergeDeep(defaults[key], options[key]);
|
|
||||||
} else {
|
|
||||||
Object.assign(result, {
|
|
||||||
[key]: options[key]
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function merge(defaults, route, options) {
|
|
||||||
if (typeof route === "string") {
|
|
||||||
let [method, url] = route.split(" ");
|
|
||||||
options = Object.assign(url ? {
|
|
||||||
method,
|
|
||||||
url
|
|
||||||
} : {
|
|
||||||
url: method
|
|
||||||
}, options);
|
|
||||||
} else {
|
|
||||||
options = Object.assign({}, route);
|
|
||||||
} // lowercase header names before merging with defaults to avoid duplicates
|
|
||||||
|
|
||||||
|
|
||||||
options.headers = lowercaseKeys(options.headers);
|
|
||||||
const mergedOptions = mergeDeep(defaults || {}, options); // mediaType.previews arrays are merged, instead of overwritten
|
|
||||||
|
|
||||||
if (defaults && defaults.mediaType.previews.length) {
|
|
||||||
mergedOptions.mediaType.previews = defaults.mediaType.previews.filter(preview => !mergedOptions.mediaType.previews.includes(preview)).concat(mergedOptions.mediaType.previews);
|
|
||||||
}
|
|
||||||
|
|
||||||
mergedOptions.mediaType.previews = mergedOptions.mediaType.previews.map(preview => preview.replace(/-preview/, ""));
|
|
||||||
return mergedOptions;
|
|
||||||
}
|
|
||||||
|
|
||||||
function addQueryParameters(url, parameters) {
|
|
||||||
const separator = /\?/.test(url) ? "&" : "?";
|
|
||||||
const names = Object.keys(parameters);
|
|
||||||
|
|
||||||
if (names.length === 0) {
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
|
|
||||||
return url + separator + names.map(name => {
|
|
||||||
if (name === "q") {
|
|
||||||
return "q=" + parameters.q.split("+").map(encodeURIComponent).join("+");
|
|
||||||
}
|
|
||||||
|
|
||||||
return `${name}=${encodeURIComponent(parameters[name])}`;
|
|
||||||
}).join("&");
|
|
||||||
}
|
|
||||||
|
|
||||||
const urlVariableRegex = /\{[^}]+\}/g;
|
|
||||||
|
|
||||||
function removeNonChars(variableName) {
|
|
||||||
return variableName.replace(/^\W+|\W+$/g, "").split(/,/);
|
|
||||||
}
|
|
||||||
|
|
||||||
function extractUrlVariableNames(url) {
|
|
||||||
const matches = url.match(urlVariableRegex);
|
|
||||||
|
|
||||||
if (!matches) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
|
|
||||||
return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []);
|
|
||||||
}
|
|
||||||
|
|
||||||
function omit(object, keysToOmit) {
|
|
||||||
return Object.keys(object).filter(option => !keysToOmit.includes(option)).reduce((obj, key) => {
|
|
||||||
obj[key] = object[key];
|
|
||||||
return obj;
|
|
||||||
}, {});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Based on https://github.com/bramstein/url-template, licensed under BSD
|
|
||||||
// TODO: create separate package.
|
|
||||||
//
|
|
||||||
// Copyright (c) 2012-2014, Bram Stein
|
|
||||||
// All rights reserved.
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
// 1. Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer in the
|
|
||||||
// documentation and/or other materials provided with the distribution.
|
|
||||||
// 3. The name of the author may not be used to endorse or promote products
|
|
||||||
// derived from this software without specific prior written permission.
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
|
|
||||||
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
||||||
// EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
|
||||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
|
||||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
||||||
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
|
|
||||||
/* istanbul ignore file */
|
|
||||||
function encodeReserved(str) {
|
|
||||||
return str.split(/(%[0-9A-Fa-f]{2})/g).map(function (part) {
|
|
||||||
if (!/%[0-9A-Fa-f]/.test(part)) {
|
|
||||||
part = encodeURI(part).replace(/%5B/g, "[").replace(/%5D/g, "]");
|
|
||||||
}
|
|
||||||
|
|
||||||
return part;
|
|
||||||
}).join("");
|
|
||||||
}
|
|
||||||
|
|
||||||
function encodeUnreserved(str) {
|
|
||||||
return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {
|
|
||||||
return "%" + c.charCodeAt(0).toString(16).toUpperCase();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function encodeValue(operator, value, key) {
|
|
||||||
value = operator === "+" || operator === "#" ? encodeReserved(value) : encodeUnreserved(value);
|
|
||||||
|
|
||||||
if (key) {
|
|
||||||
return encodeUnreserved(key) + "=" + value;
|
|
||||||
} else {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function isDefined(value) {
|
|
||||||
return value !== undefined && value !== null;
|
|
||||||
}
|
|
||||||
|
|
||||||
function isKeyOperator(operator) {
|
|
||||||
return operator === ";" || operator === "&" || operator === "?";
|
|
||||||
}
|
|
||||||
|
|
||||||
function getValues(context, operator, key, modifier) {
|
|
||||||
var value = context[key],
|
|
||||||
result = [];
|
|
||||||
|
|
||||||
if (isDefined(value) && value !== "") {
|
|
||||||
if (typeof value === "string" || typeof value === "number" || typeof value === "boolean") {
|
|
||||||
value = value.toString();
|
|
||||||
|
|
||||||
if (modifier && modifier !== "*") {
|
|
||||||
value = value.substring(0, parseInt(modifier, 10));
|
|
||||||
}
|
|
||||||
|
|
||||||
result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : ""));
|
|
||||||
} else {
|
|
||||||
if (modifier === "*") {
|
|
||||||
if (Array.isArray(value)) {
|
|
||||||
value.filter(isDefined).forEach(function (value) {
|
|
||||||
result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : ""));
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
Object.keys(value).forEach(function (k) {
|
|
||||||
if (isDefined(value[k])) {
|
|
||||||
result.push(encodeValue(operator, value[k], k));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
const tmp = [];
|
|
||||||
|
|
||||||
if (Array.isArray(value)) {
|
|
||||||
value.filter(isDefined).forEach(function (value) {
|
|
||||||
tmp.push(encodeValue(operator, value));
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
Object.keys(value).forEach(function (k) {
|
|
||||||
if (isDefined(value[k])) {
|
|
||||||
tmp.push(encodeUnreserved(k));
|
|
||||||
tmp.push(encodeValue(operator, value[k].toString()));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isKeyOperator(operator)) {
|
|
||||||
result.push(encodeUnreserved(key) + "=" + tmp.join(","));
|
|
||||||
} else if (tmp.length !== 0) {
|
|
||||||
result.push(tmp.join(","));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (operator === ";") {
|
|
||||||
if (isDefined(value)) {
|
|
||||||
result.push(encodeUnreserved(key));
|
|
||||||
}
|
|
||||||
} else if (value === "" && (operator === "&" || operator === "?")) {
|
|
||||||
result.push(encodeUnreserved(key) + "=");
|
|
||||||
} else if (value === "") {
|
|
||||||
result.push("");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function parseUrl(template) {
|
|
||||||
return {
|
|
||||||
expand: expand.bind(null, template)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function expand(template, context) {
|
|
||||||
var operators = ["+", "#", ".", "/", ";", "?", "&"];
|
|
||||||
return template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, function (_, expression, literal) {
|
|
||||||
if (expression) {
|
|
||||||
let operator = "";
|
|
||||||
const values = [];
|
|
||||||
|
|
||||||
if (operators.indexOf(expression.charAt(0)) !== -1) {
|
|
||||||
operator = expression.charAt(0);
|
|
||||||
expression = expression.substr(1);
|
|
||||||
}
|
|
||||||
|
|
||||||
expression.split(/,/g).forEach(function (variable) {
|
|
||||||
var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable);
|
|
||||||
values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3]));
|
|
||||||
});
|
|
||||||
|
|
||||||
if (operator && operator !== "+") {
|
|
||||||
var separator = ",";
|
|
||||||
|
|
||||||
if (operator === "?") {
|
|
||||||
separator = "&";
|
|
||||||
} else if (operator !== "#") {
|
|
||||||
separator = operator;
|
|
||||||
}
|
|
||||||
|
|
||||||
return (values.length !== 0 ? operator : "") + values.join(separator);
|
|
||||||
} else {
|
|
||||||
return values.join(",");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
return encodeReserved(literal);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function parse(options) {
|
|
||||||
// https://fetch.spec.whatwg.org/#methods
|
|
||||||
let method = options.method.toUpperCase(); // replace :varname with {varname} to make it RFC 6570 compatible
|
|
||||||
|
|
||||||
let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{+$1}");
|
|
||||||
let headers = Object.assign({}, options.headers);
|
|
||||||
let body;
|
|
||||||
let parameters = omit(options, ["method", "baseUrl", "url", "headers", "request", "mediaType"]); // extract variable names from URL to calculate remaining variables later
|
|
||||||
|
|
||||||
const urlVariableNames = extractUrlVariableNames(url);
|
|
||||||
url = parseUrl(url).expand(parameters);
|
|
||||||
|
|
||||||
if (!/^http/.test(url)) {
|
|
||||||
url = options.baseUrl + url;
|
|
||||||
}
|
|
||||||
|
|
||||||
const omittedParameters = Object.keys(options).filter(option => urlVariableNames.includes(option)).concat("baseUrl");
|
|
||||||
const remainingParameters = omit(parameters, omittedParameters);
|
|
||||||
const isBinaryRequset = /application\/octet-stream/i.test(headers.accept);
|
|
||||||
|
|
||||||
if (!isBinaryRequset) {
|
|
||||||
if (options.mediaType.format) {
|
|
||||||
// e.g. application/vnd.github.v3+json => application/vnd.github.v3.raw
|
|
||||||
headers.accept = headers.accept.split(/,/).map(preview => preview.replace(/application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, `application/vnd$1$2.${options.mediaType.format}`)).join(",");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (options.mediaType.previews.length) {
|
|
||||||
const previewsFromAcceptHeader = headers.accept.match(/[\w-]+(?=-preview)/g) || [];
|
|
||||||
headers.accept = previewsFromAcceptHeader.concat(options.mediaType.previews).map(preview => {
|
|
||||||
const format = options.mediaType.format ? `.${options.mediaType.format}` : "+json";
|
|
||||||
return `application/vnd.github.${preview}-preview${format}`;
|
|
||||||
}).join(",");
|
|
||||||
}
|
|
||||||
} // for GET/HEAD requests, set URL query parameters from remaining parameters
|
|
||||||
// for PATCH/POST/PUT/DELETE requests, set request body from remaining parameters
|
|
||||||
|
|
||||||
|
|
||||||
if (["GET", "HEAD"].includes(method)) {
|
|
||||||
url = addQueryParameters(url, remainingParameters);
|
|
||||||
} else {
|
|
||||||
if ("data" in remainingParameters) {
|
|
||||||
body = remainingParameters.data;
|
|
||||||
} else {
|
|
||||||
if (Object.keys(remainingParameters).length) {
|
|
||||||
body = remainingParameters;
|
|
||||||
} else {
|
|
||||||
headers["content-length"] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
} // default content-type for JSON if body is set
|
|
||||||
|
|
||||||
|
|
||||||
if (!headers["content-type"] && typeof body !== "undefined") {
|
|
||||||
headers["content-type"] = "application/json; charset=utf-8";
|
|
||||||
} // GitHub expects 'content-length: 0' header for PUT/PATCH requests without body.
|
|
||||||
// fetch does not allow to set `content-length` header, but we can set body to an empty string
|
|
||||||
|
|
||||||
|
|
||||||
if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") {
|
|
||||||
body = "";
|
|
||||||
} // Only return body/request keys if present
|
|
||||||
|
|
||||||
|
|
||||||
return Object.assign({
|
|
||||||
method,
|
|
||||||
url,
|
|
||||||
headers
|
|
||||||
}, typeof body !== "undefined" ? {
|
|
||||||
body
|
|
||||||
} : null, options.request ? {
|
|
||||||
request: options.request
|
|
||||||
} : null);
|
|
||||||
}
|
|
||||||
|
|
||||||
function endpointWithDefaults(defaults, route, options) {
|
|
||||||
return parse(merge(defaults, route, options));
|
|
||||||
}
|
|
||||||
|
|
||||||
function withDefaults(oldDefaults, newDefaults) {
|
|
||||||
const DEFAULTS = merge(oldDefaults, newDefaults);
|
|
||||||
const endpoint = endpointWithDefaults.bind(null, DEFAULTS);
|
|
||||||
return Object.assign(endpoint, {
|
|
||||||
DEFAULTS,
|
|
||||||
defaults: withDefaults.bind(null, DEFAULTS),
|
|
||||||
merge: merge.bind(null, DEFAULTS),
|
|
||||||
parse
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const VERSION = "5.5.2";
|
|
||||||
|
|
||||||
const userAgent = `octokit-endpoint.js/${VERSION} ${universalUserAgent.getUserAgent()}`; // DEFAULTS has all properties set that EndpointOptions has, except url.
|
|
||||||
// So we use RequestParameters and add method as additional required property.
|
|
||||||
|
|
||||||
const DEFAULTS = {
|
|
||||||
method: "GET",
|
|
||||||
baseUrl: "https://api.github.com",
|
|
||||||
headers: {
|
|
||||||
accept: "application/vnd.github.v3+json",
|
|
||||||
"user-agent": userAgent
|
|
||||||
},
|
|
||||||
mediaType: {
|
|
||||||
format: "",
|
|
||||||
previews: []
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const endpoint = withDefaults(null, DEFAULTS);
|
|
||||||
|
|
||||||
exports.endpoint = endpoint;
|
|
||||||
//# sourceMappingURL=index.js.map
|
|
||||||
1
node_modules/@octokit/endpoint/dist-node/index.js.map
generated
vendored
1
node_modules/@octokit/endpoint/dist-node/index.js.map
generated
vendored
File diff suppressed because one or more lines are too long
17
node_modules/@octokit/endpoint/dist-src/defaults.js
generated
vendored
17
node_modules/@octokit/endpoint/dist-src/defaults.js
generated
vendored
@@ -1,17 +0,0 @@
|
|||||||
import { getUserAgent } from "universal-user-agent";
|
|
||||||
import { VERSION } from "./version";
|
|
||||||
const userAgent = `octokit-endpoint.js/${VERSION} ${getUserAgent()}`;
|
|
||||||
// DEFAULTS has all properties set that EndpointOptions has, except url.
|
|
||||||
// So we use RequestParameters and add method as additional required property.
|
|
||||||
export const DEFAULTS = {
|
|
||||||
method: "GET",
|
|
||||||
baseUrl: "https://api.github.com",
|
|
||||||
headers: {
|
|
||||||
accept: "application/vnd.github.v3+json",
|
|
||||||
"user-agent": userAgent
|
|
||||||
},
|
|
||||||
mediaType: {
|
|
||||||
format: "",
|
|
||||||
previews: []
|
|
||||||
}
|
|
||||||
};
|
|
||||||
5
node_modules/@octokit/endpoint/dist-src/endpoint-with-defaults.js
generated
vendored
5
node_modules/@octokit/endpoint/dist-src/endpoint-with-defaults.js
generated
vendored
@@ -1,5 +0,0 @@
|
|||||||
import { merge } from "./merge";
|
|
||||||
import { parse } from "./parse";
|
|
||||||
export function endpointWithDefaults(defaults, route, options) {
|
|
||||||
return parse(merge(defaults, route, options));
|
|
||||||
}
|
|
||||||
3
node_modules/@octokit/endpoint/dist-src/index.js
generated
vendored
3
node_modules/@octokit/endpoint/dist-src/index.js
generated
vendored
@@ -1,3 +0,0 @@
|
|||||||
import { withDefaults } from "./with-defaults";
|
|
||||||
import { DEFAULTS } from "./defaults";
|
|
||||||
export const endpoint = withDefaults(null, DEFAULTS);
|
|
||||||
22
node_modules/@octokit/endpoint/dist-src/merge.js
generated
vendored
22
node_modules/@octokit/endpoint/dist-src/merge.js
generated
vendored
@@ -1,22 +0,0 @@
|
|||||||
import { lowercaseKeys } from "./util/lowercase-keys";
|
|
||||||
import { mergeDeep } from "./util/merge-deep";
|
|
||||||
export function merge(defaults, route, options) {
|
|
||||||
if (typeof route === "string") {
|
|
||||||
let [method, url] = route.split(" ");
|
|
||||||
options = Object.assign(url ? { method, url } : { url: method }, options);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
options = Object.assign({}, route);
|
|
||||||
}
|
|
||||||
// lowercase header names before merging with defaults to avoid duplicates
|
|
||||||
options.headers = lowercaseKeys(options.headers);
|
|
||||||
const mergedOptions = mergeDeep(defaults || {}, options);
|
|
||||||
// mediaType.previews arrays are merged, instead of overwritten
|
|
||||||
if (defaults && defaults.mediaType.previews.length) {
|
|
||||||
mergedOptions.mediaType.previews = defaults.mediaType.previews
|
|
||||||
.filter(preview => !mergedOptions.mediaType.previews.includes(preview))
|
|
||||||
.concat(mergedOptions.mediaType.previews);
|
|
||||||
}
|
|
||||||
mergedOptions.mediaType.previews = mergedOptions.mediaType.previews.map((preview) => preview.replace(/-preview/, ""));
|
|
||||||
return mergedOptions;
|
|
||||||
}
|
|
||||||
81
node_modules/@octokit/endpoint/dist-src/parse.js
generated
vendored
81
node_modules/@octokit/endpoint/dist-src/parse.js
generated
vendored
@@ -1,81 +0,0 @@
|
|||||||
import { addQueryParameters } from "./util/add-query-parameters";
|
|
||||||
import { extractUrlVariableNames } from "./util/extract-url-variable-names";
|
|
||||||
import { omit } from "./util/omit";
|
|
||||||
import { parseUrl } from "./util/url-template";
|
|
||||||
export function parse(options) {
|
|
||||||
// https://fetch.spec.whatwg.org/#methods
|
|
||||||
let method = options.method.toUpperCase();
|
|
||||||
// replace :varname with {varname} to make it RFC 6570 compatible
|
|
||||||
let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{+$1}");
|
|
||||||
let headers = Object.assign({}, options.headers);
|
|
||||||
let body;
|
|
||||||
let parameters = omit(options, [
|
|
||||||
"method",
|
|
||||||
"baseUrl",
|
|
||||||
"url",
|
|
||||||
"headers",
|
|
||||||
"request",
|
|
||||||
"mediaType"
|
|
||||||
]);
|
|
||||||
// extract variable names from URL to calculate remaining variables later
|
|
||||||
const urlVariableNames = extractUrlVariableNames(url);
|
|
||||||
url = parseUrl(url).expand(parameters);
|
|
||||||
if (!/^http/.test(url)) {
|
|
||||||
url = options.baseUrl + url;
|
|
||||||
}
|
|
||||||
const omittedParameters = Object.keys(options)
|
|
||||||
.filter(option => urlVariableNames.includes(option))
|
|
||||||
.concat("baseUrl");
|
|
||||||
const remainingParameters = omit(parameters, omittedParameters);
|
|
||||||
const isBinaryRequset = /application\/octet-stream/i.test(headers.accept);
|
|
||||||
if (!isBinaryRequset) {
|
|
||||||
if (options.mediaType.format) {
|
|
||||||
// e.g. application/vnd.github.v3+json => application/vnd.github.v3.raw
|
|
||||||
headers.accept = headers.accept
|
|
||||||
.split(/,/)
|
|
||||||
.map(preview => preview.replace(/application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, `application/vnd$1$2.${options.mediaType.format}`))
|
|
||||||
.join(",");
|
|
||||||
}
|
|
||||||
if (options.mediaType.previews.length) {
|
|
||||||
const previewsFromAcceptHeader = headers.accept.match(/[\w-]+(?=-preview)/g) || [];
|
|
||||||
headers.accept = previewsFromAcceptHeader
|
|
||||||
.concat(options.mediaType.previews)
|
|
||||||
.map(preview => {
|
|
||||||
const format = options.mediaType.format
|
|
||||||
? `.${options.mediaType.format}`
|
|
||||||
: "+json";
|
|
||||||
return `application/vnd.github.${preview}-preview${format}`;
|
|
||||||
})
|
|
||||||
.join(",");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// for GET/HEAD requests, set URL query parameters from remaining parameters
|
|
||||||
// for PATCH/POST/PUT/DELETE requests, set request body from remaining parameters
|
|
||||||
if (["GET", "HEAD"].includes(method)) {
|
|
||||||
url = addQueryParameters(url, remainingParameters);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if ("data" in remainingParameters) {
|
|
||||||
body = remainingParameters.data;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (Object.keys(remainingParameters).length) {
|
|
||||||
body = remainingParameters;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
headers["content-length"] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// default content-type for JSON if body is set
|
|
||||||
if (!headers["content-type"] && typeof body !== "undefined") {
|
|
||||||
headers["content-type"] = "application/json; charset=utf-8";
|
|
||||||
}
|
|
||||||
// GitHub expects 'content-length: 0' header for PUT/PATCH requests without body.
|
|
||||||
// fetch does not allow to set `content-length` header, but we can set body to an empty string
|
|
||||||
if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") {
|
|
||||||
body = "";
|
|
||||||
}
|
|
||||||
// Only return body/request keys if present
|
|
||||||
return Object.assign({ method, url, headers }, typeof body !== "undefined" ? { body } : null, options.request ? { request: options.request } : null);
|
|
||||||
}
|
|
||||||
21
node_modules/@octokit/endpoint/dist-src/util/add-query-parameters.js
generated
vendored
21
node_modules/@octokit/endpoint/dist-src/util/add-query-parameters.js
generated
vendored
@@ -1,21 +0,0 @@
|
|||||||
export function addQueryParameters(url, parameters) {
|
|
||||||
const separator = /\?/.test(url) ? "&" : "?";
|
|
||||||
const names = Object.keys(parameters);
|
|
||||||
if (names.length === 0) {
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
return (url +
|
|
||||||
separator +
|
|
||||||
names
|
|
||||||
.map(name => {
|
|
||||||
if (name === "q") {
|
|
||||||
return ("q=" +
|
|
||||||
parameters
|
|
||||||
.q.split("+")
|
|
||||||
.map(encodeURIComponent)
|
|
||||||
.join("+"));
|
|
||||||
}
|
|
||||||
return `${name}=${encodeURIComponent(parameters[name])}`;
|
|
||||||
})
|
|
||||||
.join("&"));
|
|
||||||
}
|
|
||||||
11
node_modules/@octokit/endpoint/dist-src/util/extract-url-variable-names.js
generated
vendored
11
node_modules/@octokit/endpoint/dist-src/util/extract-url-variable-names.js
generated
vendored
@@ -1,11 +0,0 @@
|
|||||||
const urlVariableRegex = /\{[^}]+\}/g;
|
|
||||||
function removeNonChars(variableName) {
|
|
||||||
return variableName.replace(/^\W+|\W+$/g, "").split(/,/);
|
|
||||||
}
|
|
||||||
export function extractUrlVariableNames(url) {
|
|
||||||
const matches = url.match(urlVariableRegex);
|
|
||||||
if (!matches) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []);
|
|
||||||
}
|
|
||||||
9
node_modules/@octokit/endpoint/dist-src/util/lowercase-keys.js
generated
vendored
9
node_modules/@octokit/endpoint/dist-src/util/lowercase-keys.js
generated
vendored
@@ -1,9 +0,0 @@
|
|||||||
export function lowercaseKeys(object) {
|
|
||||||
if (!object) {
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
return Object.keys(object).reduce((newObj, key) => {
|
|
||||||
newObj[key.toLowerCase()] = object[key];
|
|
||||||
return newObj;
|
|
||||||
}, {});
|
|
||||||
}
|
|
||||||
16
node_modules/@octokit/endpoint/dist-src/util/merge-deep.js
generated
vendored
16
node_modules/@octokit/endpoint/dist-src/util/merge-deep.js
generated
vendored
@@ -1,16 +0,0 @@
|
|||||||
import isPlainObject from "is-plain-object";
|
|
||||||
export function mergeDeep(defaults, options) {
|
|
||||||
const result = Object.assign({}, defaults);
|
|
||||||
Object.keys(options).forEach(key => {
|
|
||||||
if (isPlainObject(options[key])) {
|
|
||||||
if (!(key in defaults))
|
|
||||||
Object.assign(result, { [key]: options[key] });
|
|
||||||
else
|
|
||||||
result[key] = mergeDeep(defaults[key], options[key]);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Object.assign(result, { [key]: options[key] });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
8
node_modules/@octokit/endpoint/dist-src/util/omit.js
generated
vendored
8
node_modules/@octokit/endpoint/dist-src/util/omit.js
generated
vendored
@@ -1,8 +0,0 @@
|
|||||||
export function omit(object, keysToOmit) {
|
|
||||||
return Object.keys(object)
|
|
||||||
.filter(option => !keysToOmit.includes(option))
|
|
||||||
.reduce((obj, key) => {
|
|
||||||
obj[key] = object[key];
|
|
||||||
return obj;
|
|
||||||
}, {});
|
|
||||||
}
|
|
||||||
170
node_modules/@octokit/endpoint/dist-src/util/url-template.js
generated
vendored
170
node_modules/@octokit/endpoint/dist-src/util/url-template.js
generated
vendored
@@ -1,170 +0,0 @@
|
|||||||
// Based on https://github.com/bramstein/url-template, licensed under BSD
|
|
||||||
// TODO: create separate package.
|
|
||||||
//
|
|
||||||
// Copyright (c) 2012-2014, Bram Stein
|
|
||||||
// All rights reserved.
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
// 1. Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer in the
|
|
||||||
// documentation and/or other materials provided with the distribution.
|
|
||||||
// 3. The name of the author may not be used to endorse or promote products
|
|
||||||
// derived from this software without specific prior written permission.
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
|
|
||||||
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
||||||
// EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
|
||||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
|
||||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
||||||
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
/* istanbul ignore file */
|
|
||||||
function encodeReserved(str) {
|
|
||||||
return str
|
|
||||||
.split(/(%[0-9A-Fa-f]{2})/g)
|
|
||||||
.map(function (part) {
|
|
||||||
if (!/%[0-9A-Fa-f]/.test(part)) {
|
|
||||||
part = encodeURI(part)
|
|
||||||
.replace(/%5B/g, "[")
|
|
||||||
.replace(/%5D/g, "]");
|
|
||||||
}
|
|
||||||
return part;
|
|
||||||
})
|
|
||||||
.join("");
|
|
||||||
}
|
|
||||||
function encodeUnreserved(str) {
|
|
||||||
return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {
|
|
||||||
return ("%" +
|
|
||||||
c
|
|
||||||
.charCodeAt(0)
|
|
||||||
.toString(16)
|
|
||||||
.toUpperCase());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
function encodeValue(operator, value, key) {
|
|
||||||
value =
|
|
||||||
operator === "+" || operator === "#"
|
|
||||||
? encodeReserved(value)
|
|
||||||
: encodeUnreserved(value);
|
|
||||||
if (key) {
|
|
||||||
return encodeUnreserved(key) + "=" + value;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function isDefined(value) {
|
|
||||||
return value !== undefined && value !== null;
|
|
||||||
}
|
|
||||||
function isKeyOperator(operator) {
|
|
||||||
return operator === ";" || operator === "&" || operator === "?";
|
|
||||||
}
|
|
||||||
function getValues(context, operator, key, modifier) {
|
|
||||||
var value = context[key], result = [];
|
|
||||||
if (isDefined(value) && value !== "") {
|
|
||||||
if (typeof value === "string" ||
|
|
||||||
typeof value === "number" ||
|
|
||||||
typeof value === "boolean") {
|
|
||||||
value = value.toString();
|
|
||||||
if (modifier && modifier !== "*") {
|
|
||||||
value = value.substring(0, parseInt(modifier, 10));
|
|
||||||
}
|
|
||||||
result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : ""));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (modifier === "*") {
|
|
||||||
if (Array.isArray(value)) {
|
|
||||||
value.filter(isDefined).forEach(function (value) {
|
|
||||||
result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : ""));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Object.keys(value).forEach(function (k) {
|
|
||||||
if (isDefined(value[k])) {
|
|
||||||
result.push(encodeValue(operator, value[k], k));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
const tmp = [];
|
|
||||||
if (Array.isArray(value)) {
|
|
||||||
value.filter(isDefined).forEach(function (value) {
|
|
||||||
tmp.push(encodeValue(operator, value));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Object.keys(value).forEach(function (k) {
|
|
||||||
if (isDefined(value[k])) {
|
|
||||||
tmp.push(encodeUnreserved(k));
|
|
||||||
tmp.push(encodeValue(operator, value[k].toString()));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (isKeyOperator(operator)) {
|
|
||||||
result.push(encodeUnreserved(key) + "=" + tmp.join(","));
|
|
||||||
}
|
|
||||||
else if (tmp.length !== 0) {
|
|
||||||
result.push(tmp.join(","));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (operator === ";") {
|
|
||||||
if (isDefined(value)) {
|
|
||||||
result.push(encodeUnreserved(key));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (value === "" && (operator === "&" || operator === "?")) {
|
|
||||||
result.push(encodeUnreserved(key) + "=");
|
|
||||||
}
|
|
||||||
else if (value === "") {
|
|
||||||
result.push("");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
export function parseUrl(template) {
|
|
||||||
return {
|
|
||||||
expand: expand.bind(null, template)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
function expand(template, context) {
|
|
||||||
var operators = ["+", "#", ".", "/", ";", "?", "&"];
|
|
||||||
return template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, function (_, expression, literal) {
|
|
||||||
if (expression) {
|
|
||||||
let operator = "";
|
|
||||||
const values = [];
|
|
||||||
if (operators.indexOf(expression.charAt(0)) !== -1) {
|
|
||||||
operator = expression.charAt(0);
|
|
||||||
expression = expression.substr(1);
|
|
||||||
}
|
|
||||||
expression.split(/,/g).forEach(function (variable) {
|
|
||||||
var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable);
|
|
||||||
values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3]));
|
|
||||||
});
|
|
||||||
if (operator && operator !== "+") {
|
|
||||||
var separator = ",";
|
|
||||||
if (operator === "?") {
|
|
||||||
separator = "&";
|
|
||||||
}
|
|
||||||
else if (operator !== "#") {
|
|
||||||
separator = operator;
|
|
||||||
}
|
|
||||||
return (values.length !== 0 ? operator : "") + values.join(separator);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return values.join(",");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return encodeReserved(literal);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
1
node_modules/@octokit/endpoint/dist-src/version.js
generated
vendored
1
node_modules/@octokit/endpoint/dist-src/version.js
generated
vendored
@@ -1 +0,0 @@
|
|||||||
export const VERSION = "5.5.2";
|
|
||||||
13
node_modules/@octokit/endpoint/dist-src/with-defaults.js
generated
vendored
13
node_modules/@octokit/endpoint/dist-src/with-defaults.js
generated
vendored
@@ -1,13 +0,0 @@
|
|||||||
import { endpointWithDefaults } from "./endpoint-with-defaults";
|
|
||||||
import { merge } from "./merge";
|
|
||||||
import { parse } from "./parse";
|
|
||||||
export function withDefaults(oldDefaults, newDefaults) {
|
|
||||||
const DEFAULTS = merge(oldDefaults, newDefaults);
|
|
||||||
const endpoint = endpointWithDefaults.bind(null, DEFAULTS);
|
|
||||||
return Object.assign(endpoint, {
|
|
||||||
DEFAULTS,
|
|
||||||
defaults: withDefaults.bind(null, DEFAULTS),
|
|
||||||
merge: merge.bind(null, DEFAULTS),
|
|
||||||
parse
|
|
||||||
});
|
|
||||||
}
|
|
||||||
2
node_modules/@octokit/endpoint/dist-types/defaults.d.ts
generated
vendored
2
node_modules/@octokit/endpoint/dist-types/defaults.d.ts
generated
vendored
@@ -1,2 +0,0 @@
|
|||||||
import { EndpointDefaults } from "@octokit/types";
|
|
||||||
export declare const DEFAULTS: EndpointDefaults;
|
|
||||||
3
node_modules/@octokit/endpoint/dist-types/endpoint-with-defaults.d.ts
generated
vendored
3
node_modules/@octokit/endpoint/dist-types/endpoint-with-defaults.d.ts
generated
vendored
@@ -1,3 +0,0 @@
|
|||||||
import { EndpointOptions, RequestParameters, Route } from "@octokit/types";
|
|
||||||
import { DEFAULTS } from "./defaults";
|
|
||||||
export declare function endpointWithDefaults(defaults: typeof DEFAULTS, route: Route | EndpointOptions, options?: RequestParameters): import("@octokit/types").RequestOptions;
|
|
||||||
1
node_modules/@octokit/endpoint/dist-types/index.d.ts
generated
vendored
1
node_modules/@octokit/endpoint/dist-types/index.d.ts
generated
vendored
@@ -1 +0,0 @@
|
|||||||
export declare const endpoint: import("@octokit/types").EndpointInterface;
|
|
||||||
2
node_modules/@octokit/endpoint/dist-types/merge.d.ts
generated
vendored
2
node_modules/@octokit/endpoint/dist-types/merge.d.ts
generated
vendored
@@ -1,2 +0,0 @@
|
|||||||
import { EndpointDefaults, RequestParameters, Route } from "@octokit/types";
|
|
||||||
export declare function merge(defaults: EndpointDefaults | null, route?: Route | RequestParameters, options?: RequestParameters): EndpointDefaults;
|
|
||||||
2
node_modules/@octokit/endpoint/dist-types/parse.d.ts
generated
vendored
2
node_modules/@octokit/endpoint/dist-types/parse.d.ts
generated
vendored
@@ -1,2 +0,0 @@
|
|||||||
import { EndpointDefaults, RequestOptions } from "@octokit/types";
|
|
||||||
export declare function parse(options: EndpointDefaults): RequestOptions;
|
|
||||||
4
node_modules/@octokit/endpoint/dist-types/util/add-query-parameters.d.ts
generated
vendored
4
node_modules/@octokit/endpoint/dist-types/util/add-query-parameters.d.ts
generated
vendored
@@ -1,4 +0,0 @@
|
|||||||
export declare function addQueryParameters(url: string, parameters: {
|
|
||||||
[x: string]: string | undefined;
|
|
||||||
q?: string;
|
|
||||||
}): string;
|
|
||||||
1
node_modules/@octokit/endpoint/dist-types/util/extract-url-variable-names.d.ts
generated
vendored
1
node_modules/@octokit/endpoint/dist-types/util/extract-url-variable-names.d.ts
generated
vendored
@@ -1 +0,0 @@
|
|||||||
export declare function extractUrlVariableNames(url: string): string[];
|
|
||||||
5
node_modules/@octokit/endpoint/dist-types/util/lowercase-keys.d.ts
generated
vendored
5
node_modules/@octokit/endpoint/dist-types/util/lowercase-keys.d.ts
generated
vendored
@@ -1,5 +0,0 @@
|
|||||||
export declare function lowercaseKeys(object?: {
|
|
||||||
[key: string]: any;
|
|
||||||
}): {
|
|
||||||
[key: string]: any;
|
|
||||||
};
|
|
||||||
1
node_modules/@octokit/endpoint/dist-types/util/merge-deep.d.ts
generated
vendored
1
node_modules/@octokit/endpoint/dist-types/util/merge-deep.d.ts
generated
vendored
@@ -1 +0,0 @@
|
|||||||
export declare function mergeDeep(defaults: any, options: any): object;
|
|
||||||
5
node_modules/@octokit/endpoint/dist-types/util/omit.d.ts
generated
vendored
5
node_modules/@octokit/endpoint/dist-types/util/omit.d.ts
generated
vendored
@@ -1,5 +0,0 @@
|
|||||||
export declare function omit(object: {
|
|
||||||
[key: string]: any;
|
|
||||||
}, keysToOmit: string[]): {
|
|
||||||
[key: string]: any;
|
|
||||||
};
|
|
||||||
3
node_modules/@octokit/endpoint/dist-types/util/url-template.d.ts
generated
vendored
3
node_modules/@octokit/endpoint/dist-types/util/url-template.d.ts
generated
vendored
@@ -1,3 +0,0 @@
|
|||||||
export declare function parseUrl(template: string): {
|
|
||||||
expand: (context: object) => string;
|
|
||||||
};
|
|
||||||
1
node_modules/@octokit/endpoint/dist-types/version.d.ts
generated
vendored
1
node_modules/@octokit/endpoint/dist-types/version.d.ts
generated
vendored
@@ -1 +0,0 @@
|
|||||||
export declare const VERSION = "5.5.2";
|
|
||||||
2
node_modules/@octokit/endpoint/dist-types/with-defaults.d.ts
generated
vendored
2
node_modules/@octokit/endpoint/dist-types/with-defaults.d.ts
generated
vendored
@@ -1,2 +0,0 @@
|
|||||||
import { EndpointInterface, RequestParameters, EndpointDefaults } from "@octokit/types";
|
|
||||||
export declare function withDefaults(oldDefaults: EndpointDefaults | null, newDefaults: RequestParameters): EndpointInterface;
|
|
||||||
379
node_modules/@octokit/endpoint/dist-web/index.js
generated
vendored
379
node_modules/@octokit/endpoint/dist-web/index.js
generated
vendored
@@ -1,379 +0,0 @@
|
|||||||
import isPlainObject from 'is-plain-object';
|
|
||||||
import { getUserAgent } from 'universal-user-agent';
|
|
||||||
|
|
||||||
function lowercaseKeys(object) {
|
|
||||||
if (!object) {
|
|
||||||
return {};
|
|
||||||
}
|
|
||||||
return Object.keys(object).reduce((newObj, key) => {
|
|
||||||
newObj[key.toLowerCase()] = object[key];
|
|
||||||
return newObj;
|
|
||||||
}, {});
|
|
||||||
}
|
|
||||||
|
|
||||||
function mergeDeep(defaults, options) {
|
|
||||||
const result = Object.assign({}, defaults);
|
|
||||||
Object.keys(options).forEach(key => {
|
|
||||||
if (isPlainObject(options[key])) {
|
|
||||||
if (!(key in defaults))
|
|
||||||
Object.assign(result, { [key]: options[key] });
|
|
||||||
else
|
|
||||||
result[key] = mergeDeep(defaults[key], options[key]);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Object.assign(result, { [key]: options[key] });
|
|
||||||
}
|
|
||||||
});
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
function merge(defaults, route, options) {
|
|
||||||
if (typeof route === "string") {
|
|
||||||
let [method, url] = route.split(" ");
|
|
||||||
options = Object.assign(url ? { method, url } : { url: method }, options);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
options = Object.assign({}, route);
|
|
||||||
}
|
|
||||||
// lowercase header names before merging with defaults to avoid duplicates
|
|
||||||
options.headers = lowercaseKeys(options.headers);
|
|
||||||
const mergedOptions = mergeDeep(defaults || {}, options);
|
|
||||||
// mediaType.previews arrays are merged, instead of overwritten
|
|
||||||
if (defaults && defaults.mediaType.previews.length) {
|
|
||||||
mergedOptions.mediaType.previews = defaults.mediaType.previews
|
|
||||||
.filter(preview => !mergedOptions.mediaType.previews.includes(preview))
|
|
||||||
.concat(mergedOptions.mediaType.previews);
|
|
||||||
}
|
|
||||||
mergedOptions.mediaType.previews = mergedOptions.mediaType.previews.map((preview) => preview.replace(/-preview/, ""));
|
|
||||||
return mergedOptions;
|
|
||||||
}
|
|
||||||
|
|
||||||
function addQueryParameters(url, parameters) {
|
|
||||||
const separator = /\?/.test(url) ? "&" : "?";
|
|
||||||
const names = Object.keys(parameters);
|
|
||||||
if (names.length === 0) {
|
|
||||||
return url;
|
|
||||||
}
|
|
||||||
return (url +
|
|
||||||
separator +
|
|
||||||
names
|
|
||||||
.map(name => {
|
|
||||||
if (name === "q") {
|
|
||||||
return ("q=" +
|
|
||||||
parameters
|
|
||||||
.q.split("+")
|
|
||||||
.map(encodeURIComponent)
|
|
||||||
.join("+"));
|
|
||||||
}
|
|
||||||
return `${name}=${encodeURIComponent(parameters[name])}`;
|
|
||||||
})
|
|
||||||
.join("&"));
|
|
||||||
}
|
|
||||||
|
|
||||||
const urlVariableRegex = /\{[^}]+\}/g;
|
|
||||||
function removeNonChars(variableName) {
|
|
||||||
return variableName.replace(/^\W+|\W+$/g, "").split(/,/);
|
|
||||||
}
|
|
||||||
function extractUrlVariableNames(url) {
|
|
||||||
const matches = url.match(urlVariableRegex);
|
|
||||||
if (!matches) {
|
|
||||||
return [];
|
|
||||||
}
|
|
||||||
return matches.map(removeNonChars).reduce((a, b) => a.concat(b), []);
|
|
||||||
}
|
|
||||||
|
|
||||||
function omit(object, keysToOmit) {
|
|
||||||
return Object.keys(object)
|
|
||||||
.filter(option => !keysToOmit.includes(option))
|
|
||||||
.reduce((obj, key) => {
|
|
||||||
obj[key] = object[key];
|
|
||||||
return obj;
|
|
||||||
}, {});
|
|
||||||
}
|
|
||||||
|
|
||||||
// Based on https://github.com/bramstein/url-template, licensed under BSD
|
|
||||||
// TODO: create separate package.
|
|
||||||
//
|
|
||||||
// Copyright (c) 2012-2014, Bram Stein
|
|
||||||
// All rights reserved.
|
|
||||||
// Redistribution and use in source and binary forms, with or without
|
|
||||||
// modification, are permitted provided that the following conditions
|
|
||||||
// are met:
|
|
||||||
// 1. Redistributions of source code must retain the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer.
|
|
||||||
// 2. Redistributions in binary form must reproduce the above copyright
|
|
||||||
// notice, this list of conditions and the following disclaimer in the
|
|
||||||
// documentation and/or other materials provided with the distribution.
|
|
||||||
// 3. The name of the author may not be used to endorse or promote products
|
|
||||||
// derived from this software without specific prior written permission.
|
|
||||||
// THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR IMPLIED
|
|
||||||
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
|
||||||
// MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO
|
|
||||||
// EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
|
|
||||||
// INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
|
||||||
// BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
|
||||||
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
|
|
||||||
// OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
|
||||||
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
|
|
||||||
// EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
/* istanbul ignore file */
|
|
||||||
function encodeReserved(str) {
|
|
||||||
return str
|
|
||||||
.split(/(%[0-9A-Fa-f]{2})/g)
|
|
||||||
.map(function (part) {
|
|
||||||
if (!/%[0-9A-Fa-f]/.test(part)) {
|
|
||||||
part = encodeURI(part)
|
|
||||||
.replace(/%5B/g, "[")
|
|
||||||
.replace(/%5D/g, "]");
|
|
||||||
}
|
|
||||||
return part;
|
|
||||||
})
|
|
||||||
.join("");
|
|
||||||
}
|
|
||||||
function encodeUnreserved(str) {
|
|
||||||
return encodeURIComponent(str).replace(/[!'()*]/g, function (c) {
|
|
||||||
return ("%" +
|
|
||||||
c
|
|
||||||
.charCodeAt(0)
|
|
||||||
.toString(16)
|
|
||||||
.toUpperCase());
|
|
||||||
});
|
|
||||||
}
|
|
||||||
function encodeValue(operator, value, key) {
|
|
||||||
value =
|
|
||||||
operator === "+" || operator === "#"
|
|
||||||
? encodeReserved(value)
|
|
||||||
: encodeUnreserved(value);
|
|
||||||
if (key) {
|
|
||||||
return encodeUnreserved(key) + "=" + value;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return value;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
function isDefined(value) {
|
|
||||||
return value !== undefined && value !== null;
|
|
||||||
}
|
|
||||||
function isKeyOperator(operator) {
|
|
||||||
return operator === ";" || operator === "&" || operator === "?";
|
|
||||||
}
|
|
||||||
function getValues(context, operator, key, modifier) {
|
|
||||||
var value = context[key], result = [];
|
|
||||||
if (isDefined(value) && value !== "") {
|
|
||||||
if (typeof value === "string" ||
|
|
||||||
typeof value === "number" ||
|
|
||||||
typeof value === "boolean") {
|
|
||||||
value = value.toString();
|
|
||||||
if (modifier && modifier !== "*") {
|
|
||||||
value = value.substring(0, parseInt(modifier, 10));
|
|
||||||
}
|
|
||||||
result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : ""));
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (modifier === "*") {
|
|
||||||
if (Array.isArray(value)) {
|
|
||||||
value.filter(isDefined).forEach(function (value) {
|
|
||||||
result.push(encodeValue(operator, value, isKeyOperator(operator) ? key : ""));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Object.keys(value).forEach(function (k) {
|
|
||||||
if (isDefined(value[k])) {
|
|
||||||
result.push(encodeValue(operator, value[k], k));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
const tmp = [];
|
|
||||||
if (Array.isArray(value)) {
|
|
||||||
value.filter(isDefined).forEach(function (value) {
|
|
||||||
tmp.push(encodeValue(operator, value));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Object.keys(value).forEach(function (k) {
|
|
||||||
if (isDefined(value[k])) {
|
|
||||||
tmp.push(encodeUnreserved(k));
|
|
||||||
tmp.push(encodeValue(operator, value[k].toString()));
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
if (isKeyOperator(operator)) {
|
|
||||||
result.push(encodeUnreserved(key) + "=" + tmp.join(","));
|
|
||||||
}
|
|
||||||
else if (tmp.length !== 0) {
|
|
||||||
result.push(tmp.join(","));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (operator === ";") {
|
|
||||||
if (isDefined(value)) {
|
|
||||||
result.push(encodeUnreserved(key));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (value === "" && (operator === "&" || operator === "?")) {
|
|
||||||
result.push(encodeUnreserved(key) + "=");
|
|
||||||
}
|
|
||||||
else if (value === "") {
|
|
||||||
result.push("");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
function parseUrl(template) {
|
|
||||||
return {
|
|
||||||
expand: expand.bind(null, template)
|
|
||||||
};
|
|
||||||
}
|
|
||||||
function expand(template, context) {
|
|
||||||
var operators = ["+", "#", ".", "/", ";", "?", "&"];
|
|
||||||
return template.replace(/\{([^\{\}]+)\}|([^\{\}]+)/g, function (_, expression, literal) {
|
|
||||||
if (expression) {
|
|
||||||
let operator = "";
|
|
||||||
const values = [];
|
|
||||||
if (operators.indexOf(expression.charAt(0)) !== -1) {
|
|
||||||
operator = expression.charAt(0);
|
|
||||||
expression = expression.substr(1);
|
|
||||||
}
|
|
||||||
expression.split(/,/g).forEach(function (variable) {
|
|
||||||
var tmp = /([^:\*]*)(?::(\d+)|(\*))?/.exec(variable);
|
|
||||||
values.push(getValues(context, operator, tmp[1], tmp[2] || tmp[3]));
|
|
||||||
});
|
|
||||||
if (operator && operator !== "+") {
|
|
||||||
var separator = ",";
|
|
||||||
if (operator === "?") {
|
|
||||||
separator = "&";
|
|
||||||
}
|
|
||||||
else if (operator !== "#") {
|
|
||||||
separator = operator;
|
|
||||||
}
|
|
||||||
return (values.length !== 0 ? operator : "") + values.join(separator);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return values.join(",");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
return encodeReserved(literal);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function parse(options) {
|
|
||||||
// https://fetch.spec.whatwg.org/#methods
|
|
||||||
let method = options.method.toUpperCase();
|
|
||||||
// replace :varname with {varname} to make it RFC 6570 compatible
|
|
||||||
let url = (options.url || "/").replace(/:([a-z]\w+)/g, "{+$1}");
|
|
||||||
let headers = Object.assign({}, options.headers);
|
|
||||||
let body;
|
|
||||||
let parameters = omit(options, [
|
|
||||||
"method",
|
|
||||||
"baseUrl",
|
|
||||||
"url",
|
|
||||||
"headers",
|
|
||||||
"request",
|
|
||||||
"mediaType"
|
|
||||||
]);
|
|
||||||
// extract variable names from URL to calculate remaining variables later
|
|
||||||
const urlVariableNames = extractUrlVariableNames(url);
|
|
||||||
url = parseUrl(url).expand(parameters);
|
|
||||||
if (!/^http/.test(url)) {
|
|
||||||
url = options.baseUrl + url;
|
|
||||||
}
|
|
||||||
const omittedParameters = Object.keys(options)
|
|
||||||
.filter(option => urlVariableNames.includes(option))
|
|
||||||
.concat("baseUrl");
|
|
||||||
const remainingParameters = omit(parameters, omittedParameters);
|
|
||||||
const isBinaryRequset = /application\/octet-stream/i.test(headers.accept);
|
|
||||||
if (!isBinaryRequset) {
|
|
||||||
if (options.mediaType.format) {
|
|
||||||
// e.g. application/vnd.github.v3+json => application/vnd.github.v3.raw
|
|
||||||
headers.accept = headers.accept
|
|
||||||
.split(/,/)
|
|
||||||
.map(preview => preview.replace(/application\/vnd(\.\w+)(\.v3)?(\.\w+)?(\+json)?$/, `application/vnd$1$2.${options.mediaType.format}`))
|
|
||||||
.join(",");
|
|
||||||
}
|
|
||||||
if (options.mediaType.previews.length) {
|
|
||||||
const previewsFromAcceptHeader = headers.accept.match(/[\w-]+(?=-preview)/g) || [];
|
|
||||||
headers.accept = previewsFromAcceptHeader
|
|
||||||
.concat(options.mediaType.previews)
|
|
||||||
.map(preview => {
|
|
||||||
const format = options.mediaType.format
|
|
||||||
? `.${options.mediaType.format}`
|
|
||||||
: "+json";
|
|
||||||
return `application/vnd.github.${preview}-preview${format}`;
|
|
||||||
})
|
|
||||||
.join(",");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// for GET/HEAD requests, set URL query parameters from remaining parameters
|
|
||||||
// for PATCH/POST/PUT/DELETE requests, set request body from remaining parameters
|
|
||||||
if (["GET", "HEAD"].includes(method)) {
|
|
||||||
url = addQueryParameters(url, remainingParameters);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if ("data" in remainingParameters) {
|
|
||||||
body = remainingParameters.data;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
if (Object.keys(remainingParameters).length) {
|
|
||||||
body = remainingParameters;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
headers["content-length"] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// default content-type for JSON if body is set
|
|
||||||
if (!headers["content-type"] && typeof body !== "undefined") {
|
|
||||||
headers["content-type"] = "application/json; charset=utf-8";
|
|
||||||
}
|
|
||||||
// GitHub expects 'content-length: 0' header for PUT/PATCH requests without body.
|
|
||||||
// fetch does not allow to set `content-length` header, but we can set body to an empty string
|
|
||||||
if (["PATCH", "PUT"].includes(method) && typeof body === "undefined") {
|
|
||||||
body = "";
|
|
||||||
}
|
|
||||||
// Only return body/request keys if present
|
|
||||||
return Object.assign({ method, url, headers }, typeof body !== "undefined" ? { body } : null, options.request ? { request: options.request } : null);
|
|
||||||
}
|
|
||||||
|
|
||||||
function endpointWithDefaults(defaults, route, options) {
|
|
||||||
return parse(merge(defaults, route, options));
|
|
||||||
}
|
|
||||||
|
|
||||||
function withDefaults(oldDefaults, newDefaults) {
|
|
||||||
const DEFAULTS = merge(oldDefaults, newDefaults);
|
|
||||||
const endpoint = endpointWithDefaults.bind(null, DEFAULTS);
|
|
||||||
return Object.assign(endpoint, {
|
|
||||||
DEFAULTS,
|
|
||||||
defaults: withDefaults.bind(null, DEFAULTS),
|
|
||||||
merge: merge.bind(null, DEFAULTS),
|
|
||||||
parse
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const VERSION = "5.5.2";
|
|
||||||
|
|
||||||
const userAgent = `octokit-endpoint.js/${VERSION} ${getUserAgent()}`;
|
|
||||||
// DEFAULTS has all properties set that EndpointOptions has, except url.
|
|
||||||
// So we use RequestParameters and add method as additional required property.
|
|
||||||
const DEFAULTS = {
|
|
||||||
method: "GET",
|
|
||||||
baseUrl: "https://api.github.com",
|
|
||||||
headers: {
|
|
||||||
accept: "application/vnd.github.v3+json",
|
|
||||||
"user-agent": userAgent
|
|
||||||
},
|
|
||||||
mediaType: {
|
|
||||||
format: "",
|
|
||||||
previews: []
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const endpoint = withDefaults(null, DEFAULTS);
|
|
||||||
|
|
||||||
export { endpoint };
|
|
||||||
//# sourceMappingURL=index.js.map
|
|
||||||
1
node_modules/@octokit/endpoint/dist-web/index.js.map
generated
vendored
1
node_modules/@octokit/endpoint/dist-web/index.js.map
generated
vendored
File diff suppressed because one or more lines are too long
77
node_modules/@octokit/endpoint/package.json
generated
vendored
77
node_modules/@octokit/endpoint/package.json
generated
vendored
@@ -1,77 +0,0 @@
|
|||||||
{
|
|
||||||
"_from": "@octokit/endpoint@^5.5.0",
|
|
||||||
"_id": "@octokit/endpoint@5.5.2",
|
|
||||||
"_inBundle": false,
|
|
||||||
"_integrity": "sha512-ICDcRA0C2vtTZZGud1nXRrBLXZqFayodXAKZfo3dkdcLNqcHsgaz3YSTupbURusYeucSVRjjG+RTcQhx6HPPcg==",
|
|
||||||
"_location": "/@octokit/endpoint",
|
|
||||||
"_phantomChildren": {},
|
|
||||||
"_requested": {
|
|
||||||
"type": "range",
|
|
||||||
"registry": true,
|
|
||||||
"raw": "@octokit/endpoint@^5.5.0",
|
|
||||||
"name": "@octokit/endpoint",
|
|
||||||
"escapedName": "@octokit%2fendpoint",
|
|
||||||
"scope": "@octokit",
|
|
||||||
"rawSpec": "^5.5.0",
|
|
||||||
"saveSpec": null,
|
|
||||||
"fetchSpec": "^5.5.0"
|
|
||||||
},
|
|
||||||
"_requiredBy": [
|
|
||||||
"/@octokit/request"
|
|
||||||
],
|
|
||||||
"_resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-5.5.2.tgz",
|
|
||||||
"_shasum": "ed19d01fe85ac58bc2b774661658f9e5429b8164",
|
|
||||||
"_spec": "@octokit/endpoint@^5.5.0",
|
|
||||||
"_where": "/Users/bret/repos/deploy-to-neocities/node_modules/@octokit/request",
|
|
||||||
"bugs": {
|
|
||||||
"url": "https://github.com/octokit/endpoint.js/issues"
|
|
||||||
},
|
|
||||||
"bundleDependencies": false,
|
|
||||||
"dependencies": {
|
|
||||||
"@octokit/types": "^2.0.0",
|
|
||||||
"is-plain-object": "^3.0.0",
|
|
||||||
"universal-user-agent": "^4.0.0"
|
|
||||||
},
|
|
||||||
"deprecated": false,
|
|
||||||
"description": "Turns REST API endpoints into generic request options",
|
|
||||||
"devDependencies": {
|
|
||||||
"@pika/pack": "^0.5.0",
|
|
||||||
"@pika/plugin-build-node": "^0.8.1",
|
|
||||||
"@pika/plugin-build-web": "^0.8.1",
|
|
||||||
"@pika/plugin-ts-standard-pkg": "^0.8.1",
|
|
||||||
"@types/jest": "^25.1.0",
|
|
||||||
"jest": "^24.7.1",
|
|
||||||
"prettier": "1.19.0",
|
|
||||||
"semantic-release": "^17.0.0",
|
|
||||||
"semantic-release-plugin-update-version-in-files": "^1.0.0",
|
|
||||||
"ts-jest": "^24.0.2",
|
|
||||||
"typescript": "^3.4.5"
|
|
||||||
},
|
|
||||||
"files": [
|
|
||||||
"dist-*/",
|
|
||||||
"bin/"
|
|
||||||
],
|
|
||||||
"homepage": "https://github.com/octokit/endpoint.js#readme",
|
|
||||||
"keywords": [
|
|
||||||
"octokit",
|
|
||||||
"github",
|
|
||||||
"api",
|
|
||||||
"rest"
|
|
||||||
],
|
|
||||||
"license": "MIT",
|
|
||||||
"main": "dist-node/index.js",
|
|
||||||
"module": "dist-web/index.js",
|
|
||||||
"name": "@octokit/endpoint",
|
|
||||||
"pika": true,
|
|
||||||
"publishConfig": {
|
|
||||||
"access": "public"
|
|
||||||
},
|
|
||||||
"repository": {
|
|
||||||
"type": "git",
|
|
||||||
"url": "git+https://github.com/octokit/endpoint.js.git"
|
|
||||||
},
|
|
||||||
"sideEffects": false,
|
|
||||||
"source": "dist-src/index.js",
|
|
||||||
"types": "dist-types/index.d.ts",
|
|
||||||
"version": "5.5.2"
|
|
||||||
}
|
|
||||||
21
node_modules/@octokit/graphql/LICENSE
generated
vendored
21
node_modules/@octokit/graphql/LICENSE
generated
vendored
@@ -1,21 +0,0 @@
|
|||||||
The MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2018 Octokit contributors
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
380
node_modules/@octokit/graphql/README.md
generated
vendored
380
node_modules/@octokit/graphql/README.md
generated
vendored
@@ -1,380 +0,0 @@
|
|||||||
# graphql.js
|
|
||||||
|
|
||||||
> GitHub GraphQL API client for browsers and Node
|
|
||||||
|
|
||||||
[](https://www.npmjs.com/package/@octokit/graphql)
|
|
||||||
[](https://travis-ci.com/octokit/graphql.js)
|
|
||||||
[](https://greenkeeper.io/)
|
|
||||||
|
|
||||||
<!-- toc -->
|
|
||||||
|
|
||||||
- [Usage](#usage)
|
|
||||||
- [Send a simple query](#send-a-simple-query)
|
|
||||||
- [Authentication](#authentication)
|
|
||||||
- [Variables](#variables)
|
|
||||||
- [Pass query together with headers and variables](#pass-query-together-with-headers-and-variables)
|
|
||||||
- [Use your own `@octokit/request` instance](#)
|
|
||||||
- [Errors](#errors)
|
|
||||||
- [Partial responses](#partial-responses)
|
|
||||||
- [Writing tests](#writing-tests)
|
|
||||||
- [License](#license)
|
|
||||||
|
|
||||||
<!-- tocstop -->
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
<table>
|
|
||||||
<tbody valign=top align=left>
|
|
||||||
<tr><th>
|
|
||||||
Browsers
|
|
||||||
</th><td width=100%>
|
|
||||||
|
|
||||||
Load `@octokit/graphql` directly from [cdn.pika.dev](https://cdn.pika.dev)
|
|
||||||
|
|
||||||
```html
|
|
||||||
<script type="module">
|
|
||||||
import { endpoint } from "https://cdn.pika.dev/@octokit/graphql";
|
|
||||||
</script>
|
|
||||||
```
|
|
||||||
|
|
||||||
</td></tr>
|
|
||||||
<tr><th>
|
|
||||||
Node
|
|
||||||
</th><td>
|
|
||||||
|
|
||||||
Install with <code>npm install @octokit/graphql</code>
|
|
||||||
|
|
||||||
```js
|
|
||||||
const { graphql } = require("@octokit/graphql");
|
|
||||||
// or: import { graphql } from "@octokit/graphql";
|
|
||||||
```
|
|
||||||
|
|
||||||
</td></tr>
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
|
|
||||||
### Send a simple query
|
|
||||||
|
|
||||||
```js
|
|
||||||
const { repository } = await graphql(
|
|
||||||
`
|
|
||||||
{
|
|
||||||
repository(owner: "octokit", name: "graphql.js") {
|
|
||||||
issues(last: 3) {
|
|
||||||
edges {
|
|
||||||
node {
|
|
||||||
title
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`,
|
|
||||||
{
|
|
||||||
headers: {
|
|
||||||
authorization: `token secret123`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
### Authentication
|
|
||||||
|
|
||||||
The simplest way to authenticate a request is to set the `Authorization` header, e.g. to a [personal access token](https://github.com/settings/tokens/).
|
|
||||||
|
|
||||||
```js
|
|
||||||
const graphqlWithAuth = graphql.defaults({
|
|
||||||
headers: {
|
|
||||||
authorization: `token secret123`
|
|
||||||
}
|
|
||||||
});
|
|
||||||
const { repository } = await graphqlWithAuth(`
|
|
||||||
{
|
|
||||||
repository(owner: "octokit", name: "graphql.js") {
|
|
||||||
issues(last: 3) {
|
|
||||||
edges {
|
|
||||||
node {
|
|
||||||
title
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`);
|
|
||||||
```
|
|
||||||
|
|
||||||
For more complex authentication strategies such as GitHub Apps or Basic, we recommend the according authentication library exported by [`@octokit/auth`](https://github.com/octokit/auth.js).
|
|
||||||
|
|
||||||
```js
|
|
||||||
const { createAppAuth } = require("@octokit/auth-app");
|
|
||||||
const auth = createAppAuth({
|
|
||||||
id: process.env.APP_ID,
|
|
||||||
privateKey: process.env.PRIVATE_KEY,
|
|
||||||
installationId: 123
|
|
||||||
});
|
|
||||||
const graphqlWithAuth = graphql.defaults({
|
|
||||||
request: {
|
|
||||||
hook: auth.hook
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
const { repository } = await graphqlWithAuth(
|
|
||||||
`{
|
|
||||||
repository(owner: "octokit", name: "graphql.js") {
|
|
||||||
issues(last: 3) {
|
|
||||||
edges {
|
|
||||||
node {
|
|
||||||
title
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
### Variables
|
|
||||||
|
|
||||||
⚠️ Do not use [template literals](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals) in the query strings as they make your code vulnerable to query injection attacks (see [#2](https://github.com/octokit/graphql.js/issues/2)). Use variables instead:
|
|
||||||
|
|
||||||
```js
|
|
||||||
const { lastIssues } = await graphql(`query lastIssues($owner: String!, $repo: String!, $num: Int = 3) {
|
|
||||||
repository(owner:$owner, name:$repo) {
|
|
||||||
issues(last:$num) {
|
|
||||||
edges {
|
|
||||||
node {
|
|
||||||
title
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`, {
|
|
||||||
owner: 'octokit',
|
|
||||||
repo: 'graphql.js'
|
|
||||||
headers: {
|
|
||||||
authorization: `token secret123`
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
### Pass query together with headers and variables
|
|
||||||
|
|
||||||
```js
|
|
||||||
const { graphql } = require('@octokit/graphql')
|
|
||||||
const { lastIssues } = await graphql({
|
|
||||||
query: `query lastIssues($owner: String!, $repo: String!, $num: Int = 3) {
|
|
||||||
repository(owner:$owner, name:$repo) {
|
|
||||||
issues(last:$num) {
|
|
||||||
edges {
|
|
||||||
node {
|
|
||||||
title
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`,
|
|
||||||
owner: 'octokit',
|
|
||||||
repo: 'graphql.js'
|
|
||||||
headers: {
|
|
||||||
authorization: `token secret123`
|
|
||||||
}
|
|
||||||
})
|
|
||||||
```
|
|
||||||
|
|
||||||
### Use with GitHub Enterprise
|
|
||||||
|
|
||||||
```js
|
|
||||||
let { graphql } = require("@octokit/graphql");
|
|
||||||
graphql = graphql.defaults({
|
|
||||||
baseUrl: "https://github-enterprise.acme-inc.com/api",
|
|
||||||
headers: {
|
|
||||||
authorization: `token secret123`
|
|
||||||
}
|
|
||||||
});
|
|
||||||
const { repository } = await graphql(`
|
|
||||||
{
|
|
||||||
repository(owner: "acme-project", name: "acme-repo") {
|
|
||||||
issues(last: 3) {
|
|
||||||
edges {
|
|
||||||
node {
|
|
||||||
title
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`);
|
|
||||||
```
|
|
||||||
|
|
||||||
### Use custom `@octokit/request` instance
|
|
||||||
|
|
||||||
```js
|
|
||||||
const { request } = require("@octokit/request");
|
|
||||||
const { withCustomRequest } = require("@octokit/graphql");
|
|
||||||
|
|
||||||
let requestCounter = 0
|
|
||||||
const myRequest = request.defaults({
|
|
||||||
headers: {
|
|
||||||
authentication: 'token secret123'
|
|
||||||
},
|
|
||||||
request: {
|
|
||||||
hook(request, options) {
|
|
||||||
requestCounter++
|
|
||||||
return request(options)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
const myGraphql = withCustomRequest(myRequest)
|
|
||||||
await request('/')
|
|
||||||
await myGraphql(`
|
|
||||||
{
|
|
||||||
repository(owner: "acme-project", name: "acme-repo") {
|
|
||||||
issues(last: 3) {
|
|
||||||
edges {
|
|
||||||
node {
|
|
||||||
title
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
`);
|
|
||||||
// requestCounter is now 2
|
|
||||||
```
|
|
||||||
|
|
||||||
## Errors
|
|
||||||
|
|
||||||
In case of a GraphQL error, `error.message` is set to the first error from the response’s `errors` array. All errors can be accessed at `error.errors`. `error.request` has the request options such as query, variables and headers set for easier debugging.
|
|
||||||
|
|
||||||
```js
|
|
||||||
let { graphql } = require("@octokit/graphql");
|
|
||||||
graphqlt = graphql.defaults({
|
|
||||||
headers: {
|
|
||||||
authorization: `token secret123`
|
|
||||||
}
|
|
||||||
});
|
|
||||||
const query = `{
|
|
||||||
viewer {
|
|
||||||
bioHtml
|
|
||||||
}
|
|
||||||
}`;
|
|
||||||
|
|
||||||
try {
|
|
||||||
const result = await graphql(query);
|
|
||||||
} catch (error) {
|
|
||||||
// server responds with
|
|
||||||
// {
|
|
||||||
// "data": null,
|
|
||||||
// "errors": [{
|
|
||||||
// "message": "Field 'bioHtml' doesn't exist on type 'User'",
|
|
||||||
// "locations": [{
|
|
||||||
// "line": 3,
|
|
||||||
// "column": 5
|
|
||||||
// }]
|
|
||||||
// }]
|
|
||||||
// }
|
|
||||||
|
|
||||||
console.log("Request failed:", error.request); // { query, variables: {}, headers: { authorization: 'token secret123' } }
|
|
||||||
console.log(error.message); // Field 'bioHtml' doesn't exist on type 'User'
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Partial responses
|
|
||||||
|
|
||||||
A GraphQL query may respond with partial data accompanied by errors. In this case we will throw an error but the partial data will still be accessible through `error.data`
|
|
||||||
|
|
||||||
```js
|
|
||||||
let { graphql } = require("@octokit/graphql");
|
|
||||||
graphql = graphql.defaults({
|
|
||||||
headers: {
|
|
||||||
authorization: `token secret123`
|
|
||||||
}
|
|
||||||
});
|
|
||||||
const query = `{
|
|
||||||
repository(name: "probot", owner: "probot") {
|
|
||||||
name
|
|
||||||
ref(qualifiedName: "master") {
|
|
||||||
target {
|
|
||||||
... on Commit {
|
|
||||||
history(first: 25, after: "invalid cursor") {
|
|
||||||
nodes {
|
|
||||||
message
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}`;
|
|
||||||
|
|
||||||
try {
|
|
||||||
const result = await graphql(query);
|
|
||||||
} catch (error) {
|
|
||||||
// server responds with
|
|
||||||
// {
|
|
||||||
// "data": {
|
|
||||||
// "repository": {
|
|
||||||
// "name": "probot",
|
|
||||||
// "ref": null
|
|
||||||
// }
|
|
||||||
// },
|
|
||||||
// "errors": [
|
|
||||||
// {
|
|
||||||
// "type": "INVALID_CURSOR_ARGUMENTS",
|
|
||||||
// "path": [
|
|
||||||
// "repository",
|
|
||||||
// "ref",
|
|
||||||
// "target",
|
|
||||||
// "history"
|
|
||||||
// ],
|
|
||||||
// "locations": [
|
|
||||||
// {
|
|
||||||
// "line": 7,
|
|
||||||
// "column": 11
|
|
||||||
// }
|
|
||||||
// ],
|
|
||||||
// "message": "`invalid cursor` does not appear to be a valid cursor."
|
|
||||||
// }
|
|
||||||
// ]
|
|
||||||
// }
|
|
||||||
|
|
||||||
console.log("Request failed:", error.request); // { query, variables: {}, headers: { authorization: 'token secret123' } }
|
|
||||||
console.log(error.message); // `invalid cursor` does not appear to be a valid cursor.
|
|
||||||
console.log(error.data); // { repository: { name: 'probot', ref: null } }
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Writing tests
|
|
||||||
|
|
||||||
You can pass a replacement for [the built-in fetch implementation](https://github.com/bitinn/node-fetch) as `request.fetch` option. For example, using [fetch-mock](http://www.wheresrhys.co.uk/fetch-mock/) works great to write tests
|
|
||||||
|
|
||||||
```js
|
|
||||||
const assert = require("assert");
|
|
||||||
const fetchMock = require("fetch-mock/es5/server");
|
|
||||||
|
|
||||||
const { graphql } = require("@octokit/graphql");
|
|
||||||
|
|
||||||
graphql("{ viewer { login } }", {
|
|
||||||
headers: {
|
|
||||||
authorization: "token secret123"
|
|
||||||
},
|
|
||||||
request: {
|
|
||||||
fetch: fetchMock
|
|
||||||
.sandbox()
|
|
||||||
.post("https://api.github.com/graphql", (url, options) => {
|
|
||||||
assert.strictEqual(options.headers.authorization, "token secret123");
|
|
||||||
assert.strictEqual(
|
|
||||||
options.body,
|
|
||||||
'{"query":"{ viewer { login } }"}',
|
|
||||||
"Sends correct query"
|
|
||||||
);
|
|
||||||
return { data: {} };
|
|
||||||
})
|
|
||||||
}
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
## License
|
|
||||||
|
|
||||||
[MIT](LICENSE)
|
|
||||||
85
node_modules/@octokit/graphql/dist-node/index.js
generated
vendored
85
node_modules/@octokit/graphql/dist-node/index.js
generated
vendored
@@ -1,85 +0,0 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
Object.defineProperty(exports, '__esModule', { value: true });
|
|
||||||
|
|
||||||
var request = require('@octokit/request');
|
|
||||||
var universalUserAgent = require('universal-user-agent');
|
|
||||||
|
|
||||||
const VERSION = "4.3.1";
|
|
||||||
|
|
||||||
class GraphqlError extends Error {
|
|
||||||
constructor(request, response) {
|
|
||||||
const message = response.data.errors[0].message;
|
|
||||||
super(message);
|
|
||||||
Object.assign(this, response.data);
|
|
||||||
this.name = "GraphqlError";
|
|
||||||
this.request = request; // Maintains proper stack trace (only available on V8)
|
|
||||||
|
|
||||||
/* istanbul ignore next */
|
|
||||||
|
|
||||||
if (Error.captureStackTrace) {
|
|
||||||
Error.captureStackTrace(this, this.constructor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
const NON_VARIABLE_OPTIONS = ["method", "baseUrl", "url", "headers", "request", "query"];
|
|
||||||
function graphql(request, query, options) {
|
|
||||||
options = typeof query === "string" ? options = Object.assign({
|
|
||||||
query
|
|
||||||
}, options) : options = query;
|
|
||||||
const requestOptions = Object.keys(options).reduce((result, key) => {
|
|
||||||
if (NON_VARIABLE_OPTIONS.includes(key)) {
|
|
||||||
result[key] = options[key];
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!result.variables) {
|
|
||||||
result.variables = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
result.variables[key] = options[key];
|
|
||||||
return result;
|
|
||||||
}, {});
|
|
||||||
return request(requestOptions).then(response => {
|
|
||||||
if (response.data.errors) {
|
|
||||||
throw new GraphqlError(requestOptions, {
|
|
||||||
data: response.data
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
return response.data.data;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function withDefaults(request$1, newDefaults) {
|
|
||||||
const newRequest = request$1.defaults(newDefaults);
|
|
||||||
|
|
||||||
const newApi = (query, options) => {
|
|
||||||
return graphql(newRequest, query, options);
|
|
||||||
};
|
|
||||||
|
|
||||||
return Object.assign(newApi, {
|
|
||||||
defaults: withDefaults.bind(null, newRequest),
|
|
||||||
endpoint: request.request.endpoint
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const graphql$1 = withDefaults(request.request, {
|
|
||||||
headers: {
|
|
||||||
"user-agent": `octokit-graphql.js/${VERSION} ${universalUserAgent.getUserAgent()}`
|
|
||||||
},
|
|
||||||
method: "POST",
|
|
||||||
url: "/graphql"
|
|
||||||
});
|
|
||||||
function withCustomRequest(customRequest) {
|
|
||||||
return withDefaults(customRequest, {
|
|
||||||
method: "POST",
|
|
||||||
url: "/graphql"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
exports.graphql = graphql$1;
|
|
||||||
exports.withCustomRequest = withCustomRequest;
|
|
||||||
//# sourceMappingURL=index.js.map
|
|
||||||
1
node_modules/@octokit/graphql/dist-node/index.js.map
generated
vendored
1
node_modules/@octokit/graphql/dist-node/index.js.map
generated
vendored
File diff suppressed because one or more lines are too long
14
node_modules/@octokit/graphql/dist-src/error.js
generated
vendored
14
node_modules/@octokit/graphql/dist-src/error.js
generated
vendored
@@ -1,14 +0,0 @@
|
|||||||
export class GraphqlError extends Error {
|
|
||||||
constructor(request, response) {
|
|
||||||
const message = response.data.errors[0].message;
|
|
||||||
super(message);
|
|
||||||
Object.assign(this, response.data);
|
|
||||||
this.name = "GraphqlError";
|
|
||||||
this.request = request;
|
|
||||||
// Maintains proper stack trace (only available on V8)
|
|
||||||
/* istanbul ignore next */
|
|
||||||
if (Error.captureStackTrace) {
|
|
||||||
Error.captureStackTrace(this, this.constructor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
34
node_modules/@octokit/graphql/dist-src/graphql.js
generated
vendored
34
node_modules/@octokit/graphql/dist-src/graphql.js
generated
vendored
@@ -1,34 +0,0 @@
|
|||||||
import { GraphqlError } from "./error";
|
|
||||||
const NON_VARIABLE_OPTIONS = [
|
|
||||||
"method",
|
|
||||||
"baseUrl",
|
|
||||||
"url",
|
|
||||||
"headers",
|
|
||||||
"request",
|
|
||||||
"query"
|
|
||||||
];
|
|
||||||
export function graphql(request, query, options) {
|
|
||||||
options =
|
|
||||||
typeof query === "string"
|
|
||||||
? (options = Object.assign({ query }, options))
|
|
||||||
: (options = query);
|
|
||||||
const requestOptions = Object.keys(options).reduce((result, key) => {
|
|
||||||
if (NON_VARIABLE_OPTIONS.includes(key)) {
|
|
||||||
result[key] = options[key];
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
if (!result.variables) {
|
|
||||||
result.variables = {};
|
|
||||||
}
|
|
||||||
result.variables[key] = options[key];
|
|
||||||
return result;
|
|
||||||
}, {});
|
|
||||||
return request(requestOptions).then(response => {
|
|
||||||
if (response.data.errors) {
|
|
||||||
throw new GraphqlError(requestOptions, {
|
|
||||||
data: response.data
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return response.data.data;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
17
node_modules/@octokit/graphql/dist-src/index.js
generated
vendored
17
node_modules/@octokit/graphql/dist-src/index.js
generated
vendored
@@ -1,17 +0,0 @@
|
|||||||
import { request } from "@octokit/request";
|
|
||||||
import { getUserAgent } from "universal-user-agent";
|
|
||||||
import { VERSION } from "./version";
|
|
||||||
import { withDefaults } from "./with-defaults";
|
|
||||||
export const graphql = withDefaults(request, {
|
|
||||||
headers: {
|
|
||||||
"user-agent": `octokit-graphql.js/${VERSION} ${getUserAgent()}`
|
|
||||||
},
|
|
||||||
method: "POST",
|
|
||||||
url: "/graphql"
|
|
||||||
});
|
|
||||||
export function withCustomRequest(customRequest) {
|
|
||||||
return withDefaults(customRequest, {
|
|
||||||
method: "POST",
|
|
||||||
url: "/graphql"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
0
node_modules/@octokit/graphql/dist-src/types.js
generated
vendored
0
node_modules/@octokit/graphql/dist-src/types.js
generated
vendored
1
node_modules/@octokit/graphql/dist-src/version.js
generated
vendored
1
node_modules/@octokit/graphql/dist-src/version.js
generated
vendored
@@ -1 +0,0 @@
|
|||||||
export const VERSION = "4.3.1";
|
|
||||||
12
node_modules/@octokit/graphql/dist-src/with-defaults.js
generated
vendored
12
node_modules/@octokit/graphql/dist-src/with-defaults.js
generated
vendored
@@ -1,12 +0,0 @@
|
|||||||
import { request as Request } from "@octokit/request";
|
|
||||||
import { graphql } from "./graphql";
|
|
||||||
export function withDefaults(request, newDefaults) {
|
|
||||||
const newRequest = request.defaults(newDefaults);
|
|
||||||
const newApi = (query, options) => {
|
|
||||||
return graphql(newRequest, query, options);
|
|
||||||
};
|
|
||||||
return Object.assign(newApi, {
|
|
||||||
defaults: withDefaults.bind(null, newRequest),
|
|
||||||
endpoint: Request.endpoint
|
|
||||||
});
|
|
||||||
}
|
|
||||||
7
node_modules/@octokit/graphql/dist-types/error.d.ts
generated
vendored
7
node_modules/@octokit/graphql/dist-types/error.d.ts
generated
vendored
@@ -1,7 +0,0 @@
|
|||||||
import { EndpointOptions, GraphQlQueryResponse } from "./types";
|
|
||||||
export declare class GraphqlError<T extends GraphQlQueryResponse> extends Error {
|
|
||||||
request: EndpointOptions;
|
|
||||||
constructor(request: EndpointOptions, response: {
|
|
||||||
data: Required<GraphQlQueryResponse>;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
3
node_modules/@octokit/graphql/dist-types/graphql.d.ts
generated
vendored
3
node_modules/@octokit/graphql/dist-types/graphql.d.ts
generated
vendored
@@ -1,3 +0,0 @@
|
|||||||
import { request as Request } from "@octokit/request";
|
|
||||||
import { RequestParameters, GraphQlQueryResponseData } from "./types";
|
|
||||||
export declare function graphql(request: typeof Request, query: string | RequestParameters, options?: RequestParameters): Promise<GraphQlQueryResponseData>;
|
|
||||||
3
node_modules/@octokit/graphql/dist-types/index.d.ts
generated
vendored
3
node_modules/@octokit/graphql/dist-types/index.d.ts
generated
vendored
@@ -1,3 +0,0 @@
|
|||||||
import { request } from "@octokit/request";
|
|
||||||
export declare const graphql: import("./types").graphql;
|
|
||||||
export declare function withCustomRequest(customRequest: typeof request): import("./types").graphql;
|
|
||||||
47
node_modules/@octokit/graphql/dist-types/types.d.ts
generated
vendored
47
node_modules/@octokit/graphql/dist-types/types.d.ts
generated
vendored
@@ -1,47 +0,0 @@
|
|||||||
import * as OctokitTypes from "@octokit/types";
|
|
||||||
import { graphql } from "./graphql";
|
|
||||||
export declare type EndpointOptions = OctokitTypes.EndpointOptions;
|
|
||||||
export declare type RequestParameters = OctokitTypes.RequestParameters;
|
|
||||||
export declare type Query = string;
|
|
||||||
export interface graphql {
|
|
||||||
/**
|
|
||||||
* Sends a GraphQL query request based on endpoint options
|
|
||||||
* The GraphQL query must be specified in `options`.
|
|
||||||
*
|
|
||||||
* @param {object} endpoint Must set `method` and `url`. Plus URL, query or body parameters, as well as `headers`, `mediaType.{format|previews}`, `request`, or `baseUrl`.
|
|
||||||
*/
|
|
||||||
(options: OctokitTypes.RequestParameters): GraphQlResponse;
|
|
||||||
/**
|
|
||||||
* Sends a GraphQL query request based on endpoint options
|
|
||||||
*
|
|
||||||
* @param {string} query GraphQL query. Example: `'query { viewer { login } }'`.
|
|
||||||
* @param {object} [parameters] URL, query or body parameters, as well as `headers`, `mediaType.{format|previews}`, `request`, or `baseUrl`.
|
|
||||||
*/
|
|
||||||
(query: Query, parameters?: OctokitTypes.RequestParameters): GraphQlResponse;
|
|
||||||
/**
|
|
||||||
* Returns a new `endpoint` with updated route and parameters
|
|
||||||
*/
|
|
||||||
defaults: (newDefaults: OctokitTypes.RequestParameters) => graphql;
|
|
||||||
/**
|
|
||||||
* Octokit endpoint API, see {@link https://github.com/octokit/endpoint.js|@octokit/endpoint}
|
|
||||||
*/
|
|
||||||
endpoint: OctokitTypes.EndpointInterface;
|
|
||||||
}
|
|
||||||
export declare type GraphQlResponse = ReturnType<typeof graphql>;
|
|
||||||
export declare type GraphQlQueryResponseData = {
|
|
||||||
[key: string]: any;
|
|
||||||
} | null;
|
|
||||||
export declare type GraphQlQueryResponse = {
|
|
||||||
data: GraphQlQueryResponseData;
|
|
||||||
errors?: [{
|
|
||||||
message: string;
|
|
||||||
path: [string];
|
|
||||||
extensions: {
|
|
||||||
[key: string]: any;
|
|
||||||
};
|
|
||||||
locations: [{
|
|
||||||
line: number;
|
|
||||||
column: number;
|
|
||||||
}];
|
|
||||||
}];
|
|
||||||
};
|
|
||||||
1
node_modules/@octokit/graphql/dist-types/version.d.ts
generated
vendored
1
node_modules/@octokit/graphql/dist-types/version.d.ts
generated
vendored
@@ -1 +0,0 @@
|
|||||||
export declare const VERSION = "4.3.1";
|
|
||||||
3
node_modules/@octokit/graphql/dist-types/with-defaults.d.ts
generated
vendored
3
node_modules/@octokit/graphql/dist-types/with-defaults.d.ts
generated
vendored
@@ -1,3 +0,0 @@
|
|||||||
import { request as Request } from "@octokit/request";
|
|
||||||
import { graphql as ApiInterface, RequestParameters } from "./types";
|
|
||||||
export declare function withDefaults(request: typeof Request, newDefaults: RequestParameters): ApiInterface;
|
|
||||||
81
node_modules/@octokit/graphql/dist-web/index.js
generated
vendored
81
node_modules/@octokit/graphql/dist-web/index.js
generated
vendored
@@ -1,81 +0,0 @@
|
|||||||
import { request } from '@octokit/request';
|
|
||||||
import { getUserAgent } from 'universal-user-agent';
|
|
||||||
|
|
||||||
const VERSION = "4.3.1";
|
|
||||||
|
|
||||||
class GraphqlError extends Error {
|
|
||||||
constructor(request, response) {
|
|
||||||
const message = response.data.errors[0].message;
|
|
||||||
super(message);
|
|
||||||
Object.assign(this, response.data);
|
|
||||||
this.name = "GraphqlError";
|
|
||||||
this.request = request;
|
|
||||||
// Maintains proper stack trace (only available on V8)
|
|
||||||
/* istanbul ignore next */
|
|
||||||
if (Error.captureStackTrace) {
|
|
||||||
Error.captureStackTrace(this, this.constructor);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const NON_VARIABLE_OPTIONS = [
|
|
||||||
"method",
|
|
||||||
"baseUrl",
|
|
||||||
"url",
|
|
||||||
"headers",
|
|
||||||
"request",
|
|
||||||
"query"
|
|
||||||
];
|
|
||||||
function graphql(request, query, options) {
|
|
||||||
options =
|
|
||||||
typeof query === "string"
|
|
||||||
? (options = Object.assign({ query }, options))
|
|
||||||
: (options = query);
|
|
||||||
const requestOptions = Object.keys(options).reduce((result, key) => {
|
|
||||||
if (NON_VARIABLE_OPTIONS.includes(key)) {
|
|
||||||
result[key] = options[key];
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
if (!result.variables) {
|
|
||||||
result.variables = {};
|
|
||||||
}
|
|
||||||
result.variables[key] = options[key];
|
|
||||||
return result;
|
|
||||||
}, {});
|
|
||||||
return request(requestOptions).then(response => {
|
|
||||||
if (response.data.errors) {
|
|
||||||
throw new GraphqlError(requestOptions, {
|
|
||||||
data: response.data
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return response.data.data;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function withDefaults(request$1, newDefaults) {
|
|
||||||
const newRequest = request$1.defaults(newDefaults);
|
|
||||||
const newApi = (query, options) => {
|
|
||||||
return graphql(newRequest, query, options);
|
|
||||||
};
|
|
||||||
return Object.assign(newApi, {
|
|
||||||
defaults: withDefaults.bind(null, newRequest),
|
|
||||||
endpoint: request.endpoint
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const graphql$1 = withDefaults(request, {
|
|
||||||
headers: {
|
|
||||||
"user-agent": `octokit-graphql.js/${VERSION} ${getUserAgent()}`
|
|
||||||
},
|
|
||||||
method: "POST",
|
|
||||||
url: "/graphql"
|
|
||||||
});
|
|
||||||
function withCustomRequest(customRequest) {
|
|
||||||
return withDefaults(customRequest, {
|
|
||||||
method: "POST",
|
|
||||||
url: "/graphql"
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
export { graphql$1 as graphql, withCustomRequest };
|
|
||||||
//# sourceMappingURL=index.js.map
|
|
||||||
1
node_modules/@octokit/graphql/dist-web/index.js.map
generated
vendored
1
node_modules/@octokit/graphql/dist-web/index.js.map
generated
vendored
@@ -1 +0,0 @@
|
|||||||
{"version":3,"file":"index.js","sources":["../dist-src/version.js","../dist-src/error.js","../dist-src/graphql.js","../dist-src/with-defaults.js","../dist-src/index.js"],"sourcesContent":["export const VERSION = \"4.3.1\";\n","export class GraphqlError extends Error {\n constructor(request, response) {\n const message = response.data.errors[0].message;\n super(message);\n Object.assign(this, response.data);\n this.name = \"GraphqlError\";\n this.request = request;\n // Maintains proper stack trace (only available on V8)\n /* istanbul ignore next */\n if (Error.captureStackTrace) {\n Error.captureStackTrace(this, this.constructor);\n }\n }\n}\n","import { GraphqlError } from \"./error\";\nconst NON_VARIABLE_OPTIONS = [\n \"method\",\n \"baseUrl\",\n \"url\",\n \"headers\",\n \"request\",\n \"query\"\n];\nexport function graphql(request, query, options) {\n options =\n typeof query === \"string\"\n ? (options = Object.assign({ query }, options))\n : (options = query);\n const requestOptions = Object.keys(options).reduce((result, key) => {\n if (NON_VARIABLE_OPTIONS.includes(key)) {\n result[key] = options[key];\n return result;\n }\n if (!result.variables) {\n result.variables = {};\n }\n result.variables[key] = options[key];\n return result;\n }, {});\n return request(requestOptions).then(response => {\n if (response.data.errors) {\n throw new GraphqlError(requestOptions, {\n data: response.data\n });\n }\n return response.data.data;\n });\n}\n","import { request as Request } from \"@octokit/request\";\nimport { graphql } from \"./graphql\";\nexport function withDefaults(request, newDefaults) {\n const newRequest = request.defaults(newDefaults);\n const newApi = (query, options) => {\n return graphql(newRequest, query, options);\n };\n return Object.assign(newApi, {\n defaults: withDefaults.bind(null, newRequest),\n endpoint: Request.endpoint\n });\n}\n","import { request } from \"@octokit/request\";\nimport { getUserAgent } from \"universal-user-agent\";\nimport { VERSION } from \"./version\";\nimport { withDefaults } from \"./with-defaults\";\nexport const graphql = withDefaults(request, {\n headers: {\n \"user-agent\": `octokit-graphql.js/${VERSION} ${getUserAgent()}`\n },\n method: \"POST\",\n url: \"/graphql\"\n});\nexport function withCustomRequest(customRequest) {\n return withDefaults(customRequest, {\n method: \"POST\",\n url: \"/graphql\"\n });\n}\n"],"names":["request","Request","graphql"],"mappings":";;;AAAO,MAAM,OAAO,GAAG,mBAAmB,CAAC;;ACApC,MAAM,YAAY,SAAS,KAAK,CAAC;IACpC,WAAW,CAAC,OAAO,EAAE,QAAQ,EAAE;QAC3B,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC;QAChD,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;QAC3B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;;;QAGvB,IAAI,KAAK,CAAC,iBAAiB,EAAE;YACzB,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;SACnD;KACJ;CACJ;;ACZD,MAAM,oBAAoB,GAAG;IACzB,QAAQ;IACR,SAAS;IACT,KAAK;IACL,SAAS;IACT,SAAS;IACT,OAAO;CACV,CAAC;AACF,AAAO,SAAS,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE;IAC7C,OAAO;QACH,OAAO,KAAK,KAAK,QAAQ;eAClB,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,EAAE,OAAO,CAAC;eAC3C,OAAO,GAAG,KAAK,CAAC,CAAC;IAC5B,MAAM,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE,GAAG,KAAK;QAChE,IAAI,oBAAoB,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE;YACpC,MAAM,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAC3B,OAAO,MAAM,CAAC;SACjB;QACD,IAAI,CAAC,MAAM,CAAC,SAAS,EAAE;YACnB,MAAM,CAAC,SAAS,GAAG,EAAE,CAAC;SACzB;QACD,MAAM,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QACrC,OAAO,MAAM,CAAC;KACjB,EAAE,EAAE,CAAC,CAAC;IACP,OAAO,OAAO,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC,QAAQ,IAAI;QAC5C,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE;YACtB,MAAM,IAAI,YAAY,CAAC,cAAc,EAAE;gBACnC,IAAI,EAAE,QAAQ,CAAC,IAAI;aACtB,CAAC,CAAC;SACN;QACD,OAAO,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC;KAC7B,CAAC,CAAC;CACN;;AC/BM,SAAS,YAAY,CAACA,SAAO,EAAE,WAAW,EAAE;IAC/C,MAAM,UAAU,GAAGA,SAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,MAAM,GAAG,CAAC,KAAK,EAAE,OAAO,KAAK;QAC/B,OAAO,OAAO,CAAC,UAAU,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;KAC9C,CAAC;IACF,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE;QACzB,QAAQ,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC;QAC7C,QAAQ,EAAEC,OAAO,CAAC,QAAQ;KAC7B,CAAC,CAAC;CACN;;ACPW,MAACC,SAAO,GAAG,YAAY,CAAC,OAAO,EAAE;IACzC,OAAO,EAAE;QACL,YAAY,EAAE,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC;KAClE;IACD,MAAM,EAAE,MAAM;IACd,GAAG,EAAE,UAAU;CAClB,CAAC,CAAC;AACH,AAAO,SAAS,iBAAiB,CAAC,aAAa,EAAE;IAC7C,OAAO,YAAY,CAAC,aAAa,EAAE;QAC/B,MAAM,EAAE,MAAM;QACd,GAAG,EAAE,UAAU;KAClB,CAAC,CAAC;CACN;;;;"}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user