diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 00000000..3a4df851 --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,36 @@ + diff --git a/.github/workflows/data-validate.yml b/.github/workflows/data-validate.yml index 94a21ac1..9b312fcd 100644 --- a/.github/workflows/data-validate.yml +++ b/.github/workflows/data-validate.yml @@ -15,11 +15,17 @@ jobs: - uses: actions/setup-node@v1 with: node-version: 13.x - - name: Install validation libs - run: | - npm install -g @hapi/joi@17.0.2 - npm install -g @actions/core@1.2.0 - npm link @hapi/joi - npm link @actions/core + + - name: Cache/Restore node modules + uses: actions/cache@v1 + with: + path: ~/.npm # npm cache files are stored in `~/.npm` on Linux/macOS + key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json') }} + + - name: Install Dependencies + run: npm install + - name: Validate data.js - run: node ./scripts/data-validate.js \ No newline at end of file + run: node ./scripts/data-validate.js + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/.github/workflows/populate-readme.yml b/.github/workflows/populate-readme.yml index 2138c9cf..f9885179 100644 --- a/.github/workflows/populate-readme.yml +++ b/.github/workflows/populate-readme.yml @@ -1,4 +1,4 @@ -name: Populate README.md from master +name: Populate readme.md from master and lint src/data.js on: push: @@ -18,14 +18,33 @@ jobs: - uses: actions/setup-node@v1 with: node-version: 13.x - - name: Populate README.md from master + + - name: Cache/Restore node modules + uses: actions/cache@v1 + with: + path: ~/.npm # npm cache files are stored in `~/.npm` on Linux/macOS + key: ${{ runner.os }}-npm-${{ hashFiles('package-lock.json') }} + + - name: Install Dependencies + run: npm install + + - name: Lint src/data.js + run: | + npx eslint --fix src/data.js + git add src/data.js + + - name: Populate readme.md from master run: | node ./scripts/populate-readme.js mv generated-readme.md readme.md git add readme.md git config --local user.email "action@github.com" git config --local user.name "GitHub Action" - git commit -m "chore: generate \`readme.md\`" + # commit only if any changes + if [ ! -z "$(git status --porcelain)" ]; then + git commit -m "chore: generate \`readme.md\`, lint \`src/data.js\`" + fi + - name: Push changes uses: ad-m/github-push-action@master with: diff --git a/.gitignore b/.gitignore index ca0c5240..a93d3658 100644 --- a/.gitignore +++ b/.gitignore @@ -61,6 +61,9 @@ public # Mac files .DS_Store +# VS Code workspace settings +.vscode/ + # Yarn yarn-error.log .pnp/ @@ -69,3 +72,5 @@ yarn-error.log .yarn-integrity haters/ + +.idea/ diff --git a/gatsby-config.js b/gatsby-config.js index ef46ca29..943f2476 100644 --- a/gatsby-config.js +++ b/gatsby-config.js @@ -3,7 +3,7 @@ module.exports = { title: `/uses`, description: `A list of /uses pages detailing developer setups.`, author: `@wesbos`, - siteUrl: "https://uses.tech", + siteUrl: 'https://uses.tech', }, plugins: [ { diff --git a/gatsby-node.js b/gatsby-node.js index f28b49d8..8f64c729 100644 --- a/gatsby-node.js +++ b/gatsby-node.js @@ -56,7 +56,6 @@ function sourceNodes({ actions, createNodeId, createContentDigest }) { }); // Add Devices to GraphQL API - console.log(devices()); devices().forEach(device => { const nodeMeta = { id: createNodeId(`device-${device.name}`), diff --git a/package-lock.json b/package-lock.json index 2597f450..00544d33 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5,9 +5,31 @@ "requires": true, "dependencies": { "@actions/core": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.0.tgz", - "integrity": "sha512-ZKdyhlSlyz38S6YFfPnyNgCDZuAF2T0Qv5eHflNWytPS8Qjvz39bZFMry9Bb/dpSnqWcNeav5yM2CTYpJeY+Dw==" + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@actions/core/-/core-1.2.1.tgz", + "integrity": "sha512-xD+CQd9p4lU7ZfRqmUcbJpqR+Ss51rJRVeXMyOLrZQImN9/8Sy/BEUBnHO/UKD3z03R686PVTLfEPmkropGuLw==" + }, + "@actions/exec": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@actions/exec/-/exec-1.0.3.tgz", + "integrity": "sha512-TogJGnueOmM7ntCi0ASTUj4LapRRtDfj57Ja4IhPmg2fls28uVOPbAn8N+JifaOumN2UG3oEO/Ixek2A4NcYSA==", + "requires": { + "@actions/io": "^1.0.1" + } + }, + "@actions/github": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@actions/github/-/github-2.0.1.tgz", + "integrity": "sha512-C7dAsCkpPi1HxTzLldz+oY+9c5G+nnaK7xgk8KA83VVGlrGK7d603E3snUAFocWrqEu/uvdYD82ytggjcpYSQA==", + "requires": { + "@octokit/graphql": "^4.3.1", + "@octokit/rest": "^16.15.0" + } + }, + "@actions/io": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@actions/io/-/io-1.0.2.tgz", + "integrity": "sha512-J8KuFqVPr3p6U8W93DOXlXW6zFvrQAJANdS+vw0YhusLIq+bszW8zmK2Fh1C2kDPX8FMvwIl1OUcFgvJoXLbAg==" }, "@babel/code-frame": { "version": "7.5.5", @@ -1321,6 +1343,113 @@ "fastq": "^1.6.0" } }, + "@octokit/endpoint": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/@octokit/endpoint/-/endpoint-5.5.1.tgz", + "integrity": "sha512-nBFhRUb5YzVTCX/iAK1MgQ4uWo89Gu0TH00qQHoYRCsE12dWcG1OiLd7v2EIo2+tpUKPMOQ62QFy9hy9Vg2ULg==", + "requires": { + "@octokit/types": "^2.0.0", + "is-plain-object": "^3.0.0", + "universal-user-agent": "^4.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", + "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", + "requires": { + "isobject": "^4.0.0" + } + }, + "isobject": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==" + } + } + }, + "@octokit/graphql": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/@octokit/graphql/-/graphql-4.3.1.tgz", + "integrity": "sha512-hCdTjfvrK+ilU2keAdqNBWOk+gm1kai1ZcdjRfB30oA3/T6n53UVJb7w0L5cR3/rhU91xT3HSqCd+qbvH06yxA==", + "requires": { + "@octokit/request": "^5.3.0", + "@octokit/types": "^2.0.0", + "universal-user-agent": "^4.0.0" + } + }, + "@octokit/request": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/@octokit/request/-/request-5.3.1.tgz", + "integrity": "sha512-5/X0AL1ZgoU32fAepTfEoggFinO3rxsMLtzhlUX+RctLrusn/CApJuGFCd0v7GMFhF+8UiCsTTfsu7Fh1HnEJg==", + "requires": { + "@octokit/endpoint": "^5.5.0", + "@octokit/request-error": "^1.0.1", + "@octokit/types": "^2.0.0", + "deprecation": "^2.0.0", + "is-plain-object": "^3.0.0", + "node-fetch": "^2.3.0", + "once": "^1.4.0", + "universal-user-agent": "^4.0.0" + }, + "dependencies": { + "is-plain-object": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.0.tgz", + "integrity": "sha512-tZIpofR+P05k8Aocp7UI/2UTa9lTJSebCXpFFoR9aibpokDj/uXBsJ8luUu0tTVYKkMU6URDUuOfJZ7koewXvg==", + "requires": { + "isobject": "^4.0.0" + } + }, + "isobject": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-4.0.0.tgz", + "integrity": "sha512-S/2fF5wH8SJA/kmwr6HYhK/RI/OkhD84k8ntalo0iJjZikgq1XFvR5M8NPT1x5F7fBwCG3qHfnzeP/Vh/ZxCUA==" + }, + "node-fetch": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz", + "integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA==" + } + } + }, + "@octokit/request-error": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@octokit/request-error/-/request-error-1.2.0.tgz", + "integrity": "sha512-DNBhROBYjjV/I9n7A8kVkmQNkqFAMem90dSxqvPq57e2hBr7mNTX98y3R2zDpqMQHVRpBDjsvsfIGgBzy+4PAg==", + "requires": { + "@octokit/types": "^2.0.0", + "deprecation": "^2.0.0", + "once": "^1.4.0" + } + }, + "@octokit/rest": { + "version": "16.37.0", + "resolved": "https://registry.npmjs.org/@octokit/rest/-/rest-16.37.0.tgz", + "integrity": "sha512-qLPK9FOCK4iVpn6ghknNuv/gDDxXQG6+JBQvoCwWjQESyis9uemakjzN36nvvp8SCny7JuzHI2RV8ChbV5mYdQ==", + "requires": { + "@octokit/request": "^5.2.0", + "@octokit/request-error": "^1.0.2", + "atob-lite": "^2.0.0", + "before-after-hook": "^2.0.0", + "btoa-lite": "^1.0.0", + "deprecation": "^2.0.0", + "lodash.get": "^4.4.2", + "lodash.set": "^4.3.2", + "lodash.uniq": "^4.5.0", + "octokit-pagination-methods": "^1.1.0", + "once": "^1.4.0", + "universal-user-agent": "^4.0.0" + } + }, + "@octokit/types": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@octokit/types/-/types-2.1.0.tgz", + "integrity": "sha512-n1GUYFgKm5glcy0E+U5jnqAFY2p04rnK4A0YhuM70C7Vm9Vyx+xYwd/WOTEr8nUJcbPSR/XL+/26+rirY6jJQA==", + "requires": { + "@types/node": ">= 8" + } + }, "@pieh/friendly-errors-webpack-plugin": { "version": "1.7.0-chalk-2", "resolved": "https://registry.npmjs.org/@pieh/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.0-chalk-2.tgz", @@ -1344,6 +1473,15 @@ "warning": "^3.0.0" } }, + "@samverschueren/stream-to-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@samverschueren/stream-to-observable/-/stream-to-observable-0.3.0.tgz", + "integrity": "sha512-MI4Xx6LHs4Webyvi6EbspgyAb4D2Q2VtnCQ1blOJcoLS6mVa8lNN2rkIy1CVxfTUpoyIbCTkXES1rLXztFD1lg==", + "dev": true, + "requires": { + "any-observable": "^0.3.0" + } + }, "@sindresorhus/is": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/@sindresorhus/is/-/is-0.14.0.tgz", @@ -1824,6 +1962,12 @@ "resolved": "https://registry.npmjs.org/any-base/-/any-base-1.1.0.tgz", "integrity": "sha512-uMgjozySS8adZZYePpaWs8cxB9/kdzmpX6SgJZ+wbz1K5eYk5QMYDVJaZKhxyIHUdnnJkfR7SVgStgH7LkGUyg==" }, + "any-observable": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/any-observable/-/any-observable-0.3.0.tgz", + "integrity": "sha512-/FQM1EDkTsf63Ub2C6O7GuYFDsSXUwsaZDurV0np41ocwq0jthUAYCmhBX9f+KwlaCgIuWyr/4WlUQUBfKfZog==", + "dev": true + }, "any-promise": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", @@ -2066,6 +2210,11 @@ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz", "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, + "atob-lite": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/atob-lite/-/atob-lite-2.0.0.tgz", + "integrity": "sha1-D+9a1G8b16hQLGVyfwNn1e5D1pY=" + }, "auto-bind": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/auto-bind/-/auto-bind-3.0.0.tgz", @@ -2437,6 +2586,11 @@ "tweetnacl": "^0.14.3" } }, + "before-after-hook": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/before-after-hook/-/before-after-hook-2.1.0.tgz", + "integrity": "sha512-IWIbu7pMqyw3EAJHzzHbWa85b6oud/yfKYg5rqB5hNE8CeMi3nX+2C2sj0HswfblST86hpVEOAb9x34NZd6P7A==" + }, "better-assert": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", @@ -3013,6 +3167,11 @@ "electron-to-chromium": "^1.3.47" } }, + "btoa-lite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/btoa-lite/-/btoa-lite-1.0.0.tgz", + "integrity": "sha1-M3dm2hWAEhD92VbCLpxokaudAzc=" + }, "buffer": { "version": "4.9.2", "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz", @@ -4484,6 +4643,12 @@ "assert-plus": "^1.0.0" } }, + "date-fns": { + "version": "1.30.1", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-1.30.1.tgz", + "integrity": "sha512-hBSVCvSmWC+QypYObzwGOd9wqdDpOt+0wl0KbU+R+uuZBS1jN8VsD1ss3irQDknRj5NvxiTF6oj/nDRnN/UQNw==", + "dev": true + }, "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", @@ -4655,6 +4820,12 @@ } } }, + "dedent": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/dedent/-/dedent-0.7.0.tgz", + "integrity": "sha1-JJXduvbrh0q7Dhvp3yLS5aVEMmw=", + "dev": true + }, "deep-equal": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/deep-equal/-/deep-equal-1.1.1.tgz", @@ -4788,6 +4959,11 @@ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" }, + "deprecation": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/deprecation/-/deprecation-2.3.1.tgz", + "integrity": "sha512-xmHIy4F3scKVwMsQ4WnVaS8bHOx0DmVwRywosKhaILI0ywMDWPtBSku2HNxRvF7jtwDRsoEwYQSfbxj8b7RlJQ==" + }, "des.js": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz", @@ -5149,6 +5325,12 @@ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.328.tgz", "integrity": "sha512-x4XefnFxDxFwaQ01d/pppJP9meWhOIJ/gtI6/4jqkpsadq79uL7NYSaX64naLmJqvzUBjSrO3IM2+1b/W9KdPg==" }, + "elegant-spinner": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/elegant-spinner/-/elegant-spinner-1.0.1.tgz", + "integrity": "sha1-2wQ1IcldfjA/2PNFvtwzSc+wcp4=", + "dev": true + }, "elliptic": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz", @@ -8959,6 +9141,117 @@ "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz", "integrity": "sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==" }, + "husky": { + "version": "4.0.10", + "resolved": "https://registry.npmjs.org/husky/-/husky-4.0.10.tgz", + "integrity": "sha512-Ptm4k2DqOwxeK/kzu5RaJmNRoGvESrgDXObFcZ8aJZcyXyMBHhM2FqZj6zYKdetadmP3wCwxEHCBuB9xGlRp8A==", + "dev": true, + "requires": { + "chalk": "^3.0.0", + "ci-info": "^2.0.0", + "cosmiconfig": "^6.0.0", + "opencollective-postinstall": "^2.0.2", + "pkg-dir": "^4.2.0", + "please-upgrade-node": "^3.2.0", + "slash": "^3.0.0", + "which-pm-runs": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.2.1.tgz", + "integrity": "sha512-9VGjrMsG1vePxcSweQsN20KY/c4zN0h9fLjqAbwbPfahM3t+NL+M9HC8xeXG2I8pX5NoamTGNuomEUFI7fcUjA==", + "dev": true, + "requires": { + "@types/color-name": "^1.1.1", + "color-convert": "^2.0.1" + } + }, + "chalk": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-3.0.0.tgz", + "integrity": "sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==", + "dev": true, + "requires": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + } + }, + "color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "requires": { + "color-name": "~1.1.4" + } + }, + "color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dev": true, + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dev": true, + "requires": { + "p-locate": "^4.1.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dev": true, + "requires": { + "p-limit": "^2.2.0" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true + }, + "pkg-dir": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", + "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", + "dev": true, + "requires": { + "find-up": "^4.0.0" + } + }, + "supports-color": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.1.0.tgz", + "integrity": "sha512-oRSIpR8pxT1Wr2FquTNnGet79b3BWljqOuoW/h4oBhxJ/HUbX5nX6JSruTkvXDCFMwDPvsaTTbvMLKZWSy0R5g==", + "dev": true, + "requires": { + "has-flag": "^4.0.0" + } + } + } + }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -9851,6 +10144,15 @@ "resolved": "https://registry.npmjs.org/is-object/-/is-object-1.0.1.tgz", "integrity": "sha1-iVJojF7C/9awPsyF52ngKQMINHA=" }, + "is-observable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-observable/-/is-observable-1.1.0.tgz", + "integrity": "sha512-NqCa4Sa2d+u7BWc6CukaObG3Fh+CU9bvixbpcXYhy2VvYS7vVGIdAgnIS5Ks3A/cqk4rebLJ9s8zBstT2aKnIA==", + "dev": true, + "requires": { + "symbol-observable": "^1.1.0" + } + }, "is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -10277,6 +10579,494 @@ "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.1.6.tgz", "integrity": "sha1-HADHQ7QzzQpOgHWPe2SldEDZ/wA=" }, + "lint-staged": { + "version": "9.5.0", + "resolved": "https://registry.npmjs.org/lint-staged/-/lint-staged-9.5.0.tgz", + "integrity": "sha512-nawMob9cb/G1J98nb8v3VC/E8rcX1rryUYXVZ69aT9kde6YWX+uvNOEHY5yf2gcWcTJGiD0kqXmCnS3oD75GIA==", + "dev": true, + "requires": { + "chalk": "^2.4.2", + "commander": "^2.20.0", + "cosmiconfig": "^5.2.1", + "debug": "^4.1.1", + "dedent": "^0.7.0", + "del": "^5.0.0", + "execa": "^2.0.3", + "listr": "^0.14.3", + "log-symbols": "^3.0.0", + "micromatch": "^4.0.2", + "normalize-path": "^3.0.0", + "please-upgrade-node": "^3.1.1", + "string-argv": "^0.3.0", + "stringify-object": "^3.3.0" + }, + "dependencies": { + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "cosmiconfig": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz", + "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==", + "dev": true, + "requires": { + "import-fresh": "^2.0.0", + "is-directory": "^0.3.1", + "js-yaml": "^3.13.1", + "parse-json": "^4.0.0" + } + }, + "cross-spawn": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.1.tgz", + "integrity": "sha512-u7v4o84SwFpD32Z8IIcPZ6z1/ie24O6RU3RbtL5Y316l3KuHVPx9ItBgWQ6VlfAFnRnTtMUrsQ9MUUTuEZjogg==", + "dev": true, + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "dev": true, + "requires": { + "ms": "^2.1.1" + } + }, + "execa": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-2.1.0.tgz", + "integrity": "sha512-Y/URAVapfbYy2Xp/gb6A0E7iR8xeqOCXsuuaoMn7A5PzrXUK84E1gyiEfq0wQd/GHA6GsoHWwhNq8anb0mleIw==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.0", + "get-stream": "^5.0.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^3.0.0", + "onetime": "^5.1.0", + "p-finally": "^2.0.0", + "signal-exit": "^3.0.2", + "strip-final-newline": "^2.0.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "get-stream": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.1.0.tgz", + "integrity": "sha512-EXr1FOzrzTfGeL0gQdeFEvOMm2mzMOglyiOXSTpPC+iAjAKftbr3jpCMWynogwYnM+eSj9sHGc6wjIcDvYiygw==", + "dev": true, + "requires": { + "pump": "^3.0.0" + } + }, + "import-fresh": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz", + "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=", + "dev": true, + "requires": { + "caller-path": "^2.0.0", + "resolve-from": "^3.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true + }, + "is-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz", + "integrity": "sha512-XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==", + "dev": true + }, + "micromatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.2.tgz", + "integrity": "sha512-y7FpHSbMUMoyPbYUSzO6PaZ6FyRnQOpHuKwbo1G+Knck95XVU4QAiKdGEnj5wwoS7PlOgthX/09u5iFJ+aYf5Q==", + "dev": true, + "requires": { + "braces": "^3.0.1", + "picomatch": "^2.0.5" + } + }, + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true + }, + "npm-run-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-3.1.0.tgz", + "integrity": "sha512-Dbl4A/VfiVGLgQv29URL9xshU8XDY1GeLy+fsaZ1AA8JDSfjvr5P5+pzRbWqRSBxk6/DW7MIh8lTM/PaGnP2kg==", + "dev": true, + "requires": { + "path-key": "^3.0.0" + } + }, + "p-finally": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-2.0.1.tgz", + "integrity": "sha512-vpm09aKwq6H9phqRQzecoDpD8TmVyGw70qmWlyq5onxY7tqyTTFVvxMykxQSQKILBSFlbXpypIw2T1Ml7+DDtw==", + "dev": true + }, + "parse-json": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz", + "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=", + "dev": true, + "requires": { + "error-ex": "^1.3.1", + "json-parse-better-errors": "^1.0.1" + } + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "dev": true + }, + "resolve-from": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz", + "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=", + "dev": true + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dev": true, + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "dev": true + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "requires": { + "is-number": "^7.0.0" + } + }, + "which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } + } + }, + "listr": { + "version": "0.14.3", + "resolved": "https://registry.npmjs.org/listr/-/listr-0.14.3.tgz", + "integrity": "sha512-RmAl7su35BFd/xoMamRjpIE4j3v+L28o8CT5YhAXQJm1fD+1l9ngXY8JAQRJ+tFK2i5njvi0iRUKV09vPwA0iA==", + "dev": true, + "requires": { + "@samverschueren/stream-to-observable": "^0.3.0", + "is-observable": "^1.1.0", + "is-promise": "^2.1.0", + "is-stream": "^1.1.0", + "listr-silent-renderer": "^1.1.1", + "listr-update-renderer": "^0.5.0", + "listr-verbose-renderer": "^0.5.0", + "p-map": "^2.0.0", + "rxjs": "^6.3.3" + }, + "dependencies": { + "p-map": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", + "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", + "dev": true + } + } + }, + "listr-silent-renderer": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/listr-silent-renderer/-/listr-silent-renderer-1.1.1.tgz", + "integrity": "sha1-kktaN1cVN3C/Go4/v3S4u/P5JC4=", + "dev": true + }, + "listr-update-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-update-renderer/-/listr-update-renderer-0.5.0.tgz", + "integrity": "sha512-tKRsZpKz8GSGqoI/+caPmfrypiaq+OQCbd+CovEC24uk1h952lVj5sC7SqyFUm+OaJ5HN/a1YLt5cit2FMNsFA==", + "dev": true, + "requires": { + "chalk": "^1.1.3", + "cli-truncate": "^0.2.1", + "elegant-spinner": "^1.0.1", + "figures": "^1.7.0", + "indent-string": "^3.0.0", + "log-symbols": "^1.0.2", + "log-update": "^2.3.0", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", + "dev": true + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "dev": true, + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "cli-truncate": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/cli-truncate/-/cli-truncate-0.2.1.tgz", + "integrity": "sha1-nxXPuwcFAFNpIWxiasfQWrkN1XQ=", + "dev": true, + "requires": { + "slice-ansi": "0.0.4", + "string-width": "^1.0.1" + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5", + "object-assign": "^4.1.0" + } + }, + "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 + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "log-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-1.0.2.tgz", + "integrity": "sha1-N2/3tY6jCGoPCfrMdGF+ylAeGhg=", + "dev": true, + "requires": { + "chalk": "^1.0.0" + } + }, + "log-update": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/log-update/-/log-update-2.3.0.tgz", + "integrity": "sha1-iDKP19HOeTiykoN0bwsbwSayRwg=", + "dev": true, + "requires": { + "ansi-escapes": "^3.0.0", + "cli-cursor": "^2.0.0", + "wrap-ansi": "^3.0.1" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + }, + "slice-ansi": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-0.0.4.tgz", + "integrity": "sha1-7b+JA/ZvfOL46v1s7tZeJkyDGzU=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "dev": true + }, + "wrap-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-3.0.1.tgz", + "integrity": "sha1-KIoE2H7aXChuBg3+jxNc6NAH+Lo=", + "dev": true, + "requires": { + "string-width": "^2.1.1", + "strip-ansi": "^4.0.0" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^4.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "^3.0.0" + } + } + } + } + } + }, + "listr-verbose-renderer": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/listr-verbose-renderer/-/listr-verbose-renderer-0.5.0.tgz", + "integrity": "sha512-04PDPqSlsqIOaaaGZ+41vq5FejI9auqTInicFRndCBgE3bXG8D6W1I+mWhk+1nqbHmyhla/6BUrd5OSiHwKRXw==", + "dev": true, + "requires": { + "chalk": "^2.4.1", + "cli-cursor": "^2.1.0", + "date-fns": "^1.27.2", + "figures": "^2.0.0" + }, + "dependencies": { + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "dev": true, + "requires": { + "restore-cursor": "^2.0.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "dev": true, + "requires": { + "escape-string-regexp": "^1.0.5" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", + "dev": true + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "dev": true, + "requires": { + "mimic-fn": "^1.0.0" + } + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "dev": true, + "requires": { + "onetime": "^2.0.0", + "signal-exit": "^3.0.2" + } + } + } + }, "load-bmfont": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/load-bmfont/-/load-bmfont-1.4.0.tgz", @@ -10438,6 +11228,11 @@ "resolved": "https://registry.npmjs.org/lodash.foreach/-/lodash.foreach-4.5.0.tgz", "integrity": "sha1-Gmo16s5AEoDH8G3d7DUWWrJ+PlM=" }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=" + }, "lodash.map": { "version": "4.6.0", "resolved": "https://registry.npmjs.org/lodash.map/-/lodash.map-4.6.0.tgz", @@ -10453,6 +11248,11 @@ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=" }, + "lodash.set": { + "version": "4.3.2", + "resolved": "https://registry.npmjs.org/lodash.set/-/lodash.set-4.3.2.tgz", + "integrity": "sha1-2HV7HagH3eJIFrDWqEvqGnYjCyM=" + }, "lodash.template": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.5.0.tgz", @@ -10491,6 +11291,15 @@ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=" }, + "log-symbols": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-3.0.0.tgz", + "integrity": "sha512-dSkNGuI7iG3mfvDzUuYZyvk5dD9ocYCYzNU6CYDE6+Xqd+gwme6Z00NS3dUh8mq/73HaEtT7m6W+yUPtU6BZnQ==", + "dev": true, + "requires": { + "chalk": "^2.4.2" + } + }, "log-update": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/log-update/-/log-update-3.3.0.tgz", @@ -10631,6 +11440,11 @@ "yallist": "^2.0.0" } }, + "macos-release": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/macos-release/-/macos-release-2.3.0.tgz", + "integrity": "sha512-OHhSbtcviqMPt7yfw5ef5aghS2jzFVKEFyCJndQt2YpSQ9qRVSEv2axSJI1paVThEu+FFGs584h/1YhxjVqajA==" + }, "make-dir": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz", @@ -11596,6 +12410,11 @@ "resolved": "https://registry.npmjs.org/obuf/-/obuf-1.1.2.tgz", "integrity": "sha512-PX1wu0AmAdPqOL1mWhqmlOd8kOIZQwGZw6rh7uby9fTc5lhaOWFLX3I6R1hrF9k3zUY40e6igsLGkDXK92LJNg==" }, + "octokit-pagination-methods": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/octokit-pagination-methods/-/octokit-pagination-methods-1.1.0.tgz", + "integrity": "sha512-fZ4qZdQ2nxJvtcasX7Ghl+WlWS/d9IgnBIwFZXVNNZUmzpno91SX5bc5vuxiuKoCtK78XxGGNuSCrDC7xYB3OQ==" + }, "omggif": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/omggif/-/omggif-1.0.10.tgz", @@ -11645,6 +12464,12 @@ } } }, + "opencollective-postinstall": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/opencollective-postinstall/-/opencollective-postinstall-2.0.2.tgz", + "integrity": "sha512-pVOEP16TrAO2/fjej1IdOyupJY8KDUM1CvsaScRbw6oddvpQoOfGk4ywha0HKKVAD6RkW4x6Q+tNBwhf3Bgpuw==", + "dev": true + }, "opentracing": { "version": "0.14.4", "resolved": "https://registry.npmjs.org/opentracing/-/opentracing-0.14.4.tgz", @@ -11734,6 +12559,15 @@ } } }, + "os-name": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/os-name/-/os-name-3.1.0.tgz", + "integrity": "sha512-h8L+8aNjNcMpo/mAIBPn5PXCM16iyPGjHNWo6U1YO8sJTMHtEtyczI6QJnLoplswm6goopQkqc7OAnjhWcugVg==", + "requires": { + "macos-release": "^2.2.0", + "windows-release": "^3.1.0" + } + }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", @@ -12122,6 +12956,15 @@ "find-up": "^3.0.0" } }, + "please-upgrade-node": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/please-upgrade-node/-/please-upgrade-node-3.2.0.tgz", + "integrity": "sha512-gQR3WpIgNIKwBMVLkpMUeR3e1/E1y42bqDQZfql+kDeXd8COYfM8PQA4X6y7a8u9Ua9FHmsrrmirW2vHs45hWg==", + "dev": true, + "requires": { + "semver-compare": "^1.0.0" + } + }, "pngjs": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/pngjs/-/pngjs-3.4.0.tgz", @@ -14136,6 +14979,12 @@ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" }, + "semver-compare": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", + "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=", + "dev": true + }, "semver-diff": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", @@ -15068,6 +15917,12 @@ "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" }, + "string-argv": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/string-argv/-/string-argv-0.3.1.tgz", + "integrity": "sha512-a1uQGz7IyVy9YwhqjZIZu1c8JO8dNIe20xBmSS6qu9kv++k3JGzCVmprbNN5Kn+BgzD5E7YYwg1CcjuJMRNsvg==", + "dev": true + }, "string-length": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-length/-/string-length-3.1.0.tgz", @@ -15879,6 +16734,14 @@ "crypto-random-string": "^1.0.0" } }, + "universal-user-agent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/universal-user-agent/-/universal-user-agent-4.0.0.tgz", + "integrity": "sha512-eM8knLpev67iBDizr/YtqkJsF3GK8gzDc6st/WKzrTuPtcsOKW/0IdL4cnMBsU69pOx0otavLWBDGTwg+dB0aA==", + "requires": { + "os-name": "^3.1.0" + } + }, "universalify": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", @@ -16830,6 +17693,30 @@ } } }, + "windows-release": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/windows-release/-/windows-release-3.2.0.tgz", + "integrity": "sha512-QTlz2hKLrdqukrsapKsINzqMgOUpQW268eJ0OaOpJN32h272waxR9fkB9VoWRtK7uKHG5EHJcTXQBD8XZVJkFA==", + "requires": { + "execa": "^1.0.0" + }, + "dependencies": { + "execa": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", + "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", + "requires": { + "cross-spawn": "^6.0.0", + "get-stream": "^4.0.0", + "is-stream": "^1.1.0", + "npm-run-path": "^2.0.0", + "p-finally": "^1.0.0", + "signal-exit": "^3.0.0", + "strip-eof": "^1.0.0" + } + } + } + }, "with-open-file": { "version": "0.1.7", "resolved": "https://registry.npmjs.org/with-open-file/-/with-open-file-0.1.7.tgz", diff --git a/package.json b/package.json index e894c94d..ae594981 100644 --- a/package.json +++ b/package.json @@ -3,14 +3,18 @@ "description": "What do you uses", "version": "7.7.7", "author": "Wes Bos", - "type": "module", "eslintConfig": { "extends": [ "wesbos" ] }, + "engines": { + "node": ">= 12" + }, "dependencies": { - "@actions/core": "^1.2.0", + "@actions/core": "^1.2.1", + "@actions/exec": "^1.0.3", + "@actions/github": "^2.0.1", "@hapi/joi": "^17.0.2", "country-emoji": "^1.5.0", "esm": "^3.2.25", @@ -50,6 +54,19 @@ "eslint-plugin-prettier": "^3.1.2", "eslint-plugin-react": "^7.17.0", "eslint-plugin-react-hooks": "^1.7.0", + "husky": "^4.0.10", + "lint-staged": "^9.5.0", "prettier": "^1.19.1" + }, + "husky": { + "hooks": { + "pre-commit": "lint-staged" + } + }, + "lint-staged": { + "src/data.js": [ + "eslint --fix", + "git add" + ] } } diff --git a/readme.md b/readme.md index a10db822..11398d0b 100644 --- a/readme.md +++ b/readme.md @@ -29,44 +29,90 @@ This readme is auto-generated from the data.js file, so please don't PR this fil # Awesome Uses ![Awesome][awesome-badge] +* [Simon Aronsson](https://simme.dev/uses) — Developer Advocate, Cloud and Devops Aficionado, Full-stack Developer * [Wes Bos](https://wesbos.com/uses) — Maker of this site. Web Developer, Tutorial Maker, Syntax.fm Podcaster, BBQ Lover +* [Ahmed Ibrahim](https://ahmed-ibrahim.com/uses) — Full-stack developer who believes that Passion is the key to every success. +* [Makon Cline](https://makoncline.com/uses) — Engineer, Developer, Home Cook. I like to make useful things and share them with others. +* [Nich Secord](https://secord.io/uses) — Full Stack Developer from the Redmond, WA area. Best skier on the mountain. Pretty good in general. +* [Mitchell Hanberg](https://mitchellhanberg.com/uses) — Full Stack Developer who loves working with Elixir, Ruby and JS. +* [Davy Hausser](https://davyhausser.com/uses) — Game Producer. Web Developer, Travel Enthusiast +* [Bojan Bedrač](https://www.improvebadcode.com/uses) — Coding the future, one line of code at a time. +* [Yannick Le Roux](https://yannickleroux.com/uses) — Second career web dev, French living in San Diego, retired DJ. +* [Eric Raslich](https://ericraslich.com/uses) — Boat captain, web developer, marine biologist, solving science and communication problems with web technologies. +* [Didier Catz](https://didiercatz.com/uses) — Creative Developer & Interaction enthousiast. In love with modern JS, typography, jazz and homemade cappuccino. +* [Anwar Hussain](https://gist.github.com/getanwar/daa9cb57428fd56255b1759fef2754f0) — Web Developer and No-Code Maker +* [Victor Silva](https://github.com/VictorHSC/awesome-uses) — Web Developer +* [Asur Bernardo](https://asur.dev/uses/) — Back end developer with no aesthetic sense. Full stack with reservations. Open-source enthusiast. Continuous learner! +* [Vinoth Chellamuthu](https://ecevinoth.github.io/#uses) — Data Engineer +* [Roberto Vázquez González](https://robertovg.com/uses/) — Javascript Engineer (10+ years experience) && CorkerSpace Co-founder, 💛js (^es6),🏄‍🧘‍🎸. +* [Joe Astuccio](https://astucc.io/uses) — Front End Developer, Sailor, Stargazer, Hockey Player, and all around fun guy... but my absolute favorite thing is being a dad. * [Eliezer Steinbock](https://elie.tech/uses) — Founder of Skilled.co.il and Draft Fantasy. Full Stack Freelance Developer +* [Rene Gens](https://renegens.com/uses) — android engineer, project manager, teacher, aspiring designer and author +* [John Smith](https://solrevdev.com/uses/) — full-time carer formally head of infrastructure and operations, senior full-stack #dotnetcore #aspnetcore #vuejs developer and software engineer https://solrevdev.com +* [Michael Gale](https://michaelgale.dev/uses) — Web Developer with a beard and glasses from Melbourne, Australia +* [Aaron A.](https://ocular-rhythm.io/uses/) — Sandwich enthusiast and programmer. +* [Renee de Kruijf](https://webdesignpuntnl.com/pages/uses.html) — Javascript developer in the making. Still learning every day. Liking it a lot! +* [Amarpreet Singh](https://www.momcoded.com/uses) — Frontend Developer. Things i love JS, React, Swift, practicing minimalism and milk tea enthusiast. +* [Asam Shan](https://www.asamshan.dev/uses) — JavaScript Junkie, very fond of React, Gatsby and Netlify ❤️ +* [Emmanuel Martins](http://betacodings.com/uses) — Full Stack Developer, i love programming with python, Advocate Engineer at @BCodings +* [Chris Berry](http://chrisberry.io/uses) — Designer / Developer 🦄, Linux advocate, mechanical keyboard connoisseur * [James Quick](https://jamesqquick.com/uses) — Developer Advocate Engineer at @auth0 and content creator * [Federico Vitale](https://fedevitale.dev/uses) — 20yo, Self Taught FullStack Developer, Full Time. Bikes lover, Tech (obviously) enthusiast. * [Vishwasa Navada K](https://vishwas.tech/uses) — Geek. Open source Enthusiast. Occasional blogger, photographer and traveler. * [Silvestar Bistrović](https://www.silvestar.codes/uses/) — Fearless web engineer, CSS developer, JAMstack enthusiast, and WordPress theme specialist. * [Adam Schwartz](https://adamschwartz.co/uses/) — Software developer, designer, film music composer +* [Andy Bell](https://hankchizljaw.com/uses) — Educator who focuses on design, front-end development, accessibility and progressive enhancement. I teach at Piccalilli and Front-End Challenges Club * [Sergey Lysenko](https://soulwish.info/uses/) — Front-end developer, guitar player, MTB rider, snowboarder, runner. +* [Shajan Jacob](https://shajanjacob.com/uses) — Software Engineer, extroverted introvert, storyteller and a maker. * [Habbat Adnan](https://adncodez.com/uses) — Self Taught Web Developer, Full Time Freelancer, Open Source Enthusiast +* [Marco Poletto](https://poletto.dev/uses/) — Frontend Developer, UI engineer, Mentor +* [Telmo Goncalves](https://telmo.online/uses) — Fullstack Developer, mostly focused to ReactJS. Digital Nomad, I love travelling. +* [Mark Horsell](https://markhorsell.com/uses) — Software Developer - Front-end mostly, back-end and native sometimes. * [Carter McAlister](https://cartermcalister.dev/uses) — Software Engineer, Digital Nomad, Lover of the Outdoors * [Matt Jennings](https://mattjennings.io/uses) — web dev, hockey | tradebreaker.io +* [Jake Jarvis](https://jarv.is/uses/) — Front-End Web Developer, Teacher, Cat Dad, World Wide Web Surfer 🏄 +* [Valentina Calabrese](https://valentinacalabrese.com/uses) — Front-End Engineer 🤓, Drummer 🥁, Skateboarder 🛹 & Tech Enthusiast 📲. Sometimes I blog, too ✍🏻. And I 💖 User-centered design. * [Jason Cory Alvernaz](https://jasoncoryalvernaz.com/uses) — Web Developer, Blogger, YouTuber, and Dog Lover. Not necessarily in that order. * [Alessia Bellisario](https://aless.co/uses) — Web engineer, mechanical keyboard builder, plotter art maker. -* [Sam Cross](http://sam-cross.github.io/uses) — "Developer", IT student, frequent traveller by coach, addicted to music. +* [Karl Koch](https://www.kejk.co/uses) — Design and Frontend Engineering lead @neuerenergy. Design Lead @makeacocktail. Guitar @echoes_uk. +* [Sam Cross](https://sam-cross.github.io/#/uses) — "Developer", IT student, frequent traveller by coach, addicted to music. * [Praveen Kumar Purushothaman](https://blog.praveen.science/my-personal-development-environment/) — Cook, Cat Lover, Front End Architect, Full Stack Web Developer Evangelist & Cloud Computing Consultant. * [Rene Pot](http://renepot.com/uses) — Developer Evangelist, JavaScript Developer, Cross-Platform App Developer and gamer * [Gant Laborde](http://gantlaborde.com/uses/) — Speaker, GDE Web/ML, Podcaster, Trainer, Speaker, Author, Podcaster +* [Dave Mullen Jnr](https://davemullenjnr.co.uk/uses) — Designer, photographer, developer, multi-instrumentalist, chess player, aspiring minimalist, environmentally friendly. +* [Josh Buchea](https://joshbuchea.com/uses) — Software Engineer, Open Source Contributor * [Tiffany White](https://tiffanywhite.dev/uses/) — Frontend dev, blogger, podcaster, herder of cats * [Kent C. Dodds](https://kentcdodds.com/uses) — JavaScript Software Engineer, speaker, and trainer * [Ava Gaiety Wroten](https://www.wroten.me/uses) — JavaScript Software Engineer, artist, and designer +* [Darlene Zouras](https://darzouras.com/uses/) — Front-End and UI/UX Developer, Accessibility advocate, JAMStack fan, working in the marketing and entertainment industry * [Glenn Reyes](https://glennreyes.com/uses) — Independent Software Engineer, trainer & speaker. Into sports & music. +* [Simon Stenbæk](https://sstenbaek.dk/uses) — Helicopter pilot, web developer * [Adam Jahnke](https://adamyonk.com/uses) — Caffiend, motorcyclist, climber, recovering perfectionist. I love to make the complex simple. * [Andrew Healey](https://healeycodes.com/uses) — Software Engineer, Writer, Learner! * [Scott Tolinski](https://scotttolinski.com/uses) — Web Developer, Tutorial Maker, Podcaster, Bboy +* [Gabriel Wilkes](https://azul.technology/uses/) — Full-stack developer who loves learning new things, American 10 years in Japan, soon back to the US * [Anton Andrésen](https://anton.best/uses/) — Software Engineer, Tutorial Maker, Youtuber, Tea Drinker * [Josiah Wiebe](https://jwie.be/uses/) — Designer & developer, lifelong learner. * [Benjamin Lannon](https://lannonbr.com/uses/) — Web Developer, Open Source Contributor, Livestreamer * [Braden Watkins](https://bradenwatkins.dev/uses) — Student, Full Stack Developer, Lover of all things analog +* [Rikin Patel](https://patelrikin.com/#uses) — Experienced Front-end developer, Passionate about Javascript +* [Joris Hens](https://www.goodbytes.be/uses) — Web development teacher, Security and hacking enthousiast, Cook. * [Lauro Silva](https://laurosilva.com/uses) — Software Engineer and Technical Writer +* [Tony Cimaglia](https://www.tonycimaglia.com/uses/) — Restaurant Veteran turned Developer. * [Nuno Maduro](https://nunomaduro.com/uses/) — Software engineer, Open Source contributor, Speaker * [Adrian Marin](https://adrianthedev.com/uses) — Product-Minded Software Engineer, Digital nomad, no-nonsense enjoyer of life, friends and family. * [Jahir Fiquitiva](https://jahir.dev/uses) — Passionate and Creative Full Stack Developer * [Christophe Querton](https://kertof.com/what-i-use) — Software Engineer, xoogler, co-founder of @accelery. Full-stack, technical debt collector. Lover of the Outdoors, BBQ, sailing. * [Lina María Montaño Ramírez](https://calypsobronte.me/uses) — Software Engineer at @holbertonschool, Web Developer, passionate and Organizer at @node_co +* [Michael Knepprath](https://mknepprath.com/uses) — Pokémon-obsessed Software Engineer & Designer. Twitter bots are my jam. * [Brad Garropy](https://bradgarropy.com/uses) — Self taught frontender at Adobe, into lifting and country music. +* [Bruno Brito](https://brunobrito.pt/uses) — Freelance Web Developer, Content Creator, Digital Marketing teacher * [Abdisalan Mohamud](https://abdisalan.com/uses) — Software Engineer, blogger, lifetime learner +* [Roy Tang](https://roytang.net/about/uses/) — Programmer, engineer, scientist, critic, gamer, dreamer, and kid-at-heart. * [Josh Barker](https://joshuabarker.com/uses) — Front end engineer at Red Ventures. Soccer enthusiast. Lover of stories. +* [David Perkins](https://prkns.me/uses) — Dad, Designer, Developer, Dave, Keyboard enthusiast * [Aaron Dunphy](https://aarondunphy.com/uses) — Full Stack Developer, Coffee Lover and Photo Taker +* [Jason Raimondi](https://jasonraimondi.com/uses) — Full Stack Developer * [Mohamed Benhida](http://mohamedbenhida.com/uses) — Web Developer, Open source contributor. * [Thomas Hunter II](https://thomashunter.name/uses) — Node.js developer with a thing for distributed systems. Co-organizer of NodeSchool SF. Game developer. * [Andrew McCombe](https://www.euperia.com/uses) — Experienced full stack web developer with a passion for testing. @@ -74,23 +120,33 @@ This readme is auto-generated from the data.js file, so please don't PR this fil * [Pouria Ezzati](https://pouria.dev/uses) — Web developer. Digs music, football and a e s t h e t i c s * [Jonathan Suh](https://jonsuh.com/uses) — Designer, Developer, Sneakerhead * [Jonathan Speek](https://speek.design/uses) — Developer & Musician +* [Keith Wagner](https://kpwags.com/uses) — Experienced full stack developer. Always trying to learn new and better ways of doing things. +* [Chuck Munson](https://www.breadandrosesweb.com/uses/) — Web developer, blogger, writer, journalist, photographer, librarian, Minecraft addict, cooking show fanatic * [David O'Trakoun](https://www.davidosomething.com/uses/) — Software Engineer * [Dean Harris](https://deanacus.com/uses/) — Front End Developer. Husband. Skateboarder. Occasional blogger -* [Michael Hoffmann](https://www.mokkapps.de/blog/my-development-setup/) — Freelance Software Engineer +* [Michael Hoffmann](https://www.mokkapps.de/uses) — Freelance Software Engineer +* [Austin Gil](https://stegosource.com/uses/) — Some dude that writes code. * [Michael Le](https://www.michael1e.com/uses/) — Software Engineer +* [Sergey Panay](https://panay.dev/uses) — Front End developer. Productivity nerd. * [Sil van Diepen](https://www.silvandiepen.nl/uses/) — Creative Developer * [Kilian Valkhof](https://kilianvalkhof.com/using/) — User experience developer +* [Dale French](https://dalefrench.dev/uses) — Full Stack Developer from South Africa. Skateboarder. Front End Enthusiast. * [Timothy Miller](https://timothymiller.dev/uses) — Web Designer/Developer for hire. Wears lots of hats. +* [Caleb Ukle](https://calebukle.com/uses) — I'm a software developer, technology enthusiast, and simply enjoy learning new things. * [Christopher Hranj](https://brodan.biz/uses) — Software Engineer, Blogger, Musician, Ultimate player. * [Vincent Ramdhanie](https://vincentramdhanie.com/uses) — Software Developer, Lecturer, Technical Writer and Mentor * [Amir R Muntasser](https://arkm.xyz/uses/) — Web Developer, #vuenicorn wizard, Oxford comma enthusiast, and inventor of the ol' razzle dazzle. * [Pavel Melnik](https://theopract.gitlab.io/pavel-dev/uses/) — Web developer, Technology enthusiast, Energy Management System expert * [Miguel Ángel Durán](https://midu.dev/uses) — Front end passionate, Web Performance freak, casual speaker, podcast host, and gamer. * [David Llop](https://davidllop.com/uses) — Full stack developer from Girona. Open Source contributor. Always Learning. +* [Alba Silvente](https://dawntraoz.com/uses) — Front-end developer, Vue & TailwindCSS lover. Hip Hop & Afro house dancer. +* [Alberto Fortes](https://albertofortes.com/uses/) — Senior Front-end developer with strong aesthetic sense. Building cool websites and apps as Front-end Team lead at Avallain. * [Josh Manders](https://joshmanders.com/uses/) — Full Snack Developer and Indie Maker * [Daniel Wirtz](https://danielwirtz.com/uses/) — Designer who codes @Crisp Studio * [Harry Wolff](https://hswolff.com/uses/) — Front-end engineer and YouTuber +* [Josh Moore](https://jmoore.dev/redesign/uses) — Self-taught full-stack web dev with a passion for open-source, privacy, & security. * [James Mills](https://jamesmills.co.uk/uses) — Work with PHP & Laravel at @clicksco in Dubai. Pleased to be part of the Laravel community. +* [Mohammad Dohadwala](https://dohad.dev/uses) — Hi, I am a Javascript Full Stack Web Developer from Dubai, currently studying Computer Science. * [Jeffrey Way](https://laracasts.com/blog/laracasts-uses) — Laracasts Author * [Terry Godier](https://terrygodier.com/uses) — A developer and marketer of fine internet products. * [Erno Salo](https://endormi.io/uses/) — Full Stack Developer and Open Source Contributor @@ -98,25 +154,33 @@ This readme is auto-generated from the data.js file, so please don't PR this fil * [James Brooks](https://james.brooks.page/uses/) — Software Developer at Laravel and Podcaster * [Byurhan Beyzat](https://byurhanbeyzat.com/uses) — Front-End Developer. Engineer. Occasional blogger. * [Mike Barkmin](https://www.barkmin.eu/uses/) — I'm a passionate developer and researcher at the University of Duisburg-Essen at the chair of Computer Science Education. -* [Hugo Di Francesco](https://codewithhugo.com/uses/) — JavaScript developer, blogger at codewithhugo.com, author of 'Professional JavaScript' with Packt. +* [Hugo Di Francesco](https://codewithhugo.com/uses) — JavaScript developer, blogger at codewithhugo.com, co-author of 'Professional JavaScript' with Packt. * [Steve Heyes](https://steveheyes.co.uk/uses) — I like to use tech to build awesome things that makes peoples lives better * [Diego Vazquez](https://gist.github.com/diurivj/78ca931c4b20dca1e1e13982fa9c309d) — Young guy who loves code. Full Stack Web Developer. Lead Teacher @ Ironhack * [Rafael Quintanilha](https://rafaelquintanilha.com/about#uses) — Software Engineer. Blogs about Web Development, Front-end, React, UI/UX, Accessibility. * [Talita Oliveira](https://talitaoliveira.com.br/#uses) — Software Developer. Loves CSS and Javascript. Already worked with PHP and a little with JAVA. * [Ben Leivian](https://benleivian.com/uses) — A “seasoned” full-stack developer & visual designer 🍔 +* [David Petringa](https://david.dukesnuz.com/uses) — A web developer who very much likes working with Laravel and Vuejs. My side Hustle is blogging. +* [Mike Gunderloy](https://afreshcup.com/uses/) — Full-stack developer and dilettante * [Roman Husar](https://seemslikelegit.com/uses) — Tinkering, all the time. * [Stephen Senkomago Musoke](https://ssmusoke.com/uses) — Software Engineer, eHealth Technologist, PHP Lover by night, Muganda, Goat Meat for Life, Coffee Drinker * [Jérémy Mouzin](https://jeremymouzin.com/uses) — Software Engineer, Tutorial Maker, Entrepreneur, Blogger * [Adam Laycock](https://www.arcath.net/uses) — IT Engineer, Web Developer & Blogger * [Scott Spence](https://scottspence.me#uses) — Father, husband 👨‍👩‍👧 Web Developer. Just In Time learner ❤️ 👍 http://my.pronoun.is/he +* [Marc Littlemore](https://marclittlemore.com/uses) — Engineering Team Lead @ BBC, Node.js fan, course creator, entrepreneur, ex-videogame developer, public speaker, and sepsis survivor. * [José Manuel Lucas](https://jmlweb.es/blog/2020/uses/) — Professional Frontend Engineer - Amateur musician +* [Dao Huy Tuan](https://daohuytuan.com/uses/) — FrontEnd Engineer, Blogger, Vimmer * [Georgi Yanev](https://gyanev.com/uses/) — Software Engineer, FPV Drone Pilot, Blogger, YouTuber +* [Mark Tse](https://neverendingqs.com/uses/) — A back-end developer who likes to dabble in the front-end. * [Karl Horky](https://github.com/karlhorky/uses/blob/master/readme.md) — Founder, Teacher at https://upleveled.io +* [Zoran Panev](https://gist.github.com/8f08557764711afbf82b75ac0ce61e79.git) — Web developer * [Josh Farrant](https://farrant.me/uses) — Full-Stack JavaScript developer, creator of Shortcuts JS, astrophysicist and private pilot. I turn coffee, alchemy-like, into code. -* [Pedro Assunção](https://pedroassuncao.com/pages/uses) — Senior Fullstack Software Developer, Tutorial Maker, Blogger * [Steven van Loef](https://steven.vanloef.com/uses) — Web Developer, App Developer * [Richard Zilahi](https://gist.github.com/zilahir/4aaf5907999ea53711b2d554d22b0f3f) — Full stack developer, pug enthusiast, dying for pizza +* [Duncan McClean](https://duncanm.dev/uses) — Web Developer working with Laravel & Statamic * [Ricard Torres](https://php.quicoto.com/uses/) — Senior Front-end Software Engineer from Barcelona, Haidong Gumdo Instructor, street photographer, TV addict, Boston Red Sox fan... +* [Matthew Rebehn](https://mattaz.com/uses) — Proud Dad and Developer +* [Isaac Weber](https://www.webdevike.com/uses) — Full stack, GraphQL enthusiast * [Bezael Pérez](https://dominicode.com/uses) — Front-end Developer passionate. Trainer & speaker * [Zander Martineau](https://zander.wtf/writing/my-setup) — Independent front-end-full-stack-UI-UX-engineer coder * [Daniel Van Cuylenburg](https://danielvanc.com/uses) — Front-end Web Developer. Love all things CSS, ReactJS, GatsbyJS, NodeJS and U.I design @@ -129,6 +193,7 @@ This readme is auto-generated from the data.js file, so please don't PR this fil * [Nick Janetakis](https://nickjanetakis.com/uses) — Freelance Web Developer, Web App Deployment, Tutorials, Technical death metal enthusiast * [Kaleigh Scruggs](https://kaleighscruggs.com/uses) — Front-End Web Developer, stand-up comedian, loves Brazilian jiu-jitsu, tea, and being a helicopter dog mom * [Ste Grainer](https://stegrainer.com/uses) — Designer, Developer +* [Jorge Calle](https://jorgecalle.co/uses) — Hello world! I am a Software Engineer and a Javascript developer from Sahagún (CO) * [José Carlos Correa](https://jossdz.com/uses) — Fullstack developer and speaker. Lead teacher @ironhack and gatsby teacher @platzi. Learning all the time. * [Erv Walter](https://blog.ewal.net/uses/) — Father, Husband, Web Developer, Board Game Addict * [Juanito Fatas](https://juanitofatas.com/uses) — Program Tinker 🧙🏼‍♂️ @@ -137,14 +202,19 @@ This readme is auto-generated from the data.js file, so please don't PR this fil * [Dieter Stinglhamber](https://www.dieterstinglhamber.me/uses/) — Developer, human, nerd. * [Dany Paredes](https://danywalls.com/uses) — I was a .NET guy, my last years ❤️ { #js & #sass } and play[ #react #vue #angular #sveltejs] * [Thomas Weibenfalk](https://www.weibenfalk.com/uses/) — Passionate developer, course creator, youtuber, designer and musician from Sweden +* [Julio Lozovei](https://jlozovei.dev/uses/) — Front-end bugs developer, writer/speaker and amateur musician from Brazil 🤘 * [Chris Burgin](https://chrisburgin.me/uses) — Frontend Software Engineer * [Shiveen Pandita](https://shiveenp.com/uses/) — Fullstack developer and blogger from Sydney * [David Leuliette](https://davidl.fr/uses) — Freelance React Native developer and bootcamp instructor specializing in cross-platform application. * [Dave Berning](https://daveberning.io/uses/) — Developer, author, rocker, Nintendo enthusiast. I also co-organize the CodePen Cincinnati Meetups. * [Jan-Lukas Else](https://jlelse.dev/uses/) — Computer Science Student, Developer & Blogger from Germany +* [Will Presley](https://willpresley.com/uses/) — Professional Web Dev & SysAdmin from Ohio, USA * [Seyhun Akyürek](https://www.seyhunakyurek.com/uses/) — Senior Software Specialist. Swift, Objective-C, former Rubyist. Author of twitter-bootstrap-rails +* [Silvestre Vivo](https://silvestrevivo.github.io/uses) — Full Stack developer, before architect and flamenco guitar player. +* [Josef Aidt](https://josefaidt.dev/uses) — JavaScript and Garlic Bread connoisseur * [Eric Oyanadel](https://www.oyanadel.com/uses/) — Artist - Developer - Musician * [Usman Khwaja](https://usmankhwaja.com/uses) — Front end engineer, Jamstack developer +* [Abdessalam Benharira](https://abdessalam-benharira.me/uses) — JavaScript developer, UX/UI design and tech enthusiast * [Thomas Large](https://tomlarge.dev/uses) — My name is Tom! I write code * [Amit Merchant](https://www.amitmerchant.com/uses) — Maker of things. Open-source enthusiast. Blogger. * [Jesse James Burton](https://burtonmediainc.com/uses) — Software Developing Yogi from Alberta, Canada. Lets build the internet together. @@ -153,36 +223,59 @@ This readme is auto-generated from the data.js file, so please don't PR this fil * [Eduardo Reveles](https://www.osiux.ws/about/uses) — Web Engineer, Husband, Gamer. * [Thomas Maximini](https://www.maxi.io/uses/) — Freelance software developer from Germany. * [Philip Theobald](https://www.philiptheobald.com/uses/) — Guitar player, motorcyclist, software engineer, entreprenuer +* [Wes Baker](https://wesbaker.com/uses) — Team Lead, Software Engineer, Board/Miniature/RPG Gamer, Miniature Painter, 3D Printer, Disney fanatic +* [Roland Szabo](https://rolisz.ro/uses) — Team Lead, ML Engineer, Board Gamer +* [Matheus Almeida S. Anjos](https://matalmeida.netlify.com/uses/) — Passionate about programming, engaged with Javascript and Golang lover. * [Alejandro G. Anglada](https://aganglada.com/uses/) — Dad 👪🔥⚡️ Web Engineer ⚛️🚀 Building websites with #react #typescript #nodejs #graphql 👌 * [Antoni Kepinski](https://kepinski.me/uses/) — Node Fetch maintainer // Into Node.js and Rust +* [Frank Bültge](https://bueltge.de/uses/) — Alpinist, Cyclist, Optimist. I develop, support solutions, primarily with SAP at ZEISS Group and I make WordPress-based solutions at the Inpsyde +* [Sangam Kumar](https://www.sangam.dev/uses) — (☕) => { 👨‍💻 }; git checkout hackerrank * [Marcus Obst](https://marcus-obst.de/uses) — Webdeveloper, Music Lover +* [Max Schmeling](https://maxschmeling.me/uses) — CTO @Clipisode. ❤️ web dev/mobile/open source. Husband, father, drummer. #Royals and #Chiefs fan. * [Pawel Grzybek](https://pawelgrzybek.com/uses/) — Software Engineer * [Eric McCormick](https://edm00se.codes/uses/) — Software Developer, IBM Champion, coffee lover, dabbler in all things technology, hobbyist 3d design and printing +* [Vince Picone](https://vincepic.one/uses) — Building design systems at IBM * [Ben Congdon](https://benjamincongdon.me/uses) — Golang, Python, Rust. Runs in the Cloud. * [Jens van Wijhe](https://jens.ai/uses) — Creative web developer and entrepreneur * [Jacob Herper](https://herper.io/uses/) — Senior Front-End Engineer with a passion for all things digital. I create amazing web apps to make the internet a better place. +* [Ajay Karwal](https://ajaykarwal.com/uses/) — A designer, developer and UX guy from Buckingham, UK. * [David Vives](http://dispuestoaaprender.netlify.com/en/uses) — Software Engineer, Web Developer, Chess Player, Comics Reader, Loves reading, learning new things, sushi, BBQ and aioli. * [Ryan Warner](https://ryan.warner.codes/uses) — Software Engineer and Interface Designer. Leader and Mentor. +* [Rob Warner](https://grailbox.com/uses/) — Software Architect, Developer, Father. * [Adam Urban](https://urbanisierung.dev/uses/) — coder, father, left-handed * [Majo Paskuvan](https://paskuvan.us/uses.html) — Front End Developer, Reader, Deaf Person * [Christopher Wavrin](https://wavrin.com/uses) — Full Stack Developer * [Florian Kapfenberger](https://phiilu.com/uses) — Frontend developer from Austria who likes to create modern applications with React (Native) +* [TaeHee Kim](https://roto.dev/uses) — Front-end Engineer, Bassist, Cat lover. +* [Marcin Krawczyk](https://marcin.codes/uses) — Javascript Developer from Poland, working and living in Switzerland, wannabe dev blogger. * [Maria Altyeva Schuessler ](http://mariacodes.io/uses) — Nacho Cheese Lover and Senior Full-Stack Developer, Project Manager, and Writer based out of Shanghai, China * [Arturo Campos](https://arturocampos.dev/uses) — Web Developer, dad, mountain biker, meat lover +* [Ibrahim Cesar](https://ibrahimcesar.dev/uses) — Philosophy hacker. Fullstack dev && Editor @ media company in Brazil. 4733 pixels tall @ 72dpi * [Sercan Eraslan](http://sercaneraslan.com/uses) — Front-End Tech Lead +* [Divjot Singh](https://bogas04.github.io/uses) — Web Developer, Vegan, Sikh. * [Jeff Wen](https://sinchang.me/uses) — Web Developer, Open Source Contributor * [Andrea Prus](https://avris.it/uses) — Full stack developer, blogger * [Bamuleseyo Gideon](https://medium.com/developer-circle-kampala/what-i-use-my-tools-of-trade-552655db4b8d) — Software Engineer, Facebook Developer Cirle Kamapala Lead. Front-end ❤️ * [Nick Taylor](https://www.iamdeveloper.com/uses/) — Just some dev from Montreal, Quebec, Canada +* [Benjamin Edenhuizen](https://rqrauhvmra.com/uses/) — Front-end web developer with a focus on accessibility and performance. * [Dave Hill](https://davehill.dev/uses/) — Front-end developer, amateur photographer, podcast beginner. * [Logan Blangenois](https://logan-blangenois.be/uses/) — Front-end developer passionate about eco-friendly (web)app and React. * [Muhammad Umair](https://gist.github.com/mumairofficial/0d97ed3dca1ba25d9f01b8db8aed42dc) — Fullstack front-end developer and designer, passionate in everything #JavaScript * [Alex Carpenter](https://alexcarpenter.me/uses) — UI Engineer, Screencaster +* [Benjamin Mock](https://codesnacks.net/uses/) — coder, runner, reader, maker * [Kevin Woblick](https://www.kovah.de/uses/) — I turn Pizza into Code and Photos * [Michał Miszczyszyn](https://typeofweb.com/michal-miszczyszyn-uses/) — Motivated full-stack developer not afraid to use any technology. Experienced developer and leader. He, him. +* [Simranjit Singh](https://simranjit.dev/uses) — Javascript loving Coldfusion developer +* [Maxwell Morrison](https://maxmorrison.me/uses) — Continuous leaner and freelance full stack developer +* [Rail Hamdeew](https://hmdw.me/uses/) — Full Stack. Open to new technologies +* [Armno Prommarak](https://armno.in.th/uses) — Frontend developer, blogger, cyclist. +* [Fernando Paredes](https://fdp.io/about/uses) — iOS/macOS developer, serial hobbyist, language nerd. * [Tarik Omercehajic](https://robotz.tech/uses/) — DevOps Engineer @BicomSystems. Mechanical Engineer in free time :) * [Duncan McDougall](https://www.belter.io/uses/) — Web developer, contractor, remotely working from the South of Scotland * [Kevin Simkanič](https://github.com/kevinko12323/uses) — Wordpress ninja 😎 React lover ❤️ CSS master 🧐 +* [Lakshmipriya Mukundan](https://gist.github.com/lakshmipriyamukundan/ddd224306ce962f4f159f1065f0f0c67) — Javascript lover, FullStack enthusiast, React Learner (current), Pet lover +* [Jeremy Bunting](https://qbunt.com/uses) — Web 🤖 working remotely from the Connecticut burbs +* [Tony Mamedbekov](https://www.tmamedbekov.dev/uses) — Architect, developer, cms enthusiast, technologoy evangelist, content creator, bloger, consultant * [Jerry Shi](https://github.com/szy0syz/uses) — Full Stack, Motivated full-stack developer not afraid to use any technology. [awesome-badge]: https://cdn.rawgit.com/sindresorhus/awesome/d7305f38d29fed78fa85652e3a63e154dd8e8829/media/badge.svg diff --git a/scripts/data-validate.js b/scripts/data-validate.js index e9554ebb..01f4ff15 100644 --- a/scripts/data-validate.js +++ b/scripts/data-validate.js @@ -1,88 +1,43 @@ -import Joi from '@hapi/joi'; -import core from '@actions/core'; -import * as http from 'http'; -import * as https from 'https'; -import data from '../src/data.js'; -import flags from './flags.js'; +const core = require('@actions/core'); +const { + getMasterData, + Schema, + getStatusCode, + communicateValidationOutcome, +} = require('./utils.js'); +const srcData = require('../src/data.js'); -if (process.env.CI !== 'true') { - core.error = console.error; - core.setFailed = console.error; -} +async function main() { + // on master branch will be empty array + const masterDataUrls = (await getMasterData()).map(d => d.url); + // so here data will be an array with all users + const data = srcData.filter(d => !masterDataUrls.includes(d.url)); -const schema = Joi.object({ - name: Joi.string().required(), - description: Joi.string().required(), - url: Joi.string() - .uri() - .required() - .pattern(/(use|uses|using|setup|environment|^https:\/\/gist.github.com\/)/), - country: Joi.string() - .valid(...flags) - .required(), - twitter: Joi.string().pattern(new RegExp(/^@?(\w){1,15}$/)), - emoji: Joi.string().allow(''), - computer: Joi.string().valid('apple', 'windows', 'linux'), - phone: Joi.string().valid('iphone', 'android'), - tags: Joi.array().items(Joi.string()), -}); + const errors = data + .map(person => Schema.validate(person)) + .filter(v => v.error) + .map(v => v.error); -const errors = data - .map(person => schema.validate(person)) - .filter(v => v.error) - .map(v => v.error); - -errors.forEach(e => { - core.error(e._original.name); - e.details.forEach(d => core.error(d.message)); -}); - -if (errors.length) { - core.setFailed('Action failed with validation errors, see logs'); -} -const REQUEST_TIMEOUT = 10000; - -function getStatusCode(url) { - const client = url.startsWith('https') ? https : http; - return new Promise((resolve, reject) => { - setTimeout(() => reject(new Error('Request timed out')), REQUEST_TIMEOUT); - client - .get(url, res => { - resolve(res.statusCode); - }) - .on('error', err => { - reject(err); - }); + errors.forEach(e => { + core.error(e._original.name || e._original.url); + e.details.forEach(d => core.error(d.message)); }); -} -async function isWorkingUrl(url) { - try { - const statusCode = await getStatusCode(url); - if (statusCode < 200 || statusCode >= 400) { - core.error(`Ping to "${url}" failed with status: ${statusCode}`); - return false; + const failedUrls = []; + for (const { url } of data) { + try { + const statusCode = await getStatusCode(url); + if (statusCode < 200 || statusCode >= 400) { + core.error(`Ping to "${url}" failed with status: ${statusCode}`); + failedUrls.push(url); + } + } catch (e) { + core.error(`Ping to "${url}" failed with error: ${e}`); + failedUrls.push(url); } - return true; - } catch (e) { - core.error(`Ping to "${url}" failed with error: ${e}`); - return false; } + + await communicateValidationOutcome(errors, failedUrls, data); } -(async () => { - // TODO: we might need to batch these in sets instead of requesting 100+ URLs - // at the same time - const areWorkingUrls = await Promise.all( - data.map(p => p.url).map(url => isWorkingUrl(url)) - ); - const failingUrls = areWorkingUrls.filter(a => !a); - if (failingUrls.length > 0) { - core.setFailed( - `Action failed with ${failingUrls.length} URL fetch failures, see logs` - ); - } - if (process.env.CI !== 'true') { - process.exit(failingUrls.length > 0 ? 1 : 0) - } -})(); +main(); diff --git a/scripts/flags.js b/scripts/flags.js index 100e8038..186a7fca 100644 --- a/scripts/flags.js +++ b/scripts/flags.js @@ -1,4 +1,4 @@ -const flags = [ +module.exports = [ '🇦🇫', '🇦🇱', '🇩🇿', @@ -236,5 +236,3 @@ const flags = [ '🏳️‍🌈', '🇪🇺', ]; - -export default flags; diff --git a/scripts/masterData.js b/scripts/masterData.js new file mode 100644 index 00000000..3d4c49b7 --- /dev/null +++ b/scripts/masterData.js @@ -0,0 +1,5 @@ +/** + * this is a stub file, do not edit it + * see `scripts/utils.js` -> `getMasterData` + */ +module.exports = []; diff --git a/scripts/populate-readme.js b/scripts/populate-readme.js index 3a834d5c..1dd2c0d0 100644 --- a/scripts/populate-readme.js +++ b/scripts/populate-readme.js @@ -1,5 +1,5 @@ -import fs from 'fs'; -import data from '../src/data.js'; +const fs = require('fs'); +const data = require('../src/data.js'); /** @type {string} */ const readmeTemplate = fs.readFileSync('./scripts/readme-template.md', 'utf8'); diff --git a/scripts/utils.js b/scripts/utils.js new file mode 100644 index 00000000..0bbda125 --- /dev/null +++ b/scripts/utils.js @@ -0,0 +1,132 @@ +const exec = require('@actions/exec'); +const core = require('@actions/core'); +const github = require('@actions/github'); +const Joi = require('@hapi/joi'); +const http = require('http'); +const https = require('https'); +const flags = require('./flags.js'); + +async function getCurrentBranchName() { + let myOutput = ''; + let myError = ''; + + const options = { + silent: true, + listeners: { + stdout: data => (myOutput += data.toString()), + stderr: data => (myError += data.toString()), + }, + }; + + await exec.exec('git rev-parse --abbrev-ref HEAD', [], options); + return myOutput.trim(); +} + +/** on master branch will return an empty array */ +module.exports.getMasterData = async function() { + const options = { silent: true }; + const curentBranchName = await getCurrentBranchName(); + // when on a branch/PR different from master + // will populate scripts/masterData.js with src/data.js from master + if (curentBranchName !== 'master') { + core.info('Executing action on branch different from master'); + await exec.exec('mv src/data.js src/tmpData.js', [], options); + await exec.exec('git fetch origin master', [], options); + await exec.exec('git restore --source=FETCH_HEAD src/data.js', [], options); + await exec.exec('mv src/data.js scripts/masterData.js', [], options); + await exec.exec('mv src/tmpData.js src/data.js', [], options); + } else { + core.info('Executing action on master branch'); + } + + // eslint-disable-next-line global-require + const masterData = require('./masterData.js'); + + // restore `scripts/masterData.js` after was loaded + if (curentBranchName !== 'master') { + await exec.exec('git restore scripts/masterData.js', [], options); + } + + return masterData; +}; + +module.exports.Schema = Joi.object({ + name: Joi.string().required(), + description: Joi.string().required(), + url: Joi.string() + .uri() + .required() + .pattern(/(use|uses|using|setup|environment|^https:\/\/gist.github.com\/)/), + country: Joi.string() + .valid(...flags) + .required(), + twitter: Joi.string().pattern(new RegExp(/^@?(\w){1,15}$/)), + emoji: Joi.string().allow(''), + computer: Joi.string().valid('apple', 'windows', 'linux'), + phone: Joi.string().valid('iphone', 'android'), + tags: Joi.array().items(Joi.string()), +}); + +module.exports.getStatusCode = function(url) { + const client = url.startsWith('https') ? https : http; + return new Promise((resolve, reject) => { + const REQUEST_TIMEOUT = 10000; + const timeoutId = setTimeout( + reject, + REQUEST_TIMEOUT, + new Error('Request timed out') + ); + + client + .get(url, res => { + clearTimeout(timeoutId); + resolve(res.statusCode); + }) + .on('error', err => reject(err)); + }); +}; + +// If there are errors, will fail the action & add a comment detailing the issues +// If there are no errors, will leave an "all-clear" comment with relevant URLs (to ease a potential manual check) +module.exports.communicateValidationOutcome = async function( + errors, + failedUrls, + changedData +) { + let comment = ''; + if (errors.length || failedUrls.length) { + core.setFailed('Action failed with errors, see logs & comment'); + + comment += [ + '🚨 We have detected the following issues, let us (contributors) know if you need support or clarifications:', + ...errors.map(e => `- ${e.message}`), + ...failedUrls.map(url => `- URL is invalid: ${url}`), + ].join('\n'); + } else { + comment += [ + '✅ Automatic validation checks succeeded for:', + // Comment with the URLs of users that have changed + // for easy access, way easier than taking a screenshot + ...changedData.map(({ name, url }) => `- ${name}, ${url}`), + ].join('\n'); + } + + const { GITHUB_TOKEN } = process.env; + const { context } = github; + if (!GITHUB_TOKEN || !context.payload.pull_request) { + core.error( + 'Cannot add a comment if GITHUB_TOKEN or context.payload.pull_request is not set' + ); + core.info(`Comment contents:\n${comment}`); + return; + } + + const pullRequestNumber = context.payload.pull_request.number; + + const octokit = new github.GitHub(GITHUB_TOKEN); + await octokit.issues.createComment({ + ...context.repo, + issue_number: pullRequestNumber, + body: comment, + }); +}; diff --git a/src/components/BackToTop.js b/src/components/BackToTop.js new file mode 100644 index 00000000..33d79df3 --- /dev/null +++ b/src/components/BackToTop.js @@ -0,0 +1,56 @@ +import React, { useState, useEffect } from 'react'; +import styled from 'styled-components'; + +const BackToTopLink = styled.a` + position: fixed; + bottom: 1%; + right: 1%; + background: var(--pink); + color: white; + background: rgba(0, 0, 0, 0.5); + cursor: pointer; + border-radius: 3px; + padding: 1rem; + transition: opacity 0.2s; + opacity: 0; + text-decoration: none; + ${props => + props.percent > 0.25 && + ` + opacity: 1; + `} + @media screen and (max-width: 500px) { + display: none; + } +`; + +function useScrollPosition() { + const [percent, setPercent] = useState(0); + + function handleScroll(event) { + const scrollTop = + document.scrollingElement.scrollHeight - + document.documentElement.clientHeight; + const howFar = document.documentElement.scrollTop / scrollTop; + setPercent(howFar); + } + + useEffect(() => { + // listen for window scroll event + document.addEventListener('scroll', handleScroll); + return () => { + document.removeEventListener('scroll', handleScroll); + }; + }); + + return percent; +} + +export default function BackToTop() { + const percent = useScrollPosition(); + return ( + + ↑ + + ); +} diff --git a/src/components/FavIcon.js b/src/components/FavIcon.js index 1ea4c906..95b70b37 100644 --- a/src/components/FavIcon.js +++ b/src/components/FavIcon.js @@ -1,4 +1,4 @@ -import React, { useEffect, useState, forwardRef, useRef } from 'react'; +import React, { useEffect, useState, useRef } from 'react'; function useInterval(callback, delay) { const savedCallback = useRef(); @@ -44,7 +44,7 @@ function useWickedFavIcon() { } export default function FavIcon() { - const { letter, index, canvasRef } = useWickedFavIcon(); + const { /* letter, index, */ canvasRef } = useWickedFavIcon(); return (
{ + observer.unobserve(ref.current); + }; + }); +} + export default function Person({ person, currentTag }) { const url = new URL(person.url); - const img = `https://images.weserv.nl/?url=https://unavatar.now.sh/${url.host}&w=100&l=9&af&il&n=-1` + const twitter = `https://unavatar.now.sh/twitter/${person.twitter}`; + const website = `https://unavatar.now.sh/${url.host}`; + const unavatar = person.twitter ? `${twitter}?fallback=${website}` : website; + const img = `https://images.weserv.nl/?url=${unavatar}&w=100&l=9&af&il&n=-1`; + return ( @@ -15,19 +36,19 @@ export default function Person({ person, currentTag }) { {person.name}

- {person.name} {person.emoji} - + {person.name} + {' '} + {person.emoji}

{`${url.host}${ - url.pathname.endsWith('/') - ? url.pathname.substr(0, url.pathname.length - 1) - : url.pathname - }`} + > + {url.host} + {url.pathname.replace(/\/$/, '')} +

{person.description}

@@ -110,6 +131,9 @@ const PersonInner = styled.div` padding: 2rem; h3 { margin: 0; + a:visited { + color: var(--purple); + } } header { display: grid; @@ -135,7 +159,8 @@ const PersonInner = styled.div` text-overflow: ellipsis; max-width: 100%; overflow: hidden; - :hover { + :hover, + :visited { color: var(--pink); } } diff --git a/src/components/header.js b/src/components/header.js index 9c5e3b62..5828752b 100644 --- a/src/components/header.js +++ b/src/components/header.js @@ -1,4 +1,4 @@ -import React, { useEffect, useState, useRef } from 'react'; +import React from 'react'; import { Link } from 'gatsby'; import PropTypes from 'prop-types'; import Helmet from 'react-helmet'; @@ -21,7 +21,7 @@ function Header({ siteTitle, siteDescription, siteUrl }) {
-

+

/uses

@@ -34,10 +34,14 @@ function Header({ siteTitle, siteDescription, siteUrl }) { } Header.propTypes = { siteTitle: PropTypes.string, + siteDescription: PropTypes.string, + siteUrl: PropTypes.string, }; Header.defaultProps = { - siteTitle: ``, + siteTitle: '', + siteDescription: '', + siteUrl: '', }; export default Header; diff --git a/src/components/image.js b/src/components/image.js index e61edb68..335f03fe 100644 --- a/src/components/image.js +++ b/src/components/image.js @@ -1,6 +1,6 @@ -import React from "react" -import { useStaticQuery, graphql } from "gatsby" -import Img from "gatsby-image" +import React from 'react'; +import { useStaticQuery, graphql } from 'gatsby'; +import Img from 'gatsby-image'; /* * This component is built using `gatsby-image` to automatically serve optimized @@ -24,9 +24,9 @@ const Image = () => { } } } - `) + `); - return -} + return ; +}; -export default Image +export default Image; diff --git a/src/components/layout.js b/src/components/layout.js index 2f4a808a..17e50fdf 100644 --- a/src/components/layout.js +++ b/src/components/layout.js @@ -73,7 +73,7 @@ export default Layout; // Global Styles const GlobalStyle = createGlobalStyle` html { - --purple: #1e1f5c; + --purple: #b066ff; --blue: #203447; --lightblue: #1f4662; --blue2: #1C2F40; @@ -85,11 +85,11 @@ const GlobalStyle = createGlobalStyle` font-family: 'Fira Mono', monospace; font-weight: 100; font-size: 10px; + scroll-behavior: smooth; } body { font-size: 2rem; overflow-y: scroll; - /* overflow-x: hidden; */ } h1,h2,h3,h4,h5,h6 { font-weight: 500; diff --git a/src/context/FilterContext.js b/src/context/FilterContext.js index 941bc545..c1d9b98e 100644 --- a/src/context/FilterContext.js +++ b/src/context/FilterContext.js @@ -1,5 +1,6 @@ import React, { createContext, useState } from 'react'; import { useStaticQuery, graphql } from 'gatsby'; +import PropTypes from 'prop-types'; const FilterContext = createContext(); @@ -44,5 +45,9 @@ const FilterProvider = function({ children }) { ); }; +FilterProvider.propTypes = { + children: PropTypes.element, +}; + export default FilterContext; export { FilterProvider }; diff --git a/src/data.js b/src/data.js index 36d621ac..b93b3593 100644 --- a/src/data.js +++ b/src/data.js @@ -1,4 +1,28 @@ -const pages = [ +// keep it commonjs export +module.exports = [ + { + name: 'Simon Aronsson', + description: + 'Developer Advocate, Cloud and Devops Aficionado, Full-stack Developer', + url: 'https://simme.dev/uses', + twitter: '@0x12b', + emoji: '🥑', + country: '🇸🇪', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Developer', + 'Full Stack', + 'Developer Advocate', + 'Teacher', + 'Architect', + 'JavaScript', + 'Go', + 'Cloud', + 'Devops', + 'Agile', + ], + }, { name: 'Wes Bos', description: @@ -22,23 +46,329 @@ const pages = [ ], }, { - name: 'Danilo Barion Nogueira', + name: 'Ahmed Ibrahim', description: - 'Father, developer, blog writer, classical guitar player and searching for the meaning of life!', - url: 'https://danilobarion1986.github.io/uses', - twitter: '@daniloinfo86', - emoji: '🤔', - country: '🇧🇷', + 'Full-stack developer who believes that Passion is the key to every success.', + url: 'https://ahmed-ibrahim.com/uses', + twitter: '@ahmed_ibrahhim', + emoji: '🔥', + country: '🇪🇬', computer: 'linux', phone: 'android', tags: [ 'Developer', - 'Blogger', - 'Speaker', + 'Full Stack', + 'Entrepreneur', + 'JavaScript', + 'React', + 'Node', + 'Cloud', + ], + }, + { + name: 'Makon Cline', + description: + 'Engineer, Developer, Home Cook. I like to make useful things and share them with others.', + url: 'https://makoncline.com/uses', + twitter: '@MakonCline', + emoji: '🤙', + country: '🇺🇸', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Engineer', + 'Developer', + 'Full Stack', + 'Entrepreneur', + 'JavaScript', + 'Node', + 'React', + 'Gatsby', + 'PostgreSQL', + 'GraphQL', + 'AWS', + ], + }, + { + name: 'Nich Secord', + description: + 'Full Stack Developer from the Redmond, WA area. Best skier on the mountain. Pretty good in general.', + url: 'https://secord.io/uses', + twitter: '@nichsecord', + emoji: '⛷️', + country: '🇺🇸', + computer: 'windows', + phone: 'android', + tags: [ + 'Developer', + 'Web Developer', + 'Full Stack', + 'Front End', + 'JavaScript', + 'TypeScript', + 'React', + 'GraphQL', + 'HTML', + 'CSS', + 'Sass', + 'Styled Components', + 'Node', + ], + }, + { + name: 'Mitchell Hanberg', + description: + 'Full Stack Developer who loves working with Elixir, Ruby and JS.', + url: 'https://mitchellhanberg.com/uses', + twitter: '@mitchhanberg', + emoji: '⚡️', + country: '🇺🇸', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Developer', + 'Full Stack', + 'Back End', + 'Elixir', + 'Phoenix', 'Ruby', 'Rails', 'JavaScript', + ], + }, + { + name: 'Davy Hausser', + description: 'Game Producer. Web Developer, Travel Enthusiast', + url: 'https://davyhausser.com/uses', + twitter: '@davyhausser', + emoji: '🌴', + country: '🇫🇷', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Developer', + 'Full Stack', + 'Entrepreneur', + 'JavaScript', 'React', + 'Node', + 'GraphQL', + ], + }, + { + name: 'Bojan Bedrač', + description: 'Coding the future, one line of code at a time.', + url: 'https://www.improvebadcode.com/uses', + twitter: '@xbojch', + emoji: '🚀', + country: '🇦🇹', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Software Craftsman', + 'Developer', + 'Full Stack', + 'Speaker', + 'Trainer', + 'JavaScript', + 'React', + 'PHP', + 'Node', + 'CSS', + ], + }, + { + name: 'Yannick Le Roux', + description: + 'Second career web dev, French living in San Diego, retired DJ.', + url: 'https://yannickleroux.com/uses', + twitter: '@dj_yanic', + emoji: '🔥', + country: '🇫🇷', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Developer', + 'Front End', + 'TypeScript', + 'JavaScript', + 'React', + 'Node', + 'Redux', + 'HTML', + 'CSS', + ], + }, + { + name: 'Eric Raslich', + description: + 'Boat captain, web developer, marine biologist, solving science and communication problems with web technologies.', + url: 'https://ericraslich.com/uses', + twitter: '@rasliche', + emoji: '🤙', + country: '🇺🇸', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Developer', + 'Full Stack', + 'Captain', + 'Streamer', + 'JavaScript', + 'Vue', + 'Node', + 'CSS', + 'Tailwind', + 'Entrepreneur', + ], + }, + { + name: 'Didier Catz', + description: + 'Creative Developer & Interaction enthousiast. In love with modern JS, typography, jazz and homemade cappuccino.', + url: 'https://didiercatz.com/uses', + twitter: '@didiercatz', + emoji: '🎹', + country: '🇳🇱', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Developer', + 'JavaScript', + 'Svelte', + 'Node', + 'CSS', + 'Tailwind', + 'Entrepreneur', + 'OSS', + 'Animation', + 'Musician', + ], + }, + { + name: 'Anwar Hussain', + description: 'Web Developer and No-Code Maker', + url: 'https://gist.github.com/getanwar/daa9cb57428fd56255b1759fef2754f0', + twitter: '@getanwar', + emoji: '🎩', + country: '🇧🇩', + computer: 'apple', + phone: 'android', + tags: [ + 'Front End', + 'Developer', + 'JavaScript', + 'React', + 'Vue', + 'Node', + 'GraphQL', + 'HTML', + 'CSS', + 'SCSS', + 'Entrepreneur', + 'No Code', + 'Maker', + ], + }, + { + name: 'Victor Silva', + description: 'Web Developer', + url: 'https://github.com/VictorHSC/awesome-uses', + twitter: '@HugoNeo99', + emoji: '😎', + country: '🇧🇷', + computer: 'windows', + phone: 'iphone', + tags: ['Front End', 'Developer', 'JavaScript', 'HTML', 'CSS', 'SCSS'], + }, + { + name: 'Asur Bernardo', + description: + 'Back end developer with no aesthetic sense. Full stack with reservations. Open-source enthusiast. Continuous learner!', + url: 'https://asur.dev/uses/', + twitter: '@asurbernardo', + emoji: '🧐', + country: '🇪🇸', + phone: 'android', + computer: 'linux', + tags: [ + 'Developer', + 'Back End', + 'SEO', + 'SCSS', + 'HTML', + 'JavaScript', + 'PHP', + 'NodeJS', + 'FOSS', + ], + }, + { + name: 'Vinoth Chellamuthu', + description: 'Data Engineer', + url: 'https://ecevinoth.github.io/#uses', + twitter: '@ecevinoth', + emoji: '👨🏼‍💻', + country: '🇮🇳', + computer: 'windows', + phone: 'android', + tags: [ + 'Developer', + 'Engineer', + 'Back End', + 'Python', + 'Software Engineer', + 'SQL', + 'DevOps', + ], + }, + { + name: 'Roberto Vázquez González', + description: + 'Javascript Engineer (10+ years experience) && CorkerSpace Co-founder, 💛js (^es6),🏄‍🧘‍🎸.', + url: 'https://robertovg.com/uses/', + emoji: '🎸', + country: '🇪🇸', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Developer', + 'Javascript Engineer', + 'Frontend', + 'Learner', + 'Entrepreneur', + 'React', + 'Next', + 'Gatsby', + 'GraphQL', + 'Styled-Components', + 'Node', + 'CSS', + 'Vue', + ], + }, + { + name: 'Joe Astuccio', + description: + 'Front End Developer, Sailor, Stargazer, Hockey Player, and all around fun guy... but my absolute favorite thing is being a dad.', + url: 'https://astucc.io/uses', + twitter: '@jastuccio', + emoji: '😜', + country: '🇺🇸', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Front End', + 'HTML', + 'CSS', + 'SCSS', + 'Styled Components', + 'JavaScript', + 'TypeScript', + 'React', + 'Gatsby', + 'JAMstack', + 'Serverless', ], }, { @@ -63,6 +393,206 @@ const pages = [ 'GraphQL', ], }, + { + name: 'Rene Gens', + description: + 'android engineer, project manager, teacher, aspiring designer and author', + url: 'https://renegens.com/uses', + twitter: '@renegens', + emoji: '🤷‍', + country: '🇬🇷', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Developer', + 'Android', + 'Entrepreneur', + 'Teacher', + 'Kotlin', + 'Gatsby', + 'React', + 'CSS', + ], + }, + { + name: 'John Smith', + description: + 'full-time carer formally head of infrastructure and operations, senior full-stack #dotnetcore #aspnetcore #vuejs developer and software engineer https://solrevdev.com', + url: 'https://solrevdev.com/uses/', + twitter: '@solrevdev', + emoji: '🤓', + country: '🏴󠁧󠁢󠁥󠁮󠁧󠁿', + computer: 'apple', + phone: 'iphone', + tags: [ + 'C#', + 'ASP.NET', + '.NET Core', + '.NET', + 'dotnetcore', + 'aspnetcore', + 'Vue', + 'VueJS', + 'AWS', + 'Developer', + 'Backend', + 'Full Stack', + ], + }, + { + name: 'Michael Gale', + description: + 'Web Developer with a beard and glasses from Melbourne, Australia', + url: 'https://michaelgale.dev/uses', + twitter: '@miclgael', + emoji: '🦄', + country: '🇦🇺', + computer: 'apple', + phone: 'iphone', + tags: ['Developer', 'Full Stack', 'JavaScript', 'Vue', 'Node', 'CSS'], + }, + { + name: 'Aaron A.', + description: 'Sandwich enthusiast and programmer.', + url: 'https://ocular-rhythm.io/uses/', + twitter: '@ocularrhythm', + emoji: '🦙', + country: '🇺🇸', + computer: 'apple', + phone: 'android', + tags: [ + 'TypeScript', + 'JavaScript', + 'React', + 'PHP', + 'Gatsby', + 'WordPress', + 'CSS', + ], + }, + { + name: 'Renee de Kruijf', + description: + 'Javascript developer in the making. Still learning every day. Liking it a lot!', + url: 'https://webdesignpuntnl.com/pages/uses.html', + twitter: '@reneedekruijf', + emoji: '🐧', + country: '🇳🇱', + computer: 'linux', + phone: 'iphone', + tags: [ + 'Developer', + 'JavaScript', + 'React', + 'Next', + 'Gatsby', + 'Styled-Components', + 'CSS', + ], + }, + { + name: 'Amarpreet Singh', + description: + 'Frontend Developer. Things i love JS, React, Swift, practicing minimalism and milk tea enthusiast.', + url: 'https://www.momcoded.com/uses', + twitter: '@amarmanhala', + emoji: '☕', + country: '🇨🇦', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Developer', + 'Frontend', + 'Learner', + 'minimalist', + 'JavaScript', + 'React', + 'CSS', + 'Swift', + ], + }, + { + name: 'Danilo Barion Nogueira', + description: + 'Father, developer, blog writer, classical guitar player and searching for the meaning of life!', + url: 'https://danilobarion1986.github.io/uses', + twitter: '@daniloinfo86', + emoji: '🤔', + country: '🇧🇷', + computer: 'linux', + phone: 'android', + tags: [ + 'Developer', + 'Blogger', + 'Speaker', + 'Ruby', + 'Rails', + 'JavaScript', + 'React', + ], + }, + { + name: 'Asam Shan', + description: 'JavaScript Junkie, very fond of React, Gatsby and Netlify ❤️', + url: 'https://www.asamshan.dev/uses', + twitter: '@shan8851', + emoji: '🔥', + country: '🇬🇧', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Developer', + 'JavaScript', + 'React', + 'ReactNative', + 'Gatsby', + 'Styled-Comnponents', + 'Node', + 'CSS', + ], + }, + { + name: 'Emmanuel Martins', + description: + 'Full Stack Developer, i love programming with python, Advocate Engineer at @BCodings', + url: 'http://betacodings.com/uses', + twitter: '@emmamartinscode', + emoji: '👩🏽‍💻', + country: '🇳🇬', + computer: 'apple', + phone: 'android', + tags: [ + 'Engineer', + 'Back End', + 'Php', + 'JavaScript', + 'Python', + 'Java', + 'Performance', + ], + }, + { + name: 'Chris Berry', + description: + 'Designer / Developer 🦄, Linux advocate, mechanical keyboard connoisseur ', + url: 'http://chrisberry.io/uses', + twitter: '@chris_berry', + emoji: '🤯', + country: '🇺🇸', + computer: 'linux', + phone: 'android', + tags: [ + 'Front End', + 'JavaScript', + 'JAMstack', + 'Gatsby', + 'CSS', + 'HTML', + 'UX', + 'Designer', + 'Blogger', + ], + }, { name: 'James Quick', description: 'Developer Advocate Engineer at @auth0 and content creator', @@ -86,21 +616,15 @@ const pages = [ }, { name: 'Federico Vitale', - description: '20yo, Self Taught FullStack Developer, Full Time. Bikes lover, Tech (obviously) enthusiast.', + description: + '20yo, Self Taught FullStack Developer, Full Time. Bikes lover, Tech (obviously) enthusiast.', url: 'https://fedevitale.dev/uses', twitter: '@fedevitaledev', emoji: '✌️', country: '🇮🇹', phone: 'iphone', computer: 'apple', - tags: [ - 'Developer', - 'Javascript', - 'Golang', - 'Rust', - 'Java', - 'Full Stack', - ] + tags: ['Developer', 'JavaScript', 'Golang', 'Rust', 'Java', 'Full Stack'], }, { name: 'Vishwasa Navada K', @@ -142,7 +666,7 @@ const pages = [ 'Blogger', 'Developer', 'Front End', - 'Remote' + 'Remote', ], }, { @@ -165,9 +689,22 @@ const pages = [ 'Musician', ], }, + { + name: 'Andy Bell', + description: + 'Educator who focuses on design, front-end development, accessibility and progressive enhancement. I teach at Piccalilli and Front-End Challenges Club', + url: 'https://hankchizljaw.com/uses', + twitter: '@hankchizljaw', + emoji: '🌶', + country: '🇬🇧', + computer: 'apple', + phone: 'iphone', + tags: ['Educator', 'Designer', 'Developer', 'CSS', 'JavaScript', 'a11y'], + }, { name: 'Sergey Lysenko', - description: 'Front-end developer, guitar player, MTB rider, snowboarder, runner.', + description: + 'Front-end developer, guitar player, MTB rider, snowboarder, runner.', url: 'https://soulwish.info/uses/', twitter: '@Soul_Wish', emoji: '🔥', @@ -190,6 +727,25 @@ const pages = [ 'Performance', ], }, + { + name: 'Shajan Jacob', + description: + 'Software Engineer, extroverted introvert, storyteller and a maker.', + url: 'https://shajanjacob.com/uses', + twitter: '@shajanjacob', + emoji: '🍀', + country: '🇮🇳', + computer: 'linux', + phone: 'android', + tags: [ + 'Software Engineer', + 'Full Stack', + 'Maker', + 'JavaScript', + 'React', + 'Node', + ], + }, { name: 'Habbat Adnan', description: @@ -212,7 +768,74 @@ const pages = [ ], }, { - + name: 'Marco Poletto', + description: 'Frontend Developer, UI engineer, Mentor', + url: 'https://poletto.dev/uses/', + twitter: '@polettoweb', + emoji: '🔥', + country: '🇮🇹', + computer: 'apple', + phone: 'android', + tags: [ + 'HTML', + 'SCSS', + 'JavaScript', + 'VueJS', + 'ReactJS', + 'GraphQL', + 'Mentor', + 'Developer', + 'Front End', + ], + }, + { + name: 'Telmo Goncalves', + description: + 'Fullstack Developer, mostly focused to ReactJS. Digital Nomad, I love travelling.', + url: 'https://telmo.online/uses', + twitter: '@telmo', + emoji: '🎙', + country: '🇵🇹', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Developer', + 'React', + 'Node', + 'CSS', + 'Full Stack', + 'Entrepreneur', + 'JavaScript', + ], + }, + { + name: 'Mark Horsell', + description: + 'Software Developer - Front-end mostly, back-end and native sometimes.', + url: 'https://markhorsell.com/uses', + twitter: '@markhorsell', + emoji: '🗺', + country: '🇬🇧', + computer: 'windows', + phone: 'android', + tags: [ + 'Developer', + 'TypeScript', + 'JavaScript', + 'React', + 'Redux', + 'Node', + 'HTML', + 'CSS', + 'SCSS', + 'Web Developer', + 'Flutter', + 'Dart', + 'C#', + 'SQL', + ], + }, + { name: 'Carter McAlister', description: 'Software Engineer, Digital Nomad, Lover of the Outdoors', url: 'https://cartermcalister.dev/uses', @@ -246,6 +869,56 @@ const pages = [ phone: 'iphone', tags: ['Developer', 'Full Stack', 'JavaScript', 'React', 'Hockey'], }, + { + name: 'Jake Jarvis', + description: + 'Front-End Web Developer, Teacher, Cat Dad, World Wide Web Surfer 🏄', + url: 'https://jarv.is/uses/', + twitter: '@jakejarvis', + emoji: '🐼', + country: '🇺🇸', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Developer', + 'Front End', + 'JavaScript', + 'React', + 'Node', + 'CSS', + 'Infosec', + 'Blogger', + 'Teacher', + ], + }, + { + name: 'Valentina Calabrese', + description: + 'Front-End Engineer 🤓, Drummer 🥁, Skateboarder 🛹 & Tech Enthusiast 📲. Sometimes I blog, too ✍🏻. And I 💖 User-centered design.', + url: 'https://valentinacalabrese.com/uses', + twitter: '@CherriePie4897', + emoji: '🥁', + country: '🇮🇹', + computer: 'apple', + phone: 'android', + tags: [ + 'Accessibility', + 'Blogger', + 'Developer', + 'Engineer', + 'Front End', + 'HTML', + 'JavaScript', + 'React', + 'Student', + 'Usability', + 'UCD', + 'UX Designer', + 'UX Engineer', + 'Web Developer', + 'Writer', + ], + }, { name: 'Jason Cory Alvernaz', description: @@ -288,17 +961,49 @@ const pages = [ 'Blogger', ], }, + { + name: 'Karl Koch', + description: + 'Design and Frontend Engineering lead @neuerenergy. Design Lead @makeacocktail. Guitar @echoes_uk.', + url: 'https://www.kejk.co/uses', + twitter: '@_kejk', + emoji: '🧘🏻‍♂️', + country: '🇬🇧', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Designer', + 'Developer', + 'Front-End', + 'Entrepreneur', + 'HTML', + 'CSS', + 'Node', + 'JavaScript', + 'Accessibility', + 'UX', + 'UI', + ], + }, { name: 'Sam Cross', description: '"Developer", IT student, frequent traveller by coach, addicted to music.', - url: 'http://sam-cross.github.io/uses', - twitter: '@samcrxss', + url: 'https://sam-cross.github.io/#/uses', emoji: '🎵', country: '🇬🇧', computer: 'windows', phone: 'android', - tags: ['Developer', 'JavaScript', 'React', 'Node', 'CSS'], + tags: [ + 'Developer', + 'JavaScript', + 'React', + 'Node', + 'HTML', + 'CSS', + 'Web Developer', + 'Musician', + ], }, { name: 'Praveen Kumar Purushothaman', @@ -325,25 +1030,14 @@ const pages = [ }, { name: 'Rene Pot', - // Short description description: 'Developer Evangelist, JavaScript Developer, Cross-Platform App Developer and gamer', - // URL to your /uses page url: 'http://renepot.com/uses', twitter: '@wraldpyk', - // An emoji that describes you emoji: '🎮', - // emoji of your country's flag country: '🇳🇱', - // ONE of: apple, windows or linux computer: 'apple', - // iphone or android phone: 'iphone', - // Tags - You can add your own, but please keep it to one word. "Social vape entrepreneur influencer denver" isn't a tag. - - // Dev Tags: Engineer, Developer, Designer, Front End, Back End, Full Stack, - // Other: Tags: Entrepreneur, Teacher, Podcaster, YouTuber, Blogger, Speaker, - // Language Tags: JavaScript, PHP, Rails, Ruby, TypeScript, React, Vue, Node tags: [ 'Developer', 'JavaScript', @@ -384,9 +1078,47 @@ const pages = [ ], }, { - name: 'Tiffany White', + name: 'Dave Mullen Jnr', description: - 'Frontend dev, blogger, podcaster, herder of cats', + 'Designer, photographer, developer, multi-instrumentalist, chess player, aspiring minimalist, environmentally friendly.', + url: 'https://davemullenjnr.co.uk/uses', + twitter: '@davemullenjnr', + emoji: '🌱', + country: '🇬🇧', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Designer', + 'Photographer', + 'Developer', + 'JavaScript', + 'React', + 'Gatsby', + 'CSS', + ], + }, + { + name: 'Josh Buchea', + description: 'Software Engineer, Open Source Contributor', + url: 'https://joshbuchea.com/uses', + twitter: '@joshbuchea', + emoji: '✨', + country: '🇺🇸', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Engineer', + 'JavaScript', + 'React Native', + 'React', + 'GatsbyJS', + 'Entrepreneur', + 'Blogger', + ], + }, + { + name: 'Tiffany White', + description: 'Frontend dev, blogger, podcaster, herder of cats', url: 'https://tiffanywhite.dev/uses/', twitter: '@tiffanywhitedev', emoji: '🤨', @@ -445,6 +1177,27 @@ const pages = [ 'Mentor', ], }, + { + name: 'Darlene Zouras', + description: + 'Front-End and UI/UX Developer, Accessibility advocate, JAMStack fan, working in the marketing and entertainment industry', + url: 'https://darzouras.com/uses/', + twitter: '@darzouras', + emoji: '🤟', + country: '🇺🇸', + phone: 'iphone', + computer: 'apple', + tags: [ + 'Developer', + 'Front End', + 'UX', + 'JAMstack', + 'CSS', + 'HTML', + 'JavaScript', + 'Accessibility', + ], + }, { name: 'Glenn Reyes', description: @@ -467,6 +1220,27 @@ const pages = [ 'Speaker', ], }, + { + name: 'Simon Stenbæk', + description: 'Helicopter pilot, web developer', + url: 'https://sstenbaek.dk/uses', + twitter: '@sstenb_k', + emoji: '🚁', + country: '🇩🇰', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Developer', + 'Full Stack', + 'Entrepreneur', + 'Pilot', + 'Node', + 'GraphQL', + 'Styled Components', + 'React', + 'JavaScript', + ], + }, { name: 'Adam Jahnke', description: @@ -498,7 +1272,41 @@ const pages = [ computer: 'apple', phone: 'iphone', twitter: '@stolinski', - tags: ['Developer', 'Front End', 'Entrepreneur', 'Teacher', 'JavaScript', 'Youtuber', 'React', 'CSS', 'TypeScript', 'GraphQL'], + tags: [ + 'Developer', + 'Front End', + 'Entrepreneur', + 'Teacher', + 'JavaScript', + 'Youtuber', + 'React', + 'CSS', + 'TypeScript', + 'GraphQL', + ], + }, + { + name: 'Gabriel Wilkes', + description: + 'Full-stack developer who loves learning new things, American 10 years in Japan, soon back to the US', + url: 'https://azul.technology/uses/', + twitter: '@gabriel_wilkes', + emoji: '🔵', + country: '🇯🇵', + computer: 'apple', + phone: 'android', + tags: [ + 'Developer', + 'Full Stack', + 'Node', + 'JavaScript', + 'GraphQL', + 'Vue', + 'JAMstack', + 'Serverless', + 'AWS', + 'Wordpress', + ], }, { name: 'Anton Andrésen', @@ -574,6 +1382,51 @@ const pages = [ 'Golang', ], }, + { + name: 'Rikin Patel', + description: 'Experienced Front-end developer, Passionate about Javascript', + url: 'https://patelrikin.com/#uses', + twitter: '@rikinpatel', + emoji: '💻', + country: '🇺🇸', + computer: 'windows', + phone: 'iphone', + tags: [ + 'JavaScript', + 'TypeScript', + 'Developer', + 'React', + 'Angular', + 'Node', + 'CSS', + 'Web Developer', + 'UI Lead', + ], + }, + { + name: 'Joris Hens', + description: + 'Web development teacher, Security and hacking enthousiast, Cook.', + url: 'https://www.goodbytes.be/uses', + twitter: '@goodbytes', + emoji: '👨🏽‍🍳', + country: '🇧🇪', + computer: 'apple', + phone: 'android', + tags: [ + 'Developer', + 'Full Stack', + 'Coach', + 'Mentor', + 'PHP', + 'JavaScript', + 'VueJS', + 'Node', + 'CSS', + 'Laravel', + 'MongoDB', + ], + }, { name: 'Lauro Silva', description: 'Software Engineer and Technical Writer', @@ -592,6 +1445,26 @@ const pages = [ 'Blogger', ], }, + { + name: 'Tony Cimaglia', + description: 'Restaurant Veteran turned Developer.', + url: 'https://www.tonycimaglia.com/uses/', + twitter: '@cimaglia_tony', + emoji: '☕', + country: '🇺🇸', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Developer', + 'Full Stack', + 'JavaScript', + 'React', + 'HTML', + 'CSS', + 'C#', + '.NET', + ], + }, { name: 'Nuno Maduro', description: 'Software engineer, Open Source contributor, Speaker', @@ -683,6 +1556,18 @@ const pages = [ 'Back End', ], }, + { + name: 'Michael Knepprath', + description: + 'Pokémon-obsessed Software Engineer & Designer. Twitter bots are my jam.', + url: 'https://mknepprath.com/uses', + twitter: '@mknepprath', + emoji: '🥳', + country: '🇺🇸', + computer: 'apple', + phone: 'iphone', + tags: ['Developer', 'Designer', 'Front End', 'JavaScript', 'React', 'Bots'], + }, { name: 'Brad Garropy', description: @@ -704,6 +1589,27 @@ const pages = [ 'Python', ], }, + { + name: 'Bruno Brito', + description: + 'Freelance Web Developer, Content Creator, Digital Marketing teacher', + url: 'https://brunobrito.pt/uses', + twitter: '@the_bammer', + emoji: '🔥', + country: '🇵🇹', + computer: 'apple', + phone: 'android', + tags: [ + 'Developer', + 'Front End', + 'Blogger', + 'Teacher', + 'JavaScript', + 'React', + 'Gatsby', + 'CSS', + ], + }, { name: 'Abdisalan Mohamud', description: 'Software Engineer, blogger, lifetime learner', @@ -724,6 +1630,27 @@ const pages = [ 'AWS', ], }, + { + name: 'Roy Tang', + description: + 'Programmer, engineer, scientist, critic, gamer, dreamer, and kid-at-heart.', + url: 'https://roytang.net/about/uses/', + twitter: '@roytang', + emoji: '', + country: '🇵🇭', + computer: 'windows', + phone: 'android', + tags: [ + 'Developer', + 'Full Stack', + 'Blogger', + 'Python', + 'JavaScript', + 'HTML', + 'CSS', + 'SQL', + ], + }, { name: 'Josh Barker', description: @@ -736,6 +1663,17 @@ const pages = [ phone: 'iphone', tags: ['Developer', 'Front End', 'JavaScript'], }, + { + name: 'David Perkins', + description: 'Dad, Designer, Developer, Dave, Keyboard enthusiast', + url: 'https://prkns.me/uses', + twitter: '@perki', + emoji: '🥔', + country: '🇬🇧', + computer: 'apple', + phone: 'android', + tags: ['Designer', 'Front end', 'Sass', 'CSS', 'Gatsby', 'JavaScript'], + }, { name: 'Aaron Dunphy', description: 'Full Stack Developer, Coffee Lover and Photo Taker', @@ -754,6 +1692,28 @@ const pages = [ 'JavaScript', ], }, + { + name: 'Jason Raimondi', + description: 'Full Stack Developer', + url: 'https://jasonraimondi.com/uses', + twitter: '@jsonmamondi', + emoji: '🚀', + country: '🇺🇸', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Full Stack', + 'Front End', + 'Back End', + 'Devops', + 'JavaScript', + 'TypeScript', + 'PHP', + 'Ruby', + 'Golang', + 'Docker', + ], + }, { name: 'Mohamed Benhida', description: 'Web Developer, Open source contributor.', @@ -786,18 +1746,10 @@ const pages = [ country: '🇺🇸', computer: 'linux', phone: 'android', - tags: [ - 'Developer', - 'Back End', - 'Speaker', - 'Writer', - 'JavaScript', - 'Node', - ], + tags: ['Developer', 'Back End', 'Speaker', 'Writer', 'JavaScript', 'Node'], }, { name: 'Andrew McCombe', - // Short description description: 'Experienced full stack web developer with a passion for testing.', url: 'https://www.euperia.com/uses', @@ -871,6 +1823,46 @@ const pages = [ phone: 'iphone', tags: ['Full Stack', 'Developer', 'Front End', 'JavaScript', 'React'], }, + { + name: 'Keith Wagner', + description: + 'Experienced full stack developer. Always trying to learn new and better ways of doing things.', + url: 'https://kpwags.com/uses', + twitter: '@kpwags', + emoji: '👨‍💻', + country: '🇺🇸', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Developer', + 'Full Stack', + 'JavaScript', + 'React', + 'Node', + 'CSS', + 'C#', + '.NET', + ], + }, + { + name: 'Chuck Munson', + description: + 'Web developer, blogger, writer, journalist, photographer, librarian, Minecraft addict, cooking show fanatic', + url: 'https://www.breadandrosesweb.com/uses/', + twitter: '@ChuckMunson2', + emoji: '⛏️', + country: '🇺🇸', + computer: 'windows', + phone: 'iphone', + tags: [ + 'CSS', + 'Javascript', + 'WordPress', + 'Blogger', + 'Web Developer', + 'Full Stack', + ], + }, { name: "David O'Trakoun", description: 'Software Engineer', @@ -897,13 +1889,43 @@ const pages = [ { name: 'Michael Hoffmann', description: 'Freelance Software Engineer', - url: 'https://www.mokkapps.de/blog/my-development-setup/', + url: 'https://www.mokkapps.de/uses', twitter: '@mokkapps', emoji: '🍺', country: '🇩🇪', computer: 'apple', phone: 'iphone', - tags: ['Developer', 'Blogger', 'Angular'], + tags: [ + 'Entrepreneur', + 'Developer', + 'Blogger', + 'Angular', + 'JavaScript', + 'Full Stack', + 'Front End', + ], + }, + { + name: 'Austin Gil', + description: 'Some dude that writes code.', + url: 'https://stegosource.com/uses/', + twitter: '@stegosource', + emoji: '🍕', + country: '🇺🇸', + computer: 'linux', + phone: 'android', + tags: [ + 'Developer', + 'Full Stack', + 'Entrepreneur', + 'Teacher', + 'YouTuber', + 'JavaScript', + 'Vue', + 'Node', + 'GraphQL', + 'CSS', + ], }, { name: 'Michael Le', @@ -926,6 +1948,32 @@ const pages = [ 'Vue', ], }, + { + name: 'Sergey Panay', + description: 'Front End developer. Productivity nerd.', + url: 'https://panay.dev/uses', + twitter: '@sergey_panay', + emoji: '🎃', + country: '🇷🇺', + computer: 'apple', + phone: 'android', + tags: [ + 'Developer', + 'Front End', + 'Entrepreneur', + 'JavaScript', + 'Typescript', + 'Angular', + 'RxJS', + 'Vue', + 'CSS', + 'HTML', + 'SCSS', + 'Tailwind', + 'Remote', + 'Docker', + ], + }, { name: 'Sil van Diepen', description: 'Creative Developer', @@ -972,6 +2020,28 @@ const pages = [ 'Devtools', ], }, + { + name: 'Dale French', + description: + 'Full Stack Developer from South Africa. Skateboarder. Front End Enthusiast.', + url: 'https://dalefrench.dev/uses', + twitter: '@dalefrench0', + emoji: '🏄🏻‍♂️', + country: '🇿🇦', + computer: 'apple', + phone: 'android', + tags: [ + 'Full Stack', + 'Front End', + 'TypeScript', + 'JavaScript', + 'Design Systems', + 'React', + 'React Native', + 'Node', + 'Remote', + ], + }, { name: 'Timothy Miller', description: 'Web Designer/Developer for hire. Wears lots of hats.', @@ -994,6 +2064,18 @@ const pages = [ 'Blogger', ], }, + { + name: 'Caleb Ukle', + description: + "I'm a software developer, technology enthusiast, and simply enjoy learning new things.", + url: 'https://calebukle.com/uses', + twitter: '@CU_Galaxy', + emoji: '🤔', + country: '🇺🇸', + computer: 'apple', + phone: 'iphone', + tags: ['Full Stack', '.NET', 'C#', 'Angular', 'TypeScript', 'Blogger'], + }, { name: 'Christopher Hranj', description: 'Software Engineer, Blogger, Musician, Ultimate player.', @@ -1119,6 +2201,54 @@ const pages = [ 'Blogger', ], }, + { + name: 'Alba Silvente', + description: + 'Front-end developer, Vue & TailwindCSS lover. Hip Hop & Afro house dancer.', + url: 'https://dawntraoz.com/uses', + twitter: '@dawntraoz', + emoji: '💃', + country: '🇪🇸', + computer: 'windows', + phone: 'android', + tags: [ + 'Front End', + 'Engineer', + 'SCSS', + 'Vue', + 'AMP', + 'TailwindCSS', + 'Performance', + 'PWA', + 'Remote', + 'Zeplin', + ], + }, + { + name: 'Alberto Fortes', + description: + 'Senior Front-end developer with strong aesthetic sense. Building cool websites and apps as Front-end Team lead at Avallain.', + url: 'https://albertofortes.com/uses/', + twitter: '@albertofortes', + emoji: '👪', + country: '🇪🇸', + computer: 'apple', + phone: 'android', + tags: [ + 'Front End', + 'Developer', + 'JavaScript', + 'CSS', + 'SCSS', + 'Less ', + 'HTML5', + 'React', + 'Gatsby', + 'GraphQL', + 'Remote', + 'Zeplin', + ], + }, { name: 'Josh Manders', description: 'Full Snack Developer and Indie Maker', @@ -1160,6 +2290,25 @@ const pages = [ phone: 'iphone', tags: ['Engineer', 'YouTuber', 'Blogger', 'Front End'], }, + { + name: 'Josh Moore', + description: + 'Self-taught full-stack web dev with a passion for open-source, privacy, & security.', + url: 'https://jmoore.dev/redesign/uses', + twitter: '@tycrek', + emoji: '😜', + country: '🇨🇦', + computer: 'linux', + phone: 'android', + tags: [ + 'Web Development', + 'Front End', + 'Back End', + 'Full Stack', + 'Node', + 'JavaScript', + ], + }, { name: 'James Mills', description: @@ -1172,6 +2321,25 @@ const pages = [ phone: 'iphone', tags: ['Developer', 'Blogger', 'Back End', 'PHP', 'Laravel', 'Treeware'], }, + { + name: 'Mohammad Dohadwala', + description: + 'Hi, I am a Javascript Full Stack Web Developer from Dubai, currently studying Computer Science.', + url: 'https://dohad.dev/uses', + twitter: '@mohammaddohad', + emoji: '🙃', + country: '🇦🇪', + computer: 'windows', + phone: 'iphone', + tags: [ + 'JavaScript', + 'React', + 'React Native', + 'Full Stack', + 'Serverless', + 'AWS', + ], + }, { name: 'Jeffrey Way', description: 'Laracasts Author', @@ -1296,8 +2464,8 @@ const pages = [ { name: 'Hugo Di Francesco', description: - "JavaScript developer, blogger at codewithhugo.com, author of 'Professional JavaScript' with Packt.", - url: 'https://codewithhugo.com/uses/', + "JavaScript developer, blogger at codewithhugo.com, co-author of 'Professional JavaScript' with Packt.", + url: 'https://codewithhugo.com/uses', twitter: '@hugo__df', emoji: '👓', country: '🇬🇧', @@ -1397,7 +2565,7 @@ const pages = [ 'CSS', 'Full Stack', 'HTML', - 'Web Development' + 'Web Development', ], }, { @@ -1421,6 +2589,48 @@ const pages = [ 'Docker', ], }, + { + name: 'David Petringa', + description: + 'A web developer who very much likes working with Laravel and Vuejs. My side Hustle is blogging.', + url: 'https://david.dukesnuz.com/uses', + twitter: '@dukesnuz', + emoji: '🤙', + country: '🇺🇸', + computer: 'windows', + phone: 'iphone', + tags: [ + 'Developer', + 'Front End', + 'Back End', + 'HTML', + 'CSS', + 'PHP', + 'Laravel', + 'JavaScript', + 'Vue', + 'MySQL', + 'Entrepreneur', + ], + }, + { + name: 'Mike Gunderloy', + description: 'Full-stack developer and dilettante', + url: 'https://afreshcup.com/uses/', + emoji: '☕', + country: '🇺🇸', + computer: 'apple', + phone: 'android', + tags: [ + 'Full Stack', + 'Developer', + 'Blogger', + 'Writer', + 'Rails', + 'AWS', + 'Docker', + ], + }, { name: 'Roman Husar', description: 'Tinkering, all the time.', @@ -1441,25 +2651,14 @@ const pages = [ }, { name: 'Stephen Senkomago Musoke', - // Short description description: 'Software Engineer, eHealth Technologist, PHP Lover by night, Muganda, Goat Meat for Life, Coffee Drinker', - // URL to your /uses page url: 'https://ssmusoke.com/uses', twitter: '@ssmusoke', - // An emoji that describes you emoji: '🔥', - // emoji of your country's flag country: '🇺🇬', - // ONE of: apple, windows or linux computer: 'apple', - // iphone or android phone: 'android', - // Tags - You can add your own, but please keep it to one word. "Social vape entrepreneur influencer denver" isn't a tag. - - // Dev Tags: Engineer, Developer, Designer, Front End, Back End, Full Stack, - // Other: Tags: Entrepreneur, Teacher, Podcaster, YouTuber, Blogger, Speaker, - // Language Tags: JavaScript, PHP, Rails, Ruby, TypeScript, React, Vue, Node tags: ['Developer', 'Engineer', 'PHP', 'Java', 'OpenMRS', 'HTML', 'CSS'], }, { @@ -1522,9 +2721,30 @@ const pages = [ ], }, { - name: 'José Manuel Lucas', + name: 'Marc Littlemore', description: - 'Professional Frontend Engineer - Amateur musician', + 'Engineering Team Lead @ BBC, Node.js fan, course creator, entrepreneur, ex-videogame developer, public speaker, and sepsis survivor.', + url: 'https://marclittlemore.com/uses', + twitter: '@marclittlemore', + emoji: '🎉', + country: '🇬🇧', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Developer', + 'Entrepreneur', + 'Node', + 'JavaScript', + 'React', + 'Gatsby', + 'YouTuber', + 'Blogger', + 'Speaker', + ], + }, + { + name: 'José Manuel Lucas', + description: 'Professional Frontend Engineer - Amateur musician', url: 'https://jmlweb.es/blog/2020/uses/', twitter: '@jmlweb', emoji: '🤘', @@ -1542,6 +2762,25 @@ const pages = [ 'Music', ], }, + { + name: 'Dao Huy Tuan', + description: 'FrontEnd Engineer, Blogger, Vimmer', + url: 'https://daohuytuan.com/uses/', + twitter: '@tuandaohuy', + emoji: '🚀', + country: '🇻🇳', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Engineer', + 'FrontEnd', + 'Blogger', + 'JavaScript', + 'React', + 'Python', + 'Golang', + ], + }, { name: 'Georgi Yanev', description: 'Software Engineer, FPV Drone Pilot, Blogger, YouTuber', @@ -1566,6 +2805,32 @@ const pages = [ 'Developer', ], }, + { + name: 'Mark Tse', + description: 'A back-end developer who likes to dabble in the front-end.', + url: 'https://neverendingqs.com/uses/', + twitter: '@neverendingqs', + emoji: '👻', + country: '🇨🇦', + computer: 'linux', + phone: 'android', + tags: [ + 'AWS', + 'Back End', + 'C#', + 'CSS', + 'Developer', + 'Full Stack', + 'Front End', + 'HTML', + 'JavaScript', + 'Node', + 'Python', + 'Serverless', + 'SQL', + 'Vue', + ], + }, { name: 'Karl Horky', description: 'Founder, Teacher at https://upleveled.io', @@ -1592,6 +2857,27 @@ const pages = [ 'GraphQL', ], }, + { + name: 'Zoran Panev', + description: 'Web developer', + url: 'https://gist.github.com/8f08557764711afbf82b75ac0ce61e79.git', + twitter: '@Zoran_Panev', + emoji: '🛡', + country: '🇲🇰', + computer: 'linux', + phone: 'android', + tags: [ + 'Full Stack', + 'Developer', + 'Web', + 'Laravel', + 'Symfony', + 'Docker', + 'JavaScript', + 'React', + 'Kali Linux', + ], + }, { name: 'Josh Farrant', description: @@ -1613,30 +2899,6 @@ const pages = [ 'Open Source', ], }, - { - name: 'Pedro Assunção', - description: 'Senior Fullstack Software Developer, Tutorial Maker, Blogger', - url: 'https://pedroassuncao.com/pages/uses', - twitter: '@nocivus', - emoji: '💻', - country: '🇵🇹', - computer: 'apple', - phone: 'android', - tags: [ - 'Engineer', - 'Full Stack', - 'Developer', - 'Teacher', - 'YouTuber', - 'Blogger', - 'Ruby on Rails', - 'Elixir', - 'Phoenix', - 'Erlang', - 'React', - 'AWS', - ], - }, { name: 'Steven van Loef', description: 'Web Developer, App Developer', @@ -1685,9 +2947,30 @@ const pages = [ 'GatsbyJs', ], }, + { + name: 'Duncan McClean', + description: 'Web Developer working with Laravel & Statamic', + url: 'https://duncanm.dev/uses', + twitter: '@damcclean', + emoji: '🎉', + country: '🇬🇧', + computer: 'apple', + phone: 'android', + tags: [ + 'Backend', + 'Frontend', + 'Statamic', + 'Laravel', + 'PHP', + 'Vue', + 'Nuxt', + 'TailwindCSS', + ], + }, { name: 'Ricard Torres', - description: 'Senior Front-end Software Engineer from Barcelona, Haidong Gumdo Instructor, street photographer, TV addict, Boston Red Sox fan...', + description: + 'Senior Front-end Software Engineer from Barcelona, Haidong Gumdo Instructor, street photographer, TV addict, Boston Red Sox fan...', url: 'https://php.quicoto.com/uses/', twitter: '@ricard_dev', emoji: '🌝', @@ -1706,6 +2989,47 @@ const pages = [ 'Vue', ], }, + { + name: 'Matthew Rebehn', + description: 'Proud Dad and Developer', + url: 'https://mattaz.com/uses', + twitter: '@MRebehn', + emoji: '🤘', + country: '🇺🇸', + computer: 'linux', + phone: 'android', + tags: [ + 'Developer', + 'Front End', + 'HTML', + 'CSS', + 'JavaScript', + 'React', + 'GatsbyJs', + 'Svelte', + ], + }, + { + name: 'Isaac Weber', + description: 'Full stack, GraphQL enthusiast', + url: 'https://www.webdevike.com/uses', + twitter: '@webdevike', + emoji: '🤓', + country: '🇺🇸', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Developer', + 'Front End', + 'Full Stack', + 'GraphQL', + 'HTML', + 'CSS', + 'JavaScript', + 'Vue', + 'Node', + ], + }, { name: 'Bezael Pérez', description: 'Front-end Developer passionate. Trainer & speaker', @@ -1953,6 +3277,26 @@ const pages = [ 'JavaScript', ], }, + { + name: 'Jorge Calle', + description: + 'Hello world! I am a Software Engineer and a Javascript developer from Sahagún (CO)', + url: 'https://jorgecalle.co/uses', + twitter: '@jorcalle11', + emoji: '👨‍💻', + country: '🇨🇴', + computer: 'linux', + phone: 'android', + tags: [ + 'Developer', + 'JavaScript', + 'Full Stack', + 'Node', + 'React', + 'Firebase', + 'GraphQL', + ], + }, { name: 'José Carlos Correa', description: @@ -2025,7 +3369,6 @@ const pages = [ 'YouTuber', 'JavaScript', 'TypeScript', - 'Node', 'React', 'Node', 'CSS', @@ -2074,20 +3417,15 @@ const pages = [ }, { name: 'Dany Paredes', - description: 'I was a .NET guy, my last years ❤️ { #js & #sass } and play[ #react #vue #angular #sveltejs]', + description: + 'I was a .NET guy, my last years ❤️ { #js & #sass } and play[ #react #vue #angular #sveltejs]', url: 'https://danywalls.com/uses', twitter: '@danywalls', emoji: '🏀', country: '🇩🇴', computer: 'linux', phone: 'iphone', - tags: [ - 'Developer', - '.NET', - 'Typescript', - 'Javascript', - 'Sass' - ], + tags: ['Developer', '.NET', 'Typescript', 'JavaScript', 'Sass'], }, { name: 'Thomas Weibenfalk', @@ -2110,9 +3448,32 @@ const pages = [ ], }, { - name: 'Chris Burgin', + name: 'Julio Lozovei', description: - 'Frontend Software Engineer', + 'Front-end bugs developer, writer/speaker and amateur musician from Brazil 🤘', + url: 'https://jlozovei.dev/uses/', + twitter: '@juliolozovei', + emoji: '💈', + country: '🇧🇷', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Front End', + 'HTML', + 'CSS', + 'JavaScript', + 'Vue', + 'React', + 'WordPress', + 'Writer', + 'Speaker', + 'Performance', + 'Accessibility', + ], + }, + { + name: 'Chris Burgin', + description: 'Frontend Software Engineer', url: 'https://chrisburgin.me/uses', twitter: '@chrisburgin95', emoji: '🧙🏼‍♂️', @@ -2133,8 +3494,7 @@ const pages = [ }, { name: 'Shiveen Pandita', - description: - 'Fullstack developer and blogger from Sydney', + description: 'Fullstack developer and blogger from Sydney', url: 'https://shiveenp.com/uses/', twitter: '@shavzer', emoji: '🧙🏽', @@ -2152,7 +3512,8 @@ const pages = [ }, { name: 'David Leuliette', - description: 'Freelance React Native developer and bootcamp instructor specializing in cross-platform application.', + description: + 'Freelance React Native developer and bootcamp instructor specializing in cross-platform application.', url: 'https://davidl.fr/uses', twitter: '@flexbox_', emoji: '⚡', @@ -2175,7 +3536,8 @@ const pages = [ }, { name: 'Dave Berning', - description: 'Developer, author, rocker, Nintendo enthusiast. I also co-organize the CodePen Cincinnati Meetups.', + description: + 'Developer, author, rocker, Nintendo enthusiast. I also co-organize the CodePen Cincinnati Meetups.', url: 'https://daveberning.io/uses/', twitter: '@daveberning', emoji: '🦄', @@ -2194,18 +3556,32 @@ const pages = [ }, { name: 'Jan-Lukas Else', - description: - 'Computer Science Student, Developer & Blogger from Germany', + description: 'Computer Science Student, Developer & Blogger from Germany', url: 'https://jlelse.dev/uses/', twitter: '@jlelse', emoji: '🤓', country: '🇩🇪', computer: 'linux', phone: 'android', + tags: ['Student', 'Developer', 'Blogger'], + }, + { + name: 'Will Presley', + description: 'Professional Web Dev & SysAdmin from Ohio, USA', + url: 'https://willpresley.com/uses/', + twitter: '@cryptecks', + emoji: '🦄', + country: '🇺🇸', + computer: 'windows', + phone: 'android', tags: [ - 'Student', + 'Windows', 'Developer', 'Blogger', + 'JavaScript', + 'PHP', + 'CSS', + 'SCSS', ], }, { @@ -2229,65 +3605,103 @@ const pages = [ ], }, { - name: 'Eric Oyanadel', + name: 'Silvestre Vivo', description: - 'Artist - Developer - Musician', + 'Full Stack developer, before architect and flamenco guitar player.', + url: 'https://silvestrevivo.github.io/uses', + twitter: '@silvestrevivo', + emoji: '💻', + country: '🇳🇱', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Web Development', + 'Front End', + 'Back End', + 'Full Stack', + 'React', + 'Svelte', + 'Node', + 'TypeScript', + 'Rust', + 'GraphQL', + 'CSS', + ], + }, + { + name: 'Josef Aidt', + description: 'JavaScript and Garlic Bread connoisseur', + url: 'https://josefaidt.dev/uses', + twitter: '@josefaidt', + emoji: '🧄', + country: '🇺🇸', + computer: 'apple', + phone: 'android', + tags: ['Full Stack', 'React', 'Node', 'GraphQL', 'Gatsby'], + }, + { + name: 'Eric Oyanadel', + description: 'Artist - Developer - Musician', url: 'https://www.oyanadel.com/uses/', twitter: '@EricOyanadel', emoji: '🌻', country: '🇨🇱', computer: 'apple', phone: 'iphone', - tags: [ - 'Javascript', - 'React', - 'Node', - 'Design', - 'Full Stack', - 'Writer', - ], + tags: ['JavaScript', 'React', 'Node', 'Design', 'Full Stack', 'Writer'], }, { name: 'Usman Khwaja', - description: - 'Front end engineer, Jamstack developer', + description: 'Front end engineer, Jamstack developer', url: 'https://usmankhwaja.com/uses', twitter: '@numbfall', emoji: '⛵', country: '🇵🇰', computer: 'windows', phone: 'android', + tags: ['Developer', 'Engineer', 'Jamstack', 'JavaScript', 'AMP', 'CSS'], + }, + { + name: 'Abdessalam Benharira', + description: 'JavaScript developer, UX/UI design and tech enthusiast', + url: 'https://abdessalam-benharira.me/uses', + twitter: '@abdessalam_b98', + emoji: '🤔', + country: '🇫🇷', + computer: 'apple', + phone: 'android', tags: [ 'Developer', - 'Engineer', - 'Jamstack', + 'Blogger', + 'Full Stack', 'JavaScript', - 'AMP', - 'CSS', + 'Node', + 'Design', + 'JAMstack', + 'GraphQL', ], }, { - name: "Thomas Large", - description: - "My name is Tom! I write code", - url: "https://tomlarge.dev/uses", - emoji: " 👨‍💻", - country: "🏴󠁧󠁢󠁥󠁮󠁧󠁿", - computer: "apple", - phone: "iphone", + name: 'Thomas Large', + description: 'My name is Tom! I write code', + url: 'https://tomlarge.dev/uses', + emoji: ' 👨‍💻', + country: '🏴󠁧󠁢󠁥󠁮󠁧󠁿', + computer: 'apple', + phone: 'iphone', tags: [ - "Developer", - "Full Stack", - "Ruby on Rails", - "JavaScript", - "React", - "React Native", - "TypeScript", - "WordPress", - "DevOps", - "Node", - "GraphQL" - ] + 'Developer', + 'Full Stack', + 'Ruby on Rails', + 'JavaScript', + 'React', + 'React Native', + 'TypeScript', + 'WordPress', + 'DevOps', + 'Node', + 'GraphQL', + ], }, { name: 'Amit Merchant', @@ -2313,7 +3727,7 @@ const pages = [ { name: 'Jesse James Burton', description: - 'Software Developing Yogi from Alberta, Canada. Lets build the internet together.', + 'Software Developing Yogi from Alberta, Canada. Lets build the internet together.', url: 'https://burtonmediainc.com/uses', twitter: '@burtonmedia', emoji: '🙏', @@ -2333,7 +3747,7 @@ const pages = [ }, { name: 'Junaid Qadir', - description:'A Full Stack #Laravel Developer', + description: 'A Full Stack #Laravel Developer', url: 'https://junaidqadir.com/uses', twitter: '@junaidqadirb', emoji: '⌨', @@ -2371,7 +3785,7 @@ const pages = [ 'Node', 'CSS', 'Ruby', - 'Testing' + 'Testing', ], }, { @@ -2415,6 +3829,67 @@ const pages = [ phone: 'android', tags: ['Software Engineer', 'Laravel', 'Vue', 'WordPress'], }, + { + name: 'Wes Baker', + description: + 'Team Lead, Software Engineer, Board/Miniature/RPG Gamer, Miniature Painter, 3D Printer, Disney fanatic', + url: 'https://wesbaker.com/uses', + twitter: '@wesbaker', + emoji: '🏋️‍♂️', + country: '🇺🇸', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Team Lead', + 'Software Engineer', + 'Front End', + 'Back End', + 'Ruby on Rails', + 'React', + 'JavaScript', + 'Serverless', + ], + }, + { + name: 'Roland Szabo', + description: 'Team Lead, ML Engineer, Board Gamer', + url: 'https://rolisz.ro/uses', + twitter: '@rolisz', + emoji: '😀', + country: '🇷🇴', + computer: 'linux', + phone: 'android', + tags: [ + 'Team Lead', + 'Software Engineer', + 'Machine Learning', + 'Back End', + 'Python', + 'Flask', + 'Tensorflow', + 'Spark', + 'Blogger', + ], + }, + { + name: 'Matheus Almeida S. Anjos', + description: + 'Passionate about programming, engaged with Javascript and Golang lover.', + url: 'https://matalmeida.netlify.com/uses/', + twitter: '@matalmeida', + emoji: '🕶️', + country: '🇧🇷', + computer: 'apple', + phone: 'android', + tags: [ + 'Programmer', + 'Back End', + 'JavaScript', + 'TypeScript', + 'Node', + 'Golang', + ], + }, { name: 'Alejandro G. Anglada', description: @@ -2451,6 +3926,50 @@ const pages = [ phone: 'iphone', tags: ['JavaScript', 'Developer', 'TypeScript', 'React', 'Rust', 'Node'], }, + { + name: 'Frank Bültge', + description: + 'Alpinist, Cyclist, Optimist. I develop, support solutions, primarily with SAP at ZEISS Group and I make WordPress-based solutions at the Inpsyde', + url: 'https://bueltge.de/uses/', + twitter: '@bueltge', + emoji: '🚲', + country: '🇩🇪', + computer: 'linux', + phone: 'android', + tags: [ + 'Engineer', + 'Developer', + 'SAP ERP', + 'WordPress', + 'CSS', + 'PHP', + 'HTML', + 'Web Development', + ], + }, + { + name: 'Sangam Kumar', + description: '(☕) => { 👨‍💻 }; git checkout hackerrank', + url: 'https://www.sangam.dev/uses', + twitter: '@meetsangamcse', + emoji: '🤖', + country: '🇮🇳', + computer: 'apple', + phone: 'android', + tags: [ + 'Developer', + 'Software Engineer', + 'Front End', + 'Back End', + 'Full Stack', + 'Python', + 'Ruby On Rails', + 'JavaScript', + 'React', + 'Flutter', + 'Traveler', + ], + }, { name: 'Marcus Obst', description: 'Webdeveloper, Music Lover', @@ -2461,6 +3980,28 @@ const pages = [ phone: 'iphone', tags: ['Developer', 'Full Stack', 'PHP', 'JavaScript', 'CSS', 'Vue'], }, + { + name: 'Max Schmeling', + description: + 'CTO @Clipisode. ❤️ web dev/mobile/open source. Husband, father, drummer. #Royals and #Chiefs fan.', + url: 'https://maxschmeling.me/uses', + twitter: '@maxschmeling', + emoji: '⛲️', + country: '🇺🇸', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Developer', + 'Full Stack', + 'JavaScript', + 'React', + 'React Native', + 'Node', + 'CSS', + 'Ruby', + 'Ruby on Rails', + ], + }, { name: 'Pawel Grzybek', description: 'Software Engineer', @@ -2504,6 +4045,29 @@ const pages = [ 'CSS', ], }, + { + name: 'Vince Picone', + description: 'Building design systems at IBM', + url: 'https://vincepic.one/uses', + twitter: '@TheElodin', + emoji: '🦩', + country: '🇺🇸', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Design Systems', + 'JavaScript', + 'Developer', + 'Full Stack', + 'React', + 'Node', + 'CSS', + 'Performance', + 'Accessibility', + 'Gatsby', + 'Web development', + ], + }, { name: 'Ben Congdon', description: 'Golang, Python, Rust. Runs in the Cloud.', @@ -2569,6 +4133,27 @@ const pages = [ 'Entrepreneur', ], }, + { + name: 'Ajay Karwal', + description: 'A designer, developer and UX guy from Buckingham, UK.', + url: 'https://ajaykarwal.com/uses/', + twitter: '@ajaykarwal', + emoji: '👨‍💻', + country: '🇬🇧', + computer: 'apple', + phone: 'iphone', + tags: [ + 'UI', + 'UX', + 'Developer', + 'Designer', + 'JavaScript', + 'React', + 'CSS', + 'HTML', + 'Frontend', + ], + }, { name: 'David Vives', description: @@ -2584,12 +4169,15 @@ const pages = [ 'Full Stack', 'JavaScript', 'TypeScript', + 'NativeScript', 'React', 'Angular', 'Vue', + 'Node', 'C#', '.NET Core', - '.NET' + '.NET', + 'Python', ], }, { @@ -2612,10 +4200,29 @@ const pages = [ 'CSS', ], }, + { + name: 'Rob Warner', + description: 'Software Architect, Developer, Father.', + url: 'https://grailbox.com/uses/', + emoji: '🏈', + country: '🇺🇸', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Architect', + 'Developer', + 'Full Stack', + 'Java', + 'Go', + 'Golang', + 'JavaScript', + 'Rust', + 'Writer', + ], + }, { name: 'Adam Urban', - description: - "coder, father, left-handed", + description: 'coder, father, left-handed', url: 'https://urbanisierung.dev/uses/', twitter: '@urbanisierung', emoji: '🚀', @@ -2636,8 +4243,7 @@ const pages = [ }, { name: 'Majo Paskuvan', - description: - 'Front End Developer, Reader, Deaf Person', + description: 'Front End Developer, Reader, Deaf Person', url: 'https://paskuvan.us/uses.html', twitter: '@paskuvan', emoji: '🤟', @@ -2652,7 +4258,7 @@ const pages = [ 'UX', 'Blogger', 'Designer', - ] + ], }, { name: 'Christopher Wavrin', @@ -2663,7 +4269,7 @@ const pages = [ country: '🇺🇸', computer: 'apple', phone: 'iphone', - tags: ['Ruby On Rails', 'Vue.js', 'Web Development', 'Full Stack', 'AWS'] + tags: ['Ruby On Rails', 'Vue.js', 'Web Development', 'Full Stack', 'AWS'], }, { name: 'Florian Kapfenberger', @@ -2682,8 +4288,54 @@ const pages = [ 'JavaScript', 'Blogger', 'React', - 'Gatsby' - ] + 'Gatsby', + ], + }, + { + name: 'TaeHee Kim', + description: 'Front-end Engineer, Bassist, Cat lover.', + url: 'https://roto.dev/uses', + twitter: '@winterwolf0412', + emoji: '🎸', + country: '🇰🇷', + computer: 'apple', + phone: 'android', + tags: [ + 'Front End', + 'Full Stack', + 'React', + 'JavaScript', + 'TypeScript', + 'React Native', + 'Node', + 'Python', + 'Serverless', + 'Musician', + ], + }, + { + name: 'Marcin Krawczyk', + description: + 'Javascript Developer from Poland, working and living in Switzerland, wannabe dev blogger.', + url: 'https://marcin.codes/uses', + twitter: '@marckraw', + emoji: '🥑', + country: '🇵🇱', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Developer', + 'Full Stack', + 'Blogger', + 'JavaScript', + 'TypeScript', + 'React', + 'Vue', + 'Node', + 'CSS', + 'Gatsby', + 'Storyblok', + ], }, { name: 'Maria Altyeva Schuessler ', @@ -2727,6 +4379,28 @@ const pages = [ 'CSS', ], }, + { + name: 'Ibrahim Cesar', + description: + 'Philosophy hacker. Fullstack dev && Editor @ media company in Brazil. 4733 pixels tall @ 72dpi', + url: 'https://ibrahimcesar.dev/uses', + twitter: '@ibrahimcesar', + emoji: '🦕', + country: '🇧🇷', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Developer', + 'Full Stack', + 'Accessibility', + 'Performance', + 'Philosophy', + 'JavaScript', + 'React', + 'Node', + 'CSS', + ], + }, { name: 'Sercan Eraslan', description: 'Front-End Tech Lead', @@ -2747,29 +4421,39 @@ const pages = [ 'Svelte', ], }, + { + name: 'Divjot Singh', + description: 'Web Developer, Vegan, Sikh.', + url: 'https://bogas04.github.io/uses', + twitter: '@bogas04', + emoji: '🌱', + country: '🇮🇳', + computer: 'apple', + phone: 'android', + tags: [ + 'Developer', + 'Full Stack', + 'React', + 'TypeScript', + 'JavaScript', + 'Node', + 'CSS', + ], + }, { name: 'Jeff Wen', - description: - 'Web Developer, Open Source Contributor', + description: 'Web Developer, Open Source Contributor', url: 'https://sinchang.me/uses', twitter: '@sinchangwen', emoji: '🍕', country: '🇨🇳', computer: 'apple', phone: 'iphone', - tags: [ - 'Web Development', - 'Front End', - 'Vue', - 'React', - 'Node', - 'Python' - ], + tags: ['Web Development', 'Front End', 'Vue', 'React', 'Node', 'Python'], }, { name: 'Andrea Prus', - description: - 'Full stack developer, blogger', + description: 'Full stack developer, blogger', url: 'https://avris.it/uses', twitter: '@AvrisIT', emoji: '🏳‍🌈', @@ -2788,8 +4472,10 @@ const pages = [ }, { name: 'Bamuleseyo Gideon', - description: 'Software Engineer, Facebook Developer Cirle Kamapala Lead. Front-end ❤️', - url: 'https://medium.com/developer-circle-kampala/what-i-use-my-tools-of-trade-552655db4b8d', + description: + 'Software Engineer, Facebook Developer Cirle Kamapala Lead. Front-end ❤️', + url: + 'https://medium.com/developer-circle-kampala/what-i-use-my-tools-of-trade-552655db4b8d', twitter: '@gideon_b_', emoji: '😎', country: '🇺🇬', @@ -2805,7 +4491,7 @@ const pages = [ 'Flask', 'Django', 'CSS', - 'DevC' + 'DevC', ], }, { @@ -2827,6 +4513,18 @@ const pages = [ 'CSS', ], }, + { + name: 'Benjamin Edenhuizen', + description: + 'Front-end web developer with a focus on accessibility and performance.', + url: 'https://rqrauhvmra.com/uses/', + twitter: '@rqrauhvmra', + emoji: '☕', + country: '🇩🇪', + computer: 'windows', + phone: 'iphone', + tags: ['Web developer', 'Front-end', 'Accessibility', 'Performance'], + }, { name: 'Dave Hill', description: 'Front-end developer, amateur photographer, podcast beginner.', @@ -2847,32 +4545,34 @@ const pages = [ ], }, { - name: "Logan Blangenois", + name: 'Logan Blangenois', description: - "Front-end developer passionate about eco-friendly (web)app and React.", - url: "https://logan-blangenois.be/uses/", - twitter: "@loganblangenois", - emoji: "🧑🏻‍💻", - country: "🇧🇪", - computer: "apple", - phone: "iphone", + 'Front-end developer passionate about eco-friendly (web)app and React.', + url: 'https://logan-blangenois.be/uses/', + twitter: '@loganblangenois', + emoji: '🧑🏻‍💻', + country: '🇧🇪', + computer: 'apple', + phone: 'iphone', tags: [ - "Front End", - "Developer", - "JavaScript", - "React", - "GraphQL", - "Gatsby", - "HTML", - "CSS", - "Sass", - "Performance" + 'Front End', + 'Developer', + 'JavaScript', + 'React', + 'GraphQL', + 'Gatsby', + 'HTML', + 'CSS', + 'Sass', + 'Performance', ], }, { name: 'Muhammad Umair', - description: 'Fullstack front-end developer and designer, passionate in everything #JavaScript', - url: 'https://gist.github.com/mumairofficial/0d97ed3dca1ba25d9f01b8db8aed42dc', + description: + 'Fullstack front-end developer and designer, passionate in everything #JavaScript', + url: + 'https://gist.github.com/mumairofficial/0d97ed3dca1ba25d9f01b8db8aed42dc', twitter: '@imumare', emoji: '💻', country: '🇵🇰', @@ -2898,10 +4598,28 @@ const pages = [ country: '🇺🇸', computer: 'apple', phone: 'iphone', + tags: ['CSS', 'YouTuber', 'Web Development'], + }, + { + name: 'Benjamin Mock', + description: 'coder, runner, reader, maker', + url: 'https://codesnacks.net/uses/', + twitter: '@benjaminmock', + emoji: '🤬', + country: '🇩🇪', + computer: 'apple', + phone: 'android', tags: [ + 'Front End', + 'HTML', 'CSS', - 'YouTuber', - 'Web Development', + 'SCSS', + 'Styled Components', + 'JavaScript', + 'TypeScript', + 'React', + 'Gatsby', + 'JAMstack', ], }, { @@ -2949,12 +4667,110 @@ const pages = [ 'Node', 'TypeScript', 'Rust', - 'ReasonML' + 'ReasonML', + ], + }, + { + name: 'Simranjit Singh', + description: 'Javascript loving Coldfusion developer', + url: 'https://simranjit.dev/uses', + twitter: '@SinghCode', + emoji: '💻', + country: '🇬🇧', + computer: 'windows', + phone: 'android', + tags: [ + 'Developer', + 'Full Stack', + 'Coldfusion', + 'Plesk', + 'Wordpress', + 'JavaScript', + 'Vue', + 'CSS', + 'PHP', + 'Git', + 'VS Code', + ], + }, + { + name: 'Maxwell Morrison', + description: 'Continuous leaner and freelance full stack developer', + url: 'https://maxmorrison.me/uses', + twitter: '@ghkobbs', + emoji: '👌', + country: '🇬🇭', + computer: 'windows', + phone: 'android', + tags: [ + 'Developer', + 'Full Stack', + 'JavaScript', + 'Frontend', + 'Gatsby', + 'React', + 'Node', + 'CSS', + ], + }, + { + name: 'Rail Hamdeew', + description: 'Full Stack. Open to new technologies', + url: 'https://hmdw.me/uses/', + twitter: '@rhamdeew', + emoji: '😎', + country: '🇷🇺', + computer: 'apple', + phone: 'iphone', + tags: ['Full Stack', 'Ruby', 'PHP', 'Python', 'JavaScript', 'Vue'], + }, + { + name: 'Armno Prommarak', + description: 'Frontend developer, blogger, cyclist.', + url: 'https://armno.in.th/uses', + twitter: '@armno', + emoji: '🔥', + country: '🇹🇭', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Developer', + 'Front End', + 'JavaScript', + 'CSS', + 'HTML', + 'Angular', + 'TypeScript', + 'Blogger', + 'Performance', + ], + }, + { + name: 'Fernando Paredes', + description: 'iOS/macOS developer, serial hobbyist, language nerd.', + url: 'https://fdp.io/about/uses', + twitter: '@nanoxd', + emoji: '😆', + country: '🇺🇸', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Developer', + 'Front End', + 'Swift', + 'iOS', + 'macOS', + 'Xcode', + 'Rust', + 'TypeScript', + 'Ruby', + 'CSS', ], }, { name: 'Tarik Omercehajic', - description: 'DevOps Engineer @BicomSystems. Mechanical Engineer in free time :)', + description: + 'DevOps Engineer @BicomSystems. Mechanical Engineer in free time :)', url: 'https://robotz.tech/uses/', twitter: '@tariktz', emoji: '🚀', @@ -3017,6 +4833,68 @@ const pages = [ 'Sass', ], }, + { + name: 'Lakshmipriya Mukundan', + description: + 'Javascript lover, FullStack enthusiast, React Learner (current), Pet lover', + url: + 'https://gist.github.com/lakshmipriyamukundan/ddd224306ce962f4f159f1065f0f0c67', + twitter: '@lak_mee', + emoji: ':😺 ', + country: '🇮🇳', + computer: 'linux', + phone: 'android', + tags: [ + 'JavaScript', + 'NodeJs', + 'Developer', + 'Full Stack', + 'React', + 'Elasticsearch', + 'GraphQL', + ], + }, + { + name: 'Jeremy Bunting', + description: 'Web 🤖 working remotely from the Connecticut burbs', + url: 'https://qbunt.com/uses', + twitter: '@qbunt', + emoji: '🌲', + country: '🇺🇸', + computer: 'apple', + phone: 'android', + tags: [ + 'Developer', + 'Full Stack', + 'Remote', + 'CSS', + 'JavaScript', + 'React', + 'Vue', + 'Node', + 'GraphQL', + 'Accessibility', + ], + }, + { + name: 'Tony Mamedbekov', + description: + 'Architect, developer, cms enthusiast, technologoy evangelist, content creator, bloger, consultant', + url: 'https://www.tmamedbekov.dev/uses', + twitter: '@tmamedbekov', + emoji: '🌍', + country: '🇦🇿', + computer: 'apple', + phone: 'iphone', + tags: [ + 'Architect', + 'SitecoreJSS', + 'Sitecore', + 'React', + 'Developer', + 'Angular', + ], + }, { name: 'Jerry Shi', description: @@ -3034,307 +4912,10 @@ const pages = [ 'Node', 'Rust', 'Full Stack', - 'GraphQL' + 'GraphQL', ], }, // 🚨 OH Hey! DO NOT ADD YOURSELF TO THE END OF THE ARRAY 🚨 // 🚨 Add yourself somewhere random. This makes merging you much easier and avoids conflicts. 🚨 // Thx, luv ya - wes ]; - -export default pages; - -// Times out -// { -// name: 'Troy Forster', -// description: 'Consulting Technology Director and CTO for Hire', -// url: 'https://tforster.com/uses', -// twitter: '@tforster', -// emoji: '', -// country: '🇨🇦', -// computer: 'windows', -// phone: 'android', -// tags: [ -// 'Engineer', -// 'Back End', -// 'Front End', -// 'Consultant', -// 'Entrepreneur', -// 'JavaScript', -// 'C#', -// 'PHP', -// 'Serverless', -// 'SOA', -// 'Enterprise', -// ], -// }, - -// Times out -// { -// name: 'Carlos Andres Charris Sandoval', -// description: 'Software Engineer', -// url: 'https://carloscharris.com/uses', -// twitter: '@Darkklitos', -// emoji: '🔥', -// country: '🇨🇴', -// computer: 'apple', -// phone: 'android', -// tags: [ -// 'Developer', -// 'Full Stack', -// 'JavaScript', -// 'TypeScript', -// 'Angular', -// 'Vue', -// 'React', -// 'Node', -// 'Java', -// 'Docker', -// 'Serverless', -// ], -// }, - -// Times out -// { -// name: 'Carlos Junod', -// description: -// 'Husband, Dreamer, Full Stack Developer, Javascript passionate, Graphic Designer', -// url: 'http://carlosjunod.me/uses/', -// twitter: '@carlosjunod', -// emoji: '🥑', -// country: '🇨🇱', -// computer: 'apple', -// phone: 'iphone', -// tags: [ -// 'Developer', -// 'Full Stack', -// 'React', -// 'Designer', -// 'Entrepreneur', -// 'JavaScript', -// 'Node', -// 'CSS', -// 'HTML', -// ], -// }, - -// No /uses page -// { -// name: 'Hussain Aminu', -// description: 'Web Developer, Data Scientist', -// url: 'https://hussain4real.github.io/Portfolio/uses', -// twitter: '@hussain4real', -// emoji: '🔥', -// country: '🇳🇬', -// computer: 'windows', -// phone: 'android', -// tags: [ -// 'Developer', -// 'Full Stack', -// 'Data Science', -// 'JavaScript', -// 'Python', -// 'Vue', -// 'Node', -// 'Django', -// ], -// }, - -// No /uses page -// { -// name: 'Sanket Gandhi', -// description: 'Software Engineer', -// url: 'https://sanketgandhi.com/uses', -// twitter: '@sanketgandhi876', -// emoji: '🔥', -// country: '🇮🇳', -// computer: 'apple', -// phone: 'android', -// tags: [ -// 'Developer', -// 'Full Stack', -// 'PHP', -// 'Laravel', -// 'AWS', -// 'JavaScript', -// 'React', -// 'Node', -// ], -// }, - -// No /uses page -// { -// name: 'Martin Chammah', -// description: 'Full Stack Gatsby Developer @ ecomerciar', -// twitter: '@codigomate', -// url: 'https://martinchammah.dev/uses', -// emoji: '🇦🇷', -// country: '🇦🇷', -// computer: 'windows', -// phone: 'android', -// tags: [ -// 'Developer', -// 'Full Stack', -// 'Entrepreneur', -// 'YouTuber', -// 'JavaScript', -// 'Gatsby', -// 'React', -// 'WordPress', -// 'Thinkpad', -// ], -// }, - -// No /uses page -// { -// name: 'Richard Palacios G.', -// description: 'Web Developer, passionate apprentice, Community co-organizer', -// url: 'https://www.richardpalaciosg.dev/uses', -// twitter: '@rpalaciosg_', -// emoji: '⚡', -// country: '🇪🇨', -// computer: 'linux', -// phone: 'android', -// tags: [ -// 'Developer', -// 'JavaScript', -// 'Front End', -// 'BackEnd', -// 'Community', -// 'Node', -// 'React', -// ], -// }, - -// No /uses page -// { -// name: 'Marek Racík', -// description: 'Full Stack Developer', -// url: 'https://racik.info/uses', -// twitter: '@marek_racik', -// emoji: '🍍', -// country: '🇸🇰', -// computer: 'apple', -// phone: 'iphone', -// tags: [ -// 'Web Developer', -// 'Full Stack', -// 'Laravel', -// 'Vue', -// 'Tailwind', -// 'Django', -// 'Python', -// 'PHP', -// 'JavaScript', -// ], -// }, - -// No /uses page -// { -// name: 'Oscar Sánchez', -// description: 'Passionate developer, traveler and drummer from Perú', -// url: 'https://devlusaja.com', -// twitter: '@dev_lusaja', -// emoji: '💻🛩💪', -// country: '🇵🇪', -// computer: 'linux', -// phone: 'android', -// tags: [ -// 'Developer', -// 'Software Architect', -// 'Python', -// 'PHP', -// 'Docker', -// 'Graphql', -// 'AWS', -// 'Open Source', -// ], -// }, - -// No /uses page -// { -// name: 'Khriztian Moreno', -// description: -// '#Javascript Developer 🥑& Community builder 👨🏻‍💻♥️👨🏻‍🏫 | #MDE at @cloudinary | Producer @commitfm 🎙📻 | Co-Organize of @MedellinJS @avanetr', -// url: 'https://khriztianmoreno.dev/uses', -// twitter: '@khriztianmoreno', -// emoji: '👨🏼‍💻', -// country: '🇨🇴', -// computer: 'apple', -// phone: 'iphone', -// tags: [ -// 'Developer', -// 'JavaScript', -// 'React', -// 'Front End', -// 'React', -// 'Blogger', -// 'Speaker', -// 'Podcaster', -// 'Community', -// 'JAMstack', -// 'YouTuber', -// ], -// }, - -// No /uses page -// { -// name: 'Yuri Yakovlev', -// description: -// 'Maker of this site. Web Developer, Tutorial Maker, Podcaster, BBQ Lover', -// url: 'https://mynameisyuri.com/uses', -// twitter: '@yakovlevyuri', -// emoji: '🧙‍♂️', -// country: '🇨🇿', -// computer: 'apple', -// phone: 'iphone', -// tags: [ -// 'Developer', -// 'Full Stack', -// 'Serverless', -// 'JavaScript', -// 'TypeScript', -// 'React', -// 'Node', -// 'GraphQL', -// ], -// }, - -// Empty /uses page -// { -// name: 'Ændrew Rininsland', -// description: 'Developer-Journalist', -// url: 'https://aendrew.com/uses', -// twitter: '@aendrew', -// emoji: '💚', -// country: '🏳️‍🌈', -// computer: 'apple', -// phone: 'android', -// tags: [ -// 'Developer', -// 'DataViz', -// 'JavaScript', -// 'TypeScript', -// 'Node', -// 'Python', -// 'Author', -// 'Journalist', -// 'Speaker', -// 'Front-End', -// 'React', -// 'D3', -// ], -// }, - -// Weird redirect to YouTube Video -// { -// name: 'Juan Manuel Incaurgarat', -// description: 'Front end developer', -// url: 'https://kilinkis.me/uses', -// twitter: '@kilinkis', -// emoji: '🏀', -// country: '🇦🇷', -// computer: 'apple', -// phone: 'android', -// tags: ['React', 'WordPress', 'Gatsby', 'JavaScript', 'Node'], -// }, diff --git a/src/images/linux.png b/src/images/linux.png new file mode 100644 index 00000000..199d4f0a Binary files /dev/null and b/src/images/linux.png differ diff --git a/src/images/linux.svg b/src/images/linux.svg deleted file mode 100644 index eec47571..00000000 --- a/src/images/linux.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/src/pages/index.js b/src/pages/index.js index 54059752..14a6d27f 100644 --- a/src/pages/index.js +++ b/src/pages/index.js @@ -6,6 +6,7 @@ import FilterContext from '../context/FilterContext'; import Layout from '../components/layout'; import Person from '../components/Person'; import Topics from '../components/Topics'; +import BackToTop from '../components/BackToTop'; function IndexPage() { const { currentTag } = useContext(FilterContext); @@ -43,6 +44,7 @@ function IndexPage() { ))} + ); } diff --git a/src/util/icons.js b/src/util/icons.js index aa9584be..f68363e9 100644 --- a/src/util/icons.js +++ b/src/util/icons.js @@ -2,6 +2,6 @@ import iphone from '../images/iphone.png'; import android from '../images/android.png'; import windows from '../images/windows.svg'; import apple from '../images/apple.svg'; -import linux from '../images/linux.svg'; +import linux from '../images/linux.png'; export { iphone, android, windows, apple, linux }; diff --git a/src/util/stats.js b/src/util/stats.js index 8564df35..d41e05d8 100644 --- a/src/util/stats.js +++ b/src/util/stats.js @@ -21,7 +21,7 @@ export function countries() { .reduce((acc, country) => { if (acc[country.name]) { // exists, update - acc[country.name].count = acc[country.name].count + 1; + acc[country.name].count += 1; } else { acc[country.name] = { ...country,