diff --git a/.editorconfig b/.editorconfig
index fd58ff70..81587b6d 100644
--- a/.editorconfig
+++ b/.editorconfig
@@ -16,5 +16,4 @@ indent_size = 2
trim_trailing_whitespace = false
[package.json]
-indent_style = space
-indent_size = 2
\ No newline at end of file
+indent_size = 2
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS
new file mode 100644
index 00000000..7ea4595f
--- /dev/null
+++ b/.github/CODEOWNERS
@@ -0,0 +1,8 @@
+# This is a comment.
+# Each line is a file pattern followed by one or more owners.
+
+# These owners will be the default owners for everything in
+# the repo. Unless a later match takes precedence,
+# @global-owner1 and @global-owner2 will be requested for
+# review when someone opens a pull request.
+* @nodejs/github-bot
diff --git a/.github/dependabot.yml b/.github/dependabot.yml
new file mode 100644
index 00000000..774051b2
--- /dev/null
+++ b/.github/dependabot.yml
@@ -0,0 +1,12 @@
+version: 2
+updates:
+ - package-ecosystem: github-actions
+ directory: "/"
+ schedule:
+ interval: weekly
+ open-pull-requests-limit: 10
+ - package-ecosystem: npm
+ directory: "/"
+ schedule:
+ interval: weekly
+ open-pull-requests-limit: 10
diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
new file mode 100644
index 00000000..62223d6e
--- /dev/null
+++ b/.github/workflows/test.yml
@@ -0,0 +1,7 @@
+name: Test
+
+on: [push, pull_request]
+
+jobs:
+ tests:
+ uses: pkgjs/action/.github/workflows/node-test.yaml@v0
diff --git a/.gitignore b/.gitignore
index e1a1e2f8..8be30955 100644
--- a/.gitignore
+++ b/.gitignore
@@ -4,3 +4,6 @@ npm-debug.log
.DS_Store
.env
.vscode
+.nyc_output
+.tap
+coverage
diff --git a/.travis.yml b/.travis.yml
deleted file mode 100644
index 9ecbf0be..00000000
--- a/.travis.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-sudo: false
-language: node_js
-node_js:
- - 6
diff --git a/LICENSE.md b/LICENSE.md
index 7002f97c..cae82d6e 100644
--- a/LICENSE.md
+++ b/LICENSE.md
@@ -1,7 +1,7 @@
The MIT License (MIT)
=====================
-Copyright (c) 2016 Node.js Github Bot contributors
+Copyright (c) 2016-2018 Node.js Github Bot contributors
--------------------------------------------------
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
diff --git a/README.md b/README.md
index c6606f05..5ee4b2b8 100644
--- a/README.md
+++ b/README.md
@@ -1,9 +1,9 @@
# Node.js GitHub Bot
-The Node.js Foundation's uses this bot to help manage [the repositories of the GitHub organization](https://github.com/nodejs).
-It executes [scripts](https://github.com/nodejs/github-bot/tree/master/scripts) in response to events that are
-pushed to it via GitHub webhooks. All [repositories](https://github.com/nodejs) that use this bot have the same webhook url &
-secret configured (there is only 1 bot instance). Org-wide webhooks are not allow.
+The Node.js Foundation members use this bot to help manage [the repositories of the GitHub organization](https://github.com/nodejs).
+
+It executes [scripts](https://github.com/nodejs/github-bot/tree/master/scripts) in response to events that are
+pushed to it via GitHub webhooks. All [repositories](https://github.com/nodejs) that use this bot have the same webhook url & secret configured (there is only 1 bot instance). Org-wide webhooks are not allowed.
## Contributing
@@ -13,40 +13,51 @@ See [CONTRIBUTING.md](CONTRIBUTING.md).
### Environment Variables
- **`GITHUB_TOKEN`**
- The [GitHub API token](https://github.com/blog/1509-personal-api-tokens) for your account (or bot account) that will be
- used to make API calls to GitHub. The account must have proper access to perform the actions required by your script.
+ The [GitHub API token](https://github.com/blog/1509-personal-api-tokens) for your account (or bot account) that will be used to make API calls to GitHub. The account must have proper access to perform the actions required by your script.
- **`GITHUB_WEBHOOK_SECRET`**
- The webhook secret that Githib signs the POSTed payloads with. This is created when the webhook is defined. The default
- is `hush-hush`.
-- **`TRAVIS_CI_TOKEN`**
- For scripts that communicate with Travis CI. Your Travis token is visible on [your profile](https://travis-ci.org/profile)
- page, by clicking the "show token" link. Also See: https://blog.travis-ci.com/2013-01-28-token-token-token
+ The webhook secret that GitHub signs the POSTed payloads with. This is created when the webhook is defined. The default is `hush-hush`.
+- **`JENKINS_WORKER_IPS`**
+ List of valid Jenkins worker IPs allowed to push PR status updates, split by comma: `192.168.1.100,192.168.1.101`.
+- **`JENKINS_API_CREDENTIALS`** (optional)
+ For scripts that communicate with Jenkins on http://ci.nodejs.org. The Jenkins API token is visible on
+ your own profile page `https://ci.nodejs.org/user//configure`, by clicking the
+ "show API token" button. Also See: https://wiki.jenkins-ci.org/display/JENKINS/Authenticating+scripted+clients
+- **`JENKINS_JOB_URL_`** (optional)
+ Only required for the trigger Jenkins build script, to know which job to trigger a build for when
+ repository collaborator posts a comment to the bot. E.g. `JENKINS_JOB_URL_NODE=https://ci.nodejs.org/job/node-test-pull-request`
+- **`JENKINS_BUILD_TOKEN_`** (optional)
+ Only required for the trigger Jenkins build script. The authentication token configured for a particular
+ Jenkins job, for remote scripts to trigger builds remotely. Found on the job configuration page in
+ `Build Triggers -> Trigger builds remotely (e.g., from scripts)`.
- **`LOGIN_CREDENTIALS`**
Username and password used to protected the log files exposed in /logs. Expected format: `username:password`.
- **`KEEP_LOGS`**
- Number of days to keep rotated log files in `./logs`, defaults to `10` if not set.
-
+ Number of days to keep rotated log files, defaults to `10` if not set.
+- **`LOGS_DIR`**
+ Directory where logs should be written and exposed by the `/logs` endpoint.
### Developing Locally
-The bot will try to load a `.env` file at the root of the project if it exists to set environment varaibles. You will need
-to create one similar to this:
+The bot will try to load a `.env` file at the root of the project if it exists to set environment varaibles. You will need to create one similar to this:
```
GITHUB_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-TRAVIS_CI_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
-SSE_RELAY=https://hook-relay.herokuapp.com
+SSE_RELAY=https://hook-relay.example.com
```
**Note the additional `SSE_RELAY` variable:**
-When developing locally, it is difficult to setup a GitHub webhook
-pointing to the computer you are developing on. An easy workaround is to set the `SSE_RELAY` to the url of
-[a SSE relay server](https://github.com/williamkapke/hook-relay) that will send the GitHub events via
-[Server Sent Events](http://www.html5rocks.com/en/tutorials/eventsource/basics/) instead.
-
-You can use the [TestOrgPleaseIgnore](https://github.com/TestOrgPleaseIgnore) GitHub Organization, to test
-your changes. Actions performed on the repos there will be sent to
-[the SSE Relay](https://github.com/williamkapke/hook-relay).
+When developing locally, it is difficult to setup a GitHub webhook
+pointing to the computer you are developing on. An easy workaround is to set the `SSE_RELAY` to the url of
+[a SSE relay server](https://github.com/williamkapke/hook-relay) that will send the GitHub events via
+[Server Sent Events](http://www.html5rocks.com/en/tutorials/eventsource/basics/) instead. Another option
+is to use [ngrok](https://ngrok.com/).
+
+You can use the [TestOrgPleaseIgnore](https://github.com/TestOrgPleaseIgnore) GitHub Organization, to test
+your changes. Actions performed on the repos there will be sent to
+[the SSE Relay](https://github.com/williamkapke/hook-relay). If you use your own Organization/Repository,
+remember to set the webhook Secret to the same value as `GITHUB_WEBHOOK_SECRET` (default `hush-hush`), and
+to change the content type to `application/json` (default on the GitHub interface is
+`application/x-www-form-urlencoded`, which will not work with the bot).
The `GITHUB_WEBHOOK_SECRET` environment variable is not required when using the relay.
@@ -55,7 +66,7 @@ The `GITHUB_WEBHOOK_SECRET` environment variable is not required when using the
$ npm start
```
-When developing a script, it is likely that you will only want to run the script(s) that you are working on. You may
+When developing a script, it is likely that you will only want to run the script(s) that you are working on. You may
pass an additional [glob](https://www.npmjs.com/package/glob) argument to specify which scripts to run.
```bash
diff --git a/app.js b/app.js
index 3522f933..9ac062f1 100644
--- a/app.js
+++ b/app.js
@@ -1,34 +1,40 @@
'use strict'
-require('dotenv').load({ silent: true })
+import express from 'express'
+import bodyParser from 'body-parser'
+import bunyanMiddleware from 'bunyan-middleware'
+import AsyncEventEmitter from 'events-async'
-const path = require('path')
-const glob = require('glob')
-const express = require('express')
-const bodyParser = require('body-parser')
-const bunyanMiddleware = require('bunyan-middleware')
-
-const logger = require('./lib/logger')
-const authMiddleware = require('./lib/auth-middleware')
+import logger from './lib/logger.js'
+import authMiddleware from './lib/auth-middleware.js'
+import githubEvents from './lib/github-events.js'
+import jenkinsEvents from './lib/jenkins-events.js'
const captureRaw = (req, res, buffer) => { req.raw = buffer }
-const app = express()
+export const app = express()
+export const events = new AsyncEventEmitter()
-const scriptsToLoad = process.env.SCRIPTS || './scripts/**/*.js'
+const logsDir = process.env.LOGS_DIR || ''
app.use(bodyParser.json({ verify: captureRaw }))
-app.use('/logs', authMiddleware, express.static(path.join(__dirname, 'logs')))
-// bunyanMiddleware gives us request id's and unique loggers per incoming request,
-// for satefy reasons we don't want to include the webhook GitHub secret in logs
-app.use(bunyanMiddleware({ logger, obscureHeaders: ['x-hub-signature'] }))
-require('./lib/github-events')(app)
+if (logsDir) {
+ app.use('/logs', authMiddleware, express.static(logsDir))
+}
-// load all the files in the scripts folder
-glob.sync(scriptsToLoad).forEach((file) => {
- logger.info('Loading:', file)
- require(file)(app)
+// bunyanMiddleware gives us request id's and unique loggers per incoming request,
+// for safety reasons we don't want to include the webhook GitHub secret in logs
+app.use(bunyanMiddleware({
+ logger,
+ level: 'trace',
+ obscureHeaders: ['x-hub-signature']
+}))
+
+githubEvents(app, events)
+jenkinsEvents(app, events)
+
+app.use(function logUnhandledErrors (err, req, res, next) {
+ logger.error(err, 'Unhandled error while responding to incoming HTTP request')
+ res.status(500).end()
})
-
-module.exports = app
diff --git a/lib/auth-middleware.js b/lib/auth-middleware.js
index 80e70480..81d7b550 100644
--- a/lib/auth-middleware.js
+++ b/lib/auth-middleware.js
@@ -1,5 +1,3 @@
-'use strict'
-
/**
* Routes using this middleware gets HTTP basic authentication.
* There's only support for *one* username and password combination,
@@ -7,18 +5,16 @@
* in the follow format: "username:password"
*/
-const auth = require('basic-auth')
-
-const pkg = require('../package')
+import auth from 'basic-auth'
-const [ username, password ] = (process.env.LOGIN_CREDENTIALS || '').split(':')
+const [username, password] = (process.env.LOGIN_CREDENTIALS || '').split(':')
-module.exports = function authMiddleware (req, res, next) {
+export default function authMiddleware (req, res, next) {
const user = auth(req)
- if (user === undefined || user['name'] !== username || user['pass'] !== password) {
+ if (user === undefined || user.name !== username || user.pass !== password) {
res.statusCode = 401
- res.setHeader('WWW-Authenticate', `Basic realm="${pkg.name}"`)
+ res.setHeader('WWW-Authenticate', 'Basic realm="nodejs-github-bot"')
res.end('Unauthorized')
} else {
next()
diff --git a/lib/github-client.js b/lib/github-client.js
index 76f39443..05ca43fc 100644
--- a/lib/github-client.js
+++ b/lib/github-client.js
@@ -1,20 +1,11 @@
-'use strict'
+import { Octokit } from '@octokit/rest'
-const GitHub = require('github')
-
-const githubClient = new GitHub({
- version: '3.0.0',
- protocol: 'https',
- host: 'api.github.com',
- timeout: 5 * 1000,
- headers: {
- 'user-agent': 'Node.js GitHub Bot v1.0-beta'
+const githubClient = new Octokit({
+ auth: process.env.GITHUB_TOKEN || 'invalid-placeholder-token',
+ userAgent: 'Node.js GitHub Bot v1.0-beta',
+ request: {
+ timeout: 5 * 1000
}
})
-githubClient.authenticate({
- type: 'oauth',
- token: process.env.GITHUB_TOKEN || 'invalid-placeholder-token'
-})
-
-module.exports = githubClient
+export default githubClient
diff --git a/lib/github-comment.js b/lib/github-comment.js
new file mode 100644
index 00000000..e038c543
--- /dev/null
+++ b/lib/github-comment.js
@@ -0,0 +1,17 @@
+/* eslint-disable camelcase */
+
+import githubClient from './github-client.js'
+
+export async function createPrComment ({ owner, repo, issue_number, logger }, body) {
+ try {
+ await githubClient.issues.createComment({
+ owner,
+ repo,
+ issue_number,
+ body
+ })
+ } catch (err) {
+ logger.error(err, 'Error while creating comment on GitHub')
+ throw err
+ }
+}
diff --git a/lib/github-events.js b/lib/github-events.js
index 79920a4d..6b6d46fa 100644
--- a/lib/github-events.js
+++ b/lib/github-events.js
@@ -1,9 +1,11 @@
-const debug = require('debug')('github-events')
+import debugLib from 'debug'
-const githubSecret = require('./github-secret')
+import * as githubSecret from './github-secret.js'
-module.exports = (app) => {
- app.post('/hooks/github', (req, res) => {
+const debug = debugLib('github-events')
+
+export default (app, events) => {
+ app.post('/hooks/github', async (req, res) => {
const event = req.headers['x-github-event']
if (!event) {
res.writeHead(400, 'Event Header Missing')
@@ -19,14 +21,28 @@ module.exports = (app) => {
const data = req.body
data.action = data.action ? event + '.' + data.action : event
- res.end()
+ try {
+ await app.emitGhEvent(data, req.log)
+ res.status(200)
+ } catch (err) {
+ req.log.error(err, 'Error while emitting GitHub event')
+ res.status(500)
+ }
- app.emitGhEvent(data, req.log)
+ res.end()
})
app.emitGhEvent = function emitGhEvent (data, logger) {
const repo = data.repository.name
const org = data.repository.owner.login || data.organization.login
+
+ // Normalize how to fetch the PR / issue number for simpler retrieval in the
+ // rest of the bot's code. For PRs the number is present in data.number,
+ // but for webhook events raised for comments it's present in data.issue.number
+ if (!data.number && data.issue) {
+ data.number = data.issue.number
+ }
+
const pr = data.number
// create unique logger which is easily traceable throughout the entire app
@@ -37,6 +53,6 @@ module.exports = (app) => {
data.logger.info('Emitting GitHub event')
debug(data)
- app.emit(data.action, data, org, repo, data.sender.login)
+ return events.emit(data.action, data, org, repo, data.sender.login)
}
}
diff --git a/lib/github-secret.js b/lib/github-secret.js
index 4be3efb5..1aecacc1 100644
--- a/lib/github-secret.js
+++ b/lib/github-secret.js
@@ -1,13 +1,13 @@
-const crypto = require('crypto')
+import crypto from 'node:crypto'
const secret = process.env.GITHUB_WEBHOOK_SECRET || 'hush-hush'
function sign (data) {
- const buffer = new Buffer(data, 'utf8')
+ const buffer = Buffer.from(data, 'utf8')
return 'sha1=' + crypto.createHmac('sha1', secret).update(buffer).digest('hex')
}
-exports.isValid = function isValid (req) {
+export function isValid (req) {
const signature = req.headers['x-hub-signature']
return signature && signature === sign(req.raw)
}
diff --git a/lib/jenkins-events.js b/lib/jenkins-events.js
new file mode 100644
index 00000000..7a97e551
--- /dev/null
+++ b/lib/jenkins-events.js
@@ -0,0 +1,84 @@
+import debugLib from 'debug'
+
+import * as pushJenkinsUpdate from './push-jenkins-update.js'
+
+const debug = debugLib('jenkins-events')
+const enabledRepos = process.env.JENKINS_ENABLED_REPOS
+ ? process.env.JENKINS_ENABLED_REPOS.split(',')
+ : ['citgm', 'http-parser', 'node', 'node-auto-test']
+
+const listOfKnownJenkinsIps = process.env.JENKINS_WORKER_IPS ? process.env.JENKINS_WORKER_IPS.split(',') : []
+
+function isKnownJenkinsIp (req) {
+ const ip = req.connection.remoteAddress.split(':').pop()
+
+ if (listOfKnownJenkinsIps.length && !listOfKnownJenkinsIps.includes(ip)) {
+ req.log.warn({ ip }, 'Ignoring, not allowed to push Jenkins updates')
+ return false
+ }
+
+ return true
+}
+
+function isRelatedToPullRequest (gitRef) {
+ // refs/pull/12345/head vs refs/heads/v8.x-staging/head
+ return gitRef.includes('/pull/')
+}
+
+export default (app, events) => {
+ app.post('/:repo/jenkins/:event', async (req, res) => {
+ const isValid = pushJenkinsUpdate.validate(req.body)
+ const repo = req.params.repo
+ const event = req.params.event
+ const owner = req.body.owner || process.env.JENKINS_DEFAULT_GH_OWNER || 'nodejs'
+
+ if (!isValid) {
+ return res.status(400).end('Invalid payload')
+ }
+
+ if (!isRelatedToPullRequest(req.body.ref)) {
+ return res.status(400).end('Will only push builds related to pull requests')
+ }
+
+ if (!enabledRepos.includes(repo)) {
+ return res.status(400).end('Invalid repository')
+ }
+
+ if (!isKnownJenkinsIp(req)) {
+ return res.status(401).end('Invalid Jenkins IP')
+ }
+
+ const data = {
+ ...req.body,
+ owner,
+ repo,
+ event
+ }
+
+ try {
+ await app.emitJenkinsEvent(event, data, req.log)
+ res.status(200)
+ } catch (err) {
+ req.log.error(err, 'Error while emitting Jenkins event')
+ res.status(500)
+ }
+
+ res.end()
+ })
+
+ app.emitJenkinsEvent = function emitJenkinsEvent (event, data, logger) {
+ const { identifier } = data
+
+ // create unique logger which is easily traceable throughout the entire app
+ // by having e.g. "nodejs/nodejs.org/#1337" part of every subsequent log statement
+ data.logger = logger.child({ identifier, event }, true)
+ // prevent data.logger from plausibly being serialised to JSON due to circular references
+ Object.defineProperty(data, 'logger', { enumerable: false })
+
+ data.logger.info('Emitting Jenkins event')
+ debug(data)
+
+ events.emit('jenkins', data)
+ return events.emit(`jenkins.${event}`, data)
+ }
+}
diff --git a/lib/logger.js b/lib/logger.js
index b5279c42..885ef789 100644
--- a/lib/logger.js
+++ b/lib/logger.js
@@ -1,26 +1,31 @@
-'use strict'
+import path from 'node:path'
-const path = require('path')
-const bunyan = require('bunyan')
+import bunyan from 'bunyan'
const isRunningTests = process.env.npm_lifecycle_event === 'test'
-const stdoutLevel = isRunningTests ? 'FATAL' : 'INFO'
+const stdoutLevel = isRunningTests ? 'FATAL' : process.env.LOG_LEVEL || 'INFO'
const daysToKeepLogs = process.env.KEEP_LOGS || 10
+const logsDir = process.env.LOGS_DIR || ''
+const rotatingFilePath = path.join(logsDir, 'bot.log')
-module.exports = bunyan.createLogger({
+const streams = [{
+ stream: process.stdout,
+ level: stdoutLevel
+}]
+
+// write to file when $LOGS_DIR is set
+if (logsDir) {
+ streams.push({
+ type: 'rotating-file',
+ path: rotatingFilePath,
+ period: '1d', // daily rotation
+ count: daysToKeepLogs,
+ level: 'debug'
+ })
+}
+
+export default bunyan.createLogger({
name: 'bot',
- streams: [
- {
- stream: process.stdout,
- level: stdoutLevel
- },
- {
- type: 'rotating-file',
- path: path.join(__dirname, '../logs/bot.log'),
- period: '1d', // daily rotation
- count: daysToKeepLogs,
- level: 'debug'
- }
- ]
+ streams
})
diff --git a/lib/node-labels.js b/lib/node-labels.js
deleted file mode 100644
index af27f7fa..00000000
--- a/lib/node-labels.js
+++ /dev/null
@@ -1,184 +0,0 @@
-'use strict'
-
-// order of entries in this map *does* matter for the resolved labels
-// earlier entries override later entries
-const subSystemLabelsMap = new Map([
- // properly label changes to v8 inspector integration-related files
- [/^src\/inspector_/, ['c++', 'v8_inspector', 'dont-land-on-v4.x']],
- // don't want to label it a c++ update when we're "only" bumping the Node.js version
- [/^src\/(?!node_version\.h)/, 'c++'],
- // meta is a very specific label for things that are policy and or meta-info related
- [/^([A-Z]+$|CODE_OF_CONDUCT|ROADMAP|WORKING_GROUPS|GOVERNANCE|CHANGELOG|\.mail|\.git.+)/, 'meta'],
- // things that edit top-level .md files are always a doc change
- [/^\w+\.md$/, 'doc'],
- // different variants of *Makefile and build files
- [/^(tools\/)?(Makefile|BSDmakefile|create_android_makefiles)$/, 'build'],
- [/^tools\/(install\.py|genv8constants\.py|getnodeversion\.py|js2c\.py|utils\.py|configure\.d\/.*)$/, 'build'],
- [/^(configure|node\.gyp|common\.gypi|vcbuild\.bat)$/, 'build'],
- // all other tools/ changes should be marked as such
- [/^tools\//, 'tools'],
-
- /* Dependencies */
- // libuv needs an explicit mapping, as the ordinary /deps/ mapping below would
- // end up as libuv changes labeled with "uv" (which is a non-existing label)
- [/^deps\/uv\//, 'libuv'],
- [/^deps\/([^/]+)/, '$1'],
-
- /* JS subsystems */
- // Oddities first
- [/^lib\/(punycode|\w+\/freelist|sys\.js)/, ''], // TODO: ignore better?
- [/^lib\/constants\.js$/, 'lib / src'],
- [/^lib\/_(debug_agent|debugger)\.js$/, 'debugger'],
- [/^lib(\/\w+)?\/(_)?link(ed)?list/, 'timers'],
- [/^lib\/\w+\/bootstrap_node/, 'lib / src'],
- [/^lib\/\w+\/v8_prof_/, 'tools'],
- [/^lib\/\w+\/socket_list/, 'net'],
- [/^lib\/\w+\/streams$/, 'stream'],
- // All other lib/ files map directly
- [/^lib\/_(\w+)_\w+\.js?$/, '$1'], // e.g. _(stream)_wrap
- [/^lib(\/internal)?\/(\w+)\.js?$/, '$2'], // other .js files
- [/^lib\/internal\/(\w+)$/, '$1'] // internal subfolders
-])
-
-const jsSubsystemList = [
- 'debugger', 'assert', 'buffer', 'child_process', 'cluster', 'console',
- 'crypto', 'dgram', 'dns', 'domain', 'events', 'fs', 'http', 'https', 'module',
- 'net', 'os', 'path', 'process', 'querystring', 'readline', 'repl', 'stream',
- 'string_decoder', 'timers', 'tls', 'tty', 'url', 'util', 'v8', 'vm', 'zlib'
-]
-
-const exclusiveLabelsMap = new Map([
- [/^test\//, 'test'],
- // specific map for modules.md as it should be labeled 'module' not 'modules'
- [/^doc\/api\/modules.md$/, ['doc', 'module']],
- // automatically tag subsystem-specific API doc changes
- [/^doc\/api\/(\w+)\.md$/, ['doc', '$1']],
- [/^doc\//, 'doc'],
- [/^benchmark\//, 'benchmark']
-])
-
-function resolveLabels (filepathsChanged, baseBranch, limitLib = true) {
- const exclusiveLabels = matchExclusiveSubSystem(filepathsChanged)
-
- if (typeof baseBranch !== 'string') {
- if (typeof baseBranch === 'boolean') {
- limitLib = baseBranch
- }
- baseBranch = ''
- }
-
- const labels = (exclusiveLabels.length > 0)
- ? exclusiveLabels
- : matchAllSubSystem(filepathsChanged, limitLib)
-
- // Add version labels if PR is made against a version branch
- const m = /^(v\d+\.(?:\d+|x))(?:-staging|$)/.exec(baseBranch)
- if (m) {
- labels.push(m[1])
- }
-
- return labels
-}
-
-function hasAllSubsystems (arr) {
- return arr.every((val) => {
- return jsSubsystemList.includes(val)
- })
-}
-
-function matchExclusiveSubSystem (filepathsChanged) {
- const isExclusive = filepathsChanged.every(matchesAnExclusiveLabel)
- var labels = matchSubSystemsByRegex(exclusiveLabelsMap, filepathsChanged)
- // if there are multiple API doc changes, do not apply subsystem tags for now
- if (isExclusive &&
- labels.includes('doc') &&
- labels.length > 2) {
- const nonDocLabels = labels.filter((val) => {
- return val !== 'doc'
- })
- if (hasAllSubsystems(nonDocLabels)) {
- labels = ['doc']
- } else {
- labels = []
- }
- }
- return isExclusive ? labels : []
-}
-
-function matchAllSubSystem (filepathsChanged, limitLib) {
- return matchSubSystemsByRegex(
- subSystemLabelsMap, filepathsChanged, limitLib)
-}
-
-function matchSubSystemsByRegex (rxLabelsMap, filepathsChanged, limitLib) {
- const jsLabelCount = []
- // by putting matched labels into a map, we avoid duplicate labels
- const labelsMap = filepathsChanged.reduce((map, filepath) => {
- const mappedSubSystems = mappedSubSystemsForFile(rxLabelsMap, filepath)
-
- if (!mappedSubSystems) {
- // short-circuit
- return map
- }
-
- for (var i = 0; i < mappedSubSystems.length; ++i) {
- const mappedSubSystem = mappedSubSystems[i]
- if (limitLib && hasJsSubsystemChanges(filepathsChanged, mappedSubSystem)) {
- if (jsLabelCount.length >= 4) {
- for (const jsLabel of jsLabelCount) {
- delete map[jsLabel]
- }
- map['lib / src'] = true
- // short-circuit
- return map
- } else {
- jsLabelCount.push(mappedSubSystem)
- }
- }
-
- map[mappedSubSystem] = true
- }
-
- return map
- }, {})
-
- return Object.keys(labelsMap)
-}
-
-function hasJsSubsystemChanges (filepathsChanged, mappedSubSystem) {
- const hasLibChanges = filepathsChanged.some((filepath) => filepath.startsWith('lib/'))
- return hasLibChanges && jsSubsystemList.includes(mappedSubSystem)
-}
-
-function mappedSubSystemsForFile (labelsMap, filepath) {
- for (const [regex, label] of labelsMap) {
- const matches = regex.exec(filepath)
-
- if (matches === null) {
- continue
- }
-
- const ret = []
- const labels = Array.isArray(label) ? label : [label]
- labels.forEach((label) => {
- // label names starting with $ means we want to extract a matching
- // group from the regex we've just matched against
- if (label.startsWith('$')) {
- const wantedMatchGroup = label.substr(1)
- label = matches[wantedMatchGroup]
- }
- if (!label) {
- return
- }
- // use label name as is when label doesn't look like a regex matching group
- ret.push(label)
- })
- return ret
- }
-}
-
-function matchesAnExclusiveLabel (filepath) {
- return mappedSubSystemsForFile(exclusiveLabelsMap, filepath) !== undefined
-}
-
-exports.resolveLabels = resolveLabels
diff --git a/lib/node-owners.js b/lib/node-owners.js
new file mode 100644
index 00000000..ee431d07
--- /dev/null
+++ b/lib/node-owners.js
@@ -0,0 +1,24 @@
+import { matchPattern, parse } from 'codeowners-utils'
+
+export class Owners {
+ constructor (ownersDefinitions) {
+ this._ownersDefinitions = ownersDefinitions
+ }
+
+ static fromFile (content) {
+ return new Owners(parse(content))
+ }
+
+ getOwnersForPaths (paths) {
+ let ownersForPaths = []
+ for (const { pattern, owners } of this._ownersDefinitions) {
+ for (const path of paths) {
+ if (matchPattern(path, pattern)) {
+ ownersForPaths = ownersForPaths.concat(owners)
+ }
+ }
+ }
+ // Remove duplicates before returning
+ return ownersForPaths.filter((v, i) => ownersForPaths.indexOf(v) === i).sort()
+ }
+}
diff --git a/lib/node-repo.js b/lib/node-repo.js
index 97ea8dfc..c21210e6 100644
--- a/lib/node-repo.js
+++ b/lib/node-repo.js
@@ -1,145 +1,191 @@
-'use strict'
+/* eslint-disable camelcase */
-const LRU = require('lru-cache')
+import https from 'node:https'
-const githubClient = require('./github-client')
-const resolveLabels = require('./node-labels').resolveLabels
-const existingLabelsCache = new LRU({ max: 1, maxAge: 1000 * 60 * 60 })
+import Aigle from 'aigle'
-function deferredResolveLabelsThenUpdatePr (options) {
- const timeoutMillis = (options.timeoutInSec || 0) * 1000
- setTimeout(resolveLabelsThenUpdatePr, timeoutMillis, options)
-}
+import githubClient from './github-client.js'
+import { createPrComment } from './github-comment.js'
+import { Owners } from './node-owners.js'
-function resolveLabelsThenUpdatePr (options) {
- options.logger.debug('Fetching PR files for labelling')
+const fiveSeconds = 5 * 1000
- githubClient.pullRequests.getFiles({
- owner: options.owner,
- repo: options.repo,
- number: options.prId
- }, (err, res) => {
- if (err) {
- return options.logger.error(err, 'Error retrieving files from GitHub')
- }
-
- const filepathsChanged = res.map((fileMeta) => fileMeta.filename)
- const resolvedLabels = resolveLabels(filepathsChanged, options.baseBranch)
+const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms))
- fetchExistingLabels(options, (err, existingLabels) => {
- if (err) {
- return options.logger.error(err, 'Error retrieving existing repo labels')
- }
+export async function removeLabelFromPR (options, label) {
+ // no need to request github if we didn't resolve a label
+ if (!label) {
+ return
+ }
- const labelsToAdd = stringsInCommon(existingLabels, resolvedLabels)
- options.logger.debug('Resolved labels: ' + labelsToAdd)
+ options.logger.debug('Trying to remove label: ' + label)
- updatePrWithLabels(options, labelsToAdd)
+ try {
+ await githubClient.issues.removeLabel({
+ owner: options.owner,
+ repo: options.repo,
+ issue_number: options.prId,
+ name: label
})
- })
-}
-
-function updatePrWithLabels (options, labels) {
- // no need to request github if we didn't resolve any labels
- if (!labels.length) {
- return
+ } catch (err) {
+ if (err.code === 404) {
+ options.logger.info('Label to remove did not exist, bailing ' + label)
+ throw err
+ }
+ options.logger.error(err, 'Error while removing a label')
+ throw err
}
- options.logger.debug('Trying to add labels: ' + labels)
+ options.logger.info('Removed a label ' + label)
+ return label
+}
- githubClient.issues.addLabels({
+export function getBotPrLabels (options, cb) {
+ githubClient.issues.listEvents({
owner: options.owner,
repo: options.repo,
- number: options.prId,
- body: labels
- }, (err) => {
- if (err) {
- return options.logger.error(err, 'Error while adding labels')
+ page: 1,
+ per_page: 100, // we probably won't hit this
+ issue_number: options.prId
+ }).then(res => {
+ const events = res.data || []
+ const ourLabels = []
+
+ for (const event of events) {
+ if (event.event === 'unlabeled') {
+ const index = ourLabels.indexOf(event.label.name)
+ if (index === -1) continue
+
+ ourLabels.splice(index, 1)
+ } else if (event.event === 'labeled') {
+ const index = ourLabels.indexOf(event.label.name)
+ if (index > -1) continue
+
+ if (event.actor.login === 'nodejs-github-bot') {
+ ourLabels.push(event.label.name)
+ }
+ }
}
- options.logger.info('Added labels: ' + labels)
- })
+ cb(null, ourLabels)
+ }, cb)
}
-function removeLabelFromPR (options, label) {
- // no need to request github if we didn't resolve a label
- if (!label) {
- return
- }
+async function deferredResolveOwnersThenPingPr (options) {
+ const timeoutMillis = (options.timeoutInSec || 0) * 1000
+ await sleep(timeoutMillis)
+ return resolveOwnersThenPingPr(options)
+}
- options.logger.debug('Trying to remove label: ' + label)
+function getCodeOwnersUrl (owner, repo, defaultBranch) {
+ const base = 'raw.githubusercontent.com'
+ const filepath = '.github/CODEOWNERS'
+ return `https://${base}/${owner}/${repo}/${defaultBranch}/${filepath}`
+}
- githubClient.issues.removeLabel({
- owner: options.owner,
- repo: options.repo,
- number: options.prId,
- name: label
- }, (err) => {
- if (err) {
- if (err.code === 404) return options.logger.info('Label to remove did not exist, bailing ' + label)
+async function listFiles ({ owner, repo, prId, logger }) {
+ try {
+ const response = await githubClient.pulls.listFiles({
+ owner,
+ repo,
+ pull_number: prId
+ })
+ return response.data.map(({ filename }) => filename)
+ } catch (err) {
+ logger.error(err, 'Error retrieving files from GitHub')
+ throw err
+ }
+}
- return options.logger.error(err, 'Error while removing a label')
+async function getDefaultBranch ({ owner, repo, logger }) {
+ try {
+ const data = (await githubClient.repos.get({ owner, repo })).data || { }
+
+ if (!data.default_branch) {
+ logger.error(null, 'Could not determine default branch')
+ throw new Error('unknown default branch')
}
- options.logger.info('Removed a label ' + label)
+ return data.default_branch
+ } catch (err) {
+ logger.error(err, 'Error retrieving repository data')
+ throw err
+ }
+}
+
+function getCodeOwnersFile (url, { logger }) {
+ return new Promise((resolve, reject) => {
+ https.get(url, (res) => {
+ if (res.statusCode !== 200) {
+ logger.error(`Status code: ${res.statusCode}`, 'Error retrieving OWNERS')
+ return reject(res.statusCode)
+ }
+ let body = ''
+ res.on('data', (chunk) => {
+ body += chunk
+ })
+ res.on('end', () => {
+ return resolve(body)
+ })
+ }).on('err', (err) => {
+ logger.error(err, 'Error retrieving OWNERS')
+ return reject(err)
+ })
})
}
-function fetchExistingLabels (options, cb) {
- const cacheKey = `${options.owner}:${options.repo}`
+async function resolveOwnersThenPingPr (options) {
+ const { owner, repo } = options
+ const times = options.retries || 5
+ const interval = options.retryInterval || fiveSeconds
+ const retry = fn => Aigle.retry({ times, interval }, fn)
- if (existingLabelsCache.has(cacheKey)) {
- return cb(null, existingLabelsCache.get(cacheKey))
- }
+ options.logger.debug('Getting file paths')
+ const filepathsChanged = await retry(() => listFiles(options))
+ options.logger = options.logger.child({ filepathsChanged })
- fetchLabelPages(options, 1, (err, existingLabels) => {
- if (err) {
- return cb(err)
- }
+ options.logger.debug('Getting default branch')
+ const defaultBranch = await retry(() => getDefaultBranch(options))
- const existingLabelNames = existingLabels.map((label) => label.name)
+ const url = getCodeOwnersUrl(owner, repo, defaultBranch)
+ options.logger = options.logger.child({ codeownersUrl: url })
- // cache labels so we don't have to fetch these *all the time*
- existingLabelsCache.set(cacheKey, existingLabelNames)
- options.logger.debug('Filled existing repo labels cache: ' + existingLabelNames)
+ options.logger.debug('Fetching OWNERS')
+ const file = await retry(() => getCodeOwnersFile(url, options))
- cb(null, existingLabelNames)
- })
+ const owners = Owners.fromFile(file)
+ const selectedOwners = owners.getOwnersForPaths(filepathsChanged)
+ options.logger = options.logger.child({ owners: selectedOwners })
+
+ options.logger.debug('Codeowners file parsed')
+ if (selectedOwners.length > 0) {
+ await pingOwners(options, selectedOwners)
+ }
}
-function fetchLabelPages (options, startPageNum, cb) {
- // the github client API is somewhat misleading,
- // this fetches *all* repo labels not just for an issue
- githubClient.issues.getLabels({
- owner: options.owner,
- repo: options.repo,
- page: startPageNum,
- per_page: 100
- }, (err, existingLabels) => {
- if (err) {
- return cb(err)
- }
- if (!githubClient.hasNextPage(existingLabels)) {
- return cb(null, existingLabels)
- }
- fetchLabelPages(
- options,
- startPageNum + 1,
- (err, remainingLabels) => err ? cb(err) : cb(null, existingLabels.concat(remainingLabels))
- )
- })
+function getCommentForOwners (owners) {
+ return `Review requested:\n\n${owners.map(i => `- [ ] ${i}`).join('\n')}`
}
-function stringsInCommon (arr1, arr2) {
- const loweredArr2 = arr2.map((str) => str.toLowerCase())
- // we want the original string cases in arr1, therefore we don't lowercase them
- // before comparing them cause that would wrongly make "V8" -> "v8"
- return arr1.filter((str) => loweredArr2.indexOf(str.toLowerCase()) !== -1)
+async function pingOwners (options, owners) {
+ options.logger.debug('Pinging codeowners')
+ try {
+ await createPrComment({
+ owner: options.owner,
+ repo: options.repo,
+ issue_number: options.prId,
+ logger: options.logger
+ }, getCommentForOwners(owners))
+ } catch (err) {
+ options.logger.error(err, 'Error while pinging owners')
+ throw err
+ }
+ options.logger.debug('Owners pinged successfully')
}
-exports.removeLabelFromPR = removeLabelFromPR
-exports.updatePrWithLabels = updatePrWithLabels
-exports.resolveLabelsThenUpdatePr = deferredResolveLabelsThenUpdatePr
+export { deferredResolveOwnersThenPingPr as resolveOwnersThenPingPr }
// exposed for testability
-exports._fetchExistingLabels = fetchExistingLabels
+export const _testExports = {
+ pingOwners, getCodeOwnersFile, getCodeOwnersUrl, getDefaultBranch, listFiles, getCommentForOwners
+}
diff --git a/lib/pollTravis.js b/lib/pollTravis.js
deleted file mode 100644
index 87462902..00000000
--- a/lib/pollTravis.js
+++ /dev/null
@@ -1,112 +0,0 @@
-'use strict'
-
-const Travis = require('travis-ci')
-
-const githubClient = require('./github-client')
-
-const travisClient = new Travis({
- version: '2.0.0',
- access_token: process.env.TRAVIS_CI_TOKEN
-})
-
-exports.pollThenStatus = pollByCommitThenStatus
-
-/**
- * Poll and match builds by the last commit SHA of the related PR.
- */
-function pollByCommitThenStatus (options) {
- githubClient.pullRequests.getCommits({
- owner: options.owner,
- repo: options.repo,
- number: options.pr
- }, (err, commitMetas) => {
- if (err) {
- return options.logger.error(err, 'Got error when retrieving GitHub commits for PR')
- }
-
- const lastCommitMeta = commitMetas.pop()
- const lastCommit = {
- sha: lastCommitMeta.sha,
- date: lastCommitMeta.commit.committer.date
- }
-
- const optsWithCommit = Object.assign({ lastCommit }, options)
-
- // attach last commit sha to all subsequent logs
- optsWithCommit.logger = options.logger.child({ commit: lastCommit.sha }, true)
-
- pollTravisBuildBySha(optsWithCommit)
- optsWithCommit.logger.info('Started polling Travis for build by commit')
- })
-}
-
-function pollTravisBuildBySha (options, checkNumber = 1) {
- const createGhStatus = createGhStatusFn(options)
- const toMatch = {
- sha: options.lastCommit.sha,
- date: options.lastCommit.date,
- pr: options.pr
- }
-
- if (checkNumber > 100) {
- options.logger.warn('Was not able to find matching build for PR, stopping poll now :(')
- return
- }
-
- travisClient.repos(options.owner, options.repo).builds.get((err, res) => {
- if (err) {
- return options.logger.error(err, 'Got error when retrieving Travis builds')
- }
-
- const matchingCommit = res.commits.find((commit) => {
- const matchesShaOrPr = commit.sha === toMatch.sha || commit.pull_request_number === toMatch.pr
- const matchesCommitDate = commit.committed_at === toMatch.date
-
- return matchesCommitDate && matchesShaOrPr
- })
-
- if (!matchingCommit) {
- options.logger.warn(`Travis hasn't picked up last commit yet, will do check #${checkNumber + 1} in 30 seconds`)
- return setTimeout(pollTravisBuildBySha, 30 * 1000, options, checkNumber + 1)
- }
-
- const lastBuildForCommit = res.builds.find((build) => build.commit_id === matchingCommit.id)
- if (lastBuildForCommit) {
- const lastState = lastBuildForCommit.state
-
- if (lastState === 'passed') {
- return createGhStatus('success', lastBuildForCommit.id, 'all tests passed')
- } else if (lastState === 'failed') {
- return createGhStatus('failure', lastBuildForCommit.id, 'build failure')
- } else if (~['created', 'started'].indexOf(lastState)) {
- options.logger.info(`"${lastState}" build found, will do check #${checkNumber + 1} in 30 seconds`)
- createGhStatus('pending', lastBuildForCommit.id, 'build in progress')
- } else {
- return options.logger.info(`Unknown build state: "${lastState}", stopping polling`)
- }
- } else {
- options.logger.warn(`Was not able to find matching build by last commit, will do check #${checkNumber + 1} in 30 seconds`)
- }
-
- setTimeout(pollTravisBuildBySha, 30 * 1000, options, checkNumber + 1)
- })
-}
-
-function createGhStatusFn (options) {
- return (state, travisId, message) => {
- githubClient.repos.createStatus({
- owner: options.owner,
- repo: options.repo,
- sha: options.lastCommit.sha,
- target_url: `https://travis-ci.org/${options.owner}/${options.repo}/builds/${travisId}`,
- context: 'Travis CI via nodejs-github-bot',
- state: state,
- description: message
- }, (err, res) => {
- if (err) {
- return options.logger.error(err, 'Error while updating GitHub PR status')
- }
- options.logger.info('Github PR status updated')
- })
- }
-}
diff --git a/lib/push-jenkins-update.js b/lib/push-jenkins-update.js
index 20ffe499..a2ec9cde 100644
--- a/lib/push-jenkins-update.js
+++ b/lib/push-jenkins-update.js
@@ -1,21 +1,35 @@
-'use strict'
+import githubClient from './github-client.js'
+import { createPrComment } from './github-comment.js'
-const githubClient = require('./github-client')
-
-function pushStarted (options, build) {
+export function pushStarted (options, build, cb) {
const pr = findPrInRef(build.ref)
// create unique logger which is easily traceable for every subsequent log statement
- const traceFields = { pr, job: build.identifier, status: build.status }
+ const traceFields = { pr, job: build.identifier, gitRef: build.ref, status: build.status }
const logger = options.logger.child(traceFields, true)
const optsWithPr = Object.assign({ pr }, options)
- findLatestCommitInPr(optsWithPr, (err, latestCommit) => {
- if (err) {
- return logger.error(err, 'Got error when retrieving GitHub commits for PR')
+ if (build.status === 'pending') {
+ switch (build.identifier) {
+ case 'node-test-pull-request':
+ createPrComment(Object.assign({ issue_number: pr }, options), `CI: ${build.url}`)
+ break
+
+ case 'node-test-commit-v8-linux':
+ createPrComment(Object.assign({ issue_number: pr }, options), `V8 CI: ${build.url}`)
+ break
+
+ case 'node-test-pull-request-lite-pipeline':
+ createPrComment(Object.assign({ issue_number: pr }, options), `Lite-CI: ${build.url}`)
+ break
+
+ default:
+ break
}
+ }
+ findLatestCommitInPr(optsWithPr).then(latestCommit => {
const statusOpts = Object.assign({
sha: latestCommit.sha,
url: build.url,
@@ -24,24 +38,23 @@ function pushStarted (options, build) {
message: build.message || 'running tests'
}, options)
- createGhStatus(statusOpts, logger)
+ createGhStatus(statusOpts, logger).then(cb).catch(cb)
+ }, err => {
+ logger.error(err, 'Got error when retrieving GitHub commits for PR')
+ return cb(err)
})
}
-function pushEnded (options, build) {
+export function pushEnded (options, build, cb) {
const pr = findPrInRef(build.ref)
// create unique logger which is easily traceable for every subsequent log statement
- const traceFields = { pr, job: build.identifier, status: build.status }
+ const traceFields = { pr, job: build.identifier, gitRef: build.ref, status: build.status }
const logger = options.logger.child(traceFields, true)
const optsWithPr = Object.assign({ pr }, options)
- findLatestCommitInPr(optsWithPr, (err, latestCommit) => {
- if (err) {
- return logger.error(err, 'Got error when retrieving GitHub commits for PR')
- }
-
+ findLatestCommitInPr(optsWithPr).then(latestCommit => {
const statusOpts = Object.assign({
sha: latestCommit.sha,
url: build.url,
@@ -50,57 +63,54 @@ function pushEnded (options, build) {
message: build.message || 'all tests passed'
}, options)
- createGhStatus(statusOpts, logger)
+ createGhStatus(statusOpts, logger).then(cb, cb)
+ }, err => {
+ logger.error(err, 'Got error when retrieving GitHub commits for PR')
+ return cb(err)
})
}
function findPrInRef (gitRef) {
// refs/pull/12345/head
- return gitRef.split('/')[2]
+ return parseInt(gitRef.split('/')[2], 10)
}
-function findLatestCommitInPr (options, cb) {
- githubClient.pullRequests.getCommits({
+export async function findLatestCommitInPr (options) {
+ const paginateOptions = githubClient.pulls.listCommits.endpoint.merge({
owner: options.owner,
repo: options.repo,
- number: options.pr
- }, (err, commitMetas) => {
- if (err) {
- return cb(err)
- }
+ pull_number: options.pr
+ })
+ const commitMetas = await githubClient.paginate(paginateOptions)
- const lastCommitMeta = commitMetas.pop()
- const lastCommit = {
- sha: lastCommitMeta.sha,
- date: lastCommitMeta.commit.committer.date
- }
+ const lastCommitMeta = commitMetas.pop()
+ const lastCommit = {
+ sha: lastCommitMeta.sha,
+ date: lastCommitMeta.commit.committer.date
+ }
- cb(null, lastCommit)
- })
+ return lastCommit
}
-function createGhStatus (options, logger) {
- githubClient.repos.createStatus({
- owner: options.owner,
- repo: options.repo,
- sha: options.sha,
- target_url: options.url,
- context: options.context,
- state: options.state,
- description: options.message
- }, (err, res) => {
- if (err) {
- return logger.error(err, 'Error while updating Jenkins / GitHub PR status')
- }
- logger.info('Jenkins / Github PR status updated')
- })
+async function createGhStatus (options, logger) {
+ try {
+ await githubClient.repos.createCommitStatus({
+ owner: options.owner,
+ repo: options.repo,
+ sha: options.sha,
+ target_url: options.url,
+ context: options.context,
+ state: options.state,
+ description: options.message
+ })
+ } catch (err) {
+ logger.error(err, 'Error while updating Jenkins / GitHub PR status')
+ throw err
+ }
+ logger.info('Jenkins / Github PR status updated')
}
-function validate (payload) {
+export function validate (payload) {
const isString = (param) => typeof (payload[param]) === 'string'
return ['identifier', 'status', 'message', 'commit', 'url'].every(isString)
}
-
-exports.validate = validate
-exports.pushStarted = pushStarted
-exports.pushEnded = pushEnded
diff --git a/logs/.gitignore b/logs/.gitignore
deleted file mode 100644
index d6b7ef32..00000000
--- a/logs/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-*
-!.gitignore
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 00000000..71f43f24
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,5074 @@
+{
+ "name": "nodejs-github-bot",
+ "version": "1.0.0-beta1",
+ "lockfileVersion": 3,
+ "requires": true,
+ "packages": {
+ "": {
+ "name": "nodejs-github-bot",
+ "version": "1.0.0-beta1",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/rest": "^22.0.0",
+ "aigle": "^1.14.1",
+ "basic-auth": "^2.0.1",
+ "body-parser": "^2.2.0",
+ "bunyan": "^1.8.1",
+ "bunyan-middleware": "1.0.2",
+ "codeowners-utils": "^1.0.2",
+ "debug": "^4.4.1",
+ "dotenv": "^17.2.0",
+ "events-async": "^1.2.1",
+ "express": "^5.1.0",
+ "glob": "11.0.3"
+ },
+ "devDependencies": {
+ "eventsource": "^4.0.0",
+ "fetch-mock": "^12.5.3",
+ "nock": "^14.0.10",
+ "nodemon": "^3.1.10",
+ "standard": "^17.1.2",
+ "supertest": "^7.1.4"
+ },
+ "engines": {
+ "node": ">= 20.11.0"
+ }
+ },
+ "node_modules/@aashutoshrathi/word-wrap": {
+ "version": "1.2.6",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/@eslint-community/eslint-utils": {
+ "version": "4.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^3.3.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0"
+ }
+ },
+ "node_modules/@eslint-community/regexpp": {
+ "version": "4.5.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.0.0 || ^14.0.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@eslint/eslintrc": {
+ "version": "2.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ajv": "^6.12.4",
+ "debug": "^4.3.2",
+ "espree": "^9.6.0",
+ "globals": "^13.19.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.2.1",
+ "js-yaml": "^4.1.0",
+ "minimatch": "^3.1.2",
+ "strip-json-comments": "^3.1.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/argparse": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/@eslint/eslintrc/node_modules/globals": {
+ "version": "13.20.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/@eslint/eslintrc/node_modules/type-fest": {
+ "version": "0.20.2",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/@eslint/js": {
+ "version": "8.44.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/@humanwhocodes/config-array": {
+ "version": "0.11.10",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "@humanwhocodes/object-schema": "^1.2.1",
+ "debug": "^4.1.1",
+ "minimatch": "^3.0.5"
+ },
+ "engines": {
+ "node": ">=10.10.0"
+ }
+ },
+ "node_modules/@humanwhocodes/module-importer": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=12.22"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/nzakas"
+ }
+ },
+ "node_modules/@humanwhocodes/object-schema": {
+ "version": "1.2.1",
+ "dev": true,
+ "license": "BSD-3-Clause"
+ },
+ "node_modules/@isaacs/balanced-match": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@isaacs/balanced-match/-/balanced-match-4.0.1.tgz",
+ "integrity": "sha512-yzMTt9lEb8Gv7zRioUilSglI0c0smZ9k5D65677DLWLtWJaXIS3CqcGyUFByYKlnUj6TkjLVs54fBl6+TiGQDQ==",
+ "license": "MIT",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/@isaacs/brace-expansion": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/@isaacs/brace-expansion/-/brace-expansion-5.0.0.tgz",
+ "integrity": "sha512-ZT55BDLV0yv0RBm2czMiZ+SqCGO7AvmOM3G/w2xhVPH+te0aKgFjmBvGlL1dH+ql2tgGO3MVrbb3jCKyvpgnxA==",
+ "license": "MIT",
+ "dependencies": {
+ "@isaacs/balanced-match": "^4.0.1"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/@isaacs/cliui": {
+ "version": "8.0.2",
+ "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz",
+ "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==",
+ "license": "ISC",
+ "dependencies": {
+ "string-width": "^5.1.2",
+ "string-width-cjs": "npm:string-width@^4.2.0",
+ "strip-ansi": "^7.0.1",
+ "strip-ansi-cjs": "npm:strip-ansi@^6.0.1",
+ "wrap-ansi": "^8.1.0",
+ "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0"
+ },
+ "engines": {
+ "node": ">=12"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/@isaacs/cliui/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/@mswjs/interceptors": {
+ "version": "0.39.5",
+ "resolved": "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.39.5.tgz",
+ "integrity": "sha512-B9nHSJYtsv79uo7QdkZ/b/WoKm20IkVSmTc/WCKarmDtFwM0dRx2ouEniqwNkzCSLn3fydzKmnMzjtfdOWt3VQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@open-draft/deferred-promise": "^2.2.0",
+ "@open-draft/logger": "^0.3.0",
+ "@open-draft/until": "^2.0.0",
+ "is-node-process": "^1.2.0",
+ "outvariant": "^1.4.3",
+ "strict-event-emitter": "^0.5.1"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/@noble/hashes": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz",
+ "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": "^14.21.3 || >=16"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ }
+ },
+ "node_modules/@nodelib/fs.scandir": {
+ "version": "2.1.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.stat": "2.0.5",
+ "run-parallel": "^1.1.9"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.stat": {
+ "version": "2.0.5",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@nodelib/fs.walk": {
+ "version": "1.2.8",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@nodelib/fs.scandir": "2.1.5",
+ "fastq": "^1.6.0"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/@octokit/auth-token": {
+ "version": "6.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@octokit/core": {
+ "version": "7.0.2",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/auth-token": "^6.0.0",
+ "@octokit/graphql": "^9.0.1",
+ "@octokit/request": "^10.0.2",
+ "@octokit/request-error": "^7.0.0",
+ "@octokit/types": "^14.0.0",
+ "before-after-hook": "^4.0.0",
+ "universal-user-agent": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@octokit/endpoint": {
+ "version": "11.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/types": "^14.0.0",
+ "universal-user-agent": "^7.0.2"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@octokit/graphql": {
+ "version": "9.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/request": "^10.0.2",
+ "@octokit/types": "^14.0.0",
+ "universal-user-agent": "^7.0.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@octokit/openapi-types": {
+ "version": "25.1.0",
+ "license": "MIT"
+ },
+ "node_modules/@octokit/plugin-paginate-rest": {
+ "version": "13.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/types": "^14.1.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=6"
+ }
+ },
+ "node_modules/@octokit/plugin-request-log": {
+ "version": "6.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 20"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=6"
+ }
+ },
+ "node_modules/@octokit/plugin-rest-endpoint-methods": {
+ "version": "16.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/types": "^14.1.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ },
+ "peerDependencies": {
+ "@octokit/core": ">=6"
+ }
+ },
+ "node_modules/@octokit/request": {
+ "version": "10.0.2",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/endpoint": "^11.0.0",
+ "@octokit/request-error": "^7.0.0",
+ "@octokit/types": "^14.0.0",
+ "fast-content-type-parse": "^3.0.0",
+ "universal-user-agent": "^7.0.2"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@octokit/request-error": {
+ "version": "7.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/types": "^14.0.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@octokit/rest": {
+ "version": "22.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/core": "^7.0.2",
+ "@octokit/plugin-paginate-rest": "^13.0.1",
+ "@octokit/plugin-request-log": "^6.0.0",
+ "@octokit/plugin-rest-endpoint-methods": "^16.0.0"
+ },
+ "engines": {
+ "node": ">= 20"
+ }
+ },
+ "node_modules/@octokit/types": {
+ "version": "14.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "@octokit/openapi-types": "^25.1.0"
+ }
+ },
+ "node_modules/@open-draft/deferred-promise": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/@open-draft/deferred-promise/-/deferred-promise-2.2.0.tgz",
+ "integrity": "sha512-CecwLWx3rhxVQF6V4bAgPS5t+So2sTbPgAzafKkVizyi7tlwpcFpdFqq+wqF2OwNBmqFuu6tOyouTuxgpMfzmA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@open-draft/logger": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/@open-draft/logger/-/logger-0.3.0.tgz",
+ "integrity": "sha512-X2g45fzhxH238HKO4xbSr7+wBS8Fvw6ixhTDuvLd5mqh6bJJCFAPwU9mPDxbcrRtfxv4u5IHCEH77BmxvXmmxQ==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-node-process": "^1.2.0",
+ "outvariant": "^1.4.0"
+ }
+ },
+ "node_modules/@open-draft/until": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/@open-draft/until/-/until-2.1.0.tgz",
+ "integrity": "sha512-U69T3ItWHvLwGg5eJ0n3I62nWuE6ilHlmz7zM0npLBRvPRd7e6NYmg54vvRtP5mZG7kZqZCFVdsTWo7BPtBujg==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@paralleldrive/cuid2": {
+ "version": "2.2.2",
+ "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz",
+ "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@noble/hashes": "^1.1.5"
+ }
+ },
+ "node_modules/@types/body-parser": {
+ "version": "1.19.2",
+ "license": "MIT",
+ "dependencies": {
+ "@types/connect": "*",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/bunyan": {
+ "version": "1.8.8",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/connect": {
+ "version": "3.4.35",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*"
+ }
+ },
+ "node_modules/@types/express": {
+ "version": "4.17.13",
+ "license": "MIT",
+ "dependencies": {
+ "@types/body-parser": "*",
+ "@types/express-serve-static-core": "^4.17.18",
+ "@types/qs": "*",
+ "@types/serve-static": "*"
+ }
+ },
+ "node_modules/@types/express-serve-static-core": {
+ "version": "4.17.28",
+ "license": "MIT",
+ "dependencies": {
+ "@types/node": "*",
+ "@types/qs": "*",
+ "@types/range-parser": "*"
+ }
+ },
+ "node_modules/@types/glob-to-regexp": {
+ "version": "0.4.4",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/json5": {
+ "version": "0.0.29",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/@types/mime": {
+ "version": "1.3.2",
+ "license": "MIT"
+ },
+ "node_modules/@types/node": {
+ "version": "17.0.23",
+ "license": "MIT"
+ },
+ "node_modules/@types/qs": {
+ "version": "6.9.7",
+ "license": "MIT"
+ },
+ "node_modules/@types/range-parser": {
+ "version": "1.2.4",
+ "license": "MIT"
+ },
+ "node_modules/@types/serve-static": {
+ "version": "1.13.10",
+ "license": "MIT",
+ "dependencies": {
+ "@types/mime": "^1",
+ "@types/node": "*"
+ }
+ },
+ "node_modules/abbrev": {
+ "version": "1.1.1",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/accepts": {
+ "version": "2.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "mime-types": "^3.0.0",
+ "negotiator": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/accepts/node_modules/mime-db": {
+ "version": "1.54.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/accepts/node_modules/mime-types": {
+ "version": "3.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/acorn": {
+ "version": "8.12.1",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "acorn": "bin/acorn"
+ },
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/acorn-jsx": {
+ "version": "5.3.2",
+ "dev": true,
+ "license": "MIT",
+ "peerDependencies": {
+ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/aigle": {
+ "version": "1.14.1",
+ "license": "MIT",
+ "dependencies": {
+ "aigle-core": "^1.0.0"
+ }
+ },
+ "node_modules/aigle-core": {
+ "version": "1.0.0",
+ "license": "MIT"
+ },
+ "node_modules/ajv": {
+ "version": "6.12.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fast-deep-equal": "^3.1.1",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.4.1",
+ "uri-js": "^4.2.2"
+ },
+ "funding": {
+ "type": "github",
+ "url": "https://github.com/sponsors/epoberezkin"
+ }
+ },
+ "node_modules/ansi-regex": {
+ "version": "5.0.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/ansi-styles": {
+ "version": "6.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz",
+ "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/anymatch": {
+ "version": "3.1.2",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "normalize-path": "^3.0.0",
+ "picomatch": "^2.0.4"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/array-buffer-byte-length": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "is-array-buffer": "^3.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array-includes": {
+ "version": "3.1.8",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "is-string": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.findlast": {
+ "version": "1.2.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flat": {
+ "version": "1.3.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.1.4",
+ "es-abstract": "^1.20.4",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.flatmap": {
+ "version": "1.3.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "es-shim-unscopables": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/array.prototype.tosorted": {
+ "version": "1.1.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-shim-unscopables": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/arraybuffer.prototype.slice": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.22.3",
+ "es-errors": "^1.2.1",
+ "get-intrinsic": "^1.2.3",
+ "is-array-buffer": "^3.0.4",
+ "is-shared-array-buffer": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/asap": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz",
+ "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/available-typed-arrays": {
+ "version": "1.0.7",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/balanced-match": {
+ "version": "1.0.2",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/basic-auth": {
+ "version": "2.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.1.2"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/basic-auth/node_modules/safe-buffer": {
+ "version": "5.1.2",
+ "license": "MIT"
+ },
+ "node_modules/before-after-hook": {
+ "version": "4.0.0",
+ "license": "Apache-2.0"
+ },
+ "node_modules/binary-extensions": {
+ "version": "2.2.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/body-parser": {
+ "version": "2.2.0",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "^3.1.2",
+ "content-type": "^1.0.5",
+ "debug": "^4.4.0",
+ "http-errors": "^2.0.0",
+ "iconv-lite": "^0.6.3",
+ "on-finished": "^2.4.1",
+ "qs": "^6.14.0",
+ "raw-body": "^3.0.0",
+ "type-is": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18"
+ }
+ },
+ "node_modules/brace-expansion": {
+ "version": "1.1.11",
+ "devOptional": true,
+ "license": "MIT",
+ "dependencies": {
+ "balanced-match": "^1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "node_modules/braces": {
+ "version": "3.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "fill-range": "^7.1.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/builtins": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.0.0"
+ }
+ },
+ "node_modules/bunyan": {
+ "version": "1.8.15",
+ "engines": [
+ "node >=0.10.0"
+ ],
+ "license": "MIT",
+ "bin": {
+ "bunyan": "bin/bunyan"
+ },
+ "optionalDependencies": {
+ "dtrace-provider": "~0.8",
+ "moment": "^2.19.3",
+ "mv": "~2",
+ "safe-json-stringify": "~1"
+ }
+ },
+ "node_modules/bunyan-middleware": {
+ "version": "1.0.2",
+ "license": "MIT",
+ "dependencies": {
+ "@types/bunyan": "^1.8.6",
+ "@types/express": "^4.0.35",
+ "uuid": "^8.3.2"
+ }
+ },
+ "node_modules/bytes": {
+ "version": "3.1.2",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/call-bind": {
+ "version": "1.0.7",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "set-function-length": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/call-bind-apply-helpers": {
+ "version": "1.0.2",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/call-bound": {
+ "version": "1.0.4",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "get-intrinsic": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/callsites": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/chokidar": {
+ "version": "3.6.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "anymatch": "~3.1.2",
+ "braces": "~3.0.2",
+ "glob-parent": "~5.1.2",
+ "is-binary-path": "~2.1.0",
+ "is-glob": "~4.0.1",
+ "normalize-path": "~3.0.0",
+ "readdirp": "~3.6.0"
+ },
+ "engines": {
+ "node": ">= 8.10.0"
+ },
+ "funding": {
+ "url": "https://paulmillr.com/funding/"
+ },
+ "optionalDependencies": {
+ "fsevents": "~2.3.2"
+ }
+ },
+ "node_modules/codeowners-utils": {
+ "version": "1.0.2",
+ "license": "MIT",
+ "dependencies": {
+ "cross-spawn": "^7.0.2",
+ "find-up": "^4.1.0",
+ "ignore": "^5.1.4",
+ "locate-path": "^5.0.0"
+ }
+ },
+ "node_modules/color-convert": {
+ "version": "2.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "color-name": "~1.1.4"
+ },
+ "engines": {
+ "node": ">=7.0.0"
+ }
+ },
+ "node_modules/color-name": {
+ "version": "1.1.4",
+ "license": "MIT"
+ },
+ "node_modules/combined-stream": {
+ "version": "1.0.8",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "delayed-stream": "~1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/component-emitter": {
+ "version": "1.3.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz",
+ "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/concat-map": {
+ "version": "0.0.1",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/content-disposition": {
+ "version": "1.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "safe-buffer": "5.2.1"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/content-type": {
+ "version": "1.0.5",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie": {
+ "version": "0.7.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/cookie-signature": {
+ "version": "1.2.2",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6.6.0"
+ }
+ },
+ "node_modules/cookiejar": {
+ "version": "2.1.4",
+ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz",
+ "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/cross-spawn": {
+ "version": "7.0.6",
+ "license": "MIT",
+ "dependencies": {
+ "path-key": "^3.1.0",
+ "shebang-command": "^2.0.0",
+ "which": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/data-view-buffer": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-length": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/data-view-byte-offset": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-data-view": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/debug": {
+ "version": "4.4.1",
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.3"
+ },
+ "engines": {
+ "node": ">=6.0"
+ },
+ "peerDependenciesMeta": {
+ "supports-color": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/deep-is": {
+ "version": "0.1.4",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/define-data-property": {
+ "version": "1.1.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/define-properties": {
+ "version": "1.2.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.0.1",
+ "has-property-descriptors": "^1.0.0",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.4.0"
+ }
+ },
+ "node_modules/depd": {
+ "version": "2.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/dequal": {
+ "version": "2.0.3",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/dezalgo": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz",
+ "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "asap": "^2.0.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/doctrine": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=6.0.0"
+ }
+ },
+ "node_modules/dotenv": {
+ "version": "17.2.0",
+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-17.2.0.tgz",
+ "integrity": "sha512-Q4sgBT60gzd0BB0lSyYD3xM4YxrXA9y4uBDof1JNYGzOXrQdQ6yX+7XIAqoFOGQFOTK1D3Hts5OllpxMDZFONQ==",
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://dotenvx.com"
+ }
+ },
+ "node_modules/dtrace-provider": {
+ "version": "0.8.8",
+ "hasInstallScript": true,
+ "license": "BSD-2-Clause",
+ "optional": true,
+ "dependencies": {
+ "nan": "^2.14.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/dunder-proto": {
+ "version": "1.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "gopd": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/eastasianwidth": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz",
+ "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==",
+ "license": "MIT"
+ },
+ "node_modules/ee-first": {
+ "version": "1.1.1",
+ "license": "MIT"
+ },
+ "node_modules/emoji-regex": {
+ "version": "9.2.2",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz",
+ "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==",
+ "license": "MIT"
+ },
+ "node_modules/encodeurl": {
+ "version": "2.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/error-ex": {
+ "version": "1.3.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-arrayish": "^0.2.1"
+ }
+ },
+ "node_modules/es-abstract": {
+ "version": "1.23.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-buffer-byte-length": "^1.0.1",
+ "arraybuffer.prototype.slice": "^1.0.3",
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "data-view-buffer": "^1.0.1",
+ "data-view-byte-length": "^1.0.1",
+ "data-view-byte-offset": "^1.0.0",
+ "es-define-property": "^1.0.0",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "es-set-tostringtag": "^2.0.3",
+ "es-to-primitive": "^1.2.1",
+ "function.prototype.name": "^1.1.6",
+ "get-intrinsic": "^1.2.4",
+ "get-symbol-description": "^1.0.2",
+ "globalthis": "^1.0.3",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.0.3",
+ "has-symbols": "^1.0.3",
+ "hasown": "^2.0.2",
+ "internal-slot": "^1.0.7",
+ "is-array-buffer": "^3.0.4",
+ "is-callable": "^1.2.7",
+ "is-data-view": "^1.0.1",
+ "is-negative-zero": "^2.0.3",
+ "is-regex": "^1.1.4",
+ "is-shared-array-buffer": "^1.0.3",
+ "is-string": "^1.0.7",
+ "is-typed-array": "^1.1.13",
+ "is-weakref": "^1.0.2",
+ "object-inspect": "^1.13.1",
+ "object-keys": "^1.1.1",
+ "object.assign": "^4.1.5",
+ "regexp.prototype.flags": "^1.5.2",
+ "safe-array-concat": "^1.1.2",
+ "safe-regex-test": "^1.0.3",
+ "string.prototype.trim": "^1.2.9",
+ "string.prototype.trimend": "^1.0.8",
+ "string.prototype.trimstart": "^1.0.8",
+ "typed-array-buffer": "^1.0.2",
+ "typed-array-byte-length": "^1.0.1",
+ "typed-array-byte-offset": "^1.0.2",
+ "typed-array-length": "^1.0.6",
+ "unbox-primitive": "^1.0.2",
+ "which-typed-array": "^1.1.15"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/es-define-property": {
+ "version": "1.0.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-errors": {
+ "version": "1.3.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-iterator-helpers": {
+ "version": "1.0.19",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.3",
+ "es-errors": "^1.3.0",
+ "es-set-tostringtag": "^2.0.3",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "globalthis": "^1.0.3",
+ "has-property-descriptors": "^1.0.2",
+ "has-proto": "^1.0.3",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.7",
+ "iterator.prototype": "^1.1.2",
+ "safe-array-concat": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-object-atoms": {
+ "version": "1.1.1",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-set-tostringtag": {
+ "version": "2.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.6",
+ "has-tostringtag": "^1.0.2",
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/es-shim-unscopables": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.0"
+ }
+ },
+ "node_modules/es-to-primitive": {
+ "version": "1.2.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.1.4",
+ "is-date-object": "^1.0.1",
+ "is-symbol": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/escape-html": {
+ "version": "1.0.3",
+ "license": "MIT"
+ },
+ "node_modules/eslint": {
+ "version": "8.44.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@eslint-community/eslint-utils": "^4.2.0",
+ "@eslint-community/regexpp": "^4.4.0",
+ "@eslint/eslintrc": "^2.1.0",
+ "@eslint/js": "8.44.0",
+ "@humanwhocodes/config-array": "^0.11.10",
+ "@humanwhocodes/module-importer": "^1.0.1",
+ "@nodelib/fs.walk": "^1.2.8",
+ "ajv": "^6.10.0",
+ "chalk": "^4.0.0",
+ "cross-spawn": "^7.0.2",
+ "debug": "^4.3.2",
+ "doctrine": "^3.0.0",
+ "escape-string-regexp": "^4.0.0",
+ "eslint-scope": "^7.2.0",
+ "eslint-visitor-keys": "^3.4.1",
+ "espree": "^9.6.0",
+ "esquery": "^1.4.2",
+ "esutils": "^2.0.2",
+ "fast-deep-equal": "^3.1.3",
+ "file-entry-cache": "^6.0.1",
+ "find-up": "^5.0.0",
+ "glob-parent": "^6.0.2",
+ "globals": "^13.19.0",
+ "graphemer": "^1.4.0",
+ "ignore": "^5.2.0",
+ "import-fresh": "^3.0.0",
+ "imurmurhash": "^0.1.4",
+ "is-glob": "^4.0.0",
+ "is-path-inside": "^3.0.3",
+ "js-yaml": "^4.1.0",
+ "json-stable-stringify-without-jsonify": "^1.0.1",
+ "levn": "^0.4.1",
+ "lodash.merge": "^4.6.2",
+ "minimatch": "^3.1.2",
+ "natural-compare": "^1.4.0",
+ "optionator": "^0.9.3",
+ "strip-ansi": "^6.0.1",
+ "strip-json-comments": "^3.1.0",
+ "text-table": "^0.2.0"
+ },
+ "bin": {
+ "eslint": "bin/eslint.js"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-config-standard": {
+ "version": "17.1.0",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "engines": {
+ "node": ">=12.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^8.0.1",
+ "eslint-plugin-import": "^2.25.2",
+ "eslint-plugin-n": "^15.0.0 || ^16.0.0 ",
+ "eslint-plugin-promise": "^6.0.0"
+ }
+ },
+ "node_modules/eslint-config-standard-jsx": {
+ "version": "11.0.0",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "peerDependencies": {
+ "eslint": "^8.8.0",
+ "eslint-plugin-react": "^7.28.0"
+ }
+ },
+ "node_modules/eslint-import-resolver-node": {
+ "version": "0.3.7",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7",
+ "is-core-module": "^2.11.0",
+ "resolve": "^1.22.1"
+ }
+ },
+ "node_modules/eslint-import-resolver-node/node_modules/debug": {
+ "version": "3.2.7",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-module-utils": {
+ "version": "2.8.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^3.2.7"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependenciesMeta": {
+ "eslint": {
+ "optional": true
+ }
+ }
+ },
+ "node_modules/eslint-module-utils/node_modules/debug": {
+ "version": "3.2.7",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-es": {
+ "version": "4.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-utils": "^2.0.0",
+ "regexpp": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=4.19.1"
+ }
+ },
+ "node_modules/eslint-plugin-es/node_modules/eslint-utils": {
+ "version": "2.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "node_modules/eslint-plugin-es/node_modules/eslint-visitor-keys": {
+ "version": "1.3.0",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/eslint-plugin-import": {
+ "version": "2.27.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "array.prototype.flatmap": "^1.3.1",
+ "debug": "^3.2.7",
+ "doctrine": "^2.1.0",
+ "eslint-import-resolver-node": "^0.3.7",
+ "eslint-module-utils": "^2.7.4",
+ "has": "^1.0.3",
+ "is-core-module": "^2.11.0",
+ "is-glob": "^4.0.3",
+ "minimatch": "^3.1.2",
+ "object.values": "^1.1.6",
+ "resolve": "^1.22.1",
+ "semver": "^6.3.0",
+ "tsconfig-paths": "^3.14.1"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/debug": {
+ "version": "3.2.7",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ms": "^2.1.1"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/doctrine": {
+ "version": "2.1.0",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-import/node_modules/semver": {
+ "version": "6.3.1",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-plugin-n": {
+ "version": "15.7.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "builtins": "^5.0.1",
+ "eslint-plugin-es": "^4.1.0",
+ "eslint-utils": "^3.0.0",
+ "ignore": "^5.1.1",
+ "is-core-module": "^2.11.0",
+ "minimatch": "^3.1.2",
+ "resolve": "^1.22.1",
+ "semver": "^7.3.8"
+ },
+ "engines": {
+ "node": ">=12.22.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=7.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-promise": {
+ "version": "6.1.1",
+ "dev": true,
+ "license": "ISC",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "peerDependencies": {
+ "eslint": "^7.0.0 || ^8.0.0"
+ }
+ },
+ "node_modules/eslint-plugin-react": {
+ "version": "7.36.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.8",
+ "array.prototype.findlast": "^1.2.5",
+ "array.prototype.flatmap": "^1.3.2",
+ "array.prototype.tosorted": "^1.1.4",
+ "doctrine": "^2.1.0",
+ "es-iterator-helpers": "^1.0.19",
+ "estraverse": "^5.3.0",
+ "hasown": "^2.0.2",
+ "jsx-ast-utils": "^2.4.1 || ^3.0.0",
+ "minimatch": "^3.1.2",
+ "object.entries": "^1.1.8",
+ "object.fromentries": "^2.0.8",
+ "object.values": "^1.2.0",
+ "prop-types": "^15.8.1",
+ "resolve": "^2.0.0-next.5",
+ "semver": "^6.3.1",
+ "string.prototype.matchall": "^4.0.11",
+ "string.prototype.repeat": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ },
+ "peerDependencies": {
+ "eslint": "^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/doctrine": {
+ "version": "2.1.0",
+ "dev": true,
+ "license": "Apache-2.0",
+ "dependencies": {
+ "esutils": "^2.0.2"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/resolve": {
+ "version": "2.0.0-next.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.13.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/eslint-plugin-react/node_modules/semver": {
+ "version": "6.3.1",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ }
+ },
+ "node_modules/eslint-scope": {
+ "version": "7.2.0",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "esrecurse": "^4.3.0",
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint-utils": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eslint-visitor-keys": "^2.0.0"
+ },
+ "engines": {
+ "node": "^10.0.0 || ^12.0.0 || >= 14.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ },
+ "peerDependencies": {
+ "eslint": ">=5"
+ }
+ },
+ "node_modules/eslint-utils/node_modules/eslint-visitor-keys": {
+ "version": "2.1.0",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/eslint-visitor-keys": {
+ "version": "3.4.1",
+ "dev": true,
+ "license": "Apache-2.0",
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/eslint/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/argparse": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "Python-2.0"
+ },
+ "node_modules/eslint/node_modules/chalk": {
+ "version": "4.1.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.1.0",
+ "supports-color": "^7.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/chalk?sponsor=1"
+ }
+ },
+ "node_modules/eslint/node_modules/escape-string-regexp": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/find-up": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^6.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/glob-parent": {
+ "version": "6.0.2",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.3"
+ },
+ "engines": {
+ "node": ">=10.13.0"
+ }
+ },
+ "node_modules/eslint/node_modules/globals": {
+ "version": "13.20.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "type-fest": "^0.20.2"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/has-flag": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/js-yaml": {
+ "version": "4.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "argparse": "^2.0.1"
+ },
+ "bin": {
+ "js-yaml": "bin/js-yaml.js"
+ }
+ },
+ "node_modules/eslint/node_modules/locate-path": {
+ "version": "6.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^5.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/p-limit": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "yocto-queue": "^0.1.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/p-locate": {
+ "version": "5.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^3.0.2"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/eslint/node_modules/supports-color": {
+ "version": "7.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/eslint/node_modules/type-fest": {
+ "version": "0.20.2",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/espree": {
+ "version": "9.6.0",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "acorn": "^8.9.0",
+ "acorn-jsx": "^5.3.2",
+ "eslint-visitor-keys": "^3.4.1"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ },
+ "funding": {
+ "url": "https://opencollective.com/eslint"
+ }
+ },
+ "node_modules/esquery": {
+ "version": "1.5.0",
+ "dev": true,
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "estraverse": "^5.1.0"
+ },
+ "engines": {
+ "node": ">=0.10"
+ }
+ },
+ "node_modules/esrecurse": {
+ "version": "4.3.0",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "estraverse": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/estraverse": {
+ "version": "5.3.0",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/esutils": {
+ "version": "2.0.3",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/etag": {
+ "version": "1.8.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/events-async": {
+ "version": "1.2.1",
+ "license": "ISC"
+ },
+ "node_modules/eventsource": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "eventsource-parser": "^3.0.1"
+ },
+ "engines": {
+ "node": ">=20.0.0"
+ }
+ },
+ "node_modules/eventsource-parser": {
+ "version": "3.0.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=18.0.0"
+ }
+ },
+ "node_modules/express": {
+ "version": "5.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "accepts": "^2.0.0",
+ "body-parser": "^2.2.0",
+ "content-disposition": "^1.0.0",
+ "content-type": "^1.0.5",
+ "cookie": "^0.7.1",
+ "cookie-signature": "^1.2.1",
+ "debug": "^4.4.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "finalhandler": "^2.1.0",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.0",
+ "merge-descriptors": "^2.0.0",
+ "mime-types": "^3.0.0",
+ "on-finished": "^2.4.1",
+ "once": "^1.4.0",
+ "parseurl": "^1.3.3",
+ "proxy-addr": "^2.0.7",
+ "qs": "^6.14.0",
+ "range-parser": "^1.2.1",
+ "router": "^2.2.0",
+ "send": "^1.1.0",
+ "serve-static": "^2.2.0",
+ "statuses": "^2.0.1",
+ "type-is": "^2.0.1",
+ "vary": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 18"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/express"
+ }
+ },
+ "node_modules/express/node_modules/mime-db": {
+ "version": "1.54.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/express/node_modules/mime-types": {
+ "version": "3.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fast-content-type-parse": {
+ "version": "3.0.0",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/fastify"
+ },
+ {
+ "type": "opencollective",
+ "url": "https://opencollective.com/fastify"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/fast-deep-equal": {
+ "version": "3.1.3",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-json-stable-stringify": {
+ "version": "2.1.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-levenshtein": {
+ "version": "2.0.6",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fast-safe-stringify": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz",
+ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/fastq": {
+ "version": "1.15.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "reusify": "^1.0.4"
+ }
+ },
+ "node_modules/fetch-mock": {
+ "version": "12.5.3",
+ "resolved": "https://registry.npmjs.org/fetch-mock/-/fetch-mock-12.5.3.tgz",
+ "integrity": "sha512-SiqPv1IXvDjNjLWCvfFUltba3VeiYucxjyynoVW8Ft07GLFQRitlzjYZI/f5wZpeQFRIVZ84fmMgJfjwb/dAEA==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/glob-to-regexp": "^0.4.4",
+ "dequal": "^2.0.3",
+ "glob-to-regexp": "^0.4.1",
+ "regexparam": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=18.11.0"
+ }
+ },
+ "node_modules/file-entry-cache": {
+ "version": "6.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flat-cache": "^3.0.4"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/fill-range": {
+ "version": "7.1.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "to-regex-range": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/finalhandler": {
+ "version": "2.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.0",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "on-finished": "^2.4.1",
+ "parseurl": "^1.3.3",
+ "statuses": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/find-up": {
+ "version": "4.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^5.0.0",
+ "path-exists": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/flat-cache": {
+ "version": "3.0.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "flatted": "^3.1.0",
+ "rimraf": "^3.0.2"
+ },
+ "engines": {
+ "node": "^10.12.0 || >=12.0.0"
+ }
+ },
+ "node_modules/flat-cache/node_modules/glob": {
+ "version": "7.2.3",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "fs.realpath": "^1.0.0",
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "^3.1.1",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/flat-cache/node_modules/rimraf": {
+ "version": "3.0.2",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "glob": "^7.1.3"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/flatted": {
+ "version": "3.2.7",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/for-each": {
+ "version": "0.3.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-callable": "^1.1.3"
+ }
+ },
+ "node_modules/foreground-child": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz",
+ "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==",
+ "license": "ISC",
+ "dependencies": {
+ "cross-spawn": "^7.0.6",
+ "signal-exit": "^4.0.1"
+ },
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/form-data": {
+ "version": "4.0.4",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz",
+ "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "asynckit": "^0.4.0",
+ "combined-stream": "^1.0.8",
+ "es-set-tostringtag": "^2.1.0",
+ "hasown": "^2.0.2",
+ "mime-types": "^2.1.12"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/formidable": {
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz",
+ "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@paralleldrive/cuid2": "^2.2.2",
+ "dezalgo": "^1.0.4",
+ "once": "^1.4.0"
+ },
+ "engines": {
+ "node": ">=14.0.0"
+ },
+ "funding": {
+ "url": "https://ko-fi.com/tunnckoCore/commissions"
+ }
+ },
+ "node_modules/forwarded": {
+ "version": "0.2.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/fresh": {
+ "version": "2.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/fs.realpath": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/fsevents": {
+ "version": "2.3.2",
+ "dev": true,
+ "license": "MIT",
+ "optional": true,
+ "os": [
+ "darwin"
+ ],
+ "engines": {
+ "node": "^8.16.0 || ^10.6.0 || >=11.0.0"
+ }
+ },
+ "node_modules/function-bind": {
+ "version": "1.1.2",
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/function.prototype.name": {
+ "version": "1.1.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "define-properties": "^1.2.0",
+ "es-abstract": "^1.22.1",
+ "functions-have-names": "^1.2.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/functions-have-names": {
+ "version": "1.2.3",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-intrinsic": {
+ "version": "1.3.0",
+ "license": "MIT",
+ "dependencies": {
+ "call-bind-apply-helpers": "^1.0.2",
+ "es-define-property": "^1.0.1",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.1.1",
+ "function-bind": "^1.1.2",
+ "get-proto": "^1.0.1",
+ "gopd": "^1.2.0",
+ "has-symbols": "^1.1.0",
+ "hasown": "^2.0.2",
+ "math-intrinsics": "^1.1.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/get-proto": {
+ "version": "1.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "dunder-proto": "^1.0.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/get-stdin": {
+ "version": "8.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/get-symbol-description": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/glob": {
+ "version": "11.0.3",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-11.0.3.tgz",
+ "integrity": "sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==",
+ "license": "ISC",
+ "dependencies": {
+ "foreground-child": "^3.3.1",
+ "jackspeak": "^4.1.1",
+ "minimatch": "^10.0.3",
+ "minipass": "^7.1.2",
+ "package-json-from-dist": "^1.0.0",
+ "path-scurry": "^2.0.0"
+ },
+ "bin": {
+ "glob": "dist/esm/bin.mjs"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/glob-parent": {
+ "version": "5.1.2",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "is-glob": "^4.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/glob-to-regexp": {
+ "version": "0.4.1",
+ "dev": true,
+ "license": "BSD-2-Clause"
+ },
+ "node_modules/glob/node_modules/minimatch": {
+ "version": "10.0.3",
+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-10.0.3.tgz",
+ "integrity": "sha512-IPZ167aShDZZUMdRk66cyQAW3qr0WzbHkPdMYa8bzZhlHhO3jALbKdxcaak7W9FfT2rZNpQuUu4Od7ILEpXSaw==",
+ "license": "ISC",
+ "dependencies": {
+ "@isaacs/brace-expansion": "^5.0.0"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/globalthis": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/gopd": {
+ "version": "1.2.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/graceful-fs": {
+ "version": "4.2.10",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/graphemer": {
+ "version": "1.4.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/has": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4.0"
+ }
+ },
+ "node_modules/has-bigints": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-flag": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/has-property-descriptors": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-define-property": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-proto": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-symbols": {
+ "version": "1.1.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/has-tostringtag": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/hasown": {
+ "version": "2.0.2",
+ "license": "MIT",
+ "dependencies": {
+ "function-bind": "^1.1.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/http-errors": {
+ "version": "2.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "depd": "2.0.0",
+ "inherits": "2.0.4",
+ "setprototypeof": "1.2.0",
+ "statuses": "2.0.1",
+ "toidentifier": "1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/iconv-lite": {
+ "version": "0.6.3",
+ "license": "MIT",
+ "dependencies": {
+ "safer-buffer": ">= 2.1.2 < 3.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/ignore": {
+ "version": "5.2.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 4"
+ }
+ },
+ "node_modules/ignore-by-default": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/import-fresh": {
+ "version": "3.3.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "parent-module": "^1.0.0",
+ "resolve-from": "^4.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/imurmurhash": {
+ "version": "0.1.4",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.8.19"
+ }
+ },
+ "node_modules/inflight": {
+ "version": "1.0.6",
+ "devOptional": true,
+ "license": "ISC",
+ "dependencies": {
+ "once": "^1.3.0",
+ "wrappy": "1"
+ }
+ },
+ "node_modules/inherits": {
+ "version": "2.0.4",
+ "license": "ISC"
+ },
+ "node_modules/internal-slot": {
+ "version": "1.0.7",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "hasown": "^2.0.0",
+ "side-channel": "^1.0.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/ipaddr.js": {
+ "version": "1.9.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/is-array-buffer": {
+ "version": "3.0.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "get-intrinsic": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-arrayish": {
+ "version": "0.2.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-async-function": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-bigint": {
+ "version": "1.0.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-bigints": "^1.0.1"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-binary-path": {
+ "version": "2.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "binary-extensions": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-boolean-object": {
+ "version": "1.1.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-callable": {
+ "version": "1.2.7",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-core-module": {
+ "version": "2.15.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "hasown": "^2.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-data-view": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-date-object": {
+ "version": "1.0.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-extglob": {
+ "version": "2.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-finalizationregistry": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-fullwidth-code-point": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz",
+ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-generator-function": {
+ "version": "1.0.10",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-glob": {
+ "version": "4.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-extglob": "^2.1.1"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/is-map": {
+ "version": "2.0.3",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-negative-zero": {
+ "version": "2.0.3",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-node-process": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/is-node-process/-/is-node-process-1.2.0.tgz",
+ "integrity": "sha512-Vg4o6/fqPxIjtxgUH5QLJhwZ7gW5diGCVlXpuUfELC62CuxM1iHcRe51f2W1FDy04Ai4KJkagKjx3XaqyfRKXw==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/is-number": {
+ "version": "7.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.12.0"
+ }
+ },
+ "node_modules/is-number-object": {
+ "version": "1.0.7",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-path-inside": {
+ "version": "3.0.3",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/is-promise": {
+ "version": "4.0.0",
+ "license": "MIT"
+ },
+ "node_modules/is-regex": {
+ "version": "1.1.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-set": {
+ "version": "2.0.3",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-shared-array-buffer": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-string": {
+ "version": "1.0.7",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-tostringtag": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-symbol": {
+ "version": "1.0.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-symbols": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-typed-array": {
+ "version": "1.1.13",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "which-typed-array": "^1.1.14"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakmap": {
+ "version": "2.0.2",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakref": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/is-weakset": {
+ "version": "2.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "get-intrinsic": "^1.2.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/isarray": {
+ "version": "2.0.5",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/isexe": {
+ "version": "2.0.0",
+ "license": "ISC"
+ },
+ "node_modules/iterator.prototype": {
+ "version": "1.1.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.2.1",
+ "get-intrinsic": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "reflect.getprototypeof": "^1.0.4",
+ "set-function-name": "^2.0.1"
+ }
+ },
+ "node_modules/jackspeak": {
+ "version": "4.1.1",
+ "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-4.1.1.tgz",
+ "integrity": "sha512-zptv57P3GpL+O0I7VdMJNBZCu+BPHVQUk55Ft8/QCJjTVxrnJHuVuX/0Bl2A6/+2oyR/ZMEuFKwmzqqZ/U5nPQ==",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "@isaacs/cliui": "^8.0.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/js-tokens": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-parse-better-errors": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-schema-traverse": {
+ "version": "0.4.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stable-stringify-without-jsonify": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/json-stringify-safe": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "ISC"
+ },
+ "node_modules/jsx-ast-utils": {
+ "version": "3.3.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "array-includes": "^3.1.6",
+ "array.prototype.flat": "^1.3.1",
+ "object.assign": "^4.1.4",
+ "object.values": "^1.1.6"
+ },
+ "engines": {
+ "node": ">=4.0"
+ }
+ },
+ "node_modules/levn": {
+ "version": "0.4.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1",
+ "type-check": "~0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/load-json-file": {
+ "version": "5.3.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "graceful-fs": "^4.1.15",
+ "parse-json": "^4.0.0",
+ "pify": "^4.0.1",
+ "strip-bom": "^3.0.0",
+ "type-fest": "^0.3.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/load-json-file/node_modules/type-fest": {
+ "version": "0.3.1",
+ "dev": true,
+ "license": "(MIT OR CC0-1.0)",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/locate-path": {
+ "version": "5.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^4.1.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/lodash.merge": {
+ "version": "4.6.2",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/loose-envify": {
+ "version": "1.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "js-tokens": "^3.0.0 || ^4.0.0"
+ },
+ "bin": {
+ "loose-envify": "cli.js"
+ }
+ },
+ "node_modules/math-intrinsics": {
+ "version": "1.1.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/media-typer": {
+ "version": "1.1.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/merge-descriptors": {
+ "version": "2.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=18"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime": {
+ "version": "2.6.0",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz",
+ "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==",
+ "dev": true,
+ "license": "MIT",
+ "bin": {
+ "mime": "cli.js"
+ },
+ "engines": {
+ "node": ">=4.0.0"
+ }
+ },
+ "node_modules/mime-db": {
+ "version": "1.52.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
+ "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/mime-types": {
+ "version": "2.1.35",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
+ "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "1.52.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/minimatch": {
+ "version": "3.1.2",
+ "devOptional": true,
+ "license": "ISC",
+ "dependencies": {
+ "brace-expansion": "^1.1.7"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/minimist": {
+ "version": "1.2.6",
+ "devOptional": true,
+ "license": "MIT"
+ },
+ "node_modules/minipass": {
+ "version": "7.1.2",
+ "license": "ISC",
+ "engines": {
+ "node": ">=16 || 14 >=14.17"
+ }
+ },
+ "node_modules/mkdirp": {
+ "version": "0.5.6",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "minimist": "^1.2.6"
+ },
+ "bin": {
+ "mkdirp": "bin/cmd.js"
+ }
+ },
+ "node_modules/moment": {
+ "version": "2.29.4",
+ "license": "MIT",
+ "optional": true,
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/ms": {
+ "version": "2.1.3",
+ "license": "MIT"
+ },
+ "node_modules/mv": {
+ "version": "2.1.1",
+ "license": "MIT",
+ "optional": true,
+ "dependencies": {
+ "mkdirp": "~0.5.1",
+ "ncp": "~2.0.0",
+ "rimraf": "~2.4.0"
+ },
+ "engines": {
+ "node": ">=0.8.0"
+ }
+ },
+ "node_modules/nan": {
+ "version": "2.15.0",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/natural-compare": {
+ "version": "1.4.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/ncp": {
+ "version": "2.0.0",
+ "license": "MIT",
+ "optional": true,
+ "bin": {
+ "ncp": "bin/ncp"
+ }
+ },
+ "node_modules/negotiator": {
+ "version": "1.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/nock": {
+ "version": "14.0.10",
+ "resolved": "https://registry.npmjs.org/nock/-/nock-14.0.10.tgz",
+ "integrity": "sha512-Q7HjkpyPeLa0ZVZC5qpxBt5EyLczFJ91MEewQiIi9taWuA0KB/MDJlUWtON+7dGouVdADTQsf9RA7TZk6D8VMw==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@mswjs/interceptors": "^0.39.5",
+ "json-stringify-safe": "^5.0.1",
+ "propagate": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=18.20.0 <20 || >=20.12.1"
+ }
+ },
+ "node_modules/nodemon": {
+ "version": "3.1.10",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "chokidar": "^3.5.2",
+ "debug": "^4",
+ "ignore-by-default": "^1.0.1",
+ "minimatch": "^3.1.2",
+ "pstree.remy": "^1.1.8",
+ "semver": "^7.5.3",
+ "simple-update-notifier": "^2.0.0",
+ "supports-color": "^5.5.0",
+ "touch": "^3.1.0",
+ "undefsafe": "^2.0.5"
+ },
+ "bin": {
+ "nodemon": "bin/nodemon.js"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/nodemon"
+ }
+ },
+ "node_modules/nopt": {
+ "version": "1.0.10",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "abbrev": "1"
+ },
+ "bin": {
+ "nopt": "bin/nopt.js"
+ }
+ },
+ "node_modules/normalize-path": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-assign": {
+ "version": "4.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/object-inspect": {
+ "version": "1.13.4",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object-keys": {
+ "version": "1.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.assign": {
+ "version": "4.1.5",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.5",
+ "define-properties": "^1.2.1",
+ "has-symbols": "^1.0.3",
+ "object-keys": "^1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.entries": {
+ "version": "1.1.8",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/object.fromentries": {
+ "version": "2.0.8",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/object.values": {
+ "version": "1.2.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/on-finished": {
+ "version": "2.4.1",
+ "license": "MIT",
+ "dependencies": {
+ "ee-first": "1.1.1"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/once": {
+ "version": "1.4.0",
+ "license": "ISC",
+ "dependencies": {
+ "wrappy": "1"
+ }
+ },
+ "node_modules/optionator": {
+ "version": "0.9.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@aashutoshrathi/word-wrap": "^1.2.3",
+ "deep-is": "^0.1.3",
+ "fast-levenshtein": "^2.0.6",
+ "levn": "^0.4.1",
+ "prelude-ls": "^1.2.1",
+ "type-check": "^0.4.0"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/outvariant": {
+ "version": "1.4.3",
+ "resolved": "https://registry.npmjs.org/outvariant/-/outvariant-1.4.3.tgz",
+ "integrity": "sha512-+Sl2UErvtsoajRDKCE5/dBz4DIvHXQQnAxtQTF04OJxY0+DyZXSo5P5Bb7XYWOh81syohlYL24hbDwxedPUJCA==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/p-limit": {
+ "version": "2.3.0",
+ "license": "MIT",
+ "dependencies": {
+ "p-try": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/p-locate": {
+ "version": "4.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.2.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/p-try": {
+ "version": "2.2.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/package-json-from-dist": {
+ "version": "1.0.0",
+ "license": "BlueOak-1.0.0"
+ },
+ "node_modules/parent-module": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "callsites": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/parse-json": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "error-ex": "^1.3.1",
+ "json-parse-better-errors": "^1.0.1"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/parseurl": {
+ "version": "1.3.3",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/path-exists": {
+ "version": "4.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-is-absolute": {
+ "version": "1.0.1",
+ "devOptional": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/path-key": {
+ "version": "3.1.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/path-parse": {
+ "version": "1.0.7",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/path-scurry": {
+ "version": "2.0.0",
+ "license": "BlueOak-1.0.0",
+ "dependencies": {
+ "lru-cache": "^11.0.0",
+ "minipass": "^7.1.2"
+ },
+ "engines": {
+ "node": "20 || >=22"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/path-scurry/node_modules/lru-cache": {
+ "version": "11.0.0",
+ "license": "ISC",
+ "engines": {
+ "node": "20 || >=22"
+ }
+ },
+ "node_modules/path-to-regexp": {
+ "version": "8.2.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=16"
+ }
+ },
+ "node_modules/picomatch": {
+ "version": "2.3.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/jonschlinkert"
+ }
+ },
+ "node_modules/pify": {
+ "version": "4.0.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-conf": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "find-up": "^3.0.0",
+ "load-json-file": "^5.2.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-conf/node_modules/find-up": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "locate-path": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-conf/node_modules/locate-path": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-locate": "^3.0.0",
+ "path-exists": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-conf/node_modules/p-locate": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "p-limit": "^2.0.0"
+ },
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/pkg-conf/node_modules/path-exists": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/possible-typed-array-names": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/prelude-ls": {
+ "version": "1.2.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/prop-types": {
+ "version": "15.8.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "loose-envify": "^1.4.0",
+ "object-assign": "^4.1.1",
+ "react-is": "^16.13.1"
+ }
+ },
+ "node_modules/propagate": {
+ "version": "2.0.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/proxy-addr": {
+ "version": "2.0.7",
+ "license": "MIT",
+ "dependencies": {
+ "forwarded": "0.2.0",
+ "ipaddr.js": "1.9.1"
+ },
+ "engines": {
+ "node": ">= 0.10"
+ }
+ },
+ "node_modules/pstree.remy": {
+ "version": "1.1.8",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/punycode": {
+ "version": "2.3.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=6"
+ }
+ },
+ "node_modules/qs": {
+ "version": "6.14.0",
+ "license": "BSD-3-Clause",
+ "dependencies": {
+ "side-channel": "^1.1.0"
+ },
+ "engines": {
+ "node": ">=0.6"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/queue-microtask": {
+ "version": "1.2.3",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/range-parser": {
+ "version": "1.2.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/raw-body": {
+ "version": "3.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "bytes": "3.1.2",
+ "http-errors": "2.0.0",
+ "iconv-lite": "0.6.3",
+ "unpipe": "1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/react-is": {
+ "version": "16.13.1",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/readdirp": {
+ "version": "3.6.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "picomatch": "^2.2.1"
+ },
+ "engines": {
+ "node": ">=8.10.0"
+ }
+ },
+ "node_modules/reflect.getprototypeof": {
+ "version": "1.0.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.1",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.4",
+ "globalthis": "^1.0.3",
+ "which-builtin-type": "^1.1.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regexp.prototype.flags": {
+ "version": "1.5.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "define-properties": "^1.2.1",
+ "es-errors": "^1.3.0",
+ "set-function-name": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/regexparam": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/regexpp": {
+ "version": "3.2.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/mysticatea"
+ }
+ },
+ "node_modules/resolve": {
+ "version": "1.22.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-core-module": "^2.11.0",
+ "path-parse": "^1.0.7",
+ "supports-preserve-symlinks-flag": "^1.0.0"
+ },
+ "bin": {
+ "resolve": "bin/resolve"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/resolve-from": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/reusify": {
+ "version": "1.0.4",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "iojs": ">=1.0.0",
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/rimraf": {
+ "version": "2.4.5",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "glob": "^6.0.1"
+ },
+ "bin": {
+ "rimraf": "bin.js"
+ }
+ },
+ "node_modules/rimraf/node_modules/glob": {
+ "version": "6.0.4",
+ "license": "ISC",
+ "optional": true,
+ "dependencies": {
+ "inflight": "^1.0.4",
+ "inherits": "2",
+ "minimatch": "2 || 3",
+ "once": "^1.3.0",
+ "path-is-absolute": "^1.0.0"
+ },
+ "engines": {
+ "node": "*"
+ }
+ },
+ "node_modules/router": {
+ "version": "2.2.0",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.4.0",
+ "depd": "^2.0.0",
+ "is-promise": "^4.0.0",
+ "parseurl": "^1.3.3",
+ "path-to-regexp": "^8.0.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/run-parallel": {
+ "version": "1.2.0",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "queue-microtask": "^1.2.2"
+ }
+ },
+ "node_modules/safe-array-concat": {
+ "version": "1.1.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "get-intrinsic": "^1.2.4",
+ "has-symbols": "^1.0.3",
+ "isarray": "^2.0.5"
+ },
+ "engines": {
+ "node": ">=0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safe-buffer": {
+ "version": "5.2.1",
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT"
+ },
+ "node_modules/safe-json-stringify": {
+ "version": "1.2.0",
+ "license": "MIT",
+ "optional": true
+ },
+ "node_modules/safe-regex-test": {
+ "version": "1.0.3",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.6",
+ "es-errors": "^1.3.0",
+ "is-regex": "^1.1.4"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/safer-buffer": {
+ "version": "2.1.2",
+ "license": "MIT"
+ },
+ "node_modules/semver": {
+ "version": "7.6.2",
+ "dev": true,
+ "license": "ISC",
+ "bin": {
+ "semver": "bin/semver.js"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/send": {
+ "version": "1.2.0",
+ "license": "MIT",
+ "dependencies": {
+ "debug": "^4.3.5",
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "etag": "^1.8.1",
+ "fresh": "^2.0.0",
+ "http-errors": "^2.0.0",
+ "mime-types": "^3.0.1",
+ "ms": "^2.1.3",
+ "on-finished": "^2.4.1",
+ "range-parser": "^1.2.1",
+ "statuses": "^2.0.1"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/send/node_modules/mime-db": {
+ "version": "1.54.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/send/node_modules/mime-types": {
+ "version": "3.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/serve-static": {
+ "version": "2.2.0",
+ "license": "MIT",
+ "dependencies": {
+ "encodeurl": "^2.0.0",
+ "escape-html": "^1.0.3",
+ "parseurl": "^1.3.3",
+ "send": "^1.2.0"
+ },
+ "engines": {
+ "node": ">= 18"
+ }
+ },
+ "node_modules/set-function-length": {
+ "version": "1.2.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "function-bind": "^1.1.2",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/set-function-name": {
+ "version": "2.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-data-property": "^1.1.4",
+ "es-errors": "^1.3.0",
+ "functions-have-names": "^1.2.3",
+ "has-property-descriptors": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/setprototypeof": {
+ "version": "1.2.0",
+ "license": "ISC"
+ },
+ "node_modules/shebang-command": {
+ "version": "2.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "shebang-regex": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/shebang-regex": {
+ "version": "3.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/side-channel": {
+ "version": "1.1.0",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3",
+ "side-channel-list": "^1.0.0",
+ "side-channel-map": "^1.0.1",
+ "side-channel-weakmap": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-list": {
+ "version": "1.0.0",
+ "license": "MIT",
+ "dependencies": {
+ "es-errors": "^1.3.0",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-map": {
+ "version": "1.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/side-channel-weakmap": {
+ "version": "1.0.2",
+ "license": "MIT",
+ "dependencies": {
+ "call-bound": "^1.0.2",
+ "es-errors": "^1.3.0",
+ "get-intrinsic": "^1.2.5",
+ "object-inspect": "^1.13.3",
+ "side-channel-map": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/signal-exit": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz",
+ "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==",
+ "license": "ISC",
+ "engines": {
+ "node": ">=14"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/isaacs"
+ }
+ },
+ "node_modules/simple-update-notifier": {
+ "version": "2.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "semver": "^7.5.3"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
+ "node_modules/standard": {
+ "version": "17.1.2",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "eslint": "^8.41.0",
+ "eslint-config-standard": "17.1.0",
+ "eslint-config-standard-jsx": "^11.0.0",
+ "eslint-plugin-import": "^2.27.5",
+ "eslint-plugin-n": "^15.7.0",
+ "eslint-plugin-promise": "^6.1.1",
+ "eslint-plugin-react": "^7.36.1",
+ "standard-engine": "^15.1.0",
+ "version-guard": "^1.1.1"
+ },
+ "bin": {
+ "standard": "bin/cmd.cjs"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/standard-engine": {
+ "version": "15.1.0",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "license": "MIT",
+ "dependencies": {
+ "get-stdin": "^8.0.0",
+ "minimist": "^1.2.6",
+ "pkg-conf": "^3.1.0",
+ "xdg-basedir": "^4.0.0"
+ },
+ "engines": {
+ "node": "^12.22.0 || ^14.17.0 || >=16.0.0"
+ }
+ },
+ "node_modules/statuses": {
+ "version": "2.0.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/strict-event-emitter": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz",
+ "integrity": "sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/string-width": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz",
+ "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==",
+ "license": "MIT",
+ "dependencies": {
+ "eastasianwidth": "^0.2.0",
+ "emoji-regex": "^9.2.2",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/string-width-cjs": {
+ "name": "string-width",
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/string-width-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/string-width/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/string-width/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/string.prototype.matchall": {
+ "version": "4.0.11",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.2",
+ "es-errors": "^1.3.0",
+ "es-object-atoms": "^1.0.0",
+ "get-intrinsic": "^1.2.4",
+ "gopd": "^1.0.1",
+ "has-symbols": "^1.0.3",
+ "internal-slot": "^1.0.7",
+ "regexp.prototype.flags": "^1.5.2",
+ "set-function-name": "^2.0.2",
+ "side-channel": "^1.0.6"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.repeat": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "define-properties": "^1.1.3",
+ "es-abstract": "^1.17.5"
+ }
+ },
+ "node_modules/string.prototype.trim": {
+ "version": "1.2.9",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-abstract": "^1.23.0",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimend": {
+ "version": "1.0.8",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/string.prototype.trimstart": {
+ "version": "1.0.8",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "define-properties": "^1.2.1",
+ "es-object-atoms": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/strip-ansi": {
+ "version": "6.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-ansi-cjs": {
+ "name": "strip-ansi",
+ "version": "6.0.1",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz",
+ "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^5.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/strip-bom": {
+ "version": "3.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/strip-json-comments": {
+ "version": "3.1.1",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ },
+ "node_modules/superagent": {
+ "version": "10.2.3",
+ "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.2.3.tgz",
+ "integrity": "sha512-y/hkYGeXAj7wUMjxRbB21g/l6aAEituGXM9Rwl4o20+SX3e8YOSV6BxFXl+dL3Uk0mjSL3kCbNkwURm8/gEDig==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "component-emitter": "^1.3.1",
+ "cookiejar": "^2.1.4",
+ "debug": "^4.3.7",
+ "fast-safe-stringify": "^2.1.1",
+ "form-data": "^4.0.4",
+ "formidable": "^3.5.4",
+ "methods": "^1.1.2",
+ "mime": "2.6.0",
+ "qs": "^6.11.2"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ }
+ },
+ "node_modules/supertest": {
+ "version": "7.1.4",
+ "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.1.4.tgz",
+ "integrity": "sha512-tjLPs7dVyqgItVFirHYqe2T+MfWc2VOBQ8QFKKbWTA3PU7liZR8zoSpAi/C1k1ilm9RsXIKYf197oap9wXGVYg==",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "methods": "^1.1.2",
+ "superagent": "^10.2.3"
+ },
+ "engines": {
+ "node": ">=14.18.0"
+ }
+ },
+ "node_modules/supports-color": {
+ "version": "5.5.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "has-flag": "^3.0.0"
+ },
+ "engines": {
+ "node": ">=4"
+ }
+ },
+ "node_modules/supports-preserve-symlinks-flag": {
+ "version": "1.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/text-table": {
+ "version": "0.2.0",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/to-regex-range": {
+ "version": "5.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-number": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=8.0"
+ }
+ },
+ "node_modules/toidentifier": {
+ "version": "1.0.1",
+ "license": "MIT",
+ "engines": {
+ "node": ">=0.6"
+ }
+ },
+ "node_modules/touch": {
+ "version": "3.1.0",
+ "dev": true,
+ "license": "ISC",
+ "dependencies": {
+ "nopt": "~1.0.10"
+ },
+ "bin": {
+ "nodetouch": "bin/nodetouch.js"
+ }
+ },
+ "node_modules/tsconfig-paths": {
+ "version": "3.14.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "@types/json5": "^0.0.29",
+ "json5": "^1.0.2",
+ "minimist": "^1.2.6",
+ "strip-bom": "^3.0.0"
+ }
+ },
+ "node_modules/tsconfig-paths/node_modules/json5": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "minimist": "^1.2.0"
+ },
+ "bin": {
+ "json5": "lib/cli.js"
+ }
+ },
+ "node_modules/type-check": {
+ "version": "0.4.0",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "prelude-ls": "^1.2.1"
+ },
+ "engines": {
+ "node": ">= 0.8.0"
+ }
+ },
+ "node_modules/type-is": {
+ "version": "2.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "content-type": "^1.0.5",
+ "media-typer": "^1.1.0",
+ "mime-types": "^3.0.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/type-is/node_modules/mime-db": {
+ "version": "1.54.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/type-is/node_modules/mime-types": {
+ "version": "3.0.1",
+ "license": "MIT",
+ "dependencies": {
+ "mime-db": "^1.54.0"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/typed-array-buffer": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "es-errors": "^1.3.0",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ }
+ },
+ "node_modules/typed-array-byte-length": {
+ "version": "1.0.1",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-byte-offset": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/typed-array-length": {
+ "version": "1.0.6",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-proto": "^1.0.3",
+ "is-typed-array": "^1.1.13",
+ "possible-typed-array-names": "^1.0.0"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/unbox-primitive": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "call-bind": "^1.0.2",
+ "has-bigints": "^1.0.2",
+ "has-symbols": "^1.0.3",
+ "which-boxed-primitive": "^1.0.2"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/undefsafe": {
+ "version": "2.0.5",
+ "dev": true,
+ "license": "MIT"
+ },
+ "node_modules/universal-user-agent": {
+ "version": "7.0.3",
+ "license": "ISC"
+ },
+ "node_modules/unpipe": {
+ "version": "1.0.0",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/uri-js": {
+ "version": "4.4.1",
+ "dev": true,
+ "license": "BSD-2-Clause",
+ "dependencies": {
+ "punycode": "^2.1.0"
+ }
+ },
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "license": "MIT",
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/vary": {
+ "version": "1.1.2",
+ "license": "MIT",
+ "engines": {
+ "node": ">= 0.8"
+ }
+ },
+ "node_modules/version-guard": {
+ "version": "1.1.1",
+ "dev": true,
+ "license": "0BSD",
+ "engines": {
+ "node": ">=0.10.48"
+ }
+ },
+ "node_modules/which": {
+ "version": "2.0.2",
+ "license": "ISC",
+ "dependencies": {
+ "isexe": "^2.0.0"
+ },
+ "bin": {
+ "node-which": "bin/node-which"
+ },
+ "engines": {
+ "node": ">= 8"
+ }
+ },
+ "node_modules/which-boxed-primitive": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-bigint": "^1.0.1",
+ "is-boolean-object": "^1.1.0",
+ "is-number-object": "^1.0.4",
+ "is-string": "^1.0.5",
+ "is-symbol": "^1.0.3"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-builtin-type": {
+ "version": "1.1.4",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "function.prototype.name": "^1.1.6",
+ "has-tostringtag": "^1.0.2",
+ "is-async-function": "^2.0.0",
+ "is-date-object": "^1.0.5",
+ "is-finalizationregistry": "^1.0.2",
+ "is-generator-function": "^1.0.10",
+ "is-regex": "^1.1.4",
+ "is-weakref": "^1.0.2",
+ "isarray": "^2.0.5",
+ "which-boxed-primitive": "^1.0.2",
+ "which-collection": "^1.0.2",
+ "which-typed-array": "^1.1.15"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-collection": {
+ "version": "1.0.2",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "is-map": "^2.0.3",
+ "is-set": "^2.0.3",
+ "is-weakmap": "^2.0.2",
+ "is-weakset": "^2.0.3"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/which-typed-array": {
+ "version": "1.1.15",
+ "dev": true,
+ "license": "MIT",
+ "dependencies": {
+ "available-typed-arrays": "^1.0.7",
+ "call-bind": "^1.0.7",
+ "for-each": "^0.3.3",
+ "gopd": "^1.0.1",
+ "has-tostringtag": "^1.0.2"
+ },
+ "engines": {
+ "node": ">= 0.4"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/ljharb"
+ }
+ },
+ "node_modules/wrap-ansi": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz",
+ "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^6.1.0",
+ "string-width": "^5.0.1",
+ "strip-ansi": "^7.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs": {
+ "name": "wrap-ansi",
+ "version": "7.0.0",
+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz",
+ "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-styles": "^4.0.0",
+ "string-width": "^4.1.0",
+ "strip-ansi": "^6.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/wrap-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": {
+ "version": "4.3.0",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
+ "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
+ "license": "MIT",
+ "dependencies": {
+ "color-convert": "^2.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-styles?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": {
+ "version": "8.0.0",
+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz",
+ "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
+ "license": "MIT"
+ },
+ "node_modules/wrap-ansi-cjs/node_modules/string-width": {
+ "version": "4.2.3",
+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz",
+ "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==",
+ "license": "MIT",
+ "dependencies": {
+ "emoji-regex": "^8.0.0",
+ "is-fullwidth-code-point": "^3.0.0",
+ "strip-ansi": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/ansi-regex": {
+ "version": "6.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz",
+ "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==",
+ "license": "MIT",
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/ansi-regex?sponsor=1"
+ }
+ },
+ "node_modules/wrap-ansi/node_modules/strip-ansi": {
+ "version": "7.1.0",
+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz",
+ "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==",
+ "license": "MIT",
+ "dependencies": {
+ "ansi-regex": "^6.0.1"
+ },
+ "engines": {
+ "node": ">=12"
+ },
+ "funding": {
+ "url": "https://github.com/chalk/strip-ansi?sponsor=1"
+ }
+ },
+ "node_modules/wrappy": {
+ "version": "1.0.2",
+ "license": "ISC"
+ },
+ "node_modules/xdg-basedir": {
+ "version": "4.0.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=8"
+ }
+ },
+ "node_modules/yocto-queue": {
+ "version": "0.1.0",
+ "dev": true,
+ "license": "MIT",
+ "engines": {
+ "node": ">=10"
+ },
+ "funding": {
+ "url": "https://github.com/sponsors/sindresorhus"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
index 4c896af3..6d456a9f 100644
--- a/package.json
+++ b/package.json
@@ -2,39 +2,37 @@
"name": "nodejs-github-bot",
"version": "1.0.0-beta1",
"description": "Node.js GitHub Bot",
+ "type": "module",
"scripts": {
"start": "node server.js | bunyan -o short",
- "test": "tap test/**/*.test.js && standard",
+ "test": "STATUS=0; node --test test/**/*.test.js || STATUS=$?; standard || STATUS=$?; exit $STATUS",
"test:watch": "nodemon -q -x 'npm test'"
},
"engines": {
- "node": ">= 6.0.0"
+ "node": ">= 20.11.0"
},
"private": true,
"license": "MIT",
"dependencies": {
- "basic-auth": "^1.0.4",
- "body-parser": "^1.15.0",
+ "@octokit/rest": "^22.0.0",
+ "aigle": "^1.14.1",
+ "basic-auth": "^2.0.1",
+ "body-parser": "^2.2.0",
"bunyan": "^1.8.1",
- "bunyan-middleware": "^0.3.1",
- "debug": "^2.2.0",
- "dotenv": "^2.0.0",
- "express": "^4.13.4",
- "github": "^7.0.1",
- "glob": "^7.0.3",
- "lru-cache": "^4.0.1",
- "travis-ci": "^2.1.0"
+ "bunyan-middleware": "1.0.2",
+ "codeowners-utils": "^1.0.2",
+ "debug": "^4.4.1",
+ "dotenv": "^17.2.0",
+ "events-async": "^1.2.1",
+ "express": "^5.1.0",
+ "glob": "11.0.3"
},
"devDependencies": {
- "eventsource": "^0.2.1",
- "lolex": "^1.5.1",
- "nock": "^8.0.0",
- "nodemon": "^1.9.1",
- "proxyquire": "^1.7.10",
- "request": "^2.72.0",
- "sinon": "^1.17.6",
- "standard": "^6.0.7",
- "supertest": "^1.2.0",
- "tap": "^5.7.1"
+ "eventsource": "^4.0.0",
+ "fetch-mock": "^12.5.3",
+ "nock": "^14.0.10",
+ "nodemon": "^3.1.10",
+ "standard": "^17.1.2",
+ "supertest": "^7.1.4"
}
}
diff --git a/scripts/attempt-backport.js b/scripts/attempt-backport.js
deleted file mode 100644
index f61a4108..00000000
--- a/scripts/attempt-backport.js
+++ /dev/null
@@ -1,225 +0,0 @@
-'use strict'
-
-const child_process = require('child_process')
-const debug = require('debug')('attempt-backport')
-const request = require('request')
-const node_repo = require('../lib/node-repo')
-const updatePrWithLabels = node_repo.updatePrWithLabels
-// const removeLabelFromPR = node_repo.removeLabelFromPR
-
-const enabledRepos = ['node']
-const nodeVersions = [
- { version: 7 },
- { version: 6, lts: true },
- { version: 4, lts: true }
-]
-const queue = []
-let inProgress = false
-
-module.exports = function (app) {
- if (!global._node_repo_dir) return
-
- app.on('pull_request.opened', handlePrUpdate)
- // Pull Request updates
- app.on('pull_request.synchronize', handlePrUpdate)
-
- function handlePrUpdate (event, owner, repo) {
- if (!~enabledRepos.indexOf(repo)) return
-
- if (event.pull_request.base.ref !== 'master') return
-
- const prId = event.number
- const options = { owner, repo, prId, logger: event.logger }
-
- debug(`/${owner}/${repo}/pull/${prId} sync`)
- for (const node of nodeVersions) {
- queueAttemptBackport(options, node.version, !!node.lts)
- }
-
- if (!inProgress) processNextBackport()
- }
-
- // to trigger polling manually
- app.get('/attempt-backport/pr/:owner/:repo/:id', (req, res) => {
- const owner = req.params.owner
- const repo = req.params.repo
- const prId = parseInt(req.params.id, 10)
- const options = { owner, repo, prId, logger: req.log }
-
- if (~enabledRepos.indexOf(repo)) {
- for (const node of nodeVersions) {
- queueAttemptBackport(options, node.version, !!node.lts)
- }
- }
-
- if (!inProgress) processNextBackport()
-
- res.end()
- })
-}
-
-function processNextBackport () {
- const item = queue.shift()
- if (!item) return
-
- if (typeof item !== 'function') {
- debug(`item was not a function! - queue size: ${queue.length}`)
- return
- } else if (inProgress) {
- debug(`was still in progress! - queue size: ${queue.length}`)
- return
- }
- item()
-}
-
-function queueAttemptBackport (options, version, isLTS) {
- queue.push(function () {
- options.logger.debug(`processing a new backport to v${version}`)
- attemptBackport(options, version, isLTS, processNextBackport)
- })
-}
-
-function attemptBackport (options, version, isLTS, cb) {
- // Start
- gitAmAbort()
-
- function wrapCP (cmd, args, opts, callback) {
- let exited = false
-
- if (arguments.length === 3) {
- callback = opts
- opts = {}
- }
-
- opts.cwd = global._node_repo_dir
-
- const cp = child_process.spawn(cmd, args, opts)
- const argsString = [cmd, ...args].join(' ')
-
- cp.on('error', function (err) {
- debug(`child_process err: ${err}`)
- if (!exited) onError()
- })
- cp.on('exit', function (code) {
- exited = true
- if (!cb) {
- debug(`error before exit, code: ${code}, on '${argsString}'`)
- return
- } else if (code > 0) {
- debug(`exit code > 0: ${code}, on '${argsString}'`)
- onError()
- return
- }
- callback()
- })
- // Useful when debugging.
-
- cp.stdout.on('data', (data) => {
- options.logger.debug(data.toString())
- })
- cp.stderr.on('data', (data) => {
- options.logger.debug(data.toString())
- })
-
- return cp
- }
-
- function onError () {
- if (!cb) return
- const _cb = cb
- setImmediate(() => {
- options.logger.debug(`backport to ${version} failed`)
- if (!isLTS) updatePrWithLabels(options, [`dont-land-on-v${version}.x`])
- setImmediate(() => {
- inProgress = false
- _cb()
- })
- })
- cb = null
- }
-
- function gitAmAbort () {
- // TODO(Fishrock123): this should probably just merge into wrapCP
- let exited = false
- options.logger.debug('aborting any previous backport attempt...')
-
- const cp = child_process.spawn('git', ['am', '--abort'], { cwd: global._node_repo_dir })
- const argsString = 'git am --abort'
-
- cp.on('error', function (err) {
- debug(`child_process err: ${err}`)
- if (!exited) onError()
- })
- cp.on('exit', function (code) {
- exited = true
- if (!cb) {
- debug(`error before exit, code: ${code}, on '${argsString}'`)
- return
- }
- gitResetBefore()
- })
- }
-
- function gitResetBefore () {
- options.logger.debug(`resetting origin/v${version}.x-staging...`)
- wrapCP('git', ['reset', `origin/v${version}.x-staging`, '--hard'], gitRemoteUpdate)
- }
-
- function gitRemoteUpdate () {
- options.logger.debug('updating git remotes...')
- wrapCP('git', ['remote', 'update', '-p'], gitCheckout)
- }
-
- function gitCheckout () {
- options.logger.debug(`checking out origin/v${version}.x-staging...`)
- wrapCP('git', ['checkout', `origin/v${version}.x-staging`], gitReset)
- }
-
- function gitReset () {
- options.logger.debug(`resetting origin/v${version}.x-staging...`)
- wrapCP('git', ['reset', `origin/v${version}.x-staging`, '--hard'], fetchDiff)
- }
-
- function fetchDiff () {
- options.logger.debug(`fetching diff from pr ${options.prId}...`)
-
- const url = `https://patch-diff.githubusercontent.com/raw/${options.owner}/${options.repo}/pull/${options.prId}.patch`
-
- const req = request(url)
-
- req.on('error', function (err) {
- debug(`request err: ${err}`)
- return onError()
- })
- req.on('response', function (response) {
- if (response.statusCode !== 200) {
- debug(`request non-200 status: ${response.statusCode}`)
- return onError()
- }
- })
-
- gitAttemptBackport(req)
- }
-
- function gitAttemptBackport (req) {
- options.logger.debug(`attempting a backport to v${version}...`)
- const cp = wrapCP('git', ['am'], { stdio: 'pipe' }, function done () {
- // Success!
- if (isLTS) {
- updatePrWithLabels(options, [`lts-watch-v${version}.x`])
- }// else {
- // TODO(Fishrock123): Re-enable this, but do a check first
- // to make sure the label was set by the bot only.
- // removeLabelFromPR(options, `dont-land-on-v${version}.x`)
- // }
-
- setImmediate(() => {
- options.logger.debug(`backport to v${version} successful`)
- inProgress = false
- cb()
- })
- })
-
- req.pipe(cp.stdin)
- }
-}
diff --git a/scripts/display-travis-status.js b/scripts/display-travis-status.js
deleted file mode 100644
index 618c9a92..00000000
--- a/scripts/display-travis-status.js
+++ /dev/null
@@ -1,34 +0,0 @@
-'use strict'
-
-const debug = require('debug')('display_travis_status')
-const pollTravis = require('../lib/pollTravis')
-const enabledRepos = ['citgm', 'readable-stream', 'nodejs.org', 'docker-node']
-
-module.exports = function (app) {
- app.on('pull_request.opened', handlePrUpdate)
- // Pull Request updates
- app.on('pull_request.synchronize', handlePrUpdate)
-
- function handlePrUpdate (event, owner, repo) {
- if (!~enabledRepos.indexOf(repo)) return
-
- const pr = event.number
- const options = { owner, repo, pr, logger: event.logger }
-
- debug(`/${owner}/${repo}/pull/${pr} opened`)
- pollTravis.pollThenStatus(options)
- }
-
- // to trigger polling manually
- app.get('/pr/:owner/:repo/:id', (req, res) => {
- const owner = req.params.owner
- const repo = req.params.repo
- const pr = parseInt(req.params.id, 10)
- const options = { owner, repo, pr, logger: req.log }
-
- if (~enabledRepos.indexOf(repo)) {
- pollTravis.pollThenStatus(options)
- }
- res.end()
- })
-}
diff --git a/scripts/event-relay.js b/scripts/event-relay.js
new file mode 100644
index 00000000..7fc73e40
--- /dev/null
+++ b/scripts/event-relay.js
@@ -0,0 +1,23 @@
+import githubClient from '../lib/github-client.js'
+
+async function handleJenkinsRelay (event) {
+ const { owner, repo, identifier } = event
+ const eventType = `jenkins.${identifier}.${event.event}`
+ try {
+ event.logger.debug(`Relaying ${eventType} to ${owner}/${repo}`)
+ await githubClient.repos.createDispatchEvent({
+ owner,
+ repo,
+ event_type: eventType,
+ client_payload: event
+ })
+ return true
+ } catch (err) {
+ event.logger.error(err, `Failed to relay ${eventType} to ${owner}/${repo}`)
+ return false
+ }
+}
+
+export default function (_, event) {
+ event.on('jenkins', handleJenkinsRelay)
+}
diff --git a/scripts/jenkins-status.js b/scripts/jenkins-status.js
new file mode 100644
index 00000000..1cb6d275
--- /dev/null
+++ b/scripts/jenkins-status.js
@@ -0,0 +1,34 @@
+import * as pushJenkinsUpdate from '../lib/push-jenkins-update.js'
+
+function handleJenkinsStart (event) {
+ const { repo, owner } = event
+
+ pushJenkinsUpdate.pushStarted({
+ owner,
+ repo,
+ logger: event.logger
+ }, event, (err) => {
+ if (err) {
+ event.logger.error(err, 'Error while handling Jenkins start event')
+ }
+ })
+}
+
+function handleJenkinsStop (event) {
+ const { repo, owner } = event
+
+ pushJenkinsUpdate.pushEnded({
+ owner,
+ repo,
+ logger: event.logger
+ }, event, (err) => {
+ if (err) {
+ event.logger.error(err, 'Error while handling Jenkins end event')
+ }
+ })
+}
+
+export default function (_, event) {
+ event.on('jenkins.start', handleJenkinsStart)
+ event.on('jenkins.end', handleJenkinsStop)
+}
diff --git a/scripts/node-jenkins-status.js b/scripts/node-jenkins-status.js
deleted file mode 100644
index b4b9126c..00000000
--- a/scripts/node-jenkins-status.js
+++ /dev/null
@@ -1,37 +0,0 @@
-'use strict'
-
-const pushJenkinsUpdate = require('../lib/push-jenkins-update')
-
-module.exports = function (app) {
- app.post('/node/jenkins/start', (req, res) => {
- const isValid = pushJenkinsUpdate.validate(req.body)
-
- if (!isValid) {
- return res.status(400).end('Invalid payload')
- }
-
- pushJenkinsUpdate.pushStarted({
- owner: 'nodejs',
- repo: 'node',
- logger: req.log
- }, req.body)
-
- res.status(201).end()
- })
-
- app.post('/node/jenkins/end', (req, res) => {
- const isValid = pushJenkinsUpdate.validate(req.body)
-
- if (!isValid) {
- return res.status(400).end('Invalid payload')
- }
-
- pushJenkinsUpdate.pushEnded({
- owner: 'nodejs',
- repo: 'node',
- logger: req.log
- }, req.body)
-
- res.status(201).end()
- })
-}
diff --git a/scripts/node-ping-owners.js b/scripts/node-ping-owners.js
new file mode 100644
index 00000000..ac8c7d99
--- /dev/null
+++ b/scripts/node-ping-owners.js
@@ -0,0 +1,27 @@
+import debugLib from 'debug'
+
+import * as nodeRepo from '../lib/node-repo.js'
+
+const debug = debugLib('node_ping_owners')
+
+export default function (app, events) {
+ events.on('pull_request.opened', handlePrCreated)
+}
+
+function handlePrCreated (event, owner, repo) {
+ const prId = event.number
+ const logger = event.logger
+ const baseBranch = event.pull_request.base.ref
+
+ debug(`/${owner}/${repo}/pull/${prId} opened`)
+ nodeRepo.resolveOwnersThenPingPr({
+ owner,
+ repo,
+ prId,
+ logger,
+ baseBranch,
+ timeoutInSec: 2
+ }).catch(err => {
+ event.logger.error(err, 'owners ping failed')
+ })
+}
diff --git a/scripts/node-subsystem-label.js b/scripts/node-subsystem-label.js
deleted file mode 100644
index ba4d410f..00000000
--- a/scripts/node-subsystem-label.js
+++ /dev/null
@@ -1,31 +0,0 @@
-'use strict'
-
-const debug = require('debug')('node_subsystem_label')
-
-const nodeRepo = require('../lib/node-repo')
-
-module.exports = function (app) {
- app.on('pull_request.opened', handlePrCreated)
-
- function handlePrCreated (event, owner, repo) {
- const prId = event.number
- const logger = event.logger
- const baseBranch = event.pull_request.base.ref
-
- // subsystem labelling is for node core only
- if (repo !== 'node') return
-
- debug(`/${owner}/${repo}/pull/${prId} opened`)
- // by not hard coding the owner repo to nodejs/node here,
- // we can test these this script in a different repo than
- // *actual* node core as long as the repo is named "node"
- nodeRepo.resolveLabelsThenUpdatePr({
- owner,
- repo,
- prId,
- logger,
- baseBranch,
- timeoutInSec: 2
- })
- }
-}
diff --git a/scripts/ping.js b/scripts/ping.js
index a0dbd53d..2a1d4d6b 100644
--- a/scripts/ping.js
+++ b/scripts/ping.js
@@ -1,6 +1,4 @@
-'use strict'
-
-module.exports = function (app) {
+export default function (app) {
app.get('/ping', (req, res) => {
res.end('pong')
})
diff --git a/server.js b/server.js
index 1790f35d..71b3961b 100644
--- a/server.js
+++ b/server.js
@@ -1,24 +1,20 @@
-'use strict'
+import 'dotenv/config'
-const child_process = require('child_process')
+import { globSync } from 'glob'
+import logger from './lib/logger.js'
+import { app, events } from './app.js'
-if (process.env.NODE_REPO_DIR) {
- const fs = require('fs')
- global._node_repo_dir = fs.realpathSync(process.env.NODE_REPO_DIR)
- const out = child_process.spawnSync('git', ['status'], { cwd: global._node_repo_dir })
+const port = process.env.PORT || 3000
+const scriptsToLoad = process.env.SCRIPTS || './scripts/**/*.js'
- if (out.status !== 0) {
- logger.info(out.stdout)
- logger.error(out.stderr)
- logger.error('Bad NODE_REPO_DIR. Backport patch testing disabled.')
- global._node_repo_dir = false
- }
+// load all the files in the scripts folder
+const files = globSync(scriptsToLoad, { dotRelative: true })
+for (const file of files) {
+ logger.info('Loading:', file)
+ const { default: extend } = await import(file)
+ extend(app, events)
}
-const app = require('./app')
-const logger = require('./lib/logger')
-
-const port = process.env.PORT || 3000
app.listen(port, () => {
logger.info('Listening on port', port)
})
@@ -39,3 +35,13 @@ if (process.env.SSE_RELAY) {
}
}
}
+
+function logUnhandledException (err) {
+ logger.fatal(err, 'Unchaught exception, terminating bot process immediately')
+
+ // leave time for error to be written to disk before exiting process
+ setTimeout(() => process.exit(1), 10)
+}
+
+process.on('uncaughtException', logUnhandledException)
+process.on('unhandledRejection', logUnhandledException)
diff --git a/test/_fixtures/CODEOWNERS b/test/_fixtures/CODEOWNERS
new file mode 100644
index 00000000..8ddf2cf0
--- /dev/null
+++ b/test/_fixtures/CODEOWNERS
@@ -0,0 +1,8 @@
+/file1 @nodejs/test1
+/file2 @nodejs/test2
+/file3 @nodejs/test1 @nodejs/test2
+/file4 @nodejs/test1
+/file5 @nodejs/test3
+/folder1/* @nodejs/test3
+/folder2/file1.* @nodejs/test4 @nodejs/test5
+/lib/timers.js @nodejs/team @nodejs/team2
diff --git a/test/_fixtures/get-repository.json b/test/_fixtures/get-repository.json
new file mode 100644
index 00000000..1d64f028
--- /dev/null
+++ b/test/_fixtures/get-repository.json
@@ -0,0 +1,132 @@
+{
+ "id": 108083039,
+ "node_id": "MDEwOlJlcG9zaXRvcnkxMDgwODMwMzk=",
+ "name": "node-auto-test",
+ "full_name": "nodejs/node-auto-test",
+ "private": false,
+ "owner": {
+ "login": "nodejs",
+ "id": 9950313,
+ "node_id": "MDEyOk9yZ2FuaXphdGlvbjk5NTAzMTM=",
+ "avatar_url": "https://avatars3.githubusercontent.com/u/9950313?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/nodejs",
+ "html_url": "https://github.com/nodejs",
+ "followers_url": "https://api.github.com/users/nodejs/followers",
+ "following_url": "https://api.github.com/users/nodejs/following{/other_user}",
+ "gists_url": "https://api.github.com/users/nodejs/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/nodejs/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/nodejs/subscriptions",
+ "organizations_url": "https://api.github.com/users/nodejs/orgs",
+ "repos_url": "https://api.github.com/users/nodejs/repos",
+ "events_url": "https://api.github.com/users/nodejs/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/nodejs/received_events",
+ "type": "Organization",
+ "site_admin": false
+ },
+ "html_url": "https://github.com/nodejs/node-auto-test",
+ "description": "Node.js clone for testing automation tools",
+ "fork": false,
+ "url": "https://api.github.com/repos/nodejs/node-auto-test",
+ "forks_url": "https://api.github.com/repos/nodejs/node-auto-test/forks",
+ "keys_url": "https://api.github.com/repos/nodejs/node-auto-test/keys{/key_id}",
+ "collaborators_url": "https://api.github.com/repos/nodejs/node-auto-test/collaborators{/collaborator}",
+ "teams_url": "https://api.github.com/repos/nodejs/node-auto-test/teams",
+ "hooks_url": "https://api.github.com/repos/nodejs/node-auto-test/hooks",
+ "issue_events_url": "https://api.github.com/repos/nodejs/node-auto-test/issues/events{/number}",
+ "events_url": "https://api.github.com/repos/nodejs/node-auto-test/events",
+ "assignees_url": "https://api.github.com/repos/nodejs/node-auto-test/assignees{/user}",
+ "branches_url": "https://api.github.com/repos/nodejs/node-auto-test/branches{/branch}",
+ "tags_url": "https://api.github.com/repos/nodejs/node-auto-test/tags",
+ "blobs_url": "https://api.github.com/repos/nodejs/node-auto-test/git/blobs{/sha}",
+ "git_tags_url": "https://api.github.com/repos/nodejs/node-auto-test/git/tags{/sha}",
+ "git_refs_url": "https://api.github.com/repos/nodejs/node-auto-test/git/refs{/sha}",
+ "trees_url": "https://api.github.com/repos/nodejs/node-auto-test/git/trees{/sha}",
+ "statuses_url": "https://api.github.com/repos/nodejs/node-auto-test/statuses/{sha}",
+ "languages_url": "https://api.github.com/repos/nodejs/node-auto-test/languages",
+ "stargazers_url": "https://api.github.com/repos/nodejs/node-auto-test/stargazers",
+ "contributors_url": "https://api.github.com/repos/nodejs/node-auto-test/contributors",
+ "subscribers_url": "https://api.github.com/repos/nodejs/node-auto-test/subscribers",
+ "subscription_url": "https://api.github.com/repos/nodejs/node-auto-test/subscription",
+ "commits_url": "https://api.github.com/repos/nodejs/node-auto-test/commits{/sha}",
+ "git_commits_url": "https://api.github.com/repos/nodejs/node-auto-test/git/commits{/sha}",
+ "comments_url": "https://api.github.com/repos/nodejs/node-auto-test/comments{/number}",
+ "issue_comment_url": "https://api.github.com/repos/nodejs/node-auto-test/issues/comments{/number}",
+ "contents_url": "https://api.github.com/repos/nodejs/node-auto-test/contents/{+path}",
+ "compare_url": "https://api.github.com/repos/nodejs/node-auto-test/compare/{base}...{head}",
+ "merges_url": "https://api.github.com/repos/nodejs/node-auto-test/merges",
+ "archive_url": "https://api.github.com/repos/nodejs/node-auto-test/{archive_format}{/ref}",
+ "downloads_url": "https://api.github.com/repos/nodejs/node-auto-test/downloads",
+ "issues_url": "https://api.github.com/repos/nodejs/node-auto-test/issues{/number}",
+ "pulls_url": "https://api.github.com/repos/nodejs/node-auto-test/pulls{/number}",
+ "milestones_url": "https://api.github.com/repos/nodejs/node-auto-test/milestones{/number}",
+ "notifications_url": "https://api.github.com/repos/nodejs/node-auto-test/notifications{?since,all,participating}",
+ "labels_url": "https://api.github.com/repos/nodejs/node-auto-test/labels{/name}",
+ "releases_url": "https://api.github.com/repos/nodejs/node-auto-test/releases{/id}",
+ "deployments_url": "https://api.github.com/repos/nodejs/node-auto-test/deployments",
+ "created_at": "2017-10-24T05:54:55Z",
+ "updated_at": "2020-07-07T23:21:44Z",
+ "pushed_at": "2020-07-12T14:38:35Z",
+ "git_url": "git://github.com/nodejs/node-auto-test.git",
+ "ssh_url": "git@github.com:nodejs/node-auto-test.git",
+ "clone_url": "https://github.com/nodejs/node-auto-test.git",
+ "svn_url": "https://github.com/nodejs/node-auto-test",
+ "homepage": "",
+ "size": 452674,
+ "stargazers_count": 7,
+ "watchers_count": 7,
+ "language": "JavaScript",
+ "has_issues": true,
+ "has_projects": true,
+ "has_downloads": true,
+ "has_wiki": true,
+ "has_pages": false,
+ "forks_count": 12,
+ "mirror_url": null,
+ "archived": false,
+ "disabled": false,
+ "open_issues_count": 4,
+ "license": {
+ "key": "other",
+ "name": "Other",
+ "spdx_id": "NOASSERTION",
+ "url": null,
+ "node_id": "MDc6TGljZW5zZTA="
+ },
+ "forks": 12,
+ "open_issues": 4,
+ "watchers": 7,
+ "default_branch": "master",
+ "permissions": {
+ "admin": true,
+ "push": true,
+ "pull": true
+ },
+ "temp_clone_token": "",
+ "allow_squash_merge": true,
+ "allow_merge_commit": true,
+ "allow_rebase_merge": true,
+ "delete_branch_on_merge": false,
+ "organization": {
+ "login": "nodejs",
+ "id": 9950313,
+ "node_id": "MDEyOk9yZ2FuaXphdGlvbjk5NTAzMTM=",
+ "avatar_url": "https://avatars3.githubusercontent.com/u/9950313?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/nodejs",
+ "html_url": "https://github.com/nodejs",
+ "followers_url": "https://api.github.com/users/nodejs/followers",
+ "following_url": "https://api.github.com/users/nodejs/following{/other_user}",
+ "gists_url": "https://api.github.com/users/nodejs/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/nodejs/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/nodejs/subscriptions",
+ "organizations_url": "https://api.github.com/users/nodejs/orgs",
+ "repos_url": "https://api.github.com/users/nodejs/repos",
+ "events_url": "https://api.github.com/users/nodejs/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/nodejs/received_events",
+ "type": "Organization",
+ "site_admin": false
+ },
+ "network_count": 12,
+ "subscribers_count": 67
+}
diff --git a/test/_fixtures/jenkins-staging-failure-payload.json b/test/_fixtures/jenkins-staging-failure-payload.json
new file mode 100644
index 00000000..b434b59d
--- /dev/null
+++ b/test/_fixtures/jenkins-staging-failure-payload.json
@@ -0,0 +1,8 @@
+{
+ "identifier": "node-test-commit-aix",
+ "status": "failure",
+ "message": "tests failed",
+ "commit": "084ef6016994a41ffbbe9e48584abe874a197d43",
+ "url": "https://ci.nodejs.org/job/node-test-commit-aix/15657/",
+ "ref": "refs/heads/v8.x-staging"
+}
diff --git a/test/_fixtures/jenkins-test-pull-request-success-payload.json b/test/_fixtures/jenkins-test-pull-request-success-payload.json
new file mode 100644
index 00000000..c0726ee6
--- /dev/null
+++ b/test/_fixtures/jenkins-test-pull-request-success-payload.json
@@ -0,0 +1,8 @@
+{
+ "identifier": "node-test-pull-request",
+ "status": "pending",
+ "message": "running tests",
+ "commit": "8a5fec2a6bade91e544a30314d7cf21f8a200de1",
+ "url": "https://ci.nodejs.org/job/node-test-pull-request/21633/",
+ "ref": "refs/pull/12345/head"
+}
diff --git a/test/_fixtures/pull-request-commits-page-1.json b/test/_fixtures/pull-request-commits-page-1.json
new file mode 100644
index 00000000..a774e9db
--- /dev/null
+++ b/test/_fixtures/pull-request-commits-page-1.json
@@ -0,0 +1,2335 @@
+[
+ {
+ "sha": "45df0ee7171cf5f9642fb755be1b24075192347c",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6NDVkZjBlZTcxNzFjZjVmOTY0MmZiNzU1YmUxYjI0MDc1MTkyMzQ3Yw==",
+ "commit": {
+ "author": {
+ "name": "Jaideep Bajwa",
+ "email": "bjaideep@ca.ibm.com",
+ "date": "2016-11-01T06:53:37Z"
+ },
+ "committer": {
+ "name": "Myles Borins",
+ "email": "myles.borins@gmail.com",
+ "date": "2016-11-11T15:48:36Z"
+ },
+ "message": "v8: update make-v8.sh to use git\n\ngoogle build tool gclient doesn't support\nsvn anymore. Updating v8 build script to use\ngit instead.\n\nPR-URL: https://github.com/nodejs/node/pull/9393\nReviewed By: Sakthipriyan Vairamani \nReviewed-By: Ben Noordhuis \nReviewed-By: Michael Dawson ",
+ "tree": {
+ "sha": "42de90a38ab9499bad7d34a472584b164cc4640c",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/42de90a38ab9499bad7d34a472584b164cc4640c"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/45df0ee7171cf5f9642fb755be1b24075192347c",
+ "comment_count": 0,
+ "verification": {
+ "verified": false,
+ "reason": "unsigned",
+ "signature": null,
+ "payload": null
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/45df0ee7171cf5f9642fb755be1b24075192347c",
+ "html_url": "https://github.com/nodejs/node/commit/45df0ee7171cf5f9642fb755be1b24075192347c",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/45df0ee7171cf5f9642fb755be1b24075192347c/comments",
+ "author": {
+ "login": "jbajwa",
+ "id": 577562,
+ "node_id": "MDQ6VXNlcjU3NzU2Mg==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/577562?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/jbajwa",
+ "html_url": "https://github.com/jbajwa",
+ "followers_url": "https://api.github.com/users/jbajwa/followers",
+ "following_url": "https://api.github.com/users/jbajwa/following{/other_user}",
+ "gists_url": "https://api.github.com/users/jbajwa/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/jbajwa/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/jbajwa/subscriptions",
+ "organizations_url": "https://api.github.com/users/jbajwa/orgs",
+ "repos_url": "https://api.github.com/users/jbajwa/repos",
+ "events_url": "https://api.github.com/users/jbajwa/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/jbajwa/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "MylesBorins",
+ "id": 498775,
+ "node_id": "MDQ6VXNlcjQ5ODc3NQ==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/498775?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/MylesBorins",
+ "html_url": "https://github.com/MylesBorins",
+ "followers_url": "https://api.github.com/users/MylesBorins/followers",
+ "following_url": "https://api.github.com/users/MylesBorins/following{/other_user}",
+ "gists_url": "https://api.github.com/users/MylesBorins/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/MylesBorins/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/MylesBorins/subscriptions",
+ "organizations_url": "https://api.github.com/users/MylesBorins/orgs",
+ "repos_url": "https://api.github.com/users/MylesBorins/repos",
+ "events_url": "https://api.github.com/users/MylesBorins/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/MylesBorins/received_events",
+ "type": "User",
+ "site_admin": true
+ },
+ "parents": [
+ {
+ "sha": "3daf11635dc8e0cf48110514000fd550ed79a425",
+ "url": "https://api.github.com/repos/nodejs/node/commits/3daf11635dc8e0cf48110514000fd550ed79a425",
+ "html_url": "https://github.com/nodejs/node/commit/3daf11635dc8e0cf48110514000fd550ed79a425"
+ }
+ ]
+ },
+ {
+ "sha": "33bcd6fec8a615e4fe65912eaaaa2cec45d781bb",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6MzNiY2Q2ZmVjOGE2MTVlNGZlNjU5MTJlYWFhYTJjZWM0NWQ3ODFiYg==",
+ "commit": {
+ "author": {
+ "name": "Michaƫl Zasso",
+ "email": "targos@protonmail.com",
+ "date": "2016-11-02T10:28:09Z"
+ },
+ "committer": {
+ "name": "Myles Borins",
+ "email": "myles.borins@gmail.com",
+ "date": "2016-11-11T15:49:21Z"
+ },
+ "message": "deps: update V8 to 5.4.500.41\n\nPR-URL: https://github.com/nodejs/node/pull/9412\nReviewed-By: James M Snell \nReviewed-By: Michael Dawson \nReviewed-By: Colin Ihrig \nReviewed-By: Ali Ijaz Sheikh \nReviewed-By: Ben Noordhuis \nReviewed-By: Franziska Hinkelmann ",
+ "tree": {
+ "sha": "d43f807a05457541ca0918db40f77b9529893e5c",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/d43f807a05457541ca0918db40f77b9529893e5c"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/33bcd6fec8a615e4fe65912eaaaa2cec45d781bb",
+ "comment_count": 0,
+ "verification": {
+ "verified": false,
+ "reason": "unsigned",
+ "signature": null,
+ "payload": null
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/33bcd6fec8a615e4fe65912eaaaa2cec45d781bb",
+ "html_url": "https://github.com/nodejs/node/commit/33bcd6fec8a615e4fe65912eaaaa2cec45d781bb",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/33bcd6fec8a615e4fe65912eaaaa2cec45d781bb/comments",
+ "author": {
+ "login": "targos",
+ "id": 2352663,
+ "node_id": "MDQ6VXNlcjIzNTI2NjM=",
+ "avatar_url": "https://avatars.githubusercontent.com/u/2352663?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/targos",
+ "html_url": "https://github.com/targos",
+ "followers_url": "https://api.github.com/users/targos/followers",
+ "following_url": "https://api.github.com/users/targos/following{/other_user}",
+ "gists_url": "https://api.github.com/users/targos/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/targos/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/targos/subscriptions",
+ "organizations_url": "https://api.github.com/users/targos/orgs",
+ "repos_url": "https://api.github.com/users/targos/repos",
+ "events_url": "https://api.github.com/users/targos/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/targos/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "MylesBorins",
+ "id": 498775,
+ "node_id": "MDQ6VXNlcjQ5ODc3NQ==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/498775?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/MylesBorins",
+ "html_url": "https://github.com/MylesBorins",
+ "followers_url": "https://api.github.com/users/MylesBorins/followers",
+ "following_url": "https://api.github.com/users/MylesBorins/following{/other_user}",
+ "gists_url": "https://api.github.com/users/MylesBorins/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/MylesBorins/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/MylesBorins/subscriptions",
+ "organizations_url": "https://api.github.com/users/MylesBorins/orgs",
+ "repos_url": "https://api.github.com/users/MylesBorins/repos",
+ "events_url": "https://api.github.com/users/MylesBorins/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/MylesBorins/received_events",
+ "type": "User",
+ "site_admin": true
+ },
+ "parents": [
+ {
+ "sha": "45df0ee7171cf5f9642fb755be1b24075192347c",
+ "url": "https://api.github.com/repos/nodejs/node/commits/45df0ee7171cf5f9642fb755be1b24075192347c",
+ "html_url": "https://github.com/nodejs/node/commit/45df0ee7171cf5f9642fb755be1b24075192347c"
+ }
+ ]
+ },
+ {
+ "sha": "6b01bfa9d6e582ea5b057ac0435cc565d3ca4e29",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6NmIwMWJmYTlkNmU1ODJlYTViMDU3YWMwNDM1Y2M1NjVkM2NhNGUyOQ==",
+ "commit": {
+ "author": {
+ "name": "Johan Bergstrƶm",
+ "email": "bugs@bergstroem.nu",
+ "date": "2016-10-25T16:26:46Z"
+ },
+ "committer": {
+ "name": "Myles Borins",
+ "email": "myles.borins@gmail.com",
+ "date": "2016-11-11T15:52:08Z"
+ },
+ "message": "gitignore: ignore all tap files\n\nWe now have multiple tap producers; just ignore all\nfiles with the `.tap` extension.\n\nPR-URL: https://github.com/nodejs/node/pull/9262\nReviewed-By: Gibson Fahnestock \nReviewed-By: Ben Noordhuis \nReviewed-By: Myles Borins ",
+ "tree": {
+ "sha": "302c30e2e61b4f6bb5c92ab19cf35f0cbcd088c4",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/302c30e2e61b4f6bb5c92ab19cf35f0cbcd088c4"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/6b01bfa9d6e582ea5b057ac0435cc565d3ca4e29",
+ "comment_count": 0,
+ "verification": {
+ "verified": false,
+ "reason": "unsigned",
+ "signature": null,
+ "payload": null
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/6b01bfa9d6e582ea5b057ac0435cc565d3ca4e29",
+ "html_url": "https://github.com/nodejs/node/commit/6b01bfa9d6e582ea5b057ac0435cc565d3ca4e29",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/6b01bfa9d6e582ea5b057ac0435cc565d3ca4e29/comments",
+ "author": {
+ "login": "jbergstroem",
+ "id": 176984,
+ "node_id": "MDQ6VXNlcjE3Njk4NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/176984?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/jbergstroem",
+ "html_url": "https://github.com/jbergstroem",
+ "followers_url": "https://api.github.com/users/jbergstroem/followers",
+ "following_url": "https://api.github.com/users/jbergstroem/following{/other_user}",
+ "gists_url": "https://api.github.com/users/jbergstroem/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/jbergstroem/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/jbergstroem/subscriptions",
+ "organizations_url": "https://api.github.com/users/jbergstroem/orgs",
+ "repos_url": "https://api.github.com/users/jbergstroem/repos",
+ "events_url": "https://api.github.com/users/jbergstroem/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/jbergstroem/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "MylesBorins",
+ "id": 498775,
+ "node_id": "MDQ6VXNlcjQ5ODc3NQ==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/498775?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/MylesBorins",
+ "html_url": "https://github.com/MylesBorins",
+ "followers_url": "https://api.github.com/users/MylesBorins/followers",
+ "following_url": "https://api.github.com/users/MylesBorins/following{/other_user}",
+ "gists_url": "https://api.github.com/users/MylesBorins/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/MylesBorins/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/MylesBorins/subscriptions",
+ "organizations_url": "https://api.github.com/users/MylesBorins/orgs",
+ "repos_url": "https://api.github.com/users/MylesBorins/repos",
+ "events_url": "https://api.github.com/users/MylesBorins/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/MylesBorins/received_events",
+ "type": "User",
+ "site_admin": true
+ },
+ "parents": [
+ {
+ "sha": "33bcd6fec8a615e4fe65912eaaaa2cec45d781bb",
+ "url": "https://api.github.com/repos/nodejs/node/commits/33bcd6fec8a615e4fe65912eaaaa2cec45d781bb",
+ "html_url": "https://github.com/nodejs/node/commit/33bcd6fec8a615e4fe65912eaaaa2cec45d781bb"
+ }
+ ]
+ },
+ {
+ "sha": "23584e4ec5fd47e20f6a11395b5e672e203fc1ab",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6MjM1ODRlNGVjNWZkNDdlMjBmNmExMTM5NWI1ZTY3MmUyMDNmYzFhYg==",
+ "commit": {
+ "author": {
+ "name": "Johan Bergstrƶm",
+ "email": "bugs@bergstroem.nu",
+ "date": "2016-10-25T15:23:48Z"
+ },
+ "committer": {
+ "name": "Myles Borins",
+ "email": "myles.borins@gmail.com",
+ "date": "2016-11-11T15:52:12Z"
+ },
+ "message": "gtest: output tap comments as yamlish\n\nThis makes yaml-ish parsers happy.\nNote: gtest still seems to output the expected/result slightly\ndifferent making the full traceback less informational.\n\nPR-URL: https://github.com/nodejs/node/pull/9262\nReviewed-By: Gibson Fahnestock \nReviewed-By: Ben Noordhuis \nReviewed-By: Myles Borins ",
+ "tree": {
+ "sha": "cb02fca48a95c89682b6e148e6e0e56a0dfa9fd4",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/cb02fca48a95c89682b6e148e6e0e56a0dfa9fd4"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/23584e4ec5fd47e20f6a11395b5e672e203fc1ab",
+ "comment_count": 0,
+ "verification": {
+ "verified": false,
+ "reason": "unsigned",
+ "signature": null,
+ "payload": null
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/23584e4ec5fd47e20f6a11395b5e672e203fc1ab",
+ "html_url": "https://github.com/nodejs/node/commit/23584e4ec5fd47e20f6a11395b5e672e203fc1ab",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/23584e4ec5fd47e20f6a11395b5e672e203fc1ab/comments",
+ "author": {
+ "login": "jbergstroem",
+ "id": 176984,
+ "node_id": "MDQ6VXNlcjE3Njk4NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/176984?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/jbergstroem",
+ "html_url": "https://github.com/jbergstroem",
+ "followers_url": "https://api.github.com/users/jbergstroem/followers",
+ "following_url": "https://api.github.com/users/jbergstroem/following{/other_user}",
+ "gists_url": "https://api.github.com/users/jbergstroem/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/jbergstroem/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/jbergstroem/subscriptions",
+ "organizations_url": "https://api.github.com/users/jbergstroem/orgs",
+ "repos_url": "https://api.github.com/users/jbergstroem/repos",
+ "events_url": "https://api.github.com/users/jbergstroem/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/jbergstroem/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "MylesBorins",
+ "id": 498775,
+ "node_id": "MDQ6VXNlcjQ5ODc3NQ==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/498775?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/MylesBorins",
+ "html_url": "https://github.com/MylesBorins",
+ "followers_url": "https://api.github.com/users/MylesBorins/followers",
+ "following_url": "https://api.github.com/users/MylesBorins/following{/other_user}",
+ "gists_url": "https://api.github.com/users/MylesBorins/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/MylesBorins/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/MylesBorins/subscriptions",
+ "organizations_url": "https://api.github.com/users/MylesBorins/orgs",
+ "repos_url": "https://api.github.com/users/MylesBorins/repos",
+ "events_url": "https://api.github.com/users/MylesBorins/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/MylesBorins/received_events",
+ "type": "User",
+ "site_admin": true
+ },
+ "parents": [
+ {
+ "sha": "6b01bfa9d6e582ea5b057ac0435cc565d3ca4e29",
+ "url": "https://api.github.com/repos/nodejs/node/commits/6b01bfa9d6e582ea5b057ac0435cc565d3ca4e29",
+ "html_url": "https://github.com/nodejs/node/commit/6b01bfa9d6e582ea5b057ac0435cc565d3ca4e29"
+ }
+ ]
+ },
+ {
+ "sha": "6a94ffb1cfdb41c0746d6055e2fa3ac2f995f4de",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6NmE5NGZmYjFjZmRiNDFjMDc0NmQ2MDU1ZTJmYTNhYzJmOTk1ZjRkZQ==",
+ "commit": {
+ "author": {
+ "name": "Johan Bergstrƶm",
+ "email": "bugs@bergstroem.nu",
+ "date": "2016-10-12T14:34:28Z"
+ },
+ "committer": {
+ "name": "Myles Borins",
+ "email": "myles.borins@gmail.com",
+ "date": "2016-11-11T15:52:17Z"
+ },
+ "message": "test: output tap13 instead of almost-tap\n\nProduce a tap13-compatible output which makes it\nsimpler to parse. Output is still readable by\nthe jenkins tap plugin.\n\nPR-URL: https://github.com/nodejs/node/pull/9262\nReviewed-By: Gibson Fahnestock \nReviewed-By: Ben Noordhuis \nReviewed-By: Myles Borins ",
+ "tree": {
+ "sha": "3ff5006b93047e6ad08d40385a17af4bca89b664",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/3ff5006b93047e6ad08d40385a17af4bca89b664"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/6a94ffb1cfdb41c0746d6055e2fa3ac2f995f4de",
+ "comment_count": 0,
+ "verification": {
+ "verified": false,
+ "reason": "unsigned",
+ "signature": null,
+ "payload": null
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/6a94ffb1cfdb41c0746d6055e2fa3ac2f995f4de",
+ "html_url": "https://github.com/nodejs/node/commit/6a94ffb1cfdb41c0746d6055e2fa3ac2f995f4de",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/6a94ffb1cfdb41c0746d6055e2fa3ac2f995f4de/comments",
+ "author": {
+ "login": "jbergstroem",
+ "id": 176984,
+ "node_id": "MDQ6VXNlcjE3Njk4NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/176984?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/jbergstroem",
+ "html_url": "https://github.com/jbergstroem",
+ "followers_url": "https://api.github.com/users/jbergstroem/followers",
+ "following_url": "https://api.github.com/users/jbergstroem/following{/other_user}",
+ "gists_url": "https://api.github.com/users/jbergstroem/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/jbergstroem/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/jbergstroem/subscriptions",
+ "organizations_url": "https://api.github.com/users/jbergstroem/orgs",
+ "repos_url": "https://api.github.com/users/jbergstroem/repos",
+ "events_url": "https://api.github.com/users/jbergstroem/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/jbergstroem/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "MylesBorins",
+ "id": 498775,
+ "node_id": "MDQ6VXNlcjQ5ODc3NQ==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/498775?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/MylesBorins",
+ "html_url": "https://github.com/MylesBorins",
+ "followers_url": "https://api.github.com/users/MylesBorins/followers",
+ "following_url": "https://api.github.com/users/MylesBorins/following{/other_user}",
+ "gists_url": "https://api.github.com/users/MylesBorins/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/MylesBorins/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/MylesBorins/subscriptions",
+ "organizations_url": "https://api.github.com/users/MylesBorins/orgs",
+ "repos_url": "https://api.github.com/users/MylesBorins/repos",
+ "events_url": "https://api.github.com/users/MylesBorins/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/MylesBorins/received_events",
+ "type": "User",
+ "site_admin": true
+ },
+ "parents": [
+ {
+ "sha": "23584e4ec5fd47e20f6a11395b5e672e203fc1ab",
+ "url": "https://api.github.com/repos/nodejs/node/commits/23584e4ec5fd47e20f6a11395b5e672e203fc1ab",
+ "html_url": "https://github.com/nodejs/node/commit/23584e4ec5fd47e20f6a11395b5e672e203fc1ab"
+ }
+ ]
+ },
+ {
+ "sha": "f0d40e8be37af3a008e2223faefbeb5899ba95d9",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6ZjBkNDBlOGJlMzdhZjNhMDA4ZTIyMjNmYWVmYmViNTg5OWJhOTVkOQ==",
+ "commit": {
+ "author": {
+ "name": "Daniel Bevenius",
+ "email": "daniel.bevenius@gmail.com",
+ "date": "2016-11-05T14:37:36Z"
+ },
+ "committer": {
+ "name": "Myles Borins",
+ "email": "mborins@us.ibm.com",
+ "date": "2016-11-15T20:53:28Z"
+ },
+ "message": "doc: fix link to cli.md in vm.md\n\nLooks like the link to cli.md is missing in vm.md:\nhttps://nodejs.org/api/vm.html#vm_vm_runindebugcontext_code\n\nAdded the link which can be verified by using the following commands:\n$ make doc\n$ open out/doc/api/vm.html\n\nPR-URL: https://github.com/nodejs/node/pull/9481\nReviewed-By: James M Snell \nReviewed-By: Colin Ihrig ",
+ "tree": {
+ "sha": "5910ebcc51b1658331b6ec21ebff5254523de30d",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/5910ebcc51b1658331b6ec21ebff5254523de30d"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/f0d40e8be37af3a008e2223faefbeb5899ba95d9",
+ "comment_count": 0,
+ "verification": {
+ "verified": false,
+ "reason": "unsigned",
+ "signature": null,
+ "payload": null
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/f0d40e8be37af3a008e2223faefbeb5899ba95d9",
+ "html_url": "https://github.com/nodejs/node/commit/f0d40e8be37af3a008e2223faefbeb5899ba95d9",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/f0d40e8be37af3a008e2223faefbeb5899ba95d9/comments",
+ "author": {
+ "login": "danbev",
+ "id": 432351,
+ "node_id": "MDQ6VXNlcjQzMjM1MQ==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/432351?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/danbev",
+ "html_url": "https://github.com/danbev",
+ "followers_url": "https://api.github.com/users/danbev/followers",
+ "following_url": "https://api.github.com/users/danbev/following{/other_user}",
+ "gists_url": "https://api.github.com/users/danbev/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/danbev/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/danbev/subscriptions",
+ "organizations_url": "https://api.github.com/users/danbev/orgs",
+ "repos_url": "https://api.github.com/users/danbev/repos",
+ "events_url": "https://api.github.com/users/danbev/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/danbev/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": null,
+ "parents": [
+ {
+ "sha": "6a94ffb1cfdb41c0746d6055e2fa3ac2f995f4de",
+ "url": "https://api.github.com/repos/nodejs/node/commits/6a94ffb1cfdb41c0746d6055e2fa3ac2f995f4de",
+ "html_url": "https://github.com/nodejs/node/commit/6a94ffb1cfdb41c0746d6055e2fa3ac2f995f4de"
+ }
+ ]
+ },
+ {
+ "sha": "ee65b4872de2357a239c7ccfa64aad54b8b3c796",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6ZWU2NWI0ODcyZGUyMzU3YTIzOWM3Y2NmYTY0YWFkNTRiOGIzYzc5Ng==",
+ "commit": {
+ "author": {
+ "name": "Fedor Indutny",
+ "email": "fedor@indutny.com",
+ "date": "2016-11-12T21:08:59Z"
+ },
+ "committer": {
+ "name": "Myles Borins",
+ "email": "mborins@us.ibm.com",
+ "date": "2016-11-16T19:11:53Z"
+ },
+ "message": "tls: fix leak of WriteWrap+TLSWrap combination\n\nWriting data to TLSWrap instance during handshake will result in it\nbeing queued in `write_item_queue_`. This queue won't get cleared up\nuntil the end of the handshake.\n\nTechnically, it gets cleared on `~TLSWrap` invocation, however this\nwon't ever happen because every `WriteWrap` holds a reference to the\n`TLSWrap` through JS object, meaning that they are doomed to be alive\nfor eternity.\n\nTo breach this dreadful contract a knight shall embark from the\n`close` function to kill the dragon of memory leak with his magic\nspear of `destroySSL`.\n\n`destroySSL` cleans up `write_item_queue_` and frees `SSL` structure,\nboth are good for memory usage.\n\nPR-URL: https://github.com/nodejs/node/pull/9586\nReviewed-By: Ben Noordhuis ",
+ "tree": {
+ "sha": "6b91062d8d9203e9aec6633c468c149a3d0295d4",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/6b91062d8d9203e9aec6633c468c149a3d0295d4"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/ee65b4872de2357a239c7ccfa64aad54b8b3c796",
+ "comment_count": 0,
+ "verification": {
+ "verified": false,
+ "reason": "unsigned",
+ "signature": null,
+ "payload": null
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/ee65b4872de2357a239c7ccfa64aad54b8b3c796",
+ "html_url": "https://github.com/nodejs/node/commit/ee65b4872de2357a239c7ccfa64aad54b8b3c796",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/ee65b4872de2357a239c7ccfa64aad54b8b3c796/comments",
+ "author": {
+ "login": "indutny",
+ "id": 238531,
+ "node_id": "MDQ6VXNlcjIzODUzMQ==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/238531?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/indutny",
+ "html_url": "https://github.com/indutny",
+ "followers_url": "https://api.github.com/users/indutny/followers",
+ "following_url": "https://api.github.com/users/indutny/following{/other_user}",
+ "gists_url": "https://api.github.com/users/indutny/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/indutny/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/indutny/subscriptions",
+ "organizations_url": "https://api.github.com/users/indutny/orgs",
+ "repos_url": "https://api.github.com/users/indutny/repos",
+ "events_url": "https://api.github.com/users/indutny/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/indutny/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": null,
+ "parents": [
+ {
+ "sha": "f0d40e8be37af3a008e2223faefbeb5899ba95d9",
+ "url": "https://api.github.com/repos/nodejs/node/commits/f0d40e8be37af3a008e2223faefbeb5899ba95d9",
+ "html_url": "https://github.com/nodejs/node/commit/f0d40e8be37af3a008e2223faefbeb5899ba95d9"
+ }
+ ]
+ },
+ {
+ "sha": "3efb43c8bab0c0a64af916265d14febba207ca49",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6M2VmYjQzYzhiYWIwYzBhNjRhZjkxNjI2NWQxNGZlYmJhMjA3Y2E0OQ==",
+ "commit": {
+ "author": {
+ "name": "Wayne Andrews",
+ "email": "andreww@uk.ibm.com",
+ "date": "2016-10-14T12:33:25Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:32:13Z"
+ },
+ "message": "build: Add option to compile for coverage reports\n\nAdd --coverage option to configure to support\ncompiling for generation of C based coverage reports\n\nPR-URL: https://github.com/nodejs/node/pull/9463\nReviewed-By: Anna Henningsen \nReviewed-By: James M Snell \nReviewed-By: Colin Ihrig \nReviewed-By: Michael Dawson ",
+ "tree": {
+ "sha": "b00a3652dcdbf8bca349e7f266ca0679be78c85f",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/b00a3652dcdbf8bca349e7f266ca0679be78c85f"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/3efb43c8bab0c0a64af916265d14febba207ca49",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9hdAAoJENi59a6uhOTPmbEP/01WHeKO8WZ3EtZ5UKOfaguX\no3W1nrVr73gkT8N/uKVazLQ/k701uX4Rui5nFy9tg+mNA7IYal5xtxvuDpBe3yMO\np07JFjuNx2uWjGYnuRdBVLp9kBxmALOo3VETZiQgt8xYr0L+k3G3lwadW7PBRZ0h\nfLxTF/CvNzSGvHi15fC7XoEUwUQU75Tehraq7FkeGaEQEiBOkKnXRRQa9N7PMubd\ne9qSdKdGlRfChFp6Bn0v65B2mXRnd01ByEiYKlY6wXX8bhIR4fjOHXzoGs47a0oB\nNb3G1lmOOs+5V82Ix/hxA1G9rFEW21W4KRlBx3B15RoVrWDFWT1KgUBX/N9QfN55\n46FRd0NmrSwnM5Ei4Cmho1Y3SftcGi+pZdMXFnz/wkqxe8GAGhjQ+J67FUkZWRck\nu65ojPe8Tz9I56XO2nZ8E1s64x7HpLsW8qw7AzkBtIoqpCA0Q9z63qDL0gj0R7Sl\nwUkUVQm6VRj76H99Pd2/mxLRvFDO4pZgCcvVOHR6E2uvqIYteJc1+0s3kJh/3mhf\nilsLAEhcvUhpjq9XOnJcF5ydK6H9It7AwIpPGYCXAsvy3MmmqxviQJi9a+V6yq5M\n0mYOr2lVL0LfyhXUfmP0Dbck9FT1MHwcdpVnUlI4cyhnn26hgm5AWqCAM9R+kH3k\nnRDmuyKiHHURP8Fzr9ij\n=v5D3\n-----END PGP SIGNATURE-----",
+ "payload": "tree b00a3652dcdbf8bca349e7f266ca0679be78c85f\nparent ee65b4872de2357a239c7ccfa64aad54b8b3c796\nauthor Wayne Andrews 1476448405 +0100\ncommitter Anna Henningsen 1479792733 +0100\n\nbuild: Add option to compile for coverage reports\n\nAdd --coverage option to configure to support\ncompiling for generation of C based coverage reports\n\nPR-URL: https://github.com/nodejs/node/pull/9463\nReviewed-By: Anna Henningsen \nReviewed-By: James M Snell \nReviewed-By: Colin Ihrig \nReviewed-By: Michael Dawson \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/3efb43c8bab0c0a64af916265d14febba207ca49",
+ "html_url": "https://github.com/nodejs/node/commit/3efb43c8bab0c0a64af916265d14febba207ca49",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/3efb43c8bab0c0a64af916265d14febba207ca49/comments",
+ "author": {
+ "login": "CurryKitten",
+ "id": 12443664,
+ "node_id": "MDQ6VXNlcjEyNDQzNjY0",
+ "avatar_url": "https://avatars.githubusercontent.com/u/12443664?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/CurryKitten",
+ "html_url": "https://github.com/CurryKitten",
+ "followers_url": "https://api.github.com/users/CurryKitten/followers",
+ "following_url": "https://api.github.com/users/CurryKitten/following{/other_user}",
+ "gists_url": "https://api.github.com/users/CurryKitten/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/CurryKitten/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/CurryKitten/subscriptions",
+ "organizations_url": "https://api.github.com/users/CurryKitten/orgs",
+ "repos_url": "https://api.github.com/users/CurryKitten/repos",
+ "events_url": "https://api.github.com/users/CurryKitten/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/CurryKitten/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "ee65b4872de2357a239c7ccfa64aad54b8b3c796",
+ "url": "https://api.github.com/repos/nodejs/node/commits/ee65b4872de2357a239c7ccfa64aad54b8b3c796",
+ "html_url": "https://github.com/nodejs/node/commit/ee65b4872de2357a239c7ccfa64aad54b8b3c796"
+ }
+ ]
+ },
+ {
+ "sha": "9491352b8645d8e667592d75283bcf5257f341ea",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6OTQ5MTM1MmI4NjQ1ZDhlNjY3NTkyZDc1MjgzYmNmNTI1N2YzNDFlYQ==",
+ "commit": {
+ "author": {
+ "name": "Rich Trott",
+ "email": "rtrott@gmail.com",
+ "date": "2016-11-05T06:04:36Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:32:13Z"
+ },
+ "message": "test: remove watchdog in test-debug-signal-cluster\n\ntest-debug-signal-cluster contains a watchdog timer that results in\nfalse positives in CI. Remove the watchdog timer and let the test runner\ndetermine that the test has timed out.\n\nPR-URL: https://github.com/nodejs/node/pull/9476\nReviewed-By: Michaƫl Zasso \nReviewed-By: Colin Ihrig \nReviewed-By: Santiago Gimeno \nReviewed-By: James M Snell ",
+ "tree": {
+ "sha": "858c4139aec20ef74c1fe67054755ecde7ecd8aa",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/858c4139aec20ef74c1fe67054755ecde7ecd8aa"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/9491352b8645d8e667592d75283bcf5257f341ea",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9hdAAoJENi59a6uhOTPuHsP/2H9WyBMGvKhI7VteoI0HkwR\njRiFkMedorQ8pTZZ+DVRnVuswTloR0G9KSg0DlSRO8hQXB9gu8ZT8viB4iylPMV3\nWH6zIZ/SRkDjFCE4OaOkyeIYec23k8n9OwPuw851OfOVoZDU8kSyjzmNrqz1nk/m\nakb0XIA2C4dvZbjXPPxNvYhtQmy/lcDDI98MlEgJQ+dgL82VY+uMXbx6tY5kHu5/\nXgum+b03UEgcAmkb7w8OFx3KxkgauUrMt5KOiO92eKGfxb0g1zRT5M/taJrOLN5y\neSAsN/A14DWgBMjElQiymLes+/21RetKmxxwddxwJprvmCrY7rGK7UjrZMxYCgpl\nV7uNi/8MtTEVJGja2jGYKD4BvXBDHSznqQUrqB6ARc3scyHpf2VasLCXbNuGRV9D\nIqUTKVAqj5TpntfMfaASsAjT5gVYF/mEmz1Mmnzedj7i8AYYilny5vm+ytuwSzlf\nkujZ4Oc1ABRnV8oLNR7zLtPkdjvhiw76ytVHARu5UrzpcJK3G/3XNPeVhhqVP5vh\nJNRNE8ZwwXAolxWRiLOM9eencom2r+TpqoXFcuZJWJyspG2MvFK9KdICE3XOP6Jh\nhdLGE82HWV9r1qNXT+USj9ek1exhct3/HS586GbreFVvMJNd260viBF8FMYGPB00\n7QBXd0wVxuhFvCwqQes8\n=NPZ3\n-----END PGP SIGNATURE-----",
+ "payload": "tree 858c4139aec20ef74c1fe67054755ecde7ecd8aa\nparent 3efb43c8bab0c0a64af916265d14febba207ca49\nauthor Rich Trott 1478325876 -0700\ncommitter Anna Henningsen 1479792733 +0100\n\ntest: remove watchdog in test-debug-signal-cluster\n\ntest-debug-signal-cluster contains a watchdog timer that results in\nfalse positives in CI. Remove the watchdog timer and let the test runner\ndetermine that the test has timed out.\n\nPR-URL: https://github.com/nodejs/node/pull/9476\nReviewed-By: Michaƫl Zasso \nReviewed-By: Colin Ihrig \nReviewed-By: Santiago Gimeno \nReviewed-By: James M Snell \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/9491352b8645d8e667592d75283bcf5257f341ea",
+ "html_url": "https://github.com/nodejs/node/commit/9491352b8645d8e667592d75283bcf5257f341ea",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/9491352b8645d8e667592d75283bcf5257f341ea/comments",
+ "author": {
+ "login": "Trott",
+ "id": 718899,
+ "node_id": "MDQ6VXNlcjcxODg5OQ==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/718899?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/Trott",
+ "html_url": "https://github.com/Trott",
+ "followers_url": "https://api.github.com/users/Trott/followers",
+ "following_url": "https://api.github.com/users/Trott/following{/other_user}",
+ "gists_url": "https://api.github.com/users/Trott/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/Trott/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/Trott/subscriptions",
+ "organizations_url": "https://api.github.com/users/Trott/orgs",
+ "repos_url": "https://api.github.com/users/Trott/repos",
+ "events_url": "https://api.github.com/users/Trott/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/Trott/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "3efb43c8bab0c0a64af916265d14febba207ca49",
+ "url": "https://api.github.com/repos/nodejs/node/commits/3efb43c8bab0c0a64af916265d14febba207ca49",
+ "html_url": "https://github.com/nodejs/node/commit/3efb43c8bab0c0a64af916265d14febba207ca49"
+ }
+ ]
+ },
+ {
+ "sha": "841a2c41d43f61361dff3fcf028f08cc134d122d",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6ODQxYTJjNDFkNDNmNjEzNjFkZmYzZmNmMDI4ZjA4Y2MxMzRkMTIyZA==",
+ "commit": {
+ "author": {
+ "name": "solebox",
+ "email": "5013box@gmail.com",
+ "date": "2016-10-31T23:11:18Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:32:14Z"
+ },
+ "message": "zlib: name every function Ref: #8913\n\nPR-URL: https://github.com/nodejs/node/pull/9389\nReviewed-By: Roman Reiss \nReviewed-By: James M Snell \nReviewed-By: Michael Dawson ",
+ "tree": {
+ "sha": "03f855375f49fe576f3e927706f013d000d75694",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/03f855375f49fe576f3e927706f013d000d75694"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/841a2c41d43f61361dff3fcf028f08cc134d122d",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9heAAoJENi59a6uhOTPALgQALuCbks2qsz3wkxla7T7YLiX\nT6R4LxXWLJefIx89NNAImKXb7HG3Fa8mmDb8Y/yjndIjowM42Ddg6X2oiGVo9j0w\nRHX9WawawCBgkF2SmAO5K1ZtDyMblo6XeofOYsluSU0w3mChfxQPmLGa7YU7rou8\n+7LZYz2w/Aeo7qbRmebZ4mHob6OTStNWmQvsu7JUrYTmN7hZuCxgGVcSMXCMMpF2\n/5RH0xIR+cTzcu3skB49jVIPwXr3pGS0IgWyXabsr58ZIru7m+fSxP47XR58zdKu\ng+8aWq29IlvVgfn/M6BbxqnwP02oGHJ5uX/nJ6NyqGAkeEaKX7XGNUonk6W12DDs\nCMcDUYAUXQExA4KHo7z/PLEfVXKx1bsmXU8cGp3YgxHN6NowHJ+XsUhlAZkm6dUP\nbr/i98ZhpU3p0eOZrBPjd/YeYGZnR7Ue7lPsmudTpX+lsdT/ktsSD1/Q8Mwych52\n/tql9J4gxKd40Rhh9XVKJ41s8fLeAcSG264OwmF38r4yQZgg2ECKDsLPk6MLxeX6\np3Zd8/4nOdEdsYJpYoR77eLqc06sXkv9fSDvJqTHyk3NsqDc24AgYT7qFrVLc1g3\nSXeHL+xGG4vm0MNCX6Q2gALZVUZiEmnNbdjJ8uxhzBQjVwkNaZA3AkzSwGVufa1G\n3z5Gg9RMAEQLUY97LCMJ\n=HtRB\n-----END PGP SIGNATURE-----",
+ "payload": "tree 03f855375f49fe576f3e927706f013d000d75694\nparent 9491352b8645d8e667592d75283bcf5257f341ea\nauthor solebox <5013box@gmail.com> 1477955478 +0200\ncommitter Anna Henningsen 1479792734 +0100\n\nzlib: name every function Ref: #8913\n\nPR-URL: https://github.com/nodejs/node/pull/9389\nReviewed-By: Roman Reiss \nReviewed-By: James M Snell \nReviewed-By: Michael Dawson \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/841a2c41d43f61361dff3fcf028f08cc134d122d",
+ "html_url": "https://github.com/nodejs/node/commit/841a2c41d43f61361dff3fcf028f08cc134d122d",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/841a2c41d43f61361dff3fcf028f08cc134d122d/comments",
+ "author": {
+ "login": "solebox",
+ "id": 103052,
+ "node_id": "MDQ6VXNlcjEwMzA1Mg==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/103052?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/solebox",
+ "html_url": "https://github.com/solebox",
+ "followers_url": "https://api.github.com/users/solebox/followers",
+ "following_url": "https://api.github.com/users/solebox/following{/other_user}",
+ "gists_url": "https://api.github.com/users/solebox/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/solebox/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/solebox/subscriptions",
+ "organizations_url": "https://api.github.com/users/solebox/orgs",
+ "repos_url": "https://api.github.com/users/solebox/repos",
+ "events_url": "https://api.github.com/users/solebox/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/solebox/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "9491352b8645d8e667592d75283bcf5257f341ea",
+ "url": "https://api.github.com/repos/nodejs/node/commits/9491352b8645d8e667592d75283bcf5257f341ea",
+ "html_url": "https://github.com/nodejs/node/commit/9491352b8645d8e667592d75283bcf5257f341ea"
+ }
+ ]
+ },
+ {
+ "sha": "adcc5b15f77ff962b607c2b10e223fe1f6d767ba",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6YWRjYzViMTVmNzdmZjk2MmI2MDdjMmIxMGUyMjNmZTFmNmQ3NjdiYQ==",
+ "commit": {
+ "author": {
+ "name": "Rich Trott",
+ "email": "rtrott@gmail.com",
+ "date": "2016-11-09T00:32:07Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:32:14Z"
+ },
+ "message": "zlib: fix linting recently-introduced lint error\n\nRemove unnecessary named function. V8 will do a better job inferring the\nname from the assignment to a property. The current formulation does not\npass linting.\n\nPR-URL: https://github.com/nodejs/node/pull/9524\nReviewed-By: Anna Henningsen ",
+ "tree": {
+ "sha": "ed096837f872575726cec31b433e1f149c64f1da",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/ed096837f872575726cec31b433e1f149c64f1da"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/adcc5b15f77ff962b607c2b10e223fe1f6d767ba",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9heAAoJENi59a6uhOTPXq4P/iScnZGxQ3UovKiI6xC3SIRj\nALmeqnWkCsDjskYM/rgRyLJ56ef5LKjOi8EYrl+8qgFM85vz4eOs0u4z64LW8/rY\nYKhmPCs4OcNnjdRSjM9wJZTQZVeECQFMj4JbyMjQwxPKPMEVHJyJGCEZxgNRwRCE\n37ssvYNxZ/eDyhazyVwiKKZ9V1tmaf/8kCYAXwMB4b2UeaW4dS2A1rFV/lnTyXbZ\npgNRrTm/KBKsyN0y8iE9g5ZLhzxo5pT+YBgBuGZu6dAZgfNZVFxDsi0AxhHonrJ7\nZB7/ff++m7DC4QA9Iz9D9E4ORjeYY+f3i+kYloL5sqOXP8Jx//j8mbZlfZo9J6pH\nqfMJBTP5KqeV+YF/m64ODJ5WtgzgND8KBSxjk3zcuqYg+DMGGpmenv9jTS+ocowP\nTcc01bSWFFrYZ6SGdASVib6F1Bt8Ti85yKpW26aI+6r1pthSsCHYG7nYzWEQzbrt\nu50J5PZisafITAI5wjADgWrap/DMEGLpLLZUl5PGeIa12Fi2Wu2tEyO0OxeDAbCq\nHwh7In3EEg0YRQxnE3LpdR+JCSKaFI8Y+bPCbtT1Z4hu7VEByI78E262t/Wd2Wtf\np6O1nS+n52cdavY2W1iYy72sjQ3MKxiclFLRjyzaOc9+CHEgq/RH3Gm9QBmLWbke\nRIOI0aLPNeKPryUSyt/O\n=k3Ot\n-----END PGP SIGNATURE-----",
+ "payload": "tree ed096837f872575726cec31b433e1f149c64f1da\nparent 841a2c41d43f61361dff3fcf028f08cc134d122d\nauthor Rich Trott 1478651527 -0800\ncommitter Anna Henningsen 1479792734 +0100\n\nzlib: fix linting recently-introduced lint error\n\nRemove unnecessary named function. V8 will do a better job inferring the\nname from the assignment to a property. The current formulation does not\npass linting.\n\nPR-URL: https://github.com/nodejs/node/pull/9524\nReviewed-By: Anna Henningsen \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/adcc5b15f77ff962b607c2b10e223fe1f6d767ba",
+ "html_url": "https://github.com/nodejs/node/commit/adcc5b15f77ff962b607c2b10e223fe1f6d767ba",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/adcc5b15f77ff962b607c2b10e223fe1f6d767ba/comments",
+ "author": {
+ "login": "Trott",
+ "id": 718899,
+ "node_id": "MDQ6VXNlcjcxODg5OQ==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/718899?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/Trott",
+ "html_url": "https://github.com/Trott",
+ "followers_url": "https://api.github.com/users/Trott/followers",
+ "following_url": "https://api.github.com/users/Trott/following{/other_user}",
+ "gists_url": "https://api.github.com/users/Trott/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/Trott/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/Trott/subscriptions",
+ "organizations_url": "https://api.github.com/users/Trott/orgs",
+ "repos_url": "https://api.github.com/users/Trott/repos",
+ "events_url": "https://api.github.com/users/Trott/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/Trott/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "841a2c41d43f61361dff3fcf028f08cc134d122d",
+ "url": "https://api.github.com/repos/nodejs/node/commits/841a2c41d43f61361dff3fcf028f08cc134d122d",
+ "html_url": "https://github.com/nodejs/node/commit/841a2c41d43f61361dff3fcf028f08cc134d122d"
+ }
+ ]
+ },
+ {
+ "sha": "6f513e0b46bde53c885b404cce088548daad39d9",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6NmY1MTNlMGI0NmJkZTUzYzg4NWI0MDRjY2UwODg1NDhkYWFkMzlkOQ==",
+ "commit": {
+ "author": {
+ "name": "Oscar Morrison",
+ "email": "me@oscarmorrison.com",
+ "date": "2016-07-27T12:39:18Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:32:15Z"
+ },
+ "message": "doc: add npm link to README\n\nPR-URL: https://github.com/nodejs/node/pull/7894\nReviewed-By: Anna Henningsen \nReviewed-By: James M Snell \nReviewed-By: Roman Reiss \nReviewed-By: Luigi Pinca ",
+ "tree": {
+ "sha": "98789947ba00275ccd471f046728355ce28f587d",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/98789947ba00275ccd471f046728355ce28f587d"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/6f513e0b46bde53c885b404cce088548daad39d9",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9hfAAoJENi59a6uhOTPFXAP/3+YGFegIESGKSeJC+ZcvXtL\nLcpzGydaeblI+3vbyHYWcAQ+3w7JEqtFzhEXdVI0QCnmB5tyyThgvrz5rcPRjche\nzYXqckCNuDoQEixRgh7H1/3CCmjdqw2OqSezByUhrm//SP+QtwoR8b7/CVjvSPLv\njx+krUFmFu0O0MMg7WcYjqsd7HSQOUcm8Bst9hnVKKXVkfna51Vy+pLoEAVsuGE1\nRxttoToPghB1nOQpm/+14xbG5R4k0m4II7j10a4AnZqFLfODUzAudR5dCCoL9ELm\nsQy30+03RSbwpE7UVvv4YZyZpqNHZ3ljVvGdN1s/XHcGG3ap8vI1IyAWMkkDKgjj\n1HN1EMBn5kw9OkoV1Bm302ZGqy50bimcVy/iJdkz9T932rpThKZB4pkEXgkcJz8A\nxL6jbdiqhrUbBQGWiv6bXdGf1Fp8GeHEmM3H4CNQGbPYte+j1KNt/iN/e60/ZX5t\n5FcNDONjaMNfGl1yYUkv/NKZEzDjYqyncSxQk8IHbcOCRroh/HgASZr5wu+CvVsn\ncZacNVdMPxw06WSTv1eRzqHZeuXUSWqbEcyaLz4ae8KVO8kdJUdeALt1qCWEFxVZ\nG11CC1k54o2tCmK8BvuzM1r16ZhjPDmOQw/xmzl/vTzxkJsL6CGTyEZ5bjkABPYU\negaeb4aiwM9diaHSspIk\n=Z0Ar\n-----END PGP SIGNATURE-----",
+ "payload": "tree 98789947ba00275ccd471f046728355ce28f587d\nparent adcc5b15f77ff962b607c2b10e223fe1f6d767ba\nauthor Oscar Morrison 1469623158 -0400\ncommitter Anna Henningsen 1479792735 +0100\n\ndoc: add npm link to README\n\nPR-URL: https://github.com/nodejs/node/pull/7894\nReviewed-By: Anna Henningsen \nReviewed-By: James M Snell \nReviewed-By: Roman Reiss \nReviewed-By: Luigi Pinca \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/6f513e0b46bde53c885b404cce088548daad39d9",
+ "html_url": "https://github.com/nodejs/node/commit/6f513e0b46bde53c885b404cce088548daad39d9",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/6f513e0b46bde53c885b404cce088548daad39d9/comments",
+ "author": {
+ "login": "oscarmorrison",
+ "id": 1651212,
+ "node_id": "MDQ6VXNlcjE2NTEyMTI=",
+ "avatar_url": "https://avatars.githubusercontent.com/u/1651212?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/oscarmorrison",
+ "html_url": "https://github.com/oscarmorrison",
+ "followers_url": "https://api.github.com/users/oscarmorrison/followers",
+ "following_url": "https://api.github.com/users/oscarmorrison/following{/other_user}",
+ "gists_url": "https://api.github.com/users/oscarmorrison/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/oscarmorrison/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/oscarmorrison/subscriptions",
+ "organizations_url": "https://api.github.com/users/oscarmorrison/orgs",
+ "repos_url": "https://api.github.com/users/oscarmorrison/repos",
+ "events_url": "https://api.github.com/users/oscarmorrison/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/oscarmorrison/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "adcc5b15f77ff962b607c2b10e223fe1f6d767ba",
+ "url": "https://api.github.com/repos/nodejs/node/commits/adcc5b15f77ff962b607c2b10e223fe1f6d767ba",
+ "html_url": "https://github.com/nodejs/node/commit/adcc5b15f77ff962b607c2b10e223fe1f6d767ba"
+ }
+ ]
+ },
+ {
+ "sha": "f5442ece33d5b5291c80afcc1125e22eddedd8da",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6ZjU0NDJlY2UzM2Q1YjUyOTFjODBhZmNjMTEyNWUyMmVkZGVkZDhkYQ==",
+ "commit": {
+ "author": {
+ "name": "Rich Trott",
+ "email": "rtrott@gmail.com",
+ "date": "2016-11-06T02:08:31Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:32:15Z"
+ },
+ "message": "lib,test: remove unneeded escaping of /\n\nThe `/` character does not need to be escaped when occurring inside a\ncharacter class in a regular expression. Remove such instances of\nescaping in the code base.\n\nPR-URL: https://github.com/nodejs/node/pull/9485\nReviewed-By: Prince John Wesley \nReviewed-By: Colin Ihrig \nReviewed-By: Teddy Katz \nReviewed-By: James M Snell \nReviewed-By: Roman Reiss ",
+ "tree": {
+ "sha": "a24356f5ef7b6270eacbc881b81b5fcdb4643f3f",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/a24356f5ef7b6270eacbc881b81b5fcdb4643f3f"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/f5442ece33d5b5291c80afcc1125e22eddedd8da",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9hgAAoJENi59a6uhOTPmBMP/jphWvoYkIx2GNpeNWQ9U1BK\nOFVaUwmETAEXjBfMEelCyQRc2FtstB3cjFMp8lWEIf8hNlxknhZCy3ZFgX6N6lGU\ncGjDrciRtUeYCOAxLbsSKiaq4pupPUezyN/qAzH1UV3f+OVeGzmZkQ/auT5kxlPy\nL5itPNGWjKDpKlicVoqKzOLDWdHk2lBVHNX3z3rJ71tVq+dmYl/tLmxEkTB6Fnk3\n0YlykkN6Kdn3v7WmbDgGSv5gqmDYcqXfSsx2Rk0+gwIJXSJGc4o1mGKCX5bCO90r\njw0ImtJDruSL9gV5mL8RBIZVCGeaGbz0peDg1rYmFeGp4Ta6nvKwTyHa+XEBc9Mp\nJysOz1BC7mpI1t0kETq/4AP3rSMlmLaPzzBZ8BvQVAi10JyT+PujiXOnYS537jAe\ndFjV9AOSri8QFm4LkGXbNimklRWQQPVw3kTS/xRC6Zv4IvR7R7wKgx5QoY74max7\nSYThXIDgGrv9+xVQ1zBtEFoZJT/SNTse2aNsPoU5NR1ItTvSOMdY09W/HLWPkW0S\nOZbOM9iI7T+drfcJfpY1SGIBpTYCSsplAxmnKTl4SQ5l5FToCKUApG2UCmc+IdMz\n2K+APhqCzaWotZztUW4WPgpFnKFmedsJRGWK4rqTd73Fw1xMPaaZlHOnAIfTatue\nOmPfznEEycNcltDyKMWG\n=lubY\n-----END PGP SIGNATURE-----",
+ "payload": "tree a24356f5ef7b6270eacbc881b81b5fcdb4643f3f\nparent 6f513e0b46bde53c885b404cce088548daad39d9\nauthor Rich Trott 1478398111 -0700\ncommitter Anna Henningsen 1479792735 +0100\n\nlib,test: remove unneeded escaping of /\n\nThe `/` character does not need to be escaped when occurring inside a\ncharacter class in a regular expression. Remove such instances of\nescaping in the code base.\n\nPR-URL: https://github.com/nodejs/node/pull/9485\nReviewed-By: Prince John Wesley \nReviewed-By: Colin Ihrig \nReviewed-By: Teddy Katz \nReviewed-By: James M Snell \nReviewed-By: Roman Reiss \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/f5442ece33d5b5291c80afcc1125e22eddedd8da",
+ "html_url": "https://github.com/nodejs/node/commit/f5442ece33d5b5291c80afcc1125e22eddedd8da",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/f5442ece33d5b5291c80afcc1125e22eddedd8da/comments",
+ "author": {
+ "login": "Trott",
+ "id": 718899,
+ "node_id": "MDQ6VXNlcjcxODg5OQ==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/718899?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/Trott",
+ "html_url": "https://github.com/Trott",
+ "followers_url": "https://api.github.com/users/Trott/followers",
+ "following_url": "https://api.github.com/users/Trott/following{/other_user}",
+ "gists_url": "https://api.github.com/users/Trott/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/Trott/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/Trott/subscriptions",
+ "organizations_url": "https://api.github.com/users/Trott/orgs",
+ "repos_url": "https://api.github.com/users/Trott/repos",
+ "events_url": "https://api.github.com/users/Trott/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/Trott/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "6f513e0b46bde53c885b404cce088548daad39d9",
+ "url": "https://api.github.com/repos/nodejs/node/commits/6f513e0b46bde53c885b404cce088548daad39d9",
+ "html_url": "https://github.com/nodejs/node/commit/6f513e0b46bde53c885b404cce088548daad39d9"
+ }
+ ]
+ },
+ {
+ "sha": "ee7606940acfd322e64a4d07db3e8d5b00574dcf",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6ZWU3NjA2OTQwYWNmZDMyMmU2NGE0ZDA3ZGIzZThkNWIwMDU3NGRjZg==",
+ "commit": {
+ "author": {
+ "name": "Rich Trott",
+ "email": "rtrott@gmail.com",
+ "date": "2016-11-06T02:20:17Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:32:16Z"
+ },
+ "message": "test: fix helper-debugger-repl.js\n\nThe test `debugger/test-debugger-repl-break-in-module` (and probably\nothers) was failing because the handshake message for debugging is no\nlonger `listening on port ` but is instead `listening on\n:`.\n\nThis change makes the check less strict so as to hopefully future-proof\nit at least a little bit against subsequent changes.\n\nThis test failure is not caught in CI because currently debugger tests\nare not run in CI.\n\nPR-URL: https://github.com/nodejs/node/pull/9486\nReviewed-By: Colin Ihrig \nReviewed-By: Santiago Gimeno \nReviewed-By: James M Snell \nReviewed-By: Minwoo Jung \nReviewed-By: Prince John Wesley ",
+ "tree": {
+ "sha": "22c2bba8dbc71c57721020a1d16bc5bc3288224b",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/22c2bba8dbc71c57721020a1d16bc5bc3288224b"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/ee7606940acfd322e64a4d07db3e8d5b00574dcf",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9hgAAoJENi59a6uhOTPWY4P/3TUe1IC0xqeCEQgD8FAL6rA\nJ7uACzszOIbyyAFyGjzN1kfRa30ydK02CrfNef/Do6oWmyBUeFs0FBDiOhXL8GEV\nz4pP8cWA1DR4quZPSGmCds45xIBO+1xJzNLVxxsTKq3UkLiHYGPelKlREhjL1jIJ\nWJah7KIjiMW7oo6N8Y8lYsS2Uagc/+Sa69WIE68WbMsN5fWVQ2IhDaEAiVoohgTq\nRvh7mbxWaxeH447o8Y3H7UDJSfk6nae9WpAERF6UoYHB9KYSc3bzByTe7Mjv3zQ9\nU0nScrS0CgWxf0J13gHlGhYeGeNt3wioJ/ezAwgaxNsrMvLfiaVrBiHDWwUUplS0\no9nt/MR3zi0cQJ1wgRIdigURQ0cePBAvpEsYuZlZnyu4AiJawBG7J0MQF6a2fpsl\nTXwxDUNaSfM83+hjqVJflsBK8GDKihzSWigobvkOuKMZ34ZzNW6vcELBCKm/+7k+\nlNvOGqwF0MieNF9gozm020S6BIFs5wRDuAQy81vYUygXKfzRHX3dO2LJnCJsgziK\niwnyFMLptzCWlLUgpFgnDLHUxEyGEntXChd7lQP5wSz9v1uGsBTYtfoWGlvsfKnD\ne3Ypvsqd1jMIDszvJMH7o1DI/xfa12znH/+Dpt+6eELyl5PV6TS2rV/XSabY1p87\njSgX9fAT/0coNVEZ7xX+\n=Uvui\n-----END PGP SIGNATURE-----",
+ "payload": "tree 22c2bba8dbc71c57721020a1d16bc5bc3288224b\nparent f5442ece33d5b5291c80afcc1125e22eddedd8da\nauthor Rich Trott 1478398817 -0700\ncommitter Anna Henningsen 1479792736 +0100\n\ntest: fix helper-debugger-repl.js\n\nThe test `debugger/test-debugger-repl-break-in-module` (and probably\nothers) was failing because the handshake message for debugging is no\nlonger `listening on port ` but is instead `listening on\n:`.\n\nThis change makes the check less strict so as to hopefully future-proof\nit at least a little bit against subsequent changes.\n\nThis test failure is not caught in CI because currently debugger tests\nare not run in CI.\n\nPR-URL: https://github.com/nodejs/node/pull/9486\nReviewed-By: Colin Ihrig \nReviewed-By: Santiago Gimeno \nReviewed-By: James M Snell \nReviewed-By: Minwoo Jung \nReviewed-By: Prince John Wesley \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/ee7606940acfd322e64a4d07db3e8d5b00574dcf",
+ "html_url": "https://github.com/nodejs/node/commit/ee7606940acfd322e64a4d07db3e8d5b00574dcf",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/ee7606940acfd322e64a4d07db3e8d5b00574dcf/comments",
+ "author": {
+ "login": "Trott",
+ "id": 718899,
+ "node_id": "MDQ6VXNlcjcxODg5OQ==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/718899?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/Trott",
+ "html_url": "https://github.com/Trott",
+ "followers_url": "https://api.github.com/users/Trott/followers",
+ "following_url": "https://api.github.com/users/Trott/following{/other_user}",
+ "gists_url": "https://api.github.com/users/Trott/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/Trott/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/Trott/subscriptions",
+ "organizations_url": "https://api.github.com/users/Trott/orgs",
+ "repos_url": "https://api.github.com/users/Trott/repos",
+ "events_url": "https://api.github.com/users/Trott/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/Trott/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "f5442ece33d5b5291c80afcc1125e22eddedd8da",
+ "url": "https://api.github.com/repos/nodejs/node/commits/f5442ece33d5b5291c80afcc1125e22eddedd8da",
+ "html_url": "https://github.com/nodejs/node/commit/f5442ece33d5b5291c80afcc1125e22eddedd8da"
+ }
+ ]
+ },
+ {
+ "sha": "2a9625656d4f8e9268890e24a8454be7c0a2bac2",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6MmE5NjI1NjU2ZDRmOGU5MjY4ODkwZTI0YTg0NTRiZTdjMGEyYmFjMg==",
+ "commit": {
+ "author": {
+ "name": "Rich Trott",
+ "email": "rtrott@gmail.com",
+ "date": "2016-11-06T03:45:16Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:32:52Z"
+ },
+ "message": "test: move timer-dependent test to sequential\n\n`test-regress-GH-897` is dependent on a timer firing within a period of\ntime. Especially on some of the FreeBSD hosts on CI, we have seen tests\nlike that fail when run in parallel. (This may have nothing to do with\nFreeBSD and may just mean that the hosts are resource-constrained.) Move\nthis test to sequential as we have done with several other\ntimer-dependent tests recently.\n\nThe test has also been refactored and documented via comments.\n\nPR-URL: https://github.com/nodejs/node/pull/9487\nReviewed-By: Colin Ihrig \nReviewed-By: Santiago Gimeno \nReviewed-By: Minwoo Jung ",
+ "tree": {
+ "sha": "5ac21434aa8433255d82627b84139453318cdc87",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/5ac21434aa8433255d82627b84139453318cdc87"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/2a9625656d4f8e9268890e24a8454be7c0a2bac2",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9iEAAoJENi59a6uhOTPekYP/i5T7eeFS689M5WeWlOE1DMq\nmwuepoGx2ZRD5+4yzA/daCDWENpk3sJCR1n1PSJV3T+K077YwBcvryr/Yqmm2DNj\nkCUUr1bSB0QBNFXgWTLjtPAqoAvG0qiHfKrVoitxDRFevo0swSwHDCD0yVC3kpnO\n9TfF7KQ/HEh/BjsHH9QimATJ5c/OtFav2xguaoC7urxzjwwsT7NUSSQr+Tv56FWT\nSFYF+pfsXmXT5mWDEdUfBAzExgSiNt7XWcV9VZF4szSRWltviv1RFg6L3n5inZV4\nKG3V6Q7qP2Hu7XAG56BPJA8IipXYrWcoScF/lyuBmdYFAOkSsw6qWdNVFoEX7rle\nXCNTg9xhbyL2KzvxJceHJQnF73nBXRQN5fFV7a0Ng80Y7HiQqyp08mgdhVRtwsgY\n+QioTS27oBNa2RgpYb9NDouSNL/es5cri2hpcL+EFX39DisXwGiWy/pigHgn8qg+\n6CDA2TeRbF88+cuU0rLniukF1SVKSzGIuNxHEk48onpeFW+R47y7S0S3C6Ls1X85\njZxvG49wM6nGbt7bjkN3gIiObGsSryO/PbwC/UAW2m4pm8u6hkv8bfD1YcYCV0gx\nfy2MTAdOOVF0lZDP6p7Vfua/QZ9QYMNhtxT9Fjn/qpk+8lbBLWf60tQR3nQSdN16\nWOf/IIEP8xwyc3wpYqKz\n=goB6\n-----END PGP SIGNATURE-----",
+ "payload": "tree 5ac21434aa8433255d82627b84139453318cdc87\nparent ee7606940acfd322e64a4d07db3e8d5b00574dcf\nauthor Rich Trott 1478403916 -0700\ncommitter Anna Henningsen 1479792772 +0100\n\ntest: move timer-dependent test to sequential\n\n`test-regress-GH-897` is dependent on a timer firing within a period of\ntime. Especially on some of the FreeBSD hosts on CI, we have seen tests\nlike that fail when run in parallel. (This may have nothing to do with\nFreeBSD and may just mean that the hosts are resource-constrained.) Move\nthis test to sequential as we have done with several other\ntimer-dependent tests recently.\n\nThe test has also been refactored and documented via comments.\n\nPR-URL: https://github.com/nodejs/node/pull/9487\nReviewed-By: Colin Ihrig \nReviewed-By: Santiago Gimeno \nReviewed-By: Minwoo Jung \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/2a9625656d4f8e9268890e24a8454be7c0a2bac2",
+ "html_url": "https://github.com/nodejs/node/commit/2a9625656d4f8e9268890e24a8454be7c0a2bac2",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/2a9625656d4f8e9268890e24a8454be7c0a2bac2/comments",
+ "author": {
+ "login": "Trott",
+ "id": 718899,
+ "node_id": "MDQ6VXNlcjcxODg5OQ==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/718899?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/Trott",
+ "html_url": "https://github.com/Trott",
+ "followers_url": "https://api.github.com/users/Trott/followers",
+ "following_url": "https://api.github.com/users/Trott/following{/other_user}",
+ "gists_url": "https://api.github.com/users/Trott/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/Trott/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/Trott/subscriptions",
+ "organizations_url": "https://api.github.com/users/Trott/orgs",
+ "repos_url": "https://api.github.com/users/Trott/repos",
+ "events_url": "https://api.github.com/users/Trott/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/Trott/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "ee7606940acfd322e64a4d07db3e8d5b00574dcf",
+ "url": "https://api.github.com/repos/nodejs/node/commits/ee7606940acfd322e64a4d07db3e8d5b00574dcf",
+ "html_url": "https://github.com/nodejs/node/commit/ee7606940acfd322e64a4d07db3e8d5b00574dcf"
+ }
+ ]
+ },
+ {
+ "sha": "819a38df96b73102beef7b7497886f34ec11dbdf",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6ODE5YTM4ZGY5NmI3MzEwMmJlZWY3Yjc0OTc4ODZmMzRlYzExZGJkZg==",
+ "commit": {
+ "author": {
+ "name": "Rich Trott",
+ "email": "rtrott@gmail.com",
+ "date": "2016-11-07T00:47:41Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:32:52Z"
+ },
+ "message": "benchmark: split timers benchmark and refactor\n\nThe depth benchmark for timers sets a timer that sets a timer that sets\na timer that... 500K of them.\n\nSince each timer has to wait for the next tick of the event loop this\nbenchmark takes a very long time to run compared to the breadth\ntest that is already in the file. This may be more of an event loop\nbenchmark than a timer benchmark.\n\nReduce the number of iterations for the depth test as it's really just\nrunning the iterations in sequence, not in parallel. And even on an\ninfinitely fast machine, it would take over 8 minutes to run because\neach tick of the event loop would have to wait 1ms before firing the\ntimer.\n\nSplit the depth and breadth benchmarks so that their `N` values can be\nset independently.\n\nDo some minor refactoring to the benchmarks (but no ES6 additions so\nthat the benchmarks can still be run with old versions of Node.js).\n\nRefs: https://github.com/nodejs/node/issues/9493\nPR-URL: https://github.com/nodejs/node/pull/9497\nReviewed-By: Andreas Madsen \nReviewed-By: Colin Ihrig \nReviewed-By: Jeremiah Senkpiel ",
+ "tree": {
+ "sha": "3773c9bf1759a1a2f64d6b0827ed890929a5fb2a",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/3773c9bf1759a1a2f64d6b0827ed890929a5fb2a"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/819a38df96b73102beef7b7497886f34ec11dbdf",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9iEAAoJENi59a6uhOTPEZkP/iFnt+1t9npZGMQ+E8DJ5e0s\nSEMPmp1EF0gpHoErrWECjY0PjD2iuQ7Y2lquConOZPaKLRpD2qSKOBK48kn42Pe+\ntzlgA+jEueJYDnCb0LKRjwBZIoJ12jZoQ1PHcYDgD5OFjey0bYjByHcCKn617U5Z\nihle1EG+OEawW/JkCgDy5NPbf3DMP6bPeu0bjTNTmZjNLBUBEFOwSFCIzN/e8Ntv\nb9Dl34ELJqnQw43tgsNphFYh7Cjn1Kn+6WMx3gK9MK5beiVPd3IMew6D18jAFtG7\nW64u8OBKBHMWN1n+YI19ubwnDx63sQet3tzqFxfhvNmCgbiZrTuR1+dQiWlpDmoZ\nMSoD4ujYNAY4nahBWlG5zDq3dAGZn5Om99d0pT+ZS7mwsch58ujrVq8NY3mChXHi\nlXX1MaOcSF5JVZPYkXd/aCIMrRrehuaszqueMmGAyAZFsJ4NSwihsUBswzYG7bhh\nEQPApYaKSoff5Su+J85kYBCA4sVpgjcqcq6ISLVN6t+VMG3Rh2+juhVBy8fNKP5K\nCktO1NwJqPDzjc6uIcnHupQ6atvmvOvBa3xV47/AuxLypa4a1J1IroIXXmNpclex\n7bpe/0ztLx2rAX/b4ylSBgefZN54fQdnjN4WXPyHTGlbrMG8xQ3hNZVU/anqGv4z\n5RdGDUkOSuEJzewhzkdm\n=Wmiz\n-----END PGP SIGNATURE-----",
+ "payload": "tree 3773c9bf1759a1a2f64d6b0827ed890929a5fb2a\nparent 2a9625656d4f8e9268890e24a8454be7c0a2bac2\nauthor Rich Trott 1478479661 -0800\ncommitter Anna Henningsen 1479792772 +0100\n\nbenchmark: split timers benchmark and refactor\n\nThe depth benchmark for timers sets a timer that sets a timer that sets\na timer that... 500K of them.\n\nSince each timer has to wait for the next tick of the event loop this\nbenchmark takes a very long time to run compared to the breadth\ntest that is already in the file. This may be more of an event loop\nbenchmark than a timer benchmark.\n\nReduce the number of iterations for the depth test as it's really just\nrunning the iterations in sequence, not in parallel. And even on an\ninfinitely fast machine, it would take over 8 minutes to run because\neach tick of the event loop would have to wait 1ms before firing the\ntimer.\n\nSplit the depth and breadth benchmarks so that their `N` values can be\nset independently.\n\nDo some minor refactoring to the benchmarks (but no ES6 additions so\nthat the benchmarks can still be run with old versions of Node.js).\n\nRefs: https://github.com/nodejs/node/issues/9493\nPR-URL: https://github.com/nodejs/node/pull/9497\nReviewed-By: Andreas Madsen \nReviewed-By: Colin Ihrig \nReviewed-By: Jeremiah Senkpiel \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/819a38df96b73102beef7b7497886f34ec11dbdf",
+ "html_url": "https://github.com/nodejs/node/commit/819a38df96b73102beef7b7497886f34ec11dbdf",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/819a38df96b73102beef7b7497886f34ec11dbdf/comments",
+ "author": {
+ "login": "Trott",
+ "id": 718899,
+ "node_id": "MDQ6VXNlcjcxODg5OQ==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/718899?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/Trott",
+ "html_url": "https://github.com/Trott",
+ "followers_url": "https://api.github.com/users/Trott/followers",
+ "following_url": "https://api.github.com/users/Trott/following{/other_user}",
+ "gists_url": "https://api.github.com/users/Trott/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/Trott/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/Trott/subscriptions",
+ "organizations_url": "https://api.github.com/users/Trott/orgs",
+ "repos_url": "https://api.github.com/users/Trott/repos",
+ "events_url": "https://api.github.com/users/Trott/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/Trott/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "2a9625656d4f8e9268890e24a8454be7c0a2bac2",
+ "url": "https://api.github.com/repos/nodejs/node/commits/2a9625656d4f8e9268890e24a8454be7c0a2bac2",
+ "html_url": "https://github.com/nodejs/node/commit/2a9625656d4f8e9268890e24a8454be7c0a2bac2"
+ }
+ ]
+ },
+ {
+ "sha": "dab3e451acbdd4a8d0000ff06e63bec701fd13a2",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6ZGFiM2U0NTFhY2JkZDRhOGQwMDAwZmYwNmU2M2JlYzcwMWZkMTNhMg==",
+ "commit": {
+ "author": {
+ "name": "Rich Trott",
+ "email": "rtrott@gmail.com",
+ "date": "2016-11-07T04:01:17Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:32:53Z"
+ },
+ "message": "test: refactor make-callback-recurse test\n\nMove copy/pasted callback into its own function.\n\nPR-URL: https://github.com/nodejs/node/pull/9498\nReviewed-By: Colin Ihrig \nReviewed-By: Jeremiah Senkpiel ",
+ "tree": {
+ "sha": "04a22d251ed126b6ad8266be29418407cd2df022",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/04a22d251ed126b6ad8266be29418407cd2df022"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/dab3e451acbdd4a8d0000ff06e63bec701fd13a2",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9iFAAoJENi59a6uhOTPCtcP/2HxIOOmvMXFnfLFn/qgwGPJ\nQXHV7kwySNiXqlLeZcUtdhECixeUInnrzy03rfjnCwmhHH8p1/BhkImSofJTP15N\n9zIngxFA1NJiRf3Ek+E6Ks9DdGSU2tPmjbe2wGCnZiBlEZW8fK1+LQJHP9dk5CyP\nhWxCf2x95xE0SajE2fHRJnaZH1NJ6h3Tc6yB3zhFrQNQyzJy2ksB22SKBFtyDxpx\nIXeWKef+v1cayk0iopN4svHZzOGbu7PhzG3uJpf8IWfn61DbSV4OMk9rnx2D7KYg\nwKjnodwtDGWA/prTB+W4ASu4yShrZfBUa/ahkK0oPieJqfWhxvNaBGqmg0z/vznn\nrDN9omv95JNHqQnB2QIXwMJQztbsWiB2GF4Bp5nSboMSX0FIoBVt6v/Vs2Vti28/\nv2IAI4xsAX11pmI8oM6GVyElCreXRQd8CxBOqfkunAU1pdsTUvc5t2eyovwOZNq5\nnahJzBmYbz/fh/0iafFsbCWriQsbfCk3gG83DIU58yHAqd6s1wGqtn0ng9Kuusbd\n2Mo6QyyvxsUI1t6k9LpDJ23OtMKqQB9X9xs13egpthOsL3s3u+YKmza9FRT+VX4+\nWYvrRB2HzzkIPfquc5xH/Wki7mEpmkFvJ+FO36yos8D8GxnWgo2n+2KWWwvff5Jx\nSLUBo1dkZhQina1D6gt6\n=uekW\n-----END PGP SIGNATURE-----",
+ "payload": "tree 04a22d251ed126b6ad8266be29418407cd2df022\nparent 819a38df96b73102beef7b7497886f34ec11dbdf\nauthor Rich Trott 1478491277 -0800\ncommitter Anna Henningsen 1479792773 +0100\n\ntest: refactor make-callback-recurse test\n\nMove copy/pasted callback into its own function.\n\nPR-URL: https://github.com/nodejs/node/pull/9498\nReviewed-By: Colin Ihrig \nReviewed-By: Jeremiah Senkpiel \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/dab3e451acbdd4a8d0000ff06e63bec701fd13a2",
+ "html_url": "https://github.com/nodejs/node/commit/dab3e451acbdd4a8d0000ff06e63bec701fd13a2",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/dab3e451acbdd4a8d0000ff06e63bec701fd13a2/comments",
+ "author": {
+ "login": "Trott",
+ "id": 718899,
+ "node_id": "MDQ6VXNlcjcxODg5OQ==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/718899?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/Trott",
+ "html_url": "https://github.com/Trott",
+ "followers_url": "https://api.github.com/users/Trott/followers",
+ "following_url": "https://api.github.com/users/Trott/following{/other_user}",
+ "gists_url": "https://api.github.com/users/Trott/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/Trott/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/Trott/subscriptions",
+ "organizations_url": "https://api.github.com/users/Trott/orgs",
+ "repos_url": "https://api.github.com/users/Trott/repos",
+ "events_url": "https://api.github.com/users/Trott/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/Trott/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "819a38df96b73102beef7b7497886f34ec11dbdf",
+ "url": "https://api.github.com/repos/nodejs/node/commits/819a38df96b73102beef7b7497886f34ec11dbdf",
+ "html_url": "https://github.com/nodejs/node/commit/819a38df96b73102beef7b7497886f34ec11dbdf"
+ }
+ ]
+ },
+ {
+ "sha": "342d8e05cb33d5c7274eff3ff623fba2ac7d6e68",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6MzQyZDhlMDVjYjMzZDVjNzI3NGVmZjNmZjYyM2ZiYTJhYzdkNmU2OA==",
+ "commit": {
+ "author": {
+ "name": "Rich Trott",
+ "email": "rtrott@gmail.com",
+ "date": "2016-11-07T04:20:03Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:32:53Z"
+ },
+ "message": "test: refactor inspector-helper.js\n\nThere are two instances of `setTimeout()` called without a duration in\n`inspector-helper.js`. Change to `setImmediate()` for clarity that it\nisn't a mistake.\n\nPR-URL: https://github.com/nodejs/node/pull/9499\nReviewed-By: Colin Ihrig \nReviewed-By: Jeremiah Senkpiel \nReviewed-By: James M Snell \nReviewed-By: Eugene Ostroukhov \nReviewed-By: Prince John Wesley \nReviewed-By: Luigi Pinca ",
+ "tree": {
+ "sha": "7a89100b65a75cd8be9c1c3d0c3b7cb009af07f8",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/7a89100b65a75cd8be9c1c3d0c3b7cb009af07f8"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/342d8e05cb33d5c7274eff3ff623fba2ac7d6e68",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9iFAAoJENi59a6uhOTPwLoP/3eaFdH0PANxPkJVsyiTIvvU\nisBesPQyEM3L99pHACiJHrNNpf6yei6sQ8IaZ9A+tMmCCcDmep6v0UypNaV2XDe2\nbsc7bIvAqvQJB2ULJIkqbRSLXK844lurLpgnZh5sRSnf38rgiUI+FQAXyPPsgUlR\nzLMJxjkHhdrjZ3AAsyPayGZ44CTevgKZwLzEPPleKXSvC388epfPx5CZAChMohPV\nfUgVx3rxy2UbGIVCstCttysTARHBGcHySsD8h/ThcrLlDT8qPNZRqsyf5y6fEkrU\nNSnkLyaC6zGy2hwSwqmQsRr6z9iskIX6deUvNJsFAdSgY/hc8xx2rfUk7S+lgKGl\nXQYV98kBpuaSTftb3ZZDUoBzUWRKY5tYhY5TpGrxGf0GO49hODiZq2kx1M33aQn1\n7F6K3TctMICqBEViWCptHfuud7uDr7uh4tB+SVFTiDXwzR7sjrYZSP/5f8uQxzEf\nvXVQatxePcDx61YF6td8P0B6Okybo9rbobJ/cirEzk6hFPUJaTXDIgv6cYQPFtLl\nm3q2MCKab2jV5Kne6/hu/NlvVQI2/G35SumVywq1KzYfQUImt0Fbe1atOjixZidD\n3vQhKgPPxVyGme69jcHwDCoD4hPlHzPsoDzihMKgksStakPer6Gl17N+dkDzFQnz\nJtDBOYcF7XrQO5qPMvCn\n=qX01\n-----END PGP SIGNATURE-----",
+ "payload": "tree 7a89100b65a75cd8be9c1c3d0c3b7cb009af07f8\nparent dab3e451acbdd4a8d0000ff06e63bec701fd13a2\nauthor Rich Trott 1478492403 -0800\ncommitter Anna Henningsen 1479792773 +0100\n\ntest: refactor inspector-helper.js\n\nThere are two instances of `setTimeout()` called without a duration in\n`inspector-helper.js`. Change to `setImmediate()` for clarity that it\nisn't a mistake.\n\nPR-URL: https://github.com/nodejs/node/pull/9499\nReviewed-By: Colin Ihrig \nReviewed-By: Jeremiah Senkpiel \nReviewed-By: James M Snell \nReviewed-By: Eugene Ostroukhov \nReviewed-By: Prince John Wesley \nReviewed-By: Luigi Pinca \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/342d8e05cb33d5c7274eff3ff623fba2ac7d6e68",
+ "html_url": "https://github.com/nodejs/node/commit/342d8e05cb33d5c7274eff3ff623fba2ac7d6e68",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/342d8e05cb33d5c7274eff3ff623fba2ac7d6e68/comments",
+ "author": {
+ "login": "Trott",
+ "id": 718899,
+ "node_id": "MDQ6VXNlcjcxODg5OQ==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/718899?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/Trott",
+ "html_url": "https://github.com/Trott",
+ "followers_url": "https://api.github.com/users/Trott/followers",
+ "following_url": "https://api.github.com/users/Trott/following{/other_user}",
+ "gists_url": "https://api.github.com/users/Trott/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/Trott/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/Trott/subscriptions",
+ "organizations_url": "https://api.github.com/users/Trott/orgs",
+ "repos_url": "https://api.github.com/users/Trott/repos",
+ "events_url": "https://api.github.com/users/Trott/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/Trott/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "dab3e451acbdd4a8d0000ff06e63bec701fd13a2",
+ "url": "https://api.github.com/repos/nodejs/node/commits/dab3e451acbdd4a8d0000ff06e63bec701fd13a2",
+ "html_url": "https://github.com/nodejs/node/commit/dab3e451acbdd4a8d0000ff06e63bec701fd13a2"
+ }
+ ]
+ },
+ {
+ "sha": "96471556b5cf5de89d838726cef8afc3263f0feb",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6OTY0NzE1NTZiNWNmNWRlODlkODM4NzI2Y2VmOGFmYzMyNjNmMGZlYg==",
+ "commit": {
+ "author": {
+ "name": "Rich Trott",
+ "email": "rtrott@gmail.com",
+ "date": "2016-11-07T21:34:54Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:32:54Z"
+ },
+ "message": "test: move tick-processor tests to own directory\n\nThe tick-processor tests are inherently non-deterministic. They\ntherefore have false negatives from time to time. They also\nsometimes leave extra processes running.\n\nMove them to their own directory until these issues are sorted. Note\nthat this means that the tests will not be run in CI. Like the inspector\ntests and other tests, they will have to be run manually when they are\nwanted.\n\nPR-URL: https://github.com/nodejs/node/pull/9506\nReviewed-By: Daniel Bevenius \nReviewed-By: Matthew Loring \nReviewed-By: Gibson Fahnestock ",
+ "tree": {
+ "sha": "99ce2e4a39afdd9cecd0bd00b257641d9580baca",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/99ce2e4a39afdd9cecd0bd00b257641d9580baca"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/96471556b5cf5de89d838726cef8afc3263f0feb",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9iGAAoJENi59a6uhOTPLL8P/2sjE3AcQS/XUwwvHqH8RFb4\n4cojOuAa0KN3UE1kOoIAWBDd7f6YGbL3un0cwLReeEZAevzR7qMNK3ZpHv8TRoCa\nsCRxzoz2WRd1RM6RWAUMYuKojTXqTjLE29F7bAZSXcifxQtOAPMv9nliKNYFrJ++\n8DS0lQ9JLq79hzLXgynA1qA1m1/WULyOZc4TFcrjx2roBd+e89lcZbcte9xfLk+d\nE4B727OrbueVMYZGNUYUwroZj65deaoW4/ZZhLNKX6FgLGolUrNJ4ulaZJkyuaXI\nANWbgj31STdOIU6t8KyrOBlvHe6tj3ceMhd+Vii5Z6pAwvVcWTkhDyAtVxLaweSA\n0c72fFHJ3rMbQ6ip2d3EZ/W259layR+DwRDz9qMKrxjIg/gdg4RpSVNpjTPmMRL/\nA/j3chFGqUJhG46NxOAfoBk+DZg7vKTb2D+wMqSZCQJHOw7c5LSUrKeavXgUDOCl\n+vzKQZHWatkcj3yDQ/vs/oYirIM88PFG8R/1PW3qCSofxt5MVe/1/AyYR+uJp1pH\n8iM33zm/NF/5kev+bjTILTpgSVvJyqOHFVT7n8JuuaxsXNWQ5AOtWTcWjb9uex1r\nGXoGp22mgfstwHRhs4E851HI5Xrkb7lKEoHPEu3+DBfS63vHbcruzcsqNvB301NM\nRI3ksCVnzVcp2xVXDMWA\n=ih3P\n-----END PGP SIGNATURE-----",
+ "payload": "tree 99ce2e4a39afdd9cecd0bd00b257641d9580baca\nparent 342d8e05cb33d5c7274eff3ff623fba2ac7d6e68\nauthor Rich Trott 1478554494 -0800\ncommitter Anna Henningsen 1479792774 +0100\n\ntest: move tick-processor tests to own directory\n\nThe tick-processor tests are inherently non-deterministic. They\ntherefore have false negatives from time to time. They also\nsometimes leave extra processes running.\n\nMove them to their own directory until these issues are sorted. Note\nthat this means that the tests will not be run in CI. Like the inspector\ntests and other tests, they will have to be run manually when they are\nwanted.\n\nPR-URL: https://github.com/nodejs/node/pull/9506\nReviewed-By: Daniel Bevenius \nReviewed-By: Matthew Loring \nReviewed-By: Gibson Fahnestock \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/96471556b5cf5de89d838726cef8afc3263f0feb",
+ "html_url": "https://github.com/nodejs/node/commit/96471556b5cf5de89d838726cef8afc3263f0feb",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/96471556b5cf5de89d838726cef8afc3263f0feb/comments",
+ "author": {
+ "login": "Trott",
+ "id": 718899,
+ "node_id": "MDQ6VXNlcjcxODg5OQ==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/718899?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/Trott",
+ "html_url": "https://github.com/Trott",
+ "followers_url": "https://api.github.com/users/Trott/followers",
+ "following_url": "https://api.github.com/users/Trott/following{/other_user}",
+ "gists_url": "https://api.github.com/users/Trott/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/Trott/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/Trott/subscriptions",
+ "organizations_url": "https://api.github.com/users/Trott/orgs",
+ "repos_url": "https://api.github.com/users/Trott/repos",
+ "events_url": "https://api.github.com/users/Trott/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/Trott/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "342d8e05cb33d5c7274eff3ff623fba2ac7d6e68",
+ "url": "https://api.github.com/repos/nodejs/node/commits/342d8e05cb33d5c7274eff3ff623fba2ac7d6e68",
+ "html_url": "https://github.com/nodejs/node/commit/342d8e05cb33d5c7274eff3ff623fba2ac7d6e68"
+ }
+ ]
+ },
+ {
+ "sha": "c07f6486629e9cbb8a03529f681fa55f7656c830",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6YzA3ZjY0ODY2MjllOWNiYjhhMDM1MjlmNjgxZmE1NWY3NjU2YzgzMA==",
+ "commit": {
+ "author": {
+ "name": "Andreas Lind",
+ "email": "andreas@one.com",
+ "date": "2016-11-02T22:21:54Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:32:54Z"
+ },
+ "message": "doc: Fix inaccuracy in https.request docs\n\nPR-URL: https://github.com/nodejs/node/pull/9453\nReviewed-By: Colin Ihrig \nReviewed-By: James M Snell \nReviewed-By: Roman Reiss \nReviewed-By: Sam Roberts \nReviewed-By: Michael Dawson ",
+ "tree": {
+ "sha": "f339b4721d4d7d2806216dde66a0824b2950aa54",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/f339b4721d4d7d2806216dde66a0824b2950aa54"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/c07f6486629e9cbb8a03529f681fa55f7656c830",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9iGAAoJENi59a6uhOTP3lkQAI1CeRJacX5ZpOENPw/bIq4J\nhdq7Ik3RKFj8VlXs9lpQ38DWN1kqTlN1RfFhofVqkc2JC8xb0TxhEv7Zzv3TlaNZ\nv5l0GSmbnVTOlmdK8iBQ3TP7tm05TQkvJIBPamRVEsebTJL0+ElRWNt/3i3Kr8Zb\nEm9zafpDrzTc3PHSHAx2AEWgnLpzs0BECAsmsduIosoAmSlgEgp9x/Y7lZ2Z9JQz\nC1wgcr9L0BRKNFKT4h0m6xqzUD2Km9LsBv+3QqTRuUb4pcec13RG/wKv/Fjx8aS0\ntD8FQjyXpPzD5Wj7h7ZKJr3oYS/ncWKo1jBFt/aVh2jwRtEiVr/Eoiewz8leUBaN\nbnprr7/mjsHv+D9Drw7beqn3L0bR9cCyOZyPxZFbmDTuSLJgphqhQSc0AjNCXwUd\n0Pfjj/VTpKBMIhkGB8Ek0a77AfCKbCFvFmo4e/AmRlgNTpAx7Wi7sv4D1BEAcHj8\nuLHqZsXnmvoU4QoyVKfS66KdF64bBbKSHKcB8xI66VMlakxBWMcbhkCKg45zCPc1\nidAoWYE8G8tXymXqTl9705QmCsgq6AOl2YzMLET6Cn+DWAulbFCa6c7ISyGPukbv\nqiarvjPU/EC5DfsAlB+LqfsYAThBwYf3WR5OtXDLHjplg9lv1EbjcP9j2BIVKzHA\nwtoOT3nWDoadSreNHT4v\n=L9+R\n-----END PGP SIGNATURE-----",
+ "payload": "tree f339b4721d4d7d2806216dde66a0824b2950aa54\nparent 96471556b5cf5de89d838726cef8afc3263f0feb\nauthor Andreas Lind 1478125314 +0100\ncommitter Anna Henningsen 1479792774 +0100\n\ndoc: Fix inaccuracy in https.request docs\n\nPR-URL: https://github.com/nodejs/node/pull/9453\nReviewed-By: Colin Ihrig \nReviewed-By: James M Snell \nReviewed-By: Roman Reiss \nReviewed-By: Sam Roberts \nReviewed-By: Michael Dawson \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/c07f6486629e9cbb8a03529f681fa55f7656c830",
+ "html_url": "https://github.com/nodejs/node/commit/c07f6486629e9cbb8a03529f681fa55f7656c830",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/c07f6486629e9cbb8a03529f681fa55f7656c830/comments",
+ "author": {
+ "login": "papandreou",
+ "id": 373545,
+ "node_id": "MDQ6VXNlcjM3MzU0NQ==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/373545?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/papandreou",
+ "html_url": "https://github.com/papandreou",
+ "followers_url": "https://api.github.com/users/papandreou/followers",
+ "following_url": "https://api.github.com/users/papandreou/following{/other_user}",
+ "gists_url": "https://api.github.com/users/papandreou/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/papandreou/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/papandreou/subscriptions",
+ "organizations_url": "https://api.github.com/users/papandreou/orgs",
+ "repos_url": "https://api.github.com/users/papandreou/repos",
+ "events_url": "https://api.github.com/users/papandreou/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/papandreou/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "96471556b5cf5de89d838726cef8afc3263f0feb",
+ "url": "https://api.github.com/repos/nodejs/node/commits/96471556b5cf5de89d838726cef8afc3263f0feb",
+ "html_url": "https://github.com/nodejs/node/commit/96471556b5cf5de89d838726cef8afc3263f0feb"
+ }
+ ]
+ },
+ {
+ "sha": "62478eb3d97243e2c7f71b64c23b4ac0a0dfb012",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6NjI0NzhlYjNkOTcyNDNlMmM3ZjcxYjY0YzIzYjRhYzBhMGRmYjAxMg==",
+ "commit": {
+ "author": {
+ "name": "timathon",
+ "email": "timathon@outlook.com",
+ "date": "2016-11-09T04:07:49Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:32:55Z"
+ },
+ "message": "doc: fix link to Event Loop page\n\nPR-URL: https://github.com/nodejs/node/pull/9527\nReviewed-By: Roman Reiss \nReviewed-By: Colin Ihrig ",
+ "tree": {
+ "sha": "be3639c91789fc1aa5453a210bc4aa4d2e5d0380",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/be3639c91789fc1aa5453a210bc4aa4d2e5d0380"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/62478eb3d97243e2c7f71b64c23b4ac0a0dfb012",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9iHAAoJENi59a6uhOTPg1IP/1ysRKwBIXWd0MV3UNLOykuM\nyv/6ZO7O4GsQNdla9ksN6Hqrfbab0XTAyu5IjXnHkeYvZyOcKw31e+yamGYJuj96\n/JPZ+16pT+a0OKllcfcL8auiyl/64ep8qxpQnudzHX9K00tCkqJJlXhT7En+WgWw\nQk06F5ntgJm+fcvJRu62P/4p7gw4WzOtz0iURczrxHoBg0C2bEA55hY/I/zDEVma\nZhTGURfDXlo9zwJ3XYWApRKi5G3pg9VGPmfeW5o2SMeA9hAmdPFMvY05baU9ERvH\nGYXr6PQbN6Z1pP6vkhPtlQHurHYTq3q3AoZZNGLsP1DSvnWvXXlcnBByIze476/b\nSeTbgDaHKJX0ktPjA1Hk0B3a2LkZ4q+ZY3B9AWoXS1gouQlfyvh7cuTWjUjmk/Wf\n7tMNrE2wdF3zjHzq38MEAYViHlpBlDdsl9sXtJtpb3g5/KbFLm2yV5XKJAud4ZHw\n4UN4HGk+Kc1nPQYgmTdaJG55jJXrtNamwJPCNCKseb8UEVQi9h1XEjE4KYz6+Md0\nDCLVKs+tD54U/IQXC+1oywna87UIzZdlaXQuwd25DzE6MoaCvkGI+p0p20EhWq9+\n/bgDuxaP4glmE84HJjyPQ7o3qBx/t5nNsCUk+ZSWZnZnm1CuniDzRFeIM0536NN9\n/ZObBC6HOYbDr6YC6i1i\n=NML/\n-----END PGP SIGNATURE-----",
+ "payload": "tree be3639c91789fc1aa5453a210bc4aa4d2e5d0380\nparent c07f6486629e9cbb8a03529f681fa55f7656c830\nauthor timathon 1478664469 +0800\ncommitter Anna Henningsen 1479792775 +0100\n\ndoc: fix link to Event Loop page\n\nPR-URL: https://github.com/nodejs/node/pull/9527\nReviewed-By: Roman Reiss \nReviewed-By: Colin Ihrig \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/62478eb3d97243e2c7f71b64c23b4ac0a0dfb012",
+ "html_url": "https://github.com/nodejs/node/commit/62478eb3d97243e2c7f71b64c23b4ac0a0dfb012",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/62478eb3d97243e2c7f71b64c23b4ac0a0dfb012/comments",
+ "author": {
+ "login": "timathon",
+ "id": 9364651,
+ "node_id": "MDQ6VXNlcjkzNjQ2NTE=",
+ "avatar_url": "https://avatars.githubusercontent.com/u/9364651?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/timathon",
+ "html_url": "https://github.com/timathon",
+ "followers_url": "https://api.github.com/users/timathon/followers",
+ "following_url": "https://api.github.com/users/timathon/following{/other_user}",
+ "gists_url": "https://api.github.com/users/timathon/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/timathon/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/timathon/subscriptions",
+ "organizations_url": "https://api.github.com/users/timathon/orgs",
+ "repos_url": "https://api.github.com/users/timathon/repos",
+ "events_url": "https://api.github.com/users/timathon/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/timathon/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "c07f6486629e9cbb8a03529f681fa55f7656c830",
+ "url": "https://api.github.com/repos/nodejs/node/commits/c07f6486629e9cbb8a03529f681fa55f7656c830",
+ "html_url": "https://github.com/nodejs/node/commit/c07f6486629e9cbb8a03529f681fa55f7656c830"
+ }
+ ]
+ },
+ {
+ "sha": "92f163e4655b738370c781edc72bdd1b6bbfe8dd",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6OTJmMTYzZTQ2NTViNzM4MzcwYzc4MWVkYzcyYmRkMWI2YmJmZThkZA==",
+ "commit": {
+ "author": {
+ "name": "Jeremiah Senkpiel",
+ "email": "fishrock123@rocketmail.com",
+ "date": "2016-11-07T14:27:37Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:32:55Z"
+ },
+ "message": "doc: clarify the exit code part of writing_tests\n\nPR-URL: https://github.com/nodejs/node/pull/9502\nReviewed-By: Santiago Gimeno \nReviewed-By: James M Snell \nReviewed-By: Michaƫl Zasso \nReviewed-By: Daniel Bevenius \nReviewed-By: Luigi Pinca ",
+ "tree": {
+ "sha": "96c311acf51b18660696de9e36c57f6e53d8f6ab",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/96c311acf51b18660696de9e36c57f6e53d8f6ab"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/92f163e4655b738370c781edc72bdd1b6bbfe8dd",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9iHAAoJENi59a6uhOTPocoP+wfofIGwwq6w3o6XzMvgvzdn\nlwnwhkBiml6eNbqwdLrBOOEIXIhWUKteC/jSLIeff0xJFXLaandYRlFIzF4gvLg2\ngk4oRZDMmf02JuW7P/6pH/QMz9dKuDLx/nUbZE6UoL+un3t1zC9pLE/32rXfkSsX\nmiVznF832n3wr9AzweRBZPCMQSdgkVM7FWbJLU+NDrOLgvz5oKnq8scSJlHhmOR0\nIEnG7uygcy+Ti0tb++w60z33xN6ZZotAKY98aSC7LN2bZp2ewUJAx4YPNCe0G2nk\nT9QrKUmG5/Q646hGesdo43sL6f3t0z9Q/C1Z+joLb5JEbwkYs88Ge6acY0DA4hxm\nzeDifwGfQr//MBqtRCziWsMEaMOhdVVKj7ZlxzY1BV2b0F3pWxL1Ou/wJlx1luKS\nzPz3VF2o+7BsvXpSoO/mVOk+U11mXnCmYyD+5YMsaTVIofQnowEZyQkDgRpRs0Ag\nTAhp6Xoz4YVd6qfDhdl6m9y1eiEEr0PDV2Eqn96r+mTNkEjEcmaZyLQMHiSk4ENn\n9fKjPzUCjb7HCIsDG1mIrfV5AJ6Zm3WuO6wDqbEx53eboBvIuL3aeIMJWZaMjlRw\nidFfMHCnyjrtiklY+juw06dn3go4XOX1bZ7z1s2SCg446++q3NaXnUf67DZ6/i7g\nyam7d8Mx9szlI/+AdMT+\n=UX6p\n-----END PGP SIGNATURE-----",
+ "payload": "tree 96c311acf51b18660696de9e36c57f6e53d8f6ab\nparent 62478eb3d97243e2c7f71b64c23b4ac0a0dfb012\nauthor Jeremiah Senkpiel 1478528857 -0500\ncommitter Anna Henningsen 1479792775 +0100\n\ndoc: clarify the exit code part of writing_tests\n\nPR-URL: https://github.com/nodejs/node/pull/9502\nReviewed-By: Santiago Gimeno \nReviewed-By: James M Snell \nReviewed-By: Michaƫl Zasso \nReviewed-By: Daniel Bevenius \nReviewed-By: Luigi Pinca \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/92f163e4655b738370c781edc72bdd1b6bbfe8dd",
+ "html_url": "https://github.com/nodejs/node/commit/92f163e4655b738370c781edc72bdd1b6bbfe8dd",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/92f163e4655b738370c781edc72bdd1b6bbfe8dd/comments",
+ "author": {
+ "login": "Fishrock123",
+ "id": 1093990,
+ "node_id": "MDQ6VXNlcjEwOTM5OTA=",
+ "avatar_url": "https://avatars.githubusercontent.com/u/1093990?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/Fishrock123",
+ "html_url": "https://github.com/Fishrock123",
+ "followers_url": "https://api.github.com/users/Fishrock123/followers",
+ "following_url": "https://api.github.com/users/Fishrock123/following{/other_user}",
+ "gists_url": "https://api.github.com/users/Fishrock123/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/Fishrock123/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/Fishrock123/subscriptions",
+ "organizations_url": "https://api.github.com/users/Fishrock123/orgs",
+ "repos_url": "https://api.github.com/users/Fishrock123/repos",
+ "events_url": "https://api.github.com/users/Fishrock123/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/Fishrock123/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "62478eb3d97243e2c7f71b64c23b4ac0a0dfb012",
+ "url": "https://api.github.com/repos/nodejs/node/commits/62478eb3d97243e2c7f71b64c23b4ac0a0dfb012",
+ "html_url": "https://github.com/nodejs/node/commit/62478eb3d97243e2c7f71b64c23b4ac0a0dfb012"
+ }
+ ]
+ },
+ {
+ "sha": "a412b9fa9ab882f25270ed983a9b35420f2c9f73",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6YTQxMmI5ZmE5YWI4ODJmMjUyNzBlZDk4M2E5YjM1NDIwZjJjOWY3Mw==",
+ "commit": {
+ "author": {
+ "name": "Ryan Lewis",
+ "email": "ryanharrisonlewis@gmail.com",
+ "date": "2016-11-06T21:29:59Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:32:56Z"
+ },
+ "message": "doc: grammar and structure revisions of wg doc\n\nPR-URL: https://github.com/nodejs/node/pull/9495\nReviewed-By: James M Snell \nReviewed-By: Roman Reiss ",
+ "tree": {
+ "sha": "0654a0d16b1fad4274bb2d5a0b5524f90c5ded07",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/0654a0d16b1fad4274bb2d5a0b5524f90c5ded07"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/a412b9fa9ab882f25270ed983a9b35420f2c9f73",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9iIAAoJENi59a6uhOTPPS0P/3vIgtojr5Bc8e5G7KFnrlgL\nfiLf7gAE+hAIv/C2rXR7uXtNYi8d/0Pbp23qCHIXspyIQ25lMWoPfxdcyzXFIPG3\nIVcJG67jbi1KQAgo9Tj8K7hngouYSuCN/hdiKgwkqxeDtJPPm6LFKZkUlS0zl54O\nosApi62IPEunOL084VYvAmqOlj+I563xy4hFscoe7AN48Y4RWTxQ/aQNMzI3oN+4\nbm/0XYlzheoKNCUZkLqwlwinOYzbDUxieFpj00I8emZOqaYfnNBwea6BM5jLbkvZ\nce1cCry0pZgliG+XHN53cAEniInMqF9uYHfWJ2MPobdj6HyiOQljbissmfMZ0ITS\nF5g5FXu2Ic+AJ9cav+SD/Pq5lhPPo5TW69BqlI8iUl4rjFh75m1xUWKYOG1ofxvi\nmIddii2pMlLpBO2gt6oW0OPkfgHbLXv+DCWLw5mVZYt5T8vnlnD7ubwjsZGj6zq8\nAsyNin3oKIoGCB4o6L8f12NDNTF15sa25+ZfrUpj7Ut4m6GV5/SJLf1FTw7w4uu4\nGC6G3vnU6QvGgeRtGse1GiBEBQXz+HiZ3qulT2SXfHLWfDvJKSciGYyGSk877J6Q\nJJWvRqYGRTzt7HIkMkxI0YXqy5yER5qLNR5N8kl3+D+FZpSYBaCuedqBPiqDW7ml\nGzXNAOwRn1dhhh0t00qY\n=Czqf\n-----END PGP SIGNATURE-----",
+ "payload": "tree 0654a0d16b1fad4274bb2d5a0b5524f90c5ded07\nparent 92f163e4655b738370c781edc72bdd1b6bbfe8dd\nauthor Ryan Lewis 1478467799 -0800\ncommitter Anna Henningsen 1479792776 +0100\n\ndoc: grammar and structure revisions of wg doc\n\nPR-URL: https://github.com/nodejs/node/pull/9495\nReviewed-By: James M Snell \nReviewed-By: Roman Reiss \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/a412b9fa9ab882f25270ed983a9b35420f2c9f73",
+ "html_url": "https://github.com/nodejs/node/commit/a412b9fa9ab882f25270ed983a9b35420f2c9f73",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/a412b9fa9ab882f25270ed983a9b35420f2c9f73/comments",
+ "author": {
+ "login": "ryanmurakami",
+ "id": 767105,
+ "node_id": "MDQ6VXNlcjc2NzEwNQ==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/767105?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/ryanmurakami",
+ "html_url": "https://github.com/ryanmurakami",
+ "followers_url": "https://api.github.com/users/ryanmurakami/followers",
+ "following_url": "https://api.github.com/users/ryanmurakami/following{/other_user}",
+ "gists_url": "https://api.github.com/users/ryanmurakami/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/ryanmurakami/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/ryanmurakami/subscriptions",
+ "organizations_url": "https://api.github.com/users/ryanmurakami/orgs",
+ "repos_url": "https://api.github.com/users/ryanmurakami/repos",
+ "events_url": "https://api.github.com/users/ryanmurakami/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/ryanmurakami/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "92f163e4655b738370c781edc72bdd1b6bbfe8dd",
+ "url": "https://api.github.com/repos/nodejs/node/commits/92f163e4655b738370c781edc72bdd1b6bbfe8dd",
+ "html_url": "https://github.com/nodejs/node/commit/92f163e4655b738370c781edc72bdd1b6bbfe8dd"
+ }
+ ]
+ },
+ {
+ "sha": "31a34d7992c2cb6fb19f2c0818f1f498b40a1358",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6MzFhMzRkNzk5MmMyY2I2ZmIxOWYyYzA4MThmMWY0OThiNDBhMTM1OA==",
+ "commit": {
+ "author": {
+ "name": "Daniel Bevenius",
+ "email": "daniel.bevenius@gmail.com",
+ "date": "2016-11-10T19:19:56Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:32:56Z"
+ },
+ "message": "doc: fix minor style issue in code examples\n\nI've noticed that a few of the code examples have an minor\nindentation issue with the first line, for example:\n\nhttps://nodejs.org/api/child_process.html#child_process_child_process\nThis commit attempt to fix this issue by using the solution provided\nprovided by silverwind and hiendv.\n\nFixes: https://github.com/nodejs/node/issues/9381\nPR-URL: https://github.com/nodejs/node/pull/9482\nReviewed-By: James M Snell \nReviewed-By: Roman Reiss ",
+ "tree": {
+ "sha": "d425ec01d87ac7fe5be07a1309a6c4ab2985d8ab",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/d425ec01d87ac7fe5be07a1309a6c4ab2985d8ab"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/31a34d7992c2cb6fb19f2c0818f1f498b40a1358",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9iIAAoJENi59a6uhOTPf+MP/1Trs0OsqieQIWFLEjwdf7lc\n80IlUkJ+H8o4ijVzdNrmZ588/7J2eycEFrbxOvPrmv9Y5OUJpdlyVyyzoDWzL5YW\nItUOY5Ex5PUoRkOfepFQHigoIdw3opdhgE4R1ZgFA1rR1GTbl/ONoSlScq8CIxQX\n19JCaPSaW+oHKasnWE/Oad9Rg2+A/JKsyEhkT3ynoM50ZNrUsR9cQ5x9L61IrruN\nWUR2XAuiuEj33x0KfDcrg4gRa+ZHbWO1QuzE7pnhRA+Ttd0ohXPjmmehv9M6IDuG\nJ61ec6EUJpnml5zDi/nFzzdV+u6x2S7UD7KlxDvGulYbUM+sVtKzs/ZxUJ/mLDFt\ngMBlK1Qqg50Xk/SWK+0ELZxEIK30VoWb529/VvJQl2NBwbeFXb0CDmjOfmRb1mVG\n0TYM7Sg4CQmNmbiI44rqYZYv1tgjsL3KF07I802Ge+8aUX/3xvFCK4XdC6OTbpsH\n3lQ+MpRzO2guUjXy/52hIQxDmaglshXrT1o6qUTXoYWu+yPZPU9M9rfkL5Egcgtl\n+hpmiSQA1FifHKe+7RV0x3T95H9ZEBAu8Q9Q1mstl2ks+++roX6BJiS8oUBat6lF\nf+Gy1VMzce9iXqnCnSGNbh93wX+s9x6sdY15c8JWQ0urWARFf007jChoA7EpZTaa\nUUzp5HRtKuNrCA/AJ099\n=hnU8\n-----END PGP SIGNATURE-----",
+ "payload": "tree d425ec01d87ac7fe5be07a1309a6c4ab2985d8ab\nparent a412b9fa9ab882f25270ed983a9b35420f2c9f73\nauthor Daniel Bevenius 1478805596 +0100\ncommitter Anna Henningsen 1479792776 +0100\n\ndoc: fix minor style issue in code examples\n\nI've noticed that a few of the code examples have an minor\nindentation issue with the first line, for example:\n\nhttps://nodejs.org/api/child_process.html#child_process_child_process\nThis commit attempt to fix this issue by using the solution provided\nprovided by silverwind and hiendv.\n\nFixes: https://github.com/nodejs/node/issues/9381\nPR-URL: https://github.com/nodejs/node/pull/9482\nReviewed-By: James M Snell \nReviewed-By: Roman Reiss \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/31a34d7992c2cb6fb19f2c0818f1f498b40a1358",
+ "html_url": "https://github.com/nodejs/node/commit/31a34d7992c2cb6fb19f2c0818f1f498b40a1358",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/31a34d7992c2cb6fb19f2c0818f1f498b40a1358/comments",
+ "author": {
+ "login": "danbev",
+ "id": 432351,
+ "node_id": "MDQ6VXNlcjQzMjM1MQ==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/432351?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/danbev",
+ "html_url": "https://github.com/danbev",
+ "followers_url": "https://api.github.com/users/danbev/followers",
+ "following_url": "https://api.github.com/users/danbev/following{/other_user}",
+ "gists_url": "https://api.github.com/users/danbev/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/danbev/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/danbev/subscriptions",
+ "organizations_url": "https://api.github.com/users/danbev/orgs",
+ "repos_url": "https://api.github.com/users/danbev/repos",
+ "events_url": "https://api.github.com/users/danbev/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/danbev/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "a412b9fa9ab882f25270ed983a9b35420f2c9f73",
+ "url": "https://api.github.com/repos/nodejs/node/commits/a412b9fa9ab882f25270ed983a9b35420f2c9f73",
+ "html_url": "https://github.com/nodejs/node/commit/a412b9fa9ab882f25270ed983a9b35420f2c9f73"
+ }
+ ]
+ },
+ {
+ "sha": "549b6f23dbb8c0fc219ea6893767078ed7032202",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6NTQ5YjZmMjNkYmI4YzBmYzIxOWVhNjg5Mzc2NzA3OGVkNzAzMjIwMg==",
+ "commit": {
+ "author": {
+ "name": "Timothy",
+ "email": "zzzzBov@gmail.com",
+ "date": "2016-11-07T23:36:40Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:32:57Z"
+ },
+ "message": "doc: fix fs constants link\n\nhttps://nodejs.org/api/fs.html#fs_fs_constants links to itself rather\nthan to https://nodejs.org/api/fs.html#fs_fs_constants_1\n\nPR-URL: https://github.com/nodejs/node/pull/9508\nReviewed-By: Luigi Pinca \nReviewed-By: Evan Lucas \nReviewed-By: Colin Ihrig \nReviewed-By: Prince John Wesley \nReviewed-By: Roman Reiss ",
+ "tree": {
+ "sha": "0b168748e00ab0d6b5d05bfb6fa1b477eb9055df",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/0b168748e00ab0d6b5d05bfb6fa1b477eb9055df"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/549b6f23dbb8c0fc219ea6893767078ed7032202",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9iJAAoJENi59a6uhOTPzSsQAId24p+F96AVU6PBE1saxaKC\nffWV1xVW0qHDBECiohVFkJrbQtpuQ5rf/NfIgaj6XrQLB0NOnnWA+NMDduynXhNq\n1obAjPSnoIuA7gUCU8ON98/UGomM/UMcp3r555NixH68Czlvn5zWrhRkuivJP3P+\nRBajVhXcWxBDF9vffLA/j/xVdEkaDD1HmPm6t90uJYV7ambU9sacAGj40WRS+I3t\n5Jbhen75FHwi/AxFW9pPknyQqUlBdJW2o8Yu4xZP9s43DDYm8HlyCsIyYT1nCeCS\n2TcyKX0EMe9X3XI9zclIkzv361mkoAgUW/IdKXGP90xdW/jRgxmIGyS9AQC6zNYm\nkddF09Q/gYc5nCxKJEaelS5hPoy/VkPv/Ywcrdtw3LmKGleC9gkLJrLpF9+G9RL2\nwLWP39+7cnPUJo8NYmqbLMJ689o5aYDTjTVknuRE31A17cb4w6UFRAxWiXP6ZoGu\nFqm805vz6FJfuSC9KrhMyqirnuQk+Bu8hvRUd27MJMLA9f7E+qvuVWh4klUmkcjk\nLXFAc3dea6JQeWyLfDxjsk0RXxQOqGVHxiuvz/lU48/3P0NxhfKVeTdLR6TBOLuj\nmawF6yspQLKvyc4PJb5Pa4MYHTiS6L0b2fEK2RWpQvzx7F40hwWR5ny6Xj3hP4jg\ntkizBoXYK9nmRPGxoIAK\n=BwVz\n-----END PGP SIGNATURE-----",
+ "payload": "tree 0b168748e00ab0d6b5d05bfb6fa1b477eb9055df\nparent 31a34d7992c2cb6fb19f2c0818f1f498b40a1358\nauthor Timothy 1478561800 -0500\ncommitter Anna Henningsen 1479792777 +0100\n\ndoc: fix fs constants link\n\nhttps://nodejs.org/api/fs.html#fs_fs_constants links to itself rather\nthan to https://nodejs.org/api/fs.html#fs_fs_constants_1\n\nPR-URL: https://github.com/nodejs/node/pull/9508\nReviewed-By: Luigi Pinca \nReviewed-By: Evan Lucas \nReviewed-By: Colin Ihrig \nReviewed-By: Prince John Wesley \nReviewed-By: Roman Reiss \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/549b6f23dbb8c0fc219ea6893767078ed7032202",
+ "html_url": "https://github.com/nodejs/node/commit/549b6f23dbb8c0fc219ea6893767078ed7032202",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/549b6f23dbb8c0fc219ea6893767078ed7032202/comments",
+ "author": {
+ "login": "zzzzBov",
+ "id": 518319,
+ "node_id": "MDQ6VXNlcjUxODMxOQ==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/518319?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/zzzzBov",
+ "html_url": "https://github.com/zzzzBov",
+ "followers_url": "https://api.github.com/users/zzzzBov/followers",
+ "following_url": "https://api.github.com/users/zzzzBov/following{/other_user}",
+ "gists_url": "https://api.github.com/users/zzzzBov/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/zzzzBov/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/zzzzBov/subscriptions",
+ "organizations_url": "https://api.github.com/users/zzzzBov/orgs",
+ "repos_url": "https://api.github.com/users/zzzzBov/repos",
+ "events_url": "https://api.github.com/users/zzzzBov/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/zzzzBov/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "31a34d7992c2cb6fb19f2c0818f1f498b40a1358",
+ "url": "https://api.github.com/repos/nodejs/node/commits/31a34d7992c2cb6fb19f2c0818f1f498b40a1358",
+ "html_url": "https://github.com/nodejs/node/commit/31a34d7992c2cb6fb19f2c0818f1f498b40a1358"
+ }
+ ]
+ },
+ {
+ "sha": "7488b0041f956e6275050760809a47043e549320",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6NzQ4OGIwMDQxZjk1NmU2Mjc1MDUwNzYwODA5YTQ3MDQzZTU0OTMyMA==",
+ "commit": {
+ "author": {
+ "name": "imatvieiev",
+ "email": "idmatvieiev@gmail.com",
+ "date": "2016-11-08T18:00:30Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:32:58Z"
+ },
+ "message": "doc: added types to path docs\n\nPR-URL: https://github.com/nodejs/node/pull/9514\nReviewed-By: Roman Reiss ",
+ "tree": {
+ "sha": "2d07bab3122916dc841d32a017c4852425adea80",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/2d07bab3122916dc841d32a017c4852425adea80"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/7488b0041f956e6275050760809a47043e549320",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9iKAAoJENi59a6uhOTP3AYP/1A4LX0CUlPK6smzubu3S0zH\n3iwaK9gkPSfQ2P18cXDhcxoUNxEN3IqLPSNeWsTJpnVBrJdkro7ZslbAF8+tMTFO\nvbAIVWPN9JfeaYIN5hc+YUX3sk9PJqPNVC9ca7s6rrEz6RRCt1oHSfnlZBa/yy2G\ny25QdCP4rQfxC2wqIsPAvsV3ZNDhzyGi+Lel3eDm10diRLNNncutrsPtjGZKf3dr\ni/NQytBpNz4xOowj+pxJj7qRMEnsTjUN4GEvxvFEQiXLPmmB0+HXlUZeQLRLx6xT\nVrBtpjt9GiJYntBWd+Zo+KTH9PH5pA9UgFGRyPBa6yYnliLLJA3LB/TlGQU4s39K\nVSymBD545oJl9z49Fz7asbKk72tkXqEH98+ysgmOJwVkeTXO+TgDnN8WtQSUh7HR\nptaPsjxVHSBwIc8y3bhL8MEvUyo44BzgsB46Od74KHU2u7QfO7P3BJyU/jDRJ4nd\nXOjb+SAfiEYPX0XF2PSx1gboNsHeWNraAQwBZ6xizTskyMT2pQemedHlWqKkKFGc\n+vOlxJI54x+IuFB/0z3Zv/Jr65kHEvofyT5Z/LgRGtrUts+PMfYw0x5UNF6YOOoX\njqEPFODExWlGtK/mnDAezPuAY3RxfYVTU1Q7m6kGKA0qq/NsJx8jKC5ZSeokavJK\ng/c2IQJxkELnOBWkmvnr\n=LJWA\n-----END PGP SIGNATURE-----",
+ "payload": "tree 2d07bab3122916dc841d32a017c4852425adea80\nparent 549b6f23dbb8c0fc219ea6893767078ed7032202\nauthor imatvieiev 1478628030 +0200\ncommitter Anna Henningsen 1479792778 +0100\n\ndoc: added types to path docs\n\nPR-URL: https://github.com/nodejs/node/pull/9514\nReviewed-By: Roman Reiss \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/7488b0041f956e6275050760809a47043e549320",
+ "html_url": "https://github.com/nodejs/node/commit/7488b0041f956e6275050760809a47043e549320",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/7488b0041f956e6275050760809a47043e549320/comments",
+ "author": {
+ "login": "imatveev",
+ "id": 10616396,
+ "node_id": "MDQ6VXNlcjEwNjE2Mzk2",
+ "avatar_url": "https://avatars.githubusercontent.com/u/10616396?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/imatveev",
+ "html_url": "https://github.com/imatveev",
+ "followers_url": "https://api.github.com/users/imatveev/followers",
+ "following_url": "https://api.github.com/users/imatveev/following{/other_user}",
+ "gists_url": "https://api.github.com/users/imatveev/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/imatveev/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/imatveev/subscriptions",
+ "organizations_url": "https://api.github.com/users/imatveev/orgs",
+ "repos_url": "https://api.github.com/users/imatveev/repos",
+ "events_url": "https://api.github.com/users/imatveev/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/imatveev/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "549b6f23dbb8c0fc219ea6893767078ed7032202",
+ "url": "https://api.github.com/repos/nodejs/node/commits/549b6f23dbb8c0fc219ea6893767078ed7032202",
+ "html_url": "https://github.com/nodejs/node/commit/549b6f23dbb8c0fc219ea6893767078ed7032202"
+ }
+ ]
+ },
+ {
+ "sha": "77aded3ba1f6f601b2ca9779099640795a8d9b48",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6NzdhZGVkM2JhMWY2ZjYwMWIyY2E5Nzc5MDk5NjQwNzk1YThkOWI0OA==",
+ "commit": {
+ "author": {
+ "name": "imatvieiev",
+ "email": "idmatvieiev@gmail.com",
+ "date": "2016-11-07T21:23:41Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:33:48Z"
+ },
+ "message": "doc: add process api data types to documentation\n\nPR-URL: https://github.com/nodejs/node/pull/9505\nReviewed-By: Luigi Pinca \nReviewed-By: Brian White \nReviewed-By: Colin Ihrig \nReviewed-By: Michael Dawson \nReviewed-By: Roman Reiss ",
+ "tree": {
+ "sha": "520c8aedbcd05ccea1560cabad567595da6c2d27",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/520c8aedbcd05ccea1560cabad567595da6c2d27"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/77aded3ba1f6f601b2ca9779099640795a8d9b48",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9i8AAoJENi59a6uhOTPZ8sP/jvr+MMM7IPUK3srJFB7Vng2\nBn7UwxO4SFGVFugLkEN+oCzIfhXB+CiNZXNnPz6PAiY+jzdQQRfUVbUCcgHXZHZ2\n8xIOzKcHdAmCHS0dRjZEpp6GC3/hS8L5BJIIfe5PgcdcUk4cgJKzqpH8ynP7kwVA\n8Fg4nl2C4uVRDlx0g6GFmwqsTBWEntq3nRZ5ozg5wf4S+W/8ZIFN6tBC65hqsDTx\n7cuAtY8x976LAwZ0L58OM4BQFz7i6O+8smuJ/PK1BiQqVas/GixwybR1S8S9ymmN\njI+/67cVN/yFnl0XDZypYa7MUdBfotqo24Bx2EQrJv06x0QlATlDEHh7j5z8/qvi\ncaSZ2YoztVJFhamAKRyxB6+0aOQKnhpJA8LwAlZ9WXVeoqjE6jXynV0Lobsz6xs0\ndmLgFxKOBGBO0OLyErDhYd8BTkbCPDl384hTtIExhQqAyTJ6XhoDtBds74BR6VOw\nmnI13kTLT2qO1cyvZ3ExjgG2tq/VOE/PEQ634GnZaeBmmTCEOnGXzLDQFCD0qcg1\nef758dkodQV7YWj5Ns+kD7EwKJzls8ciBfxzW3fmbD0FICy6LQYk/G1J8d3CCTPi\nQk9CA+EjUWiD4VQcT55y91VxUSyKlygmZlbYjkpA6gfJ+5Kvkt2jEGL0lbGI4iUX\nZMdc4XYTCLwDSl3ab6eM\n=22pw\n-----END PGP SIGNATURE-----",
+ "payload": "tree 520c8aedbcd05ccea1560cabad567595da6c2d27\nparent 7488b0041f956e6275050760809a47043e549320\nauthor imatvieiev 1478553821 +0200\ncommitter Anna Henningsen 1479792828 +0100\n\ndoc: add process api data types to documentation\n\nPR-URL: https://github.com/nodejs/node/pull/9505\nReviewed-By: Luigi Pinca \nReviewed-By: Brian White \nReviewed-By: Colin Ihrig \nReviewed-By: Michael Dawson \nReviewed-By: Roman Reiss \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/77aded3ba1f6f601b2ca9779099640795a8d9b48",
+ "html_url": "https://github.com/nodejs/node/commit/77aded3ba1f6f601b2ca9779099640795a8d9b48",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/77aded3ba1f6f601b2ca9779099640795a8d9b48/comments",
+ "author": {
+ "login": "imatveev",
+ "id": 10616396,
+ "node_id": "MDQ6VXNlcjEwNjE2Mzk2",
+ "avatar_url": "https://avatars.githubusercontent.com/u/10616396?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/imatveev",
+ "html_url": "https://github.com/imatveev",
+ "followers_url": "https://api.github.com/users/imatveev/followers",
+ "following_url": "https://api.github.com/users/imatveev/following{/other_user}",
+ "gists_url": "https://api.github.com/users/imatveev/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/imatveev/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/imatveev/subscriptions",
+ "organizations_url": "https://api.github.com/users/imatveev/orgs",
+ "repos_url": "https://api.github.com/users/imatveev/repos",
+ "events_url": "https://api.github.com/users/imatveev/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/imatveev/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "7488b0041f956e6275050760809a47043e549320",
+ "url": "https://api.github.com/repos/nodejs/node/commits/7488b0041f956e6275050760809a47043e549320",
+ "html_url": "https://github.com/nodejs/node/commit/7488b0041f956e6275050760809a47043e549320"
+ }
+ ]
+ },
+ {
+ "sha": "d09a9f4d2781a114f8926a0355d5117980b1a838",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6ZDA5YTlmNGQyNzgxYTExNGY4OTI2YTAzNTVkNTExNzk4MGIxYTgzOA==",
+ "commit": {
+ "author": {
+ "name": "William Kapke",
+ "email": "william.kapke@gmail.com",
+ "date": "2016-11-10T23:20:43Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:33:49Z"
+ },
+ "message": "doc: remove Roadmap Working Group\n\nRefs: https://github.com/nodejs/CTC/issues/16\nPR-URL: https://github.com/nodejs/node/pull/9545\nReviewed-By: Ben Noordhuis \nReviewed-By: Rich Trott \nReviewed-By: Luigi Pinca \nReviewed-By: Evan Lucas \nReviewed-By: Colin Ihrig \nReviewed-By: Johan Bergstrƶm \nReviewed-By: Michael Dawson \nReviewed-By: Roman Reiss ",
+ "tree": {
+ "sha": "0813bde80c46a5c5e13623084509dcae8b26110a",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/0813bde80c46a5c5e13623084509dcae8b26110a"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/d09a9f4d2781a114f8926a0355d5117980b1a838",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9i9AAoJENi59a6uhOTPLiAP/1r7DGnb7//+BHU0aiv7ouXg\nQVnS7tW+YOLdRanQsa+/s825ylb/QIXUntbVzqTEwZlZx90RnszmmNjZspdNEcMn\nOwkQhIYcFE7OF231u6TFl1zXvlsqWuZ81wH7cEDEvJZK9CKXc0r15d8Zi377EqWy\nfamh2422aambpXR8QTrWB4/MxIWbabqmSxilO30+zA8Kh5nVdl0uIQxJOASbTbmx\n4SGOQVPlhxM+LF/dFcM6fjYlPukkQ8/h0p2jm6EGuZogOK7nI5i6KAfu0KSI7n8U\n/N+8pG+1q/3EyJUgG1N9Bc3dCoXTGN57hgvtj7QrB61rKKLW2gnKxLXi1DFB7xwr\ncDBUCj3m3oqhAnbpgItyunNgMUwZodpqETHzs5BT9G3oORCm3v2r4T4wwIPYQaHS\nKjgsfl2RtQtg5a6WC0viS+dGfl9oxYTDeZMImBem8a3Ig1/W57GxmD0SlK+tSMHc\nSpX69AEM58P93g732py0ela8dHRk24B/1dcYctCUfhdA9VTJLzSLnGN/x9qRwOrj\nsVwi/wCPbHYjKZ3/xllsEFPjP+LFHJfplATrNloMql/6GP5K5Xz4aHXNta7xR6Z+\nzhRzFHN6QMgcnfQc3682tsqG5/Nf8cyDaCFu0PLQhP8zWFxg5jI3wN3buPmlkUK+\nXamezCXVXEH9biAG3fPi\n=AGv/\n-----END PGP SIGNATURE-----",
+ "payload": "tree 0813bde80c46a5c5e13623084509dcae8b26110a\nparent 77aded3ba1f6f601b2ca9779099640795a8d9b48\nauthor William Kapke 1478820043 +0000\ncommitter Anna Henningsen 1479792829 +0100\n\ndoc: remove Roadmap Working Group\n\nRefs: https://github.com/nodejs/CTC/issues/16\nPR-URL: https://github.com/nodejs/node/pull/9545\nReviewed-By: Ben Noordhuis \nReviewed-By: Rich Trott \nReviewed-By: Luigi Pinca \nReviewed-By: Evan Lucas \nReviewed-By: Colin Ihrig \nReviewed-By: Johan Bergstrƶm \nReviewed-By: Michael Dawson \nReviewed-By: Roman Reiss \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/d09a9f4d2781a114f8926a0355d5117980b1a838",
+ "html_url": "https://github.com/nodejs/node/commit/d09a9f4d2781a114f8926a0355d5117980b1a838",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/d09a9f4d2781a114f8926a0355d5117980b1a838/comments",
+ "author": {
+ "login": "williamkapke",
+ "id": 739813,
+ "node_id": "MDQ6VXNlcjczOTgxMw==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/739813?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/williamkapke",
+ "html_url": "https://github.com/williamkapke",
+ "followers_url": "https://api.github.com/users/williamkapke/followers",
+ "following_url": "https://api.github.com/users/williamkapke/following{/other_user}",
+ "gists_url": "https://api.github.com/users/williamkapke/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/williamkapke/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/williamkapke/subscriptions",
+ "organizations_url": "https://api.github.com/users/williamkapke/orgs",
+ "repos_url": "https://api.github.com/users/williamkapke/repos",
+ "events_url": "https://api.github.com/users/williamkapke/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/williamkapke/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "77aded3ba1f6f601b2ca9779099640795a8d9b48",
+ "url": "https://api.github.com/repos/nodejs/node/commits/77aded3ba1f6f601b2ca9779099640795a8d9b48",
+ "html_url": "https://github.com/nodejs/node/commit/77aded3ba1f6f601b2ca9779099640795a8d9b48"
+ }
+ ]
+ },
+ {
+ "sha": "7c9e8cbd762505430d4367ca167e93cbae4366ff",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6N2M5ZThjYmQ3NjI1MDU0MzBkNDM2N2NhMTY3ZTkzY2JhZTQzNjZmZg==",
+ "commit": {
+ "author": {
+ "name": "kohta ito",
+ "email": "kohta110@gmail.com",
+ "date": "2016-11-12T07:18:05Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:33:49Z"
+ },
+ "message": "doc: fix the index order in pseudocode of modules\n\nfix the index order in pseudocode of modules.\n\nPR-URL: https://github.com/nodejs/node/pull/9562\nReviewed-By: Shigeki Ohtsu \nReviewed-By: Yosuke Furukawa \nReviewed-By: Roman Reiss ",
+ "tree": {
+ "sha": "c4cf3dc3aeaa01e54c604fa98f5e94c77c099d99",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/c4cf3dc3aeaa01e54c604fa98f5e94c77c099d99"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/7c9e8cbd762505430d4367ca167e93cbae4366ff",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9i9AAoJENi59a6uhOTP+wYP/3ufptyDJv6Ovvh0qlbBUHvK\n72foBNioqo6THeB9Sqb4hD4M6/im0IG63hKongopMb+DfH8GZkjnSo7b1ccCTLLJ\n0QXgV8hgRMRtWDkEeF5e3E2cK3QBa2B++CRSWWPThljcnnopMEFdoAPGpK4f9S83\nBJSpGPE27N8C9EKddsrZKXXAPczRqTDSLwIXwll+7TVzhZOvVQ9AGvpApEWXQ4sJ\nK0q+ZACiyJqH/Y+lScGLE3KLAXk0vGpam1L6lcq7GdIUmaubMR4+4kHxs9F/kAr2\n/dWVwxOCaSD9tEZEf36FnZz7JZypNl4A5X9Xi3wfstm9AJGb6ren1/3DpqVDbCGo\nzfRM3PthsuTi7z9RVXBo6zUSitGdTTRmF/R4/E10DnEflvPSMjvqndPqFYMw8nTB\nMWF/4Fp8DiYDYOriQb+jQ/7s+58w4/dzxVUuyULP28+sDwM/vEd8ERtwFITAQR2+\n9PV7938EM+UgfkHobbi/IwiUlrERgMjsZolk+jOILypYA423gYTQgnuT51kQNKXj\nd6uCMgaEywflHIca9mIOgMRDJu6l0EBhkPIrLiNhFDiG7SG9bkfjl5aOGZsh6Fio\nWoE45s50KfVMCQPh6HqMW94foE2Z2djNJVJEIjZOQ5evaQ6HapXjHGWMYwzZyABP\nHz4WPilsL/cQZfKjHjQx\n=ceUL\n-----END PGP SIGNATURE-----",
+ "payload": "tree c4cf3dc3aeaa01e54c604fa98f5e94c77c099d99\nparent d09a9f4d2781a114f8926a0355d5117980b1a838\nauthor kohta ito 1478935085 +0900\ncommitter Anna Henningsen 1479792829 +0100\n\ndoc: fix the index order in pseudocode of modules\n\nfix the index order in pseudocode of modules.\n\nPR-URL: https://github.com/nodejs/node/pull/9562\nReviewed-By: Shigeki Ohtsu \nReviewed-By: Yosuke Furukawa \nReviewed-By: Roman Reiss \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/7c9e8cbd762505430d4367ca167e93cbae4366ff",
+ "html_url": "https://github.com/nodejs/node/commit/7c9e8cbd762505430d4367ca167e93cbae4366ff",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/7c9e8cbd762505430d4367ca167e93cbae4366ff/comments",
+ "author": {
+ "login": "koh110",
+ "id": 1889831,
+ "node_id": "MDQ6VXNlcjE4ODk4MzE=",
+ "avatar_url": "https://avatars.githubusercontent.com/u/1889831?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/koh110",
+ "html_url": "https://github.com/koh110",
+ "followers_url": "https://api.github.com/users/koh110/followers",
+ "following_url": "https://api.github.com/users/koh110/following{/other_user}",
+ "gists_url": "https://api.github.com/users/koh110/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/koh110/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/koh110/subscriptions",
+ "organizations_url": "https://api.github.com/users/koh110/orgs",
+ "repos_url": "https://api.github.com/users/koh110/repos",
+ "events_url": "https://api.github.com/users/koh110/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/koh110/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "d09a9f4d2781a114f8926a0355d5117980b1a838",
+ "url": "https://api.github.com/repos/nodejs/node/commits/d09a9f4d2781a114f8926a0355d5117980b1a838",
+ "html_url": "https://github.com/nodejs/node/commit/d09a9f4d2781a114f8926a0355d5117980b1a838"
+ }
+ ]
+ },
+ {
+ "sha": "8c859d58aba3eeba6bd8fd0d8416c6b189709948",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6OGM4NTlkNThhYmEzZWViYTZiZDhmZDBkODQxNmM2YjE4OTcwOTk0OA==",
+ "commit": {
+ "author": {
+ "name": "Rich Trott",
+ "email": "rtrott@gmail.com",
+ "date": "2016-11-10T05:02:14Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:33:50Z"
+ },
+ "message": "test: refactor test-tls-inception\n\n* buffer-to-string comparison replaced with string-to-string comparison\n* equal -> strictEqual\n* var -> const\n* rename identifiers to avoid masking\n\nPR-URL: https://github.com/nodejs/node/pull/9536\nReviewed-By: Santiago Gimeno \nReviewed-By: Michaƫl Zasso \nReviewed-By: Michael Dawson \nReviewed-By: Colin Ihrig ",
+ "tree": {
+ "sha": "ddb8937212309d2fff9cd6c553ae3fef98af931e",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/ddb8937212309d2fff9cd6c553ae3fef98af931e"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/8c859d58aba3eeba6bd8fd0d8416c6b189709948",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9i+AAoJENi59a6uhOTPA6gP/0Fu9Fgp0o8+hBrizHIc81L7\nvnOhMxadU6rHNVfiIRLoiMkT4TpJdU0HEkcNShEY0tAIlxJgGDcq6WmqkQXKJNfw\n5aRIZbH1KiX1mPGP3e3oyYx+H6w9kMeVf9iAlIqcO3iwJRF2Tk49fa7UfeCeQfbf\nS9L28PpJXwaCnRvVij4sVZzLRaTjktY4H8L6dx4lC/aSnZXq85cTMIFWmq+bdbuJ\ncg/dQBPivXndNCAKC4RExt09InlgCavysTXyQCNkTIbkwa8Mrcwel6/2POgPBG1a\nm+4aC+PUZhzZrjIThxKD4kR/3cIErACEpWImfUyK8f8CClZ6z2iGc6fm6U9XWEVe\nwLB2IxyAOMFMUwn302JAVsKi+Z5MlKdkhVPgO+7GtjgFyy/00gJnFUZpfyGuE+lh\nN9vl6I5owBWL50T0a5ZCLOrU+oZ/D0FR5EvcWd5Wy54ghZc68/fXJ5gxFiJouHhA\nMILAY5ODOgTMzM1+C+/zxaHIaLvNrntqDQO3E8VwlvTT222/KfiosU2Y0+pntI6J\nH7Udch0mOm0GzhAwAa7NzcmlXMX0uGyXdZz0nVF9W/MA/ATK8PnyRerlPMy4wD7h\njPVr6DFlQD/7ymXqYb9jhbWgb5yimzrQr74zwKxAI+DX34L7M2Lkh9xOb/VpxM4s\nyiawfprBx6LLOMrT9Qcw\n=WOaI\n-----END PGP SIGNATURE-----",
+ "payload": "tree ddb8937212309d2fff9cd6c553ae3fef98af931e\nparent 7c9e8cbd762505430d4367ca167e93cbae4366ff\nauthor Rich Trott 1478754134 -0800\ncommitter Anna Henningsen 1479792830 +0100\n\ntest: refactor test-tls-inception\n\n* buffer-to-string comparison replaced with string-to-string comparison\n* equal -> strictEqual\n* var -> const\n* rename identifiers to avoid masking\n\nPR-URL: https://github.com/nodejs/node/pull/9536\nReviewed-By: Santiago Gimeno \nReviewed-By: Michaƫl Zasso \nReviewed-By: Michael Dawson \nReviewed-By: Colin Ihrig \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/8c859d58aba3eeba6bd8fd0d8416c6b189709948",
+ "html_url": "https://github.com/nodejs/node/commit/8c859d58aba3eeba6bd8fd0d8416c6b189709948",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/8c859d58aba3eeba6bd8fd0d8416c6b189709948/comments",
+ "author": {
+ "login": "Trott",
+ "id": 718899,
+ "node_id": "MDQ6VXNlcjcxODg5OQ==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/718899?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/Trott",
+ "html_url": "https://github.com/Trott",
+ "followers_url": "https://api.github.com/users/Trott/followers",
+ "following_url": "https://api.github.com/users/Trott/following{/other_user}",
+ "gists_url": "https://api.github.com/users/Trott/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/Trott/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/Trott/subscriptions",
+ "organizations_url": "https://api.github.com/users/Trott/orgs",
+ "repos_url": "https://api.github.com/users/Trott/repos",
+ "events_url": "https://api.github.com/users/Trott/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/Trott/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "7c9e8cbd762505430d4367ca167e93cbae4366ff",
+ "url": "https://api.github.com/repos/nodejs/node/commits/7c9e8cbd762505430d4367ca167e93cbae4366ff",
+ "html_url": "https://github.com/nodejs/node/commit/7c9e8cbd762505430d4367ca167e93cbae4366ff"
+ }
+ ]
+ }
+ ]
+
\ No newline at end of file
diff --git a/test/_fixtures/pull-request-commits-page-2.json b/test/_fixtures/pull-request-commits-page-2.json
new file mode 100644
index 00000000..44aae2ef
--- /dev/null
+++ b/test/_fixtures/pull-request-commits-page-2.json
@@ -0,0 +1,2373 @@
+[
+ {
+ "sha": "dae3d3e53c5bed61dc70cc624c7fac50ca5af92d",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6ZGFlM2QzZTUzYzViZWQ2MWRjNzBjYzYyNGM3ZmFjNTBjYTVhZjkyZA==",
+ "commit": {
+ "author": {
+ "name": "Rich Trott",
+ "email": "rtrott@gmail.com",
+ "date": "2016-11-10T06:09:56Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:33:50Z"
+ },
+ "message": "test: refactor test-next-tick-error-spin\n\n* use common.mustCall()\n* setTimeout() -> setImmediate()\n* assert() -> assert.strictEqual()\n* var -> const\n* remove unneeded console.log()\n* remove commented-out code\n\nPR-URL: https://github.com/nodejs/node/pull/9537\nReviewed-By: Michael Dawson \nReviewed-By: Colin Ihrig ",
+ "tree": {
+ "sha": "5f1953500c8f50879ae5ea22da38bf5a4c63863a",
+ "url": "https://api.github.com/repos/nodejs/node/git/trees/5f1953500c8f50879ae5ea22da38bf5a4c63863a"
+ },
+ "url": "https://api.github.com/repos/nodejs/node/git/commits/dae3d3e53c5bed61dc70cc624c7fac50ca5af92d",
+ "comment_count": 0,
+ "verification": {
+ "verified": true,
+ "reason": "valid",
+ "signature": "-----BEGIN PGP SIGNATURE-----\nVersion: GnuPG v1\n\niQIcBAABAgAGBQJYM9i/AAoJENi59a6uhOTPES4P/RGPAwHYX7TqFQ9Kp1JH9TCT\nGY/IZziLRFA+fanAFFDRCNwSM2K3pwBJ9ZTvsoaU4Pb/knPiP1DcD/L28d+nR32d\nSEwKfwY7W5MeW/DAxL6CBeuCVXrrIlwurGBC5qJEwPYS9FsReRfz+/C/gfh/cvTv\ny4nlSyns3akLLdjOn+Cf+yiMBuznEzAS5yZgaZs2Q+XYsj0NacBQ8n4e7KUvXVcW\nAUDH6qyOLJc1O4gwTmC6DSaMMB9/xlc99ot+QGyDfdK09CzQNLYWHnAMI96pCOSk\n8iVV9diF3DQXvvLEE9VnUjHrIF4cK/GPt0vZ3djZm1yEeLQ7l14YYIDOzFLfHlpV\n6YxPFbUsV5AG7CotIuGZSOQ/LbVlOgGz+uquydtrRClcMizmQQgM0FwhuwRTG9WQ\nlGwSKEbbdlWPWpyu9vsyFZubc8pP00hERe5i70DOwILd0p6mkmJmYR2r7lQmE1+H\nG56qRwqJ3xGloEmyDGulaBrIRJXp/rwtHuMc2ncKyWdzz3D5hVKQfUqncDKxuZhL\nhBHHEOtAMCNRtDBgzpidYGe+/cjcaiWczmmtjI31RKHxiuTDeuntQm977cE/i8Bj\nKXaOg2eXlc4WI6ZV3hz6sVAiE5jIKxc65Z6P5KaXj5Hy+f1iUNYgdxVjw0QJM/y2\nvS+UN3GhMq1d45yTGI7Z\n=jE0w\n-----END PGP SIGNATURE-----",
+ "payload": "tree 5f1953500c8f50879ae5ea22da38bf5a4c63863a\nparent 8c859d58aba3eeba6bd8fd0d8416c6b189709948\nauthor Rich Trott 1478758196 -0800\ncommitter Anna Henningsen 1479792830 +0100\n\ntest: refactor test-next-tick-error-spin\n\n* use common.mustCall()\n* setTimeout() -> setImmediate()\n* assert() -> assert.strictEqual()\n* var -> const\n* remove unneeded console.log()\n* remove commented-out code\n\nPR-URL: https://github.com/nodejs/node/pull/9537\nReviewed-By: Michael Dawson \nReviewed-By: Colin Ihrig \n"
+ }
+ },
+ "url": "https://api.github.com/repos/nodejs/node/commits/dae3d3e53c5bed61dc70cc624c7fac50ca5af92d",
+ "html_url": "https://github.com/nodejs/node/commit/dae3d3e53c5bed61dc70cc624c7fac50ca5af92d",
+ "comments_url": "https://api.github.com/repos/nodejs/node/commits/dae3d3e53c5bed61dc70cc624c7fac50ca5af92d/comments",
+ "author": {
+ "login": "Trott",
+ "id": 718899,
+ "node_id": "MDQ6VXNlcjcxODg5OQ==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/718899?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/Trott",
+ "html_url": "https://github.com/Trott",
+ "followers_url": "https://api.github.com/users/Trott/followers",
+ "following_url": "https://api.github.com/users/Trott/following{/other_user}",
+ "gists_url": "https://api.github.com/users/Trott/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/Trott/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/Trott/subscriptions",
+ "organizations_url": "https://api.github.com/users/Trott/orgs",
+ "repos_url": "https://api.github.com/users/Trott/repos",
+ "events_url": "https://api.github.com/users/Trott/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/Trott/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "committer": {
+ "login": "addaleax",
+ "id": 899444,
+ "node_id": "MDQ6VXNlcjg5OTQ0NA==",
+ "avatar_url": "https://avatars.githubusercontent.com/u/899444?v=4",
+ "gravatar_id": "",
+ "url": "https://api.github.com/users/addaleax",
+ "html_url": "https://github.com/addaleax",
+ "followers_url": "https://api.github.com/users/addaleax/followers",
+ "following_url": "https://api.github.com/users/addaleax/following{/other_user}",
+ "gists_url": "https://api.github.com/users/addaleax/gists{/gist_id}",
+ "starred_url": "https://api.github.com/users/addaleax/starred{/owner}{/repo}",
+ "subscriptions_url": "https://api.github.com/users/addaleax/subscriptions",
+ "organizations_url": "https://api.github.com/users/addaleax/orgs",
+ "repos_url": "https://api.github.com/users/addaleax/repos",
+ "events_url": "https://api.github.com/users/addaleax/events{/privacy}",
+ "received_events_url": "https://api.github.com/users/addaleax/received_events",
+ "type": "User",
+ "site_admin": false
+ },
+ "parents": [
+ {
+ "sha": "8c859d58aba3eeba6bd8fd0d8416c6b189709948",
+ "url": "https://api.github.com/repos/nodejs/node/commits/8c859d58aba3eeba6bd8fd0d8416c6b189709948",
+ "html_url": "https://github.com/nodejs/node/commit/8c859d58aba3eeba6bd8fd0d8416c6b189709948"
+ }
+ ]
+ },
+ {
+ "sha": "64dec14502ab41036c23da7f501b4fc83945f427",
+ "node_id": "MDY6Q29tbWl0MjcxOTM3Nzk6NjRkZWMxNDUwMmFiNDEwMzZjMjNkYTdmNTAxYjRmYzgzOTQ1ZjQyNw==",
+ "commit": {
+ "author": {
+ "name": "ikasumi_wt",
+ "email": "wtsnyk13@gmail.com",
+ "date": "2016-11-12T07:19:47Z"
+ },
+ "committer": {
+ "name": "Anna Henningsen",
+ "email": "anna@addaleax.net",
+ "date": "2016-11-22T05:33:51Z"
+ },
+ "message": "doc: fix e.g., to e.g. in doc/http.md\n\nfix e.g., to e.g. in doc/http.md\n\nFixes: https://github.com/nodejs/code-and-learn/issues/58\nPR-URL: https://github.com/nodejs/node/pull/9564\nReviewed-By: Yosuke Furukawa \nReviewed-By: Roman Reiss \nReviewed-By: Anna Henningsen \nReviewed-By: Luigi Pinca