diff --git a/.github/workflows/ci.yml b/.github/workflows/pull_request.yml similarity index 66% rename from .github/workflows/ci.yml rename to .github/workflows/pull_request.yml index 99af853c6..46b281682 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/pull_request.yml @@ -1,8 +1,6 @@ -name: CI +name: Pull request on: - push: - branches: [master] pull_request: branches: [master] @@ -10,7 +8,7 @@ jobs: build: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v2 + - uses: actions/checkout@v2 # checkout visx + this commit - uses: actions/setup-node@v1 with: node-version: '12' @@ -26,30 +24,39 @@ jobs: restore-keys: | ${{ runner.os }}-yarn- - - name: Install dependencies + - name: ๐Ÿ“ก Install dependencies run: yarn install --frozen-lockfile --ignore-engines - - name: Build packages + - name: ๐Ÿ›  Build packages run: yarn build - - name: Run jest + - name: ๐Ÿงช Run jest run: yarn jest -w 4 env: CI: true COVERAGE: true - - name: Report code coverage + - name: ๐Ÿ“ˆ Report code coverage uses: coverallsapp/github-action@v1.1.1 with: github-token: ${{ secrets.GITHUB_TOKEN }} - - name: Run lint + - name: โœจ Run lint run: yarn lint - - name: Run happo + - name: ๐Ÿฆ› Run happo run: yarn run happo-ci-github-actions working-directory: './packages/visx-demo/' env: HAPPO_API_KEY: ${{ secrets.HAPPO_API_KEY }} HAPPO_API_SECRET: ${{ secrets.HAPPO_API_SECRET }} HAPPO_COMMAND: '../../node_modules/happo.io/build/cli.js' + + - name: ๐Ÿ“ Report package sizes + run: yarn build:sizes && yarn check:sizes + # add needed variables for posting on the PR via octokit + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PR_NUMBER: ${{ github.event.pull_request.number }} + GITHUB_REPOSITORY: $GITHUB_REPOSITORY + GITHUB_ACTOR: $GITHUB_ACTOR diff --git a/.github/workflows/push.yml b/.github/workflows/push.yml new file mode 100644 index 000000000..3d99b2278 --- /dev/null +++ b/.github/workflows/push.yml @@ -0,0 +1,70 @@ +name: Push + +on: + push: + branches: [master] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 # checkout visx + this commit + - uses: actions/setup-node@v1 + with: + node-version: '12' + + - name: Get yarn cache directory path + id: yarn-cache-dir-path + run: echo "::set-output name=dir::$(yarn cache dir)" + - uses: actions/cache@v1 + id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`) + with: + path: ${{ steps.yarn-cache-dir-path.outputs.dir }} + key: ${{ runner.os }}-yarn-${{ hashFiles('**/yarn.lock') }} + restore-keys: | + ${{ runner.os }}-yarn- + + - name: ๐Ÿ“ก Install dependencies + run: yarn install --frozen-lockfile --ignore-engines + + - name: ๐Ÿ›  Build packages + run: yarn build + + - name: ๐Ÿ“ Commit package sizes + run: | + yarn build:sizes + git config user.name github-actions + git config user.email github-actions@github.com + git add . + git commit -m "build(${GITHUB_SHA}): auto-commit package sizes" + git push + + - name: ๐Ÿš€ Build and deploy gallery + # below we + # - setup git credentials provided via actions/checkout@v2 + # - initialize gh-pages-branch as an orphan branch so we don't build history + # - checkout the current commit and create gh-pages-root-dir/ as a new worktree + # - outside that directory HEAD is detached at $GITHUB_SHA + # - within that directory we are on the gh-pages-branch we just initialized + # *worktree initialization should be in a root dir, otherwise the worktree inherits nested directories + # - build the static next.js site and copy the output into gh-pages-root-dir/ + # - we can't output directly into gh-pages-root-dir/ because next wipes the folder including .git + # - commit the demo site within gh-pages-root-dir/ onto the gh-pages-branch + # - push gh-pages-branch to visx as gh-pages. we overwrite history every time so it must be forced + run: | + git config user.name github-actions + git config user.email github-actions@github.com + git checkout --orphan gh-pages-branch + git reset --hard + touch .nojekyll + git add .nojekyll + git commit -m "bot(${GITHUB_SHA}): initialize gh-pages branch" + git checkout "$GITHUB_SHA" + git worktree add gh-pages-root-dir gh-pages-branch + cd ./packages/visx-demo/ + yarn build + mv -v out/* ../../gh-pages-root-dir/ + cd ../../gh-pages-root-dir/ + git add . + git commit -m "bot(${GITHUB_SHA}): build gh-pages" + git push -f "https://$GITHUB_ACTOR:$GITHUB_TOKEN@github.com/$GITHUB_REPOSITORY.git" HEAD:gh-pages diff --git a/package.json b/package.json index ad610b062..315a62391 100644 --- a/package.json +++ b/package.json @@ -30,23 +30,29 @@ ], "private": true, "scripts": { - "build": "yarn run babel && yarn run type:dts", - "build-one": "nimbus babel --clean", "babel": "yarn run babel:cjs && yarn run babel:esm", "babel:cjs": "nimbus babel --clean --workspaces=\"@visx/!(demo)\"", "babel:esm": "nimbus babel --clean --workspaces=\"@visx/!(demo)\" --esm", + "build": "yarn run babel && yarn run type", + "build-one": "echo 'build-one has been replaced with build:workspace' & exit 1", + "build:sizes": "yarn run ts ./scripts/computeBuildSizes.ts", + "build:workspace": "nimbus babel --clean", + "check:sizes": "yarn run ts ./scripts/compareBuildSizes.ts", "clean": "rm -rf ./packages/**/{lib,esm}", "format": "yarn run prettier --write", "jest": "NODE_ENV=test nimbus jest --coverage --verbose", "lint": "nimbus eslint", "lint:fix": "yarn run lint --fix", + "prepare-release": "git checkout master && git pull --rebase origin master && lerna updated", "prettier": "nimbus prettier", + "release": "yarn run prepare-release && lerna publish --exact", "setup": "yarn run build", "test": "yarn run jest", - "type:dts": "nimbus typescript --build --reference-workspaces", - "type-one": "nimbus typescript --build", - "prepare-release": "git checkout master && git pull --rebase origin master && lerna updated", - "release": "yarn run prepare-release && lerna publish --exact" + "ts": "ts-node --project ./tsconfig.node.json", + "type": "nimbus typescript --build --reference-workspaces", + "type-one": "echo 'type-one has been replaced with type:workspace' & exit 1", + "type:dts": "echo 'type:dts has been replaced with type' & exit 1", + "type:workspace": "nimbus typescript --build" }, "devDependencies": { "@airbnb/config-babel": "^2.1.3", @@ -55,26 +61,33 @@ "@airbnb/config-prettier": "^2.0.4", "@airbnb/config-typescript": "^2.1.2", "@airbnb/nimbus": "^2.1.3", + "@octokit/rest": "18.1.0", "@types/enzyme": "^3.10.3", "@types/jest": "^24.0.18", "@types/jsdom": "^12.2.4", + "@types/node-fetch": "1.6.9", "@types/react-test-renderer": "^16.9.0", "@types/webpack": "^4.41.17", + "chalk": "4.1.0", "coveralls": "^3.0.6", "enzyme": "^3.10.0", "enzyme-adapter-react-16": "^1.14.0", "enzyme-to-json": "^3.4.0", + "fast-glob": "3.2.5", + "filesize": "6.1.0", "fs-jetpack": "^1.3.0", "husky": "^3.0.0", "jest-mock-console": "^1.0.1", "lerna": "^3.15.0", "marked": "^0.7.0", + "node-fetch": "2.6.1", "raf": "^3.4.0", "react": "^15.0.0-0 || ^16.0.0-0", "react-dom": "^15.0.0-0 || ^16.0.0-0", "react-test-renderer": "^16.8.6", "regenerator-runtime": "^0.10.5", - "timezone-mock": "^1.1.0" + "timezone-mock": "^1.1.0", + "ts-node": "9.1.1" }, "workspaces": [ "./packages/*" diff --git a/packages/visx-annotation/package.json b/packages/visx-annotation/package.json index b22461782..8c7a90e3b 100644 --- a/packages/visx-annotation/package.json +++ b/packages/visx-annotation/package.json @@ -40,7 +40,7 @@ "@visx/text": "1.3.0", "classnames": "^2.2.5", "prop-types": "^15.5.10", - "react-use-measure": "2.0.1" + "react-use-measure": "^2.0.3" }, "devDependencies": { "resize-observer-polyfill": "^1.5.1" diff --git a/packages/visx-demo/package.json b/packages/visx-demo/package.json index 0f3bb420e..65bf2acc3 100644 --- a/packages/visx-demo/package.json +++ b/packages/visx-demo/package.json @@ -68,7 +68,7 @@ "@visx/xychart": "1.4.0", "@visx/zoom": "1.3.0", "@zeit/next-css": "^1.0.1", - "babel-loader": "8.2.2", + "babel-loader": "^8.2.2", "classnames": "^2.2.5", "d3-array": "^1.1.1", "d3-collection": "^1.0.4", diff --git a/packages/visx-demo/src/sandboxes/visx-axis/Example.tsx b/packages/visx-demo/src/sandboxes/visx-axis/Example.tsx index da3c3d804..54b0e9292 100644 --- a/packages/visx-demo/src/sandboxes/visx-axis/Example.tsx +++ b/packages/visx-demo/src/sandboxes/visx-axis/Example.tsx @@ -67,7 +67,8 @@ export default function Example({ showControls = true, }: AxisProps) { // use non-animated components if prefers-reduced-motion is set - const prefersReducedMotionQuery = window?.matchMedia('(prefers-reduced-motion: reduce)'); + const prefersReducedMotionQuery = + typeof window === 'undefined' ? false : window.matchMedia('(prefers-reduced-motion: reduce)'); const prefersReducedMotion = !prefersReducedMotionQuery || !!prefersReducedMotionQuery.matches; const [useAnimatedComponents, setUseAnimatedComponents] = useState(!prefersReducedMotion); diff --git a/packages/visx-demo/src/sandboxes/visx-pattern/Example.tsx b/packages/visx-demo/src/sandboxes/visx-pattern/Example.tsx index ace500aaa..4a75993f8 100644 --- a/packages/visx-demo/src/sandboxes/visx-pattern/Example.tsx +++ b/packages/visx-demo/src/sandboxes/visx-pattern/Example.tsx @@ -120,7 +120,8 @@ const Patterns: React.FC<{ id: string; prefersReducedMotion?: boolean }>[] = [ export default function Example({ width, height, margin = defaultMargin }: PatternProps) { // use non-animated components if prefers-reduced-motion is set - const prefersReducedMotionQuery = window?.matchMedia('(prefers-reduced-motion: reduce)'); + const prefersReducedMotionQuery = + typeof window === 'undefined' ? false : window.matchMedia('(prefers-reduced-motion: reduce)'); const prefersReducedMotion = !prefersReducedMotionQuery || !!prefersReducedMotionQuery.matches; const numColumns = 3; diff --git a/packages/visx-demo/src/sandboxes/visx-xychart/userPrefersReducedMotion.ts b/packages/visx-demo/src/sandboxes/visx-xychart/userPrefersReducedMotion.ts index 6f9ac04b3..cc1823670 100644 --- a/packages/visx-demo/src/sandboxes/visx-xychart/userPrefersReducedMotion.ts +++ b/packages/visx-demo/src/sandboxes/visx-xychart/userPrefersReducedMotion.ts @@ -1,4 +1,5 @@ export default function userPrefersReducedMotion() { - const prefersReducedMotionQuery = window?.matchMedia('(prefers-reduced-motion: reduce)'); + const prefersReducedMotionQuery = + typeof window === 'undefined' ? false : window.matchMedia('(prefers-reduced-motion: reduce)'); return !prefersReducedMotionQuery || !!prefersReducedMotionQuery.matches; } diff --git a/packages/visx-tooltip/package.json b/packages/visx-tooltip/package.json index 9f3c5f706..d44fee80a 100644 --- a/packages/visx-tooltip/package.json +++ b/packages/visx-tooltip/package.json @@ -33,7 +33,7 @@ "@visx/bounds": "1.0.0", "classnames": "^2.2.5", "prop-types": "^15.5.10", - "react-use-measure": "2.0.1" + "react-use-measure": "^2.0.3" }, "peerDependencies": { "react": "^16.8.0-0", diff --git a/scripts/compareBuildSizes.ts b/scripts/compareBuildSizes.ts new file mode 100644 index 000000000..7c269ff6e --- /dev/null +++ b/scripts/compareBuildSizes.ts @@ -0,0 +1,124 @@ +import fs from 'fs'; +import size from 'filesize'; +import chalk from 'chalk'; +import fetch from 'node-fetch'; +import upsertPullRequestComment from './upsertPullRequestComment'; +import { PACKAGE_SIZES_FILENAME } from './computeBuildSizes'; + +type StatMap = { + [pkg: string]: { + [dir: string]: number; + }; +}; + +function calculateDiff(prev: number, next: number): number { + return (next - prev) / prev; +} + +function formatDiff(diff: number): string { + const sum = diff * 100; + const percent = sum.toFixed(1); + + // Smaller + if (percent.startsWith('-')) { + return `${sum < -10 ? ':small_red_triangle_down: ' : ''}${percent}%`; + } + + // Larger + return `${sum > 10 ? ':small_red_triangle: ' : ''}+${percent}%`; +} + +async function compareBuildSizes() { + const nextSizes: StatMap = JSON.parse(fs.readFileSync(PACKAGE_SIZES_FILENAME, 'utf8')); + let prevSizes: StatMap = {}; + let sameBuild = false; + + try { + const masterFileSizesRequest = await fetch( + `https://raw.githubusercontent.com/airbnb/visx/master/${PACKAGE_SIZES_FILENAME}`, + ); + + prevSizes = await masterFileSizesRequest.json(); + } catch (error) { + console.log(`Could not fetch file ${PACKAGE_SIZES_FILENAME} from master. Aborting.`); + console.log(error.message); + + prevSizes = nextSizes; + sameBuild = true; + } + + function getPrevSize(name: string, type: string) { + return (prevSizes[name] && prevSizes[name][type]) || 0; + } + + const output: string[] = [ + '### Size Changes', + '| Package | Diff | ESM | Prev ESM | CJS | Prev CJS |', + '| --- | ---: | ---: | ---: | ---: | ---: |', + ]; + const rows: string[] = []; + + Object.entries(nextSizes).forEach(([pkgName, stats]) => { + const prevEsm = getPrevSize(pkgName, 'esm'); + const prevLib = getPrevSize(pkgName, 'lib'); + const diff = calculateDiff(prevEsm, stats.esm); + + if (!isFinite(diff) || diff === 0 || diff === 0.0) { + return; + } + + const row = [ + pkgName, + formatDiff(diff), + size(stats.esm), + prevEsm === 0 ? 'N/A' : size(prevEsm), + size(stats.lib), + prevLib === 0 ? 'N/A' : size(prevLib), + ]; + + rows.push(`| ${row.join(' | ')} |`); + }); + + // Don't post anything if no changes + if (rows.length === 0) { + return; + } + + // Sort rows before joining to output + rows.sort(); + + output.push(...rows); + output.push('> Compared to master. File sizes are unminified and ungzipped.'); + + // Show dumps for easier debugging + if (!sameBuild) { + output.push(`
+View raw build stats + +#### Previous (master) +\`\`\`json +${JSON.stringify(prevSizes, null, 2)} +\`\`\` + +#### Current +\`\`\`json +${JSON.stringify(nextSizes, null, 2)} +\`\`\` +
`); + } + + // Leave a comment on the PR + const breakdown = output.join('\n'); + + try { + await upsertPullRequestComment('### Size Changes', breakdown); + } catch (error) { + console.log('Could not post size stats', breakdown); + console.error(error); + } +} + +compareBuildSizes().catch(error => { + console.error(chalk.red(error.message)); + process.exitCode = 1; +}); diff --git a/scripts/computeBuildSizes.ts b/scripts/computeBuildSizes.ts new file mode 100644 index 000000000..4707437bd --- /dev/null +++ b/scripts/computeBuildSizes.ts @@ -0,0 +1,64 @@ +import fs from 'fs'; +import path from 'path'; +import chalk from 'chalk'; +import glob from 'fast-glob'; + +export const PACKAGE_SIZES_FILENAME = './packages/sizes.json'; + +async function getTotalSize(fileGlob: string, cwd: string): Promise { + const files = await glob(fileGlob, { absolute: true, cwd, onlyFiles: true }); + const sizes = await Promise.all( + files.map( + file => + new Promise((resolve, reject) => { + fs.stat(file, (error, stats) => { + if (error) { + reject(error); + } else { + resolve(stats.size); + } + }); + }), + ), + ); + + return sizes.reduce((sum, size) => sum + size, 0); +} + +async function computeBuildSizes() { + const packages = await glob('./packages/*', { absolute: true, onlyDirectories: true }); + const stats: { name: string; sizes: object }[] = []; + + await Promise.all( + packages.map(async packagePath => { + const packageName = path.basename(packagePath); + + stats.push({ + name: packageName, + sizes: { + esm: await getTotalSize('./esm/**/*.js', packagePath), + lib: await getTotalSize('./lib/**/*.js', packagePath), + }, + }); + }), + ); + + // Sort so its deterministic + stats.sort((a, b) => a.name.localeCompare(b.name)); + + // Convert to an object + const sizes = stats.reduce( + (obj, stat) => ({ + ...obj, + [stat.name]: stat.sizes, + }), + {}, + ); + + fs.writeFileSync(PACKAGE_SIZES_FILENAME, JSON.stringify(sizes), 'utf8'); +} + +computeBuildSizes().catch(error => { + console.error(chalk.red(error.message)); + process.exitCode = 1; +}); diff --git a/scripts/upsertPullRequestComment.ts b/scripts/upsertPullRequestComment.ts new file mode 100644 index 000000000..ec5fd117a --- /dev/null +++ b/scripts/upsertPullRequestComment.ts @@ -0,0 +1,59 @@ +import { Octokit } from '@octokit/rest'; + +function createGitHubClient(authToken?: string) { + return new Octokit({ + auth: `token ${authToken}`, + userAgent: 'visx', + }); +} + +export default async function upsertPullRequestComment(query: string, body: string) { + const { GITHUB_TOKEN, PR_NUMBER, GITHUB_REPOSITORY = '/', GITHUB_ACTOR = '' } = process.env; + + const client = createGitHubClient(GITHUB_TOKEN); + const [owner, repo] = GITHUB_REPOSITORY.split('/'); + const prNumber = Number(PR_NUMBER); + + console.log(`Loading comments for repo ${GITHUB_REPOSITORY} issue #${prNumber}`); + + // Load all comments + const { data: comments } = await client.issues.listComments({ + issue_number: prNumber, + owner, + repo, + }); + + // Find a previously created comment by our bot + const previousComments = comments.filter( + comment => + comment.body?.includes(query) && + comment.user?.type === 'Bot' && + // bots have [bot] appended to GITHUB_ACTOR + comment.user.login.includes(GITHUB_ACTOR), + ); + + // Update existing comment + if (previousComments.length > 0) { + const { id } = previousComments[0]; + + console.log(`Updating comment #${id}`); + + await client.issues.updateComment({ + comment_id: id, + owner, + repo, + body, + }); + + // Insert a new comment + } else { + console.log('Adding a new comment'); + + await client.issues.createComment({ + issue_number: prNumber, + owner, + repo, + body, + }); + } +} diff --git a/tsconfig.node.json b/tsconfig.node.json new file mode 100644 index 000000000..e91a0fed0 --- /dev/null +++ b/tsconfig.node.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "allowSyntheticDefaultImports": true, + "composite": true, + "declaration": true, + "declarationMap": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "isolatedModules": false, + "jsx": "react", + "lib": ["dom", "esnext"], + "module": "commonjs", + "moduleResolution": "node", + "noEmitOnError": true, + "noErrorTruncation": false, + "noImplicitReturns": true, + "noUnusedLocals": true, + "pretty": true, + "removeComments": false, + "strict": true, + "target": "es2015", + "typeRoots": ["./node_modules/@types", "./types"], + "useDefineForClassFields": false + } +} diff --git a/yarn.lock b/yarn.lock index a722d2361..d1609f395 100644 --- a/yarn.lock +++ b/yarn.lock @@ -3313,6 +3313,25 @@ dependencies: "@octokit/types" "^4.0.1" +"@octokit/auth-token@^2.4.4": + version "2.4.5" + resolved "https://registry.yarnpkg.com/@octokit/auth-token/-/auth-token-2.4.5.tgz#568ccfb8cb46f36441fac094ce34f7a875b197f3" + integrity sha512-BpGYsPgJt05M7/L/5FoE1PiAbdxXFZkX/3kDYcsvd1v6UhlnE5e96dTDr0ezX/EFwciQxf3cNV0loipsURU+WA== + dependencies: + "@octokit/types" "^6.0.3" + +"@octokit/core@^3.2.3": + version "3.2.5" + resolved "https://registry.yarnpkg.com/@octokit/core/-/core-3.2.5.tgz#57becbd5fd789b0592b915840855f3a5f233d554" + integrity sha512-+DCtPykGnvXKWWQI0E1XD+CCeWSBhB6kwItXqfFmNBlIlhczuDPbg+P6BtLnVBaRJDAjv+1mrUJuRsFSjktopg== + dependencies: + "@octokit/auth-token" "^2.4.4" + "@octokit/graphql" "^4.5.8" + "@octokit/request" "^5.4.12" + "@octokit/types" "^6.0.3" + before-after-hook "^2.1.0" + universal-user-agent "^6.0.0" + "@octokit/endpoint@^6.0.1": version "6.0.2" resolved "https://registry.yarnpkg.com/@octokit/endpoint/-/endpoint-6.0.2.tgz#e876aafe68d7f9b6c6d80bf29458403f9afe7b2b" @@ -3322,6 +3341,20 @@ is-plain-object "^3.0.0" universal-user-agent "^5.0.0" +"@octokit/graphql@^4.5.8": + version "4.6.0" + resolved "https://registry.yarnpkg.com/@octokit/graphql/-/graphql-4.6.0.tgz#f9abca55f82183964a33439d5264674c701c3327" + integrity sha512-CJ6n7izLFXLvPZaWzCQDjU/RP+vHiZmWdOunaCS87v+2jxMsW9FB5ktfIxybRBxZjxuJGRnxk7xJecWTVxFUYQ== + dependencies: + "@octokit/request" "^5.3.0" + "@octokit/types" "^6.0.3" + universal-user-agent "^6.0.0" + +"@octokit/openapi-types@^4.0.0": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@octokit/openapi-types/-/openapi-types-4.0.1.tgz#bafd3d173974827ba0b733fcca7f1860cb71a9aa" + integrity sha512-k2hRcfcLRyPJjtYfJLzg404n7HZ6sUpAWAR/uNI8tf96NgatWOpw1ocdF+WFfx/trO1ivBh7ckynO1rn+xAw/Q== + "@octokit/plugin-enterprise-rest@^6.0.1": version "6.0.1" resolved "https://registry.yarnpkg.com/@octokit/plugin-enterprise-rest/-/plugin-enterprise-rest-6.0.1.tgz#e07896739618dab8da7d4077c658003775f95437" @@ -3334,11 +3367,23 @@ dependencies: "@octokit/types" "^2.0.1" +"@octokit/plugin-paginate-rest@^2.6.2": + version "2.9.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-paginate-rest/-/plugin-paginate-rest-2.9.1.tgz#e9bb34a89b7ed5b801f1c976feeb9b0078ecd201" + integrity sha512-8wnuWGjwDIEobbBet2xAjZwgiMVTgIer5wBsnGXzV3lJ4yqphLU2FEMpkhSrDx7y+WkZDfZ+V+1cFMZ1mAaFag== + dependencies: + "@octokit/types" "^6.8.0" + "@octokit/plugin-request-log@^1.0.0": version "1.0.0" resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.0.tgz#eef87a431300f6148c39a7f75f8cfeb218b2547e" integrity sha512-ywoxP68aOT3zHCLgWZgwUJatiENeHE7xJzYjfz8WI0goynp96wETBF+d95b8g/uL4QmS6owPVlaxiz3wyMAzcw== +"@octokit/plugin-request-log@^1.0.2": + version "1.0.3" + resolved "https://registry.yarnpkg.com/@octokit/plugin-request-log/-/plugin-request-log-1.0.3.tgz#70a62be213e1edc04bb8897ee48c311482f9700d" + integrity sha512-4RFU4li238jMJAzLgAwkBAw+4Loile5haQMQr+uhFq27BmyJXcXSKvoQKqh0agsZEiUlW6iSv3FAgvmGkur7OQ== + "@octokit/plugin-rest-endpoint-methods@2.4.0": version "2.4.0" resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-2.4.0.tgz#3288ecf5481f68c494dd0602fc15407a59faf61e" @@ -3347,6 +3392,14 @@ "@octokit/types" "^2.0.1" deprecation "^2.3.1" +"@octokit/plugin-rest-endpoint-methods@4.10.1": + version "4.10.1" + resolved "https://registry.yarnpkg.com/@octokit/plugin-rest-endpoint-methods/-/plugin-rest-endpoint-methods-4.10.1.tgz#b7a9181d1f52fef70a13945c5b49cffa51862da1" + integrity sha512-YGMiEidTORzgUmYZu0eH4q2k8kgQSHQMuBOBYiKxUYs/nXea4q/Ze6tDzjcRAPmHNJYXrENs1bEMlcdGKT+8ug== + dependencies: + "@octokit/types" "^6.8.2" + deprecation "^2.3.1" + "@octokit/request-error@^1.0.2": version "1.2.1" resolved "https://registry.yarnpkg.com/@octokit/request-error/-/request-error-1.2.1.tgz#ede0714c773f32347576c25649dc013ae6b31801" @@ -3379,6 +3432,30 @@ once "^1.4.0" universal-user-agent "^5.0.0" +"@octokit/request@^5.3.0", "@octokit/request@^5.4.12": + version "5.4.14" + resolved "https://registry.yarnpkg.com/@octokit/request/-/request-5.4.14.tgz#ec5f96f78333bb2af390afa5ff66f114b063bc96" + integrity sha512-VkmtacOIQp9daSnBmDI92xNIeLuSRDOIuplp/CJomkvzt7M18NXgG044Cx/LFKLgjKt9T2tZR6AtJayba9GTSA== + dependencies: + "@octokit/endpoint" "^6.0.1" + "@octokit/request-error" "^2.0.0" + "@octokit/types" "^6.7.1" + deprecation "^2.0.0" + is-plain-object "^5.0.0" + node-fetch "^2.6.1" + once "^1.4.0" + universal-user-agent "^6.0.0" + +"@octokit/rest@18.1.0": + version "18.1.0" + resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-18.1.0.tgz#9bf72604911a3433165bcc924263c9a706d32804" + integrity sha512-YQfpTzWV3jdzDPyXQVO54f5I2t1zxk/S53Vbe+Aa5vQj6MdTx6sNEWzmUzUO8lSVowbGOnjcQHzW1A8ATr+/7g== + dependencies: + "@octokit/core" "^3.2.3" + "@octokit/plugin-paginate-rest" "^2.6.2" + "@octokit/plugin-request-log" "^1.0.2" + "@octokit/plugin-rest-endpoint-methods" "4.10.1" + "@octokit/rest@^16.28.4": version "16.43.1" resolved "https://registry.yarnpkg.com/@octokit/rest/-/rest-16.43.1.tgz#3b11e7d1b1ac2bbeeb23b08a17df0b20947eda6b" @@ -3415,6 +3492,14 @@ dependencies: "@types/node" ">= 8" +"@octokit/types@^6.0.3", "@octokit/types@^6.7.1", "@octokit/types@^6.8.0", "@octokit/types@^6.8.2": + version "6.8.2" + resolved "https://registry.yarnpkg.com/@octokit/types/-/types-6.8.2.tgz#ce4872e038d6df38b2d3c21bc12329af0b10facb" + integrity sha512-RpG0NJd7OKSkWptiFhy1xCLkThs5YoDIKM21lEtDmUvSpbaIEfrxzckWLUGDFfF8RydSyngo44gDv8m2hHruUg== + dependencies: + "@octokit/openapi-types" "^4.0.0" + "@types/node" ">= 8" + "@sinonjs/commons@^1.7.0": version "1.8.0" resolved "https://registry.yarnpkg.com/@sinonjs/commons/-/commons-1.8.0.tgz#c8d68821a854c555bba172f3b06959a0039b236d" @@ -3690,6 +3775,13 @@ resolved "https://registry.yarnpkg.com/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6" integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY= +"@types/node-fetch@1.6.9": + version "1.6.9" + resolved "https://registry.yarnpkg.com/@types/node-fetch/-/node-fetch-1.6.9.tgz#a750fb0f4cf2960bf72b462e4c86908022dd69c5" + integrity sha512-n2r6WLoY7+uuPT7pnEtKJCmPUGyJ+cbyBR8Avnu4+m1nzz7DwBVuyIvvlBzCZ/nrpC7rIgb3D6pNavL7rFEa9g== + dependencies: + "@types/node" "*" + "@types/node@*", "@types/node@>= 8": version "14.0.9" resolved "https://registry.yarnpkg.com/@types/node/-/node-14.0.9.tgz#43896ab87fc82bda1dfd600cdf44a0c8a64e11d2" @@ -4404,6 +4496,11 @@ are-we-there-yet@~1.1.2: delegates "^1.0.0" readable-stream "^2.0.6" +arg@^4.1.0: + version "4.1.3" + resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089" + integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA== + argparse@^1.0.7: version "1.0.10" resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz#bcd6791ea5ae09725e17e5ad988134cd40b3d911" @@ -4692,7 +4789,7 @@ babel-literal-to-ast@^2.1.0: "@babel/traverse" "^7.1.6" "@babel/types" "^7.1.6" -babel-loader@8.2.2: +babel-loader@^8.2.2: version "8.2.2" resolved "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.2.2.tgz#9363ce84c10c9a40e6c753748e1441b60c8a0b81" integrity sha512-JvTd0/D889PQBtUXJ2PXaKU/pjZDMtHA9V2ecm+eNRmmBCMR09a+fmpGTNwnJtFmFl5Ei7Vy47LjBb+L0wQ99g== @@ -4844,6 +4941,11 @@ before-after-hook@^2.0.0: resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.0.tgz#b6c03487f44e24200dd30ca5e6a1979c5d2fb635" integrity sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A== +before-after-hook@^2.1.0: + version "2.1.1" + resolved "https://registry.yarnpkg.com/before-after-hook/-/before-after-hook-2.1.1.tgz#99ae36992b5cfab4a83f6bee74ab27835f28f405" + integrity sha512-5ekuQOvO04MDj7kYZJaMab2S8SPjGJbotVNyv7QYFCOAwrGZs/YnoDNlh1U+m5hl7H2D/+n0taaAV/tfyd3KMA== + big.js@^5.2.2: version "5.2.2" resolved "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz#65f0af382f578bcdc742bd9c281e9cb2d7768328" @@ -5293,6 +5395,14 @@ chalk@4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +chalk@4.1.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-4.1.0.tgz#4e14870a618d9e2edd97dd8345fd9d9dc315646a" + integrity sha512-qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A== + dependencies: + ansi-styles "^4.1.0" + supports-color "^7.1.0" + chalk@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" @@ -5944,6 +6054,11 @@ create-hmac@^1.1.0, create-hmac@^1.1.4, create-hmac@^1.1.7: safe-buffer "^5.0.1" sha.js "^2.4.8" +create-require@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333" + integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ== + cross-fetch@3.0.5: version "3.0.5" resolved "https://registry.yarnpkg.com/cross-fetch/-/cross-fetch-3.0.5.tgz#2739d2981892e7ab488a7ad03b92df2816e03f4c" @@ -6534,6 +6649,11 @@ diff-sequences@^25.2.6: resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-25.2.6.tgz#5f467c00edd35352b7bca46d7927d60e687a76dd" integrity sha512-Hq8o7+6GaZeoFjtpgvRBUknSXNeJiCx7V9Fr94ZMljNiCr9n9L8H8aJqgWOQiDDGdyn29fRNcDdRVJ5fdyihfg== +diff@^4.0.1: + version "4.0.2" + resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d" + integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== + diffie-hellman@^5.0.0: version "5.0.3" resolved "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz#40e8ee98f55a2149607146921c63e1ae5f3d2875" @@ -7536,6 +7656,18 @@ fast-diff@^1.1.2: resolved "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz#73ee11982d86caaf7959828d519cfe927fac5f03" integrity sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w== +fast-glob@3.2.5: + version "3.2.5" + resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-3.2.5.tgz#7939af2a656de79a4f1901903ee8adcaa7cb9661" + integrity sha512-2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg== + dependencies: + "@nodelib/fs.stat" "^2.0.2" + "@nodelib/fs.walk" "^1.2.3" + glob-parent "^5.1.0" + merge2 "^1.3.0" + micromatch "^4.0.2" + picomatch "^2.2.1" + fast-glob@^2.2.6: version "2.2.7" resolved "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz#6953857c3afa475fff92ee6015d52da70a4cd39d" @@ -7633,6 +7765,11 @@ file-uri-to-path@1.0.0: resolved "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz#553a7b8446ff6f684359c445f1e37a05dacc33dd" integrity sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw== +filesize@6.1.0: + version "6.1.0" + resolved "https://registry.yarnpkg.com/filesize/-/filesize-6.1.0.tgz#e81bdaa780e2451d714d71c0d7a4f3238d37ad00" + integrity sha512-LpCHtPQ3sFx67z+uh2HnSyWSLLu5Jxo21795uRDuar/EOuYWXib5EmPaGIBuSnRqH2IODiKA2k5re/K9OnN/Yg== + fill-range@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz#d544811d428f98eb06a63dc402d2403c328c38f7" @@ -8939,6 +9076,11 @@ is-plain-object@^3.0.0: dependencies: isobject "^4.0.0" +is-plain-object@^5.0.0: + version "5.0.0" + resolved "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-5.0.0.tgz#4427f50ab3429e9025ea7d52e9043a9ef4159344" + integrity sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q== + is-potential-custom-element-name@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.0.tgz#0c52e54bcca391bb2c494b21e8626d7336c6e397" @@ -10214,7 +10356,7 @@ make-dir@^3.0.0, make-dir@^3.0.2, make-dir@^3.1.0: dependencies: semver "^6.0.0" -make-error@1.x: +make-error@1.x, make-error@^1.1.1: version "1.3.6" resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2" integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw== @@ -10844,6 +10986,11 @@ node-fetch@2.6.0, node-fetch@^2.3.0, node-fetch@^2.5.0: resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.0.tgz#e633456386d4aa55863f676a7ab0daa8fdecb0fd" integrity sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA== +node-fetch@2.6.1, node-fetch@^2.6.1: + version "2.6.1" + resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.1.tgz#045bd323631f76ed2e2b55573394416b639a0052" + integrity sha512-V4aYg89jEoVRxRb2fJdAg8FHvI7cEyYdVAh94HH0UIK8oJxUfkjlDQN9RbMx+bEjP7+ggMiFRprSti032Oipxw== + node-fetch@^1.0.1: version "1.7.3" resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-1.7.3.tgz#980f6f72d85211a5347c6b2bc18c5b84c3eb47ef" @@ -12290,10 +12437,10 @@ react-tilt@^0.1.4: resolved "https://registry.yarnpkg.com/react-tilt/-/react-tilt-0.1.4.tgz#0ac1f33674a3fff6c617cf411002d7ecdd2ebcb1" integrity sha512-bVeRumg+RIn6QN8S92UmubGqX/BG6/QeQISBeAcrS/70dpo/jVj+sjikIawDl5wTuPdubFH8zH0EMulWIctsnw== -react-use-measure@2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/react-use-measure/-/react-use-measure-2.0.1.tgz#4f23f94c832cd4512da55acb300d1915dcbf3ae8" - integrity sha512-lFfHiqcXbJ2/6aUkZwt8g5YYM7EGqNVxJhMqMPqv1BVXRKp8D7jYLlmma0SvhRY4WYxxkZpCdbJvhDylb5gcEA== +react-use-measure@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/react-use-measure/-/react-use-measure-2.0.3.tgz#7b56ae3ca19ccf62326933678625a8ff6b3f90a3" + integrity sha512-57O8Os9MbgFEHuOHOXNdPmBHhXjCBIwtB3YxyrM/MgaX44a1o97Mu9YqiOA6cAF8kXIw4fO3XK0r2Taa4SqaqQ== dependencies: debounce "^1.2.0" @@ -13295,7 +13442,7 @@ source-map-resolve@^0.5.0, source-map-resolve@^0.5.2: source-map-url "^0.4.0" urix "^0.1.0" -source-map-support@^0.5.6, source-map-support@^0.5.9, source-map-support@~0.5.12: +source-map-support@^0.5.17, source-map-support@^0.5.6, source-map-support@^0.5.9, source-map-support@~0.5.12: version "0.5.19" resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz#a98b62f86dcaf4f67399648c085291ab9e8fed61" integrity sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw== @@ -14168,6 +14315,18 @@ ts-jest@^24.1.0: semver "^5.5" yargs-parser "10.x" +ts-node@9.1.1: + version "9.1.1" + resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-9.1.1.tgz#51a9a450a3e959401bda5f004a72d54b936d376d" + integrity sha512-hPlt7ZACERQGf03M253ytLY3dHbGNGrAq9qIHWUY9XHYl1z7wYngSr3OQ5xmui8o2AaxsONxIzjafLUiWBo1Fg== + dependencies: + arg "^4.1.0" + create-require "^1.1.0" + diff "^4.0.1" + make-error "^1.1.1" + source-map-support "^0.5.17" + yn "3.1.1" + ts-pnp@^1.1.6: version "1.2.0" resolved "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz#a500ad084b0798f1c3071af391e65912c86bca92" @@ -14415,6 +14574,11 @@ universal-user-agent@^5.0.0: dependencies: os-name "^3.1.0" +universal-user-agent@^6.0.0: + version "6.0.0" + resolved "https://registry.yarnpkg.com/universal-user-agent/-/universal-user-agent-6.0.0.tgz#3381f8503b251c0d9cd21bc1de939ec9df5480ee" + integrity sha512-isyNax3wXoKaulPDZWHQqbmIx1k2tb9fb3GGDBRxCscfYV2Ch7WxPArBsFEG8s/safwXTT7H4QGhaIkTp9447w== + universalify@^0.1.0: version "0.1.2" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz#b646f69be3942dabcecc9d6639c80dc105efaa66" @@ -14991,6 +15155,11 @@ yargs@^15.3.1: y18n "^4.0.0" yargs-parser "^18.1.1" +yn@3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50" + integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q== + zip-stream@^4.0.4: version "4.0.4" resolved "https://registry.yarnpkg.com/zip-stream/-/zip-stream-4.0.4.tgz#3a8f100b73afaa7d1ae9338d910b321dec77ff3a"