├── .editorconfig ├── .eslintrc.cjs ├── .gitattributes ├── .github ├── .kodiak.toml ├── CODEOWNERS └── workflows │ ├── fossa.yml │ ├── release-please.yml │ ├── sync-cms-to-repo.yml │ ├── sync-to-cms.yml │ ├── test.yml │ └── versioning.yml ├── .gitignore ├── .prettierrc.json ├── CHANGELOG.md ├── LICENSE ├── README.md ├── bin ├── sync_cms_to_plugins_repo.js ├── sync_cms_to_repo.sh ├── sync_plugins_to_cms.js ├── tsconfig.json └── utils.js ├── commitlint.config.cjs ├── docs ├── CODE_OF_CONDUCT.md ├── ISSUE_TEMPLATE │ └── request_deactivation.md ├── PULL_REQUEST_TEMPLATE.md ├── guidelines.md ├── plugin_review.md └── versioning.md ├── functions └── npm-diff │ ├── compute.js │ ├── fetch.js │ ├── index.js │ ├── new_urls.js │ ├── upsert_comment.js │ └── validate.js ├── index.js ├── netlify.toml ├── package-lock.json ├── package.json ├── renovate.json5 ├── site └── plugins.json ├── test ├── bin │ └── utils.js └── main.js └── types └── plugins.d.ts /.editorconfig: -------------------------------------------------------------------------------- 1 | root = true 2 | 3 | [*] 4 | indent_style = space 5 | indent_size = 2 6 | end_of_line = lf 7 | charset = utf-8 8 | max_line_length = 120 9 | trim_trailing_whitespace = true 10 | insert_final_newline = true 11 | -------------------------------------------------------------------------------- /.eslintrc.cjs: -------------------------------------------------------------------------------- 1 | const { overrides } = require('@netlify/eslint-config-node/.eslintrc_esm.cjs') 2 | 3 | module.exports = { 4 | extends: '@netlify/eslint-config-node/.eslintrc_esm.cjs', 5 | overrides: [...overrides], 6 | } 7 | -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | * text=auto eol=lf 2 | -------------------------------------------------------------------------------- /.github/.kodiak.toml: -------------------------------------------------------------------------------- 1 | version = 1 2 | 3 | [merge.automerge_dependencies] 4 | versions = ["minor", "patch"] 5 | usernames = ["renovate"] 6 | 7 | [approve] 8 | auto_approve_usernames = ["renovate"] -------------------------------------------------------------------------------- /.github/CODEOWNERS: -------------------------------------------------------------------------------- 1 | * @netlify/ecosystem-pod-integrations 2 | docs/ @netlify/department-docs 3 | -------------------------------------------------------------------------------- /.github/workflows/fossa.yml: -------------------------------------------------------------------------------- 1 | name: Dependency License Scanning 2 | 3 | on: 4 | push: 5 | branches: 6 | - main 7 | - chore/fossa-workflow 8 | 9 | defaults: 10 | run: 11 | shell: bash 12 | 13 | jobs: 14 | fossa: 15 | runs-on: ubuntu-latest 16 | steps: 17 | - name: Checkout 18 | uses: actions/checkout@v4 19 | - name: Download fossa cli 20 | run: |- 21 | mkdir -p $HOME/.local/bin 22 | curl https://raw.githubusercontent.com/fossas/fossa-cli/master/install.sh | bash -s -- -b $HOME/.local/bin 23 | echo "$HOME/.local/bin" >> $GITHUB_PATH 24 | 25 | - name: Fossa init 26 | run: fossa init 27 | - name: Set env 28 | run: echo "line_number=$(grep -n "project" .fossa.yml | cut -f1 -d:)" >> $GITHUB_ENV 29 | - name: Configuration 30 | run: |- 31 | sed -i "${line_number}s|.*| project: git@github.com:${GITHUB_REPOSITORY}.git|" .fossa.yml 32 | cat .fossa.yml 33 | - name: Upload dependencies 34 | run: fossa analyze --debug 35 | env: 36 | FOSSA_API_KEY: ${{ secrets.FOSSA_API_KEY }} 37 | -------------------------------------------------------------------------------- /.github/workflows/release-please.yml: -------------------------------------------------------------------------------- 1 | name: release-please 2 | on: 3 | push: 4 | branches: 5 | - main 6 | jobs: 7 | release-please: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - uses: navikt/github-app-token-generator@a8ae52448279d468cfbca5cd899f2457f0b1f643 11 | id: get-token 12 | with: 13 | private-key: ${{ secrets.TOKENS_PRIVATE_KEY }} 14 | app-id: ${{ secrets.TOKENS_APP_ID }} 15 | - uses: GoogleCloudPlatform/release-please-action@v4 16 | id: release 17 | with: 18 | token: ${{ steps.get-token.outputs.token }} 19 | release-type: node 20 | package-name: '@netlify/plugins-list' 21 | - uses: actions/checkout@v4 22 | if: ${{ steps.release.outputs.release_created }} 23 | - uses: actions/setup-node@v4 24 | with: 25 | node-version: '*' 26 | cache: 'npm' 27 | check-latest: true 28 | registry-url: 'https://registry.npmjs.org' 29 | if: ${{ steps.release.outputs.release_created }} 30 | - run: npm publish 31 | if: ${{ steps.release.outputs.release_created }} 32 | env: 33 | NODE_AUTH_TOKEN: ${{secrets.NPM_TOKEN}} 34 | -------------------------------------------------------------------------------- /.github/workflows/sync-cms-to-repo.yml: -------------------------------------------------------------------------------- 1 | name: Sync CMS to Plugins Repository 2 | on: 3 | repository_dispatch: 4 | # sync_cms_to_repo is a bespoke type created for use with the CMS Webhook 5 | types: [sync_cms_to_repo] 6 | jobs: 7 | sync-to-repo: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: Git checkout 11 | uses: actions/checkout@v4 12 | - name: Using Node.js 13 | uses: actions/setup-node@v4 14 | with: 15 | node-version: '*' 16 | cache: 'npm' 17 | check-latest: true 18 | - name: Install dependencies 19 | run: npm install 20 | - name: Setup git config 21 | run: | 22 | git config user.name 'token-generator-app[bot]' 23 | git config user.email '82042599+token-generator-app[bot]@users.noreply.github.com' 24 | - name: Generate GitHub token 25 | uses: navikt/github-app-token-generator@v1.2.1 26 | id: get-token 27 | with: 28 | private-key: ${{ secrets.TOKENS_PRIVATE_KEY }} 29 | app-id: ${{ secrets.TOKENS_APP_ID }} 30 | - name: Sync CMS to repo 31 | env: 32 | GITHUB_TOKEN: ${{ steps.get-token.outputs.token }} 33 | CMS_CHANGES: ${{ toJson(github.event.client_payload) }} 34 | 35 | run: bin/sync_cms_to_repo.sh 36 | -------------------------------------------------------------------------------- /.github/workflows/sync-to-cms.yml: -------------------------------------------------------------------------------- 1 | name: Sync Plugins to CMS 2 | on: 3 | pull_request: 4 | types: 5 | - closed 6 | jobs: 7 | sync-to-cms: 8 | # Only run if the merged PR wasn't an automated PR for synching from the cms to the repo 9 | if: github.event.pull_request.merged && !contains(github.event.pull_request.labels.*.name, 'cms_sync') 10 | runs-on: ubuntu-latest 11 | steps: 12 | - name: Git checkout 13 | uses: actions/checkout@v4 14 | - name: Using Node.js 15 | uses: actions/setup-node@v4 16 | with: 17 | node-version: '*' 18 | cache: 'npm' 19 | check-latest: true 20 | - name: Install dependencies 21 | run: npm install 22 | - name: Sync plugins to CMS 23 | env: 24 | SANITY_API_TOKEN: ${{ secrets.SANITY_API_TOKEN }} 25 | SANITY_PROJECT_ID: ${{ secrets.SANITY_PROJECT_ID }} 26 | SANITY_DATASET: ${{ secrets.SANITY_DATASET }} 27 | run: npx tsx bin/sync_plugins_to_cms.js 28 | -------------------------------------------------------------------------------- /.github/workflows/test.yml: -------------------------------------------------------------------------------- 1 | name: Build 2 | on: 3 | # Ensure GitHub actions are not run twice for same commits 4 | push: 5 | branches: [main] 6 | tags: ['*'] 7 | pull_request: 8 | types: [opened, synchronize, reopened] 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | timeout-minutes: 30 13 | steps: 14 | - name: Git checkout 15 | uses: actions/checkout@v4 16 | - name: Using Node.js 17 | uses: actions/setup-node@v4 18 | with: 19 | node-version: '*' 20 | cache: 'npm' 21 | check-latest: true 22 | - name: Install dependencies 23 | run: npm ci 24 | - name: Linting 25 | run: npm run format:ci 26 | - name: Tests 27 | run: npm run test:ci 28 | -------------------------------------------------------------------------------- /.github/workflows/versioning.yml: -------------------------------------------------------------------------------- 1 | name: versioning 2 | on: 3 | push: 4 | branches: 5 | - main 6 | jobs: 7 | versioning: 8 | runs-on: ubuntu-latest 9 | steps: 10 | - name: Git checkout 11 | uses: actions/checkout@v4 12 | # Updates the list-v* git tag to version `plugins.json`. 13 | # Consumers must use the tag-specific deploy URL: 14 | # list-v*--netlify-plugins.netlify.app/plugins.json 15 | # This versions the syntax of `plugins.json`, not its contents. 16 | # The contents, i.e. the list of plugins, is versioned using the v* 17 | # git tag instead, which also comes with GitHub and npm releases. 18 | # For example: 19 | # - Changing a property name in `plugins.json` for all plugins 20 | # is a syntax breaking change (list-v* tag) 21 | # - Releasing a breaking change for a specific plugin in `plugins.json` 22 | # is a contents breaking change (v* tag + GitHub release + npm release) 23 | - name: Update branch 24 | run: | 25 | git tag --force list-v2 26 | git push --force --tags 27 | env: 28 | GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} 29 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *~ 2 | *.swp 3 | npm-debug.log 4 | node_modules 5 | /core 6 | .eslintcache 7 | .npmrc 8 | .yarn-error.log 9 | /coverage 10 | /build 11 | .vscode 12 | .DS_Store 13 | .env 14 | 15 | # Local Netlify folder 16 | .netlify 17 | -------------------------------------------------------------------------------- /.prettierrc.json: -------------------------------------------------------------------------------- 1 | "@netlify/eslint-config-node/.prettierrc.json" 2 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | 3 | ## [6.80.0](https://github.com/netlify/plugins/compare/v6.79.0...v6.80.0) (2024-05-22) 4 | 5 | 6 | ### Features 7 | 8 | * update Angular runtime to 2.1.0 ([#1345](https://github.com/netlify/plugins/issues/1345)) ([d351814](https://github.com/netlify/plugins/commit/d351814e0000204de9d30c0506a3ee75a81e45fb)) 9 | 10 | ## [6.79.0](https://github.com/netlify/plugins/compare/v6.78.1...v6.79.0) (2024-05-21) 11 | 12 | 13 | ### Features 14 | 15 | * update flagged Next to 5.3.0 ([#1343](https://github.com/netlify/plugins/issues/1343)) ([c8d031c](https://github.com/netlify/plugins/commit/c8d031cf87f48f5fe7685f7eb5e9c34ca85f17a8)) 16 | 17 | ## [6.78.1](https://github.com/netlify/plugins/compare/v6.78.0...v6.78.1) (2024-05-17) 18 | 19 | 20 | ### Bug Fixes 21 | 22 | * update Angular runtime to 2.0.7 ([#1340](https://github.com/netlify/plugins/issues/1340)) ([e8100ba](https://github.com/netlify/plugins/commit/e8100badc8f9cc7a22807776f4742982ac4919ac)) 23 | * update Next.js flagged version to 5.2.2 ([#1335](https://github.com/netlify/plugins/issues/1335)) ([0b53aa7](https://github.com/netlify/plugins/commit/0b53aa78282f7966f93d8ab9b3fdf12805ddb182)) 24 | * **wfui cleanup:** cleanup workflow-ui workflows ([#1341](https://github.com/netlify/plugins/issues/1341)) ([6aad2d4](https://github.com/netlify/plugins/commit/6aad2d4332748c2f3fa7fed0daf42c5a4d671560)) 25 | 26 | ## [6.78.0](https://github.com/netlify/plugins/compare/v6.77.0...v6.78.0) (2024-05-03) 27 | 28 | 29 | ### Features 30 | 31 | * roll out Next runtime 5.2.0 behind flag ([#1330](https://github.com/netlify/plugins/issues/1330)) ([95fbdfb](https://github.com/netlify/plugins/commit/95fbdfbe84a8d3001f3a8897b05467ef4b2a23ed)) 32 | * update Next runtime to 5.0.0 behind gradual rollout feature flag and opt-in ([#1321](https://github.com/netlify/plugins/issues/1321)) ([64a5e0e](https://github.com/netlify/plugins/commit/64a5e0edc80d1f4454ef7933bcc8d724a8ebd1a1)) 33 | * update Next runtime to 5.1.0 behind gradual rollout feature flag and opt-in ([#1323](https://github.com/netlify/plugins/issues/1323)) ([45afd73](https://github.com/netlify/plugins/commit/45afd739d0bcf1b39e9d75cfa6ca747e4f9f899f)) 34 | * update Next runtime to 5.1.1 behind gradual rollout feature flag and opt-in ([#1325](https://github.com/netlify/plugins/issues/1325)) ([033a5b9](https://github.com/netlify/plugins/commit/033a5b90e0f498e272af7b69c5cd8b64ddc931fc)) 35 | * update Next runtime to 5.1.2 behind gradual rollout feature flag and opt-in ([#1326](https://github.com/netlify/plugins/issues/1326)) ([c3290f2](https://github.com/netlify/plugins/commit/c3290f2e584a58f00fd357d3c19b4dbb7506ca4c)) 36 | * update Next runtime to rc.7 ([#1316](https://github.com/netlify/plugins/issues/1316)) ([674a6c6](https://github.com/netlify/plugins/commit/674a6c63006dec7dce77b1d0ffc1b7096e95439d)) 37 | * update Next runtime to rc.8 ([#1318](https://github.com/netlify/plugins/issues/1318)) ([c7bf0b0](https://github.com/netlify/plugins/commit/c7bf0b05bfee2c8a40eb8af2bb1f830c5b57dbb9)) 38 | * update plugin @netlify/plugin-gatsby to version 3.8.1 ([#1324](https://github.com/netlify/plugins/issues/1324)) ([8660152](https://github.com/netlify/plugins/commit/86601524a6b2e00b0dc172e8c756348fff0a0f2c)) 39 | 40 | 41 | ### Bug Fixes 42 | 43 | * deactivate Perfbeacon plugin ([#1319](https://github.com/netlify/plugins/issues/1319)) ([5f77033](https://github.com/netlify/plugins/commit/5f77033dc986587dc145eaa0f48973ea06726876)) 44 | * update Next.js flagged version to 5.2.1 ([#1331](https://github.com/netlify/plugins/issues/1331)) ([479efa1](https://github.com/netlify/plugins/commit/479efa10f09fe0c9e372983f783b5b721a56b05d)) 45 | 46 | ## [6.77.0](https://github.com/netlify/plugins/compare/v6.76.0...v6.77.0) (2024-03-20) 47 | 48 | 49 | ### Features 50 | 51 | * update Next runtime to rc.6 ([#1314](https://github.com/netlify/plugins/issues/1314)) ([017365f](https://github.com/netlify/plugins/commit/017365f38e1eac7bc0a0051512cb607caef62d64)) 52 | 53 | ## [6.76.0](https://github.com/netlify/plugins/compare/v6.75.0...v6.76.0) (2024-03-15) 54 | 55 | 56 | ### Features 57 | 58 | * set next.js minimal runtime to 5.0.0-rc.2 ([#1308](https://github.com/netlify/plugins/issues/1308)) ([c21512c](https://github.com/netlify/plugins/commit/c21512c61ed9a90c8fe5a3e61f2e3b25076c1e90)) 59 | * set next.js minimal runtime to 5.0.0-rc.3 ([#1311](https://github.com/netlify/plugins/issues/1311)) ([943f95f](https://github.com/netlify/plugins/commit/943f95fabad4dd23fe41d51509046eda2135beba)) 60 | * set next.js runtime 4.41.3 as stable version ([#1303](https://github.com/netlify/plugins/issues/1303)) ([245c519](https://github.com/netlify/plugins/commit/245c519b78d7c7f9d5a3a0bda8e459842fc8fd19)) 61 | * update Next runtime to rc.5 ([#1313](https://github.com/netlify/plugins/issues/1313)) ([5e243ac](https://github.com/netlify/plugins/commit/5e243ac7cdafa696158bec7e3475434befcc172d)) 62 | * update the beta of the next runtime ([#1297](https://github.com/netlify/plugins/issues/1297)) ([567169e](https://github.com/netlify/plugins/commit/567169e15bf115e6386c56453398898c35da82a5)) 63 | 64 | ## [6.75.0](https://github.com/netlify/plugins/compare/v6.74.0...v6.75.0) (2024-01-12) 65 | 66 | 67 | ### Features 68 | 69 | * adapt the release constraints for next runtime 5.0.0-beta.0 ([#1295](https://github.com/netlify/plugins/issues/1295)) ([fc68fc3](https://github.com/netlify/plugins/commit/fc68fc34980529cf540f21947235553e3396fc04)) 70 | * add new next runtime 5.0.0-beta behind a feature flag ([#1293](https://github.com/netlify/plugins/issues/1293)) ([8ccdbb6](https://github.com/netlify/plugins/commit/8ccdbb6fe5123bba5b2780e3561c6ab2fad71bd4)) 71 | * update the beta of the next runtime ([#1296](https://github.com/netlify/plugins/issues/1296)) ([36780d5](https://github.com/netlify/plugins/commit/36780d565ea7fa61a69125b17bc616fdc790a4ce)) 72 | 73 | ## [6.74.0](https://github.com/netlify/plugins/compare/v6.73.0...v6.74.0) (2023-12-13) 74 | 75 | 76 | ### Features 77 | 78 | * update cloudinary version ([#1290](https://github.com/netlify/plugins/issues/1290)) ([faa63a4](https://github.com/netlify/plugins/commit/faa63a436888d2fc9200b8b4a34f99bbec14fe1f)) 79 | 80 | ## [6.73.0](https://github.com/netlify/plugins/compare/v6.72.0...v6.73.0) (2023-12-11) 81 | 82 | 83 | ### Features 84 | 85 | * added Next.js runtime 4.41.3 behind a feature flag ([#1288](https://github.com/netlify/plugins/issues/1288)) ([d3fae17](https://github.com/netlify/plugins/commit/d3fae1796d9ae45a94ffb6714b4db6121c324fc7)) 86 | * set next.js runtime 4.41.2 as stable version ([#1287](https://github.com/netlify/plugins/issues/1287)) ([fc56b74](https://github.com/netlify/plugins/commit/fc56b74f83a2340644e9d37061ed81cd4e7ec83a)) 87 | * update plugin @netlify/plugin-gatsby to version 3.8.0 ([#1284](https://github.com/netlify/plugins/issues/1284)) ([f64fbab](https://github.com/netlify/plugins/commit/f64fbabe70d46c02b8e0fce30746ac6c26f28614)) 88 | 89 | ## [6.72.0](https://github.com/netlify/plugins/compare/v6.71.0...v6.72.0) (2023-11-08) 90 | 91 | 92 | ### Features 93 | 94 | * add missing strapi plugin ([#1265](https://github.com/netlify/plugins/issues/1265)) ([9923b9a](https://github.com/netlify/plugins/commit/9923b9a1400c4ba01979522c6e0218477e449d11)) 95 | * add new angular plugin ([#1270](https://github.com/netlify/plugins/issues/1270)) ([829b182](https://github.com/netlify/plugins/commit/829b182b0b3b4a479efb9ebe1085df877642e1ae)) 96 | * added Next.js runtime 4.40.1 behind a feature flag ([#1252](https://github.com/netlify/plugins/issues/1252)) ([aec7781](https://github.com/netlify/plugins/commit/aec77816c124b87ad7b71005a3267f4c2faa388c)) 97 | * added Next.js runtime 4.40.2 behind a feature flag ([#1260](https://github.com/netlify/plugins/issues/1260)) ([7f6b1bd](https://github.com/netlify/plugins/commit/7f6b1bd84ea1ecb7efca2fbb05ce72c264004342)) 98 | * added Next.js runtime 4.41.1 behind a feature flag ([#1267](https://github.com/netlify/plugins/issues/1267)) ([8686e1b](https://github.com/netlify/plugins/commit/8686e1bcb4e58f7ddbcc2a5b39d42a5caf68f820)) 99 | * set next-runtime prerelease version to 4.39.4 ([#1247](https://github.com/netlify/plugins/issues/1247)) ([24399f9](https://github.com/netlify/plugins/commit/24399f9b3223b9256476b983108ff4685a8d6bbd)) 100 | * set next.js runtime 4.32.2 as stable version ([#1251](https://github.com/netlify/plugins/issues/1251)) ([a6379cf](https://github.com/netlify/plugins/commit/a6379cf7619130bf749daa98f689161a517b0f37)) 101 | * set next.js runtime 4.39.3 as stable version ([#1245](https://github.com/netlify/plugins/issues/1245)) ([9fd9ead](https://github.com/netlify/plugins/commit/9fd9ead83cf7769fe83687a347de041bdacc67b9)) 102 | * set next.js runtime 4.40.1 as stable version ([#1259](https://github.com/netlify/plugins/issues/1259)) ([219f760](https://github.com/netlify/plugins/commit/219f76065c02a5b34939ac3447726afd2b2551a2)) 103 | * set next.js runtime 4.40.2 as stable version ([#1262](https://github.com/netlify/plugins/issues/1262)) ([c328d04](https://github.com/netlify/plugins/commit/c328d04df37ac882e131f5a6fe658ce71bd1f0b4)) 104 | * update plugin @netlify/plugin-gatsby to version 3.7.2 ([#1261](https://github.com/netlify/plugins/issues/1261)) ([0cfe6fe](https://github.com/netlify/plugins/commit/0cfe6fee185b30af8285fece2bbdfb276b71955c)) 105 | 106 | 107 | ### Bug Fixes 108 | 109 | * update cloudinary github url ([#1254](https://github.com/netlify/plugins/issues/1254)) ([59f17ce](https://github.com/netlify/plugins/commit/59f17cec16ea29f0f9708bb47b23bd5d210c298a)) 110 | 111 | ## [6.71.0](https://github.com/netlify/plugins/compare/v6.70.0...v6.71.0) (2023-08-07) 112 | 113 | 114 | ### Features 115 | 116 | * bump next.js runtime prerelease version to 4.39.3 ([#1240](https://github.com/netlify/plugins/issues/1240)) ([61c7696](https://github.com/netlify/plugins/commit/61c7696f0e8d45e03be099cd12cdb44b7eacb2cc)) 117 | 118 | ## [6.70.0](https://github.com/netlify/plugins/compare/v6.69.0...v6.70.0) (2023-08-07) 119 | 120 | 121 | ### Features 122 | 123 | * bumped next.js runtime version ([#1238](https://github.com/netlify/plugins/issues/1238)) ([d6af36d](https://github.com/netlify/plugins/commit/d6af36d919ab17b79dd8bfe904d4857941593720)) 124 | 125 | ## [6.69.0](https://github.com/netlify/plugins/compare/v6.68.0...v6.69.0) (2023-08-01) 126 | 127 | 128 | ### Features 129 | 130 | * add feature flagged v4.35.0 of next-runtime ([#1173](https://github.com/netlify/plugins/issues/1173)) ([17ca738](https://github.com/netlify/plugins/commit/17ca738a693f0e46354bc385935ae95a13e46fcb)) 131 | * add feature flagged v4.36.0 of next-runtime ([#1178](https://github.com/netlify/plugins/issues/1178)) ([dc7fdec](https://github.com/netlify/plugins/commit/dc7fdeca62207c5fd35312a748a9c59abecc0f33)) 132 | * add feature flagged v4.36.1 of next-runtime ([#1186](https://github.com/netlify/plugins/issues/1186)) ([20e6e4c](https://github.com/netlify/plugins/commit/20e6e4c893f84067b97fe7059ec411fbabec372f)) 133 | * Add feature flagged v4.37.0 of next-runtime ([#1191](https://github.com/netlify/plugins/issues/1191)) ([8c537a7](https://github.com/netlify/plugins/commit/8c537a7bd995a67e78dd497fd03b7f490441fed6)) 134 | * add Next.js runtime 4.39.0 behind a feature flag ([#1220](https://github.com/netlify/plugins/issues/1220)) ([805b5db](https://github.com/netlify/plugins/commit/805b5db2608d116833ccef709d0d7f0a2cfe2fcc)) 135 | * add Next.js runtime 4.39.1 behind a feature flag ([#1227](https://github.com/netlify/plugins/issues/1227)) ([936a9f8](https://github.com/netlify/plugins/commit/936a9f89899d67fc83da991e629713c4d88236ee)) 136 | * added Next.js runtime 4.37.4 behind a feature flag ([#1203](https://github.com/netlify/plugins/issues/1203)) ([d7796c3](https://github.com/netlify/plugins/commit/d7796c3318d971c30f6e8dc18020e216207342b1)) 137 | * added Next.js runtime 4.38.0 behind a feature flag ([#1212](https://github.com/netlify/plugins/issues/1212)) ([4f3b40b](https://github.com/netlify/plugins/commit/4f3b40b96c04f7f278aa4cedd422996f4e18ea44)) 138 | * adding feature flag for v4.37.2 ([#1196](https://github.com/netlify/plugins/issues/1196)) ([1a96138](https://github.com/netlify/plugins/commit/1a96138a45602861ba558840ca6f8dc3419fda66)) 139 | * bump prerelease Next.js runtime to 4.38.1 ([#1213](https://github.com/netlify/plugins/issues/1213)) ([762a71e](https://github.com/netlify/plugins/commit/762a71e317378e7fb4cd65bf120321b6656dcab5)) 140 | * set next.js runtime 4.37.2 as stable version ([#1202](https://github.com/netlify/plugins/issues/1202)) ([32888aa](https://github.com/netlify/plugins/commit/32888aa046dd62e3849bd4c067ba4999548ce8eb)) 141 | * set next.js runtime 4.37.4 as stable version ([#1211](https://github.com/netlify/plugins/issues/1211)) ([bea648d](https://github.com/netlify/plugins/commit/bea648d6e746e936f02c1c3a373597c66699fade)) 142 | * set next.js runtime 4.38.1 as stable v ([#1217](https://github.com/netlify/plugins/issues/1217)) ([d37ad70](https://github.com/netlify/plugins/commit/d37ad704696412e98e57fc5fe82a13728a14573a)) 143 | * set next.js runtime 4.39.0 as stable version ([#1225](https://github.com/netlify/plugins/issues/1225)) ([fb6b598](https://github.com/netlify/plugins/commit/fb6b598dff8703c1f496a28ac4a30cb1bebba84a)) 144 | * set next.js runtime 4.39.1 stable and 4.39.2 in prerelease ([#1236](https://github.com/netlify/plugins/issues/1236)) ([58885b9](https://github.com/netlify/plugins/commit/58885b96f061d7d7709a323f47f4a08ac8d6b468)) 145 | * unflag version 4.34.0 of next-runtime ([#1171](https://github.com/netlify/plugins/issues/1171)) ([6082771](https://github.com/netlify/plugins/commit/6082771a6654864e04bb0181d1d7e9c3885d66a4)) 146 | * unflag version 4.35.0 of next-runtime ([#1176](https://github.com/netlify/plugins/issues/1176)) ([f1f8d48](https://github.com/netlify/plugins/commit/f1f8d48e8784da07ff62adee4d6e32c05735e5e0)) 147 | * unflag version 4.36.0 of next-runtime ([#1184](https://github.com/netlify/plugins/issues/1184)) ([17b89be](https://github.com/netlify/plugins/commit/17b89beef166fbce8eff1b4241381e26ec8e71af)) 148 | * unflag version 4.36.1 of next-runtime ([#1189](https://github.com/netlify/plugins/issues/1189)) ([bab1877](https://github.com/netlify/plugins/commit/bab1877708c7b94a7ba7ace09ffe873217aab986)) 149 | * update plugin @netlify/plugin-gatsby to version 3.6.1 ([#1167](https://github.com/netlify/plugins/issues/1167)) ([83dca8f](https://github.com/netlify/plugins/commit/83dca8fcb28bdb795103823f2fa74f57c1a50981)) 150 | * update plugin @netlify/plugin-gatsby to version 3.6.2 ([#1174](https://github.com/netlify/plugins/issues/1174)) ([763218e](https://github.com/netlify/plugins/commit/763218ef34e862844457e04fdfbe32769c1ccdfc)) 151 | * update plugin @netlify/plugin-gatsby to version 3.7.0 ([#1233](https://github.com/netlify/plugins/issues/1233)) ([ebf5e1d](https://github.com/netlify/plugins/commit/ebf5e1dffeb1167b64642dbfa02504489e60a3cd)) 152 | * update plugin @netlify/plugin-lighthouse to version 4.1.0 ([#1168](https://github.com/netlify/plugins/issues/1168)) ([236189b](https://github.com/netlify/plugins/commit/236189b161e3cb7b671d18acfaf309e15bc2e504)) 153 | * update plugin @netlify/plugin-lighthouse to version 4.1.1 ([#1175](https://github.com/netlify/plugins/issues/1175)) ([f2803a8](https://github.com/netlify/plugins/commit/f2803a826cbc5fa0f48f398861c191853ef29b31)) 154 | * update plugin @netlify/plugin-lighthouse to version 5.0.0 ([#1228](https://github.com/netlify/plugins/issues/1228)) ([c622e00](https://github.com/netlify/plugins/commit/c622e00d4d98aa450f51a855c4f55233ec3e5f48)) 155 | * Use 4.37.1 of next-runtime for prerelease ([#1193](https://github.com/netlify/plugins/issues/1193)) ([1384599](https://github.com/netlify/plugins/commit/1384599c4093224aa2b2d077fca3d68051b5f8ed)) 156 | 157 | ## [6.68.0](https://github.com/netlify/plugins/compare/v6.67.0...v6.68.0) (2023-04-11) 158 | 159 | 160 | ### Features 161 | 162 | * added Next.js runtime 4.34.0 behind a feature flag ([#1166](https://github.com/netlify/plugins/issues/1166)) ([e9b62b6](https://github.com/netlify/plugins/commit/e9b62b6bffa53112c524579abbca27a11b909fa0)) 163 | * set next.js runtime 4.33.0 as stable version ([#1163](https://github.com/netlify/plugins/issues/1163)) ([23099fa](https://github.com/netlify/plugins/commit/23099fa0e113675c51e7911ab5448120bd7959ef)) 164 | 165 | ## [6.67.0](https://github.com/netlify/plugins/compare/v6.66.0...v6.67.0) (2023-03-27) 166 | 167 | 168 | ### Features 169 | 170 | * add feature flag for new version of next runtime ([#1147](https://github.com/netlify/plugins/issues/1147)) ([187bf01](https://github.com/netlify/plugins/commit/187bf01f6b71b43bb65a29bd017fe269e876ba1f)) 171 | * add feature flag to v4.31.0 of next runtime ([#1139](https://github.com/netlify/plugins/issues/1139)) ([04809a0](https://github.com/netlify/plugins/commit/04809a0047c5b43cc1ce4ae21028bed782a948c5)) 172 | * added Next.js runtime 4.33.0 behind a feature flag ([#1161](https://github.com/netlify/plugins/issues/1161)) ([88ed6c3](https://github.com/netlify/plugins/commit/88ed6c34b77b2b1f6f73c8c07cd7a6a4dbd05fd1)) 173 | * remove feature flag for next runtime ([#1146](https://github.com/netlify/plugins/issues/1146)) ([edb5bf4](https://github.com/netlify/plugins/commit/edb5bf40a7484ee4522c2b1cf9e991a4bbbe295d)) 174 | * remove prerelease feature flag, bump main to 3.6.0 for gatsby ([#1155](https://github.com/netlify/plugins/issues/1155)) ([ddbf1df](https://github.com/netlify/plugins/commit/ddbf1df6f3f62fe069f2036573a028795caa7b30)) 175 | * removing feature flag,updated main to 3.5.2, and set min to v2 ([#1141](https://github.com/netlify/plugins/issues/1141)) ([f531551](https://github.com/netlify/plugins/commit/f531551ce5ebd81e3da14adba849a9e53cb8185e)) 176 | * set next.js runtime 4.32.2 as stable version ([#1159](https://github.com/netlify/plugins/issues/1159)) ([c13a976](https://github.com/netlify/plugins/commit/c13a9760b0556a3214a2ca2df451dab5d5f85c83)) 177 | * update next runtime to fix version ([#1150](https://github.com/netlify/plugins/issues/1150)) ([04c1937](https://github.com/netlify/plugins/commit/04c1937aa9f4517ead8160cd2c9ab6e038a700a4)) 178 | * updating @netlify/plugin-gatsby with featureFlag for 3.6.0 ([#1145](https://github.com/netlify/plugins/issues/1145)) ([289c7e2](https://github.com/netlify/plugins/commit/289c7e2e53f020f3935333a6c6f205bcef48d722)) 179 | 180 | ## [6.66.0](https://github.com/netlify/plugins/compare/v6.65.0...v6.66.0) (2023-03-02) 181 | 182 | 183 | ### Features 184 | 185 | * add contentful preview plugin ([#1136](https://github.com/netlify/plugins/issues/1136)) ([6458464](https://github.com/netlify/plugins/commit/645846414d2f7187d9ef8dfdcdba87573d3fa10e)) 186 | * add feature flag to v 4.30.4 of next runtime ([#1121](https://github.com/netlify/plugins/issues/1121)) ([2f4186d](https://github.com/netlify/plugins/commit/2f4186df1a9120fbaba36addb65ed49cb954de3c)) 187 | * adding featureflag version ([#1133](https://github.com/netlify/plugins/issues/1133)) ([95858e6](https://github.com/netlify/plugins/commit/95858e674997881d4faef60b4cfc72c1d435dbe6)) 188 | * setting gatsby version for featureflag ([#1134](https://github.com/netlify/plugins/issues/1134)) ([f3b0a89](https://github.com/netlify/plugins/commit/f3b0a8904bda91e11025459b557e87593b6e97bb)) 189 | * update plugin @netlify/plugin-nextjs to version 4.30.3 ([#1114](https://github.com/netlify/plugins/issues/1114)) ([0710521](https://github.com/netlify/plugins/commit/0710521f31ede5deb822947ee03c3bf920c58800)) 190 | * update plugin @netlify/plugin-nextjs to version 4.30.4 ([#1120](https://github.com/netlify/plugins/issues/1120)) ([e0dcbd5](https://github.com/netlify/plugins/commit/e0dcbd5c1f9903c07cba8b1845dd70925d8c9c4a)) 191 | 192 | 193 | ### Bug Fixes 194 | 195 | * changed featureFlag ([#1135](https://github.com/netlify/plugins/issues/1135)) ([59bb4b1](https://github.com/netlify/plugins/commit/59bb4b19549bd6379f57cffa913eeef2fd39dcc3)) 196 | 197 | ## [6.65.0](https://github.com/netlify/plugins/compare/v6.64.0...v6.65.0) (2023-01-31) 198 | 199 | 200 | ### Features 201 | 202 | * add feature flagged plugin @netlify/plugin-nextjs as version 4.30.3 ([#1115](https://github.com/netlify/plugins/issues/1115)) ([d4e6e73](https://github.com/netlify/plugins/commit/d4e6e732f101cf0cdd5a4b8f293bfcc497b46360)) 203 | * updated the gatsby plugin to require v2 and up ([#1113](https://github.com/netlify/plugins/issues/1113)) ([03aa690](https://github.com/netlify/plugins/commit/03aa690acecdf2ca5c8471c5a9d77d456cda993b)) 204 | 205 | ## [6.64.0](https://github.com/netlify/plugins/compare/v6.63.0...v6.64.0) (2023-01-31) 206 | 207 | 208 | ### Features 209 | 210 | * latest version of gatsby plugin now requires v3 and up ([#1104](https://github.com/netlify/plugins/issues/1104)) ([1e230f3](https://github.com/netlify/plugins/commit/1e230f321b845d93de6d0a81def0662226768d7c)) 211 | * update plugin @netlify/plugin-gatsby to version 3.5.1 ([#1110](https://github.com/netlify/plugins/issues/1110)) ([9687ad2](https://github.com/netlify/plugins/commit/9687ad28be6c32e41dc1c98a925de69c24d60225)) 212 | * update plugin @netlify/plugin-lighthouse to version 4.0.6 ([#1111](https://github.com/netlify/plugins/issues/1111)) ([9c922ba](https://github.com/netlify/plugins/commit/9c922bab397b1da620e8eb5f965dc1ba7319fa2e)) 213 | * update plugin @netlify/plugin-lighthouse to version 4.0.7 ([#1112](https://github.com/netlify/plugins/issues/1112)) ([f1038ca](https://github.com/netlify/plugins/commit/f1038ca5a2d68e2c895b8c9adc659943a1ee9a31)) 214 | * update plugin @netlify/plugin-nextjs to version 4.30.1 ([#1107](https://github.com/netlify/plugins/issues/1107)) ([18f1e29](https://github.com/netlify/plugins/commit/18f1e293c1f79db0bacb8430a6ad2621998bd8fa)) 215 | 216 | ## [6.63.0](https://github.com/netlify/plugins/compare/v6.62.0...v6.63.0) (2023-01-23) 217 | 218 | 219 | ### Features 220 | 221 | * remove non-1.0.0 email plugin versions ([#1099](https://github.com/netlify/plugins/issues/1099)) ([06344ae](https://github.com/netlify/plugins/commit/06344aec60b48a685950c076e2ba78ed4fc1045d)) 222 | * update plugin @netlify/plugin-lighthouse to version 4.0.4 ([#1101](https://github.com/netlify/plugins/issues/1101)) ([13764cd](https://github.com/netlify/plugins/commit/13764cd25e73bf662faa723fe542cc06c7d8de19)) 223 | * update plugin @netlify/plugin-lighthouse to version 4.0.5 ([#1103](https://github.com/netlify/plugins/issues/1103)) ([1f09a3b](https://github.com/netlify/plugins/commit/1f09a3b88b0f23e3dfa69b414da2613b7098bde5)) 224 | * update plugin @netlify/plugin-nextjs to version 4.30.0 ([#1096](https://github.com/netlify/plugins/issues/1096)) ([40009fb](https://github.com/netlify/plugins/commit/40009fbecfaebaf9ce89f22abf9c8f5e54d37f75)) 225 | 226 | 227 | ### Bug Fixes 228 | 229 | * update Next runtime ff to 4.30.1 ([#1108](https://github.com/netlify/plugins/issues/1108)) ([c11420a](https://github.com/netlify/plugins/commit/c11420a4210549bf84c426bb338adb4ad3ff05ea)) 230 | * **workflow-ui:** use `packageId` for package paths when set ([#1102](https://github.com/netlify/plugins/issues/1102)) ([61c7476](https://github.com/netlify/plugins/commit/61c7476bc02d47e37db0aaeefe802a590a2f380b)) 231 | 232 | ## [6.62.0](https://github.com/netlify/plugins/compare/v6.61.0...v6.62.0) (2023-01-11) 233 | 234 | 235 | ### Features 236 | 237 | * increase version of next.js behind feature flag ([#1094](https://github.com/netlify/plugins/issues/1094)) ([c335ada](https://github.com/netlify/plugins/commit/c335ada7eed39a04b1302b598d0042707f64664e)) 238 | * pilot to 1.1.11 ([#1082](https://github.com/netlify/plugins/issues/1082)) ([2ce9596](https://github.com/netlify/plugins/commit/2ce9596a47fdfbc2656be8b06a71b7d3a034cbc2)) 239 | * version 1.0.0 for emails ([#1098](https://github.com/netlify/plugins/issues/1098)) ([63548b2](https://github.com/netlify/plugins/commit/63548b25c65bd714a8bcc75bd4bd7f1ad41e4e32)) 240 | 241 | 242 | ### Bug Fixes 243 | 244 | * unflag Next.js Runtime 4.29.4 ([#1093](https://github.com/netlify/plugins/issues/1093)) ([6cfbd73](https://github.com/netlify/plugins/commit/6cfbd73d84547394d415b04693d5b6711a50a736)) 245 | * update order of compatability for emails plugin ([#1097](https://github.com/netlify/plugins/issues/1097)) ([48b348b](https://github.com/netlify/plugins/commit/48b348b3f253704254ebea7b07677f70fef8a4ad)) 246 | 247 | ## [6.62.0](https://github.com/netlify/plugins/compare/v6.61.0...v6.62.0) (2023-01-06) 248 | 249 | 250 | ### Features 251 | 252 | * pilot to 1.1.11 ([#1082](https://github.com/netlify/plugins/issues/1082)) ([2ce9596](https://github.com/netlify/plugins/commit/2ce9596a47fdfbc2656be8b06a71b7d3a034cbc2)) 253 | 254 | ## [6.61.0](https://github.com/netlify/plugins/compare/v6.60.0...v6.61.0) (2022-12-19) 255 | 256 | 257 | ### Features 258 | 259 | * update plugin @netlify/plugin-nextjs to version 4.29.4 ([#1069](https://github.com/netlify/plugins/issues/1069)) ([c694d44](https://github.com/netlify/plugins/commit/c694d44f5cad15a8d16d8a1ed8fea070350eae6e)) 260 | 261 | ## [6.60.0](https://github.com/netlify/plugins/compare/v6.59.0...v6.60.0) (2022-12-16) 262 | 263 | 264 | ### Features 265 | 266 | * update FPP with WFUI ([#1056](https://github.com/netlify/plugins/issues/1056)) ([3c4e327](https://github.com/netlify/plugins/commit/3c4e3271275a7af45c5c1f5a60b6f02d9c6287d2)) 267 | 268 | ## [6.59.0](https://github.com/netlify/plugins/compare/v6.58.1...v6.59.0) (2022-12-07) 269 | 270 | 271 | ### Features 272 | 273 | * support nested workflow ui routes ([#1052](https://github.com/netlify/plugins/issues/1052)) ([560a0fc](https://github.com/netlify/plugins/commit/560a0fc159f0ce7e85da2debf3043831dc293e52)) 274 | 275 | 276 | ### Bug Fixes 277 | 278 | * update Next.js to 4.29.3 behind flag ([#1054](https://github.com/netlify/plugins/issues/1054)) ([307ffa3](https://github.com/netlify/plugins/commit/307ffa3a1c994af7c86c47e5adf810cb08b4a75b)) 279 | 280 | ## [6.58.1](https://github.com/netlify/plugins/compare/v6.58.0...v6.58.1) (2022-12-05) 281 | 282 | 283 | ### Bug Fixes 284 | 285 | * unflag Next.js 4.29.2 ([#1049](https://github.com/netlify/plugins/issues/1049)) ([63dc0d6](https://github.com/netlify/plugins/commit/63dc0d6cf8d0252236c224c069458b9fbe0d9a3c)) 286 | 287 | ## [6.58.0](https://github.com/netlify/plugins/compare/v6.57.0...v6.58.0) (2022-11-29) 288 | 289 | 290 | ### Features 291 | 292 | * add docs url to plugin model ([#1033](https://github.com/netlify/plugins/issues/1033)) ([edc174f](https://github.com/netlify/plugins/commit/edc174f49973ae5a745f2f751fc7b65fa0670bb9)) 293 | 294 | ## [6.57.0](https://github.com/netlify/plugins/compare/v6.56.0...v6.57.0) (2022-11-21) 295 | 296 | 297 | ### Features 298 | 299 | * add github action to publish workflow ui files ([#1027](https://github.com/netlify/plugins/issues/1027)) ([9eea77d](https://github.com/netlify/plugins/commit/9eea77d46aa33505259219a991abbaa14c4fa6be)) 300 | * allow workflow ui to be published manually ([#1028](https://github.com/netlify/plugins/issues/1028)) ([d579c3a](https://github.com/netlify/plugins/commit/d579c3a69dd09fe9cbfe36451b9f6c4e31f65220)) 301 | * copy workflow ui scripts from package ([#1029](https://github.com/netlify/plugins/issues/1029)) ([199867a](https://github.com/netlify/plugins/commit/199867af860e33a876932b84a979636bf2e71420)) 302 | * update plugin @netlify/plugin-lighthouse to version 4.0.3 ([#1026](https://github.com/netlify/plugins/issues/1026)) ([6799f0d](https://github.com/netlify/plugins/commit/6799f0d856e2f1cb72f31a49a16dca5c670ef5a5)) 303 | * update plugin @netlify/plugin-nextjs FF to version 4.29.2 ([#1032](https://github.com/netlify/plugins/issues/1032)) ([8c6d204](https://github.com/netlify/plugins/commit/8c6d204edceaa587c5fe007e011232d1364f1573)) 304 | * update plugin @netlify/plugin-nextjs to version 4.29.1 behind FF ([#1019](https://github.com/netlify/plugins/issues/1019)) ([85fa7e3](https://github.com/netlify/plugins/commit/85fa7e329ea456d54fd612a2b5ac80119cfd28fa)) 305 | 306 | 307 | ### Bug Fixes 308 | 309 | * make the publish script executable ([#1030](https://github.com/netlify/plugins/issues/1030)) ([f27e22f](https://github.com/netlify/plugins/commit/f27e22f8e674b5557a4d67d28138c803a02450cf)) 310 | 311 | ## [6.56.0](https://github.com/netlify/plugins/compare/v6.55.0...v6.56.0) (2022-11-11) 312 | 313 | 314 | ### Features 315 | 316 | * update plugin @netlify/plugin-nextjs to version 4.28.7 with feature flag ([#1012](https://github.com/netlify/plugins/issues/1012)) ([5849c14](https://github.com/netlify/plugins/commit/5849c146ee437b3c90c40b5390e7ab9ee0517114)) 317 | 318 | ## [6.55.0](https://github.com/netlify/plugins/compare/v6.54.0...v6.55.0) (2022-11-07) 319 | 320 | 321 | ### Features 322 | 323 | * update plugin @netlify/plugin-gatsby to version 3.4.8 ([#883](https://github.com/netlify/plugins/issues/883)) ([eaf7ef9](https://github.com/netlify/plugins/commit/eaf7ef9ae298f8c2cf0fcdbe947907a5755b2554)) 324 | * update plugin @netlify/plugin-nextjs to version 4.28.5 ([#1008](https://github.com/netlify/plugins/issues/1008)) ([5645dce](https://github.com/netlify/plugins/commit/5645dce519a649106ea1d492071287a6d1a500d0)) 325 | * update plugin @netlify/plugin-nextjs to version 4.28.6 ([#1011](https://github.com/netlify/plugins/issues/1011)) ([74d61e0](https://github.com/netlify/plugins/commit/74d61e05bd3ccb55ba60b1b9adfeb7e5d9e6ca27)) 326 | 327 | ## [6.54.0](https://github.com/netlify/plugins/compare/v6.53.1...v6.54.0) (2022-11-02) 328 | 329 | 330 | ### Features 331 | 332 | * update plugin @netlify/plugin-nextjs to version 4.28.4 ([#1002](https://github.com/netlify/plugins/issues/1002)) ([9692838](https://github.com/netlify/plugins/commit/9692838c6cc3b506c3b11ab54ebc29a1b4ce2921)) 333 | 334 | ## [6.53.1](https://github.com/netlify/plugins/compare/v6.53.0...v6.53.1) (2022-10-31) 335 | 336 | 337 | ### Bug Fixes 338 | 339 | * add packageName to variable tests ([#995](https://github.com/netlify/plugins/issues/995)) ([4bfc5d1](https://github.com/netlify/plugins/commit/4bfc5d1f6bd16bcef62e9538f78dab623067407e)) 340 | 341 | ## [6.53.0](https://github.com/netlify/plugins/compare/v6.52.0...v6.53.0) (2022-10-28) 342 | 343 | 344 | ### Features 345 | 346 | * update plugin @netlify/plugin-lighthouse to version 4.0.2 ([#970](https://github.com/netlify/plugins/issues/970)) ([ba50238](https://github.com/netlify/plugins/commit/ba50238074e760708371502d644df373040d0e64)) 347 | * update plugin @netlify/plugin-nextjs to version 4.28.2 ([#968](https://github.com/netlify/plugins/issues/968)) ([1bf1116](https://github.com/netlify/plugins/commit/1bf111602a3e05d38a69bcb4f9d37073f5fba5ea)) 348 | * update plugin @netlify/plugin-nextjs to version 4.28.3 ([#972](https://github.com/netlify/plugins/issues/972)) ([4fac250](https://github.com/netlify/plugins/commit/4fac250c8e5f9a6982108847e3076e4c073e1bad)) 349 | 350 | ## [6.52.0](https://github.com/netlify/plugins/compare/v6.51.0...v6.52.0) (2022-10-26) 351 | 352 | 353 | ### Features 354 | 355 | * add feature-flagged version of Next runtime ([#966](https://github.com/netlify/plugins/issues/966)) ([31070f9](https://github.com/netlify/plugins/commit/31070f9dc837deffc6d9fd5c83eb0591e7412c9a)) 356 | * update plugin @netlify/plugin-nextjs to version 4.27.3 ([#951](https://github.com/netlify/plugins/issues/951)) ([fb6f311](https://github.com/netlify/plugins/commit/fb6f3116c1601f94a658cf1fc2e430ae017b9c43)) 357 | 358 | 359 | ### Bug Fixes 360 | 361 | * add token-generator-bot to git signature ([#955](https://github.com/netlify/plugins/issues/955)) ([c3a4a71](https://github.com/netlify/plugins/commit/c3a4a7190403ebbf75ce3c8405059fa18b618a13)) 362 | * add variables to build step test ([#957](https://github.com/netlify/plugins/issues/957)) ([b8483fd](https://github.com/netlify/plugins/commit/b8483fd3dd04d7a1bc405873209caa4b536efdff)) 363 | * use generated token for sanity to github plugin sync ([#954](https://github.com/netlify/plugins/issues/954)) ([f17ac02](https://github.com/netlify/plugins/commit/f17ac0208acc2998f4358b1d1111d426eb287a11)) 364 | 365 | ## [6.51.0](https://github.com/netlify/plugins/compare/v6.50.2...v6.51.0) (2022-10-19) 366 | 367 | 368 | ### Features 369 | 370 | * support env vars in plugin definitions ([#946](https://github.com/netlify/plugins/issues/946)) ([1bb676f](https://github.com/netlify/plugins/commit/1bb676fcca83594131fe041dea1944da4acdf27a)) 371 | 372 | 373 | ### Bug Fixes 374 | 375 | * update Next plugin to 4.27.2 ([#947](https://github.com/netlify/plugins/issues/947)) ([ff2f23e](https://github.com/netlify/plugins/commit/ff2f23e2c02ed59ca4f3748ca8484e9c63cd59f9)) 376 | 377 | ## [6.50.2](https://github.com/netlify/plugins/compare/v6.50.1...v6.50.2) (2022-10-19) 378 | 379 | 380 | ### Bug Fixes 381 | 382 | * roll back Next to 4.26.0 ([#943](https://github.com/netlify/plugins/issues/943)) ([4880c6a](https://github.com/netlify/plugins/commit/4880c6a6071213c1076e55d486b4a8a5966c3a8b)) 383 | 384 | ## [6.50.1](https://github.com/netlify/plugins/compare/v6.50.0...v6.50.1) (2022-10-18) 385 | 386 | 387 | ### Bug Fixes 388 | 389 | * update Next plugin to 4.27.1 ([#938](https://github.com/netlify/plugins/issues/938)) ([cdeea70](https://github.com/netlify/plugins/commit/cdeea70600215db026a007aa70c7d7080adfeb8e)) 390 | 391 | ## [6.50.0](https://github.com/netlify/plugins/compare/v6.49.1...v6.50.0) (2022-10-17) 392 | 393 | 394 | ### Features 395 | 396 | * add emails plugin ([#895](https://github.com/netlify/plugins/issues/895)) ([c83d595](https://github.com/netlify/plugins/commit/c83d595aeeeb27d5be6e5d880f316f79ce20af91)) 397 | * update plugin @netlify/plugin-lighthouse to version 4.0.0 ([#892](https://github.com/netlify/plugins/issues/892)) ([aeb41c8](https://github.com/netlify/plugins/commit/aeb41c8a4563541015b81d3213f2d03022c8ab3d)) 398 | * update plugin @netlify/plugin-lighthouse to version 4.0.1 ([#899](https://github.com/netlify/plugins/issues/899)) ([53da108](https://github.com/netlify/plugins/commit/53da108b0fbce2f9e3967c1868e9e9d0441e6cb4)) 399 | * update plugin @netlify/plugin-nextjs to version 4.25.0 ([#908](https://github.com/netlify/plugins/issues/908)) ([8de6de3](https://github.com/netlify/plugins/commit/8de6de3c900b512ee5142606c26029ca046c5299)) 400 | * update plugin @netlify/plugin-nextjs to version 4.27.0 ([#934](https://github.com/netlify/plugins/issues/934)) ([88e2578](https://github.com/netlify/plugins/commit/88e25780beacbba415577dacb132a46a5d6d8e5e)) 401 | 402 | ## [6.49.1](https://github.com/netlify/plugins/compare/v6.49.0...v6.49.1) (2022-10-07) 403 | 404 | 405 | ### Bug Fixes 406 | 407 | * update netlify-plugin-formspree version ([#873](https://github.com/netlify/plugins/issues/873)) ([ac8d416](https://github.com/netlify/plugins/commit/ac8d4166cfffd7c608262d86a7770a98f35d8c34)) 408 | 409 | ## [6.49.0](https://github.com/netlify/plugins/compare/v6.48.0...v6.49.0) (2022-10-06) 410 | 411 | 412 | ### Features 413 | 414 | * update plugin @netlify/plugin-nextjs to version 4.24.3 ([#889](https://github.com/netlify/plugins/issues/889)) ([cc05897](https://github.com/netlify/plugins/commit/cc05897362769bb8596b8bbe67c312f57c3d8c8d)) 415 | 416 | ## [6.48.0](https://github.com/netlify/plugins/compare/v6.47.0...v6.48.0) (2022-10-05) 417 | 418 | 419 | ### Features 420 | 421 | * update plugin @netlify/plugin-nextjs to version 4.24.2 ([#887](https://github.com/netlify/plugins/issues/887)) ([3b88d6e](https://github.com/netlify/plugins/commit/3b88d6e6fa29e7937d56afd8d692d9eefea907e8)) 422 | 423 | 424 | ### Bug Fixes 425 | 426 | * corrected sync issue from CMS that included _key in compatibility array items ([#885](https://github.com/netlify/plugins/issues/885)) ([888c24b](https://github.com/netlify/plugins/commit/888c24b21bbed7d0e4c03dd1d6e18efca5ce3dcd)) 427 | 428 | ## [6.47.0](https://github.com/netlify/plugins/compare/v6.46.0...v6.47.0) (2022-10-05) 429 | 430 | 431 | ### Features 432 | 433 | * added synchronization from CMS to repo ([#849](https://github.com/netlify/plugins/issues/849)) ([8872a09](https://github.com/netlify/plugins/commit/8872a097f59d9c502ef05856ba275ea0f672423e)) 434 | * plugin synchronization from repository to CMS ([#820](https://github.com/netlify/plugins/issues/820)) ([39f8af1](https://github.com/netlify/plugins/commit/39f8af1b75ff0b83b019286d256dc352deba0250)) 435 | * update plugin @netlify/plugin-lighthouse to version 3.5.0 ([#850](https://github.com/netlify/plugins/issues/850)) ([f4b4f47](https://github.com/netlify/plugins/commit/f4b4f47f5f0434bd932c1ff3cbdad3fc11ddf163)) 436 | * update plugin @netlify/plugin-lighthouse to version 3.6.0 ([#851](https://github.com/netlify/plugins/issues/851)) ([7450749](https://github.com/netlify/plugins/commit/7450749a3b48f31dc3d2d661384d490818abd02c)) 437 | * update plugin @netlify/plugin-lighthouse to version 3.7.0 ([#853](https://github.com/netlify/plugins/issues/853)) ([58e7564](https://github.com/netlify/plugins/commit/58e7564d775f7ed5b517237f0a46d425778b0d09)) 438 | * update plugin @netlify/plugin-lighthouse to version 3.7.1 ([#869](https://github.com/netlify/plugins/issues/869)) ([19857e9](https://github.com/netlify/plugins/commit/19857e920c07ff8584b5b970aed17b8913ba4b6a)) 439 | * update plugin @netlify/plugin-nextjs to version 4.23.2 ([#845](https://github.com/netlify/plugins/issues/845)) ([0881aa9](https://github.com/netlify/plugins/commit/0881aa9f0e0205123d95086c1ecaa75c34bb6cea)) 440 | * update plugin @netlify/plugin-nextjs to version 4.23.3 ([#847](https://github.com/netlify/plugins/issues/847)) ([11b73ce](https://github.com/netlify/plugins/commit/11b73ce360e62ef31a0f3b15e6ab603d02d47d31)) 441 | * update plugin @netlify/plugin-nextjs to version 4.24.0 ([#866](https://github.com/netlify/plugins/issues/866)) ([b231f4e](https://github.com/netlify/plugins/commit/b231f4ed32ad49ab3ca09aed38df0d99b7117b04)) 442 | * update version of Cecil cache ([#854](https://github.com/netlify/plugins/issues/854)) ([12557d8](https://github.com/netlify/plugins/commit/12557d875ea143a04a8d454429f1bef50d998db6)) 443 | 444 | ## [6.46.0](https://github.com/netlify/plugins/compare/v6.45.0...v6.46.0) (2022-09-21) 445 | 446 | 447 | ### Features 448 | 449 | * update plugin @netlify/plugin-lighthouse to version 3.4.0 ([#840](https://github.com/netlify/plugins/issues/840)) ([e0714b2](https://github.com/netlify/plugins/commit/e0714b2afd500313652eba6ff1f9bcbb5eeb6fb2)) 450 | * update plugin @netlify/plugin-lighthouse to version 3.4.1 ([#842](https://github.com/netlify/plugins/issues/842)) ([9409486](https://github.com/netlify/plugins/commit/9409486e3c865ea07f456bce3f51807d71a96d39)) 451 | 452 | ## [6.45.0](https://github.com/netlify/plugins/compare/v6.44.0...v6.45.0) (2022-09-19) 453 | 454 | 455 | ### Features 456 | 457 | * update plugin @netlify/plugin-gatsby to version 3.4.7 ([#837](https://github.com/netlify/plugins/issues/837)) ([3ea470e](https://github.com/netlify/plugins/commit/3ea470e89f870984421499df429e90cdf133e9e0)) 458 | 459 | ## [6.44.0](https://github.com/netlify/plugins/compare/v6.43.0...v6.44.0) (2022-09-10) 460 | 461 | 462 | ### Features 463 | 464 | * update plugin @netlify/plugin-gatsby to version 3.4.6 ([#835](https://github.com/netlify/plugins/issues/835)) ([fbfc065](https://github.com/netlify/plugins/commit/fbfc0653ab6471a1b78a829ad5d098168bee74e3)) 465 | 466 | ## [6.43.0](https://github.com/netlify/plugins/compare/v6.42.0...v6.43.0) (2022-09-09) 467 | 468 | 469 | ### Features 470 | 471 | * update plugin @netlify/plugin-lighthouse to version 3.3.0 ([#831](https://github.com/netlify/plugins/issues/831)) ([7bf1621](https://github.com/netlify/plugins/commit/7bf1621ab6b0870e5e147e26307294e35e8714d0)) 472 | * update plugin @netlify/plugin-nextjs to version 4.22.0 ([#830](https://github.com/netlify/plugins/issues/830)) ([33dbab4](https://github.com/netlify/plugins/commit/33dbab4b86026079b74be5116e93a6727fb50e64)) 473 | 474 | ## [6.42.0](https://github.com/netlify/plugins/compare/v6.41.0...v6.42.0) (2022-09-08) 475 | 476 | 477 | ### Features 478 | 479 | * add `netlify-plugin-playwright-cache` ([#826](https://github.com/netlify/plugins/issues/826)) ([513868e](https://github.com/netlify/plugins/commit/513868e85e01824f413deb45635d535468f8f240)) 480 | * testing display preferences for plugins ([#827](https://github.com/netlify/plugins/issues/827)) ([d99afc8](https://github.com/netlify/plugins/commit/d99afc8b8a903405a6969436fe87e9778b878072)) 481 | * update plugin @netlify/next-runtime to version 4.19.0 ([#816](https://github.com/netlify/plugins/issues/816)) ([3177567](https://github.com/netlify/plugins/commit/317756722beec458d4b988398a2ef08d787cda0d)) 482 | * update plugin @netlify/plugin-gatsby to version 3.4.5 ([#822](https://github.com/netlify/plugins/issues/822)) ([72f7752](https://github.com/netlify/plugins/commit/72f77528729c4e489eac54d55154fa964225bbb0)) 483 | * update plugin @netlify/plugin-nextjs to version 4.20.0 ([#818](https://github.com/netlify/plugins/issues/818)) ([a3d2e46](https://github.com/netlify/plugins/commit/a3d2e468a5fbde49cb36ee7daa123823cbc5f87e)) 484 | * update plugin @netlify/plugin-nextjs to version 4.21.3 ([#828](https://github.com/netlify/plugins/issues/828)) ([592bdd1](https://github.com/netlify/plugins/commit/592bdd1dac005dd0fa37f1bfb10475c58b9b6a44)) 485 | * upgrade next runtime version ([#821](https://github.com/netlify/plugins/issues/821)) ([62ba5fa](https://github.com/netlify/plugins/commit/62ba5faf2f8d2e35da6e1ddca2884a8eb38d7bd1)) 486 | 487 | ## [6.41.0](https://github.com/netlify/plugins/compare/v6.40.0...v6.41.0) (2022-08-25) 488 | 489 | 490 | ### Features 491 | 492 | * remove feature flag ([#812](https://github.com/netlify/plugins/issues/812)) ([8d5e7ee](https://github.com/netlify/plugins/commit/8d5e7eeaa2f2c97adf2dcefbfa61b6ddda4a5b36)) 493 | * update plugin @netlify/plugin-nextjs to version 4.18.0 ([#809](https://github.com/netlify/plugins/issues/809)) ([c255030](https://github.com/netlify/plugins/commit/c255030de8bf5bcac0b7ee6cba8fc72543a64dce)) 494 | * update plugin @netlify/plugin-nextjs to version 4.18.1 ([#813](https://github.com/netlify/plugins/issues/813)) ([4c0a8be](https://github.com/netlify/plugins/commit/4c0a8becdd41a1f99bd7af10aff2eac1d4b18610)) 495 | 496 | ## [6.40.0](https://github.com/netlify/plugins/compare/v6.39.0...v6.40.0) (2022-08-19) 497 | 498 | 499 | ### Features 500 | 501 | * add feature flagged version of Next runtime ([#807](https://github.com/netlify/plugins/issues/807)) ([a12d48f](https://github.com/netlify/plugins/commit/a12d48fc4b28f5ee345d1d68576a0c74fbe49290)) 502 | * update plugin @netlify/plugin-gatsby to version 3.4.1 ([#796](https://github.com/netlify/plugins/issues/796)) ([29a6e45](https://github.com/netlify/plugins/commit/29a6e45d0a4f7de4d23358fb63ac210377f120b9)) 503 | 504 | ## [6.39.0](https://github.com/netlify/plugins/compare/v6.38.0...v6.39.0) (2022-08-11) 505 | 506 | 507 | ### Features 508 | 509 | * update plugin @netlify/plugin-nextjs to version 4.14.2 ([#802](https://github.com/netlify/plugins/issues/802)) ([0f7e5d6](https://github.com/netlify/plugins/commit/0f7e5d619d83e78c293b60082552910369231ac2)) 510 | 511 | ## [6.38.0](https://github.com/netlify/plugins/compare/v6.37.0...v6.38.0) (2022-08-11) 512 | 513 | 514 | ### Features 515 | 516 | * update plugin @netlify/plugin-nextjs to version 4.14.1 ([#797](https://github.com/netlify/plugins/issues/797)) ([039000d](https://github.com/netlify/plugins/commit/039000d1ef3fea6b32fcdadd69210810abcc0b02)) 517 | 518 | 519 | ### Bug Fixes 520 | 521 | * deprecate old Next.js plugins ([#798](https://github.com/netlify/plugins/issues/798)) ([e4c4236](https://github.com/netlify/plugins/commit/e4c4236b3dfdd7ce10cfdee1ba431963f499f92e)) 522 | 523 | ## [6.37.0](https://github.com/netlify/plugins/compare/v6.36.0...v6.37.0) (2022-08-09) 524 | 525 | 526 | ### Features 527 | 528 | * update plugin @netlify/plugin-lighthouse to version 3.2.1 ([#799](https://github.com/netlify/plugins/issues/799)) ([2ca1840](https://github.com/netlify/plugins/commit/2ca1840ee9cc420bd94399a5099056d08e82583d)) 529 | 530 | ## [6.36.0](https://github.com/netlify/plugins/compare/v6.35.0...v6.36.0) (2022-08-01) 531 | 532 | 533 | ### Features 534 | 535 | * update plugin @netlify/plugin-gatsby to version 3.4.0 ([#788](https://github.com/netlify/plugins/issues/788)) ([a9e3706](https://github.com/netlify/plugins/commit/a9e370605f9c6ed1e92642f13de7dddebe424a9e)) 536 | * update plugin @netlify/plugin-lighthouse to version 3.2.0 ([#794](https://github.com/netlify/plugins/issues/794)) ([5367bc6](https://github.com/netlify/plugins/commit/5367bc6276d67e934076049100d27b2a0b82ead3)) 537 | 538 | ## [6.35.0](https://github.com/netlify/plugins/compare/v6.34.0...v6.35.0) (2022-07-18) 539 | 540 | 541 | ### Features 542 | 543 | * update plugin @netlify/plugin-gatsby to version 3.3.1 ([#782](https://github.com/netlify/plugins/issues/782)) ([36dbe80](https://github.com/netlify/plugins/commit/36dbe80ab70cd968edbe850c954ce2ab9896af39)) 544 | 545 | ## [6.34.0](https://github.com/netlify/plugins/compare/v6.33.0...v6.34.0) (2022-07-13) 546 | 547 | 548 | ### Features 549 | 550 | * update plugin @netlify/plugin-gatsby to version 3.3.0 ([#778](https://github.com/netlify/plugins/issues/778)) ([bfa355b](https://github.com/netlify/plugins/commit/bfa355bbb74b7c90415f5fb8272ea79fc17be1fe)) 551 | * update plugin @netlify/plugin-nextjs to version 4.12.2 ([#777](https://github.com/netlify/plugins/issues/777)) ([9de11b3](https://github.com/netlify/plugins/commit/9de11b35a2cf8cd88d23c3580e8a6c1e14ce62c1)) 552 | 553 | ## [6.33.0](https://github.com/netlify/plugins/compare/v6.32.0...v6.33.0) (2022-07-13) 554 | 555 | 556 | ### Features 557 | 558 | * update lighthouse plugin to v3.0.1 ([#767](https://github.com/netlify/plugins/issues/767)) ([1872806](https://github.com/netlify/plugins/commit/1872806ae876c3efa9c7b84f495d4677689a490f)) 559 | 560 | ## [6.32.0](https://github.com/netlify/plugins/compare/v6.31.0...v6.32.0) (2022-07-12) 561 | 562 | 563 | ### Features 564 | 565 | * update plugin @netlify/plugin-nextjs to version 4.11.2 ([#773](https://github.com/netlify/plugins/issues/773)) ([3f2731c](https://github.com/netlify/plugins/commit/3f2731cc0a74ddf4a1dcad9825324a35596c2915)) 566 | 567 | ## [6.31.0](https://github.com/netlify/plugins/compare/v6.30.0...v6.31.0) (2022-07-12) 568 | 569 | 570 | ### Features 571 | 572 | * update plugin @netlify/plugin-nextjs to version 4.11.1 ([#766](https://github.com/netlify/plugins/issues/766)) ([fbb6fe3](https://github.com/netlify/plugins/commit/fbb6fe357e30d9c0c296acfd0ec23101e1bd6859)) 573 | 574 | ## [6.30.0](https://github.com/netlify/plugins/compare/v6.29.0...v6.30.0) (2022-06-29) 575 | 576 | 577 | ### Features 578 | 579 | * update netlify-plugin-nx-skip-build to v0.0.7n ([#760](https://github.com/netlify/plugins/issues/760)) ([e0c5675](https://github.com/netlify/plugins/commit/e0c567529118334c7ce1f3e4afdfef1429196b75)) 580 | * update plugin @netlify/plugin-gatsby to version 3.2.4 ([#759](https://github.com/netlify/plugins/issues/759)) ([c678f46](https://github.com/netlify/plugins/commit/c678f464d3248cb5e6a30345c0145157cc404ed3)) 581 | 582 | ## [6.29.0](https://github.com/netlify/plugins/compare/v6.28.0...v6.29.0) (2022-06-24) 583 | 584 | 585 | ### Features 586 | 587 | * add plugin netlify-plugin-flutter at version 1.1.0 ([#712](https://github.com/netlify/plugins/issues/712)) ([1c5e595](https://github.com/netlify/plugins/commit/1c5e5959ae8c8fa04f14e1001a0a070708b2c030)) 588 | * update plugin @netlify/plugin-gatsby to version 3.2.3 ([#755](https://github.com/netlify/plugins/issues/755)) ([cb3eb67](https://github.com/netlify/plugins/commit/cb3eb67af65ef993a7d67e988c025a11418d91e5)) 589 | * update plugin @netlify/plugin-nextjs to version 4.9.3 ([#757](https://github.com/netlify/plugins/issues/757)) ([de48694](https://github.com/netlify/plugins/commit/de486945157d3f219b23fdeb13178b133b7609cc)) 590 | * upgrade netlify-plugin-submit-sitemap to 0.4.0 ([#747](https://github.com/netlify/plugins/issues/747)) ([49ab650](https://github.com/netlify/plugins/commit/49ab650df4d7efc0dc74a460b9fc6b5a930a6e2d)) 591 | 592 | 593 | ### Bug Fixes 594 | 595 | * deactivate the deprecated Gatsby Cache plugin ([#731](https://github.com/netlify/plugins/issues/731)) ([fb340d8](https://github.com/netlify/plugins/commit/fb340d8724040dc3943bbc0c39c7f3458a55cb3e)) 596 | 597 | ## [6.28.0](https://github.com/netlify/plugins/compare/v6.27.0...v6.28.0) (2022-06-14) 598 | 599 | 600 | ### Features 601 | 602 | * downgrade next plugin because of bug ([#751](https://github.com/netlify/plugins/issues/751)) ([88a6eae](https://github.com/netlify/plugins/commit/88a6eae39e6a2b2fb2e637bfb2abaa8d3a09e422)) 603 | * update plugin @netlify/plugin-nextjs to version 4.9.0 ([#749](https://github.com/netlify/plugins/issues/749)) ([41e8fff](https://github.com/netlify/plugins/commit/41e8fff11ea13c3d178ef3022e17f2e7c722a192)) 604 | * update plugin @netlify/plugin-nextjs to version 4.9.1 ([#752](https://github.com/netlify/plugins/issues/752)) ([8babb1c](https://github.com/netlify/plugins/commit/8babb1c81f3176837a23627cd303373730295b5f)) 605 | 606 | ## [6.27.0](https://github.com/netlify/plugins/compare/v6.26.0...v6.27.0) (2022-06-01) 607 | 608 | 609 | ### Features 610 | 611 | * update plugin @netlify/plugin-gatsby to version 3.2.1 ([#742](https://github.com/netlify/plugins/issues/742)) ([d6cc1e8](https://github.com/netlify/plugins/commit/d6cc1e8c362e2bc428c2bfc51f16e5916398d089)) 612 | 613 | 614 | ### Bug Fixes 615 | 616 | * rollback to earlier version ([#740](https://github.com/netlify/plugins/issues/740)) ([cae3b95](https://github.com/netlify/plugins/commit/cae3b9561665690f96e877a01c73c9605588f089)) 617 | 618 | ## [6.26.0](https://github.com/netlify/plugins/compare/v6.25.0...v6.26.0) (2022-05-26) 619 | 620 | 621 | ### Features 622 | 623 | * update plugin @netlify/plugin-gatsby to version 3.1.0 ([#733](https://github.com/netlify/plugins/issues/733)) ([a744d94](https://github.com/netlify/plugins/commit/a744d9420c9ff697e5ccffa094c762d9fbfd8707)) 624 | 625 | ## [6.25.0](https://github.com/netlify/plugins/compare/v6.24.0...v6.25.0) (2022-05-16) 626 | 627 | 628 | ### Features 629 | 630 | * add TakeShape plugin ([#730](https://github.com/netlify/plugins/issues/730)) ([b7c3a90](https://github.com/netlify/plugins/commit/b7c3a905921da55340dd3b5fe243b27713f57798)) 631 | 632 | ## [6.24.0](https://github.com/netlify/plugins/compare/v6.23.0...v6.24.0) (2022-05-05) 633 | 634 | 635 | ### Features 636 | 637 | * add Very Good Security plugin ([#726](https://github.com/netlify/plugins/issues/726)) ([4391210](https://github.com/netlify/plugins/commit/4391210ad9cf0bb5c91d390c298c2dfe1a567f0b)) 638 | 639 | ## [6.23.0](https://github.com/netlify/plugins/compare/v6.22.0...v6.23.0) (2022-05-03) 640 | 641 | 642 | ### Features 643 | 644 | * update plugin @netlify/plugin-nextjs to version 4.7.0 ([#724](https://github.com/netlify/plugins/issues/724)) ([3713e80](https://github.com/netlify/plugins/commit/3713e809f10b844c7500863bff9b2eb21faf8ad0)) 645 | 646 | ## [6.22.0](https://github.com/netlify/plugins/compare/v6.21.0...v6.22.0) (2022-04-29) 647 | 648 | 649 | ### Features 650 | 651 | * update plugin @netlify/plugin-next-js to version 4.6.0 ([#720](https://github.com/netlify/plugins/issues/720)) ([58291b9](https://github.com/netlify/plugins/commit/58291b92c0a815481941a6a173c814a4eab42d7a)) 652 | 653 | ## [6.21.0](https://github.com/netlify/plugins/compare/v6.20.1...v6.21.0) (2022-04-27) 654 | 655 | 656 | ### Features 657 | 658 | * update plugin @netlify/plugin-nextjs to version 4.5.0 ([#718](https://github.com/netlify/plugins/issues/718)) ([94fb40b](https://github.com/netlify/plugins/commit/94fb40b6d287b28162d117fc97d3c9510b2c1804)) 659 | 660 | ### [6.20.1](https://github.com/netlify/plugins/compare/v6.20.0...v6.20.1) (2022-04-26) 661 | 662 | 663 | ### Bug Fixes 664 | 665 | * update Next plugin to 4.4.3 ([#715](https://github.com/netlify/plugins/issues/715)) ([8be4b71](https://github.com/netlify/plugins/commit/8be4b719d9f586cf16d8a7eaa26b39597a76c1f6)) 666 | * update Next plugin to 4.4.4 ([#717](https://github.com/netlify/plugins/issues/717)) ([5b3476e](https://github.com/netlify/plugins/commit/5b3476e63e79d92eed1ad76e9bc22765ed383f33)) 667 | 668 | ## [6.20.0](https://github.com/netlify/plugins/compare/v6.19.0...v6.20.0) (2022-04-21) 669 | 670 | 671 | ### Features 672 | 673 | * update Next plugin to 4.4.2 ([#713](https://github.com/netlify/plugins/issues/713)) ([9a2444b](https://github.com/netlify/plugins/commit/9a2444bdcd8f68a68a92a28e1e06889286ebed1d)) 674 | 675 | ## [6.19.0](https://github.com/netlify/plugins/compare/v6.18.1...v6.19.0) (2022-04-07) 676 | 677 | 678 | ### Features 679 | 680 | * update plugin @netlify/plugin-gatsby to version 3.0.0 ([#707](https://github.com/netlify/plugins/issues/707)) ([3eb6d99](https://github.com/netlify/plugins/commit/3eb6d99ff4d37ccd4288da5a2b69af57ac2907da)) 681 | * update plugin @netlify/plugin-nextjs to version 4.3.2 ([#705](https://github.com/netlify/plugins/issues/705)) ([e28ad75](https://github.com/netlify/plugins/commit/e28ad75981dbac6954bb9afab3f30bb6b435fe39)) 682 | 683 | ### [6.18.1](https://github.com/netlify/plugins/compare/v6.18.0...v6.18.1) (2022-03-30) 684 | 685 | 686 | ### Bug Fixes 687 | 688 | * downgrade Next to 4.2.8 ([#701](https://github.com/netlify/plugins/issues/701)) ([1b586d3](https://github.com/netlify/plugins/commit/1b586d39f024bca73b6235cbafe265a4d998d12d)) 689 | 690 | ## [6.18.0](https://github.com/netlify/plugins/compare/v6.17.0...v6.18.0) (2022-03-29) 691 | 692 | 693 | ### Features 694 | 695 | * update plugin @netlify/plugin-nextjs to version 4.3.0 ([#696](https://github.com/netlify/plugins/issues/696)) ([90f47c9](https://github.com/netlify/plugins/commit/90f47c9cf14a7d11661c9e61b7960049152dd97d)) 696 | 697 | 698 | ### Bug Fixes 699 | 700 | * update Next plugin to 4.3.1 ([#700](https://github.com/netlify/plugins/issues/700)) ([ae2b139](https://github.com/netlify/plugins/commit/ae2b139d906303f4c3414cb30b742f636bf7f455)) 701 | 702 | ## [6.17.0](https://github.com/netlify/plugins/compare/v6.16.1...v6.17.0) (2022-03-22) 703 | 704 | 705 | ### Features 706 | 707 | * update plugin @netlify/plugin-gatsby to version 2.1.4 ([#692](https://github.com/netlify/plugins/issues/692)) ([3277bfb](https://github.com/netlify/plugins/commit/3277bfb46c45ba46217faedbc08b1e537e53f9ef)) 708 | * update plugin @netlify/plugin-nextjs to version 4.2.8 ([#693](https://github.com/netlify/plugins/issues/693)) ([dd71639](https://github.com/netlify/plugins/commit/dd716394d41e030f0e37241dd3c44535bfcddcc3)) 709 | * upgrade netlify-plugin-submit-sitemap to 0.3.0 ([#689](https://github.com/netlify/plugins/issues/689)) ([104a224](https://github.com/netlify/plugins/commit/104a224fa3f180aabddbe469a380c03d403d7813)) 710 | 711 | ### [6.16.1](https://github.com/netlify/plugins/compare/v6.16.0...v6.16.1) (2022-03-16) 712 | 713 | 714 | ### Bug Fixes 715 | 716 | * **gatsby:** update Gatsby plugin to 2.1.3 ([#688](https://github.com/netlify/plugins/issues/688)) ([dfa6b3f](https://github.com/netlify/plugins/commit/dfa6b3ff1cba84b502813ddc2630afc1b4d6753e)) 717 | * upgrade netlify-plugin-stepzen version to 1.0.4 ([#685](https://github.com/netlify/plugins/issues/685)) ([4d0f337](https://github.com/netlify/plugins/commit/4d0f3373b1254f0561f853e248194e646b2d98c2)) 718 | 719 | ## [6.16.0](https://github.com/netlify/plugins/compare/v6.15.0...v6.16.0) (2022-03-03) 720 | 721 | 722 | ### Features 723 | 724 | * update Gatsby to 2.1.1 ([#679](https://github.com/netlify/plugins/issues/679)) ([7720038](https://github.com/netlify/plugins/commit/7720038d22c41e6951bc95198367ec2c949dbad9)) 725 | 726 | 727 | ### Bug Fixes 728 | 729 | * update Gatsby to 2.1.2 ([#681](https://github.com/netlify/plugins/issues/681)) ([13c528e](https://github.com/netlify/plugins/commit/13c528ebdcc2736655db20a937bc01679f9de90e)) 730 | 731 | ## [6.15.0](https://github.com/netlify/plugins/compare/v6.14.0...v6.15.0) (2022-03-01) 732 | 733 | 734 | ### Features 735 | 736 | * update plugin netlify-plugin-is-website-vulnerable to version 2.0.3 ([#677](https://github.com/netlify/plugins/issues/677)) ([8bf193c](https://github.com/netlify/plugins/commit/8bf193cb51964af03b7c29dbfe5c88f9ecfece0d)) 737 | 738 | ## [6.14.0](https://github.com/netlify/plugins/compare/v6.13.1...v6.14.0) (2022-02-25) 739 | 740 | 741 | ### Features 742 | 743 | * adding Cloudinary plugin ([#673](https://github.com/netlify/plugins/issues/673)) ([088613a](https://github.com/netlify/plugins/commit/088613a17936b7b3c7b29eaf8d4362066030a7d7)) 744 | * update version of @sentry/netlify-build-plugin ([#671](https://github.com/netlify/plugins/issues/671)) ([edb9013](https://github.com/netlify/plugins/commit/edb901345204fdbc767779acec5754edcdc16f8a)) 745 | 746 | ### [6.13.1](https://github.com/netlify/plugins/compare/v6.13.0...v6.13.1) (2022-02-21) 747 | 748 | 749 | ### Bug Fixes 750 | 751 | * update Gatsby plugin to 2.0.3 ([#669](https://github.com/netlify/plugins/issues/669)) ([5ea8d4d](https://github.com/netlify/plugins/commit/5ea8d4dddfc3a3b3089b4e0c64c0975df3f736ca)) 752 | 753 | ## [6.13.0](https://github.com/netlify/plugins/compare/v6.12.0...v6.13.0) (2022-02-21) 754 | 755 | 756 | ### Features 757 | 758 | * upgrade Lighthouse plugin to `2.1.3` ([#626](https://github.com/netlify/plugins/issues/626)) ([e9041eb](https://github.com/netlify/plugins/commit/e9041eb8481e3ff05d4fefd76a6c8523544fa19a)) 759 | 760 | ## [6.12.0](https://github.com/netlify/plugins/compare/v6.11.0...v6.12.0) (2022-02-18) 761 | 762 | 763 | ### Features 764 | 765 | * update plugin @netlify/plugin-nextjs to version 4.2.7 ([#664](https://github.com/netlify/plugins/issues/664)) ([fa3272e](https://github.com/netlify/plugins/commit/fa3272e2580ccfb4d00afa34a3493995bbce34b5)) 766 | 767 | ## [6.11.0](https://github.com/netlify/plugins/compare/v6.10.2...v6.11.0) (2022-02-14) 768 | 769 | 770 | ### Features 771 | 772 | * update plugin @netlify/plugin-nextjs to version 4.2.6 ([#662](https://github.com/netlify/plugins/issues/662)) ([9d18fe2](https://github.com/netlify/plugins/commit/9d18fe255c4e299b0c2a25900ada8e97d0d0f3b4)) 773 | 774 | ### [6.10.2](https://github.com/netlify/plugins/compare/v6.10.1...v6.10.2) (2022-02-11) 775 | 776 | 777 | ### Bug Fixes 778 | 779 | * **plugins:** update Algolia crawler ([#659](https://github.com/netlify/plugins/issues/659)) ([41408b8](https://github.com/netlify/plugins/commit/41408b8c2962ad034e98c5117c7d5ae3a66bbfa4)) 780 | 781 | ### [6.10.1](https://github.com/netlify/plugins/compare/v6.10.0...v6.10.1) (2022-02-09) 782 | 783 | 784 | ### Bug Fixes 785 | 786 | * upgrade netlify-plugin-commandbar version to `0.0.4` ([#657](https://github.com/netlify/plugins/issues/657)) ([6b84f14](https://github.com/netlify/plugins/commit/6b84f143e3d4b368367cf09d684da41d8fd52954)) 787 | 788 | ## [6.10.0](https://github.com/netlify/plugins/compare/v6.9.0...v6.10.0) (2022-02-09) 789 | 790 | 791 | ### Features 792 | 793 | * plugin Submission: CommandBar + Netlify ([#631](https://github.com/netlify/plugins/issues/631)) ([e3011c8](https://github.com/netlify/plugins/commit/e3011c8154cdde285a8400705265eaf2e2997484)) 794 | 795 | ## [6.9.0](https://github.com/netlify/plugins/compare/v6.8.0...v6.9.0) (2022-02-07) 796 | 797 | 798 | ### Features 799 | 800 | * add New Relic plugin ([#646](https://github.com/netlify/plugins/issues/646)) ([cd090a1](https://github.com/netlify/plugins/commit/cd090a14927bfcbf9119f69cb5745e401db438e9)) 801 | * update plugin @netlify/plugin-nextjs to version 4.2.5 ([#654](https://github.com/netlify/plugins/issues/654)) ([bd24eb7](https://github.com/netlify/plugins/commit/bd24eb7dcc6759f3daf84dae37cc10b71a579fd5)) 802 | 803 | ## [6.8.0](https://github.com/netlify/plugins/compare/v6.7.0...v6.8.0) (2022-02-07) 804 | 805 | 806 | ### Features 807 | 808 | * update plugin netlify-plugin-is-website-vulnerable to version 2.0.2 ([#650](https://github.com/netlify/plugins/issues/650)) ([6b91dde](https://github.com/netlify/plugins/commit/6b91dde9cf294859fb168588577a95a22a9bda6e)) 809 | 810 | ## [6.7.0](https://github.com/netlify/plugins/compare/v6.6.0...v6.7.0) (2022-02-04) 811 | 812 | 813 | ### Features 814 | 815 | * update plugin @netlify/plugin-nextjs to version 4.2.4 ([#641](https://github.com/netlify/plugins/issues/641)) ([a689a84](https://github.com/netlify/plugins/commit/a689a84a47a0b90c50f888dd5bc55f7b6133de76)) 816 | 817 | ## [6.6.0](https://github.com/netlify/plugins/compare/v6.5.0...v6.6.0) (2022-02-03) 818 | 819 | 820 | ### Features 821 | 822 | * upgrade Gatsby plugin to v2 ([#644](https://github.com/netlify/plugins/issues/644)) ([6d70393](https://github.com/netlify/plugins/commit/6d703935a466e809f0f8302ada92fa1b41e340fc)) 823 | 824 | ## [6.5.0](https://github.com/netlify/plugins/compare/v6.4.1...v6.5.0) (2022-02-02) 825 | 826 | 827 | ### Features 828 | 829 | * update plugin @netlify/plugin-nextjs to version 4.2.3 ([#637](https://github.com/netlify/plugins/issues/637)) ([ccdf279](https://github.com/netlify/plugins/commit/ccdf279fd5442dc66dffa60d34591d96a0ff9ebf)) 830 | * upgrade skip nx plugin to 0.0.5 ([#635](https://github.com/netlify/plugins/issues/635)) ([63d91d3](https://github.com/netlify/plugins/commit/63d91d3fed000a10cb5f72fff12bbb8073e8eaf8)) 831 | 832 | ### [6.4.1](https://github.com/netlify/plugins/compare/v6.4.0...v6.4.1) (2022-01-31) 833 | 834 | 835 | ### Bug Fixes 836 | 837 | * update Next plugin to 4.2.2 ([#633](https://github.com/netlify/plugins/issues/633)) ([e7429d7](https://github.com/netlify/plugins/commit/e7429d70b14bb51d33d3495ab7dd9e7a1f7460bd)) 838 | 839 | ## [6.4.0](https://github.com/netlify/plugins/compare/v6.3.2...v6.4.0) (2022-01-28) 840 | 841 | 842 | ### Features 843 | 844 | * update plugin netlify-plugin-is-website-vulnerable to version 2.0.1 ([#629](https://github.com/netlify/plugins/issues/629)) ([e0eae84](https://github.com/netlify/plugins/commit/e0eae84bc0daf18c8da19fca0b579485b6d988d4)) 845 | 846 | ### [6.3.2](https://github.com/netlify/plugins/compare/v6.3.1...v6.3.2) (2022-01-26) 847 | 848 | 849 | ### Bug Fixes 850 | 851 | * update to Next 4.2.1 ([#627](https://github.com/netlify/plugins/issues/627)) ([8915781](https://github.com/netlify/plugins/commit/8915781fafc5bc014252dc1e97e584b94fb4910f)) 852 | 853 | ### [6.3.1](https://github.com/netlify/plugins/compare/v6.3.0...v6.3.1) (2022-01-21) 854 | 855 | 856 | ### Bug Fixes 857 | 858 | * bump `netlify-plugin-debug-cache` to `1.0.4` ([#622](https://github.com/netlify/plugins/issues/622)) ([5af9d1d](https://github.com/netlify/plugins/commit/5af9d1d2fcb0790c5e986179a79c133143f349bb)) 859 | 860 | ## [6.3.0](https://github.com/netlify/plugins/compare/v6.2.1...v6.3.0) (2022-01-17) 861 | 862 | 863 | ### Features 864 | 865 | * update to Next 4.2.0 ([#618](https://github.com/netlify/plugins/issues/618)) ([f187143](https://github.com/netlify/plugins/commit/f187143e1d0e646295b654df0275748ceca623fa)) 866 | 867 | 868 | ### Bug Fixes 869 | 870 | * husky binary not found ([#615](https://github.com/netlify/plugins/issues/615)) ([617c6c6](https://github.com/netlify/plugins/commit/617c6c63134bb6b68e1e78475150e29c69d7024a)) 871 | 872 | ### [6.2.1](https://github.com/netlify/plugins/compare/v6.2.0...v6.2.1) (2022-01-11) 873 | 874 | 875 | ### Bug Fixes 876 | 877 | * next 4.1.1 ([#609](https://github.com/netlify/plugins/issues/609)) ([37c33c3](https://github.com/netlify/plugins/commit/37c33c3948cfdc618cd875e85d66cb1f885d0892)) 878 | 879 | ## [6.2.0](https://www.github.com/netlify/plugins/compare/v6.1.0...v6.2.0) (2021-12-14) 880 | 881 | 882 | ### Features 883 | 884 | * upgrade Next plugin to 4.0.0 ([#531](https://www.github.com/netlify/plugins/issues/531)) ([a745da0](https://www.github.com/netlify/plugins/commit/a745da0ef923237ebf4d0025dcc2fd682358902f)) 885 | 886 | ## [6.1.0](https://www.github.com/netlify/plugins/compare/v6.0.1...v6.1.0) (2021-12-13) 887 | 888 | 889 | ### Features 890 | 891 | * bump Inline Critical CSS to v2.0.0 ([#530](https://www.github.com/netlify/plugins/issues/530)) ([62dac30](https://www.github.com/netlify/plugins/commit/62dac3082d7bd10b67fe73f0161c1c97e4b6e1cf)) 892 | 893 | ### [6.0.1](https://www.github.com/netlify/plugins/compare/v6.0.0...v6.0.1) (2021-12-02) 894 | 895 | 896 | ### Bug Fixes 897 | 898 | * main file is missing ([#509](https://www.github.com/netlify/plugins/issues/509)) ([ffc8b9b](https://www.github.com/netlify/plugins/commit/ffc8b9b44333963e0e87ddf77dce83104329b2ce)) 899 | 900 | ## [6.0.0](https://www.github.com/netlify/plugins/compare/v5.0.0...v6.0.0) (2021-12-02) 901 | 902 | 903 | ### ⚠ BREAKING CHANGES 904 | 905 | * use pure ES modules (#506) 906 | 907 | ### Miscellaneous Chores 908 | 909 | * use pure ES modules ([#506](https://www.github.com/netlify/plugins/issues/506)) ([663bc7e](https://www.github.com/netlify/plugins/commit/663bc7ef9e54f518e67e2284295090be715b20b0)) 910 | 911 | ## [5.0.0](https://www.github.com/netlify/plugins/compare/v4.2.0...v5.0.0) (2021-11-24) 912 | 913 | 914 | ### ⚠ BREAKING CHANGES 915 | 916 | * drop support for Node 10 (#502) 917 | 918 | ### Miscellaneous Chores 919 | 920 | * drop support for Node 10 ([#502](https://www.github.com/netlify/plugins/issues/502)) ([681a642](https://www.github.com/netlify/plugins/commit/681a6428ad617ddb9de5b29b36667b88f28b2ad3)) 921 | 922 | ## [4.2.0](https://www.github.com/netlify/plugins/compare/v4.1.0...v4.2.0) (2021-11-08) 923 | 924 | 925 | ### Features 926 | 927 | * add simple build logger plugin ([#486](https://www.github.com/netlify/plugins/issues/486)) ([ceb2b2d](https://www.github.com/netlify/plugins/commit/ceb2b2dec230e7dd7242e0b332c3f4c87b0c482a)) 928 | 929 | ## [4.1.0](https://www.github.com/netlify/plugins/compare/v4.0.1...v4.1.0) (2021-10-29) 930 | 931 | 932 | ### Features 933 | 934 | * add nx skip deploy plugin ([#481](https://www.github.com/netlify/plugins/issues/481)) ([8197120](https://www.github.com/netlify/plugins/commit/81971205e971173f36ce0bec87dc5a3e97e90a2f)) 935 | 936 | ### [4.0.1](https://www.github.com/netlify/plugins/compare/v4.0.0...v4.0.1) (2021-10-12) 937 | 938 | 939 | ### Bug Fixes 940 | 941 | * update Next plugin to 3.9.2 ([#476](https://www.github.com/netlify/plugins/issues/476)) ([3edd191](https://www.github.com/netlify/plugins/commit/3edd191d469a610fbf222510a0d5d209b8079e35)) 942 | 943 | ## [4.0.0](https://www.github.com/netlify/plugins/compare/v3.6.2...v4.0.0) (2021-09-27) 944 | 945 | 946 | ### ⚠ BREAKING CHANGES 947 | 948 | * drop Node 8 (#456) 949 | 950 | ### Miscellaneous Chores 951 | 952 | * drop Node 8 ([#456](https://www.github.com/netlify/plugins/issues/456)) ([a31ac1b](https://www.github.com/netlify/plugins/commit/a31ac1b09da4fb483d425ec82b49217525a52e32)) 953 | 954 | ### [3.6.2](https://www.github.com/netlify/plugins/compare/v3.6.1...v3.6.2) (2021-09-27) 955 | 956 | 957 | ### Bug Fixes 958 | 959 | * deactivate `netlify-plugin-search-index` ([#452](https://www.github.com/netlify/plugins/issues/452)) ([ae8b0c3](https://www.github.com/netlify/plugins/commit/ae8b0c32c2bda4bd53d6eed673c769b91990946f)) 960 | 961 | ### [3.6.1](https://www.github.com/netlify/plugins/compare/v3.6.0...v3.6.1) (2021-09-24) 962 | 963 | 964 | ### Bug Fixes 965 | 966 | * corner case causing build internal error. ([#447](https://www.github.com/netlify/plugins/issues/447)) ([ba7a256](https://www.github.com/netlify/plugins/commit/ba7a2565357097da2b9de549a380fb2132720be8)) 967 | 968 | ## [3.6.0](https://www.github.com/netlify/plugins/compare/v3.5.0...v3.6.0) (2021-09-01) 969 | 970 | 971 | ### Features 972 | 973 | * guidelines for proper `netlifyConfig` usage ([#433](https://www.github.com/netlify/plugins/issues/433)) ([083f3c1](https://www.github.com/netlify/plugins/commit/083f3c1c131a76a35c469bbf3aa278e2c30dc4b3)) 974 | * update angular universal plugin to 1.0.1 ([#437](https://www.github.com/netlify/plugins/issues/437)) ([3b85614](https://www.github.com/netlify/plugins/commit/3b8561446aedc536fbd9d2ce7b81892c8fe349d5)) 975 | * update essential next to 3.9.0 ([#431](https://www.github.com/netlify/plugins/issues/431)) ([938eb57](https://www.github.com/netlify/plugins/commit/938eb57d4f6d9db135d1e10bb449acb6cd0b1412)) 976 | 977 | ## [3.5.0](https://www.github.com/netlify/plugins/compare/v3.4.0...v3.5.0) (2021-08-23) 978 | 979 | 980 | ### Features 981 | 982 | * add `netlify-plugin-use-env-in-runtime` ([#403](https://www.github.com/netlify/plugins/issues/403)) ([5b9f1dd](https://www.github.com/netlify/plugins/commit/5b9f1dd2f4ea972554e2a0c3a42a30307fe5f9b4)) 983 | 984 | ## [3.4.0](https://www.github.com/netlify/plugins/compare/v3.3.0...v3.4.0) (2021-08-23) 985 | 986 | 987 | ### Features 988 | 989 | * remove "Essential" from name of Angular plugin ([#422](https://www.github.com/netlify/plugins/issues/422)) ([915fd39](https://www.github.com/netlify/plugins/commit/915fd39ab2e984286ac74162bf5311567f5f98b4)) 990 | 991 | ## [3.3.0](https://www.github.com/netlify/plugins/compare/v3.2.1...v3.3.0) (2021-08-09) 992 | 993 | 994 | ### Features 995 | 996 | * add essential angular universal beta ([#418](https://www.github.com/netlify/plugins/issues/418)) ([eb01da2](https://www.github.com/netlify/plugins/commit/eb01da2b78e81cdfa906e56aa486cd2b7605a610)) 997 | 998 | ### [3.2.1](https://www.github.com/netlify/plugins/compare/v3.2.0...v3.2.1) (2021-08-04) 999 | 1000 | 1001 | ### Bug Fixes 1002 | 1003 | * deprecate the old Gatsby cache plugin ([#415](https://www.github.com/netlify/plugins/issues/415)) ([ab6bd34](https://www.github.com/netlify/plugins/commit/ab6bd34108bb99354703fe411e4ece14ed620e4d)) 1004 | 1005 | ## [3.2.0](https://www.github.com/netlify/plugins/compare/v3.1.0...v3.2.0) (2021-08-03) 1006 | 1007 | 1008 | ### Features 1009 | 1010 | * add `featureFlag` property ([#411](https://www.github.com/netlify/plugins/issues/411)) ([0dc87ab](https://www.github.com/netlify/plugins/commit/0dc87ab7279ed99910ad6124a4f142f0ae7fe68a)) 1011 | 1012 | ## [3.1.0](https://www.github.com/netlify/plugins/compare/v3.0.1...v3.1.0) (2021-08-03) 1013 | 1014 | 1015 | ### Features 1016 | 1017 | * update Next to 3.8.0 ([#412](https://www.github.com/netlify/plugins/issues/412)) ([282b9ce](https://www.github.com/netlify/plugins/commit/282b9ce96b126cac97c3c89102e7b2d81e83d917)) 1018 | 1019 | ### [3.0.1](https://www.github.com/netlify/plugins/compare/v3.0.0...v3.0.1) (2021-08-02) 1020 | 1021 | 1022 | ### Bug Fixes 1023 | 1024 | * main entry point ([#409](https://www.github.com/netlify/plugins/issues/409)) ([4f8b4c1](https://www.github.com/netlify/plugins/commit/4f8b4c1a5e8650979d53b272fedb25d491a51532)) 1025 | 1026 | ## [3.0.0](https://www.github.com/netlify/plugins/compare/v2.21.0...v3.0.0) (2021-08-02) 1027 | 1028 | 1029 | ### ⚠ BREAKING CHANGES 1030 | 1031 | * expose `pluginsUrl` (#407) 1032 | 1033 | ### Features 1034 | 1035 | * document `plugins.json` syntax versioning ([#398](https://www.github.com/netlify/plugins/issues/398)) ([e1d1727](https://www.github.com/netlify/plugins/commit/e1d1727e9bc4231ebcc3f81213e36df53a9724cd)) 1036 | 1037 | 1038 | ### Miscellaneous Chores 1039 | 1040 | * expose `pluginsUrl` ([#407](https://www.github.com/netlify/plugins/issues/407)) ([0b15cbf](https://www.github.com/netlify/plugins/commit/0b15cbf286882129988ff49bf01524973962750d)) 1041 | 1042 | ## [2.21.0](https://www.github.com/netlify/plugins/compare/v2.20.0...v2.21.0) (2021-07-29) 1043 | 1044 | 1045 | ### Features 1046 | 1047 | * fix `plugins.json` versioning ([#394](https://www.github.com/netlify/plugins/issues/394)) ([085cb8a](https://www.github.com/netlify/plugins/commit/085cb8af66d40acf6502e1559567cbb62686d97e)) 1048 | 1049 | ## [2.20.0](https://www.github.com/netlify/plugins/compare/v2.19.3...v2.20.0) (2021-07-29) 1050 | 1051 | 1052 | ### Features 1053 | 1054 | * version `plugins.json` ([#392](https://www.github.com/netlify/plugins/issues/392)) ([42e63c0](https://www.github.com/netlify/plugins/commit/42e63c0bd0f921b5bce8fbff599653f40ff4d8e5)) 1055 | 1056 | ### [2.19.3](https://www.github.com/netlify/plugins/compare/v2.19.2...v2.19.3) (2021-07-16) 1057 | 1058 | 1059 | ### Bug Fixes 1060 | 1061 | * upgrade Next.js plugin to 3.7.1 ([#385](https://www.github.com/netlify/plugins/issues/385)) ([0168d94](https://www.github.com/netlify/plugins/commit/0168d9403ce6fb00bd79f19879eefe0a873f96a0)) 1062 | 1063 | ### [2.19.2](https://www.github.com/netlify/plugins/compare/v2.19.1...v2.19.2) (2021-07-14) 1064 | 1065 | 1066 | ### Bug Fixes 1067 | 1068 | * upgrade Next plugin to 3.7.0 ([#383](https://www.github.com/netlify/plugins/issues/383)) ([5bf2259](https://www.github.com/netlify/plugins/commit/5bf22591a0ee7af6cdf8e8cfc2f78f19648f6c82)) 1069 | 1070 | ### [2.19.1](https://www.github.com/netlify/plugins/compare/v2.19.0...v2.19.1) (2021-07-08) 1071 | 1072 | 1073 | ### Bug Fixes 1074 | 1075 | * update next plugin to 3.6.3 ([#380](https://www.github.com/netlify/plugins/issues/380)) ([f9deba6](https://www.github.com/netlify/plugins/commit/f9deba6144f5505475380e6f6fa5472ff573bf86)) 1076 | 1077 | ## [2.19.0](https://www.github.com/netlify/plugins/compare/v2.18.1...v2.19.0) (2021-07-07) 1078 | 1079 | 1080 | ### Features 1081 | 1082 | * update @netlify/plugin-nextjs to 3.6.2 ([#378](https://www.github.com/netlify/plugins/issues/378)) ([ea25e11](https://www.github.com/netlify/plugins/commit/ea25e11f69b076826edff263ddb203241f61a1fa)) 1083 | 1084 | ### [2.18.1](https://www.github.com/netlify/plugins/compare/v2.18.0...v2.18.1) (2021-06-28) 1085 | 1086 | 1087 | ### Miscellaneous Chores 1088 | 1089 | * release 2.18.1 ([ba6ef0e](https://www.github.com/netlify/plugins/commit/ba6ef0e6b43786e63e840dd5006524eaad3d5dde)) 1090 | 1091 | ## [2.18.0](https://www.github.com/netlify/plugins/compare/v2.17.0...v2.18.0) (2021-06-22) 1092 | 1093 | 1094 | ### Features 1095 | 1096 | * **plugin-gatsby:** add Essential Gatsby plugin ([#356](https://www.github.com/netlify/plugins/issues/356)) ([32b66f9](https://www.github.com/netlify/plugins/commit/32b66f95ee9de86492fefe7c14aac253cedd4f58)) 1097 | 1098 | ## [2.17.0](https://www.github.com/netlify/plugins/compare/v2.16.0...v2.17.0) (2021-06-22) 1099 | 1100 | 1101 | ### Features 1102 | 1103 | * update netlify-plugin-visual-diff to 1.3.0 and 2.0.0 ([#359](https://www.github.com/netlify/plugins/issues/359)) ([bdd8c5a](https://www.github.com/netlify/plugins/commit/bdd8c5a63e81a52c295e941c850bff31d7b5fa71)) 1104 | 1105 | ## [2.16.0](https://www.github.com/netlify/plugins/compare/v2.15.1...v2.16.0) (2021-06-17) 1106 | 1107 | 1108 | ### Features 1109 | 1110 | * **qawolf:** bump qawolf to 1.2.0 ([#357](https://www.github.com/netlify/plugins/issues/357)) ([3dc0644](https://www.github.com/netlify/plugins/commit/3dc064476d73f723b46308482bed35052d05bc90)) 1111 | 1112 | ### [2.15.1](https://www.github.com/netlify/plugins/compare/v2.15.0...v2.15.1) (2021-06-14) 1113 | 1114 | 1115 | ### Bug Fixes 1116 | 1117 | * **plugin-lighthouse:** update to version 2.1.2 ([#352](https://www.github.com/netlify/plugins/issues/352)) ([f4b2900](https://www.github.com/netlify/plugins/commit/f4b29006afc6c40f3b962b16a7c09e2fb3568827)) 1118 | 1119 | ## [2.15.0](https://www.github.com/netlify/plugins/compare/v2.14.2...v2.15.0) (2021-06-07) 1120 | 1121 | 1122 | ### Features 1123 | 1124 | * Bump netlify-plugin-pushover version for enhancements ([f670bd7](https://www.github.com/netlify/plugins/commit/f670bd77114f6cd8bf1b372238ec39fd881b1543)) 1125 | 1126 | ### [2.14.2](https://www.github.com/netlify/plugins/compare/v2.14.1...v2.14.2) (2021-05-21) 1127 | 1128 | 1129 | ### Bug Fixes 1130 | 1131 | * Update version netlify-plugin-stepzen ([729bf09](https://www.github.com/netlify/plugins/commit/729bf09f7781befef9238cb8a5ccbd1ba587ec7c)) 1132 | 1133 | ### [2.14.1](https://www.github.com/netlify/plugins/compare/v2.14.0...v2.14.1) (2021-05-21) 1134 | 1135 | 1136 | ### Bug Fixes 1137 | 1138 | * **plugin-hugo-cache-resources:** log the actual cached file count ([#331](https://www.github.com/netlify/plugins/issues/331)) ([3dacb50](https://www.github.com/netlify/plugins/commit/3dacb506f9b26b6bd737b3271e61d0da0ba14370)) 1139 | 1140 | ## [2.14.0](https://www.github.com/netlify/plugins/compare/v2.13.0...v2.14.0) (2021-05-19) 1141 | 1142 | 1143 | ### Features 1144 | 1145 | * update Cypress E2E plugin ([#237](https://www.github.com/netlify/plugins/issues/237)) ([2e7e8d6](https://www.github.com/netlify/plugins/commit/2e7e8d6e290eefc1796cd9b0e32cfb57d8376810)) 1146 | 1147 | ## [2.13.0](https://www.github.com/netlify/plugins/compare/v2.12.0...v2.13.0) (2021-05-15) 1148 | 1149 | 1150 | ### Features 1151 | 1152 | * add Cecil cache ([7e59601](https://www.github.com/netlify/plugins/commit/7e596015b584980dc6327279054468f1d0d2947d)) 1153 | 1154 | 1155 | ### Bug Fixes 1156 | 1157 | * Cecil cache package version ([b980e68](https://www.github.com/netlify/plugins/commit/b980e6832ce909bdb29f80fcd84d9260f2c379e5)) 1158 | * Cecil cache package version ([7b324e5](https://www.github.com/netlify/plugins/commit/7b324e5753a3d28e947c8783367652ea9b3a2039)) 1159 | 1160 | ## [2.12.0](https://www.github.com/netlify/plugins/compare/v2.11.2...v2.12.0) (2021-05-13) 1161 | 1162 | 1163 | ### Features 1164 | 1165 | * enforce that the first field in `compatibility` is the same as `version` ([0016591](https://www.github.com/netlify/plugins/commit/00165917ae088ecc368ec712f6baa10953e7a585)) 1166 | 1167 | ### [2.11.2](https://www.github.com/netlify/plugins/compare/v2.11.1...v2.11.2) (2021-05-12) 1168 | 1169 | 1170 | ### Reverts 1171 | 1172 | * style formatting ([631d42f](https://www.github.com/netlify/plugins/commit/631d42f6717209ced56a0b0707667be1428fac86)) 1173 | 1174 | ### [2.11.1](https://www.github.com/netlify/plugins/compare/v2.11.0...v2.11.1) (2021-05-11) 1175 | 1176 | 1177 | ### Bug Fixes 1178 | 1179 | * Fix Camel case. Stepzen --> StepZen ([596fbf5](https://www.github.com/netlify/plugins/commit/596fbf53750b9d0257e6d1e9639781b4c7abba8c)) 1180 | 1181 | ## [2.11.0](https://www.github.com/netlify/plugins/compare/v2.10.0...v2.11.0) (2021-05-11) 1182 | 1183 | 1184 | ### Features 1185 | 1186 | * improve `compatibility` field validation ([02d1aa8](https://www.github.com/netlify/plugins/commit/02d1aa84ab435c4d16700f930d6a373f3d38f466)) 1187 | * Introducing the netlify stepzen plugin ([dd24503](https://www.github.com/netlify/plugins/commit/dd24503961e0878d24a9e6b110ff6c79c6a363f7)) 1188 | 1189 | 1190 | ### Bug Fixes 1191 | 1192 | * remove the use of markdown in the description ([b9e74dd](https://www.github.com/netlify/plugins/commit/b9e74dd33810b370a660047a5fc17b0656577f4f)) 1193 | 1194 | ## [2.10.0](https://www.github.com/netlify/plugins/compare/v2.9.0...v2.10.0) (2021-05-06) 1195 | 1196 | 1197 | ### Features 1198 | 1199 | * allow `compatibility` entries without conditions ([ba79029](https://www.github.com/netlify/plugins/commit/ba7902957d996d44d7c4062d6f378b1449990ec7)) 1200 | 1201 | ## [2.9.0](https://www.github.com/netlify/plugins/compare/v2.8.0...v2.9.0) (2021-05-03) 1202 | 1203 | 1204 | ### Features 1205 | 1206 | * add Ghost Inspector Netlify plugin ([#284](https://www.github.com/netlify/plugins/issues/284)) ([d561334](https://www.github.com/netlify/plugins/commit/d561334eeb9fb3636bd1225d9cd6be7470c7013a)) 1207 | 1208 | ## [2.8.0](https://www.github.com/netlify/plugins/compare/v2.7.0...v2.8.0) (2021-04-22) 1209 | 1210 | 1211 | ### Features 1212 | 1213 | * **plugin-lighthouse:** update to version 2.1.0 ([#282](https://www.github.com/netlify/plugins/issues/282)) ([9bc0290](https://www.github.com/netlify/plugins/commit/9bc0290d89fa3435dc8e7e492f002ce2640f95fc)) 1214 | 1215 | ## [2.7.0](https://www.github.com/netlify/plugins/compare/v2.6.0...v2.7.0) (2021-04-19) 1216 | 1217 | 1218 | ### Features 1219 | 1220 | * **qa-wolf:** force latest package release [#276](https://www.github.com/netlify/plugins/issues/276) ([#278](https://www.github.com/netlify/plugins/issues/278)) ([7865521](https://www.github.com/netlify/plugins/commit/786552118e1ba40f8feb5aaf485f56b97a75a180)) 1221 | 1222 | ## [2.6.0](https://www.github.com/netlify/plugins/compare/v2.5.1...v2.6.0) (2021-04-01) 1223 | 1224 | 1225 | ### Features 1226 | 1227 | * add QA Wolf plugin ([#267](https://www.github.com/netlify/plugins/issues/267)) ([5f0c797](https://www.github.com/netlify/plugins/commit/5f0c797c22c97298432a8a8b095b5767ec77d70e)) 1228 | 1229 | ### [2.5.1](https://www.github.com/netlify/plugins/compare/v2.5.0...v2.5.1) (2021-03-30) 1230 | 1231 | 1232 | ### Bug Fixes 1233 | 1234 | * **plugin-sitemap:** update to version 0.8.1 ([#265](https://www.github.com/netlify/plugins/issues/265)) ([d7dc0a4](https://www.github.com/netlify/plugins/commit/d7dc0a4379ec2c51049f725c7dc5414ca861a35b)) 1235 | 1236 | ## [2.5.0](https://www.github.com/netlify/plugins/compare/v2.4.3...v2.5.0) (2021-03-24) 1237 | 1238 | 1239 | ### Features 1240 | 1241 | * **sitemap:** bump sitemap plugin to 0.8.0 ([95a4e6f](https://www.github.com/netlify/plugins/commit/95a4e6f1fece1d3e2d1309a956358e5fc314b528)) 1242 | 1243 | ### [2.4.3](https://www.github.com/netlify/plugins/compare/v2.4.2...v2.4.3) (2021-03-18) 1244 | 1245 | 1246 | ### Bug Fixes 1247 | 1248 | * upgrade Essential Next.js to `1.1.3` ([9535255](https://www.github.com/netlify/plugins/commit/953525594976c6b206a3545b4bd06cc9eb64cb59)) 1249 | 1250 | ### [2.4.2](https://www.github.com/netlify/plugins/compare/v2.4.1...v2.4.2) (2021-03-16) 1251 | 1252 | 1253 | ### Bug Fixes 1254 | 1255 | * update Next.js plugin compatibility to 1.1.2 ([851ff18](https://www.github.com/netlify/plugins/commit/851ff18ea5240c9b53eafbab7a9594777552c75a)) 1256 | 1257 | ### [2.4.1](https://www.github.com/netlify/plugins/compare/v2.4.0...v2.4.1) (2021-03-12) 1258 | 1259 | 1260 | ### Bug Fixes 1261 | 1262 | * Essential Next.js 3.0.1 ([f10d414](https://www.github.com/netlify/plugins/commit/f10d4141afb232f3524faa9af929aab8572ecb56)) 1263 | * revert Essential Next.js 3.0.0 ([e1e1428](https://www.github.com/netlify/plugins/commit/e1e14285958136f552d4bcb030aee2c2151ef838)) 1264 | * upgrade Essential Next.js `3.0.3` ([119c77b](https://www.github.com/netlify/plugins/commit/119c77bfa9a48872286b3cc110507b71e5f6e618)) 1265 | 1266 | ## [2.4.0](https://www.github.com/netlify/plugins/compare/v2.3.0...v2.4.0) (2021-03-05) 1267 | 1268 | 1269 | ### Features 1270 | 1271 | * support Next <10.0.6 users with Essential Next.js plugin ([dceaa10](https://www.github.com/netlify/plugins/commit/dceaa10973fe9e288f685dc2a9304dd80ede5ec6)) 1272 | 1273 | ## [2.3.0](https://www.github.com/netlify/plugins/compare/v2.2.0...v2.3.0) (2021-03-04) 1274 | 1275 | 1276 | ### Features 1277 | 1278 | * add gmail plugin ([#214](https://www.github.com/netlify/plugins/issues/214)) ([4eba95a](https://www.github.com/netlify/plugins/commit/4eba95ab8a67a21fee4f6ee6a6e2a69e675535f4)) 1279 | * allow and validate `compatibility` field ([b1b54bd](https://www.github.com/netlify/plugins/commit/b1b54bd29878c88c7bb6b5e4083fd6a541f2fe09)) 1280 | * enforce consistent plugins names ([#209](https://www.github.com/netlify/plugins/issues/209)) ([f6634b0](https://www.github.com/netlify/plugins/commit/f6634b04b058f52dc1cc1405389731304b1df04b)) 1281 | * **plugin-hugo-cache-resources:** update to 0.2.0 ([#192](https://www.github.com/netlify/plugins/issues/192)) ([e3ed920](https://www.github.com/netlify/plugins/commit/e3ed9202f2a0cbdd6edf275e18a614c718e070d0)) 1282 | * **plugin-sitemap:** update sitemap plugin to support custom path ([#194](https://www.github.com/netlify/plugins/issues/194)) ([f12007f](https://www.github.com/netlify/plugins/commit/f12007fda74c5f5e0b9295d7d76ccaf3f4b34aa9)) 1283 | * **plugin-sitemap:** update to version 0.7.0 ([#207](https://www.github.com/netlify/plugins/issues/207)) ([4df74aa](https://www.github.com/netlify/plugins/commit/4df74aa4895dbcf579404981a38f5af0115ac5e9)) 1284 | * update plugins.json with Nimbella v2.1.0 ([#221](https://www.github.com/netlify/plugins/issues/221)) ([8752e72](https://www.github.com/netlify/plugins/commit/8752e72d398d35759a994194bff803a20997cdb5)) 1285 | * upgrade Next.js plugin to `2.0.0` ([6fa6c1c](https://www.github.com/netlify/plugins/commit/6fa6c1c62abd7cb7f496b96e4305a93a5864cff9)) 1286 | 1287 | 1288 | ### Bug Fixes 1289 | 1290 | * **plugin-applitools:** update repo link and author ([#196](https://www.github.com/netlify/plugins/issues/196)) ([ebe59d7](https://www.github.com/netlify/plugins/commit/ebe59d7132f96af68b0fa3068d9883c4b471ea67)) 1291 | * **plugin-sitemap:** update to version 0.6.2 ([#197](https://www.github.com/netlify/plugins/issues/197)) ([611b03c](https://www.github.com/netlify/plugins/commit/611b03c146dd5f7a501d8807c3d66aa2b8cf18bb)) 1292 | * **plugins:** updated js obfuscator name and description and jekyll name correction ([#217](https://www.github.com/netlify/plugins/issues/217)) ([0f0e9e1](https://www.github.com/netlify/plugins/commit/0f0e9e1f175fabce882f8035c2214055f3097d53)) 1293 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2020 Netlify 2 | 3 | MIT License 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining 6 | a copy of this software and associated documentation files (the 7 | "Software"), to deal in the Software without restriction, including 8 | without limitation the rights to use, copy, modify, merge, publish, 9 | distribute, sublicense, and/or sell copies of the Software, and to 10 | permit persons to whom the Software is furnished to do so, subject to 11 | the following conditions: 12 | 13 | The above copyright notice and this permission notice shall be 14 | included in all copies or substantial portions of the Software. 15 | 16 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 17 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 18 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 19 | NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 20 | LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 21 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 22 | WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Netlify Build Plugins 2 | 3 | [Build Plugins](https://docs.netlify.com/configure-builds/build-plugins) are a new way to extend the functionality of your build on Netlify. The [`plugins.json` file](./site/plugins.json) in this repository is used to generate the [Netlify plugins directory](https://app.netlify.com/plugins). Plugins in this directory can be installed directly through the Netlify UI. 4 | 5 | ## Code of Conduct 6 | 7 | This project and everyone participating in it is governed by a [code of conduct](./docs/CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code. Please report unacceptable behavior to conduct@netlify.com. 8 | -------------------------------------------------------------------------------- /bin/sync_cms_to_plugins_repo.js: -------------------------------------------------------------------------------- 1 | import { promises as fs } from 'fs' 2 | 3 | import plugins from '../site/plugins.json' 4 | 5 | import { updatePlugins } from './utils.js' 6 | 7 | // eslint-disable-next-line n/prefer-global/process 8 | const changes = JSON.parse(process.env.CMS_CHANGES) 9 | 10 | console.log('Checking for CMS updates...') 11 | console.log('Changes to synchronize', changes) 12 | console.log('Synchronizing changes to plugins repo...') 13 | const updatedPlugins = updatePlugins(changes, plugins) 14 | fs.writeFile('site/plugins.json', `${JSON.stringify(updatedPlugins, null, 2)}\n`) 15 | 16 | console.log('Done synching CMS updates to plugins repo.') 17 | -------------------------------------------------------------------------------- /bin/sync_cms_to_repo.sh: -------------------------------------------------------------------------------- 1 | PR_TITLE="chore: cms to repo sync" 2 | BRANCH_NAME="sync_cms_to_plugins_$(date +%s)" 3 | 4 | git branch $BRANCH_NAME 5 | git switch $BRANCH_NAME 6 | 7 | echo "Syncing CMS to plugins" 8 | npx tsx bin/sync_cms_to_plugins_repo.js 9 | 10 | 11 | # This is the only file we want to commit 12 | git add site/plugins.json 13 | 14 | # See if we have any changes. We should. 15 | if [[ -n "$(git status --porcelain)" ]]; then 16 | echo "Creating PR \"$PR_TITLE\" for branch $BRANCH_NAME" 17 | git commit -m "$PR_TITLE" 18 | git push origin $BRANCH_NAME 19 | gh pr create --title "$PR_TITLE" --body "This is an automated PR to sync the CMS to the repo" --label "cms_sync" --label "automerge" 20 | else 21 | # Shouldn't end up here, but log that there was nothing to sync 22 | echo "Looks like there was nothing to sync." 23 | fi 24 | -------------------------------------------------------------------------------- /bin/sync_plugins_to_cms.js: -------------------------------------------------------------------------------- 1 | // eslint-env node 2 | /* eslint-disable n/prefer-global/process */ 3 | import { promises as fs } from 'fs' 4 | import path from 'path' 5 | 6 | import sanityClient from '@sanity/client' 7 | import { uuid } from '@sanity/uuid' 8 | 9 | // when testing this script locally, add a path in your .env for GITHUB_WORKSPACE or pass it in 10 | // e.g. GITHUB_WORKSPACE="$(pwd)" npx tsx bin/sync_plugins_to_cms.js 11 | 12 | /** 13 | * @typedef { import("../types/plugins").SanityBuildPluginEntity } SanityBuildPluginEntity 14 | * @typedef { import("@sanity/client").SanityClient } SanityClient 15 | * @typedef { import("@sanity/client").Transaction } Transaction 16 | * @typedef { import("@sanity/client").Patch } Patch 17 | * @typedef { import("../types/plugins").BuildPluginEntity } BuildPluginEntity 18 | */ 19 | 20 | import { getPluginDiffsForSanity, getSanityPluginLookup } from './utils.js' 21 | 22 | if (process.env.NODE_ENV === 'development') { 23 | // Using dotenv for local development. 24 | console.log('running in development mode') 25 | 26 | const dotenv = await import('dotenv') 27 | dotenv.config() 28 | } 29 | 30 | const { GITHUB_WORKSPACE, SANITY_API_TOKEN, SANITY_PROJECT_ID, SANITY_DATASET } = process.env 31 | const [apiVersion] = new Date().toISOString().split('T') 32 | 33 | const config = { 34 | projectId: SANITY_PROJECT_ID, 35 | dataset: SANITY_DATASET, 36 | apiVersion, 37 | token: SANITY_API_TOKEN, 38 | // make sure we have the freshest data when doing the diff with plugins.json 39 | useCdn: false, 40 | } 41 | 42 | /** 43 | * Creates a transaction containing updates to plugins for the CMS 44 | * 45 | * @param {Transaction} transaction 46 | * @param {Patch} patch 47 | * @param {BuildPluginEntity[]} diffs 48 | * @returns 49 | */ 50 | const createUpdates = (transaction, patch, diffs) => 51 | diffs.reduce((tx, plugin) => { 52 | const { _id, ...changes } = plugin 53 | const fieldUpdates = {} 54 | const fieldRemovals = [] 55 | 56 | for (const [key, value] of Object.entries(changes)) { 57 | // any property that is null needs to be unset instead of being set to null 58 | if (value === null) { 59 | fieldRemovals.push(key) 60 | } else { 61 | fieldUpdates[key] = value 62 | } 63 | } 64 | 65 | const update = patch(_id).set(fieldUpdates) 66 | 67 | if (fieldRemovals.length !== 0) { 68 | update.unset(fieldRemovals) 69 | } 70 | 71 | tx.patch(update) 72 | 73 | return tx 74 | }, transaction) 75 | 76 | /** 77 | * @type {SanityClient} 78 | */ 79 | const client = sanityClient(config) 80 | 81 | // These are the only fields to synch for the moment. 82 | const query = `*[_type == "buildPlugin"] { 83 | _id, 84 | packageName, 85 | version, 86 | compatibility[] 87 | }` 88 | 89 | // TODO: Add a retry mechanism to handle network errors 90 | try { 91 | const pluginsFilePath = path.join(GITHUB_WORKSPACE, '/site/plugins.json') 92 | const fileContents = await fs.readFile(pluginsFilePath) 93 | const plugins = JSON.parse(fileContents).map((plugin) => { 94 | // Ensure if a compatibility field exists, that it has all the necessary fields to sync with Sanity 95 | if (plugin.compatibility) { 96 | // eslint-disable-next-line no-param-reassign 97 | plugin.compatibility = plugin.compatibility.map((compatibilityItem) => { 98 | const updatedCompatibilityItem = { 99 | // A _key property is required by Sanity so each array item can be identified in a collaborative way 100 | // See https://www.sanity.io/docs/array-type#92296c6c45ea 101 | _key: uuid(), 102 | ...compatibilityItem, 103 | } 104 | 105 | return updatedCompatibilityItem 106 | }) 107 | } 108 | 109 | return plugin 110 | }) 111 | 112 | console.info('Detecting plugin changes...') 113 | 114 | /** 115 | * @type {SanityBuildPluginEntity[]} 116 | */ 117 | const sanityBuildPlugins = await client.fetch(query, {}) 118 | const sanityPluginLookup = await getSanityPluginLookup(sanityBuildPlugins) 119 | const pluginDiffs = getPluginDiffsForSanity(sanityPluginLookup, plugins) 120 | 121 | if (pluginDiffs.length === 0) { 122 | console.info('No plugin changes found.') 123 | } else { 124 | console.info(`Found ${pluginDiffs.length} plugins with changes`) 125 | console.info('Updating plugins...') 126 | 127 | const transaction = createUpdates(client.transaction(), client.patch, pluginDiffs) 128 | 129 | client.mutate(transaction) 130 | console.info('Plugins were updated in the CMS.') 131 | } 132 | } catch (error) { 133 | console.error(error) 134 | throw new Error('Unable to synchronize plugins to the CMS') 135 | } 136 | 137 | /* eslint-enable n/prefer-global/process */ 138 | -------------------------------------------------------------------------------- /bin/tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | /* Visit https://aka.ms/tsconfig.json to read more about this file */ 4 | 5 | /* Projects */ 6 | // "incremental": true, /* Enable incremental compilation */ 7 | // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ 8 | // "tsBuildInfoFile": "./", /* Specify the folder for .tsbuildinfo incremental compilation files. */ 9 | // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects */ 10 | // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ 11 | // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ 12 | 13 | /* Language and Environment */ 14 | "target": "ES2022" /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */, 15 | // "lib": [], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ 16 | // "jsx": "preserve", /* Specify what JSX code is generated. */ 17 | // "experimentalDecorators": true, /* Enable experimental support for TC39 stage 2 draft decorators. */ 18 | // "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ 19 | // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h' */ 20 | // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ 21 | // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using `jsx: react-jsx*`.` */ 22 | // "reactNamespace": "", /* Specify the object invoked for `createElement`. This only applies when targeting `react` JSX emit. */ 23 | // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ 24 | // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ 25 | 26 | /* Modules */ 27 | "module": "ES2022" /* Specify what module code is generated. */, 28 | // "rootDir": "./", /* Specify the root folder within your source files. */ 29 | "moduleResolution": "node" /* Specify how TypeScript looks up a file from a given module specifier. */, 30 | // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ 31 | // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ 32 | // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ 33 | // "typeRoots": [], /* Specify multiple folders that act like `./node_modules/@types`. */ 34 | // "types": [], /* Specify type package names to be included without being referenced in a source file. */ 35 | // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ 36 | // "resolveJsonModule": true, /* Enable importing .json files */ 37 | // "noResolve": true, /* Disallow `import`s, `require`s or ``s from expanding the number of files TypeScript should add to a project. */ 38 | 39 | /* JavaScript Support */ 40 | // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the `checkJS` option to get errors from these files. */ 41 | // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ 42 | // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from `node_modules`. Only applicable with `allowJs`. */ 43 | 44 | /* Emit */ 45 | // "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ 46 | // "declarationMap": true, /* Create sourcemaps for d.ts files. */ 47 | // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ 48 | // "sourceMap": true, /* Create source map files for emitted JavaScript files. */ 49 | // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If `declaration` is true, also designates a file that bundles all .d.ts output. */ 50 | // "outDir": "./", /* Specify an output folder for all emitted files. */ 51 | // "removeComments": true, /* Disable emitting comments. */ 52 | // "noEmit": true, /* Disable emitting files from a compilation. */ 53 | // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ 54 | // "importsNotUsedAsValues": "remove", /* Specify emit/checking behavior for imports that are only used for types */ 55 | // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ 56 | // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ 57 | // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ 58 | // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ 59 | // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ 60 | // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ 61 | // "newLine": "crlf", /* Set the newline character for emitting files. */ 62 | // "stripInternal": true, /* Disable emitting declarations that have `@internal` in their JSDoc comments. */ 63 | // "noEmitHelpers": true, /* Disable generating custom helper functions like `__extends` in compiled output. */ 64 | // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ 65 | // "preserveConstEnums": true, /* Disable erasing `const enum` declarations in generated code. */ 66 | // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ 67 | // "preserveValueImports": true, /* Preserve unused imported values in the JavaScript output that would otherwise be removed. */ 68 | 69 | /* Interop Constraints */ 70 | // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ 71 | // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ 72 | "esModuleInterop": true /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables `allowSyntheticDefaultImports` for type compatibility. */, 73 | // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ 74 | "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, 75 | 76 | /* Type Checking */ 77 | "strict": true /* Enable all strict type-checking options. */, 78 | // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied `any` type.. */ 79 | // "strictNullChecks": true, /* When type checking, take into account `null` and `undefined`. */ 80 | // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ 81 | // "strictBindCallApply": true, /* Check that the arguments for `bind`, `call`, and `apply` methods match the original function. */ 82 | // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ 83 | // "noImplicitThis": true, /* Enable error reporting when `this` is given the type `any`. */ 84 | // "useUnknownInCatchVariables": true, /* Type catch clause variables as 'unknown' instead of 'any'. */ 85 | // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ 86 | // "noUnusedLocals": true, /* Enable error reporting when a local variables aren't read. */ 87 | // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read */ 88 | // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ 89 | // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ 90 | // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ 91 | // "noUncheckedIndexedAccess": true, /* Include 'undefined' in index signature results */ 92 | // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ 93 | // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type */ 94 | // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ 95 | // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ 96 | 97 | /* Completeness */ 98 | // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ 99 | "skipLibCheck": true /* Skip type checking all .d.ts files. */ 100 | } 101 | } 102 | -------------------------------------------------------------------------------- /bin/utils.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @typedef { import("../types/plugins").SanityBuildPluginEntity } SanityBuildPluginEntity 3 | * @typedef { import("../types/plugins").SanityPluginLookup } SanityPluginLookup 4 | * @typedef { import("../types/plugins").BuildPluginEntity } BuildPluginEntity 5 | */ 6 | 7 | // TODO: remove this an use assert.deepEqual once we support only node engines > 18 8 | import deepEqual from 'deep-equal' 9 | 10 | const sanitizeCompatibility = (compatibility) => 11 | compatibility 12 | ? compatibility.map((compatibilityItem) => { 13 | // _keys will alwyas be different and they're not the data we care about comparing. 14 | // eslint-disable-next-line no-unused-vars 15 | const { _key, ...resetOfItem } = compatibilityItem 16 | 17 | return resetOfItem 18 | }) 19 | : null 20 | 21 | const sanityFieldNameToPluginKeyLookup = { 22 | _id: '_id', 23 | packageName: 'package', 24 | version: 'version', 25 | // an object that can be null 26 | compatibility: 'compatibility', 27 | } 28 | 29 | const pluginKeyToSanityFieldNameLookup = Object.entries(sanityFieldNameToPluginKeyLookup).reduce( 30 | (lookup, [key, value]) => { 31 | // eslint-disable-next-line no-param-reassign 32 | lookup[value] = key 33 | 34 | return lookup 35 | }, 36 | {}, 37 | ) 38 | 39 | /** 40 | * Retrieves a list of all the plugins stored in Sanity 41 | * 42 | * @param plugins {SanityBuildPluginEntity[]} Query to execute 43 | * @returns A list of all the plugins stored in Sanity 44 | */ 45 | export const getSanityPluginLookup = (plugins) => { 46 | /** 47 | * @type {SanityPluginLookup} 48 | */ 49 | const pluginLookup = plugins.reduce((sanitytPluginLookup, plugin) => { 50 | // eslint-disable-next-line no-param-reassign 51 | sanitytPluginLookup[plugin.packageName] = plugin 52 | 53 | return sanitytPluginLookup 54 | }, {}) 55 | 56 | return pluginLookup 57 | } 58 | 59 | /** 60 | * 61 | * @param {BuildPluginEntity} plugin 62 | * 63 | * @returns {SanityBuildPluginEntity} 64 | */ 65 | const convertToSanityPlugin = (plugin) => { 66 | const formattedPlugin = Object.keys(plugin).reduce( 67 | (pluginToFormat, key) => { 68 | switch (key) { 69 | // _id field was added from Sanity so there is a unique identifier for each plugin when pushing things back to Sanity. 70 | case '_id': 71 | // eslint-disable-next-line no-param-reassign 72 | pluginToFormat[pluginKeyToSanityFieldNameLookup[key]] = plugin[key] 73 | break 74 | case 'compatibility': 75 | // eslint-disable-next-line no-param-reassign 76 | pluginToFormat[pluginKeyToSanityFieldNameLookup[key]] = plugin[key] || null 77 | break 78 | 79 | case 'version': 80 | // eslint-disable-next-line no-param-reassign 81 | pluginToFormat[pluginKeyToSanityFieldNameLookup[key]] = plugin[key] 82 | break 83 | 84 | default: 85 | // We only want to sync the version and compatibility fields for now. 86 | // _id is used to identify which documents in Sanity need to be updated. 87 | break 88 | } 89 | 90 | return pluginToFormat 91 | // initializing with compatibility as null because in Sanity it will be null, but in plugins.json the compatibility 92 | // property won't be null. It won't exist. 93 | }, 94 | { compatibility: null }, 95 | ) 96 | 97 | return formattedPlugin 98 | } 99 | 100 | /** 101 | * 102 | * @param {*} plugin 103 | * @returns 104 | */ 105 | const convertSanityPluginToPlugin = (plugin) => { 106 | // These are the only fields we care about for now. 107 | const formattedPlugin = { 108 | // eslint-disable-next-line no-underscore-dangle 109 | _id: plugin._id, 110 | version: plugin.version, 111 | compatibility: sanitizeCompatibility(plugin.compatibility), 112 | } 113 | 114 | return formattedPlugin 115 | } 116 | 117 | /** 118 | * Gets the differences between the Sanity plugins and the plugins.json file 119 | * 120 | * @param {SanityPluginLookup} pluginLookup 121 | * @param {BuildPluginEntity[]} plugins 122 | * @returns 123 | */ 124 | export const getPluginDiffsForSanity = (pluginLookup, plugins) => { 125 | const diffs = plugins 126 | .filter((plugin) => { 127 | if (!(plugin.package in pluginLookup)) { 128 | // The plugin does not Exist in Sanity, so we filter it out. 129 | return false 130 | } 131 | 132 | // adding the _id field to the plugin object so that we can use it to update the plugin in Sanity 133 | // eslint-disable-next-line no-param-reassign, no-underscore-dangle 134 | plugin._id = pluginLookup[plugin.package]._id 135 | 136 | // These are the only fields we care about for now. 137 | const minimalPlugin = { 138 | // eslint-disable-next-line no-underscore-dangle 139 | _id: plugin._id, 140 | version: plugin.version, 141 | // In Sanity it's null, in plugins.json it's undefined 142 | compatibility: sanitizeCompatibility(plugin.compatibility), 143 | } 144 | 145 | const sanityPlugin = convertSanityPluginToPlugin(pluginLookup[plugin.package]) 146 | 147 | return !deepEqual(minimalPlugin, sanityPlugin) 148 | }) 149 | .map((plugin) => { 150 | console.info('Plugin diff found:', plugin.package) 151 | return convertToSanityPlugin(plugin) 152 | }) 153 | 154 | return diffs 155 | } 156 | 157 | /** 158 | * 159 | * @param {SanityBuildPluginEntity} plugin 160 | * 161 | * @returns {BuildPluginEntity} 162 | */ 163 | const convertCmsChangesToRepoPlugin = (plugin) => { 164 | const { 165 | compatibility, 166 | description, 167 | packageName, 168 | status: rawStatus, 169 | repoUrl: repo, 170 | title: name, 171 | version, 172 | metadata, 173 | docsUrl: docs, 174 | } = plugin 175 | /** 176 | * @type {BuildPluginEntity['status']} 177 | */ 178 | const status = rawStatus === 'deactivated' ? rawStatus.toUpperCase() : undefined 179 | 180 | const variables = 181 | metadata?.variables.map(({ name: varName, description: varDescription }) => ({ 182 | name: varName, 183 | description: varDescription, 184 | })) || [] 185 | 186 | return { 187 | name, 188 | package: packageName, 189 | description, 190 | repo, 191 | version, 192 | status, 193 | compatibility, 194 | variables, 195 | docs, 196 | } 197 | } 198 | 199 | const stripNullifiedFields = (plugin) => { 200 | // If plugin status is undefined, it means the plugin is active, so the field is omitted 201 | if (!plugin.status) { 202 | // eslint-disable-next-line no-param-reassign 203 | delete plugin.status 204 | } 205 | 206 | // If plugin compatibility is null, it means there is no compatibility set, so the field is omitted 207 | if (!plugin.compatibility) { 208 | // eslint-disable-next-line no-param-reassign 209 | delete plugin.compatibility 210 | } 211 | 212 | if (!plugin.variables || plugin.variables.length === 0) { 213 | // eslint-disable-next-line no-param-reassign 214 | delete plugin.variables 215 | } 216 | 217 | if (!plugin.docs) { 218 | // eslint-disable-next-line no-param-reassign 219 | delete plugin.docs 220 | } 221 | 222 | return plugin 223 | } 224 | 225 | /** 226 | * Updates or adds a plugin to the list of plugins. 227 | * 228 | * @param {SanityBuildPluginEntity} changes 229 | * @param {BuildPluginEntity[]} plugins 230 | * 231 | * return {BuildPluginEntity[]} The updated list of plugins 232 | */ 233 | export const updatePlugins = (changes, plugins) => { 234 | const { compatibility, ...restOfChanges } = changes 235 | const updatedCompatibility = compatibility?.map((compatibilityItem) => { 236 | // eslint-disable-next-line no-unused-vars 237 | const { _key, ...rest } = compatibilityItem 238 | 239 | return rest 240 | }) 241 | 242 | const sanitizedChanges = { ...restOfChanges, compatibility: updatedCompatibility } 243 | const pluginChanges = convertCmsChangesToRepoPlugin(sanitizedChanges) 244 | 245 | let pluginToUpdate = plugins.find((plugin) => plugin.package === pluginChanges.package) 246 | 247 | if (pluginToUpdate) { 248 | pluginToUpdate = stripNullifiedFields({ ...pluginToUpdate, ...pluginChanges }) 249 | 250 | return plugins.map((plugin) => { 251 | if (plugin.package === pluginToUpdate.package) { 252 | return pluginToUpdate 253 | } 254 | 255 | return plugin 256 | }) 257 | } 258 | 259 | pluginToUpdate = stripNullifiedFields(pluginChanges) 260 | 261 | return [...plugins, pluginToUpdate] 262 | } 263 | -------------------------------------------------------------------------------- /commitlint.config.cjs: -------------------------------------------------------------------------------- 1 | module.exports = { extends: ['@commitlint/config-conventional'] } 2 | -------------------------------------------------------------------------------- /docs/CODE_OF_CONDUCT.md: -------------------------------------------------------------------------------- 1 | # Contributor Covenant Code of Conduct 2 | 3 | ## Our Pledge 4 | 5 | We as members, contributors, and leaders pledge to make participation in our 6 | community a harassment-free experience for everyone, regardless of age, body 7 | size, visible or invisible disability, ethnicity, sex characteristics, gender 8 | identity and expression, level of experience, education, socio-economic status, 9 | nationality, personal appearance, race, religion, or sexual identity 10 | and orientation. 11 | 12 | We pledge to act and interact in ways that contribute to an open, welcoming, 13 | diverse, inclusive, and healthy community. 14 | 15 | ## Our Standards 16 | 17 | Examples of behavior that contributes to a positive environment for our 18 | community include: 19 | 20 | - Demonstrating empathy and kindness toward other people 21 | - Being respectful of differing opinions, viewpoints, and experiences 22 | - Giving and gracefully accepting constructive feedback 23 | - Accepting responsibility and apologizing to those affected by our mistakes, 24 | and learning from the experience 25 | - Focusing on what is best not just for us as individuals, but for the 26 | overall community 27 | 28 | Examples of unacceptable behavior include: 29 | 30 | - The use of sexualized language or imagery, and sexual attention or 31 | advances of any kind 32 | - Trolling, insulting or derogatory comments, and personal or political attacks 33 | - Public or private harassment 34 | - Publishing others' private information, such as a physical or email 35 | address, without their explicit permission 36 | - Other conduct which could reasonably be considered inappropriate in a 37 | professional setting 38 | 39 | ## Enforcement Responsibilities 40 | 41 | Community leaders are responsible for clarifying and enforcing our standards of 42 | acceptable behavior and will take appropriate and fair corrective action in 43 | response to any behavior that they deem inappropriate, threatening, offensive, 44 | or harmful. 45 | 46 | Community leaders have the right and responsibility to remove, edit, or reject 47 | comments, commits, code, wiki edits, issues, and other contributions that are 48 | not aligned to this Code of Conduct, and will communicate reasons for moderation 49 | decisions when appropriate. 50 | 51 | ## Scope 52 | 53 | This Code of Conduct applies within all community spaces, and also applies when 54 | an individual is officially representing the community in public spaces. 55 | Examples of representing our community include using an official e-mail address, 56 | posting via an official social media account, or acting as an appointed 57 | representative at an online or offline event. 58 | 59 | ## Enforcement 60 | 61 | Instances of abusive, harassing, or otherwise unacceptable behavior may be 62 | reported to the community leaders responsible for enforcement at 63 | conduct@netlify.com. 64 | All complaints will be reviewed and investigated promptly and fairly. 65 | 66 | All community leaders are obligated to respect the privacy and security of the 67 | reporter of any incident. 68 | 69 | ## Enforcement Guidelines 70 | 71 | Community leaders will follow these Community Impact Guidelines in determining 72 | the consequences for any action they deem in violation of this Code of Conduct: 73 | 74 | ### 1. Correction 75 | 76 | **Community Impact**: Use of inappropriate language or other behavior deemed 77 | unprofessional or unwelcome in the community. 78 | 79 | **Consequence**: A private, written warning from community leaders, providing 80 | clarity around the nature of the violation and an explanation of why the 81 | behavior was inappropriate. A public apology may be requested. 82 | 83 | ### 2. Warning 84 | 85 | **Community Impact**: A violation through a single incident or series 86 | of actions. 87 | 88 | **Consequence**: A warning with consequences for continued behavior. No 89 | interaction with the people involved, including unsolicited interaction with 90 | those enforcing the Code of Conduct, for a specified period of time. This 91 | includes avoiding interactions in community spaces as well as external channels 92 | like social media. Violating these terms may lead to a temporary or 93 | permanent ban. 94 | 95 | ### 3. Temporary Ban 96 | 97 | **Community Impact**: A serious violation of community standards, including 98 | sustained inappropriate behavior. 99 | 100 | **Consequence**: A temporary ban from any sort of interaction or public 101 | communication with the community for a specified period of time. No public or 102 | private interaction with the people involved, including unsolicited interaction 103 | with those enforcing the Code of Conduct, is allowed during this period. 104 | Violating these terms may lead to a permanent ban. 105 | 106 | ### 4. Permanent Ban 107 | 108 | **Community Impact**: Demonstrating a pattern of violation of community 109 | standards, including sustained inappropriate behavior, harassment of an 110 | individual, or aggression toward or disparagement of classes of individuals. 111 | 112 | **Consequence**: A permanent ban from any sort of public interaction within 113 | the community. 114 | 115 | ## Attribution 116 | 117 | This Code of Conduct is adapted from the [Contributor Covenant][homepage], 118 | version 2.0, available at 119 | https://www.contributor-covenant.org/version/2/0/code_of_conduct.html. 120 | 121 | Community Impact Guidelines were inspired by [Mozilla's code of conduct 122 | enforcement ladder](https://github.com/mozilla/diversity). 123 | 124 | [homepage]: https://www.contributor-covenant.org 125 | 126 | For answers to common questions about this code of conduct, see the FAQ at 127 | https://www.contributor-covenant.org/faq. Translations are available at 128 | https://www.contributor-covenant.org/translations. 129 | -------------------------------------------------------------------------------- /docs/ISSUE_TEMPLATE/request_deactivation.md: -------------------------------------------------------------------------------- 1 | --- 2 | name: Request plugin deactivation 3 | about: Request that a plugin be removed from the directory due to lack of maintainer response. 4 | --- 5 | 6 | If a plugin is not maintained as described in the [plugin author guidelines](/docs/guidelines.md), plugin users can request that the plugin be deactivated. Deactivation removes a plugin from the Netlify plugins directory. 7 | 8 | **Plugin name & repository URL** 9 | Enter the name of the plugin to be deactivated. 10 | 11 | **Why are you requesting deactivation?** 12 | Identify and link an issue or issues that have received no response from a plugin maintainer for more than a week. 13 | -------------------------------------------------------------------------------- /docs/PULL_REQUEST_TEMPLATE.md: -------------------------------------------------------------------------------- 1 | Thanks for contributing the Netlify plugins directory! 2 | 3 | **Are you adding a plugin or updating one?** 4 | 5 | - [ ] Adding a plugin 6 | - [ ] Updating a plugin 7 | 8 | **Have you completed the following?** 9 | 10 | - [ ] Read and followed the [plugin author guidelines](https://github.com/netlify/plugins/blob/main/docs/guidelines.md). 11 | - [ ] Included all [required fields](https://github.com/netlify/plugins/blob/main/docs/CONTRIBUTING.md#required-fields) in your entry. 12 | - [ ] Tested the plugin [locally](https://docs.netlify.com/cli/get-started/#run-builds-locally) and [on Netlify](https://docs.netlify.com/configure-builds/build-plugins/#install-a-plugin), using the plugin version stated in your entry. 13 | 14 | **Test plan** 15 | Please add a link to a successful public deploy log using the stated version of the plugin. Include any other context reviewers might need for testing. 16 | -------------------------------------------------------------------------------- /docs/guidelines.md: -------------------------------------------------------------------------------- 1 | # Plugin Author Guidelines 2 | 3 | Netlify plugins listed in the plugins.json file of this repository can be installed directly within the Netlify UI from the plugins directory. To help ensure a consistent user experience, we've prepared the following guidelines for authors submitting plugins to the directory. 4 | 5 | Before submitting a plugin for the plugins directory, please read and follow the guidelines below. 6 | 7 | ## Provide a zero-config default. 8 | 9 | Plugins with required `inputs` cannot be installed via the Netlify UI. Wherever possible, a plugin should include default options that allow the plugin to run without configuration. In cases where a plugin requires a unique value (such as an API key for a third-party service), configure the plugin to accept this value from a [build environment variable](https://docs.netlify.com/configure-builds/environment-variables). For more complex or customized configuration, users can install the plugin via the `netlify.toml` configuration file. 10 | 11 | ## Provide a README. 12 | 13 | Every plugin in the Netlify plugins directory includes a link to the plugin README. This file should include: 14 | 15 | - A description of what the plugin does and why that might be useful. 16 | - UI-based installation instructions. 17 | > **Note:** You can include UI-based installation instructions in a separate, follow-up pull request. The PR will be merged when your plugin is approved for inclusion in the plugins directory. 18 | - Include a direct installation link using the format `https://app.netlify.com/plugins/{plugin-package-name}/install`. 19 | - Point to the [plugins directory](https://app.netlify.com/plugins) in the Netlify UI. 20 | - File-based installation instructions. Visit our [Next.js Build Plugin README](https://github.com/netlify/netlify-plugin-nextjs/blob/main/README.md) for an example. 21 | - Include sample code for declaring the plugin in the `netlify.toml` configuration file. 22 | - Include a step instructing developers to use npm, yarn, or another Node.js package manager to add the plugin to `devDependencies` in the base directory's `package.json`. 23 | - Any required environment variables. 24 | - Details regarding any optional environment variables or `inputs`. 25 | - Ideally, a link to a demo site with [public deploy logs](https://docs.netlify.com/configure-builds/get-started/#basic-build-settings) and a [Deploy to Netlify button](https://docs.netlify.com/site-deploys/create-deploys/#deploy-to-netlify-button), so users can find out how the plugin works before installing. 26 | 27 | ## Follow best practices for plugin code and metadata. 28 | 29 | Consistency across plugins makes plugins easier to find, easier to debug, and easier to review for inclusion in the Netlify plugins directory. Review the docs for [creating](https://docs.netlify.app/configure-builds/build-plugins/create-plugins) and [sharing](https://docs.netlify.app/configure-builds/build-plugins/share-plugins) plugins to learn about recommended practices. This [issue comment](https://github.com/netlify/build/issues/1068#issuecomment-605276244) describes some common pitfalls to avoid. 30 | 31 | ## Test the plugin. 32 | 33 | Before submitting a pull request to add or update a plugin, test it locally and in the Netlify UI to make sure it works as expected, and isn't using any [deprecated methods](https://github.com/netlify/build/issues/1303). Automated tests can help with this, and providing a demo site with [public deploy logs](https://docs.netlify.com/configure-builds/get-started/#basic-build-settings) will make it easier to review your pull request. 34 | 35 | ## Keep it open. 36 | 37 | All plugin source code must be public and generally human-readable. Plugin users and pull request reviewers must be able to read the plugin code and evaluate it for potential risks. The plugin must also a license listed on the [Open Source Initiative approved license list](https://opensource.org/licenses) or a [Creative Commons license](https://creativecommons.org/choose/) that includes “attribution” or places the work in the [public domain](https://creativecommons.org/publicdomain/). 38 | 39 | ## Understand required agreements. 40 | 41 | When you publish a plugin to the npm Public Registry, you agree to npm's [Open Source Terms](https://www.npmjs.com/policies/open-source-terms). When you use a plugin on Netlify, you agree to Netlify's [Terms of Use Agreement](https://www.netlify.com/legal/terms-of-use/). When you make that plugin available to other Netlify users, you agree to interact with those users in accordance with the [Netlify Forums Code of Conduct](https://forums-docs.netlify.app/code-of-conduct.html). 42 | 43 | In general, this means that you agree to be kind, to be honest, and to not do anything illegal, but you should read these documents to know exactly what they mean in detail. 44 | 45 | ## Be prepared to provide support. 46 | 47 | When a Netlify user needs help with a plugin, they'll be directed to submit an issue in the plugin repository. If issues don't receive a response within one week, the plugin may be deactivated from the Netlify plugins directory. 48 | 49 | You don't need to debug users' code or support unintended configurations (similar to Netlify's own [Scope of Support](https://www.netlify.com/support-scope/)), but if an error or failure is caused by the plugin itself, you should commit to fixing it in a timely manner. 50 | 51 | To provide clear guidelines for user interactions, we recommend adding an [issue template](https://help.github.com/en/github/building-a-strong-community/configuring-issue-templates-for-your-repository), a [code of conduct](https://help.github.com/en/github/building-a-strong-community/adding-a-code-of-conduct-to-your-project), and other [community health files](https://help.github.com/en/github/building-a-strong-community/creating-a-default-community-health-file) to the plugin repository. 52 | -------------------------------------------------------------------------------- /docs/plugin_review.md: -------------------------------------------------------------------------------- 1 | # Reviewing plugins 2 | 3 | ## Goal 4 | 5 | Build plugins can be installed either from [the UI](https://docs.netlify.com/configure-builds/build-plugins/#ui-installation) or [from npm](https://docs.netlify.com/configure-builds/build-plugins/#file-based-installation). Netlify ensures the quality and security of the plugins available in the UI. 6 | 7 | ## Process for plugin authors 8 | 9 | Plugin authors must submit a PR when they want to either: 10 | 11 | - Add a new plugin. 12 | - Update the patch/minor/major version of their plugin. 13 | 14 | This only applies to plugins installed from the UI, not from npm. However, the UI installation flow is the recommended approach because it is simpler. 15 | 16 | ## Process for reviewers 17 | 18 | A thorough code review is especially important when plugins are added since it is quite common for plugins not to be updated often after the initial release. 19 | 20 | The reviewer should submit a new issue on the plugin's repository for each review comment. If there is a bigger problem which might require a big refactoring or might reject the plugin, this should be communicated as a comment in the PR instead before proceeding to a full review. 21 | 22 | The plugin author has the best knowledge of their plugin's code and purpose. 23 | Any review comment should be worded as a friendly recommendation open for feedback from the plugin author. 24 | 25 | The reviewer should not give feedback on code styling nor programming patterns, unless they introduce a bug or a big performance penalty. 26 | 27 | ## User documentation 28 | 29 | The plugin should follow: 30 | 31 | - the guidelines from the [Build plugins user documentation](https://docs.netlify.com/configure-builds/build-plugins). 32 | - the [guidelines](guidelines.md) in this repository. 33 | 34 | ## Common pitfalls 35 | 36 | This is a non-exhaustive list of common pitfalls 37 | 38 | ### General 39 | 40 | - [ ] The plugin's purpose must be in the best interest of Netlify and its users. 41 | - [ ] The functionality must not be already provided by Netlify or another well-maintained plugin. 42 | - [ ] The code [must be open source](guidelines.md#keep-it-open). 43 | - [ ] The plugin should work [without any configuration](guidelines.md#provide-a-zero-config-default). Exceptions can be made when there is no way around it, such as for an API token. In that case, environment variables should be used instead of `inputs`. 44 | 45 | ### Versioning 46 | 47 | - [ ] Breaking changes require a new major release number. 48 | - [ ] Each major release must be specified in the [`compatibility` array](CONTRIBUTING.md#major-releases). 49 | - [ ] When dropping a Node.js version, the [`nodeVersion` field should be added to previous major releases](CONTRIBUTING.md#major-releases). 50 | - [ ] When dropping a site dependency's version, the [`siteDependencies` field should be added to previous major releases](CONTRIBUTING.md#major-releases). 51 | 52 | ### Documentation 53 | 54 | - [ ] The `README.md` [should describe](guidelines.md#provide-a-readme) both UI-based and file-based installation instructions. 55 | - [ ] The `README.md` [should describe](guidelines.md#provide-a-readme) any inputs and environment variables. 56 | 57 | ### Metadata 58 | 59 | - [ ] A [`manifest.yml`](https://docs.netlify.com/configure-builds/build-plugins/create-plugins/#anatomy-of-a-plugin) should be present. 60 | - [ ] The `name` in `manifest.yml` should match the npm package `name`. 61 | - [ ] The `package.json` `keywords` [should include `netlify` and `netlify-plugin`](https://docs.netlify.com/configure-builds/build-plugins/share-plugins/#publish-to-npm). 62 | - [ ] The `package.json` should include [the `repository` and `bugs` properties](https://docs.netlify.com/configure-builds/build-plugins/share-plugins/#publish-to-npm). 63 | - [ ] The npm package `name` should start either with `netlify-plugin-` or `@scope/netlify-plugin-`. 64 | - [ ] The npm package should not omit some files by mistakes, including the `manifest.yml`. Notably, the `.npmignore` file and the `package.json` `files` and `main` properties should be checked. 65 | 66 | ### Inputs 67 | 68 | - [ ] Inputs should have a [`name` and a `description`](https://docs.netlify.com/configure-builds/build-plugins/create-plugins/#inputs). 69 | - [ ] Every optional input (including environment variable) [should have a default value](guidelines.md#provide-a-zero-config-default). 70 | 71 | ### Events 72 | 73 | - [ ] The [right events](https://docs.netlify.com/configure-builds/build-plugins/create-plugins/#plug-in-to-build-events) must be used. 74 | - [ ] `onSuccess` and `onEnd` should not be used to fail the build. Notably, `utils.build.failPlugin()` should be used instead of `utils.build.failBuild()`. If the build must be failed, `onPostBuild` should be used instead. 75 | - [ ] `onPostBuild` should not be used to run post-deploy logic. `onSuccess` and `onEnd` should be used instead. 76 | - [ ] `try`/`catch`/`finally` blocks should be preferred to using the `onError` and `onEnd` events, when possible. 77 | 78 | ### Constants 79 | 80 | - [ ] The [right constants](https://docs.netlify.com/configure-builds/build-plugins/create-plugins/#constants) must be used and be correctly spelled. 81 | - [ ] `constants.CONFIG_PATH`, `constants.FUNCTIONS_SRC` and `constants.EDGE_HANDLERS_SRC` can be `undefined` when not used by the site. 82 | - [ ] `constants.PUBLISH_DIR` and `constants.FUNCTIONS_DIST` are always defined, but their target might not exist yet. If used, they should be created by the plugin they do not exist. 83 | - [ ] [`netlifyConfig`](https://docs.netlify.com/configure-builds/build-plugins/create-plugins/#netlifyconfig) should be used instead of manually loading the configuration file. This includes `redirects`, `headers` and `edge_handlers`. 84 | - [ ] [`netlifyConfig.build.environment`](https://docs.netlify.com/configure-builds/build-plugins/create-plugins/#netlifyconfig) should be used to modify environment variables, not `process.env`. 85 | - [ ] When modifying [`netlifyConfig`](https://docs.netlify.com/configure-builds/build-plugins/create-plugins/#netlifyconfig), plugin authors should consider appending properties instead of overriding them. For example, redirects should be pushed to `netlifyConfig.redirects` instead of overriding that property. 86 | - [ ] [`packageJson`](https://docs.netlify.com/configure-builds/build-plugins/create-plugins/#packagejson) should be used instead of manually loading the site's `package.json`. 87 | 88 | ## Error handling 89 | 90 | - [ ] Errors should not be thrown since those are reported as plugin bugs, not user errors. Instead, a `try`/`catch` block combined with [one of the `utils.build.*` methods](https://docs.netlify.com/configure-builds/build-plugins/create-plugins/#error-reporting) should be used. 91 | - [ ] The `try`/`catch` block should be as close to the potentially throwing code as possible. In particular, top-level catch-all `try`/`catch` should not be used because they prevent distinguishing plugin bugs from user errors. 92 | - [ ] The [`error` argument](https://docs.netlify.com/configure-builds/build-plugins/create-plugins/#error-reporting) in `utils.build.*` should be used when possible to keep the inner stack trace. 93 | 94 | ## Logging 95 | 96 | - [ ] Any successful information (not errors) that should be highlighted to users, such as the plugin's output summary, [should use `utils.status.show()`](https://docs.netlify.com/configure-builds/build-plugins/create-plugins/#logging) instead of `console.log()`. 97 | 98 | ## Utilities 99 | 100 | - [ ] The [`cache` utility](https://github.com/netlify/build/blob/main/packages/cache-utils/README.md) should be used to cache files. 101 | - [ ] The [`git` utility](https://github.com/netlify/build/blob/main/packages/git-utils/README.md) should be used for git-related logic. 102 | 103 | ## Control flow 104 | 105 | - [ ] Asynchronous code should use `async`/`await`. 106 | - [ ] Plugin methods [should not end until all their asynchronous code has completed](https://docs.netlify.com/configure-builds/build-plugins/create-plugins/#asynchronous-code). Also, asychronous should propagate to the upper scopes. When mixing callbacks, events and promises, it is common to miss this. Using promise-friendly libraries and `util.promisify()` are common solutions. 107 | - [ ] `process.exit()` should not be used. 108 | - [ ] While a top-level function [is allowed in the plugin main file](https://docs.netlify.com/configure-builds/build-plugins/create-plugins/#dynamic-events), it should only be used when absolutely necessary. 109 | -------------------------------------------------------------------------------- /docs/versioning.md: -------------------------------------------------------------------------------- 1 | # Versioning 2 | 3 | ## Deploying `plugins.json` 4 | 5 | Each new commit pushed to the `main` branch is deployed to [https://list-v2--netlify-plugins.netlify.app/plugins.json](https://list-v2--netlify-plugins.netlify.app/plugins.json) thanks to [this repository's Netlify site](https://app.netlify.com/sites/netlify-plugins/deploys). 6 | 7 | This is done in a branch deploy triggered by updating the `list-v2` git tag to reference each new commit on the `main` branch. This is performed automatically by a [GitHub action](/.github/workflows/versioning.yml). 8 | 9 | That URL is fetched by: 10 | 11 | - [Netlify Build](https://github.com/netlify/build/blob/24d15419e64b5d7b291b154fd9363660e468416d/packages/build/src/plugins/list.js#L56) to list the latest versions of each plugin during builds. 12 | - [Netlify CLI](https://github.com/netlify/cli/blob/2235280d338af60c6c7b9fbe4a07d7ac040d796e/src/utils/init/plugins.js#L5) command `netlify init` to recommend plugins on new sites. 13 | - [Netlify App](https://github.com/netlify/netlify-react-ui/blob/ac29b020d109e069366bfb5a92bdf6635cf4db89/src/actions/plugins.js#L11) to list all available plugins in the UI. 14 | 15 | ## Plugins versioning 16 | 17 | Versioning of the [`plugins.json`](/site/plugins.json)'s contents is documented [here](CONTRIBUTING.md#versioning). 18 | 19 | ## Syntax versioning 20 | 21 | This section explains how the `plugins.json`'s syntax is versioned. This relates to the `plugins.json` file's shape (e.g. property names), not its contents. 22 | 23 | ### Breaking changes 24 | 25 | To introduce a breaking change to the syntax of `plugins.json`: 26 | 27 | - Update `plugins.json` with that breaking change. 28 | - Increment every reference of `list-v2` in this repository, including this file and the `pluginsUrl` returned property. 29 | - Ensure the PR is marked with `!` so that `release-please` makes a major release of the `@netlify/plugins-list` npm package. 30 | - Wait for the new versioned URL to be built and ensure it can be accessed and looks normal. 31 | - Update the URL in Netlify Build, CLI and App. 32 | 33 | ### Legacy URL 34 | 35 | Old versions of Netlify CLI are fetching the legacy URL used before versioning was introduced: [https://netlify-plugins.netlify.app/plugins.json](https://netlify-plugins.netlify.app/plugins.json). This URL reflects the `legacy` git branch of this repository. Since some users rely on those older versions of Netlify CLI: 36 | 37 | - The `legacy` git branch should not be deleted. 38 | - No new commits should be added to the `legacy` branch. 39 | - The Netlify site's production branch should remain `legacy`. 40 | -------------------------------------------------------------------------------- /functions/npm-diff/compute.js: -------------------------------------------------------------------------------- 1 | import { applyPatch } from 'diff' 2 | 3 | import { fetchText } from './fetch.js' 4 | 5 | // Retrieve list of plugins differences 6 | export const computeDiffs = async function ({ baseSha, baseRepoUrl, diffUrl }) { 7 | const [baseFile, diffText] = await Promise.all([getBaseFile({ baseSha, baseRepoUrl }), getDiffText(diffUrl)]) 8 | 9 | const basePlugins = JSON.parse(baseFile) 10 | const headPlugins = JSON.parse(getDiffedFile(baseFile, diffText)) 11 | 12 | const diffs = getDiffs(basePlugins, headPlugins) 13 | return diffs 14 | } 15 | 16 | // Fetch list of plugins, before PR changes 17 | const getBaseFile = async ({ baseRepoUrl, baseSha }) => 18 | await fetchText(`${baseRepoUrl}/contents/site/plugins.json?ref=${baseSha}`, 'getBaseFile', { 19 | headers: { Accept: 'application/vnd.github.VERSION.raw' }, 20 | }) 21 | 22 | // Fetch list of PR changes 23 | const getDiffText = (diffUrl) => fetchText(diffUrl, 'getDiffText', {}) 24 | 25 | // Retrieve list of plugins, after PR changes 26 | const getDiffedFile = (baseFile, diffText) => { 27 | const diffed = applyPatch(baseFile, diffText) 28 | 29 | // applyPatch() sometimes returns `false` instead of errors 30 | // https://github.com/kpdecker/jsdiff/issues/247 31 | if (diffed === false) { 32 | throw new Error('Failed applying diff') 33 | } 34 | 35 | return diffed 36 | } 37 | 38 | // Retrieve list of difference between current plugins and new plugins 39 | const getDiffs = (basePlugins, headPlugins) => 40 | headPlugins.map((headPlugin) => getDiff(basePlugins, headPlugin)).filter(Boolean) 41 | 42 | const getDiff = function (basePlugins, { package: packageName, version, author }) { 43 | const basePlugin = basePlugins.find((plugin) => plugin.author === author && plugin.package === packageName) 44 | 45 | // New plugin 46 | if (basePlugin === undefined) { 47 | return { package: packageName, version, status: 'added' } 48 | } 49 | 50 | // Existing plugin, same version 51 | if (basePlugin.version === version) { 52 | return 53 | } 54 | 55 | // Existing plugin, different version 56 | const url = `https://diff.intrinsic.com/${packageName}/${basePlugin.version}/${version}` 57 | return { package: packageName, version, url, status: 'updated' } 58 | } 59 | -------------------------------------------------------------------------------- /functions/npm-diff/fetch.js: -------------------------------------------------------------------------------- 1 | import { env } from 'process' 2 | 3 | import fetch from 'node-fetch' 4 | 5 | // Make an HTTP request with a JSON request/response 6 | export const fetchJson = async (url, errorPrefix, { headers, body, ...options } = {}) => { 7 | const response = await fetch(url, { 8 | ...options, 9 | body: JSON.stringify({ body }), 10 | headers: { 11 | ...headers, 12 | 'Content-Type': 'application/json', 13 | Authorization: `token ${env.GITHUB_TOKEN}`, 14 | }, 15 | }) 16 | const json = await response.json() 17 | if (!response.ok) { 18 | throw new Error(`${errorPrefix}: ${json.message}`) 19 | } 20 | return json 21 | } 22 | 23 | // Make a regular HTTP request 24 | export const fetchText = async (url, errorPrefix, options) => { 25 | const response = await fetch(url, options) 26 | const text = await response.text() 27 | if (!response.ok) { 28 | throw new Error(`${errorPrefix}: ${text}`) 29 | } 30 | return text 31 | } 32 | -------------------------------------------------------------------------------- /functions/npm-diff/index.js: -------------------------------------------------------------------------------- 1 | import { computeDiffs } from './compute.js' 2 | import { getNewPluginsUrls } from './new_urls.js' 3 | import { upsertComment } from './upsert_comment.js' 4 | import { validatePayload } from './validate.js' 5 | 6 | // Main function handler. 7 | // Add/update a comment on each PR adding/updating a plugin showing the code 8 | // difference of the npm package. 9 | export const handler = async function (rawEvent) { 10 | console.log(rawEvent) 11 | 12 | try { 13 | const errorMessage = validatePayload(rawEvent) 14 | if (errorMessage !== undefined) { 15 | console.warn(`Validation error: ${errorMessage}`) 16 | return { 17 | statusCode: 404, 18 | body: 'Not Found', 19 | } 20 | } 21 | 22 | const event = JSON.parse(rawEvent.body) 23 | if (!ALLOWED_ACTIONS.has(event.action)) { 24 | console.log(`Ignoring action ${event.action}`) 25 | return 26 | } 27 | 28 | await performDiff(event) 29 | return { 30 | statusCode: 200, 31 | body: JSON.stringify({ message: 'success' }), 32 | } 33 | } catch (error) { 34 | console.error(error) 35 | return { 36 | statusCode: 500, 37 | body: JSON.stringify({ message: 'Unknown error' }), 38 | } 39 | } 40 | } 41 | 42 | const ALLOWED_ACTIONS = new Set(['opened', 'synchronize', 'reopened']) 43 | 44 | const performDiff = async function ({ 45 | pull_request: { 46 | base: { 47 | sha: baseSha, 48 | repo: { url: baseRepoUrl }, 49 | }, 50 | diff_url: diffUrl, 51 | comments_url: commentsUrl, 52 | }, 53 | }) { 54 | const diffs = await computeDiffs({ baseSha, baseRepoUrl, diffUrl }) 55 | if (diffs.length === 0) { 56 | console.log('No changed plugins') 57 | return 58 | } 59 | 60 | const diffUrls = await getNewPluginsUrls(diffs) 61 | await upsertComment(diffUrls, commentsUrl) 62 | } 63 | -------------------------------------------------------------------------------- /functions/npm-diff/new_urls.js: -------------------------------------------------------------------------------- 1 | import pacote from 'pacote' 2 | 3 | // Add npm URLs to new plugins. 4 | export const getNewPluginsUrls = (diffs) => Promise.all(diffs.map(getDiffNewPluginsUrls)) 5 | 6 | const getDiffNewPluginsUrls = async function (diff) { 7 | if (diff.status !== 'added') { 8 | return diff 9 | } 10 | 11 | const { 12 | dist: { tarball }, 13 | } = await pacote.manifest(`${diff.package}@${diff.version}`) 14 | return { ...diff, url: tarball } 15 | } 16 | -------------------------------------------------------------------------------- /functions/npm-diff/upsert_comment.js: -------------------------------------------------------------------------------- 1 | import { fetchJson } from './fetch.js' 2 | 3 | // Add or update a comment on the GitHub PR displaying the diff 4 | export const upsertComment = async (diffUrls, commentsUrl) => { 5 | const comment = getComment(diffUrls) 6 | if (comment === '') { 7 | return 8 | } 9 | 10 | try { 11 | const comments = await fetchJson(commentsUrl, 'failed getting comments', {}) 12 | 13 | const existingComment = comments.find(hasHeader) 14 | if (existingComment === undefined) { 15 | console.log(`Creating comment:\n${comment}`) 16 | await fetchJson(commentsUrl, 'failed creating comment', { method: 'POST', body: comment }) 17 | return 18 | } 19 | 20 | console.log(`Updating comment to:\n${comment}`) 21 | await fetchJson(existingComment.url, 'failed updating comment', { method: 'PATCH', body: comment }) 22 | } catch (error) { 23 | console.log(`addOrUpdatePrComment`, error.message) 24 | } 25 | } 26 | 27 | const getComment = function (diffUrls) { 28 | diffUrls.sort(sortDiffUrls) 29 | return UPDATE_TYPES.flatMap(({ status, header }) => listDiffUrls(diffUrls, status, header)) 30 | .filter(Boolean) 31 | .join('\n\n') 32 | } 33 | 34 | const sortDiffUrls = function (diffUrlA, diffUrlB) { 35 | return diffUrlA.package.localeCompare(diffUrlB.package) 36 | } 37 | 38 | const listDiffUrls = function (diffUrls, status, header) { 39 | const statusUrls = diffUrls.filter((sortedUrl) => sortedUrl.status === status) 40 | return statusUrls.length === 0 ? [] : [header, statusUrls.map(serializeDiffUrl).join('\n')] 41 | } 42 | 43 | const serializeDiffUrl = function ({ url }) { 44 | return `- ${url}` 45 | } 46 | 47 | const hasHeader = function ({ body }) { 48 | return UPDATE_TYPES.some(({ header }) => body.includes(header)) 49 | } 50 | 51 | const UPDATE_TYPES = [ 52 | { status: 'added', header: '#### Added Packages' }, 53 | { status: 'updated', header: '#### Updated Packages' }, 54 | ] 55 | -------------------------------------------------------------------------------- /functions/npm-diff/validate.js: -------------------------------------------------------------------------------- 1 | import { createHmac } from 'crypto' 2 | import { env } from 'process' 3 | 4 | // Validate Function event payload 5 | export const validatePayload = (rawEvent) => { 6 | const failedValidation = VALIDATIONS.find(({ test }) => test(rawEvent)) 7 | if (failedValidation === undefined) { 8 | return 9 | } 10 | const { errorMessage } = failedValidation 11 | return typeof errorMessage === 'function' ? errorMessage(rawEvent) : errorMessage 12 | } 13 | 14 | const VALIDATIONS = [ 15 | { 16 | test: ({ httpMethod }) => httpMethod === 'POST', 17 | errorMessage: "Expecting 'POST' request", 18 | }, 19 | { 20 | test: ({ headers }) => REQUIRED_HEADERS.every((requiredHeader) => headers[requiredHeader]), 21 | errorMessage({ headers }) { 22 | const missingHeaders = REQUIRED_HEADERS.filter((requiredHeader) => !headers[requiredHeader]).join(', ') 23 | return `Missing '${missingHeaders}'` 24 | }, 25 | }, 26 | { 27 | test: () => Boolean(env.GITHUB_WEBHOOK_SECRET), 28 | errorMessage: "Missing 'GITHUB_WEBHOOK_SECRET'", 29 | }, 30 | { 31 | test({ headers, body }) { 32 | const expectedSignature = createHmac('sha1', env.GITHUB_WEBHOOK_SECRET).update(body, 'utf-8').digest('hex') 33 | return headers['x-hub-signature'] === `sha1=${expectedSignature}` 34 | }, 35 | errorMessage: "Incorrect 'X-Hub-Signature'", 36 | }, 37 | ] 38 | 39 | const REQUIRED_HEADERS = ['x-hub-signature', 'x-github-event', 'x-github-delivery'] 40 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | 'use strict' 2 | 3 | import { readFileSync } from 'fs' 4 | import { fileURLToPath } from 'url' 5 | 6 | const PLUGINS_FILE = fileURLToPath(new URL('site/plugins.json', import.meta.url)) 7 | 8 | // TODO: replace with a JSON import once this is supported without any 9 | // experimental flag 10 | export const pluginsList = JSON.parse(readFileSync(PLUGINS_FILE)) 11 | export const pluginsUrl = 'https://list-v2--netlify-plugins.netlify.app/plugins.json' 12 | -------------------------------------------------------------------------------- /netlify.toml: -------------------------------------------------------------------------------- 1 | [build] 2 | publish = "site" 3 | functions = "functions" 4 | 5 | [[headers]] 6 | for = "/plugins.json" 7 | [headers.values] 8 | Access-Control-Allow-Origin = "*" 9 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@netlify/plugins-list", 3 | "version": "6.80.0", 4 | "description": "List of Netlify plugins", 5 | "type": "module", 6 | "exports": "./index.js", 7 | "main": "./index.js", 8 | "files": [ 9 | "index.js", 10 | "site/plugins.json" 11 | ], 12 | "scripts": { 13 | "prepare": "husky install node_modules/@netlify/eslint-config-node/.husky/", 14 | "prepublishOnly": "npm ci && npm test", 15 | "test": "run-s format test:dev", 16 | "format": "run-s format:check-fix:*", 17 | "format:ci": "run-s format:check:*", 18 | "format:check-fix:lint": "run-e format:check:lint format:fix:lint", 19 | "format:check:lint": "cross-env-shell eslint $npm_package_config_eslint", 20 | "format:fix:lint": "cross-env-shell eslint --fix $npm_package_config_eslint", 21 | "format:check-fix:prettier": "run-e format:check:prettier format:fix:prettier", 22 | "format:check:prettier": "cross-env-shell prettier --check $npm_package_config_prettier", 23 | "format:fix:prettier": "cross-env-shell prettier --write $npm_package_config_prettier", 24 | "test:dev": "ava", 25 | "test:ci": "c8 -r lcovonly -r text -r json ava" 26 | }, 27 | "config": { 28 | "eslint": "--ignore-path .gitignore --cache --format=codeframe --max-warnings=0 \"{functions,test,.github}/**/*.{cjs,mjs,js,md,html}\" \"*.{cjs,mjs,js,md,html}\" \".*.{cjs,mjs,js,md,html}\"", 29 | "prettier": "--ignore-path .gitignore --loglevel=warn \"{functions,test,.github}/**/*.{cjs,mjs,js,md,yml,json,html}\" \"*.{cjs,mjs,js,yml,json,html}\" \".*.{cjs,mjs,js,yml,json,html}\" \"!package-lock.json\"" 30 | }, 31 | "keywords": [ 32 | "netlify-plugin", 33 | "netlify" 34 | ], 35 | "author": "", 36 | "license": "MIT", 37 | "devDependencies": { 38 | "@netlify/eslint-config-node": "^7.0.1", 39 | "@sanity/client": "^3.3.6", 40 | "@sanity/uuid": "^3.0.1", 41 | "ava": "^6.0.0", 42 | "c8": "^9.0.0", 43 | "deep-equal": "^2.0.5", 44 | "diff": "^5.0.0", 45 | "dotenv": "^16.0.1", 46 | "got": "^11.8.0", 47 | "husky": "^8.0.0", 48 | "is-plain-obj": "^4.0.0", 49 | "node-fetch": "^3.1.1", 50 | "normalize-node-version": "^14.0.0", 51 | "pacote": "^13.0.0", 52 | "semver": "^7.0.0", 53 | "tsx": "^3.9.0", 54 | "upper-case-first": "^2.0.2" 55 | }, 56 | "engines": { 57 | "node": "^14.14.0 || >=16.0.0" 58 | }, 59 | "ava": { 60 | "timeout": "2m", 61 | "verbose": true, 62 | "workerThreads": false 63 | } 64 | } 65 | -------------------------------------------------------------------------------- /renovate.json5: -------------------------------------------------------------------------------- 1 | { 2 | extends: ['github>netlify/renovate-config:esm'], 3 | ignorePresets: [':prHourlyLimit2'], 4 | semanticCommits: true, 5 | dependencyDashboard: true 6 | } 7 | -------------------------------------------------------------------------------- /site/plugins.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "author": "bencevans", 4 | "description": "Install the Flutter SDK for Building and Deploying Flutter Web Apps", 5 | "name": "Flutter SDK", 6 | "package": "netlify-plugin-flutter", 7 | "repo": "https://github.com/bencevans/netlify-plugin-flutter", 8 | "version": "1.1.0" 9 | }, 10 | { 11 | "author": "nimbella", 12 | "description": "Nimbella plugin to extend Netlify Sites with stateful and portable serverless APIs.", 13 | "name": "Nimbella", 14 | "package": "netlify-plugin-nimbella", 15 | "repo": "https://github.com/nimbella/netlify-plugin-nimbella", 16 | "version": "2.1.0" 17 | }, 18 | { 19 | "author": "chrism2671", 20 | "description": "Clear Cloudflare cache when build completes.", 21 | "name": "Cloudflare cache purge", 22 | "package": "netlify-purge-cloudflare-on-deploy", 23 | "repo": "https://github.com/chrism2671/netlify-purge-cloudflare-on-deploy", 24 | "version": "1.2.0", 25 | "variables": [ 26 | { 27 | "name": "CLOUDFLARE_ZONE_ID", 28 | "description": "Cloudflare Zone ID" 29 | }, 30 | { 31 | "name": "CLOUDFLARE_API_TOKEN", 32 | "description": "In Cloudflare, navigate to My Profile --> API Tokens" 33 | } 34 | ] 35 | }, 36 | { 37 | "author": "lukeocodes", 38 | "description": "Generate an Algolia friendly search index of your site", 39 | "name": "Algolia search index", 40 | "package": "netlify-plugin-algolia-index", 41 | "repo": "https://github.com/lukeocodes/netlify-plugin-algolia-index", 42 | "version": "0.3.0", 43 | "status": "DEACTIVATED" 44 | }, 45 | { 46 | "author": "tkadlec", 47 | "description": "After a successful build, tell SpeedCurve you've deployed and trigger a round of testing.", 48 | "name": "Speedcurve", 49 | "package": "netlify-build-plugin-speedcurve", 50 | "repo": "https://github.com/andydavies/netlify-build-plugin-speedcurve", 51 | "version": "2.0.0", 52 | "variables": [ 53 | { 54 | "name": "SPEEDCURVE_SITE_ID", 55 | "description": "ID for the site you want to test (under Settings > Sites)" 56 | }, 57 | { 58 | "name": "SPEEDCURVE_API_KEY", 59 | "description": "Your SpeedCurve API Key (Admin > Teams)" 60 | } 61 | ] 62 | }, 63 | { 64 | "author": "munter", 65 | "description": "Checklinks helps you keep all your asset references correct and avoid embarrassing broken links to your internal pages, or even to external pages you link out to.", 66 | "name": "Checklinks", 67 | "package": "netlify-plugin-checklinks", 68 | "repo": "https://github.com/munter/netlify-plugin-checklinks", 69 | "version": "4.1.1" 70 | }, 71 | { 72 | "author": "munter", 73 | "description": "Subfont post-processes your web page to analyse you usage of web fonts, then reworks your webpage to use an optimal font loading strategy for the best performance.", 74 | "name": "Subfont", 75 | "package": "netlify-plugin-subfont", 76 | "repo": "https://github.com/munter/netlify-plugin-subfont", 77 | "version": "6.0.0" 78 | }, 79 | { 80 | "author": "munter", 81 | "description": "Hashfiles sets you up with an optimal caching strategy for static sites, where static assets across pages are cached for as long as possible in the visitors browser and never have to be re-requested.", 82 | "name": "Hashfiles", 83 | "package": "netlify-plugin-hashfiles", 84 | "repo": "https://github.com/munter/netlify-plugin-hashfiles", 85 | "version": "4.0.2" 86 | }, 87 | { 88 | "author": "neverendingqs", 89 | "description": "A Netlify build plugin that blocks deployment if it is outside of deployment hours.", 90 | "name": "Deployment hours", 91 | "package": "netlify-deployment-hours-plugin", 92 | "repo": "https://github.com/neverendingqs/netlify-deployment-hours-plugin", 93 | "version": "0.0.10" 94 | }, 95 | { 96 | "author": "jlengstorf", 97 | "description": "This plugin is deprecated. Please install the Essential Gatsby plugin instead", 98 | "name": "Gatsby cache", 99 | "package": "netlify-plugin-gatsby-cache", 100 | "repo": "https://github.com/jlengstorf/netlify-plugin-gatsby-cache", 101 | "version": "0.3.0", 102 | "status": "DEACTIVATED" 103 | }, 104 | { 105 | "author": "edm00se", 106 | "description": "Persist the Gridsome cache between Netlify builds for huge speed improvements! ⚡️", 107 | "name": "Gridsome cache", 108 | "package": "netlify-plugin-gridsome-cache", 109 | "repo": "https://github.com/edm00se/netlify-plugin-gridsome-cache", 110 | "version": "1.0.3" 111 | }, 112 | { 113 | "author": "applitools", 114 | "description": "Require visual changes on production to be manually approved before going live!", 115 | "name": "Visual Diff (Applitools)", 116 | "package": "netlify-plugin-visual-diff", 117 | "repo": "https://github.com/applitools/netlify-plugin-visual-diff", 118 | "version": "2.0.0", 119 | "compatibility": [ 120 | { 121 | "version": "2.0.0" 122 | }, 123 | { 124 | "nodeVersion": "<12.0.0", 125 | "version": "1.3.0" 126 | } 127 | ], 128 | "variables": [ 129 | { 130 | "name": "APPLITOOLS_API_KEY", 131 | "description": "Applitools [API key](https://eyes.applitools.com/)" 132 | } 133 | ], 134 | "docs": "https://github.com/applitools/netlify-plugin-visual-diff#readme" 135 | }, 136 | { 137 | "author": "pizzafox", 138 | "description": "This plugin is deprecated. The functionality is now built in", 139 | "name": "Next.js cache", 140 | "package": "netlify-plugin-cache-nextjs", 141 | "repo": "https://github.com/pizzafox/netlify-cache-nextjs", 142 | "version": "1.4.0", 143 | "status": "DEACTIVATED" 144 | }, 145 | { 146 | "author": "netlify-labs", 147 | "description": "Automatically generate a sitemap for your site on PostBuild in Netlify", 148 | "name": "Sitemap", 149 | "package": "@netlify/plugin-sitemap", 150 | "repo": "https://github.com/netlify-labs/netlify-plugin-sitemap", 151 | "version": "0.8.1" 152 | }, 153 | { 154 | "author": "daviddarnes", 155 | "description": "Generates posts, pages, tag pages and author pages from a Ghost publication as markdown files, using the Ghost Content API.", 156 | "name": "Ghost Markdown", 157 | "package": "netlify-plugin-ghost-markdown", 158 | "repo": "https://github.com/daviddarnes/netlify-plugin-ghost-markdown", 159 | "version": "3.1.0" 160 | }, 161 | { 162 | "author": "netlify-labs", 163 | "description": "Debug & verify the contents of your Netlify build cache", 164 | "name": "Debug cache", 165 | "package": "netlify-plugin-debug-cache", 166 | "repo": "https://github.com/netlify-labs/netlify-plugin-debug-cache", 167 | "version": "1.0.4" 168 | }, 169 | { 170 | "author": "shortdiv", 171 | "description": "Streamline local build development by grabbing environment variables from the UI to use locally", 172 | "name": "Get environment variables", 173 | "package": "netlify-plugin-get-env-vars", 174 | "repo": "https://github.com/shortdiv/netlify-plugin-get-env-vars", 175 | "version": "1.0.0", 176 | "status": "DEACTIVATED" 177 | }, 178 | { 179 | "author": "shortdiv", 180 | "description": "Prerenders a SPA into separate pages. Useful for letting Netlify identify forms in a SPA", 181 | "name": "Prerender SPA", 182 | "package": "netlify-plugin-prerender-spa", 183 | "repo": "https://github.com/shortdiv/netlify-plugin-prerender-spa", 184 | "version": "1.0.1", 185 | "status": "DEACTIVATED" 186 | }, 187 | { 188 | "author": "Snaplet", 189 | "description": "Bootstrap preview databases with your deploy previews on Netlify without affecting production. ", 190 | "name": "Snaplet", 191 | "package": "@snaplet/netlify-preview-database-plugin", 192 | "repo": "https://github.com/snaplet/netlify-preview-database-plugin", 193 | "version": "2.0.0" 194 | }, 195 | { 196 | "author": "sw-yx", 197 | "description": "Check that you preserve your own internal URL structure between builds, accounting for Netlify Redirects. Don't break the web!", 198 | "name": "No more 404", 199 | "package": "netlify-plugin-no-more-404", 200 | "repo": "https://github.com/sw-yx/netlify-plugin-no-more-404", 201 | "version": "0.0.15" 202 | }, 203 | { 204 | "author": "sw-yx", 205 | "description": "Netlify Build Plugin to partially obscure files (names and contents) in git repos! This enables you to partially open source your site, while still being able to work as normal on your local machine and in your Netlify builds.", 206 | "name": "Encrypted files", 207 | "package": "netlify-plugin-encrypted-files", 208 | "repo": "https://github.com/sw-yx/netlify-plugin-encrypted-files", 209 | "version": "0.0.5", 210 | "status": "DEACTIVATED" 211 | }, 212 | { 213 | "author": "sw-yx", 214 | "description": "Generate a Search Index of your site you can query via JavaScript or a Netlify Function", 215 | "name": "Search index", 216 | "package": "netlify-plugin-search-index", 217 | "repo": "https://github.com/sw-yx/netlify-plugin-search-index", 218 | "version": "0.1.5", 219 | "status": "DEACTIVATED" 220 | }, 221 | { 222 | "author": "sw-yx", 223 | "description": "Generate an RSS feed from your static html files, agnostic of static site generator!", 224 | "name": "RSS", 225 | "package": "netlify-plugin-rss", 226 | "repo": "https://github.com/sw-yx/netlify-plugin-rss", 227 | "version": "0.0.8", 228 | "status": "DEACTIVATED" 229 | }, 230 | { 231 | "author": "sw-yx", 232 | "description": "Build a more accessible web! Run your critical pages through pa11y and fail build if accessibility failures are found.", 233 | "name": "A11y", 234 | "package": "netlify-plugin-a11y", 235 | "repo": "https://github.com/sw-yx/netlify-plugin-a11y", 236 | "version": "0.0.12" 237 | }, 238 | { 239 | "author": "bahmutov", 240 | "description": "Runs Cypress end-to-end tests after Netlify builds the site.", 241 | "name": "Cypress", 242 | "package": "netlify-plugin-cypress", 243 | "repo": "https://github.com/cypress-io/netlify-plugin-cypress", 244 | "version": "2.2.0", 245 | "compatibility": [ 246 | { 247 | "migrationGuide": "https://github.com/cypress-io/netlify-plugin-cypress/releases/tag/v2.0.0", 248 | "version": "2.2.0" 249 | }, 250 | { 251 | "version": "1.11.1" 252 | } 253 | ], 254 | "variables": [ 255 | { 256 | "name": "CYPRESS_CACHE_FOLDER", 257 | "description": "Where to cache Cypress binary" 258 | } 259 | ], 260 | "docs": "https://github.com/cypress-io/netlify-plugin-cypress#readme" 261 | }, 262 | { 263 | "author": "cannikin", 264 | "description": "Replaces the database provider in Prisma's schema.prisma at build time.", 265 | "name": "Prisma Provider", 266 | "package": "netlify-plugin-prisma-provider", 267 | "repo": "https://github.com/redwoodjs/netlify-plugin-prisma-provider", 268 | "version": "0.3.0", 269 | "variables": [ 270 | { 271 | "name": "DATABASE_PROVIDER", 272 | "description": "The name of the ENV variable that contains the provider name." 273 | } 274 | ] 275 | }, 276 | { 277 | "author": "cball", 278 | "description": "Replaces ENV vars with ENV vars that are prefixed/suffixed with the context or branch name", 279 | "name": "Contextual ENV", 280 | "package": "netlify-plugin-contextual-env", 281 | "repo": "https://github.com/cball/netlify-plugin-contextual-env", 282 | "version": "0.3.0" 283 | }, 284 | { 285 | "author": "soofka", 286 | "description": "Installs Chromium (installs NPM Chromium package and sets environment variable to location of binaries); useful for other tools requiring Chromium to run, e.g. Lighthouse CI.", 287 | "name": "Chromium", 288 | "package": "netlify-plugin-chromium", 289 | "repo": "https://github.com/soofka/netlify-plugin-chromium", 290 | "version": "1.1.4" 291 | }, 292 | { 293 | "author": "Tom-Bonnike", 294 | "description": "Improve your site’s performance by inlining some of your assets/sources, reducing the number of HTTP requests your users need to make.", 295 | "name": "Inline source", 296 | "package": "netlify-plugin-inline-source", 297 | "repo": "https://github.com/Tom-Bonnike/netlify-plugin-inline-source", 298 | "version": "1.0.4" 299 | }, 300 | { 301 | "author": "Tom-Bonnike", 302 | "description": "Automatically extract and inline the critical CSS of your pages in order to render content to the user as fast as possible.", 303 | "name": "Inline critical CSS", 304 | "package": "netlify-plugin-inline-critical-css", 305 | "repo": "https://github.com/Tom-Bonnike/netlify-plugin-inline-critical-css", 306 | "version": "2.0.0", 307 | "compatibility": [ 308 | { 309 | "version": "2.0.0", 310 | "migrationGuide": "https://github.com/Tom-Bonnike/netlify-plugin-inline-critical-css/blob/master/CHANGELOG.md#200" 311 | }, 312 | { 313 | "version": "1.2.0", 314 | "nodeVersion": "^11 || ^13" 315 | } 316 | ] 317 | }, 318 | { 319 | "author": "tzmanics", 320 | "description": "🔌A Netlify Build Plugin to check your project for misspellings of important, brand-related words ☑️.", 321 | "name": "Brand guardian", 322 | "package": "netlify-plugin-brand-guardian", 323 | "repo": "https://github.com/tzmanics/netlify-plugin-brand-guardian", 324 | "version": "1.0.1", 325 | "status": "DEACTIVATED" 326 | }, 327 | { 328 | "author": "tzmanics", 329 | "description": "🔌A Netlify Build Plugin to show you how to use Netlify Build Plugins", 330 | "name": "All events", 331 | "package": "netlify-plugin-to-all-events", 332 | "repo": "https://github.com/tzmanics/netlify-plugin-to-all-events", 333 | "version": "1.3.1", 334 | "status": "DEACTIVATED" 335 | }, 336 | { 337 | "author": "philhawksworth", 338 | "description": "A plugin to add HTML minification as a post-processing optimisation in Netlify", 339 | "name": "Minify HTML", 340 | "package": "netlify-plugin-minify-html", 341 | "repo": "https://github.com/philhawksworth/netlify-plugin-minify-html", 342 | "version": "0.3.1" 343 | }, 344 | { 345 | "author": "pagewatch", 346 | "description": "Check your site for layout errors, spelling mistakes, broken links and performance issues on every build.", 347 | "name": "PageWatch Audit", 348 | "package": "netlify-plugin-pagewatch", 349 | "repo": "https://github.com/pagewatchdev/netlify-plugin-pagewatch", 350 | "version": "1.0.4", 351 | "variables": [ 352 | { 353 | "name": "PAGEWATCH_SITE_KEY", 354 | "description": "PageWatch [Api Key](https://docs.pagewatch.dev/guide/api.html)" 355 | } 356 | ], 357 | "docs": "https://github.com/pagewatchdev/netlify-plugin-pagewatch#readme" 358 | }, 359 | { 360 | "author": "philhawksworth", 361 | "description": "A Netlify plugin to fetch and cache content from remote feeds including RSS and JSON", 362 | "name": "Fetch feeds", 363 | "package": "netlify-plugin-fetch-feeds", 364 | "repo": "https://github.com/philhawksworth/netlify-plugin-fetch-feeds", 365 | "version": "0.2.3" 366 | }, 367 | { 368 | "author": "philhawksworth", 369 | "description": "A Netlify plugin to fetch and cache recent Instagram data and images", 370 | "name": "Add Instagram", 371 | "package": "netlify-plugin-add-instagram", 372 | "repo": "https://github.com/philhawksworth/netlify-plugin-add-instagram", 373 | "version": "0.2.2", 374 | "status": "DEACTIVATED" 375 | }, 376 | { 377 | "author": "getsentry", 378 | "description": "The Sentry integration on Netlify helps you quickly identify how code errors and performance issues impact your users. ", 379 | "name": "Sentry", 380 | "package": "@sentry/netlify-build-plugin", 381 | "repo": "https://github.com/getsentry/sentry-netlify-build-plugin", 382 | "version": "1.1.1", 383 | "variables": [ 384 | { 385 | "name": "SENTRY_AUTH_TOKEN", 386 | "description": "Authentication token for Sentry" 387 | }, 388 | { 389 | "name": "SENTRY_ORG", 390 | "description": "The slug of the organization name in Sentry" 391 | }, 392 | { 393 | "name": "SENTRY_PROJECT", 394 | "description": "The slug of the project name in Sentry" 395 | } 396 | ], 397 | "docs": "https://github.com/getsentry/sentry-netlify-build-plugin#readme" 398 | }, 399 | { 400 | "author": "AshikNesin", 401 | "description": "Send real time notification to your devices on build success/error via Pushover.net.", 402 | "name": "Pushover Notification", 403 | "package": "netlify-plugin-pushover", 404 | "repo": "https://github.com/AshikNesin/netlify-plugin-pushover", 405 | "version": "0.1.1", 406 | "variables": [ 407 | { 408 | "name": "PUSHOVER_USER_KEY", 409 | "description": "User key from Pushover" 410 | }, 411 | { 412 | "name": "PUSHOVER_API_TOKEN", 413 | "description": "[API token](https://pushover.net/api) from Pushover " 414 | } 415 | ], 416 | "docs": "https://github.com/AshikNesin/netlify-plugin-pushover#readme" 417 | }, 418 | { 419 | "author": "erezrokah", 420 | "description": "A Netlify plugin that uses Snyk to test for security vulnerabilities in a website's JavaScript libraries.", 421 | "name": "Is Website Vulnerable", 422 | "package": "netlify-plugin-is-website-vulnerable", 423 | "repo": "https://github.com/erezrokah/netlify-plugin-is-website-vulnerable", 424 | "version": "2.0.3", 425 | "compatibility": [ 426 | { 427 | "version": "2.0.3" 428 | }, 429 | { 430 | "version": "1.0.10", 431 | "nodeVersion": "<12.20.0" 432 | } 433 | ] 434 | }, 435 | { 436 | "author": "martinbean", 437 | "description": "A Netlify plugin to server-side render your AMP pages", 438 | "name": "AMP server-side rendering", 439 | "package": "netlify-plugin-amp-server-side-rendering", 440 | "repo": "https://github.com/martinbean/netlify-plugin-amp-server-side-rendering", 441 | "version": "1.0.2" 442 | }, 443 | { 444 | "author": "chrisdwheatley", 445 | "description": "Optimize images as part of your Netlify build process. Optimizes PNG, JPEG, GIF and SVG file formats.", 446 | "name": "Image Optim", 447 | "package": "netlify-plugin-image-optim", 448 | "repo": "https://github.com/chrisdwheatley/netlify-plugin-image-optim", 449 | "version": "0.4.0" 450 | }, 451 | { 452 | "author": "borisschapira", 453 | "description": "After a successful build, create an event in your Dareboost monitoring. If you have subscribed to API credits, you can automatically launch analyses.", 454 | "name": "Dareboost", 455 | "package": "netlify-build-plugin-dareboost", 456 | "repo": "https://github.com/borisschapira/netlify-build-plugin-dareboost", 457 | "version": "1.2.1", 458 | "variables": [ 459 | { 460 | "name": "DAREBOOST_API_TOKEN", 461 | "description": "Dareboost API Token" 462 | } 463 | ] 464 | }, 465 | { 466 | "author": "bencao", 467 | "description": "Inline process.env.VARIABLE in netlify functions with netlify build time environment variables.", 468 | "name": "Inline functions environment variables", 469 | "package": "netlify-plugin-inline-functions-env", 470 | "repo": "https://github.com/bencao/netlify-plugin-inline-functions-env", 471 | "version": "1.0.8" 472 | }, 473 | { 474 | "author": "cdeleeuwe", 475 | "description": "Persist Hugo resources folder between Netlify builds for huge build speed improvements!", 476 | "name": "Hugo cache resources", 477 | "package": "netlify-plugin-hugo-cache-resources", 478 | "repo": "https://github.com/cdeleeuwe/netlify-plugin-hugo-cache-resources", 479 | "version": "0.2.1" 480 | }, 481 | { 482 | "author": "cdeleeuwe", 483 | "description": "Automatically submit your sitemap to Google and Yandex after every production build!", 484 | "name": "Submit sitemap", 485 | "package": "netlify-plugin-submit-sitemap", 486 | "repo": "https://github.com/cdeleeuwe/netlify-plugin-submit-sitemap", 487 | "version": "0.4.0" 488 | }, 489 | { 490 | "author": "netlify-labs", 491 | "description": "Automatically run a Lighthouse audit on your website after every build.", 492 | "name": "Lighthouse", 493 | "package": "@netlify/plugin-lighthouse", 494 | "repo": "https://github.com/netlify/netlify-plugin-lighthouse", 495 | "version": "6.0.1", 496 | "compatibility": [ 497 | { 498 | "version": "6.0.1", 499 | "overridePinnedVersion": ">=5.0.0" 500 | }, 501 | { 502 | "nodeVersion": "<18.14.0", 503 | "version": "5.0.0" 504 | }, 505 | { 506 | "nodeVersion": "<14.0.0", 507 | "version": "2.1.3" 508 | }, 509 | { 510 | "nodeVersion": "<12.13.0", 511 | "version": "1.4.3" 512 | } 513 | ] 514 | }, 515 | { 516 | "author": "oliverroick", 517 | "description": "Validate HTML generated by your build.", 518 | "name": "HTML Validate", 519 | "package": "netlify-plugin-html-validate", 520 | "repo": "https://github.com/oliverroick/netlify-plugin-html-validate", 521 | "version": "1.0.0", 522 | "compatibility": [ 523 | { 524 | "version": "1.0.0", 525 | "migrationGuide": "https://github.com/oliverroick/netlify-plugin-html-validate/releases/tag/v1.0.0" 526 | }, 527 | { 528 | "version": "0.1.1" 529 | } 530 | ] 531 | }, 532 | { 533 | "author": "rozenmd", 534 | "description": "Tell PerfBeacon to measure page speed after a successful build", 535 | "name": "PerfBeacon", 536 | "package": "netlify-build-plugin-perfbeacon", 537 | "repo": "https://github.com/perfbeacon/netlify-build-plugin-perfbeacon", 538 | "version": "1.0.3", 539 | "status": "DEACTIVATED" 540 | }, 541 | { 542 | "author": "rayriffy", 543 | "description": "This plugin is deprecated. The functionality is now built in", 544 | "name": "Next dynamic routes", 545 | "package": "netlify-plugin-next-dynamic", 546 | "repo": "https://github.com/Brikl/opensource/tree/master/libs/netlify-plugin-next-dynamic", 547 | "version": "1.0.9", 548 | "status": "DEACTIVATED" 549 | }, 550 | { 551 | "author": "ample", 552 | "description": "Replace ENV variables in your publish directory", 553 | "name": "Replace", 554 | "package": "@helloample/netlify-plugin-replace", 555 | "repo": "https://github.com/ample/netlify-plugin-replace", 556 | "version": "1.1.4" 557 | }, 558 | { 559 | "author": "mattzeunert", 560 | "description": "Run tests on DebugBear to see how your deployments affect page performance and Lighthouse scores", 561 | "name": "DebugBear web performance", 562 | "package": "netlify-build-plugin-debugbear", 563 | "repo": "https://github.com/DebugBear/netlify-build-plugin-debugbear", 564 | "version": "1.0.6", 565 | "variables": [ 566 | { 567 | "name": "DEBUGBEAR_API_KEY", 568 | "description": "[API key](https://www.debugbear.com/docs/getting-started-api-cli) for your DebugBear project" 569 | }, 570 | { 571 | "name": "DEBUGBEAR_PAGE_IDS", 572 | "description": "Comma-separated list of [page IDs](https://www.debugbear.com/docs/getting-started-api-cli#) for pages that should be tested after each deployment" 573 | } 574 | ] 575 | }, 576 | { 577 | "author": "lirantal", 578 | "description": "A Snyk Netlify plugin to find and monitor new security vulnerabilities in JavaScript libraries.", 579 | "name": "Snyk Security", 580 | "package": "netlify-plugin-snyk", 581 | "repo": "https://github.com/snyk-labs/netlify-plugin-snyk", 582 | "version": "1.2.0", 583 | "variables": [ 584 | { 585 | "name": "SNYK_TOKEN", 586 | "description": "Snyk token, can be obtained via Snyk CLI: `snyk config get api`" 587 | } 588 | ] 589 | }, 590 | { 591 | "author": "algolia", 592 | "description": "Automatically crawls your website and generates an Algolia Search index.", 593 | "name": "Algolia Crawler", 594 | "package": "@algolia/netlify-plugin-crawler", 595 | "repo": "https://github.com/algolia/algoliasearch-netlify", 596 | "version": "1.0.0", 597 | "variables": [ 598 | { 599 | "name": " ALGOLIA_BASE_URL", 600 | "description": "URL to target, should be “https://crawler.algolia.com/”" 601 | }, 602 | { 603 | "name": "ALGOLIA_API_KEY", 604 | "description": "API Key to authenticate the call to the crawler." 605 | }, 606 | { 607 | "name": "ALGOLIA_DISABLED", 608 | "description": "Set to true to turn off the plugin without removing it." 609 | } 610 | ] 611 | }, 612 | { 613 | "author": "netlify", 614 | "description": "Build and deploy Next.js applications with server-side rendering. No extra configuration required.", 615 | "name": "Next.js ", 616 | "package": "@netlify/plugin-nextjs", 617 | "repo": "https://github.com/netlify/next-runtime", 618 | "version": "4.41.3", 619 | "compatibility": [ 620 | { 621 | "version": "5.7.0-ipx.0", 622 | "featureFlag": "plugins-aerodactyl", 623 | "overridePinnedVersion": ">=4.0.0", 624 | "nodeVersion": ">=18.0.0", 625 | "siteDependencies": { 626 | "next": ">=13.5.0" 627 | } 628 | }, 629 | { 630 | "version": "5.11.2", 631 | "featureFlag": "project_ceruledge_ui", 632 | "overridePinnedVersion": ">=4.0.0", 633 | "nodeVersion": ">=18.0.0", 634 | "siteDependencies": { 635 | "next": ">=13.5.0" 636 | } 637 | }, 638 | { 639 | "version": "4.41.3", 640 | "migrationGuide": "https://ntl.fyi/next-plugin-migration" 641 | }, 642 | { 643 | "version": "3.9.2", 644 | "siteDependencies": { 645 | "next": "<10.0.9" 646 | } 647 | }, 648 | { 649 | "version": "1.1.5", 650 | "siteDependencies": { 651 | "next": "<10.0.6" 652 | } 653 | } 654 | ] 655 | }, 656 | { 657 | "author": "netlify", 658 | "description": "Build and deploy Gatsby applications seamlessly. No extra configuration required.", 659 | "name": "Essential Gatsby", 660 | "package": "@netlify/plugin-gatsby", 661 | "repo": "https://github.com/netlify/netlify-plugin-gatsby", 662 | "version": "3.8.4", 663 | "compatibility": [ 664 | { 665 | "version": "3.8.4", 666 | "migrationGuide": "https://ntl.fyi/gatsby-plugin-migration" 667 | }, 668 | { 669 | "version": "1.0.3", 670 | "siteDependencies": { 671 | "gatsby": "<2.0.0" 672 | } 673 | } 674 | ] 675 | }, 676 | { 677 | "author": "netlify", 678 | "description": "Use Angular on Netlify", 679 | "name": "Angular Runtime", 680 | "package": "@netlify/angular-runtime", 681 | "repo": "https://github.com/netlify/angular-runtime", 682 | "version": "2.4.0" 683 | }, 684 | { 685 | "author": "netlify", 686 | "description": "Use Angular Universal on Netlify (in beta). For v17+, use Angular Runtime.", 687 | "name": "Angular Universal", 688 | "package": "@netlify/plugin-angular-universal", 689 | "repo": "https://github.com/netlify/netlify-plugin-angular-universal", 690 | "version": "1.0.1" 691 | }, 692 | { 693 | "author": "Anish-Roy", 694 | "description": "An obfuscator for your JavaScript source code.", 695 | "name": "JavaScript obfuscator", 696 | "package": "netlify-plugin-js-obfuscator", 697 | "repo": "https://github.com/iamanishroy/netlify-plugin-js-obfuscator", 698 | "version": "1.0.20" 699 | }, 700 | { 701 | "author": "racoonx2p", 702 | "description": "Send an email from Gmail after successful/failed Netlify build.", 703 | "name": "Gmail", 704 | "package": "netlify-plugin-gmail", 705 | "repo": "https://github.com/racoonx2p/netlify-plugin-gmail", 706 | "version": "1.1.0", 707 | "status": "DEACTIVATED" 708 | }, 709 | { 710 | "author": "mesomorphic", 711 | "description": "Persist the Jekyll cache between Netlify builds", 712 | "name": "Jekyll cache", 713 | "package": "netlify-plugin-jekyll-cache", 714 | "repo": "https://github.com/Mesomorphic/netlify-plugin-jekyll-cache", 715 | "version": "1.0.0" 716 | }, 717 | { 718 | "author": "CodeFoodPixels", 719 | "description": "Automatically discover any webmentions and send them after every production build", 720 | "name": "Webmentions", 721 | "package": "netlify-plugin-webmentions", 722 | "repo": "https://github.com/CodeFoodPixels/netlify-plugin-webmentions", 723 | "version": "1.1.0" 724 | }, 725 | { 726 | "author": "flaurida", 727 | "description": "Run QA Wolf end-to-end tests on Netlify deployments 🐺", 728 | "name": "QA Wolf", 729 | "package": "netlify-plugin-qawolf", 730 | "repo": "https://github.com/qawolf/netlify-plugin-qawolf", 731 | "version": "1.2.0" 732 | }, 733 | { 734 | "author": "Ghost Inspector", 735 | "description": "Run Ghost Inspector automated browser tests on your Netlify deploys.", 736 | "name": "Ghost Inspector", 737 | "package": "netlify-plugin-ghost-inspector", 738 | "repo": "https://github.com/ghost-inspector/netlify-plugin", 739 | "version": "1.0.1", 740 | "variables": [ 741 | { 742 | "name": "GHOST_INSPECTOR_API_KEY", 743 | "description": "Ghost Inspector API Key, which can be found in your [account settings](https://app.ghostinspector.com/account)" 744 | }, 745 | { 746 | "name": "GHOST_INSPECTOR_SUITE", 747 | "description": "Ghost Inspector suite ID. To find your suite ID, navigate to the suite you want to use and copy the ID in the URL (after /suites/)." 748 | } 749 | ], 750 | "docs": "https://github.com/ghost-inspector/netlify-plugin#readme" 751 | }, 752 | { 753 | "author": "StepZen ", 754 | "description": "Deploy a StepZen (http://stepzen.com) GraphQL API with any Netlify build.", 755 | "name": "StepZen", 756 | "package": "netlify-plugin-stepzen", 757 | "repo": "https://github.com/steprz/netlify-plugin-stepzen", 758 | "version": "1.0.4", 759 | "variables": [ 760 | { 761 | "name": "STEPZEN_ACCOUNT", 762 | "description": "Specifies the name of your StepZen account. This can be found on the My Account page on [StepZen.com](https://login.stepzen.com)" 763 | }, 764 | { 765 | "name": "STEPZEN_ADMIN_KEY", 766 | "description": "Specifies the admin API Key that enables access to deploy APIs on your account on StepZen. This can be found on the My Account page on [StepZen.com.\\](https://login.stepzen.com)" 767 | }, 768 | { 769 | "name": "STEPZEN_NAME", 770 | "description": "Specifies the endpoint name for your API. This will determine the URL that your endpoint will deployed to." 771 | } 772 | ], 773 | "docs": "https://github.com/steprz/netlify-plugin-stepzen#readme" 774 | }, 775 | { 776 | "author": "bharathvaj-ganesan", 777 | "description": "Automatically notifies Airbrake of new site deploys.", 778 | "name": "Airbrake", 779 | "package": "@bharathvaj/netlify-plugin-airbrake", 780 | "repo": "https://github.com/bharathvaj-ganesan/netlify-plugin-airbrake", 781 | "version": "1.0.2", 782 | "variables": [ 783 | { 784 | "name": "AIRBRAKE_PROJECT_ID", 785 | "description": "Project Id" 786 | }, 787 | { 788 | "name": "AIRBRAKE_PROJECT_KEY", 789 | "description": "Project Key" 790 | } 791 | ] 792 | }, 793 | { 794 | "author": "Arnaud Ligny", 795 | "description": "Persist the Cecil cache between Netlify builds.", 796 | "name": "Cecil cache", 797 | "package": "netlify-plugin-cecil-cache", 798 | "repo": "https://github.com/Cecilapp/netlify-plugin-cecil-cache", 799 | "version": "0.3.3", 800 | "compatibility": [ 801 | { 802 | "version": "0.3.3" 803 | }, 804 | { 805 | "version": "0.2.5" 806 | } 807 | ] 808 | }, 809 | { 810 | "author": "Ben Lmsc", 811 | "description": "Make some environment variables available only at build time in the runtime of your app.", 812 | "name": "Use Env in Runtime", 813 | "package": "netlify-plugin-use-env-in-runtime", 814 | "repo": "https://github.com/ARKHN3B/netlify-plugin-use-env-in-runtime", 815 | "version": "1.2.1", 816 | "variables": [ 817 | { 818 | "name": "NETLIFY_PLUGIN_USE_ENV_IN_RUNTIME_PREFIX", 819 | "description": "The prefix we want to add to our environment variables." 820 | }, 821 | { 822 | "name": "NETLIFY_PLUGIN_USE_ENV_IN_RUNTIME_DEF", 823 | "description": "The names of the variables you want to use. Accept two naming schemes: 1. use an array of strings: [\"VAR_1\", \"VAR_2\"] 2. use a string with a comma or semicolon to separate the names: \"VAR_1; VAR_2; VAR_3\" or \"VAR_1, VAR_2, VAR_3\"" 824 | } 825 | ] 826 | }, 827 | { 828 | "author": "Fahad Allibdi", 829 | "description": "Skip not affected apps in a nx monorepo.", 830 | "name": "Skip nx", 831 | "package": "netlify-plugin-nx-skip-build", 832 | "repo": "https://www.npmjs.com/package/netlify-plugin-nx-skip-build", 833 | "version": "0.0.7", 834 | "variables": [ 835 | { 836 | "name": "PROJECT_NAME", 837 | "description": "NX Application name" 838 | }, 839 | { 840 | "name": "NX_FORCE_DEPLOYMENT", 841 | "description": "If set to `true` allows force deployment when you need to redeploy your site and skip any plugin logic" 842 | } 843 | ], 844 | "docs": "https://github.com/f22hd/netlify-plugin-nx-skip-build#readme" 845 | }, 846 | { 847 | "author": "Amar Parmar", 848 | "description": "Send build events to a logging service.", 849 | "name": "Build Logger", 850 | "package": "netlify-plugin-build-logger", 851 | "repo": "https://github.com/amar-p6/netlify-build-logger-plugin", 852 | "version": "1.0.3", 853 | "variables": [ 854 | { 855 | "name": "DATADOG_API_KEY", 856 | "description": "Datadog API key" 857 | }, 858 | { 859 | "name": "ENVIRONMENT", 860 | "description": "Takes any string (dev, staging, etc.)" 861 | }, 862 | { 863 | "name": "LOGGER_TYPE", 864 | "description": "Either console or datadog" 865 | } 866 | ] 867 | }, 868 | { 869 | "author": "aaronbassett", 870 | "description": "Automatically notifies New Relic of Netlify build events and installs the New Relic browser agent to monitor your sites.", 871 | "name": "New Relic", 872 | "package": "@newrelic/netlify-plugin", 873 | "repo": "https://github.com/newrelic-experimental/netlify-plugin", 874 | "version": "1.0.2", 875 | "variables": [ 876 | { 877 | "name": "NEWRELIC_ACCOUNT_ID", 878 | "description": "Your New Relic [Account ID](https://docs.newrelic.com/docs/accounts/accounts-billing/account-structure/account-id/)" 879 | }, 880 | { 881 | "name": " NEWRELIC_INGEST_LICENSE_KEY", 882 | "description": "A New Relic ingest [license key](https://docs.newrelic.com/docs/apis/intro-apis/new-relic-api-keys/#ingest-license-key)" 883 | }, 884 | { 885 | "name": "NEWRELIC_BROWSER_LICENSE_KEY", 886 | "description": "A New Relic browser ingest [license key](https://docs.newrelic.com/docs/apis/intro-apis/new-relic-api-keys/#ingest-browser-key)" 887 | }, 888 | { 889 | "name": "NEWRELIC_APP_ID", 890 | "description": "Your New Relic Browser [App ID](https://docs.newrelic.com/docs/apis/rest-api-v2/get-started/get-app-other-ids-new-relic-one/#browser)" 891 | }, 892 | { 893 | "name": "ENABLE_BROWSER_MONITORING", 894 | "description": "Set this to `true`" 895 | } 896 | ], 897 | "docs": "https://github.com/newrelic-experimental/netlify-plugin#readme" 898 | }, 899 | { 900 | "author": "CommandBar", 901 | "description": "CommandBar plugin for websites deployed to Netlify.", 902 | "name": "CommandBar", 903 | "package": "@commandbar/netlify-plugin-commandbar", 904 | "repo": "https://github.com/tryfoobar/netlify-plugin-commandbar", 905 | "version": "0.0.4", 906 | "variables": [ 907 | { 908 | "name": "COMMANDBAR_ORG_ID", 909 | "description": "Your CommandBar organization id" 910 | } 911 | ] 912 | }, 913 | { 914 | "author": "Colby Fayock", 915 | "description": "Automatically optimize your Netlify site images and deliver them in modern formats with Cloudinary.", 916 | "name": "Cloudinary", 917 | "package": "netlify-plugin-cloudinary", 918 | "repo": "https://github.com/cloudinary-community/netlify-plugin-cloudinary", 919 | "version": "1.17.0", 920 | "variables": [ 921 | { 922 | "name": "CLOUDINARY_CLOUD_NAME", 923 | "description": "Cloudinary Cloud Name" 924 | } 925 | ] 926 | }, 927 | { 928 | "author": "Dima Marynych", 929 | "description": "Securely collect and use sensitive data without having it ever touch your systems.", 930 | "name": "Very Good Security", 931 | "package": "@vgs/netlify-plugin-vgs", 932 | "repo": "https://github.com/verygoodsecurity/netlify-plugin-vgs", 933 | "version": "0.0.2", 934 | "variables": [ 935 | { 936 | "name": "VGS_CLIENT_ID", 937 | "description": "Very Good Security's [client ID](https://www.verygoodsecurity.com/docs/development/vgs-git-flow/#1-provision-a-service-account)" 938 | }, 939 | { 940 | "name": "VGS_CLIENT_SECRET", 941 | "description": "Very Good Security's [client secret](https://www.verygoodsecurity.com/docs/development/vgs-git-flow/#1-provision-a-service-account)" 942 | }, 943 | { 944 | "name": "VGS_VAULT_ID", 945 | "description": "ID of [your vault](https://dashboard.verygoodsecurity.com/)" 946 | } 947 | ], 948 | "docs": "https://github.com/verygoodsecurity/netlify-plugin-vgs#readme" 949 | }, 950 | { 951 | "author": "Rob Grant", 952 | "description": "Automatically create and configure a TakeShape project for use with your Netlify site.", 953 | "name": "TakeShape", 954 | "package": "@takeshape/netlify-plugin-takeshape", 955 | "repo": "https://github.com/takeshape/netlify-plugin-takeshape", 956 | "version": "1.0.0", 957 | "variables": [ 958 | { 959 | "name": "TAKESHAPE_ACCESS_TOKEN", 960 | "description": "Takeshape [personal access token](https://app.takeshape.io/personal-access-tokens)" 961 | } 962 | ], 963 | "docs": "https://github.com/takeshape/netlify-plugin-takeshape#readme" 964 | }, 965 | { 966 | "author": "Hung Viet Nguyen", 967 | "description": "Persist the Playwright executables between Netlify builds.", 968 | "name": "Playwright cache", 969 | "package": "netlify-plugin-playwright-cache", 970 | "repo": "https://github.com/nvh95/netlify-plugin-playwright-cache", 971 | "version": "0.0.1" 972 | }, 973 | { 974 | "author": "Sean Roberts", 975 | "description": "Feature Package Pilot", 976 | "name": "Feature Package Pilot", 977 | "package": "@netlify/feature-package-pilot", 978 | "repo": "https://github.com/netlify/plugins", 979 | "version": "0.1.11", 980 | "status": "DEACTIVATED", 981 | "workflow": true 982 | }, 983 | { 984 | "author": "Inngest", 985 | "description": "Automatically deploy Inngest functions to Netlify’s platform. ", 986 | "name": "Inngest", 987 | "package": "netlify-plugin-inngest", 988 | "repo": "https://github.com/inngest/netlify-plugin-inngest", 989 | "version": "1.0.0" 990 | }, 991 | { 992 | "author": "Formspree", 993 | "description": "Deploy React forms with formspree.json", 994 | "name": "Formspree", 995 | "package": "netlify-plugin-formspree", 996 | "repo": "https://github.com/formspree/netlify-plugin-formspree", 997 | "version": "1.0.1" 998 | }, 999 | { 1000 | "author": "Netlify", 1001 | "description": "Makes emails easy on Netlify.", 1002 | "name": "Netlify Emails", 1003 | "package": "@netlify/plugin-emails", 1004 | "repo": "https://github.com/netlify/plugins", 1005 | "version": "1.1.1" 1006 | }, 1007 | { 1008 | "name": "ChiselStrike", 1009 | "package": "@chiselstrike/netlify-plugin", 1010 | "description": "Sync Netlify sites and ChiselStrike builds from code in the same Git repository.", 1011 | "repo": "https://github.com/chiselstrike/netlify-plugin", 1012 | "version": "0.1.0" 1013 | }, 1014 | { 1015 | "name": "Netlify Bundle ENV", 1016 | "package": "netlify-plugin-bundle-env", 1017 | "description": "A Netlify Build Plugin to inject environment variables in Netlify Functions during Netlify Builds.", 1018 | "repo": "https://github.com/Hrishikesh-K/netlify-plugin-bundle-env", 1019 | "version": "0.2.2", 1020 | "docs": "https://github.com/Hrishikesh-K/netlify-plugin-bundle-env/blob/main/readme.md" 1021 | }, 1022 | { 1023 | "author": "Netlify", 1024 | "description": "Conditionally set your Contentful env vars depending on the environment", 1025 | "name": "Contentful Previews", 1026 | "package": "@netlify/plugin-contentful-buildtime", 1027 | "repo": "https://github.com/netlify/plugins", 1028 | "version": "0.0.3" 1029 | }, 1030 | { 1031 | "name": "21YunBox", 1032 | "package": "@21yunbox/netlify-plugin-21yunbox-deploy-to-china-cdn", 1033 | "description": "Deploy to China straight from your Netlify Dashboard", 1034 | "repo": "https://github.com/tobyglei/netlify-plugin-21yunbox-deploy-your-site-to-china-edge", 1035 | "version": "1.0.7", 1036 | "docs": "https://www.21cloudbox.com/solution/netlify-solution-for-china.html" 1037 | }, 1038 | { 1039 | "name": "Strapi", 1040 | "package": "strapi-plugin-netlify-deployments", 1041 | "description": "Strapi v4 plugin to trigger, monitor, and cancel deployments on one or more Netlify sites", 1042 | "repo": "https://github.com/jclusso/strapi-plugin-netlify-deployments#readme", 1043 | "version": "2.0.1", 1044 | "docs": "https://market.strapi.io/plugins/strapi-plugin-netlify-deployments" 1045 | } 1046 | ] 1047 | -------------------------------------------------------------------------------- /test/bin/utils.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable max-lines */ 2 | 3 | /** 4 | * @typedef { import("../types/plugins").SanityBuildPluginEntity } SanityBuildPluginEntity 5 | * @typedef { import("../types/plugins").SanityPluginLookup } SanityPluginLookup 6 | * @typedef { import("../../types/plugins").SanityBuildPluginEntity } SanityBuildPluginEntity 7 | */ 8 | 9 | import test from 'ava' 10 | 11 | import { updatePlugins, getPluginDiffsForSanity, getSanityPluginLookup } from '../../bin/utils.js' 12 | 13 | test('should generate Sanity build plugin lookup', (t) => { 14 | /** 15 | * @type {SanityBuildPluginEntity[]} 16 | */ 17 | const sanityBuildPlugins = [ 18 | { 19 | _id: '1', 20 | compatibility: null, 21 | packageName: 'netlify-plugin-use-env-in-runtime', 22 | version: '1.2.1', 23 | }, 24 | { 25 | _id: '2', 26 | compatibility: null, 27 | packageName: '@bharathvaj/netlify-plugin-airbrake', 28 | version: '1.0.2', 29 | }, 30 | { 31 | _id: '3', 32 | compatibility: null, 33 | packageName: 'netlify-plugin-debug-cache', 34 | version: '1.0.4', 35 | }, 36 | ] 37 | const expected = { 38 | 'netlify-plugin-use-env-in-runtime': { 39 | _id: '1', 40 | compatibility: null, 41 | packageName: 'netlify-plugin-use-env-in-runtime', 42 | version: '1.2.1', 43 | }, 44 | '@bharathvaj/netlify-plugin-airbrake': { 45 | _id: '2', 46 | compatibility: null, 47 | packageName: '@bharathvaj/netlify-plugin-airbrake', 48 | version: '1.0.2', 49 | }, 50 | 'netlify-plugin-debug-cache': { 51 | _id: '3', 52 | compatibility: null, 53 | packageName: 'netlify-plugin-debug-cache', 54 | version: '1.0.4', 55 | }, 56 | } 57 | const actual = getSanityPluginLookup(sanityBuildPlugins) 58 | t.deepEqual(actual, expected) 59 | }) 60 | 61 | test('should generate plugin diffs for Sanity', (t) => { 62 | const pluginLookup = { 63 | 'netlify-plugin-use-env-in-runtime': { 64 | _id: '1', 65 | compatibility: null, 66 | packageName: 'netlify-plugin-use-env-in-runtime', 67 | version: '1.2.1', 68 | }, 69 | '@bharathvaj/netlify-plugin-airbrake': { 70 | _id: '2', 71 | compatibility: null, 72 | packageName: '@bharathvaj/netlify-plugin-airbrake', 73 | version: '1.0.2', 74 | }, 75 | 'netlify-plugin-debug-cache': { 76 | _id: '3', 77 | compatibility: null, 78 | packageName: 'netlify-plugin-debug-cache', 79 | version: '1.0.4', 80 | }, 81 | } 82 | const plugins = [ 83 | { 84 | compatibility: [ 85 | { 86 | _key: 'dfsfg3443sdfgdfgd', 87 | version: '2.0.0', 88 | }, 89 | { 90 | _key: 'dfsfg3443sdfgdfg2', 91 | version: '1.3.0', 92 | nodeVersion: '<12.0.0', 93 | }, 94 | ], 95 | package: 'netlify-plugin-use-env-in-runtime', 96 | version: '1.2.2', 97 | }, 98 | { 99 | package: '@bharathvaj/netlify-plugin-airbrake', 100 | version: '1.0.2', 101 | }, 102 | { 103 | compatibility: [], 104 | package: 'netlify-plugin-debug-cache', 105 | version: '1.0.4', 106 | }, 107 | ] 108 | 109 | // authors are not currently in here because for v1, we're not updating authors. 110 | const expected = [ 111 | { 112 | _id: '1', 113 | compatibility: [ 114 | { 115 | _key: 'dfsfg3443sdfgdfgd', 116 | version: '2.0.0', 117 | }, 118 | { 119 | _key: 'dfsfg3443sdfgdfg2', 120 | version: '1.3.0', 121 | nodeVersion: '<12.0.0', 122 | }, 123 | ], 124 | version: '1.2.2', 125 | }, 126 | { 127 | _id: '3', 128 | compatibility: [], 129 | version: '1.0.4', 130 | }, 131 | ] 132 | const actual = getPluginDiffsForSanity(pluginLookup, plugins) 133 | 134 | t.deepEqual(actual, expected) 135 | }) 136 | 137 | test('should return no plugin diffs for Sanity if there are no changes', (t) => { 138 | const pluginLookup = { 139 | 'netlify-plugin-use-env-in-runtime': { 140 | _id: '1', 141 | compatibility: null, 142 | packageName: 'netlify-plugin-use-env-in-runtime', 143 | version: '1.2.1', 144 | }, 145 | '@bharathvaj/netlify-plugin-airbrake': { 146 | _id: '2', 147 | compatibility: null, 148 | packageName: '@bharathvaj/netlify-plugin-airbrake', 149 | version: '1.0.2', 150 | }, 151 | 'netlify-plugin-debug-cache': { 152 | _id: '3', 153 | compatibility: null, 154 | packageName: 'netlify-plugin-debug-cache', 155 | version: '1.0.4', 156 | }, 157 | } 158 | const plugins = [ 159 | { 160 | package: 'netlify-plugin-use-env-in-runtime', 161 | version: '1.2.1', 162 | }, 163 | { 164 | package: '@bharathvaj/netlify-plugin-airbrake', 165 | version: '1.0.2', 166 | }, 167 | { 168 | package: 'netlify-plugin-debug-cache', 169 | version: '1.0.4', 170 | }, 171 | ] 172 | const expected = [] 173 | const actual = getPluginDiffsForSanity(pluginLookup, plugins) 174 | 175 | t.deepEqual(actual, expected) 176 | }) 177 | 178 | test('should update a plugin', (t) => { 179 | const changes = { 180 | description: 'Require visual changes on production to be manually approved before going live!', 181 | packageName: 'netlify-plugin-visual-diff', 182 | repoUrl: 'https://github.com/applitools/netlify-plugin-visual-diff', 183 | status: 'active', 184 | title: 'Visual diff (Applitools)', 185 | version: '5.0.0', 186 | compatibility: [ 187 | { 188 | _key: 'dfsfg3443sdfgdfgd', 189 | version: '3.0.0', 190 | }, 191 | { 192 | _key: 'dfsfg3443sdfgdfgd', 193 | version: '1.3.0', 194 | nodeVersion: '<12.0.0', 195 | }, 196 | ], 197 | } 198 | 199 | const plugins = [ 200 | { 201 | author: 'applitools', 202 | description: 'Require visual changes on production to be manually approved before going live!', 203 | name: 'Visual diff (Applitools)', 204 | package: 'netlify-plugin-visual-diff', 205 | repo: 'https://github.com/applitools/netlify-plugin-visual-diff', 206 | version: '2.0.0', 207 | compatibility: [ 208 | { 209 | version: '2.0.0', 210 | }, 211 | { 212 | version: '1.3.0', 213 | nodeVersion: '<12.0.0', 214 | }, 215 | ], 216 | }, 217 | { 218 | author: 'pizzafox', 219 | description: 'This plugin is deprecated. The functionality is now built in', 220 | name: 'Next.js cache', 221 | package: 'netlify-plugin-cache-nextjs', 222 | repo: 'https://github.com/pizzafox/netlify-cache-nextjs', 223 | version: '1.4.0', 224 | status: 'DEACTIVATED', 225 | }, 226 | { 227 | author: 'netlify-labs', 228 | description: 'Automatically generate a sitemap for your site on PostBuild in Netlify', 229 | name: 'Sitemap', 230 | package: '@netlify/plugin-sitemap', 231 | repo: 'https://github.com/netlify-labs/netlify-plugin-sitemap', 232 | version: '0.8.1', 233 | }, 234 | ] 235 | const actual = updatePlugins(changes, plugins) 236 | const expected = [ 237 | { 238 | author: 'applitools', 239 | description: 'Require visual changes on production to be manually approved before going live!', 240 | name: 'Visual diff (Applitools)', 241 | package: 'netlify-plugin-visual-diff', 242 | repo: 'https://github.com/applitools/netlify-plugin-visual-diff', 243 | version: '5.0.0', 244 | compatibility: [ 245 | { 246 | version: '3.0.0', 247 | }, 248 | { 249 | version: '1.3.0', 250 | nodeVersion: '<12.0.0', 251 | }, 252 | ], 253 | }, 254 | { 255 | author: 'pizzafox', 256 | description: 'This plugin is deprecated. The functionality is now built in', 257 | name: 'Next.js cache', 258 | package: 'netlify-plugin-cache-nextjs', 259 | repo: 'https://github.com/pizzafox/netlify-cache-nextjs', 260 | version: '1.4.0', 261 | status: 'DEACTIVATED', 262 | }, 263 | { 264 | author: 'netlify-labs', 265 | description: 'Automatically generate a sitemap for your site on PostBuild in Netlify', 266 | name: 'Sitemap', 267 | package: '@netlify/plugin-sitemap', 268 | repo: 'https://github.com/netlify-labs/netlify-plugin-sitemap', 269 | version: '0.8.1', 270 | }, 271 | ] 272 | 273 | t.deepEqual(actual, expected) 274 | }) 275 | 276 | test('should add a new plugin', (t) => { 277 | const changes = { 278 | compatibility: null, 279 | description: 'Require visual changes on production to be manually approved before going live!', 280 | netlifyVerified: false, 281 | packageName: 'netlify-plugin-visual-diff', 282 | repoUrl: 'https://github.com/applitools/netlify-plugin-visual-diff', 283 | status: 'active', 284 | title: 'Visual diff (Applitools)', 285 | version: '5.0.0', 286 | } 287 | const plugins = [ 288 | { 289 | author: 'pizzafox', 290 | description: 'This plugin is deprecated. The functionality is now built in', 291 | name: 'Next.js cache', 292 | package: 'netlify-plugin-cache-nextjs', 293 | repo: 'https://github.com/pizzafox/netlify-cache-nextjs', 294 | version: '1.4.0', 295 | status: 'DEACTIVATED', 296 | }, 297 | { 298 | author: 'netlify-labs', 299 | description: 'Automatically generate a sitemap for your site on PostBuild in Netlify', 300 | name: 'Sitemap', 301 | package: '@netlify/plugin-sitemap', 302 | repo: 'https://github.com/netlify-labs/netlify-plugin-sitemap', 303 | version: '0.8.1', 304 | }, 305 | ] 306 | const actual = updatePlugins(changes, plugins) 307 | const expected = [ 308 | { 309 | author: 'pizzafox', 310 | description: 'This plugin is deprecated. The functionality is now built in', 311 | name: 'Next.js cache', 312 | package: 'netlify-plugin-cache-nextjs', 313 | repo: 'https://github.com/pizzafox/netlify-cache-nextjs', 314 | version: '1.4.0', 315 | status: 'DEACTIVATED', 316 | }, 317 | { 318 | author: 'netlify-labs', 319 | description: 'Automatically generate a sitemap for your site on PostBuild in Netlify', 320 | name: 'Sitemap', 321 | package: '@netlify/plugin-sitemap', 322 | repo: 'https://github.com/netlify-labs/netlify-plugin-sitemap', 323 | version: '0.8.1', 324 | }, 325 | { 326 | description: 'Require visual changes on production to be manually approved before going live!', 327 | package: 'netlify-plugin-visual-diff', 328 | repo: 'https://github.com/applitools/netlify-plugin-visual-diff', 329 | name: 'Visual diff (Applitools)', 330 | version: '5.0.0', 331 | }, 332 | ] 333 | 334 | t.deepEqual(actual, expected) 335 | }) 336 | 337 | test('should update compatibility', (t) => { 338 | const changes = { 339 | compatibility: [ 340 | { 341 | version: '2.0.0', 342 | }, 343 | { 344 | version: '1.3.0', 345 | }, 346 | ], 347 | description: 'Require visual changes on production to be manually approved before going live!', 348 | netlifyVerified: false, 349 | packageName: 'netlify-plugin-visual-diff', 350 | repoUrl: 'https://github.com/applitools/netlify-plugin-visual-diff', 351 | status: 'active', 352 | title: 'Visual diff (Applitools)', 353 | version: '5.0.0', 354 | } 355 | const plugins = [ 356 | { 357 | author: 'applitools', 358 | description: 'Require visual changes on production to be manually approved before going live!', 359 | name: 'Visual diff (Applitools)', 360 | package: 'netlify-plugin-visual-diff', 361 | repo: 'https://github.com/applitools/netlify-plugin-visual-diff', 362 | version: '5.0.0', 363 | }, 364 | { 365 | author: 'pizzafox', 366 | description: 'This plugin is deprecated. The functionality is now built in', 367 | name: 'Next.js cache', 368 | package: 'netlify-plugin-cache-nextjs', 369 | repo: 'https://github.com/pizzafox/netlify-cache-nextjs', 370 | version: '1.4.0', 371 | status: 'DEACTIVATED', 372 | }, 373 | { 374 | author: 'netlify-labs', 375 | description: 'Automatically generate a sitemap for your site on PostBuild in Netlify', 376 | name: 'Sitemap', 377 | package: '@netlify/plugin-sitemap', 378 | repo: 'https://github.com/netlify-labs/netlify-plugin-sitemap', 379 | version: '0.8.1', 380 | }, 381 | ] 382 | const actual = updatePlugins(changes, plugins) 383 | const expected = [ 384 | { 385 | author: 'applitools', 386 | compatibility: [ 387 | { 388 | version: '2.0.0', 389 | }, 390 | { 391 | version: '1.3.0', 392 | }, 393 | ], 394 | description: 'Require visual changes on production to be manually approved before going live!', 395 | name: 'Visual diff (Applitools)', 396 | package: 'netlify-plugin-visual-diff', 397 | repo: 'https://github.com/applitools/netlify-plugin-visual-diff', 398 | version: '5.0.0', 399 | }, 400 | { 401 | author: 'pizzafox', 402 | description: 'This plugin is deprecated. The functionality is now built in', 403 | name: 'Next.js cache', 404 | package: 'netlify-plugin-cache-nextjs', 405 | repo: 'https://github.com/pizzafox/netlify-cache-nextjs', 406 | version: '1.4.0', 407 | status: 'DEACTIVATED', 408 | }, 409 | { 410 | author: 'netlify-labs', 411 | description: 'Automatically generate a sitemap for your site on PostBuild in Netlify', 412 | name: 'Sitemap', 413 | package: '@netlify/plugin-sitemap', 414 | repo: 'https://github.com/netlify-labs/netlify-plugin-sitemap', 415 | version: '0.8.1', 416 | }, 417 | ] 418 | 419 | t.deepEqual(actual, expected) 420 | }) 421 | 422 | test('should update metadata variables', (t) => { 423 | const changes = { 424 | metadata: { 425 | variables: [ 426 | { 427 | name: 'FOO', 428 | description: 'A foo variable', 429 | }, 430 | ], 431 | }, 432 | description: 'Require visual changes on production to be manually approved before going live!', 433 | netlifyVerified: false, 434 | packageName: 'netlify-plugin-visual-diff', 435 | repoUrl: 'https://github.com/applitools/netlify-plugin-visual-diff', 436 | status: 'active', 437 | title: 'Visual diff (Applitools)', 438 | version: '5.0.0', 439 | } 440 | const plugins = [ 441 | { 442 | author: 'applitools', 443 | description: 'Require visual changes on production to be manually approved before going live!', 444 | name: 'Visual diff (Applitools)', 445 | package: 'netlify-plugin-visual-diff', 446 | repo: 'https://github.com/applitools/netlify-plugin-visual-diff', 447 | version: '5.0.0', 448 | }, 449 | { 450 | author: 'pizzafox', 451 | description: 'This plugin is deprecated. The functionality is now built in', 452 | name: 'Next.js cache', 453 | package: 'netlify-plugin-cache-nextjs', 454 | repo: 'https://github.com/pizzafox/netlify-cache-nextjs', 455 | version: '1.4.0', 456 | status: 'DEACTIVATED', 457 | }, 458 | { 459 | author: 'netlify-labs', 460 | description: 'Automatically generate a sitemap for your site on PostBuild in Netlify', 461 | name: 'Sitemap', 462 | package: '@netlify/plugin-sitemap', 463 | repo: 'https://github.com/netlify-labs/netlify-plugin-sitemap', 464 | version: '0.8.1', 465 | }, 466 | ] 467 | const actual = updatePlugins(changes, plugins) 468 | const expected = [ 469 | { 470 | author: 'applitools', 471 | variables: [ 472 | { 473 | name: 'FOO', 474 | description: 'A foo variable', 475 | }, 476 | ], 477 | description: 'Require visual changes on production to be manually approved before going live!', 478 | name: 'Visual diff (Applitools)', 479 | package: 'netlify-plugin-visual-diff', 480 | repo: 'https://github.com/applitools/netlify-plugin-visual-diff', 481 | version: '5.0.0', 482 | }, 483 | { 484 | author: 'pizzafox', 485 | description: 'This plugin is deprecated. The functionality is now built in', 486 | name: 'Next.js cache', 487 | package: 'netlify-plugin-cache-nextjs', 488 | repo: 'https://github.com/pizzafox/netlify-cache-nextjs', 489 | version: '1.4.0', 490 | status: 'DEACTIVATED', 491 | }, 492 | { 493 | author: 'netlify-labs', 494 | description: 'Automatically generate a sitemap for your site on PostBuild in Netlify', 495 | name: 'Sitemap', 496 | package: '@netlify/plugin-sitemap', 497 | repo: 'https://github.com/netlify-labs/netlify-plugin-sitemap', 498 | version: '0.8.1', 499 | }, 500 | ] 501 | 502 | t.deepEqual(actual, expected) 503 | }) 504 | 505 | test('should mark status as DEACTIVATED', (t) => { 506 | const changes = { 507 | compatibility: null, 508 | description: 'Require visual changes on production to be manually approved before going live!', 509 | netlifyVerified: false, 510 | packageName: 'netlify-plugin-visual-diff', 511 | repoUrl: 'https://github.com/applitools/netlify-plugin-visual-diff', 512 | status: 'deactivated', 513 | title: 'Visual diff (Applitools)', 514 | version: '5.0.0', 515 | } 516 | const plugins = [ 517 | { 518 | author: 'applitools', 519 | description: 'Require visual changes on production to be manually approved before going live!', 520 | name: 'Visual diff (Applitools)', 521 | package: 'netlify-plugin-visual-diff', 522 | repo: 'https://github.com/applitools/netlify-plugin-visual-diff', 523 | version: '5.0.0', 524 | status: 'DEACTIVATED', 525 | }, 526 | { 527 | author: 'pizzafox', 528 | description: 'This plugin is deprecated. The functionality is now built in', 529 | name: 'Next.js cache', 530 | package: 'netlify-plugin-cache-nextjs', 531 | repo: 'https://github.com/pizzafox/netlify-cache-nextjs', 532 | version: '1.4.0', 533 | status: 'DEACTIVATED', 534 | }, 535 | { 536 | author: 'netlify-labs', 537 | description: 'Automatically generate a sitemap for your site on PostBuild in Netlify', 538 | name: 'Sitemap', 539 | package: '@netlify/plugin-sitemap', 540 | repo: 'https://github.com/netlify-labs/netlify-plugin-sitemap', 541 | version: '0.8.1', 542 | }, 543 | ] 544 | const actual = updatePlugins(changes, plugins) 545 | const expected = [ 546 | { 547 | author: 'applitools', 548 | description: 'Require visual changes on production to be manually approved before going live!', 549 | name: 'Visual diff (Applitools)', 550 | package: 'netlify-plugin-visual-diff', 551 | repo: 'https://github.com/applitools/netlify-plugin-visual-diff', 552 | version: '5.0.0', 553 | status: 'DEACTIVATED', 554 | }, 555 | { 556 | author: 'pizzafox', 557 | description: 'This plugin is deprecated. The functionality is now built in', 558 | name: 'Next.js cache', 559 | package: 'netlify-plugin-cache-nextjs', 560 | repo: 'https://github.com/pizzafox/netlify-cache-nextjs', 561 | version: '1.4.0', 562 | status: 'DEACTIVATED', 563 | }, 564 | { 565 | author: 'netlify-labs', 566 | description: 'Automatically generate a sitemap for your site on PostBuild in Netlify', 567 | name: 'Sitemap', 568 | package: '@netlify/plugin-sitemap', 569 | repo: 'https://github.com/netlify-labs/netlify-plugin-sitemap', 570 | version: '0.8.1', 571 | }, 572 | ] 573 | 574 | t.deepEqual(actual, expected) 575 | }) 576 | 577 | /* eslint-enable max-lines */ 578 | -------------------------------------------------------------------------------- /test/main.js: -------------------------------------------------------------------------------- 1 | /* eslint-disable max-lines */ 2 | import test from 'ava' 3 | import got from 'got' 4 | import isPlainObj from 'is-plain-obj' 5 | import normalizeNodeVersion from 'normalize-node-version' 6 | import pacote from 'pacote' 7 | import semver from 'semver' 8 | import { upperCaseFirst } from 'upper-case-first' 9 | 10 | import { pluginsList, pluginsUrl } from '../index.js' 11 | 12 | const { manifest } = pacote 13 | const { valid: validVersion, validRange, lt: ltVersion, major, minor, patch, minVersion } = semver 14 | 15 | const STRING_ATTRIBUTES = ['author', 'description', 'name', 'package', 'repo', 'status', 'version', 'docs'] 16 | const OPTIONAL_ATTRIBUTES = new Set(['status', 'compatibility', 'variables', 'workflow', 'docs']) 17 | const ATTRIBUTES = new Set([...STRING_ATTRIBUTES, 'compatibility', 'variables', 'workflow']) 18 | const ENUMS = { 19 | status: ['DEACTIVATED', undefined], 20 | } 21 | 22 | const COMPATIBILITY_ATTRIBUTES = new Set([ 23 | 'version', 24 | 'migrationGuide', 25 | 'featureFlag', 26 | 'nodeVersion', 27 | 'siteDependencies', 28 | 'overridePinnedVersion', 29 | ]) 30 | 31 | // Compare two versions by their major versions. 32 | // Takes into account the special rules for `0.*.*` and `0.0.*` versions. 33 | // According to semver, the second number is the major release number for 34 | // `0.*.*` versions and the third for `0.0.*`. This is how `^` behaves with the 35 | // `semver` module which is used by `npm`. 36 | const isPreviousMajor = function (versionA, versionB) { 37 | return ltVersion(getMajor(versionA), getMajor(versionB)) 38 | } 39 | 40 | const getMajor = function (version) { 41 | return minVersion(getMajorVersion(version)).version 42 | } 43 | 44 | const getMajorVersion = function (version) { 45 | const majorVersion = major(version) 46 | if (majorVersion !== 0) { 47 | return `${majorVersion}` 48 | } 49 | 50 | const minorVersion = minor(version) 51 | if (minorVersion !== 0) { 52 | return `${majorVersion}.${minorVersion}` 53 | } 54 | 55 | const patchVersion = patch(version) 56 | return `${majorVersion}.${minorVersion}.${patchVersion}` 57 | } 58 | 59 | /* eslint-disable max-nested-callbacks */ 60 | // eslint-disable-next-line max-lines-per-function, max-statements 61 | pluginsList.forEach((plugin) => { 62 | const { package: packageName, repo, version, name, compatibility, variables, status } = plugin 63 | 64 | Object.entries(plugin).forEach(([attribute, value]) => { 65 | test(`Plugin attribute "${attribute}" should have a proper shape: ${packageName}`, (t) => { 66 | t.true(ATTRIBUTES.has(attribute)) 67 | 68 | const possibleValues = ENUMS[attribute] 69 | t.true(possibleValues === undefined || possibleValues.includes(value)) 70 | 71 | if (value === undefined && OPTIONAL_ATTRIBUTES.has(attribute)) { 72 | return 73 | } 74 | 75 | if (STRING_ATTRIBUTES.includes(attribute)) { 76 | t.is(typeof value, 'string') 77 | t.not(value.trim(), '') 78 | } 79 | }) 80 | }) 81 | 82 | test(`Plugin package should be published: ${packageName}`, async (t) => { 83 | t.is(typeof version, 'string') 84 | t.not(validVersion(version), null) 85 | await t.notThrowsAsync(manifest(`${packageName}@${version}`)) 86 | }) 87 | 88 | if (status !== 'DEACTIVATED') { 89 | test(`Plugin repository URL should be valid: ${packageName}`, async (t) => { 90 | await t.notThrowsAsync(got(repo)) 91 | }) 92 | } 93 | 94 | test(`Plugin name should not include 'plugin': ${packageName}`, (t) => { 95 | t.false(typeof name === 'string' && name.toLowerCase().includes('plugin')) 96 | }) 97 | 98 | test(`Plugin name should start with an uppercase letter: ${packageName}`, (t) => { 99 | t.true(typeof name === 'string' && name === upperCaseFirst(name)) 100 | }) 101 | 102 | if (variables) { 103 | test(`Plugin variables should be an array of objects with name and description: ${packageName}`, (t) => { 104 | t.true(Array.isArray(variables)) 105 | variables.forEach((variable) => { 106 | t.true(isPlainObj(variable)) 107 | t.true(typeof variable.name === 'string') 108 | t.true(typeof variable.description === 'string') 109 | }) 110 | }) 111 | } 112 | 113 | if (compatibility === undefined) { 114 | return 115 | } 116 | 117 | test(`Plugin compatibility should be an array of plain objects: ${packageName}`, (t) => { 118 | t.true(Array.isArray(compatibility)) 119 | t.true(compatibility.every(isPlainObj)) 120 | }) 121 | 122 | if (!Array.isArray(compatibility) || !compatibility.every(isPlainObj)) { 123 | return 124 | } 125 | 126 | test(`Plugin compatibility are sorted from highest to lowest version and with different major versions in each entry: ${packageName}`, (t) => { 127 | const filtered = compatibility.filter( 128 | (compatField) => validVersion(compatField.version) !== null && compatField.featureFlag === undefined, 129 | ) 130 | t.true( 131 | filtered.every( 132 | (compatField, index) => 133 | index === filtered.length - 1 || isPreviousMajor(filtered[index + 1].version, compatField.version), 134 | ), 135 | ) 136 | }) 137 | 138 | test(`Plugin version is the same as the first non-feature-flagged compatibility version: ${packageName}`, (t) => { 139 | const { version: compatVersion } = compatibility.find(({ featureFlag }) => featureFlag === undefined) 140 | t.is(compatVersion, version) 141 | }) 142 | 143 | compatibility.forEach((compatField, index) => { 144 | const { version: compatVersion, migrationGuide, featureFlag, nodeVersion, siteDependencies } = compatField 145 | 146 | Object.keys(compatField).forEach((compatFieldKey) => { 147 | test(`Plugin compatibility[${index}].${compatFieldKey} is a known attribute: ${packageName}`, (t) => { 148 | t.true(COMPATIBILITY_ATTRIBUTES.has(compatFieldKey)) 149 | }) 150 | }) 151 | 152 | test(`Plugin compatibility[${index}].version is valid: ${packageName}`, async (t) => { 153 | t.is(typeof compatVersion, 'string') 154 | t.not(validVersion(compatVersion), null) 155 | await t.notThrowsAsync(manifest(`${packageName}@${compatVersion}`)) 156 | }) 157 | 158 | test(`Plugin compatibility[${index}].migrationGuide is valid: ${packageName}`, async (t) => { 159 | if (migrationGuide === undefined) { 160 | t.pass() 161 | return 162 | } 163 | 164 | t.is(typeof migrationGuide, 'string') 165 | t.notThrows(() => new URL(migrationGuide)) 166 | await t.notThrowsAsync(got(migrationGuide)) 167 | }) 168 | 169 | test(`Plugin compatibility[${index}].featureFlag is valid: ${packageName}`, (t) => { 170 | if (featureFlag === undefined) { 171 | t.pass() 172 | return 173 | } 174 | 175 | t.is(typeof featureFlag, 'string') 176 | t.not(featureFlag, '') 177 | }) 178 | 179 | test(`Plugin compatibility[${index}].nodeVersion is valid: ${packageName}`, async (t) => { 180 | if (nodeVersion === undefined) { 181 | t.pass() 182 | return 183 | } 184 | 185 | t.is(typeof nodeVersion, 'string') 186 | t.not(validRange(nodeVersion), null) 187 | await t.notThrowsAsync(normalizeNodeVersion(nodeVersion)) 188 | }) 189 | 190 | test(`Plugin compatibility[${index}].siteDependencies is valid: ${packageName}`, (t) => { 191 | if (siteDependencies === undefined) { 192 | t.pass() 193 | return 194 | } 195 | 196 | t.true(isPlainObj(siteDependencies)) 197 | t.not(Object.keys(siteDependencies).length, 0) 198 | t.true( 199 | Object.values(siteDependencies).every( 200 | (dependencyVersion) => typeof dependencyVersion === 'string' && validRange(dependencyVersion) !== null, 201 | ), 202 | ) 203 | }) 204 | }) 205 | }) 206 | /* eslint-enable max-nested-callbacks */ 207 | 208 | test('Plugins URL exists', (t) => { 209 | t.true(pluginsUrl.startsWith('https://')) 210 | }) 211 | /* eslint-enable max-lines */ 212 | -------------------------------------------------------------------------------- /types/plugins.d.ts: -------------------------------------------------------------------------------- 1 | export interface SanityBuildPluginEntity { 2 | authors: [ 3 | { 4 | _id: string 5 | name: string | null 6 | }, 7 | ] 8 | compatibility?: Compatibility[] 9 | description: string 10 | packageName: string 11 | repoUrl: string 12 | title: string 13 | version: string 14 | status: 'active' | 'deactivated' 15 | } 16 | 17 | export type SanityPluginLookup = Record 18 | 19 | export type Compatibility = 20 | | { 21 | version: string 22 | migrationGuide: string 23 | } 24 | | { 25 | version: string 26 | nodeVersion: string 27 | } 28 | 29 | export type BuildPluginEntity = { 30 | author: string 31 | description: string 32 | name: string 33 | package: string 34 | repo: string 35 | version: string 36 | compatibility?: Compatibility[] 37 | status?: 'DEACTIVATED' 38 | } 39 | --------------------------------------------------------------------------------