diff --git a/.circleci/config.yml b/.circleci/config.yml deleted file mode 100644 index 4e6bd95b1..000000000 --- a/.circleci/config.yml +++ /dev/null @@ -1,72 +0,0 @@ -version: 2.1 -orbs: - browser-tools: circleci/browser-tools@1.1.0 -jobs: - build: - docker: - - image: cimg/node:14.15.4-browsers - environment: - NO_SANDBOX: true - steps: - - checkout - - run: - command: npm ci - - run: - command: npm run lint - - run: - command: npm run test:unit - - run: - command: npm run build - - run: - command: E2E_IPFSD_TYPE=go npm run test:e2e - # - run: - TODO: uncomment after pinning services are coded in js-ipfs - # command: E2E_IPFSD_TYPE=js npm run test:e2e - - run: - command: npm run bundlesize - - persist_to_workspace: - root: . - paths: - - build - - deploy: - docker: - - image: olizilla/ipfs-dns-deploy:latest - environment: - DOMAIN: webui.ipfs.io - BUILD_DIR: build - CLUSTER_HOST: /dnsaddr/ipfs-websites.collab.ipfscluster.io - steps: - - attach_workspace: - at: /tmp/workspace - - run: - name: Deploy website to IPFS - command: | - pin_name="$DOMAIN build $CIRCLE_BUILD_NUMBER" - - hash=$(pin-to-cluster.sh "$pin_name" /tmp/workspace/$BUILD_DIR) - - echo "Website added to IPFS: https://ipfs.io/ipfs/$hash" - - if [ "$CIRCLE_BRANCH" == "main" ] ; then - dnslink-dnsimple -d dev.$DOMAIN -r _dnslink -l /ipfs/$hash - fi - - if npx semver "$CIRCLE_TAG"; then - dnslink-dnsimple -d $DOMAIN -r _dnslink -l /ipfs/$hash - fi - -workflows: - version: 2 - build-deploy: - jobs: - - build: - filters: - tags: - only: /.*/ - - deploy: - filters: - tags: - only: /.*/ - context: ipfs-dns-deploy - requires: - - build diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 000000000..30d9c6a97 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,240 @@ +name: ci +on: + workflow_dispatch: + push: + branches: + - main + tags: + - '*' + pull_request: + branches: + - main + +env: + XDG_CACHE_HOME: ${{ github.workspace }}/.cache + +jobs: + build: + name: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Setup node + uses: actions/setup-node@v1 + with: + node-version: 15 + + - name: Cache bigger downloads + uses: actions/cache@v2 + id: cache + with: + path: ${{ github.workspace }}/.cache + key: ${{ runner.os }}-${{ hashFiles('package.json', 'package-lock.json') }} + restore-keys: | + ${{ runner.os }}-${{ hashFiles('package.json', 'package-lock.json') }} + ${{ runner.os }}- + + - name: Install dependencies + run: npm ci --prefer-offline --no-audit --progress=false --cache ${{ github.workspace }}/.cache/npm + + # Separate cache for build dir, we reuse it in release publish workflow + - name: Cache build output + if: startsWith(github.ref, 'refs/tags/v') + uses: actions/cache@v2 + id: build-cache + with: + path: build + key: ${{ runner.os }}-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-${{ github.sha }} + + - name: Confirm build works + if: steps.build-cache.outputs.cache-hit != 'true' + run: npm run build + + # Persist produced build dir: + # - this is not for releases, but for quick testing during the dev + # - action artifacts can be downloaded for 90 days, then are removed by github + - name: Attach produced build to Github Action + uses: actions/upload-artifact@v2 + with: + name: ipfs-webui_${{ github.sha }} + path: build + if-no-files-found: error + + test-unit: + name: 'test:unit' + needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Setup node + uses: actions/setup-node@v1 + with: + node-version: 15 + + - name: Cache bigger downloads + uses: actions/cache@v2 + id: cache + with: + path: ${{ github.workspace }}/.cache + key: ${{ runner.os }}-${{ hashFiles('package.json', 'package-lock.json') }} + restore-keys: | + ${{ runner.os }}-${{ hashFiles('package.json', 'package-lock.json') }} + ${{ runner.os }}- + + - name: Install dependencies + run: npm ci --prefer-offline --no-audit --progress=false --cache ${{ github.workspace }}/.cache/npm + + - name: Run unit tests + run: npm run test:unit + + publish-preview: + name: publish preview + needs: build + environment: Deploy + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + + - name: Setup node + uses: actions/setup-node@v1 + with: + node-version: 15 + + - name: Download build artifact + uses: actions/download-artifact@v2 + with: + name: ipfs-webui_${{ github.sha }} + path: build + + # pin the built site to ipfs-websites cluster, output the cid as `steps.ipfs.outputs.cid` + # see: https://github.com/ipfs-shipyard/ipfs-github-action + - uses: ipfs-shipyard/ipfs-github-action@v2.0.0 + id: ipfs + with: + path_to_add: build + cluster_host: /dnsaddr/ipfs-websites.collab.ipfscluster.io + cluster_user: ${{ secrets.CLUSTER_USER }} + cluster_password: ${{ secrets.CLUSTER_PASSWORD }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + - run: echo ${{ steps.ipfs.outputs.url }} + - run: echo ${{ github.ref }} + + # dev dnslink is updated on each main branch update + - run: npx dnslink-dnsimple --domain dev.webui.ipfs.io --link /ipfs/${{ steps.ipfs.outputs.cid }} + if: github.ref == 'refs/heads/main' + env: + DNSIMPLE_TOKEN: ${{ secrets.DNSIMPLE_TOKEN }} + + # production dnslink is updated on release (during tag build) + - run: npx dnslink-dnsimple --domain webui.ipfs.io --link /ipfs/${{ steps.ipfs.outputs.cid }} + if: startsWith(github.ref, 'refs/tags/v') + env: + DNSIMPLE_TOKEN: ${{ secrets.DNSIMPLE_TOKEN }} + + test-e2e: + name: 'test:e2e' + needs: build + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + backend: [js, go] + steps: + - uses: actions/checkout@v2 + + - name: Setup node + uses: actions/setup-node@v1 + with: + node-version: 15 + + - name: Cache bigger downloads + uses: actions/cache@v2 + id: cache + with: + path: ${{ github.workspace }}/.cache + key: ${{ runner.os }}-${{ hashFiles('package.json', 'package-lock.json') }} + restore-keys: | + ${{ runner.os }}-${{ hashFiles('package.json', 'package-lock.json') }} + ${{ runner.os }}- + + - name: Install dependencies + run: npm ci --prefer-offline --no-audit --progress=false --cache ${{ github.workspace }}/.cache/npm + + - name: Download build artifact + uses: actions/download-artifact@v2 + with: + name: ipfs-webui_${{ github.sha }} + path: build + + - name: Run E2E against ${{ matrix.backend }}-ipfs + run: E2E_IPFSD_TYPE=${{ matrix.backend }} npm run test:e2e + + # separate check for TS + typecheck: + name: typecheck + needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + + - name: Setup node + uses: actions/setup-node@v1 + with: + node-version: 15 + + - name: Cache bigger downloads + uses: actions/cache@v2 + id: cache + with: + path: ${{ github.workspace }}/.cache + key: ${{ runner.os }}-${{ hashFiles('package.json', 'package-lock.json') }} + restore-keys: | + ${{ runner.os }}-${{ hashFiles('package.json', 'package-lock.json') }} + ${{ runner.os }}- + + - name: Install dependencies + run: npm ci --prefer-offline --no-audit --progress=false --cache ${{ github.workspace }}/.cache/npm + + - name: Fancy Typecheck with GH annotations + uses: gozala/typescript-error-reporter-action@v1.0.8 + with: + project: tsconfig.json + + # make sure local check is also ok + - name: Userland check + run: npm run typecheck + + # separate check for eslint + eslint: + name: eslint + needs: build + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v1 + + - name: Setup node + uses: actions/setup-node@v1 + with: + node-version: 15 + + - name: Cache bigger downloads + uses: actions/cache@v2 + id: cache + with: + path: ${{ github.workspace }}/.cache + key: ${{ runner.os }}-${{ hashFiles('package.json', 'package-lock.json') }} + restore-keys: | + ${{ runner.os }}-${{ hashFiles('package.json', 'package-lock.json') }} + ${{ runner.os }}- + + - name: Install dependencies + run: npm ci --prefer-offline --no-audit --progress=false --cache ${{ github.workspace }}/.cache/npm + + - name: ESLint + run: npm run eslint + diff --git a/.github/workflows/publish-release-build.yml b/.github/workflows/publish-release-build.yml new file mode 100644 index 000000000..5933edd77 --- /dev/null +++ b/.github/workflows/publish-release-build.yml @@ -0,0 +1,53 @@ +name: Publish Binaries + +on: + release: + types: + - published +env: + XDG_CACHE_HOME: ${{ github.workspace }}/.cache + +jobs: + build-and-deploy: + runs-on: ubuntu-latest + steps: + - name: Checkout 🛎️ + uses: actions/checkout@v2 + with: + persist-credentials: false + + - name: Cache bigger downloads + uses: actions/cache@v2 + id: cache + with: + path: ${{ github.workspace }}/.cache + key: ${{ runner.os }}-${{ hashFiles('package.json', 'package-lock.json') }} + restore-keys: | + ${{ runner.os }}-${{ hashFiles('package.json', 'package-lock.json') }} + ${{ runner.os }}- + + # Reuse tag build + - name: Cache build dir + uses: actions/cache@v2 + id: build-cache + with: + path: build + key: ${{ runner.os }}-${{ github.sha }} + restore-keys: | + ${{ runner.os }}-${{ github.sha }} + + - name: Install and Build 🔧 + if: steps.build-cache.outputs.cache-hit != 'true' + run: | + npm ci --prefer-offline --no-audit --progress=false --cache ${{ github.workspace }}/.cache/npm + npm run build + + - name: Create archive + run: tar -czf ipfs-webui.tar.gz build/* + + - name: Attach prebuilt archive to Release Notes + uses: skx/github-action-publish-binaries@c881a3f8ffb80b684f367660178d38ceabc065c2 #release-0.15 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + args: "./ipfs-webui.tar.gz" diff --git a/.github/workflows/publish_build.yml b/.github/workflows/publish_build.yml deleted file mode 100644 index acea1581b..000000000 --- a/.github/workflows/publish_build.yml +++ /dev/null @@ -1,28 +0,0 @@ -name: Publish Binaries - -on: - release: - types: - - published - -jobs: - build-and-deploy: - runs-on: ubuntu-latest - steps: - - name: Checkout 🛎️ - uses: actions/checkout@v2 - with: - persist-credentials: false - - - name: Install and Build 🔧 - run: | - npm ci - npm run build - tar -czf ipfs-webui.tar.gz build/* - - - name: Copy build-artifacts to Release - uses: skx/github-action-publish-binaries@release-0.14 - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - with: - args: "./ipfs-webui.tar.gz" diff --git a/.github/workflows/validate_change.yml b/.github/workflows/validate_change.yml deleted file mode 100644 index 38d58c4ed..000000000 --- a/.github/workflows/validate_change.yml +++ /dev/null @@ -1,23 +0,0 @@ -name: Validate Changes -on: - push: - branches: [master] - pull_request: - branches: [master] - -jobs: - validate: - runs-on: ubuntu-latest - steps: - - name: Checkout 🛎️ - uses: actions/checkout@v2 - with: - persist-credentials: false - - - name: Install 🔧 - run: | - npm install - - - name: Type Check 🔬 - run: | - npm run check \ No newline at end of file diff --git a/README.md b/README.md index 412184a66..bafd58a8d 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ | ![Screenshot of the file browser page](docs/screenshots/ipfs-webui-files.png) | ![Screenshot of the IPLD explorer page](docs/screenshots/ipfs-webui-explore.png) | ![Screenshot of the swarm peers map](docs/screenshots/ipfs-webui-peers.png) | ![Screenshot of the settings page](docs/screenshots/ipfs-webui-settings.png) | -[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg)](https://protocol.ai/) [![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg)](http://webchat.freenode.net/?channels=%23ipfs) [![dependencies Status](https://david-dm.org/ipfs/ipfs-webui/status.svg)](https://david-dm.org/ipfs/ipfs-webui) [![CircleCI](https://img.shields.io/circleci/project/github/ipfs/ipfs-webui/master.svg)](https://circleci.com/gh/ipfs/ipfs-webui) +[![](https://img.shields.io/badge/made%20by-Protocol%20Labs-blue.svg)](https://protocol.ai/) [![](https://img.shields.io/badge/freenode-%23ipfs-blue.svg)](http://webchat.freenode.net/?channels=%23ipfs) [![dependencies Status](https://david-dm.org/ipfs/ipfs-webui/status.svg)](https://david-dm.org/ipfs/ipfs-webui) The IPFS WebUI is a **work-in-progress**. Help us make it better! We use the issues on this repo to track the work. diff --git a/cors-config.sh b/cors-config.sh index 04eec20ef..cbc1bc7a4 100755 --- a/cors-config.sh +++ b/cors-config.sh @@ -1,6 +1,6 @@ #!/bin/bash -ALLOW_ORIGINS='"http://localhost:3000", "https://webui.ipfs.io"' +ALLOW_ORIGINS='"http://localhost:3000", "https://webui.ipfs.io", "https://dev.webui.ipfs.io"' # stop executing if anything fails set -e diff --git a/package-lock.json b/package-lock.json index 62d5815b6..11ce0e7e7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8428,6 +8428,12 @@ "integrity": "sha1-uveeYubvTCpMC4MSMtr/7CUfnYM=", "dev": true }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, "array-flatten": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-2.1.2.tgz", @@ -10638,6 +10644,25 @@ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, + "camelcase-keys": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-4.2.0.tgz", + "integrity": "sha1-oqpfsa9oh1glnDLBQUJteJI7m3c=", + "dev": true, + "requires": { + "camelcase": "^4.1.0", + "map-obj": "^2.0.0", + "quick-lru": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, "can-use-dom": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/can-use-dom/-/can-use-dom-0.1.0.tgz", @@ -12569,6 +12594,15 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.0.2.tgz", "integrity": "sha512-ofovWglpqoqbfLNOTBNZLSbMuGrblAf1efvvArGKOZMBrIoJeu5UsAipQolkijtyQx5MtAzT/J9IHj/CEY1mJw==" }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "^1.0.1" + } + }, "cwd": { "version": "0.10.0", "resolved": "https://registry.npmjs.org/cwd/-/cwd-0.10.0.tgz", @@ -13139,6 +13173,24 @@ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" }, + "decamelize-keys": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/decamelize-keys/-/decamelize-keys-1.1.0.tgz", + "integrity": "sha1-0XGoeTMlKAfrPLYdwcFEXQeN8tk=", + "dev": true, + "requires": { + "decamelize": "^1.1.0", + "map-obj": "^1.0.0" + }, + "dependencies": { + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + } + } + }, "decimal.js": { "version": "10.2.1", "resolved": "https://registry.npmjs.org/decimal.js/-/decimal.js-10.2.1.tgz", @@ -13666,6 +13718,22 @@ "buffer-indexof": "^1.0.0" } }, + "dnsimple": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/dnsimple/-/dnsimple-3.0.3.tgz", + "integrity": "sha512-6Jpc7KmCzPL4wPQopmXXpcPTpPqFybEYxwbcrXLkJAgSwCGHltuDohqCxwsg5iDgPsRrWeyPeLDVrjztv6OwXQ==", + "dev": true + }, + "dnslink-dnsimple": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dnslink-dnsimple/-/dnslink-dnsimple-1.0.1.tgz", + "integrity": "sha512-6AgxqL3u/09zxm6SP29JBzFNRt/wqIHDaqsbDpO1WgCvXkV7yo4PnyvkB6MogTJqHen81ikb/P8uLSY1cY63sw==", + "dev": true, + "requires": { + "dnsimple": "^3.0.1", + "meow": "^5.0.0" + } + }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", @@ -28994,6 +29062,16 @@ "js-tokens": "^3.0.0 || ^4.0.0" } }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "^0.4.1", + "signal-exit": "^3.0.0" + } + }, "lower-case": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz", @@ -29103,6 +29181,12 @@ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=" }, + "map-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-2.0.0.tgz", + "integrity": "sha1-plzSkIepJZi4eRJXpSPgISIqwfk=", + "dev": true + }, "map-or-similar": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/map-or-similar/-/map-or-similar-1.5.0.tgz", @@ -29274,6 +29358,40 @@ } } }, + "meow": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-5.0.0.tgz", + "integrity": "sha512-CbTqYU17ABaLefO8vCU153ZZlprKYWDljcndKKDCFcYQITzWCXZAVk4QMFZPgvzrnUQ3uItnIE/LoUOwrT15Ig==", + "dev": true, + "requires": { + "camelcase-keys": "^4.0.0", + "decamelize-keys": "^1.0.0", + "loud-rejection": "^1.0.0", + "minimist-options": "^3.0.1", + "normalize-package-data": "^2.3.4", + "read-pkg-up": "^3.0.0", + "redent": "^2.0.0", + "trim-newlines": "^2.0.0", + "yargs-parser": "^10.0.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "yargs-parser": { + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", + "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "dev": true, + "requires": { + "camelcase": "^4.1.0" + } + } + } + }, "merge-deep": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/merge-deep/-/merge-deep-3.0.3.tgz", @@ -29550,6 +29668,24 @@ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" }, + "minimist-options": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/minimist-options/-/minimist-options-3.0.2.tgz", + "integrity": "sha512-FyBrT/d0d4+uiZRbqznPXqw3IpZZG3gl3wKWiX784FycUKVwBt0uLBFkQrtE4tZOrgo78nZp2jnKz3L65T5LdQ==", + "dev": true, + "requires": { + "arrify": "^1.0.1", + "is-plain-obj": "^1.1.0" + }, + "dependencies": { + "is-plain-obj": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz", + "integrity": "sha1-caUMhCnfync8kqOQpKA7OfzVHT4=", + "dev": true + } + } + }, "minipass": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/minipass/-/minipass-3.1.3.tgz", @@ -33233,6 +33369,12 @@ "integrity": "sha512-HNPqtTHgal9dBpJxibFGgOEmlaTbwEbplrR+oOiWp9aNFlFKBYfkbvvF8VrJPK65okrZuGOwHKLfe7/gT6NWuw==", "dev": true }, + "quick-lru": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/quick-lru/-/quick-lru-1.1.0.tgz", + "integrity": "sha1-Q2CxfGETatOAeDl/8RQW4Ybc+7g=", + "dev": true + }, "rabin-wasm": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/rabin-wasm/-/rabin-wasm-0.1.4.tgz", @@ -35161,6 +35303,61 @@ "path-type": "^3.0.0" } }, + "read-pkg-up": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-3.0.0.tgz", + "integrity": "sha1-PtSWaF26D4/hGNBpHcUfSh/5bwc=", + "dev": true, + "requires": { + "find-up": "^2.0.0", + "read-pkg": "^3.0.0" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "^2.0.0" + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "^2.0.0", + "path-exists": "^3.0.0" + } + }, + "p-limit": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", + "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", + "dev": true, + "requires": { + "p-try": "^1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "^1.1.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + } + } + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -35264,6 +35461,30 @@ "minimatch": "3.0.4" } }, + "redent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-2.0.0.tgz", + "integrity": "sha1-wbIAe0LVfrE4kHmzyDM2OdXhzKo=", + "dev": true, + "requires": { + "indent-string": "^3.0.0", + "strip-indent": "^2.0.0" + }, + "dependencies": { + "indent-string": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-3.2.0.tgz", + "integrity": "sha1-Sl/W0nzDMvN+VBmlBNu4NxBckok=", + "dev": true + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=", + "dev": true + } + } + }, "redux": { "version": "4.0.5", "resolved": "https://registry.npmjs.org/redux/-/redux-4.0.5.tgz", @@ -38402,6 +38623,12 @@ "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", "dev": true }, + "trim-newlines": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-2.0.0.tgz", + "integrity": "sha1-tAPQuRvlDDMd/EuC7s6yLD3hbSA=", + "dev": true + }, "truncate-utf8-bytes": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/truncate-utf8-bytes/-/truncate-utf8-bytes-1.0.2.tgz", diff --git a/package.json b/package.json index e1a44f10e..5d721d54a 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,8 @@ "start": "run-script-os", "start:win32": "@powershell -Command $env:REACT_APP_GIT_REV=(git rev-parse --short HEAD); react-scripts start", "start:darwin:linux": "cross-env REACT_APP_GIT_REV=`git rev-parse --short HEAD` react-scripts start", - "lint": "eslint src/ test/ && tsc --noEmit", + "lint": "run-s eslint typecheck", + "eslint": "eslint src/ test/", "prebuild": "lol public/locales > src/lib/languages.json", "build": "run-script-os", "build:win32": "@powershell -Command $env:REACT_APP_GIT_REV=(git rev-parse --short HEAD); react-scripts build", @@ -23,7 +24,7 @@ "eject": "react-scripts eject", "storybook": "start-storybook -p 9009 -s public", "build-storybook": "build-storybook -s public", - "check": "tsc --noEmit" + "typecheck": "tsc --noEmit" }, "dependencies": { "@loadable/component": "^5.14.1", @@ -116,6 +117,7 @@ "big.js": "^5.2.2", "bundlesize": "0.18.1", "cross-env": "^6.0.3", + "dnslink-dnsimple": "1.0.1", "enzyme": "^3.11.0", "enzyme-adapter-react-16": "^1.15.2", "eslint-config-standard": "^14.1.1",