From 12680f0b11588bd7feda1f36cbcd5f88f4219f0a Mon Sep 17 00:00:00 2001 From: Eric Jorgensen Date: Tue, 11 Jul 2023 06:32:17 -0500 Subject: [PATCH 1/4] Update Marketplace transactions screenshot to link to Contact page (#38834) Co-authored-by: Matt Pollard --- .../marketplace/marketplace-transactions.png | Bin 79661 -> 82704 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/assets/images/marketplace/marketplace-transactions.png b/assets/images/marketplace/marketplace-transactions.png index 49028f6d465d3de6c08d7f895d3b89488137db60..7cb25978752f6a5bcd23cd0dbdc3d3f5bab6f2eb 100644 GIT binary patch literal 82704 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 HNzi`*bjj!M literal 79661 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%0AN7<YV2K<&U2e{-p+F_ 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 SqKhxHL`_Lsv0VOs@P7bRQj?DW From 372a8874f076bf64ab9cb30fc5a4a84d4872c90f Mon Sep 17 00:00:00 2001 From: Konrad Pabjan <konradpabjan@github.com> Date: Tue, 11 Jul 2023 07:42:40 -0400 Subject: [PATCH 2/4] [Checks] Update documentation for checks retention (#38837) Co-authored-by: Matt Pollard <mattpollard@users.noreply.github.com> --- data/reusables/pull_requests/retention-checks-data.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/reusables/pull_requests/retention-checks-data.md b/data/reusables/pull_requests/retention-checks-data.md index 5b2127d79199..b4f16ef0673f 100644 --- a/data/reusables/pull_requests/retention-checks-data.md +++ b/data/reusables/pull_requests/retention-checks-data.md @@ -1,6 +1,6 @@ {% ifversion fpt or ghec %} -{% data variables.location.product_location %} retains check data for 400 days. After 400 days, the data is archived. +{% data variables.location.product_location %} retains checks data for 400 days. After 400 days, the data is archived. 10 days after archival, the data is permanently deleted. {% elsif ghes %} @@ -8,4 +8,4 @@ Site administrators can control the retention policy for checks data on {% data {% endif %} -For archived check data, a rollup commit status appears that represents the state of all of the checks for the commit. To merge a pull request with checks that are both required and archived, you must rerun the checks. +{% ifversion ghes < 3.10 %} For archived checks data, a rollup commit status appears that represents the state of all of the checks for the commit. {% endif %} To merge a pull request with checks that are both required and archived, you must rerun the checks. From 3e6c8c29002f0bed5157aea42d96041ddd71d55c Mon Sep 17 00:00:00 2001 From: Tim Rogers <timrogers@github.com> Date: Tue, 11 Jul 2023 12:43:01 +0100 Subject: [PATCH 3/4] [DNM] Update Bitbucket Server migration docs to align with CLI changes (#38838) Co-authored-by: Matt Pollard <mattpollard@users.noreply.github.com> --- ...ries-from-bitbucket-server-to-github-enterprise-cloud.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/content/migrations/using-github-enterprise-importer/migrating-repositories-with-github-enterprise-importer/migrating-repositories-from-bitbucket-server-to-github-enterprise-cloud.md b/content/migrations/using-github-enterprise-importer/migrating-repositories-with-github-enterprise-importer/migrating-repositories-from-bitbucket-server-to-github-enterprise-cloud.md index 34a342e31443..464b40c837af 100644 --- a/content/migrations/using-github-enterprise-importer/migrating-repositories-with-github-enterprise-importer/migrating-repositories-from-bitbucket-server-to-github-enterprise-cloud.md +++ b/content/migrations/using-github-enterprise-importer/migrating-repositories-with-github-enterprise-importer/migrating-repositories-from-bitbucket-server-to-github-enterprise-cloud.md @@ -192,6 +192,9 @@ To import your migration archive into {% data variables.product.prodname_dotcom ```shell copy gh bbs2gh migrate-repo --archive-path ARCHIVE-PATH \ --github-org DESTINATION --github-repo NEW-NAME \ + --bbs-server-url BBS-SERVER-URL \ + --bbs-project PROJECT \ + --bbs-repo CURRENT-NAME \ # Use the following option if you're using AWS S3 as your blob storage provider --aws-bucket-name AWS-BUCKET-NAME ``` @@ -200,6 +203,9 @@ gh bbs2gh migrate-repo --archive-path ARCHIVE-PATH \ {% data reusables.enterprise-migration-tool.archive-path-placeholder %} {% data reusables.enterprise-migration-tool.destination-placeholder %} {% data reusables.enterprise-migration-tool.new-name-placeholder %} +{% data reusables.enterprise-migration-tool.bbs-server-url-placeholder %} +{% data reusables.enterprise-migration-tool.project-placeholder %} +{% data reusables.enterprise-migration-tool.current-name-placeholder %} {% data reusables.enterprise-migration-tool.aws-bucket-name-placeholder %} ## Step 6: Validate your migration and check the error log From 2ec905fc77b7d98006db34936c3b1f7b049b304e Mon Sep 17 00:00:00 2001 From: Peter Bengtsson <peterbe@github.com> Date: Tue, 11 Jul 2023 07:44:52 -0400 Subject: [PATCH 4/4] trailingCommas:all on prettier (#38888) --- .../check-for-enterprise-issues-by-label.js | 6 +- .../content-changes-table-comment.js | 10 +-- .../create-enterprise-issue.js | 14 ++-- .github/actions-scripts/enable-automerge.js | 2 +- .../fr-add-docs-reviewers-requests.js | 8 +-- .../actions-scripts/lib/debug-time-taken.js | 2 +- .github/actions-scripts/lib/get-env-inputs.js | 2 +- .github/actions-scripts/projects.js | 10 +-- .../purge-fastly-edge-cache-per-language.js | 4 +- .../actions-scripts/ready-for-docs-review.js | 8 +-- .../rendered-content-link-checker.js | 42 ++++++------ .prettierrc.json | 3 +- components/ClientSideHighlightJS.tsx | 4 +- components/ClientSideRefresh.tsx | 2 +- components/LinkPreviewPopover.tsx | 6 +- components/article/PlatformPicker.tsx | 4 +- components/article/ToolPicker.tsx | 4 +- components/context/ArticleContext.tsx | 2 +- components/context/MainContext.tsx | 8 +-- components/context/TocLandingContext.tsx | 2 +- components/hooks/useOnScreen.ts | 2 +- components/lib/copy-code.ts | 2 +- components/lib/scroll-anchoring.d.ts | 2 +- components/page-footer/LegalFooter.tsx | 2 +- components/page-footer/SupportSection.tsx | 6 +- components/page-header/Breadcrumbs.tsx | 2 +- components/page-header/Header.tsx | 8 +-- .../page-header/HeaderNotifications.tsx | 2 +- components/page-header/VersionPicker.tsx | 2 +- components/release-notes/GHAEReleaseNotes.tsx | 2 +- components/release-notes/GHESReleaseNotes.tsx | 2 +- components/release-notes/PatchNotes.tsx | 2 +- components/sidebar/SidebarNav.tsx | 2 +- components/ui/Callout/Callout.tsx | 2 +- components/ui/Picker/Fields.tsx | 2 +- components/ui/ScrollButton/ScrollButton.tsx | 4 +- lib/all-versions.js | 4 +- lib/check-node-version.js | 2 +- lib/create-tree.js | 8 +-- lib/enterprise-server-releases.js | 8 +-- lib/get-applicable-versions.js | 8 +-- lib/get-english-headings.js | 4 +- lib/get-mini-toc-items.js | 2 +- lib/get-product-groups.js | 6 +- lib/non-enterprise-default-version.js | 2 +- lib/page-data.js | 30 ++++---- lib/page.js | 16 ++--- lib/path-utils.js | 2 +- lib/permalink.js | 2 +- lib/read-json-file.js | 2 +- lib/redirects/permalinks.js | 2 +- lib/redirects/precompile.js | 2 +- lib/release-notes-utils.js | 10 +-- lib/update-internal-links.js | 2 +- middleware/api/index.js | 2 +- .../archived-enterprise-versions-assets.js | 2 +- middleware/archived-enterprise-versions.js | 4 +- middleware/cache-control.js | 4 +- middleware/categories-for-support.js | 4 +- middleware/context.js | 2 +- middleware/contextualizers/breadcrumbs.js | 2 +- .../contextualizers/current-product-tree.js | 16 ++--- middleware/contextualizers/features.js | 4 +- middleware/contextualizers/generic-toc.js | 4 +- .../contextualizers/get-release-notes.js | 8 +-- .../contextualizers/ghae-release-notes.js | 4 +- .../contextualizers/ghes-release-notes.js | 6 +- middleware/contextualizers/glossaries.js | 6 +- .../contextualizers/product-examples.js | 4 +- middleware/contextualizers/secret-scanning.js | 2 +- .../contextualizers/whats-new-changelog.js | 2 +- middleware/find-page.js | 4 +- middleware/get-remote-json.js | 2 +- middleware/helmet.js | 2 +- middleware/index.js | 16 ++--- .../redirects/language-code-redirects.js | 2 +- middleware/reload-tree.js | 2 +- middleware/render-page.js | 2 +- middleware/set-fastly-surrogate-key.js | 4 +- pages/[versionId]/admin/release-notes.tsx | 6 +- pages/_app.tsx | 2 +- pages/_error.tsx | 8 +-- script/accessibility-checks.js | 10 +-- script/actions/find-unicorn-action-shas.js | 6 +- script/anonymize-branch.js | 4 +- script/check-github-github-links.js | 12 ++-- .../content-migrations/add-ghec-to-schema.js | 4 +- .../content-migrations/comment-on-open-prs.js | 2 +- .../content-migrations/use-short-versions.js | 8 +-- script/copy-fixture-data.js | 4 +- script/deployment/purge-edge-cache.js | 2 +- script/dev-toc/generate.js | 2 +- script/find-orphaned-assets.js | 20 +++--- script/helpers/get-liquid-conditionals.js | 4 +- script/helpers/git-utils.js | 4 +- script/helpers/retry-on-error-test.js | 2 +- script/i18n/test-html-pages.js | 2 +- script/list-image-sizes.js | 2 +- script/move-category-to-product.js | 8 +-- script/move-content.js | 24 +++---- script/prevent-pushes-to-main.js | 4 +- script/purge-fastly-by-url.js | 8 +-- script/reconcile-category-dirs-with-ids.js | 8 +-- script/reconcile-filenames-with-ids.js | 2 +- script/rendered-content-link-checker.js | 24 +++---- script/standardize-frontmatter-order.js | 2 +- script/start-server-for-jest.js | 2 +- script/toggle-ghae-feature-flags.js | 22 +++--- script/update-internal-links.js | 16 ++--- script/update-readme.js | 2 +- script/update-tocs.js | 2 +- script/validate-asset-images.js | 4 +- script/warmup-remotejson.js | 6 +- .../components/AutomatedPageContext.tsx | 2 +- .../parameter-table/ParameterRow.tsx | 2 +- .../lib/update-markdown.js | 20 +++--- .../tests/frontmatter-versions.js | 6 +- src/automated-pipelines/tests/rendering.js | 2 +- .../tests/update-markdown.js | 12 ++-- .../scripts/convert-markdown-for-docs.js | 8 +-- src/codeql-cli/scripts/sync.js | 4 +- .../image-alt-text-end-punctuation.js | 2 +- .../linting-rules/image-alt-text-length.js | 2 +- .../lib/linting-rules/image-file-kebab.js | 2 +- .../lib/linting-rules/internal-links-lang.js | 2 +- .../lib/linting-rules/internal-links-slash.js | 2 +- src/content-linter/tests/category-pages.js | 12 ++-- .../tests/lint-code-languages.js | 2 +- src/content-linter/tests/lint-files.js | 54 +++++++-------- src/content-linter/tests/lint-versioning.js | 10 +-- .../tests/liquid-line-breaks.js | 6 +- .../tests/site-data-references.js | 10 +-- src/content-render/liquid/error-handling.js | 2 +- src/content-render/liquid/ifversion.js | 2 +- src/content-render/liquid/post.js | 2 +- src/content-render/tests/data.js | 2 +- src/content-render/tests/liquid.js | 10 +-- src/content-render/tests/octicon.js | 4 +- src/content-render/tests/render-content.js | 12 ++-- src/content-render/unified/annotate.js | 18 ++--- src/content-render/unified/code-header.js | 4 +- .../unified/parse-info-string.js | 2 +- .../unified/rewrite-asset-urls.js | 2 +- .../unified/rewrite-for-rowheaders.js | 2 +- .../unified/rewrite-local-links.js | 4 +- .../middleware/early-access-links.js | 4 +- .../scripts/migrate-early-access-product.js | 14 ++-- .../scripts/symlink-from-local-repo.js | 8 +-- .../scripts/update-data-and-image-paths.js | 8 +-- .../scripts/what-docs-early-access-branch.js | 2 +- src/events/components/Survey.tsx | 6 +- src/events/components/events.ts | 2 +- src/events/lib/hydro.js | 4 +- src/events/lib/middleware-errors.js | 2 +- src/events/lib/schema.js | 2 +- src/events/middleware.js | 4 +- src/events/tests/hydro.js | 2 +- src/ghes-releases/scripts/archive-version.js | 20 +++--- .../scripts/get-version-blocks.js | 3 +- src/ghes-releases/scripts/release-banner.js | 4 +- .../scripts/remove-deprecated-frontmatter.js | 4 +- .../scripts/remove-liquid-statements.js | 8 +-- .../scripts/remove-static-files.js | 2 +- .../scripts/remove-version-markup.js | 8 +-- .../scripts/sync-automated-pipeline-data.js | 12 ++-- .../scripts/update-enterprise-dates.js | 4 +- .../tests/remove-liquid-statements.js | 16 ++--- src/github-apps/components/EnabledList.tsx | 2 +- .../components/PermissionsList.tsx | 2 +- src/github-apps/scripts/sync.js | 22 +++--- src/github-apps/tests/rendering.js | 8 +-- src/graphql/components/GraphqlPage.tsx | 16 ++--- src/graphql/components/Interface.tsx | 2 +- src/graphql/components/Query.tsx | 2 +- src/graphql/components/Table.tsx | 2 +- src/graphql/lib/index.js | 12 ++-- src/graphql/pages/breaking-changes.tsx | 2 +- src/graphql/scripts/build-changelog.js | 13 ++-- src/graphql/scripts/sync.js | 12 ++-- src/graphql/scripts/utils/process-previews.js | 2 +- src/graphql/scripts/utils/process-schemas.js | 68 +++++++++---------- src/graphql/scripts/utils/schema-helpers.js | 2 +- src/graphql/tests/build-changelog.js | 4 +- src/graphql/tests/get-schema-files.js | 2 +- src/graphql/tests/validate-schema.js | 2 +- src/landings/components/ArticleCards.tsx | 2 +- .../components/ProductGuidesContext.tsx | 2 +- .../components/ProductLandingContext.tsx | 8 +-- src/landings/components/ProductReleases.tsx | 2 +- src/landings/components/SidebarProduct.tsx | 4 +- src/landings/components/TableOfContents.tsx | 2 +- src/landings/middleware/featured-links.js | 4 +- src/landings/pages/home.tsx | 2 +- src/landings/tests/curated-homepage-links.js | 4 +- src/landings/tests/featured-links.js | 12 ++-- src/learning-track/lib/get-link-data.js | 2 +- .../lib/process-learning-tracks.js | 8 +-- src/observability/lib/failbot.js | 2 +- src/observability/lib/handle-exceptions.js | 2 +- src/observability/lib/statsd.js | 2 +- .../tests/repository-references.js | 4 +- src/pageinfo/middleware.js | 4 +- src/pageinfo/tests/pageinfo.js | 6 +- src/rest/api/anchor-redirect.js | 2 +- src/rest/components/ClientSideRedirects.tsx | 2 +- src/rest/components/RestBanner.tsx | 4 +- src/rest/components/RestCodeSamples.tsx | 6 +- .../components/RestCollapsibleSection.tsx | 2 +- src/rest/components/RestOperation.tsx | 10 +-- src/rest/components/get-rest-code-samples.ts | 4 +- src/rest/components/useClipboard.ts | 2 +- src/rest/docs.js | 16 +++-- src/rest/lib/index.js | 2 +- src/rest/pages/category.tsx | 6 +- src/rest/pages/subcategory.tsx | 2 +- src/rest/scripts/openapi-check.js | 4 +- src/rest/scripts/test-open-api-schema.js | 6 +- src/rest/scripts/update-files.js | 20 +++--- src/rest/scripts/utils/get-body-params.js | 6 +- src/rest/scripts/utils/get-openapi-schemas.js | 8 +-- src/rest/scripts/utils/get-operations.js | 5 +- src/rest/scripts/utils/operation.js | 10 +-- src/rest/scripts/utils/sync.js | 12 ++-- src/rest/scripts/utils/update-markdown.js | 2 +- src/rest/tests/api.js | 2 +- src/rest/tests/create-rest-examples.js | 2 +- src/rest/tests/get-schema-files.js | 2 +- src/rest/tests/openapi-schema.js | 6 +- src/rest/tests/rendering.js | 4 +- src/search/components/useMediaQuery.ts | 2 +- src/search/components/usePage.ts | 2 +- src/search/lib/versions.js | 2 +- src/search/middleware/es-search.js | 10 +-- src/search/middleware/search.js | 2 +- src/search/scripts/analyze-text.js | 6 +- src/search/scripts/build-records.js | 4 +- src/search/scripts/index-elasticsearch.js | 22 +++--- src/search/scripts/sync-search-indices.js | 16 ++--- src/search/scripts/sync.js | 10 +-- src/search/scripts/validate-records.js | 4 +- src/search/tests/api-search.js | 2 +- .../tests/parse-page-sections-into-records.js | 10 +-- src/search/tests/rendering.js | 2 +- src/shielding/tests/shielding.js | 4 +- src/webhooks/components/Webhook.tsx | 8 +-- src/webhooks/lib/index.js | 4 +- src/webhooks/middleware/webhooks.js | 2 +- .../pages/webhook-events-and-payloads.tsx | 2 +- src/webhooks/scripts/sync.js | 8 +-- src/webhooks/scripts/webhook.js | 4 +- src/webhooks/tests/get-schema-files.js | 4 +- src/webhooks/tests/rendering.js | 4 +- start-server.js | 2 +- tests/content/redirect-orphans.js | 6 +- tests/content/secure-files.js | 4 +- tests/content/site-tree.js | 4 +- tests/helpers/caching-headers.js | 2 +- tests/helpers/e2etest.js | 6 +- tests/rendering-fixtures/breadcrumbs.js | 2 +- .../categories-and-map-topic.js | 2 +- tests/rendering-fixtures/footer.js | 6 +- tests/rendering-fixtures/guides.js | 4 +- tests/rendering-fixtures/internal-links.js | 10 +-- tests/rendering-fixtures/liquid.js | 2 +- tests/rendering-fixtures/page-titles.js | 2 +- .../playwright-rendering.spec.ts | 12 ++-- tests/rendering-fixtures/sidebar.js | 6 +- tests/rendering-fixtures/versioning.js | 4 +- tests/rendering-fixtures/video-transcripts.js | 2 +- tests/rendering/block-robots.js | 2 +- tests/rendering/manifest.js | 2 +- tests/rendering/release-notes.js | 2 +- tests/rendering/robots-txt.js | 2 +- tests/rendering/server.js | 40 +++++------ .../routing/deprecated-enterprise-versions.js | 14 ++-- tests/routing/developer-site-redirects.js | 6 +- tests/routing/redirect-exceptions.js | 2 +- tests/routing/redirects.js | 22 +++--- tests/routing/release-notes.js | 4 +- tests/routing/versionless-redirects.js | 2 +- tests/translations/frame.js | 6 +- tests/unit/get-applicable-versions.js | 2 +- tests/unit/get-data.js | 4 +- tests/unit/get-redirect.js | 20 +++--- tests/unit/get-rss-feeds.js | 4 +- tests/unit/page.js | 36 +++++----- tests/unit/pages.js | 6 +- tests/unit/permalink.js | 10 +-- tests/unit/static-assets.js | 2 +- tests/unit/toc-links.js | 2 +- 290 files changed, 908 insertions(+), 898 deletions(-) diff --git a/.github/actions-scripts/check-for-enterprise-issues-by-label.js b/.github/actions-scripts/check-for-enterprise-issues-by-label.js index 6cf651480368..4c9ba8475c30 100755 --- a/.github/actions-scripts/check-for-enterprise-issues-by-label.js +++ b/.github/actions-scripts/check-for-enterprise-issues-by-label.js @@ -13,10 +13,10 @@ async function run() { const queryRelease = encodeURIComponent('is:open repo:github/docs-content is:issue') const deprecationIssues = await octokit.request( - `GET /search/issues?q=${queryDeprecation}+label:"${encodeURI(ENTERPRISE_DEPRECATION_LABEL)}"` + `GET /search/issues?q=${queryDeprecation}+label:"${encodeURI(ENTERPRISE_DEPRECATION_LABEL)}"`, ) const releaseIssues = await octokit.request( - `GET /search/issues?q=${queryRelease}+label:"${encodeURI(ENTERPRISE_RELEASE_LABEL)}"` + `GET /search/issues?q=${queryRelease}+label:"${encodeURI(ENTERPRISE_RELEASE_LABEL)}"`, ) const isDeprecationIssue = deprecationIssues.data.items.length === 0 ? 'false' : 'true' const isReleaseIssue = releaseIssues.data.items.length === 0 ? 'false' : 'true' @@ -32,5 +32,5 @@ run().then( (error) => { console.log(`#ERROR# ${error}`) process.exit(1) - } + }, ) diff --git a/.github/actions-scripts/content-changes-table-comment.js b/.github/actions-scripts/content-changes-table-comment.js index 920c1dca9ff1..1648f934d569 100755 --- a/.github/actions-scripts/content-changes-table-comment.js +++ b/.github/actions-scripts/content-changes-table-comment.js @@ -63,7 +63,7 @@ async function main(owner, repo, baseSHA, headSHA) { const pathPrefix = 'content/' const articleFiles = files.filter( - ({ filename }) => filename.startsWith(pathPrefix) && filename.toLowerCase() !== 'readme.md' + ({ filename }) => filename.startsWith(pathPrefix) && filename.toLowerCase() !== 'readme.md', ) const lines = await Promise.all( @@ -82,7 +82,7 @@ async function main(owner, repo, baseSHA, headSHA) { // So, to be able to get necessary meta data about what it *was*, // if it was removed, fall back to the 'base'. file.status === 'removed' ? baseSHA : headSHA, - file.filename + file.filename, ) // parse the frontmatter @@ -108,7 +108,7 @@ async function main(owner, repo, baseSHA, headSHA) { // walk by the plan names since we generate links differently for most plans const versions = fileVersions.filter((fileVersion) => - fileVersion.includes(allVersionShortnames[plan]) + fileVersion.includes(allVersionShortnames[plan]), ) if (versions.length === 1) { @@ -141,7 +141,7 @@ async function main(owner, repo, baseSHA, headSHA) { } } catch (e) { console.error( - `Version information for ${file.filename} couldn't be determined from its frontmatter.` + `Version information for ${file.filename} couldn't be determined from its frontmatter.`, ) } let note = '' @@ -153,7 +153,7 @@ async function main(owner, repo, baseSHA, headSHA) { } return `| ${contentCell} | ${previewCell} | ${prodCell} | ${note} |` - }) + }), ) // this section limits the size of the comment diff --git a/.github/actions-scripts/create-enterprise-issue.js b/.github/actions-scripts/create-enterprise-issue.js index 07b94935370b..36e71d6a326e 100755 --- a/.github/actions-scripts/create-enterprise-issue.js +++ b/.github/actions-scripts/create-enterprise-issue.js @@ -5,7 +5,7 @@ import path from 'path' import { getOctokit } from '@actions/github' import { latest, oldestSupported } from '../../lib/enterprise-server-releases.js' const enterpriseDates = JSON.parse( - await fs.readFile(path.join(process.cwd(), 'src/ghes-releases/lib/enterprise-dates.json')) + await fs.readFile(path.join(process.cwd(), 'src/ghes-releases/lib/enterprise-dates.json')), ) const acceptedMilestones = ['release', 'deprecation'] @@ -54,7 +54,7 @@ async function run() { if (!versionNumber) { console.log( - `Could not find the next version number after ${latest} in enterprise-dates.json. Try running src/ghes-releases/scripts/update-enterprise-dates.js, then rerun this script.` + `Could not find the next version number after ${latest} in enterprise-dates.json. Try running src/ghes-releases/scripts/update-enterprise-dates.js, then rerun this script.`, ) process.exit(0) } @@ -63,7 +63,7 @@ async function run() { if (!datesForVersion) { console.log( - `Could not find ${versionNumber} in enterprise-dates.json. Try running src/ghes-releases/scripts/update-enterprise-dates.js, then rerun this script.` + `Could not find ${versionNumber} in enterprise-dates.json. Try running src/ghes-releases/scripts/update-enterprise-dates.js, then rerun this script.`, ) process.exit(0) } @@ -74,14 +74,14 @@ async function run() { // If the milestone is more than the specific days away, exit now. if (daysUntilMilestone > numberOfdaysBeforeMilestoneToOpenIssue) { console.log( - `The ${versionNumber} ${milestone} is not until ${nextMilestoneDate}! An issue will be opened when it is ${numberOfdaysBeforeMilestoneToOpenIssue} days away.` + `The ${versionNumber} ${milestone} is not until ${nextMilestoneDate}! An issue will be opened when it is ${numberOfdaysBeforeMilestoneToOpenIssue} days away.`, ) process.exit(0) } const milestoneSteps = await fs.readFile( path.join(process.cwd(), `src/ghes-releases/lib/${milestone}-steps.md`), - 'utf8' + 'utf8', ) const issueLabels = milestone === 'release' @@ -109,7 +109,7 @@ async function run() { if (issue.status === 201) { // Write the values to disk for use in the workflow. console.log( - `Issue #${issue.data.number} for the ${versionNumber} ${milestone} was opened: ${issue.data.html_url}` + `Issue #${issue.data.number} for the ${versionNumber} ${milestone} was opened: ${issue.data.html_url}`, ) } } catch (error) { @@ -137,7 +137,7 @@ async function run() { if (addCard.status === 201) { // Write the values to disk for use in the workflow. console.log( - `The issue #${issue.data.number} was added to https://github.com/orgs/github/projects/1773#column-12198119.` + `The issue #${issue.data.number} was added to https://github.com/orgs/github/projects/1773#column-12198119.`, ) } } catch (error) { diff --git a/.github/actions-scripts/enable-automerge.js b/.github/actions-scripts/enable-automerge.js index cb4f02f782cd..0005e031d545 100644 --- a/.github/actions-scripts/enable-automerge.js +++ b/.github/actions-scripts/enable-automerge.js @@ -42,7 +42,7 @@ async function main() { if (graph.errors && graph.errors.length > 0) { console.error( 'ERROR! Failed to enable auto-merge:\n - ' + - graph.errors.map((error) => error.message).join('\n - ') + graph.errors.map((error) => error.message).join('\n - '), ) } else { console.log('Auto-merge enabled!') diff --git a/.github/actions-scripts/fr-add-docs-reviewers-requests.js b/.github/actions-scripts/fr-add-docs-reviewers-requests.js index ec31eaf529d1..2e5505093968 100644 --- a/.github/actions-scripts/fr-add-docs-reviewers-requests.js +++ b/.github/actions-scripts/fr-add-docs-reviewers-requests.js @@ -59,7 +59,7 @@ async function getAllOpenPRs() { headers: { authorization: `token ${process.env.TOKEN}`, }, - } + }, ) prsRemaining = data.repository.pullRequests.pageInfo.hasPreviousPage @@ -84,11 +84,11 @@ async function run() { !pr.isDraft && !pr.labels.nodes.find((label) => label.name === 'Deploy train 🚂') && pr.reviewRequests.nodes.find( - (requestedReviewers) => requestedReviewers.requestedReviewer?.name === process.env.REVIEWER + (requestedReviewers) => requestedReviewers.requestedReviewer?.name === process.env.REVIEWER, ) && !pr.reviews.nodes .flatMap((review) => review.onBehalfOf.nodes) - .find((behalf) => behalf.name === process.env.REVIEWER) + .find((behalf) => behalf.name === process.env.REVIEWER), ) if (prs.length === 0) { console.log('No PRs found. Exiting.') @@ -137,7 +137,7 @@ async function run() { headers: { authorization: `token ${process.env.TOKEN}`, }, - } + }, ) // Get the project ID diff --git a/.github/actions-scripts/lib/debug-time-taken.js b/.github/actions-scripts/lib/debug-time-taken.js index bfd484ea1fe7..a3cf69daceb1 100644 --- a/.github/actions-scripts/lib/debug-time-taken.js +++ b/.github/actions-scripts/lib/debug-time-taken.js @@ -14,7 +14,7 @@ export function debugTimeStart(core, instanceName) { export function debugTimeEnd(core, instanceName) { if (!timeInstances.has(instanceName)) { core.warn( - `Invalid instanceName: ${instanceName} in debugTimeEnd. Did you call debugTimeStart first with the same instanceName?` + `Invalid instanceName: ${instanceName} in debugTimeEnd. Did you call debugTimeStart first with the same instanceName?`, ) return } diff --git a/.github/actions-scripts/lib/get-env-inputs.js b/.github/actions-scripts/lib/get-env-inputs.js index df1558d8fc04..5d6779bb9704 100644 --- a/.github/actions-scripts/lib/get-env-inputs.js +++ b/.github/actions-scripts/lib/get-env-inputs.js @@ -13,7 +13,7 @@ export function getEnvInputs(options) { throw new Error(`You must supply a ${envVarName} environment variable`) } return [envVarName, envVarValue] - }) + }), ) } diff --git a/.github/actions-scripts/projects.js b/.github/actions-scripts/projects.js index 87887363c7a0..6c4fc785a9fa 100644 --- a/.github/actions-scripts/projects.js +++ b/.github/actions-scripts/projects.js @@ -26,7 +26,7 @@ export function findSingleSelectID(singleSelectName, fieldName, data) { return singleSelect.id } else { throw new Error( - `A single select called "${singleSelectName}" for the field "${fieldName}" was not found. Check if the single select was renamed.` + `A single select called "${singleSelectName}" for the field "${fieldName}" was not found. Check if the single select was renamed.`, ) } } @@ -47,7 +47,7 @@ export async function addItemsToProject(items, project) { id } } - ` + `, ) const mutation = ` @@ -102,7 +102,7 @@ export async function isDocsTeamMember(login) { headers: { authorization: `token ${process.env.TOKEN}`, }, - } + }, ) const teamMembers = data.organization.team.members.nodes.map((entry) => entry.login) @@ -127,7 +127,7 @@ export async function isGitHubOrgMember(login) { headers: { authorization: `token ${process.env.TOKEN}`, }, - } + }, ) return Boolean(data.user.organization) @@ -188,7 +188,7 @@ export function generateUpdateProjectV2ItemFieldMutation({ return ` set_${fieldID.slice(1)}_item_${item.replaceAll( /[^a-z0-9]/g, - '' + '', )}: updateProjectV2ItemFieldValue(input: { projectId: $project itemId: "${item}" diff --git a/.github/actions-scripts/purge-fastly-edge-cache-per-language.js b/.github/actions-scripts/purge-fastly-edge-cache-per-language.js index 6f540b468fa9..655180b0b6fe 100755 --- a/.github/actions-scripts/purge-fastly-edge-cache-per-language.js +++ b/.github/actions-scripts/purge-fastly-edge-cache-per-language.js @@ -36,7 +36,7 @@ const languages = process.env.LANGUAGES for (const language of languages) { console.log( - `Sleeping ${DELAY_BETWEEN_LANGUAGES / 1000} seconds before purging for '${language}'...` + `Sleeping ${DELAY_BETWEEN_LANGUAGES / 1000} seconds before purging for '${language}'...`, ) await sleep(DELAY_BETWEEN_LANGUAGES) await purgeEdgeCache(makeLanguageSurrogateKey(language)) @@ -49,7 +49,7 @@ function languagesFromString(str) { .filter(Boolean) if (!languages.every((lang) => languageKeys.includes(lang))) { throw new Error( - `Unrecognized language code (${languages.find((lang) => !languageKeys.includes(lang))})` + `Unrecognized language code (${languages.find((lang) => !languageKeys.includes(lang))})`, ) } return languages diff --git a/.github/actions-scripts/ready-for-docs-review.js b/.github/actions-scripts/ready-for-docs-review.js index 4bfb7b1dfbe2..721837acd109 100644 --- a/.github/actions-scripts/ready-for-docs-review.js +++ b/.github/actions-scripts/ready-for-docs-review.js @@ -56,7 +56,7 @@ async function run() { headers: { authorization: `token ${process.env.TOKEN}`, }, - } + }, ) // Get the project ID @@ -156,17 +156,17 @@ async function run() { headers: { authorization: `token ${process.env.TOKEN}`, }, - } + }, ) const docsPRData = contributorData.user.contributionsCollection.pullRequestContributionsByRepository.filter( - (item) => item.repository.nameWithOwner === 'github/docs' + (item) => item.repository.nameWithOwner === 'github/docs', )[0] const prCount = docsPRData ? docsPRData.contributions.totalCount : 0 const docsIssueData = contributorData.user.contributionsCollection.issueContributionsByRepository.filter( - (item) => item.repository.nameWithOwner === 'github/docs' + (item) => item.repository.nameWithOwner === 'github/docs', )[0] const issueCount = docsIssueData ? docsIssueData.contributions.totalCount : 0 diff --git a/.github/actions-scripts/rendered-content-link-checker.js b/.github/actions-scripts/rendered-content-link-checker.js index 643197236eb4..586ef470b839 100755 --- a/.github/actions-scripts/rendered-content-link-checker.js +++ b/.github/actions-scripts/rendered-content-link-checker.js @@ -73,7 +73,7 @@ const linksToSkip = linksToSkipFactory(excludedLinks) const CONTENT_ROOT = path.resolve('content') const deprecatedVersionPrefixesRegex = new RegExp( - `enterprise(-server@|/)(${deprecated.join('|')})(/|$)` + `enterprise(-server@|/)(${deprecated.join('|')})(/|$)`, ) // When this file is invoked directly from action as opposed to being imported @@ -228,7 +228,7 @@ async function main(core, octokit, uploadArtifact, opts = {}) { if (checkExternalLinks && pages.length >= 100) { core.warning( - `Warning! Checking external URLs can be time costly. You're testing ${pages.length} pages.` + `Warning! Checking external URLs can be time costly. You're testing ${pages.length} pages.`, ) } @@ -238,8 +238,8 @@ async function main(core, octokit, uploadArtifact, opts = {}) { const t0 = new Date().getTime() const flawsGroups = await Promise.all( pages.map((page) => - processPage(core, page, pageMap, redirects, opts, externalLinkCheckerDB, versions) - ) + processPage(core, page, pageMap, redirects, opts, externalLinkCheckerDB, versions), + ), ) const t1 = new Date().getTime() debugTimeEnd(core, 'processPages') @@ -283,7 +283,7 @@ async function main(core, octokit, uploadArtifact, opts = {}) { core.setOutput('has_flaws_at_level', flawsInLevel.length > 0) if (failOnFlaw) { core.setFailed( - `${flaws.length + 1} broken links found. See action artifact uploads for details` + `${flaws.length + 1} broken links found. See action artifact uploads for details`, ) } } @@ -395,7 +395,7 @@ async function linkReports(core, octokit, newReport, opts) { body, }) core.info( - `Linked old report to new report via comment on old report: #${previousReport.number}.` + `Linked old report to new report via comment on old report: #${previousReport.number}.`, ) } catch (error) { core.setFailed(`Error commenting on previousReport, #${previousReport.number}`) @@ -566,7 +566,7 @@ function printGlobalCacheHitRatio(core) { `Cache hit ratio: ${hits.toLocaleString()} of ${(misses + hits).toLocaleString()} (${( (100 * hits) / (misses + hits) - ).toFixed(1)}%)` + ).toFixed(1)}%)`, ) } } @@ -619,7 +619,7 @@ async function processPage(core, page, pageMap, redirects, opts, db, versions) { }) .map((permalink) => { return processPermalink(core, permalink, page, pageMap, redirects, opts, db) - }) + }), ) const allFlaws = allFlawsEach.flat() @@ -687,7 +687,7 @@ async function processPermalink(core, permalink, page, pageMap, redirects, opts, checkExternalLinks, externalServerErrorsAsWarning, { verbose, patient }, - db + db, ) if (flaw) { @@ -704,7 +704,7 @@ async function processPermalink(core, permalink, page, pageMap, redirects, opts, globalHrefCheckCache.set(href, flaw) } } - }) + }), ) for (const flaw of newFlaws) { @@ -748,7 +748,7 @@ async function uploadJsonFlawsArtifact( uploadArtifact, flaws, { verboseUrl = null } = {}, - artifactName = 'all-rendered-link-flaws.json' + artifactName = 'all-rendered-link-flaws.json', ) { const printableFlaws = {} for (const { page, permalink, href, text, src, flaw } of flaws) { @@ -833,7 +833,7 @@ async function checkHrefLink( checkExternalLinks = false, externalServerErrorsAsWarning = false, { verbose = false, patient = false } = {}, - db = null + db = null, ) { if (href === '#') { if (checkAnchors) { @@ -883,7 +883,7 @@ async function checkHrefLink( if (pathname.split('/')[1] in STATIC_PREFIXES) { const staticFilePath = path.join( STATIC_PREFIXES[pathname.split('/')[1]], - pathname.split(path.sep).slice(2).join(path.sep) + pathname.split(path.sep).slice(2).join(path.sep), ) if (!fs.existsSync(staticFilePath)) { return { CRITICAL: `Static file not found ${staticFilePath} (${pathname})` } @@ -1045,7 +1045,7 @@ async function innerFetch(core, url, config = {}) { }) if (verbose) { core.info( - `External URL ${useGET ? 'GET' : 'HEAD'} ${url}: ${r.statusCode} (retries: ${retries})` + `External URL ${useGET ? 'GET' : 'HEAD'} ${url}: ${r.statusCode} (retries: ${retries})`, ) } @@ -1055,7 +1055,7 @@ async function innerFetch(core, url, config = {}) { if (r.statusCode === 429) { let sleepTime = Math.min( 60_000, - Math.max(10_000, getRetryAfterSleep(r.headers['retry-after'])) + Math.max(10_000, getRetryAfterSleep(r.headers['retry-after'])), ) // Sprinkle a little jitter so it doesn't all start again all // at the same time @@ -1067,8 +1067,8 @@ async function innerFetch(core, url, config = {}) { if (verbose) core.info( chalk.yellow( - `Rate limited on ${hostname} (${url}). Sleeping for ${(sleepTime / 1000).toFixed(1)}s` - ) + `Rate limited on ${hostname} (${url}). Sleeping for ${(sleepTime / 1000).toFixed(1)}s`, + ), ) await sleep(sleepTime) return innerFetch(core, url, Object.assign({}, config, { retries: retries + 1 })) @@ -1115,7 +1115,7 @@ function checkImageSrc(src, $) { if (prefix in STATIC_PREFIXES) { const staticFilePath = path.join( STATIC_PREFIXES[prefix], - pathname.split(path.sep).slice(2).join(path.sep) + pathname.split(path.sep).slice(2).join(path.sep), ) if (!fs.existsSync(staticFilePath)) { return { CRITICAL: `Static file not found (${pathname})` } @@ -1129,8 +1129,8 @@ function summarizeFlaws(core, flaws) { if (flaws.length) { core.info( chalk.bold( - `Found ${flaws.length.toLocaleString()} flaw${flaws.length === 1 ? '' : 's'} in total.` - ) + `Found ${flaws.length.toLocaleString()} flaw${flaws.length === 1 ? '' : 's'} in total.`, + ), ) } else { core.info(chalk.green('No flaws found! 💖')) @@ -1140,7 +1140,7 @@ function summarizeFlaws(core, flaws) { function summarizeCounts(core, pages, tookSeconds) { const count = pages.map((page) => page.permalinks.length).reduce((a, b) => a + b, 0) core.info( - `Tested ${count.toLocaleString()} permalinks across ${pages.length.toLocaleString()} pages` + `Tested ${count.toLocaleString()} permalinks across ${pages.length.toLocaleString()} pages`, ) core.info(`Took ${Math.floor(tookSeconds)} seconds. (~${(tookSeconds / 60).toFixed(1)} minutes)`) const permalinksPerSecond = count / tookSeconds diff --git a/.prettierrc.json b/.prettierrc.json index 83779fed66d3..6223ec288b56 100644 --- a/.prettierrc.json +++ b/.prettierrc.json @@ -11,8 +11,7 @@ "options": { "semi": false, "singleQuote": true, - "printWidth": 100, - "trailingComma": "es5" + "printWidth": 100 } } ] diff --git a/components/ClientSideHighlightJS.tsx b/components/ClientSideHighlightJS.tsx index c5b7bab28272..67a1b15d03b1 100644 --- a/components/ClientSideHighlightJS.tsx +++ b/components/ClientSideHighlightJS.tsx @@ -50,13 +50,13 @@ export default function ClientSideHighlightJS() { } }) for (const parent of Array.from( - document.querySelectorAll<HTMLElement>(CODE_ELEMENTS_PARENT_SELECTOR) + document.querySelectorAll<HTMLElement>(CODE_ELEMENTS_PARENT_SELECTOR), )) { const language = parent.dataset.highlight || 'json' if (!SUPPORTED_LANGUAGES.includes(language)) { if (process.env.NODE_ENV === 'development') { console.warn( - `For highlighting, only ${SUPPORTED_LANGUAGES} is supported. Not '${language}'.` + `For highlighting, only ${SUPPORTED_LANGUAGES} is supported. Not '${language}'.`, ) } continue diff --git a/components/ClientSideRefresh.tsx b/components/ClientSideRefresh.tsx index 156c68c8273d..a4e5838054c3 100644 --- a/components/ClientSideRefresh.tsx +++ b/components/ClientSideRefresh.tsx @@ -30,7 +30,7 @@ export default function ClientSideRefresh() { // because, naturally, the first time you mount it, it will not // need to refresh because it's as fresh as it gets already. revalidateOnMount: false, - } + }, ) return null diff --git a/components/LinkPreviewPopover.tsx b/components/LinkPreviewPopover.tsx index e4f0ca4808d3..d61ce4d75a7a 100644 --- a/components/LinkPreviewPopover.tsx +++ b/components/LinkPreviewPopover.tsx @@ -58,7 +58,7 @@ function getOrCreatePopoverGlobal() { // or 'Popover-message--top-right`. These get set later when we // know where the popover message should appear on the screen. inner.classList.add( - ...'Popover-message Popover-message--large p-3 Box color-shadow-large'.split(/\s+/g) + ...'Popover-message Popover-message--large p-3 Box color-shadow-large'.split(/\s+/g), ) inner.style.width = `360px` @@ -343,8 +343,8 @@ export function LinkPreviewPopover() { const links = Array.from( document.querySelectorAll<HTMLLinkElement>( - '#article-contents a[href], #article-intro a[href]' - ) + '#article-contents a[href], #article-intro a[href]', + ), ).filter((link) => { // This filters out links that are not internal or in-page // and the ones that are in-page anchor links next to the headings. diff --git a/components/article/PlatformPicker.tsx b/components/article/PlatformPicker.tsx index 3bed51dfcca1..24fe5acc722c 100644 --- a/components/article/PlatformPicker.tsx +++ b/components/article/PlatformPicker.tsx @@ -28,8 +28,8 @@ function showPlatformSpecificContent(platform: string) { // example: <span class="platform-mac">inline content</span> const platformEls = Array.from( document.querySelectorAll<HTMLElement>( - platforms.map((platform) => `.platform-${platform.value}`).join(', ') - ) + platforms.map((platform) => `.platform-${platform.value}`).join(', '), + ), ) platformEls.forEach((el) => { el.style.display = el.classList.contains(`platform-${platform}`) ? '' : 'none' diff --git a/components/article/ToolPicker.tsx b/components/article/ToolPicker.tsx index 171865fb8e92..cb7bbd83a430 100644 --- a/components/article/ToolPicker.tsx +++ b/components/article/ToolPicker.tsx @@ -22,7 +22,9 @@ function showToolSpecificContent(tool: string, supportedTools: Array<string>) { // find all tool-specific *inline* elements and hide or show as appropriate // example: <span class="tool-webui">inline content</span> const toolEls = Array.from( - document.querySelectorAll<HTMLElement>(supportedTools.map((tool) => `.tool-${tool}`).join(', ')) + document.querySelectorAll<HTMLElement>( + supportedTools.map((tool) => `.tool-${tool}`).join(', '), + ), ) toolEls.forEach((el) => { el.style.display = el.classList.contains(`tool-${tool}`) ? '' : 'none' diff --git a/components/context/ArticleContext.tsx b/components/context/ArticleContext.tsx index 19d53b56003f..ce387939b634 100644 --- a/components/context/ArticleContext.tsx +++ b/components/context/ArticleContext.tsx @@ -66,7 +66,7 @@ export const getArticleContextFromRequest = (req: any): ArticleContextT => { if (page.effectiveDate) { if (isNaN(Date.parse(page.effectiveDate))) { throw new Error( - 'The "effectiveDate" frontmatter property is not valid. Please make sure it is YEAR-MONTH-DAY' + 'The "effectiveDate" frontmatter property is not valid. Please make sure it is YEAR-MONTH-DAY', ) } } diff --git a/components/context/MainContext.tsx b/components/context/MainContext.tsx index f677f54fda89..77f7da678576 100644 --- a/components/context/MainContext.tsx +++ b/components/context/MainContext.tsx @@ -148,13 +148,13 @@ export const getMainContext = async (req: any, res: any): Promise<MainContextT> reusables: { enterprise_deprecation: { version_was_deprecated: req.context.getDottedData( - 'reusables.enterprise_deprecation.version_was_deprecated' + 'reusables.enterprise_deprecation.version_was_deprecated', ), version_will_be_deprecated: req.context.getDottedData( - 'reusables.enterprise_deprecation.version_will_be_deprecated' + 'reusables.enterprise_deprecation.version_will_be_deprecated', ), deprecation_details: req.context.getDottedData( - 'reusables.enterprise_deprecation.deprecation_details' + 'reusables.enterprise_deprecation.deprecation_details', ), }, policies: { @@ -179,7 +179,7 @@ export const getMainContext = async (req: any, res: any): Promise<MainContextT> topics: req.context.page.topics || [], introPlainText: req.context.page?.introPlainText, permalinks: req.context.page?.permalinks.map((obj: any) => - pick(obj, ['title', 'pageVersion', 'href', 'relativePath', 'languageCode']) + pick(obj, ['title', 'pageVersion', 'href', 'relativePath', 'languageCode']), ), hidden: req.context.page.hidden || false, noEarlyAccessBanner: req.context.page.noEarlyAccessBanner || false, diff --git a/components/context/TocLandingContext.tsx b/components/context/TocLandingContext.tsx index 349ae5b063ae..1d13923506b7 100644 --- a/components/context/TocLandingContext.tsx +++ b/components/context/TocLandingContext.tsx @@ -41,7 +41,7 @@ export const getTocLandingContextFromRequest = (req: any): TocLandingContextT => productCallout: req.context.page.product || '', intro: req.context.page.intro, tocItems: (req.context.genericTocFlat || req.context.genericTocNested || []).map((obj: any) => - pick(obj, ['fullPath', 'title', 'intro', 'childTocItems']) + pick(obj, ['fullPath', 'title', 'intro', 'childTocItems']), ), variant: req.context.genericTocFlat ? 'expanded' : 'compact', diff --git a/components/hooks/useOnScreen.ts b/components/hooks/useOnScreen.ts index 196204858d82..d5bbdab51036 100644 --- a/components/hooks/useOnScreen.ts +++ b/components/hooks/useOnScreen.ts @@ -2,7 +2,7 @@ import { useState, useEffect, MutableRefObject, RefObject } from 'react' export function useOnScreen<T extends Element>( ref: MutableRefObject<T | undefined> | RefObject<T>, - options?: IntersectionObserverInit + options?: IntersectionObserverInit, ): boolean { const [isIntersecting, setIntersecting] = useState(false) useEffect(() => { diff --git a/components/lib/copy-code.ts b/components/lib/copy-code.ts index b6a7ddefe78f..592904cca8e9 100644 --- a/components/lib/copy-code.ts +++ b/components/lib/copy-code.ts @@ -19,6 +19,6 @@ export default function copyCode() { setTimeout(() => { button.setAttribute('aria-label', beforeTooltip) }, 2000) - }) + }), ) } diff --git a/components/lib/scroll-anchoring.d.ts b/components/lib/scroll-anchoring.d.ts index c761556ec4bb..bbd6f2f00671 100644 --- a/components/lib/scroll-anchoring.d.ts +++ b/components/lib/scroll-anchoring.d.ts @@ -2,7 +2,7 @@ declare module 'scroll-anchoring' { export function findAnchorNode(document: Document): Node | undefined export function preserveAnchorNodePosition<T>( document: Document, - callback: () => Promise<T> | T + callback: () => Promise<T> | T, ): Promise<T> export function preservePosition<T>(anchorNode: Node, callback: () => Promise<T> | T): Promise<T> } diff --git a/components/page-footer/LegalFooter.tsx b/components/page-footer/LegalFooter.tsx index af682a32e0d6..c251970f3bf8 100644 --- a/components/page-footer/LegalFooter.tsx +++ b/components/page-footer/LegalFooter.tsx @@ -42,7 +42,7 @@ export const LegalFooter = () => { legacyBehavior={false} className={cx( 'text-underline', - router.locale === 'ko' && 'color-fg-attention text-bold' + router.locale === 'ko' && 'color-fg-attention text-bold', )} > {t('privacy')} diff --git a/components/page-footer/SupportSection.tsx b/components/page-footer/SupportSection.tsx index 3276c55e5216..6d873b30b949 100644 --- a/components/page-footer/SupportSection.tsx +++ b/components/page-footer/SupportSection.tsx @@ -35,7 +35,7 @@ export const SupportSection = () => { className={cx( 'float-left pr-4 mb-6 mb-xl-0 col-12', totalCols > 1 && 'col-lg-6', - totalCols > 2 && 'col-xl-3' + totalCols > 2 && 'col-xl-3', )} > <Survey /> @@ -47,7 +47,7 @@ export const SupportSection = () => { 'float-left pr-4 mb-6 mb-xl-0 col-12', totalCols > 1 && 'col-lg-6', totalCols > 2 && 'col-xl-4', - totalCols > 2 && showSurvey && 'offset-xl-1' + totalCols > 2 && showSurvey && 'offset-xl-1', )} > <Contribution /> @@ -59,7 +59,7 @@ export const SupportSection = () => { 'float-left pr-4 mb-6 mb-xl-0 col-12', totalCols > 1 && 'col-lg-6', totalCols > 2 && 'col-xl-3', - totalCols > 2 && (showSurvey || showContribution) && 'offset-xl-1' + totalCols > 2 && (showSurvey || showContribution) && 'offset-xl-1', )} > <Support /> diff --git a/components/page-header/Breadcrumbs.tsx b/components/page-header/Breadcrumbs.tsx index 14ad14e10c41..9182d14f2d0f 100644 --- a/components/page-header/Breadcrumbs.tsx +++ b/components/page-header/Breadcrumbs.tsx @@ -49,7 +49,7 @@ export const Breadcrumbs = ({ inHeader }: Props) => { 'Link--primary mr-2 color-fg-muted', // Show the last breadcrumb if it's in the header, but not if it's in the article // If there's only 1 breadcrumb, show it - !inHeader && i === arr.length - 1 && arr.length !== 1 && 'd-none' + !inHeader && i === arr.length - 1 && arr.length !== 1 && 'd-none', )} > {breadcrumb.title} diff --git a/components/page-header/Header.tsx b/components/page-header/Header.tsx index 1c8b4c9aa4b8..553180f3dfa5 100644 --- a/components/page-header/Header.tsx +++ b/components/page-header/Header.tsx @@ -126,14 +126,14 @@ export const Header = () => { <div className={cx( 'border-bottom d-unset color-border-muted no-print z-3 color-bg-default', - styles.header + styles.header, )} > {error !== '404' && <HeaderNotifications />} <header className={cx( 'color-bg-default p-2 position-sticky top-0 z-1 border-bottom', - scroll && 'color-shadow-small' + scroll && 'color-shadow-small', )} > <div @@ -167,7 +167,7 @@ export const Header = () => { isSearchOpen ? styles.searchContainerWithOpenSearch : styles.searchContainerWithClosedSearch, - 'mr-3' + 'mr-3', )} > <Search /> @@ -194,7 +194,7 @@ export const Header = () => { <IconButton className={cx( 'hide-lg hide-xl', - !isSearchOpen ? 'd-flex flex-items-center' : 'd-none' + !isSearchOpen ? 'd-flex flex-items-center' : 'd-none', )} data-testid="mobile-search-button" onClick={() => setIsSearchOpen(!isSearchOpen)} diff --git a/components/page-header/HeaderNotifications.tsx b/components/page-header/HeaderNotifications.tsx index 42c0621a1e21..7eba342c1a29 100644 --- a/components/page-header/HeaderNotifications.tsx +++ b/components/page-header/HeaderNotifications.tsx @@ -89,7 +89,7 @@ export const HeaderNotifications = () => { type === NotificationType.TRANSLATION && 'color-bg-accent', type === NotificationType.RELEASE && 'color-bg-accent', type === NotificationType.EARLY_ACCESS && 'color-bg-danger', - !isLast && 'border-bottom color-border-default' + !isLast && 'border-bottom color-border-default', )} dangerouslySetInnerHTML={{ __html: content }} /> diff --git a/components/page-header/VersionPicker.tsx b/components/page-header/VersionPicker.tsx index eafdc1e4bc50..042c820d4777 100644 --- a/components/page-header/VersionPicker.tsx +++ b/components/page-header/VersionPicker.tsx @@ -38,7 +38,7 @@ export const VersionPicker = ({ mediumOrLower }: Props) => { })) const hasEnterpriseVersions = (page.permalinks || []).some((permalink) => - permalink.pageVersion.startsWith('enterprise-server') + permalink.pageVersion.startsWith('enterprise-server'), ) allLinks.push({ diff --git a/components/release-notes/GHAEReleaseNotes.tsx b/components/release-notes/GHAEReleaseNotes.tsx index ed63e90e6121..de7c217ad246 100644 --- a/components/release-notes/GHAEReleaseNotes.tsx +++ b/components/release-notes/GHAEReleaseNotes.tsx @@ -40,7 +40,7 @@ export function GHAEReleaseNotes({ context }: GitHubAEProps) { <aside className={cx( 'position-sticky d-none d-md-block border-left no-print color-bg-default flex-shrink-0', - styles.aside + styles.aside, )} > <nav className="height-full overflow-auto"> diff --git a/components/release-notes/GHESReleaseNotes.tsx b/components/release-notes/GHESReleaseNotes.tsx index af8aa1110c6f..a7a5bd9074f9 100644 --- a/components/release-notes/GHESReleaseNotes.tsx +++ b/components/release-notes/GHESReleaseNotes.tsx @@ -52,7 +52,7 @@ export function GHESReleaseNotes({ context }: Props) { <aside className={cx( 'position-sticky d-none d-md-block border-left no-print color-bg-default flex-shrink-0', - styles.aside + styles.aside, )} > <nav className="height-full overflow-auto"> diff --git a/components/release-notes/PatchNotes.tsx b/components/release-notes/PatchNotes.tsx index 2f28ba3a8033..f3b08e1246b6 100644 --- a/components/release-notes/PatchNotes.tsx +++ b/components/release-notes/PatchNotes.tsx @@ -34,7 +34,7 @@ export function PatchNotes({ patch, withReleaseNoteLabel }: Props) { className={cx( 'py-6 d-block d-xl-flex', !withReleaseNoteLabel && 'mx-6', - !isLast && 'border-bottom' + !isLast && 'border-bottom', )} > <div> diff --git a/components/sidebar/SidebarNav.tsx b/components/sidebar/SidebarNav.tsx index d735548ee0c0..948808030f9b 100644 --- a/components/sidebar/SidebarNav.tsx +++ b/components/sidebar/SidebarNav.tsx @@ -46,7 +46,7 @@ export const SidebarNav = ({ variant = 'full' }: Props) => { <div className={cx( variant === 'overlay' ? 'd-xl-none' : 'border-right d-none d-xl-block', - 'bg-primary overflow-y-auto flex-shrink-0' + 'bg-primary overflow-y-auto flex-shrink-0', )} style={{ width: 326, height: '100vh', paddingBottom: sidebarPaddingBottom }} role="banner" diff --git a/components/ui/Callout/Callout.tsx b/components/ui/Callout/Callout.tsx index 1d15d68ab162..0d5d7864b5f2 100644 --- a/components/ui/Callout/Callout.tsx +++ b/components/ui/Callout/Callout.tsx @@ -24,7 +24,7 @@ export const Callout = ({ 'border rounded-1 p-3 f5', variant === 'success' && 'color-border-success color-bg-success', variant === 'info' && 'color-border-accent-emphasis color-bg-accent', - variant === 'warning' && 'color-bg-attention color-border-attention-emphasis' + variant === 'warning' && 'color-bg-attention color-border-attention-emphasis', )} dangerouslySetInnerHTML={dangerouslySetInnerHTML} > diff --git a/components/ui/Picker/Fields.tsx b/components/ui/Picker/Fields.tsx index efb3c870713b..6c1c864defa2 100644 --- a/components/ui/Picker/Fields.tsx +++ b/components/ui/Picker/Fields.tsx @@ -45,7 +45,7 @@ export const Fields = (fieldProps: { > {renderItem ? renderItem(item) : item.text} </ActionList.Item> - ) + ), )} </ActionList> ) diff --git a/components/ui/ScrollButton/ScrollButton.tsx b/components/ui/ScrollButton/ScrollButton.tsx index debf9ddff3b4..f5adf2ae3ad1 100644 --- a/components/ui/ScrollButton/ScrollButton.tsx +++ b/components/ui/ScrollButton/ScrollButton.tsx @@ -22,7 +22,7 @@ export const ScrollButton = ({ className, ariaLabel }: ScrollButtonPropsT) => { setShow(false) } }, - { threshold: [0] } + { threshold: [0] }, ) observer.observe(document.getElementsByTagName('h1')[0]) return () => { @@ -44,7 +44,7 @@ export const ScrollButton = ({ className, ariaLabel }: ScrollButtonPropsT) => { onClick={onClick} className={cx( 'tooltipped tooltipped-n tooltipped-no-delay color-bg-accent-emphasis color-fg-on-emphasis circle border-0', - 'd-flex flex-items-center flex-justify-center' + 'd-flex flex-items-center flex-justify-center', )} style={{ width: 40, height: 40 }} aria-label={ariaLabel} diff --git a/lib/all-versions.js b/lib/all-versions.js index 1f687d6ff305..300bc94a9e77 100755 --- a/lib/all-versions.js +++ b/lib/all-versions.js @@ -103,7 +103,7 @@ Object.keys(apiVersions).forEach((key) => { export const allVersionKeys = Object.keys(allVersions) export const allVersionShortnames = Object.fromEntries( - Object.values(allVersions).map((v) => [v.shortName, v.plan]) + Object.values(allVersions).map((v) => [v.shortName, v.plan]), ) export function isApiVersioned(version) { @@ -115,7 +115,7 @@ export function isApiVersioned(version) { // the OpenAPI version name (the filename ) export function getDocsVersion(openApiVersion) { const matchingVersion = Object.values(allVersions).find((version) => - openApiVersion.startsWith(version.openApiVersionName) + openApiVersion.startsWith(version.openApiVersionName), ) if (!matchingVersion) { diff --git a/lib/check-node-version.js b/lib/check-node-version.js index 5848deb7994c..3d8e69eaebd9 100644 --- a/lib/check-node-version.js +++ b/lib/check-node-version.js @@ -10,7 +10,7 @@ if (!semver.satisfies(process.version, engines.node)) { console.error( `\n\nYou're using Node.js ${process.version.replace(/^v/, '')} but this project requires ${ engines.node - }` + }`, ) console.error('Visit nodejs.org to download an installer that meets these requirements.\n\n') process.exit(1) diff --git a/lib/create-tree.js b/lib/create-tree.js index aaea8fd1b8c0..bd0700ffddcd 100644 --- a/lib/create-tree.js +++ b/lib/create-tree.js @@ -40,8 +40,8 @@ export default async function createTree(originalPath, rootPath, previousTree) { } throw new Error( `Cannot find a content file at ${originalPath}. Fix the children frontmatter entry "/${path.basename( - originalPath - )}" in ${path.dirname(originalPath)}/index.md.\n` + originalPath, + )}" in ${path.dirname(originalPath)}/index.md.\n`, ) } } @@ -110,7 +110,7 @@ export default async function createTree(originalPath, rootPath, previousTree) { const subTree = await createTree( path.posix.join(originalPath, child), basePath, - childPreviousTree + childPreviousTree, ) if (!subTree) { // Remove that children. @@ -122,7 +122,7 @@ export default async function createTree(originalPath, rootPath, previousTree) { item.page.children = item.page.children.filter((c) => c !== child) } return subTree - }) + }), ) ).filter(Boolean) } diff --git a/lib/enterprise-server-releases.js b/lib/enterprise-server-releases.js index c19f351ee50c..b59757a749f2 100644 --- a/lib/enterprise-server-releases.js +++ b/lib/enterprise-server-releases.js @@ -79,7 +79,7 @@ export const oldestSupported = supported[supported.length - 1] export const nextDeprecationDate = dates[oldestSupported].deprecationDate export const isOldestReleaseDeprecated = new Date() > new Date(nextDeprecationDate) export const deprecatedOnNewSite = deprecated.filter((version) => - versionSatisfiesRange(version, '>=2.13') + versionSatisfiesRange(version, '>=2.13'), ) export const firstVersionDeprecatedOnNewSite = '2.13' // starting from 2.18, we updated the archival script to create a redirects.json top-level file in the archived repo @@ -88,13 +88,13 @@ export const lastVersionWithoutArchivedRedirectsFile = '2.17' // instead of /enterprise-server@<release>/<product>/<category>/<article> export const lastReleaseWithLegacyFormat = '2.18' export const deprecatedReleasesWithLegacyFormat = deprecated.filter((version) => - versionSatisfiesRange(version, '<=2.18') + versionSatisfiesRange(version, '<=2.18'), ) export const deprecatedReleasesWithNewFormat = deprecated.filter((version) => - versionSatisfiesRange(version, '>2.18') + versionSatisfiesRange(version, '>2.18'), ) export const deprecatedReleasesOnDeveloperSite = deprecated.filter((version) => - versionSatisfiesRange(version, '<=2.16') + versionSatisfiesRange(version, '<=2.16'), ) export const firstReleaseNote = '2.20' export const firstRestoredAdminGuides = '2.21' diff --git a/lib/get-applicable-versions.js b/lib/get-applicable-versions.js index 42cb5f8980a7..cc05f5f14f3d 100644 --- a/lib/get-applicable-versions.js +++ b/lib/get-applicable-versions.js @@ -49,7 +49,7 @@ function getApplicableVersions(versionsObj, filepath, opts = {}) { } return result }, - {} + {}, ) // Get available versions for feature and standard versions. @@ -61,7 +61,7 @@ function getApplicableVersions(versionsObj, filepath, opts = {}) { if (!applicableVersions.length && !opts.doNotThrow) { throw new Error( - `${filepath} is not available in any currently supported version. Make sure the \`versions\` property includes at least one supported version.` + `${filepath} is not available in any currently supported version. Make sure the \`versions\` property includes at least one supported version.`, ) } @@ -73,7 +73,7 @@ function getApplicableVersions(versionsObj, filepath, opts = {}) { // Strip out not-yet-supported versions if the option to include them is not provided. if (!opts.includeNextVersion) { sortedVersions = sortedVersions.filter( - (v) => !(v.endsWith(`@${next}`) || v.endsWith(`@${nextNext}`)) + (v) => !(v.endsWith(`@${next}`) || v.endsWith(`@${nextNext}`)), ) } @@ -94,7 +94,7 @@ function evaluateVersions(versionsObj) { // This will be an array of one or more version objects. const matchingVersionObjs = Object.values(allVersions).filter( (relevantVersionObj) => - relevantVersionObj.plan === plan || relevantVersionObj.shortName === plan + relevantVersionObj.plan === plan || relevantVersionObj.shortName === plan, ) // For each matching version found above, compare it to the provided planValue. diff --git a/lib/get-english-headings.js b/lib/get-english-headings.js index 9f201a1084c3..1923614be0e1 100644 --- a/lib/get-english-headings.js +++ b/lib/get-english-headings.js @@ -26,7 +26,7 @@ export default function getEnglishHeadings(page, context) { const englishPage = findPage( `/en/${page.relativePath.replace(/.md$/, '')}`, context.pages, - context.redirects + context.redirects, ) if (!englishPage) return @@ -38,7 +38,7 @@ export default function getEnglishHeadings(page, context) { return Object.assign( ...translatedHeadings.map((k, i) => ({ [k]: englishHeadings[i], - })) + })), ) } diff --git a/lib/get-mini-toc-items.js b/lib/get-mini-toc-items.js index abb3c88728ca..d8351747fcc1 100644 --- a/lib/get-mini-toc-items.js +++ b/lib/get-mini-toc-items.js @@ -139,7 +139,7 @@ export async function getAutomatedPageMiniTocItems( items, context, depth = 2, - markdownHeading = '' + markdownHeading = '', ) { const titles = markdownHeading + diff --git a/lib/get-product-groups.js b/lib/get-product-groups.js index f4bdfd8a6f5d..0c985ea9102b 100644 --- a/lib/get-product-groups.js +++ b/lib/get-product-groups.js @@ -11,7 +11,7 @@ async function getPage(id, lang, pageMap, context) { const page = pageMap[href] if (!page) { throw new Error( - `Unable to find a page by the href '${href}'. Review your 'childGroups' frontmatter maybe.` + `Unable to find a page by the href '${href}'. Review your 'childGroups' frontmatter maybe.`, ) } let name = '' @@ -47,9 +47,9 @@ export async function getProductGroups(pageMap, lang, context) { octicon: group.octicon || null, // Typically the children are product IDs, but we support deeper page paths too children: await Promise.all( - group.children.map((id) => getPage(id, lang, pageMap, context)) + group.children.map((id) => getPage(id, lang, pageMap, context)), ), } - }) + }), ) } diff --git a/lib/non-enterprise-default-version.js b/lib/non-enterprise-default-version.js index 09facee8b1d2..4c5bef9c21da 100644 --- a/lib/non-enterprise-default-version.js +++ b/lib/non-enterprise-default-version.js @@ -1,6 +1,6 @@ import { allVersions } from '../lib/all-versions.js' const nonEnterpriseDefaultVersion = Object.values(allVersions).find( - (version) => version.nonEnterpriseDefault + (version) => version.nonEnterpriseDefault, ).version export default nonEnterpriseDefaultVersion diff --git a/lib/page-data.js b/lib/page-data.js index 34daf75d5b1b..7030c0892e60 100644 --- a/lib/page-data.js +++ b/lib/page-data.js @@ -13,12 +13,12 @@ import { correctTranslatedContentStrings } from './correct-translation-content.j // every time a translation file fails to initialize we fall back to English // and write a warning to stdout. const DEBUG_TRANSLATION_FALLBACKS = Boolean( - JSON.parse(process.env.DEBUG_TRANSLATION_FALLBACKS || 'false') + JSON.parse(process.env.DEBUG_TRANSLATION_FALLBACKS || 'false'), ) // If you don't want to fall back to English automatically on corrupt // translation files, set `export THROW_TRANSLATION_ERRORS=true` const THROW_TRANSLATION_ERRORS = Boolean( - JSON.parse(process.env.THROW_TRANSLATION_ERRORS || 'false') + JSON.parse(process.env.THROW_TRANSLATION_ERRORS || 'false'), ) const versions = Object.keys(allVersions) @@ -59,9 +59,9 @@ export async function loadUnversionedTree(languagesOnly = null) { unversionedTree[langObj.code] = await translateTree( localizedContentPath, langObj, - unversionedTree.en + unversionedTree.en, ) - }) + }), ) return unversionedTree @@ -146,7 +146,7 @@ async function translateTree(dir, langObj, enTree) { const translatedData = Object.fromEntries( translatableFrontmatterKeys.map((key) => { return [key, data[key]] - }) + }), ) // The "content" isn't a frontmatter key @@ -165,8 +165,8 @@ async function translateTree(dir, langObj, enTree) { fullPath, }, // And the translations translated properties. - translatedData - ) + translatedData, + ), ) if (item.page.children) { item.childPages = await Promise.all( @@ -175,7 +175,7 @@ async function translateTree(dir, langObj, enTree) { // Translations should not get early access pages at all. return childTree.page.relativePath.split(path.sep)[0] !== 'early-access' }) - .map((childTree) => translateTree(dir, langObj, childTree)) + .map((childTree) => translateTree(dir, langObj, childTree)), ) } @@ -209,13 +209,13 @@ export async function loadSiteTree(unversionedTree) { treePerVersion[version] = await versionPages( Object.assign({}, rawTree[langCode]), version, - langCode + langCode, ) - }) + }), ) siteTree[langCode] = treePerVersion - }) + }), ) return siteTree @@ -226,7 +226,7 @@ export async function versionPages(obj, version, langCode) { obj.href = obj.page.permalinks.find( (pl) => pl.pageVersion === version || - (pl.pageVersion === 'homepage' && version === nonEnterpriseDefaultVersion) + (pl.pageVersion === 'homepage' && version === nonEnterpriseDefaultVersion), ).href if (!obj.childPages) return obj @@ -235,7 +235,7 @@ export async function versionPages(obj, version, langCode) { // Drop child pages that do not apply to the current version .filter((childPage) => childPage.page.applicableVersions.includes(version)) // Version the child pages recursively. - .map((childPage) => versionPages(Object.assign({}, childPage), version, langCode)) + .map((childPage) => versionPages(Object.assign({}, childPage), version, langCode)), ) obj.childPages = [...versionedChildPages] @@ -254,7 +254,7 @@ export async function loadPageList(unversionedTree, languagesOnly = null) { await Promise.all( (languagesOnly || Object.keys(languages)).map(async (langCode) => { await addToCollection(rawTree[langCode], pageList) - }) + }), ) async function addToCollection(item, collection) { @@ -263,7 +263,7 @@ export async function loadPageList(unversionedTree, languagesOnly = null) { if (!item.childPages) return await Promise.all( - item.childPages.map(async (childPage) => await addToCollection(childPage, collection)) + item.childPages.map(async (childPage) => await addToCollection(childPage, collection)), ) } diff --git a/lib/page.js b/lib/page.js index 3bcdd6783ba5..665bd99eaf78 100644 --- a/lib/page.js +++ b/lib/page.js @@ -71,7 +71,7 @@ class Page { if (opts.frontmatterErrors && opts.frontmatterErrors.length) { throw new FrontmatterErrorsError( `${opts.frontmatterErrors.length} frontmatter errors trying to load ${opts.fullPath}`, - opts.frontmatterErrors + opts.frontmatterErrors, ) } delete opts.frontmatterErrors @@ -102,12 +102,12 @@ class Page { // only the homepage will not have this.parentProduct .filter( (availableVersion) => - this.parentProduct && !this.parentProduct.versions.includes(availableVersion) + this.parentProduct && !this.parentProduct.versions.includes(availableVersion), ) if (versionsParentProductIsNotAvailableIn.length) { throw new Error( - `\`versions\` frontmatter in ${this.fullPath} contains ${versionsParentProductIsNotAvailableIn}, which ${this.parentProduct.id} product is not available in!` + `\`versions\` frontmatter in ${this.fullPath} contains ${versionsParentProductIsNotAvailableIn}, which ${this.parentProduct.id} product is not available in!`, ) } } @@ -117,7 +117,7 @@ class Page { this.languageCode, this.relativePath, this.title, - this.applicableVersions + this.applicableVersions, ) if (this.relativePath.endsWith('index.md')) { @@ -210,7 +210,7 @@ class Page { if (this.rawLearningTracks) { const { featuredTrack, learningTracks } = await processLearningTracks( this.rawLearningTracks, - context + context, ) this.featuredTrack = featuredTrack this.learningTracks = learningTracks @@ -236,7 +236,7 @@ class Page { guide.type = page.type if (page.topics) { this.allTopics = union(this.allTopics, page.topics).sort((a, b) => - a.localeCompare(b, page.languageCode) + a.localeCompare(b, page.languageCode), ) guide.topics = page.topics } @@ -248,13 +248,13 @@ class Page { // set a flag so layout knows whether to render a mac/windows/linux switcher element this.detectedPlatforms = ['mac', 'windows', 'linux'].filter( (platform) => - html.includes(`extended-markdown ${platform}`) || html.includes(`platform-${platform}`) + html.includes(`extended-markdown ${platform}`) || html.includes(`platform-${platform}`), ) this.includesPlatformSpecificContent = this.detectedPlatforms.length > 0 // set flags for webui, cli, etc switcher element this.detectedTools = Object.keys(allTools).filter( - (tool) => html.includes(`extended-markdown ${tool}`) || html.includes(`tool-${tool}`) + (tool) => html.includes(`extended-markdown ${tool}`) || html.includes(`tool-${tool}`), ) // pass the list of all possible tools around to components and utilities that will need it later on diff --git a/lib/path-utils.js b/lib/path-utils.js index f9ca58c23414..cffccd3dbd17 100644 --- a/lib/path-utils.js +++ b/lib/path-utils.js @@ -12,7 +12,7 @@ const supportedVersions = new Set(Object.keys(allVersions)) export function getPathWithLanguage(href, languageCode) { return slash(path.posix.join('/', languageCode, getPathWithoutLanguage(href))).replace( patterns.trailingSlash, - '$1' + '$1', ) } diff --git a/lib/permalink.js b/lib/permalink.js index 9daf38d2b367..bb1d8ddacd3d 100644 --- a/lib/permalink.js +++ b/lib/permalink.js @@ -37,7 +37,7 @@ class Permalink { const permalinkSuffix = this.constructor.relativePathToSuffix(relativePath) this.hrefWithoutLanguage = removeFPTFromPath( - path.posix.join('/', pageVersion, permalinkSuffix) + path.posix.join('/', pageVersion, permalinkSuffix), ).replace(patterns.trailingSlash, '$1') this.href = `/${languageCode}${ this.hrefWithoutLanguage === '/' ? '' : this.hrefWithoutLanguage diff --git a/lib/read-json-file.js b/lib/read-json-file.js index 6f4ae86adc2e..e7a7c5da973f 100644 --- a/lib/read-json-file.js +++ b/lib/read-json-file.js @@ -67,7 +67,7 @@ export function readCompressedJsonFileFallbackLazily(xpath) { console.warn( "If this happens it's because the readCompressedJsonFileFallbackLazily " + 'function has been called non-globally. Only use ' + - 'readCompressedJsonFileFallback once at module-level.' + 'readCompressedJsonFileFallback once at module-level.', ) throw new Error(`Globally reading the same file more than once (${xpath})`) } diff --git a/lib/redirects/permalinks.js b/lib/redirects/permalinks.js index 1fa98e70de1c..9176e1972ac0 100644 --- a/lib/redirects/permalinks.js +++ b/lib/redirects/permalinks.js @@ -21,7 +21,7 @@ export default function permalinkRedirects(permalinks, redirectFrom) { redirectFrom.forEach((frontmatterOldPath) => { if (!frontmatterOldPath.startsWith('/')) { throw new Error( - `'${frontmatterOldPath}' is not a valid redirect_from frontmatter value because it doesn't start with a /` + `'${frontmatterOldPath}' is not a valid redirect_from frontmatter value because it doesn't start with a /`, ) } diff --git a/lib/redirects/precompile.js b/lib/redirects/precompile.js index 53b1ffaad296..0a8360ab2021 100755 --- a/lib/redirects/precompile.js +++ b/lib/redirects/precompile.js @@ -49,7 +49,7 @@ export async function precompileRedirects(pageList) { if (toURI.includes('/enterprise-server@latest')) { allRedirects[fromURI] = toURI.replace( '/enterprise-server@latest', - `/enterprise-server@${latest}` + `/enterprise-server@${latest}`, ) } }) diff --git a/lib/release-notes-utils.js b/lib/release-notes-utils.js index 212e35758f98..0dbfa9cde4b0 100644 --- a/lib/release-notes-utils.js +++ b/lib/release-notes-utils.js @@ -65,21 +65,21 @@ export async function renderPatchNotes(patches, ctx) { const renderedNoteObj = {} renderedNoteObj.heading = note.heading renderedNoteObj.notes = await Promise.all( - note.notes.map(async (noteStr) => renderContent(noteStr, ctx)) + note.notes.map(async (noteStr) => renderContent(noteStr, ctx)), ) return renderedNoteObj } - }) + }), ) return [sectionType, renderedSectionArray] - }) - ) + }), + ), ) renderedPatch.sections = renderedSections return renderedPatch - }) + }), ) } diff --git a/lib/update-internal-links.js b/lib/update-internal-links.js index 11bddc227f68..108bb7f53452 100644 --- a/lib/update-internal-links.js +++ b/lib/update-internal-links.js @@ -289,7 +289,7 @@ async function updateFile(file, context, opts) { } } else if (opts.verbose) { console.warn( - `Unable to find link as Markdown ('${asMarkdown}') in the source content (${file})` + `Unable to find link as Markdown ('${asMarkdown}') in the source content (${file})`, ) } }) diff --git a/middleware/api/index.js b/middleware/api/index.js index 7976752646f1..f1622dfedb5f 100644 --- a/middleware/api/index.js +++ b/middleware/api/index.js @@ -39,7 +39,7 @@ if (process.env.ELASTICSEARCH_URL) { // have your own ELASTICSEARCH_URL locally, then search functionality // isn't what you're developing/debugging. logLevel: 'warn', - }) + }), ) } diff --git a/middleware/archived-enterprise-versions-assets.js b/middleware/archived-enterprise-versions-assets.js index b51b8ad40b3d..4babd8bc3a74 100644 --- a/middleware/archived-enterprise-versions-assets.js +++ b/middleware/archived-enterprise-versions-assets.js @@ -55,7 +55,7 @@ export default async function archivedEnterpriseVersionsAssets(req, res, next) { try { const r = await got( - `https://github.github.com/help-docs-archived-enterprise-versions${proxyPath}` + `https://github.github.com/help-docs-archived-enterprise-versions${proxyPath}`, ) res.set('accept-ranges', 'bytes') res.set('content-type', r.headers['content-type']) diff --git a/middleware/archived-enterprise-versions.js b/middleware/archived-enterprise-versions.js index 2947072c6dc0..fecbe837a2b4 100644 --- a/middleware/archived-enterprise-versions.js +++ b/middleware/archived-enterprise-versions.js @@ -34,10 +34,10 @@ function splitByLanguage(uri) { // `readJsonFileLazily()` function will, at import-time, check that // the path does exist. const archivedRedirects = readCompressedJsonFileFallbackLazily( - './lib/redirects/static/archived-redirects-from-213-to-217.json' + './lib/redirects/static/archived-redirects-from-213-to-217.json', ) const archivedFrontmatterValidURLS = readCompressedJsonFileFallbackLazily( - './lib/redirects/static/archived-frontmatter-valid-urls.json' + './lib/redirects/static/archived-frontmatter-valid-urls.json', ) // Combine all the things you need to make sure the response is diff --git a/middleware/cache-control.js b/middleware/cache-control.js index 1fef715bc826..90326ff168b5 100644 --- a/middleware/cache-control.js +++ b/middleware/cache-control.js @@ -12,7 +12,7 @@ // Max age should not be greater than 31536000 https://www.ietf.org/rfc/rfc2616.txt function cacheControlFactory( maxAge = 60 * 60, - { key = 'cache-control', public_ = true, immutable = false, maxAgeZero = false } = {} + { key = 'cache-control', public_ = true, immutable = false, maxAgeZero = false } = {}, ) { const directives = [ maxAge && public_ && 'public', @@ -29,7 +29,7 @@ function cacheControlFactory( return (res) => { if (process.env.NODE_ENV !== 'production' && res.hasHeader('set-cookie')) { console.warn( - "You can't set a >0 cache-control header AND set-cookie or else the CDN will never respect the cache-control." + "You can't set a >0 cache-control header AND set-cookie or else the CDN will never respect the cache-control.", ) } res.set(key, directives) diff --git a/middleware/categories-for-support.js b/middleware/categories-for-support.js index 59a21b06a70d..898e13644097 100644 --- a/middleware/categories-for-support.js +++ b/middleware/categories-for-support.js @@ -26,7 +26,7 @@ export default async function categoriesForSupport(req, res) { name, published_articles: await findArticlesPerCategory(categoryPage, [], req.context), }) - }) + }), ) } @@ -55,7 +55,7 @@ async function findArticlesPerCategory(currentPage, articlesArray, context) { await Promise.all( currentPage.childPages.map(async (childPage) => { await findArticlesPerCategory(childPage, articlesArray, context) - }) + }), ) return articlesArray diff --git a/middleware/context.js b/middleware/context.js index bfa933aa4e3b..9878af763447 100644 --- a/middleware/context.js +++ b/middleware/context.js @@ -17,7 +17,7 @@ import { getDataByLanguage, getUIDataMerged } from '../lib/get-data.js' // This doesn't change just because the request changes, so compute it once. const enterpriseServerVersions = Object.keys(allVersions).filter((version) => - version.startsWith('enterprise-server@') + version.startsWith('enterprise-server@'), ) // Supply all route handlers with a baseline `req.context` object diff --git a/middleware/contextualizers/breadcrumbs.js b/middleware/contextualizers/breadcrumbs.js index 3330614ccfc7..ecc6b860c6db 100644 --- a/middleware/contextualizers/breadcrumbs.js +++ b/middleware/contextualizers/breadcrumbs.js @@ -39,7 +39,7 @@ function getBreadcrumbs(req, isEarlyAccess) { const breadcrumbs = traverseTreeTitles( req.context.currentPath, - req.context.currentProductTreeTitles + req.context.currentProductTreeTitles, ) ;[...Array(cutoff)].forEach(() => breadcrumbs.shift()) diff --git a/middleware/contextualizers/current-product-tree.js b/middleware/contextualizers/current-product-tree.js index 9dc1bc93fc2b..226420721d25 100644 --- a/middleware/contextualizers/current-product-tree.js +++ b/middleware/contextualizers/current-product-tree.js @@ -19,13 +19,13 @@ export default async function currentProductTree(req, res, next) { '/', req.context.currentLanguage, req.context.currentVersion, - req.context.currentProduct - ) + req.context.currentProduct, + ), ) req.context.currentProductTree = findPageInSiteTree( currentRootTree, req.context.currentEnglishTree, - currentProductPath + currentProductPath, ) // First make a slim tree of just the 'href', 'title', 'shortTitle' @@ -33,12 +33,12 @@ export default async function currentProductTree(req, res, next) { // This gets used for map topic and category pages. req.context.currentProductTreeTitles = await getCurrentProductTreeTitles( req.context.currentProductTree, - req.context + req.context, ) // Now make an even slimmer version that excludes all hidden pages. // This is i used for sidebars. req.context.currentProductTreeTitlesExcludeHidden = excludeHidden( - req.context.currentProductTreeTitles + req.context.currentProductTreeTitles, ) // Some pages, like hidden pages, don't have a tree. For example, @@ -56,7 +56,7 @@ export default async function currentProductTree(req, res, next) { async function getCurrentProductTreeTitles(input, context) { const { page, href } = input const childPages = await Promise.all( - (input.childPages || []).map((child) => getCurrentProductTreeTitles(child, context)) + (input.childPages || []).map((child) => getCurrentProductTreeTitles(child, context)), ) // If the current page is a translation we're going to need the English @@ -88,14 +88,14 @@ async function getCurrentProductTreeTitles(input, context) { const renderedFullTitle = await executeWithFallback( context, () => liquid.parseAndRender(page.rawTitle, context), - (enContext) => liquid.parseAndRender(enPage.rawTitle, enContext) + (enContext) => liquid.parseAndRender(enPage.rawTitle, enContext), ) let renderedShortTitle = '' if (rawShortTitle) { renderedShortTitle = await executeWithFallback( context, () => liquid.parseAndRender(page.rawShortTitle, context), - (enContext) => liquid.parseAndRender(enPage.rawShortTitle, enContext) + (enContext) => liquid.parseAndRender(enPage.rawShortTitle, enContext), ) } diff --git a/middleware/contextualizers/features.js b/middleware/contextualizers/features.js index c05c71329ed3..f33c0fba628f 100644 --- a/middleware/contextualizers/features.js +++ b/middleware/contextualizers/features.js @@ -10,7 +10,7 @@ export default function features(req, res, next) { Object.entries(getFeaturesByVersion(req.context.currentVersion)).forEach( ([featureName, isFeatureAvailableInCurrentVersion]) => { req.context[featureName] = isFeatureAvailableInCurrentVersion - } + }, ) return next() @@ -34,7 +34,7 @@ function getFeaturesByVersion(currentVersion) { const { versions } = feature const applicableVersions = getApplicableVersions( versions, - path.join(ROOT, `data/features/${featureName}.yml`) + path.join(ROOT, `data/features/${featureName}.yml`), ) // Adding the resulting boolean to the context object gives us the ability to use diff --git a/middleware/contextualizers/generic-toc.js b/middleware/contextualizers/generic-toc.js index 9e78d057576a..66275e78a2ec 100644 --- a/middleware/contextualizers/generic-toc.js +++ b/middleware/contextualizers/generic-toc.js @@ -35,7 +35,7 @@ export default async function genericToc(req, res, next) { const treePage = findPageInSiteTree( req.context.currentProductTree, req.context.currentEnglishTree, - req.pagePath + req.pagePath, ) // By default, only include hidden child items on a TOC page if it's an Early Access category or @@ -120,6 +120,6 @@ async function getTocItems(node, context, opts) { intro, childTocItems, } - }) + }), ) } diff --git a/middleware/contextualizers/get-release-notes.js b/middleware/contextualizers/get-release-notes.js index da809afbcc79..6c66f0725f08 100644 --- a/middleware/contextualizers/get-release-notes.js +++ b/middleware/contextualizers/get-release-notes.js @@ -9,8 +9,8 @@ export function getReleaseNotes(prefix, langCode) { if (!VALID_PREFIXES.has(prefix)) { throw new Error( `'${prefix}' is not a valid prefix for this function. Must be one of ${Array.from( - VALID_PREFIXES - )}` + VALID_PREFIXES, + )}`, ) } // Use English as the foundation, then we'll try to load each individual @@ -45,13 +45,13 @@ export function getReleaseNotes(prefix, langCode) { // Minor version is things like '0-rc1' or '3' const data = getDataByLanguage( `release-notes.${prefix}.${majorVersion}.${minorVersion}`, - langCode + langCode, ) // A simple but powerful validation. If the `sections:` thing // is incorrectly translated so it's no longer an array, then we // don't pick this up from the translation. const validSections = Object.values(data.sections).every((sectionValue) => - Array.isArray(sectionValue) + Array.isArray(sectionValue), ) if (validSections) { translatedReleaseNotes[majorVersion][minorVersion] = data diff --git a/middleware/contextualizers/ghae-release-notes.js b/middleware/contextualizers/ghae-release-notes.js index 84d59ba31ef8..9762f8c2c878 100644 --- a/middleware/contextualizers/ghae-release-notes.js +++ b/middleware/contextualizers/ghae-release-notes.js @@ -35,8 +35,8 @@ export default async function ghaeReleaseNotesContext(req, res, next) { req.context.ghaeReleaseNotes = ( await Promise.all( req.context.ghaeReleases.map( - async (release) => await renderPatchNotes(release.patches, req.context) - ) + async (release) => await renderPatchNotes(release.patches, req.context), + ), ) ).flat() diff --git a/middleware/contextualizers/ghes-release-notes.js b/middleware/contextualizers/ghes-release-notes.js index 95aa5d6cb0fb..cda707af39f1 100644 --- a/middleware/contextualizers/ghes-release-notes.js +++ b/middleware/contextualizers/ghes-release-notes.js @@ -29,7 +29,7 @@ export default async function ghesReleaseNotesContext(req, res, next) { // Find the notes for the current release only const currentReleaseNotes = req.context.ghesReleases.find( - (r) => r.version === requestedRelease + (r) => r.version === requestedRelease, ).patches // Run the current release notes through the markdown rendering pipeline. @@ -44,10 +44,10 @@ export default async function ghesReleaseNotesContext(req, res, next) { const ghesReleaseNotes = getReleaseNotes('enterprise-server', 'en') enContext.ghesReleases = formatReleases(ghesReleaseNotes) const currentReleaseNotes = enContext.ghesReleases.find( - (r) => r.version === requestedRelease + (r) => r.version === requestedRelease, ).patches return renderPatchNotes(currentReleaseNotes, enContext) - } + }, ) // GHES release notes on docs started with 2.20 but older release notes exist on enterprise.github.com. diff --git a/middleware/contextualizers/glossaries.js b/middleware/contextualizers/glossaries.js index c312bbfec6d6..8bb8c9310ee5 100644 --- a/middleware/contextualizers/glossaries.js +++ b/middleware/contextualizers/glossaries.js @@ -39,7 +39,7 @@ export default async function glossaries(req, res, next) { // But because the terms themselves are often translated, // in this mapping we often don't have an English equivalent. // So that's why we fall back on the empty string. - enGlossaryMap.get(glossary.term) || '' + enGlossaryMap.get(glossary.term) || '', ) } description = await executeWithFallback( @@ -53,13 +53,13 @@ export default async function glossaries(req, res, next) { if (!enGlossaryMap.has(term)) return const enDescription = enGlossaryMap.get(term) return liquid.parseAndRender(enDescription, enContext) - } + }, ) // It's important to use `Object.assign` here to avoid mutating the // original object because from `getDataByLanguage`, reads from an // in-memory cache so if we mutated it, it would be mutated for all. return Object.assign({}, glossary, { description }) - }) + }), ) ).filter(Boolean) diff --git a/middleware/contextualizers/product-examples.js b/middleware/contextualizers/product-examples.js index e707943833f1..13ce85aaf74a 100644 --- a/middleware/contextualizers/product-examples.js +++ b/middleware/contextualizers/product-examples.js @@ -25,12 +25,12 @@ export default async function productExamples(req, res, next) { req.context.productCommunityExamples = getProductExampleData( currentProduct, 'community-examples', - currentLanguage + currentLanguage, ) req.context.productUserExamples = getProductExampleData( currentProduct, 'user-examples', - currentLanguage + currentLanguage, ) return next() diff --git a/middleware/contextualizers/secret-scanning.js b/middleware/contextualizers/secret-scanning.js index 797dbd747f85..558cc251c76d 100644 --- a/middleware/contextualizers/secret-scanning.js +++ b/middleware/contextualizers/secret-scanning.js @@ -14,7 +14,7 @@ export default async function secretScanning(req, res, next) { const { currentVersion } = req.context req.context.secretScanningData = secretScanningData.filter((entry) => - getApplicableVersions(entry.versions).includes(currentVersion) + getApplicableVersions(entry.versions).includes(currentVersion), ) return next() diff --git a/middleware/contextualizers/whats-new-changelog.js b/middleware/contextualizers/whats-new-changelog.js index 948e1edd4dde..3749899756d5 100644 --- a/middleware/contextualizers/whats-new-changelog.js +++ b/middleware/contextualizers/whats-new-changelog.js @@ -25,7 +25,7 @@ export default async function whatsNewChangelog(req, res, next) { req.context.whatsNewChangelog = await getChangelogItems( req.context.page.changelog.prefix, - req.context.changelogUrl + req.context.changelogUrl, ) return next() } diff --git a/middleware/find-page.js b/middleware/find-page.js index 6fbab097b82e..68a91daa65e0 100644 --- a/middleware/find-page.js +++ b/middleware/find-page.js @@ -14,7 +14,7 @@ export default async function findPage( next, // Express won't execute these but it makes it easier to unit test // the middleware. - { isDev = process.env.NODE_ENV === 'development', contentRoot = CONTENT_ROOT } = {} + { isDev = process.env.NODE_ENV === 'development', contentRoot = CONTENT_ROOT } = {}, ) { // Filter out things like `/will/redirect` or `/_next/data/...` if (!languagePrefixPathRegex.test(req.pagePath)) { @@ -33,7 +33,7 @@ export default async function findPage( .status(404) .send( `After re-reading the page, '${req.context.currentVersion}' is no longer an applicable version. ` + - 'A restart is required.' + 'A restart is required.', ) } } diff --git a/middleware/get-remote-json.js b/middleware/get-remote-json.js index 708acd241853..4dc69068afe5 100644 --- a/middleware/get-remote-json.js +++ b/middleware/get-remote-json.js @@ -72,7 +72,7 @@ export default async function getRemoteJSON(url, config) { const res = await got(url, config) if (!res.headers['content-type'].startsWith('application/json')) { throw new Error( - `Fetching '${url}' resulted in a non-JSON response (${res.headers['content-type']})` + `Fetching '${url}' resulted in a non-JSON response (${res.headers['content-type']})`, ) } cache.set(cacheKey, JSON.parse(res.body)) diff --git a/middleware/helmet.js b/middleware/helmet.js index ab6a74ce0563..8313af6a24f6 100644 --- a/middleware/helmet.js +++ b/middleware/helmet.js @@ -60,7 +60,7 @@ ndDirs.scriptSrc.push( "'unsafe-eval'", "'unsafe-inline'", 'http://www.google-analytics.com', - 'https://ssl.google-analytics.com' + 'https://ssl.google-analytics.com', ) ndDirs.connectSrc.push('https://www.google-analytics.com') ndDirs.imgSrc.push('http://www.google-analytics.com', 'https://ssl.google-analytics.com') diff --git a/middleware/index.js b/middleware/index.js index 8ebe2ce95720..af02f65021bf 100644 --- a/middleware/index.js +++ b/middleware/index.js @@ -74,7 +74,7 @@ const isTest = NODE_ENV === 'test' || process.env.GITHUB_ACTIONS === 'true' // it's off if you're in a production environment or running automated tests. // But if you set the env var, that takes precedence. const ENABLE_DEV_LOGGING = JSON.parse( - process.env.ENABLE_DEV_LOGGING || !(DEPLOYMENT_ENV === 'azure' || isTest) + process.env.ENABLE_DEV_LOGGING || !(DEPLOYMENT_ENV === 'azure' || isTest), ) const ENABLE_FASTLY_TESTING = JSON.parse(process.env.ENABLE_FASTLY_TESTING || 'false') @@ -129,8 +129,8 @@ export default function (app) { // archivedEnterpriseVersionsAssets must come before static/assets app.use( asyncMiddleware( - instrument(archivedEnterpriseVersionsAssets, './archived-enterprise-versions-assets') - ) + instrument(archivedEnterpriseVersionsAssets, './archived-enterprise-versions-assets'), + ), ) app.use(favicons) @@ -163,7 +163,7 @@ export default function (app) { immutable: process.env.NODE_ENV !== 'development', // The next middleware will try its luck and send the 404 if must. fallthrough: true, - }) + }), ) app.use(asyncMiddleware(instrument(dynamicAssets, './dynamic-assets'))) app.use( @@ -174,7 +174,7 @@ export default function (app) { maxAge: '7 days', // A bit longer since releases are more sparse // See note about about use of 'fallthrough' fallthrough: false, - }) + }), ) // In development, let NextJS on-the-fly serve the static assets. @@ -194,7 +194,7 @@ export default function (app) { immutable: true, // See note about about use of 'fallthrough' fallthrough: false, - }) + }), ) } @@ -258,11 +258,11 @@ export default function (app) { app.use(instrument(robots, './robots')) app.use( /(\/.*)?\/early-access$/, - instrument(earlyAccessLinks, './contextualizers/early-access-links') + instrument(earlyAccessLinks, './contextualizers/early-access-links'), ) app.use( '/categories.json', - asyncMiddleware(instrument(categoriesForSupport, './categories-for-support')) + asyncMiddleware(instrument(categoriesForSupport, './categories-for-support')), ) app.get('/_500', asyncMiddleware(instrument(triggerError, './trigger-error'))) diff --git a/middleware/redirects/language-code-redirects.js b/middleware/redirects/language-code-redirects.js index 5f5e30e35042..700c731d80a5 100644 --- a/middleware/redirects/language-code-redirects.js +++ b/middleware/redirects/language-code-redirects.js @@ -14,7 +14,7 @@ const combinedRedirectPatternRegex = const allRedirectPatterns = Object.values(languages) .map((language) => - (language.redirectPatterns || []).map((redirectPattern) => [language.code, redirectPattern]) + (language.redirectPatterns || []).map((redirectPattern) => [language.code, redirectPattern]), ) .flat() diff --git a/middleware/reload-tree.js b/middleware/reload-tree.js index 97528057028f..b0ef22229e52 100644 --- a/middleware/reload-tree.js +++ b/middleware/reload-tree.js @@ -41,7 +41,7 @@ export default async function reloadTree(req, res, next) { warmed.unversionedTree.en = await createTree( path.join(languages.en.dir, 'content'), undefined, - warmed.unversionedTree.en + warmed.unversionedTree.en, ) const after = getMtimes(warmed.unversionedTree.en) // The next couple of operations are much slower (in total) than diff --git a/middleware/render-page.js b/middleware/render-page.js index 64f987882ec8..28e46ff9899d 100644 --- a/middleware/render-page.js +++ b/middleware/render-page.js @@ -52,7 +52,7 @@ export default async function renderPage(req, res) { if (!page) { if (process.env.NODE_ENV !== 'test' && context.redirectNotFound) { console.error( - `\nTried to redirect to ${context.redirectNotFound}, but that page was not found.\n` + `\nTried to redirect to ${context.redirectNotFound}, but that page was not found.\n`, ) } diff --git a/middleware/set-fastly-surrogate-key.js b/middleware/set-fastly-surrogate-key.js index 82b0accd802b..a2f06c676ad5 100644 --- a/middleware/set-fastly-surrogate-key.js +++ b/middleware/set-fastly-surrogate-key.js @@ -18,7 +18,9 @@ export function setFastlySurrogateKey(res, enumKey, isCustomKey = false) { if (process.env.NODE_ENV !== 'production') { if (!isCustomKey && !Object.values(SURROGATE_ENUMS).includes(enumKey)) { throw new Error( - `Unrecognizes surrogate enumKey. ${enumKey} is not one of ${Object.values(SURROGATE_ENUMS)}` + `Unrecognizes surrogate enumKey. ${enumKey} is not one of ${Object.values( + SURROGATE_ENUMS, + )}`, ) } } diff --git a/pages/[versionId]/admin/release-notes.tsx b/pages/[versionId]/admin/release-notes.tsx index 36b63137386b..20ffcb784843 100644 --- a/pages/[versionId]/admin/release-notes.tsx +++ b/pages/[versionId]/admin/release-notes.tsx @@ -56,16 +56,16 @@ export const getServerSideProps: GetServerSideProps<Props> = async (context) => message: { ghes_release_notes_upgrade_patch_only: liquid.parseAndRenderSync( req.context.site.data.ui.header.notices.ghes_release_notes_upgrade_patch_only, - { latestPatch, latestRelease } + { latestPatch, latestRelease }, ), ghes_release_notes_upgrade_release_only: liquid.parseAndRenderSync( req.context.site.data.ui.header.notices.ghes_release_notes_upgrade_release_only, - { latestPatch, latestRelease } + { latestPatch, latestRelease }, ), ghes_release_notes_upgrade_patch_and_release: liquid.parseAndRenderSync( req.context.site.data.ui.header.notices .ghes_release_notes_upgrade_patch_and_release, - { latestPatch, latestRelease } + { latestPatch, latestRelease }, ), }, } diff --git a/pages/_app.tsx b/pages/_app.tsx index 11afb5b7e85b..11dbca97bb2e 100644 --- a/pages/_app.tsx +++ b/pages/_app.tsx @@ -121,7 +121,7 @@ MyApp.getInitialProps = async (appContext: AppContext) => { // of a 500 page ("Ooops! It looks like something went wrong.") if (req?.context?.languages) { for (const [langCode, langObj] of Object.entries( - req.context.languages as Record<string, LanguageItem> + req.context.languages as Record<string, LanguageItem>, )) { if (langObj.wip) continue // Only pick out the keys we actually need diff --git a/pages/_error.tsx b/pages/_error.tsx index 11ab2864836f..89ce462d7ddd 100644 --- a/pages/_error.tsx +++ b/pages/_error.tsx @@ -50,14 +50,14 @@ Error.getInitialProps = async (ctx: NextPageContext) => { language: expressRequest.language, }, undefined, - 2 + 2, ), headers: JSON.stringify( Object.fromEntries( - Object.entries(req.headers).filter(([k]) => OK_HEADER_KEYS.includes(k)) + Object.entries(req.headers).filter(([k]) => OK_HEADER_KEYS.includes(k)), ), undefined, - 2 + 2, ), }) @@ -67,7 +67,7 @@ Error.getInitialProps = async (ctx: NextPageContext) => { // Otherwise, it should return `Array<Promise<Response | void>>`. if (!reported) { console.warn( - 'The FailBot.report() returned undefined which means the error was NOT sent to Failbot.' + 'The FailBot.report() returned undefined which means the error was NOT sent to Failbot.', ) } else if ( Array.isArray(reported) && diff --git a/script/accessibility-checks.js b/script/accessibility-checks.js index 33c24a8e8dea..01860731c78d 100755 --- a/script/accessibility-checks.js +++ b/script/accessibility-checks.js @@ -36,7 +36,7 @@ if (opts.all) headingChecks.forEach((headingCheck) => (opts[headingCheck] = true const requestedChecks = Object.keys(opts).filter((key) => allChecks.includes(key)) if (!requestedChecks.length) program.help() const requestedheadingChecks = requestedChecks.filter((requestedCheck) => - headingChecks.includes(requestedCheck) + headingChecks.includes(requestedCheck), ) if (!opts.all && requestedheadingChecks.length) opts.all = true console.log(`\nNotes: @@ -113,7 +113,7 @@ async function checkMarkdownPages() { const headingObjs = getheadingObjs(headingNodes) runheadingChecks(headingObjs, ast, errorObj) } - }) + }), ) } @@ -159,7 +159,7 @@ function checkLevels(headingObjs, errorObj) { function checkDuplicates(headingObjs, errorObj) { const duplicates = headingObjs.filter((headingObj, index) => { return headingObjs.filter( - (hObj, ix) => headingObj.text.toLowerCase() === hObj.text.toLowerCase() && index !== ix + (hObj, ix) => headingObj.text.toLowerCase() === hObj.text.toLowerCase() && index !== ix, ).length }) if (!duplicates.length) return @@ -185,7 +185,7 @@ function checkContentInMdast(ast, errorObj) { if (!results.length) return results.forEach((resultObj) => { errorObj.content.add( - `${cleanHeading(resultObj.previous[0])}\n${cleanHeading(resultObj.current[0])}` + `${cleanHeading(resultObj.previous[0])}\n${cleanHeading(resultObj.current[0])}`, ) }) } @@ -235,7 +235,7 @@ async function getReusableText(body) { const justReusable = reusable.match(justReusablesRegex)[1].trim() const text = getDataByLanguage(justReusable, 'en') newBody = body.replace(reusable, text) - }) + }), ) return newBody } diff --git a/script/actions/find-unicorn-action-shas.js b/script/actions/find-unicorn-action-shas.js index 6c7d0c9f0e24..11cd33dea347 100755 --- a/script/actions/find-unicorn-action-shas.js +++ b/script/actions/find-unicorn-action-shas.js @@ -52,7 +52,7 @@ async function main(opts, args) { } } const suspects = Object.fromEntries( - Object.entries(counts).filter(([, shas]) => Object.keys(shas).length > 1) + Object.entries(counts).filter(([, shas]) => Object.keys(shas).length > 1), ) const countSuspects = Object.keys(suspects).length @@ -70,8 +70,8 @@ async function main(opts, args) { console.log(chalk.bold('Suspect:'), `${action}@${chalk.yellow(sha)}`) console.log( `is only used ${count} time${count === 1 ? '' : 's'} (${((100 * count) / total).toFixed( - 1 - )}%) compared to ${mostPopular[1]} (used ${mostPopular[0]} times)` + 1, + )}%) compared to ${mostPopular[1]} (used ${mostPopular[0]} times)`, ) console.log(chalk.bold(`Consider changing to ${action}@${mostPopular[1]}`)) console.log('in...') diff --git a/script/anonymize-branch.js b/script/anonymize-branch.js index 147cc54082fa..55d6b5cdc406 100755 --- a/script/anonymize-branch.js +++ b/script/anonymize-branch.js @@ -24,8 +24,8 @@ const base = args[1] || 'main' if (!message || !message.length) { console.error( `Specify a new commit message in quotes. Example:\n\nscript/${path.basename( - module.filename - )} "new commit"` + module.filename, + )} "new commit"`, ) process.exit() } diff --git a/script/check-github-github-links.js b/script/check-github-github-links.js index 1c24b484bfb3..6c59379f13a5 100755 --- a/script/check-github-github-links.js +++ b/script/check-github-github-links.js @@ -81,7 +81,7 @@ async function main(opts, args) { ...(await getPathsWithMatchingStrings(searchStrings, 'github', 'github', { cache: CACHE_SEARCHES, forceDownload: FORCE_DOWNLOAD, - })) + })), ) await fs.writeFile('/tmp/foundFiles.json', JSON.stringify(foundFiles, undefined, 2), 'utf-8') } @@ -92,7 +92,7 @@ async function main(opts, args) { !file.includes('test/') && !file.includes('app/views/') && !file.includes('config.') && - !file.includes('app/api/description/') + !file.includes('app/api/description/'), ) const docsLinksFiles = [] @@ -155,8 +155,8 @@ async function main(opts, args) { regexIndexOf( contents, /\n|"\)|{@email_tracking_params}|\^http|Ahttps|example|This|TODO"|[{}|"%><.,')* ]/, - startSearchIndex + 1 - ) + startSearchIndex + 1, + ), ) .trim() @@ -174,7 +174,7 @@ async function main(opts, args) { await fs.writeFile( '/tmp/docsLinksFiles.json', JSON.stringify(docsLinksFiles, undefined, 2), - 'utf-8' + 'utf-8', ) } const brokenLinks = [] @@ -200,7 +200,7 @@ async function main(opts, args) { throw error } } - }) + }), ) } diff --git a/script/content-migrations/add-ghec-to-schema.js b/script/content-migrations/add-ghec-to-schema.js index 6d0256a3881f..acda96430cce 100755 --- a/script/content-migrations/add-ghec-to-schema.js +++ b/script/content-migrations/add-ghec-to-schema.js @@ -78,7 +78,7 @@ All updated operations: ${updatedFilesAll.join('\r\n')} Updated operations with api.github.com removed (GHEC only): -${updatedFilesGHECOnly.join('\r\n')}` +${updatedFilesGHECOnly.join('\r\n')}`, ) }) console.log( @@ -86,5 +86,5 @@ console.log( ${notUpdated.length} Operations not updated ${updatedFilesAll.length} Operations updated ${updatedFilesGHECOnly.length} Operations with api.github.com removed (GHEC only) -Log file at ${logFile}` +Log file at ${logFile}`, ) diff --git a/script/content-migrations/comment-on-open-prs.js b/script/content-migrations/comment-on-open-prs.js index 378a7466cfea..60c0453bdde2 100755 --- a/script/content-migrations/comment-on-open-prs.js +++ b/script/content-migrations/comment-on-open-prs.js @@ -51,6 +51,6 @@ async function main() { openPullNumbers.map(async (pullNumber) => { await createIssueComment(options.owner, options.repo, pullNumber, comment) console.log(`Added a comment to PR #${pullNumber}`) - }) + }), ) } diff --git a/script/content-migrations/use-short-versions.js b/script/content-migrations/use-short-versions.js index aa238ab46559..4c5af1e4f6ee 100755 --- a/script/content-migrations/use-short-versions.js +++ b/script/content-migrations/use-short-versions.js @@ -63,7 +63,7 @@ async function main() { // Find the relevant version from the master list so we can access the short name. const versionObj = allVersionKeys.find( - (version) => version.plan === plan || version.shortName === plan + (version) => version.plan === plan || version.shortName === plan, ) if (!versionObj) { console.error(`can't find supported version for ${plan}`) @@ -107,7 +107,7 @@ main().then( (err) => { console.error(err) process.exit(1) - } + }, ) // Convenience function to help with readability by removing this large but unneded property. @@ -150,7 +150,7 @@ function getLiquidReplacements(content, file) { tokens .filter( (token) => - (token.name === 'if' || token.name === 'elsif') && token.content.includes('currentVersion') + (token.name === 'if' || token.name === 'elsif') && token.content.includes('currentVersion'), ) .map((token) => token.content) .forEach((token) => { @@ -198,7 +198,7 @@ function getLiquidReplacements(content, file) { const newOperator = operatorsMap[operator] if (!newOperator) { console.error( - `Couldn't find an operator that corresponds to ${operator} in "${token} in "${file}` + `Couldn't find an operator that corresponds to ${operator} in "${token} in "${file}`, ) process.exit(1) } diff --git a/script/copy-fixture-data.js b/script/copy-fixture-data.js index 86c02c9416c7..65aafbb90b7b 100755 --- a/script/copy-fixture-data.js +++ b/script/copy-fixture-data.js @@ -95,8 +95,8 @@ async function main(opts) { '\n', chalk.yellow( 'Run this script again without --check to make all fixture data files up-to-date. ' + - 'Then commit and check in.' - ) + 'Then commit and check in.', + ), ) } diff --git a/script/deployment/purge-edge-cache.js b/script/deployment/purge-edge-cache.js index 8fe93dcd87ce..699fe9ef1d74 100644 --- a/script/deployment/purge-edge-cache.js +++ b/script/deployment/purge-edge-cache.js @@ -33,7 +33,7 @@ export default async function purgeEdgeCache( purgeTwice = true, delayBeforeFirstPurge = DELAY_BEFORE_FIRST_PURGE, delayBeforeSecondPurge = DELAY_BEFORE_SECOND_PURGE, - } = {} + } = {}, ) { if (!surrogateKey) { throw new Error('No key set and/or no FASTLY_SURROGATE_KEY env var set') diff --git a/script/dev-toc/generate.js b/script/dev-toc/generate.js index f390b25edcec..0962f8af6a8f 100755 --- a/script/dev-toc/generate.js +++ b/script/dev-toc/generate.js @@ -20,7 +20,7 @@ program .description('Generate a local TOC of the docs website and open it in your browser') .option( '-o, --openSections [product-ids...]', - 'open sections for one or more product IDs by default (e.g., "-o codespaces pull-requests")' + 'open sections for one or more product IDs by default (e.g., "-o codespaces pull-requests")', ) .parse(process.argv) diff --git a/script/find-orphaned-assets.js b/script/find-orphaned-assets.js index 5d89d833efa3..efb9f19882a0 100755 --- a/script/find-orphaned-assets.js +++ b/script/find-orphaned-assets.js @@ -73,14 +73,14 @@ async function main(opts) { // When the English content renames something, you later end up with // 2 files in each translation repo. const englishRelativeFiles = new Set( - englishFiles.map((englishFile) => path.relative(languages.en.dir, englishFile)) + englishFiles.map((englishFile) => path.relative(languages.en.dir, englishFile)), ) for (const [language, { dir }] of Object.entries(languages)) { if (language !== 'en') { if (!fs.existsSync(dir)) { throw new Error( `${dir} does not exist. ` + - 'Get around this by using the flag `--exclude-translations`. Or set up the TRANSLATION_ROOT.' + 'Get around this by using the flag `--exclude-translations`. Or set up the TRANSLATION_ROOT.', ) } const languageFiles = [] @@ -88,8 +88,8 @@ async function main(opts) { languageFiles.push(...walkFiles(path.join(dir, 'data'), ['.md', '.yml'])) sourceFiles.push( ...languageFiles.filter((languageFile) => - englishRelativeFiles.has(path.relative(dir, languageFile)) - ) + englishRelativeFiles.has(path.relative(dir, languageFile)), + ), ) } } @@ -113,9 +113,9 @@ async function main(opts) { { globs: ['!**/*.+(png|jpe?g|csv|graphql|json|svg)'], }, - walkOptions - ) - ) + walkOptions, + ), + ), ) } // Add exceptions @@ -130,9 +130,9 @@ async function main(opts) { { globs: ['!**/*.+(md)'], }, - walkOptions - ) - ).filter((filePath) => !filePath.endsWith('.md')) + walkOptions, + ), + ).filter((filePath) => !filePath.endsWith('.md')), ) verbose && console.log(`${allImages.size.toLocaleString()} images found in total.`) diff --git a/script/helpers/get-liquid-conditionals.js b/script/helpers/get-liquid-conditionals.js index d2f506483390..b8c7711735cf 100644 --- a/script/helpers/get-liquid-conditionals.js +++ b/script/helpers/get-liquid-conditionals.js @@ -74,7 +74,7 @@ function groupTokens(tokens, tagName, endTagName, newArray = []) { const startIndex = tokens.findIndex((token) => token.conditional === tagName) // The end tag name is currently in a separate token, but we want to group it with the start tag and content. const endIndex = tokens.findIndex( - (token, index) => token.conditional === endTagName && index > startIndex + (token, index) => token.conditional === endTagName && index > startIndex, ) // Once all tags are grouped and removed from `tokens`, this findIndex will not find anything, // so we can return the grouped result at this point. @@ -88,7 +88,7 @@ function groupTokens(tokens, tagName, endTagName, newArray = []) { endIndex, tagName, endTagName, - tokens + tokens, ) // Combine the text of the groups so it's all together. diff --git a/script/helpers/git-utils.js b/script/helpers/git-utils.js index af331826054c..e44e17c3a6fa 100644 --- a/script/helpers/git-utils.js +++ b/script/helpers/git-utils.js @@ -141,7 +141,7 @@ export async function getPathsWithMatchingStrings( strArr, org, repo, - { cache = true, forceDownload = false } = {} + { cache = true, forceDownload = false } = {}, ) { const perPage = 100 const paths = new Set() @@ -229,7 +229,7 @@ async function secondaryRateLimitRetry(callable, args, maxAttempts = 10, sleepTi console.warn( `Got secondary rate limit blocked. Sleeping for ${ sleepTime / 1000 - } seconds. (attempts left: ${maxAttempts})` + } seconds. (attempts left: ${maxAttempts})`, ) return new Promise((resolve) => { setTimeout(() => { diff --git a/script/helpers/retry-on-error-test.js b/script/helpers/retry-on-error-test.js index f929d4b80ae0..3384ee65986b 100644 --- a/script/helpers/retry-on-error-test.js +++ b/script/helpers/retry-on-error-test.js @@ -25,7 +25,7 @@ const sleep = (ms) => new Promise((resolve) => setTimeout(resolve, ms)) export async function retryOnErrorTest( errorTest, callback, - { attempts = 10, sleepTime = 1000, onError = () => {} } = {} + { attempts = 10, sleepTime = 1000, onError = () => {} } = {}, ) { while (--attempts) { try { diff --git a/script/i18n/test-html-pages.js b/script/i18n/test-html-pages.js index d514e0a54ec1..57b55d162e16 100755 --- a/script/i18n/test-html-pages.js +++ b/script/i18n/test-html-pages.js @@ -48,7 +48,7 @@ async function main() { for (const language of languageCodes) { for (const version of versions) { const pages = allPages.filter( - (page) => page.languageCode === language && page.applicableVersions.includes(version) + (page) => page.languageCode === language && page.applicableVersions.includes(version), ) const permalinks = pages diff --git a/script/list-image-sizes.js b/script/list-image-sizes.js index 6fd24c1f0fcc..974c748dd021 100755 --- a/script/list-image-sizes.js +++ b/script/list-image-sizes.js @@ -26,7 +26,7 @@ const infos = await Promise.all( const { width, height } = await image.metadata() const size = width * height return { relativePath, width, height, size } - }) + }), ) const images = files .map((relativePath, i) => { diff --git a/script/move-category-to-product.js b/script/move-category-to-product.js index d761cadf679c..f76431630739 100755 --- a/script/move-category-to-product.js +++ b/script/move-category-to-product.js @@ -22,7 +22,7 @@ program .description('Move a category-level docs set to the product level.') .requiredOption( '-c, --category <PATH>', - 'Provide the path of the existing category, e.g., github/github-pages' + 'Provide the path of the existing category, e.g., github/github-pages', ) .requiredOption('-p, --product <PATH>', 'Provide the path of the new product, e.g., pages') .parse(process.argv) @@ -69,11 +69,11 @@ async function main() { const oldProductTocPath = path.posix.join(oldProductPath, 'index.md') const productToc = frontmatter(fs.readFileSync(oldProductTocPath, 'utf8')) productToc.data.children = productToc.data.children.filter( - (child) => child !== `/${oldCategoryId}` + (child) => child !== `/${oldCategoryId}`, ) fs.writeFileSync( oldProductTocPath, - frontmatter.stringify(productToc.content, productToc.data, { lineWidth: 10000 }) + frontmatter.stringify(productToc.content, productToc.data, { lineWidth: 10000 }), ) // Add the new product to the homepage TOC. @@ -82,7 +82,7 @@ async function main() { homepageToc.data.children.push(newProduct) fs.writeFileSync( homepage, - frontmatter.stringify(homepageToc.content, homepageToc.data, { lineWidth: 10000 }) + frontmatter.stringify(homepageToc.content, homepageToc.data, { lineWidth: 10000 }), ) console.log(`Moved ${oldCategory} files to ${newProduct}, added redirects, and updated TOCs!`) diff --git a/script/move-content.js b/script/move-content.js index d2573e5b764d..4be14ab3d5f1 100755 --- a/script/move-content.js +++ b/script/move-content.js @@ -43,7 +43,7 @@ program .option('-v, --verbose', 'Verbose outputs') .option( '--no-git', - "DON'T use 'git mv' and 'git commit' to move the file. Just regular file moves." + "DON'T use 'git mv' and 'git commit' to move the file. Just regular file moves.", ) .option('--undo', 'Reverse of moving. I.e. moving it back. Only applies to the last run.') .arguments('old', 'old file or folder name') @@ -56,7 +56,7 @@ async function main(opts, nameTuple) { const { verbose, undo } = opts if (nameTuple.length !== 2) { console.error( - chalk.red(`Must be exactly 2 file paths as arguments. Not ${nameTuple.length} arguments.`) + chalk.red(`Must be exactly 2 file paths as arguments. Not ${nameTuple.length} arguments.`), ) process.exit(1) } @@ -162,8 +162,8 @@ async function main(opts, nameTuple) { if (verbose) { console.log( chalk.yellow( - 'To undo (reverse) what you just did, run the same exact command but with --undo added to the end' - ) + 'To undo (reverse) what you just did, run the same exact command but with --undo added to the end', + ), ) } } @@ -178,8 +178,8 @@ function validateFileInputs(oldPath, newPath, isFolder) { if (oldBase !== newBase && !existsAndIsDirectory(newBase)) { console.error( chalk.red( - `When moving a directory, both bases need to be the same. '${oldBase}' != '${newBase}'` - ) + `When moving a directory, both bases need to be the same. '${oldBase}' != '${newBase}'`, + ), ) console.warn(chalk.yellow(`Only the name (e.g. '${oldName}') can be different.`)) process.exit(1) @@ -198,13 +198,13 @@ function validateFileInputs(oldPath, newPath, isFolder) { } if (path.basename(oldPath) === 'index.md') { console.error( - chalk.red(`File path can't be 'index.md'. Refer to it by its foldername instead.`) + chalk.red(`File path can't be 'index.md'. Refer to it by its foldername instead.`), ) process.exit(1) } if (path.basename(newPath) === 'index.md') { console.error( - chalk.red(`File path can't be 'index.md'. Refer to it by its foldername instead.`) + chalk.red(`File path can't be 'index.md'. Refer to it by its foldername instead.`), ) process.exit(1) } @@ -350,7 +350,7 @@ function removeFromChildren(oldPath, opts) { fs.writeFileSync( parentFilePath, readFrontmatter.stringify(content, data, { lineWidth: 10000 }), - 'utf-8' + 'utf-8', ) if (verbose) { console.log(`Removed 'children' (${oldName}) key in ${parentFilePath}`) @@ -397,7 +397,7 @@ function addToChildren(newPath, positions, opts) { fs.writeFileSync( parentFilePath, readFrontmatter.stringify(content, data, { lineWidth: 10000 }), - 'utf-8' + 'utf-8', ) if (verbose) { console.log(`Added 'children' (${newName}) key in ${parentFilePath}`) @@ -469,7 +469,7 @@ function editFiles(files, updateParent, opts) { fs.writeFileSync( newPath, readFrontmatter.stringify(content, data, { lineWidth: 10000 }), - 'utf-8' + 'utf-8', ) if (verbose) { console.log(`Added ${oldHref} to 'redirects_from' in ${newPath}`) @@ -513,7 +513,7 @@ function undoFiles(files, updateParent, opts) { fs.writeFileSync( newPath, readFrontmatter.stringify(content, data, { lineWidth: 10000 }), - 'utf-8' + 'utf-8', ) if (updateParent) { addToChildren(newPath, removeFromChildren(oldPath, opts), opts) diff --git a/script/prevent-pushes-to-main.js b/script/prevent-pushes-to-main.js index 9dc69e3b7773..3dee8071ff00 100644 --- a/script/prevent-pushes-to-main.js +++ b/script/prevent-pushes-to-main.js @@ -15,11 +15,11 @@ const currentBranch = execSync('git symbolic-ref --short HEAD', { encoding: 'utf if (currentBranch === productionBranch) { console.error('') console.error( - `🤚 Whoa! Pushing to the ${productionBranch} branch has been disabled to prevent accidental deployments to production.` + `🤚 Whoa! Pushing to the ${productionBranch} branch has been disabled to prevent accidental deployments to production.`, ) console.error('') console.error( - "If you're aware of the risks and really want to push to this branch, add --no-verify to bypass this check." + "If you're aware of the risks and really want to push to this branch, add --no-verify to bypass this check.", ) console.error('') process.exit(1) diff --git a/script/purge-fastly-by-url.js b/script/purge-fastly-by-url.js index eb84d42db265..4a885fb197cd 100755 --- a/script/purge-fastly-by-url.js +++ b/script/purge-fastly-by-url.js @@ -22,12 +22,12 @@ const purgeCommand = 'curl -s -X PURGE -H "Fastly-Soft-Purge:1"' program .description( - 'Purge the Fastly cache for a single URL or a batch of URLs in a file, plus all language variants of the given URL(s).' + 'Purge the Fastly cache for a single URL or a batch of URLs in a file, plus all language variants of the given URL(s).', ) .option('-s, --single <URL>', `provide a single ${requiredUrlPrefix} URL`) .option( '-b, --batch <FILE>', - `provide a path to a file containing a list of ${requiredUrlPrefix} URLs` + `provide a path to a file containing a list of ${requiredUrlPrefix} URLs`, ) .option('-d, --dry-run', 'print URLs to be purged without actually purging') .parse(process.argv) @@ -44,7 +44,7 @@ if (!singleUrl && !batchFile) { if (singleUrl && !singleUrl.startsWith(requiredUrlPrefix)) { console.error( - `error: cannot purge ${singleUrl} because URLs must start with ${requiredUrlPrefix}.\n` + `error: cannot purge ${singleUrl} because URLs must start with ${requiredUrlPrefix}.\n`, ) process.exit(1) } @@ -70,7 +70,7 @@ if (batchFile) { .forEach((url) => { if (!url.startsWith(requiredUrlPrefix)) { console.error( - `error: cannot purge ${url} because URLs must start with ${requiredUrlPrefix}.\n` + `error: cannot purge ${url} because URLs must start with ${requiredUrlPrefix}.\n`, ) process.exit(1) } diff --git a/script/reconcile-category-dirs-with-ids.js b/script/reconcile-category-dirs-with-ids.js index c397f73e09ed..677014454ab0 100755 --- a/script/reconcile-category-dirs-with-ids.js +++ b/script/reconcile-category-dirs-with-ids.js @@ -84,7 +84,7 @@ Redirect: "${redirectPath}" // Figure out redirect path const articlePathMinusExtension = path.join( categoryDirPath, - path.basename(articleFileName, '.md') + path.basename(articleFileName, '.md'), ) const redirectArticlePath = '/' + slash(path.relative(contentDir, articlePathMinusExtension)) @@ -110,7 +110,7 @@ Redirect: "${redirectArticlePath}" // Update the article file on disk fs.writeFileSync( articlePath, - frontmatter.stringify(articleContent, articleData, { lineWidth: 10000 }) + frontmatter.stringify(articleContent, articleData, { lineWidth: 10000 }), ) } @@ -123,11 +123,11 @@ Redirect: "${redirectArticlePath}" const { data: productIndexData, content: productIndex } = frontmatter(productIndexContents) const revisedProductIndex = productIndex.replace( new RegExp(`(\\s+)(?:/${categoryDirName})(\\s+)`, 'g'), - `$1/${expectedSlug}$2` + `$1/${expectedSlug}$2`, ) fs.writeFileSync( productIndexPath, - frontmatter.stringify(revisedProductIndex, productIndexData, { lineWidth: 10000 }) + frontmatter.stringify(revisedProductIndex, productIndexData, { lineWidth: 10000 }), ) console.log(`*** Updated product index "${productIndexPath}" for ☝️\n`) diff --git a/script/reconcile-filenames-with-ids.js b/script/reconcile-filenames-with-ids.js index 2cc07c6c65ef..629608f2cf5b 100755 --- a/script/reconcile-filenames-with-ids.js +++ b/script/reconcile-filenames-with-ids.js @@ -25,7 +25,7 @@ const contentDir = path.join(process.cwd(), 'content') const contentFiles = walk(contentDir, { includeBasePath: true, directories: false }).filter( (file) => { return file.endsWith('.md') && !file.endsWith('index.md') && !file.includes('README') - } + }, ) // TODO fix path separators in the redirect diff --git a/script/rendered-content-link-checker.js b/script/rendered-content-link-checker.js index f56ad5566b8c..2bdd45e32b7f 100755 --- a/script/rendered-content-link-checker.js +++ b/script/rendered-content-link-checker.js @@ -31,8 +31,8 @@ program .addOption( new Option( '-L, --level <LEVEL>', - 'Level of broken link to be marked as a flaw (default: "warning")' - ).choices(['all', 'warning', 'critical']) + 'Level of broken link to be marked as a flaw (default: "warning")', + ).choices(['all', 'warning', 'critical']), ) .option('-f, --filter <FILTER...>', 'Search filter(s) on the paths') .option( @@ -46,36 +46,36 @@ program } } throw new InvalidArgumentError( - `'${version}' is not a recognized version. (not one of ${Object.keys(allVersions)})` + `'${version}' is not a recognized version. (not one of ${Object.keys(allVersions)})`, ) } return version - } + }, ) .option('-v, --verbose', 'Verbose outputs') .option( '--create-report', - 'Create a report issue in report-repository if there are flaws. (default: false)' + 'Create a report issue in report-repository if there are flaws. (default: false)', ) .option( '--report-repository <REPOSITORY>', - 'Repository to create issue in. (default: "github/docs-content")' + 'Repository to create issue in. (default: "github/docs-content")', ) .option( '--link-reports', - 'If comments should be made on previous report and new report "linking" them. (default: false)' + 'If comments should be made on previous report and new report "linking" them. (default: false)', ) .option( '--report-author <AUTHOR>', - 'Previous author of report PR for linking. (default: "docs-bot")' + 'Previous author of report PR for linking. (default: "docs-bot")', ) .option( '--report-label <LABEL>', - 'Label to assign to report issue. (default: "broken link report")' + 'Label to assign to report issue. (default: "broken link report")', ) .option( '--comment-on-pr <URI>', - 'For debugging. Comment on a PR in form "owner/repo-name:pr_number"' + 'For debugging. Comment on a PR in form "owner/repo-name:pr_number"', ) .option('--should-comment', 'Comments failed links on PR') .option('--check-anchors', "Validate links that start with a '#' too") @@ -113,7 +113,7 @@ program } return resolvedPath - } + }, ) .arguments('[files...]', 'Specific files to check') .parse(process.argv) @@ -147,5 +147,5 @@ renderedContentLinkChecker( { ...opts, files, - } + }, ) diff --git a/script/standardize-frontmatter-order.js b/script/standardize-frontmatter-order.js index f61885c00e83..8c0f4865a0c0 100755 --- a/script/standardize-frontmatter-order.js +++ b/script/standardize-frontmatter-order.js @@ -28,7 +28,7 @@ const properties = Object.keys(schema.properties) const contentDir = path.join(__dirname, '../content') const contentFiles = walk(contentDir, { includeBasePath: true }).filter( - (relativePath) => relativePath.endsWith('.md') && !relativePath.includes('README') + (relativePath) => relativePath.endsWith('.md') && !relativePath.includes('README'), ) contentFiles.forEach((fullPath) => { diff --git a/script/start-server-for-jest.js b/script/start-server-for-jest.js index 6731ff3fa0a9..921184ee6ebc 100755 --- a/script/start-server-for-jest.js +++ b/script/start-server-for-jest.js @@ -15,7 +15,7 @@ export default async () => { if (await isPortRunning()) { console.error(`Something's already running on :${PORT}`) console.log( - 'If you intend to run jest tests with an existing server, set env var START_JEST_SERVER=false' + 'If you intend to run jest tests with an existing server, set env var START_JEST_SERVER=false', ) process.exit(1) } diff --git a/script/toggle-ghae-feature-flags.js b/script/toggle-ghae-feature-flags.js index 145115c07719..476cfb98785a 100755 --- a/script/toggle-ghae-feature-flags.js +++ b/script/toggle-ghae-feature-flags.js @@ -30,7 +30,7 @@ program 'Documentation: https://github.com/github/docs-content/blob/main/docs-content-docs/docs-content-workflows/content-creation/versioning-documentation.md#internal-versioning-conventions-for-github-ae\n\n' + 'Examples:\n' + ` ${scriptName} -f 'issue-1234, issue-5678'\n` + - ` ${scriptName} -f 'issue-1234' -c '3.5'` + ` ${scriptName} -f 'issue-1234' -c '3.5'`, ) .option('-s, --show-flags', 'show list of existing flags') .option("-f, --toggle-flags '<flag-1>[,flag-2,...]'", 'toggle comma-separated list of flags') @@ -77,7 +77,7 @@ if (options.toggleFlags) { // Refuse to proceed if repository has uncommitted changes. const localChangesCount = execSync( - `git status ${contentDir} ${reusablesDir} ${dataDir} --porcelain=v1 2>/dev/null | wc -l` + `git status ${contentDir} ${reusablesDir} ${dataDir} --porcelain=v1 2>/dev/null | wc -l`, ).toString() if (localChangesCount > 0) { @@ -91,7 +91,7 @@ if (options.toggleFlags) { if (options.comparativeReplacement) { if (!options.comparativeReplacement.match(/\d\.\d+/)) { console.log( - `Error: you specified ${options.comparativeReplacement} for comparative replacement (must be #.# or #.##)` + `Error: you specified ${options.comparativeReplacement} for comparative replacement (must be #.# or #.##)`, ) process.exit(1) } @@ -108,7 +108,7 @@ if (options.comparativeReplacement) { const liquidVersion = options.comparativeReplacement.split('.', 2) if (liquidVersion[1] === '0') { console.log( - `Error: you specified ${options.comparativeReplacement} for comparative replacement (can't be #.0)` + `Error: you specified ${options.comparativeReplacement} for comparative replacement (can't be #.0)`, ) process.exit(1) } else { @@ -177,14 +177,14 @@ allFiles.forEach((file) => { if (deduplicatedLiquidMatches.length > 0) { matches.push( ...deduplicatedLiquidMatches.map((match) => - match.trim().replace(`${plan}: `, '').replace(/['"]+/g, '') - ) + match.trim().replace(`${plan}: `, '').replace(/['"]+/g, ''), + ), ) } if (deduplicatedVersionMatches.length > 0) { matches.push( - ...deduplicatedVersionMatches.map((match) => match.trim().replace(plan + '-', '')) + ...deduplicatedVersionMatches.map((match) => match.trim().replace(plan + '-', '')), ) } } else { @@ -208,8 +208,8 @@ if (options.showFlags) { console.log( `\n🚩 \x1b[7m ${plan}-${flag} \x1b[0m \x1b[1m\x1b[34m\x1b[4m${flag.replace( 'issue-', - 'https://github.com/github/docs-content/issues/' - )}\x1b[0m` + 'https://github.com/github/docs-content/issues/', + )}\x1b[0m`, ) } else { console.log(`\n🚩 \x1b[43m ${plan}-${flag} \x1b[0m`) @@ -256,7 +256,7 @@ if (options.showFlags) { newContent = fileContent.replace( yamlReplacementRegExp, - `${plan}: '${replacementYAMLValue}'` + `${plan}: '${replacementYAMLValue}'`, ) // Update versions in Liquid conditionals. @@ -284,7 +284,7 @@ if (options.showFlags) { if (flag.match(/^issue-[0-9]+$/)) { commitCommand = `${commitCommand} -m 'For ${flag.replace( 'issue-', - 'github/docs-content#' + 'github/docs-content#', )}'` } diff --git a/script/update-internal-links.js b/script/update-internal-links.js index 6677b317f7c5..42cef77ae4fe 100755 --- a/script/update-internal-links.js +++ b/script/update-internal-links.js @@ -67,7 +67,7 @@ async function main(files, opts) { actualFiles.push( ...walkFiles(file, ['.md', '.yml']).filter((p) => { return !excludeFilePaths.has(p) - }) + }), ) } else if (!excludeFilePaths.has(file)) { actualFiles.push(file) @@ -125,7 +125,7 @@ async function main(files, opts) { differentContent ? chalk.dim(`${replacements.length} change${replacements.length !== 1 ? 's' : ''}`) : '', - differentData ? chalk.dim('different data') : '' + differentData ? chalk.dim('different data') : '', ) for (const { asMarkdown, newAsMarkdown, line, column } of replacements) { console.log(' ', chalk.red(asMarkdown)) @@ -145,7 +145,7 @@ async function main(files, opts) { fs.writeFileSync( file, frontmatter.stringify(newContent, newData, { lineWidth: 10000 }), - 'utf-8' + 'utf-8', ) } } @@ -168,18 +168,18 @@ async function main(files, opts) { console.log('Number of files checked:'.padEnd(30), chalk.bold(countFiles.toLocaleString())) console.log( 'Number of files changed:'.padEnd(30), - chalk.bold(countChangedFiles.toLocaleString()) + chalk.bold(countChangedFiles.toLocaleString()), ) console.log( 'Sum number of replacements:'.padEnd(30), - chalk.bold(countReplacements.toLocaleString()) + chalk.bold(countReplacements.toLocaleString()), ) const countWarnings = results.reduce((prev, next) => prev + next.warnings.length, 0) const countWarningFiles = new Set(results.filter((result) => result.warnings.length > 0)).size console.log( 'Number of files with warnings:'.padEnd(30), - chalk.bold(countWarningFiles.toLocaleString()) + chalk.bold(countWarningFiles.toLocaleString()), ) console.log('Sum number of warnings:'.padEnd(30), chalk.bold(countWarnings.toLocaleString())) @@ -313,8 +313,8 @@ function countByTree(results) { const indentationPad = indentation ? `${' '.repeat(indentation)} ↳ ` : '' console.log( `${indentationPad}${last.padEnd(padding - indentationPad.length)} ${String( - files[each] - ).padEnd(col1.length)} ${changes[each]}` + files[each], + ).padEnd(col1.length)} ${changes[each]}`, ) } } diff --git a/script/update-readme.js b/script/update-readme.js index a6fae25eb249..cce9256fc067 100755 --- a/script/update-readme.js +++ b/script/update-readme.js @@ -28,7 +28,7 @@ const ignoreList = ['README.md'] const scriptsToRuleThemAll = ['bootstrap', 'server', 'test'] const allScripts = walk(__dirname, { directories: false }).filter((script) => - ignoreList.every((ignoredPath) => !script.includes(ignoredPath)) + ignoreList.every((ignoredPath) => !script.includes(ignoredPath)), ) const otherScripts = difference(allScripts, scriptsToRuleThemAll) diff --git a/script/update-tocs.js b/script/update-tocs.js index ddf757f3acc9..761da1e0bce5 100755 --- a/script/update-tocs.js +++ b/script/update-tocs.js @@ -30,7 +30,7 @@ if (!fs.existsSync(directory)) { updateOrCreateToc(directory) console.log( - 'Done! Review the new or updated index.md files and update the 1) order of the children 2) versions as needed' + 'Done! Review the new or updated index.md files and update the 1) order of the children 2) versions as needed', ) function updateOrCreateToc(directory) { diff --git a/script/validate-asset-images.js b/script/validate-asset-images.js index 87dc4cc93a82..1481ca3b407c 100755 --- a/script/validate-asset-images.js +++ b/script/validate-asset-images.js @@ -69,14 +69,14 @@ async function main(opts) { basename !== 'README.md' && !filePath.startsWith(EXCLUDE_DIR) ) - } + }, ) const results = (await Promise.all(files.map(checkFile))).filter(Boolean) for (const [level, filePath, error] of results) { console.log( level === CRITICAL ? chalk.red(level) : chalk.yellow(level), chalk.bold(path.relative(ROOT, filePath)), - error + error, ) if (level === CRITICAL) { errors++ diff --git a/script/warmup-remotejson.js b/script/warmup-remotejson.js index 5ae39cd8b355..b87e6879817e 100755 --- a/script/warmup-remotejson.js +++ b/script/warmup-remotejson.js @@ -30,7 +30,7 @@ import { program .description( - "Visit a bunch of archived redirects.json URLs to warm up getRemoteJSON's disk cache" + "Visit a bunch of archived redirects.json URLs to warm up getRemoteJSON's disk cache", ) .parse(process.argv) @@ -39,7 +39,7 @@ main() function version2url(version) { const inBlobStorage = semver.gte( semver.coerce(version).raw, - semver.coerce(firstReleaseStoredInBlobStorage).raw + semver.coerce(firstReleaseStoredInBlobStorage).raw, ) return inBlobStorage ? `https://githubdocs.azureedge.net/enterprise/${version}/redirects.json` @@ -49,7 +49,7 @@ function version2url(version) { function withArchivedRedirectsFile(version) { return semver.eq( semver.coerce(version).raw, - semver.coerce(lastVersionWithoutArchivedRedirectsFile).raw + semver.coerce(lastVersionWithoutArchivedRedirectsFile).raw, ) } diff --git a/src/automated-pipelines/components/AutomatedPageContext.tsx b/src/automated-pipelines/components/AutomatedPageContext.tsx index 79a0093a730e..61d3320c4532 100644 --- a/src/automated-pipelines/components/AutomatedPageContext.tsx +++ b/src/automated-pipelines/components/AutomatedPageContext.tsx @@ -17,7 +17,7 @@ export const useAutomatedPageContext = (): AutomatedPageContextT => { if (!context) { throw new Error( - '"useAutomatedPageContext" may only be used inside "AutomatedPageContext.Provider"' + '"useAutomatedPageContext" may only be used inside "AutomatedPageContext.Provider"', ) } diff --git a/src/automated-pipelines/components/parameter-table/ParameterRow.tsx b/src/automated-pipelines/components/parameter-table/ParameterRow.tsx index 4c8c315cc125..a9cb57a90cd0 100644 --- a/src/automated-pipelines/components/parameter-table/ParameterRow.tsx +++ b/src/automated-pipelines/components/parameter-table/ParameterRow.tsx @@ -56,7 +56,7 @@ export function ParameterRow({ <div className={cx( 'pl-0 pt-1 pr-1 pb-1', - `${rowIndex > 0 && isChild ? 'pt-3 border-top color-border-muted' : ''}` + `${rowIndex > 0 && isChild ? 'pt-3 border-top color-border-muted' : ''}`, )} > <div> diff --git a/src/automated-pipelines/lib/update-markdown.js b/src/automated-pipelines/lib/update-markdown.js index c356bcd04120..6aee9807d77f 100644 --- a/src/automated-pipelines/lib/update-markdown.js +++ b/src/automated-pipelines/lib/update-markdown.js @@ -56,7 +56,7 @@ async function getAutogeneratedFiles(targetDirectory, autogeneratedType) { if (data.autogenerated === autogeneratedType) { return file } - }) + }), ) ).filter(Boolean) } @@ -85,7 +85,7 @@ async function updateMarkdownFile( file, sourceData, sourceContent, - commentDelimiter = MARKDOWN_COMMENT + commentDelimiter = MARKDOWN_COMMENT, ) { if (existsSync(file)) { // update only the versions property of the file, assuming @@ -130,7 +130,7 @@ async function updateMarkdownFile( async function updateDirectory( directory, frontmatter, - { rootDirectoryOnly = false, shortTitle = false, indexOrder = {} } = {} + { rootDirectoryOnly = false, shortTitle = false, indexOrder = {} } = {}, ) { const initialDirectoryListing = await getDirectoryInfo(directory) // If there are no children on disk, remove the directory @@ -144,7 +144,7 @@ async function updateDirectory( await Promise.all( initialDirectoryListing.childDirectories.map(async (subDirectory) => { await updateDirectory(`${directory}/${subDirectory}`, frontmatter, { indexOrder }) - }) + }), ) } @@ -158,7 +158,7 @@ async function updateDirectory( const { childrenOnDisk, indexChildren } = getChildrenToCompare( indexFile, directoryContents, - data.children + data.children, ) const itemsToAdd = difference(childrenOnDisk, indexChildren) @@ -183,7 +183,7 @@ async function updateDirectory( { itemsToAdd, itemsToRemove }, indexFile, indexOrder, - isRootIndexFile(indexFile) + isRootIndexFile(indexFile), ) await writeFile(indexFile, matter.stringify(content, dataUpdatedChildren)) @@ -303,7 +303,7 @@ async function getIndexFileVersions(directory, files) { const filepath = path.join(directory, file) if (!existsSync(filepath)) { throw new Error( - `File ${filepath} does not exist while assembling directory index.md files to create parent version.` + `File ${filepath} does not exist while assembling directory index.md files to create parent version.`, ) } const { data } = matter(await readFile(filepath, 'utf-8')) @@ -312,7 +312,7 @@ async function getIndexFileVersions(directory, files) { } const fmVersions = getApplicableVersions(data.versions) fmVersions.forEach((version) => versions.add(version)) - }) + }), ) const versionArray = [...versions] return await convertVersionsToFrontmatter(versionArray) @@ -437,11 +437,11 @@ async function getDirectoryInfo(directory) { throw new Error(`Directory ${directory} did not exist when attempting to get directory info.`) } const directoryContents = (await readdir(directory)).filter( - (file) => file !== 'README.md' && file !== 'index.md' + (file) => file !== 'README.md' && file !== 'index.md', ) const childDirectories = directoryContents.filter((item) => - lstatSync(`${directory}/${item}`).isDirectory() + lstatSync(`${directory}/${item}`).isDirectory(), ) const directoryFiles = difference(directoryContents, childDirectories) diff --git a/src/automated-pipelines/tests/frontmatter-versions.js b/src/automated-pipelines/tests/frontmatter-versions.js index 74fabadeb826..9f9ab0e756fb 100644 --- a/src/automated-pipelines/tests/frontmatter-versions.js +++ b/src/automated-pipelines/tests/frontmatter-versions.js @@ -9,13 +9,13 @@ describe('frontmatter versions are generated correctly from automated data', () const fromVersions = allVersionKeys.filter( (version) => version !== `enterprise-server@${supported[0]}` && - version !== `enterprise-server@${supported[2]}` + version !== `enterprise-server@${supported[2]}`, ) const expectedEneterpriseServerVersions = fromVersions .map( (version) => - version.includes('enterprise-server@') && version.replace('enterprise-server@', '') + version.includes('enterprise-server@') && version.replace('enterprise-server@', ''), ) .filter(Boolean) @@ -38,7 +38,7 @@ describe('frontmatter versions are generated correctly from automated data', () const fromVersions = Object.values(allVersions) .filter( (version) => - !(version.currentRelease === version.latestRelease && version.hasNumberedReleases) + !(version.currentRelease === version.latestRelease && version.hasNumberedReleases), ) .map((version) => version.version) const nextLatestRelease = [...supported].sort()[supported.length - 2] diff --git a/src/automated-pipelines/tests/rendering.js b/src/automated-pipelines/tests/rendering.js index a8208241db06..2ace18effe7d 100644 --- a/src/automated-pipelines/tests/rendering.js +++ b/src/automated-pipelines/tests/rendering.js @@ -20,7 +20,7 @@ describe('autogenerated docs render', () => { // So we allow a few retries to avoid false positives. const res = await get(url, { retries: 3 }) return [url, res.statusCode] - }) + }), ) for (const [url, status] of statusCodes) { diff --git a/src/automated-pipelines/tests/update-markdown.js b/src/automated-pipelines/tests/update-markdown.js index d3cc15b0addc..7c18fa74b887 100644 --- a/src/automated-pipelines/tests/update-markdown.js +++ b/src/automated-pipelines/tests/update-markdown.js @@ -68,7 +68,7 @@ describe('automated content directory updates', () => { // full file path. const contentDataFullPath = {} Object.keys(newContentData).forEach( - (key) => (contentDataFullPath[path.join(targetDirectory, key)] = newContentData[key]) + (key) => (contentDataFullPath[path.join(targetDirectory, key)] = newContentData[key]), ) // Rewrites the content directory in the operating system's @@ -104,7 +104,7 @@ describe('automated content directory updates', () => { expect(alertsFileExists).toBe(true) const codeScanningIndexFileExists = existsSync( - `${tempDirectory}/content/rest/code-scanning/index.md` + `${tempDirectory}/content/rest/code-scanning/index.md`, ) expect(codeScanningIndexFileExists).toBe(true) }) @@ -112,26 +112,26 @@ describe('automated content directory updates', () => { test('rest/actions index file is updated as expected', async () => { // workflows added and artifacts removed const actionsIndex = matter( - await readFile(`${tempDirectory}/content/rest/actions/index.md`, 'utf8') + await readFile(`${tempDirectory}/content/rest/actions/index.md`, 'utf8'), ) expect(actionsIndex.data.children).toEqual(['/secrets', '/workflows']) }) test('non-target directory index files did not get changed', async () => { const overviewIndex = matter( - await readFile(`${tempDirectory}/content/rest/overview/index.md`, 'utf8') + await readFile(`${tempDirectory}/content/rest/overview/index.md`, 'utf8'), ) expect(overviewIndex.data.children).toEqual(['/apis']) const articleIndex = matter( - await readFile(`${tempDirectory}/content/articles/index.md`, 'utf8') + await readFile(`${tempDirectory}/content/articles/index.md`, 'utf8'), ) expect(articleIndex.data.children).toEqual(['/article']) }) test('new directory gets correct index file and parent index file updated', async () => { const codeScanningIndex = matter( - await readFile(`${tempDirectory}/content/rest/code-scanning/index.md`, 'utf8') + await readFile(`${tempDirectory}/content/rest/code-scanning/index.md`, 'utf8'), ) expect(codeScanningIndex.data.children).toEqual(['/alerts']) diff --git a/src/codeql-cli/scripts/convert-markdown-for-docs.js b/src/codeql-cli/scripts/convert-markdown-for-docs.js index 41eb4caec30e..4a5272065ab6 100644 --- a/src/codeql-cli/scripts/convert-markdown-for-docs.js +++ b/src/codeql-cli/scripts/convert-markdown-for-docs.js @@ -10,7 +10,7 @@ import { remove } from 'unist-util-remove' import { languageKeys } from '../../../lib/languages.js' const { targetDirectory, removeKeywords } = JSON.parse( - await readFile(path.join('src/codeql-cli/lib/config.json'), 'utf-8') + await readFile(path.join('src/codeql-cli/lib/config.json'), 'utf-8'), ) const RELATIVE_LINK_PATH = targetDirectory.replace('content', '') const LAST_PRIMARY_HEADING = 'Options' @@ -141,7 +141,7 @@ export async function convertContentToDocs(content, frontmatterDefaults = {}) { if (node.type === 'text' && node.value.includes('{.interpreted-text')) { const paragraph = ancestors[ancestors.length - 1].children const docRoleTagChild = paragraph.findIndex( - (child) => child.value && child.value.includes('{.interpreted-text') + (child) => child.value && child.value.includes('{.interpreted-text'), ) const link = paragraph[docRoleTagChild - 1] // If child node is already a link node, skip it @@ -153,7 +153,7 @@ export async function convertContentToDocs(content, frontmatterDefaults = {}) { // rule, we may need to modify this code to handle it. if (link.type !== 'inlineCode') { throw new Error( - 'Unexpected node type. The node before a text node with {.interpreted-text role="doc"} should be an inline code or link node.' + 'Unexpected node type. The node before a text node with {.interpreted-text role="doc"} should be an inline code or link node.', ) } @@ -209,7 +209,7 @@ export async function convertContentToDocs(content, frontmatterDefaults = {}) { // rewrite the aka.ms link node.children[0].value = 'AUTOTITLE' node.url = url - }) + }), ) // remove the program section from the AST diff --git a/src/codeql-cli/scripts/sync.js b/src/codeql-cli/scripts/sync.js index 4deafd4cf2f4..770f0999c395 100755 --- a/src/codeql-cli/scripts/sync.js +++ b/src/codeql-cli/scripts/sync.js @@ -13,7 +13,7 @@ import { updateContentDirectory } from '../../automated-pipelines/lib/update-mar import { convertContentToDocs } from './convert-markdown-for-docs.js' const { targetDirectory, sourceDirectory, frontmatterDefaults, markdownPrefix } = JSON.parse( - await readFile(path.join('src/codeql-cli/lib/config.json'), 'utf-8') + await readFile(path.join('src/codeql-cli/lib/config.json'), 'utf-8'), ) const SOURCE_REPO = sourceDirectory.split('/')[0] const TEMP_DIRECTORY = path.join(SOURCE_REPO, 'tempCliDocs') @@ -59,7 +59,7 @@ async function setupEnvironment() { const isPandoc = execSync('pandoc --version', { encoding: 'utf8' }) if (!isPandoc.startsWith('pandoc')) { throw new Error( - 'You must install pandoc to run this script. See https://pandoc.org/installing.html.' + 'You must install pandoc to run this script. See https://pandoc.org/installing.html.', ) } diff --git a/src/content-linter/lib/linting-rules/image-alt-text-end-punctuation.js b/src/content-linter/lib/linting-rules/image-alt-text-end-punctuation.js index d570c5393a94..b2abd4743bc1 100644 --- a/src/content-linter/lib/linting-rules/image-alt-text-end-punctuation.js +++ b/src/content-linter/lib/linting-rules/image-alt-text-end-punctuation.js @@ -25,7 +25,7 @@ export const imageAltTextEndPunctuation = { editColumn: token.line.indexOf(']') + 1, deleteCount: 0, insertText: '.', - } + }, ) } }) diff --git a/src/content-linter/lib/linting-rules/image-alt-text-length.js b/src/content-linter/lib/linting-rules/image-alt-text-length.js index 8fb165c3dafc..076428ed23b0 100644 --- a/src/content-linter/lib/linting-rules/image-alt-text-length.js +++ b/src/content-linter/lib/linting-rules/image-alt-text-length.js @@ -18,7 +18,7 @@ export const incorrectAltTextLength = { addError( onError, token.lineNumber, - `The alt text: ${renderedString}, is ${renderedString.length} characters long` + `The alt text: ${renderedString}, is ${renderedString.length} characters long`, ) } }) diff --git a/src/content-linter/lib/linting-rules/image-file-kebab.js b/src/content-linter/lib/linting-rules/image-file-kebab.js index 672dae20bda6..a63cb9f56f44 100644 --- a/src/content-linter/lib/linting-rules/image-file-kebab.js +++ b/src/content-linter/lib/linting-rules/image-file-kebab.js @@ -13,7 +13,7 @@ export const imageFileKebab = { addError( onError, token.lineNumber, - `The image file name: ${token.attrs[0][1]}, is not lowercase kebab case.` + `The image file name: ${token.attrs[0][1]}, is not lowercase kebab case.`, ) } }) diff --git a/src/content-linter/lib/linting-rules/internal-links-lang.js b/src/content-linter/lib/linting-rules/internal-links-lang.js index c1e948132fc9..fdafbf899ae3 100644 --- a/src/content-linter/lib/linting-rules/internal-links-lang.js +++ b/src/content-linter/lib/linting-rules/internal-links-lang.js @@ -35,7 +35,7 @@ export const internalLinksLang = { lineNumber: child.lineNumber, editColumn: token.line.indexOf('(') + 2, deleteCount: 3, - } + }, ) internalLinkHasLang = false } diff --git a/src/content-linter/lib/linting-rules/internal-links-slash.js b/src/content-linter/lib/linting-rules/internal-links-slash.js index bbf97a378f9e..ba8591cb24d6 100644 --- a/src/content-linter/lib/linting-rules/internal-links-slash.js +++ b/src/content-linter/lib/linting-rules/internal-links-slash.js @@ -37,7 +37,7 @@ export const internalLinksSlash = { editColumn: token.line.indexOf('(') + 2, deleteCount: 0, insertText: '/', - } + }, ) internalLinkHasSlash = true } diff --git a/src/content-linter/tests/category-pages.js b/src/content-linter/tests/category-pages.js index 623f561a3ab6..d1ecd5eeccac 100644 --- a/src/content-linter/tests/category-pages.js +++ b/src/content-linter/tests/category-pages.js @@ -126,14 +126,14 @@ describe('category pages', () => { // ".../content/github/{category}/{article}.md" => "/{article}" return `/${path.relative(categoryDir, articlePath).replace(/\.md$/, '')}` - }) + }), ) ).filter(Boolean) // Get all of the child articles that exist in the subdir const childEntries = await fs.promises.readdir(categoryDir, { withFileTypes: true }) const childFileEntries = childEntries.filter( - (ent) => ent.isFile() && ent.name !== 'index.md' + (ent) => ent.isFile() && ent.name !== 'index.md', ) const childFilePaths = childFileEntries.map((ent) => path.join(categoryDir, ent.name)) @@ -148,7 +148,7 @@ describe('category pages', () => { // ".../content/github/{category}/{article}.md" => "/{article}" return `/${path.relative(categoryDir, articlePath).replace(/\.md$/, '')}` - }) + }), ) ).filter(Boolean) @@ -158,7 +158,7 @@ describe('category pages', () => { const { data } = matter(articleContents) articleVersions[articlePath] = getApplicableVersions(data.versions, articlePath) - }) + }), ) }) @@ -191,7 +191,7 @@ describe('category pages', () => { }), `${indexRelPath.replace('index.md', '')} contains a mix of ${errorType}s and ${ categoryChildTypes[0] - }s, category children must be of the same type` + }s, category children must be of the same type`, ).toBe(true) }) @@ -210,7 +210,7 @@ describe('category pages', () => { // If this fails, execute "script/reconcile-category-dirs-with-ids.js" }) - } + }, ) }) }) diff --git a/src/content-linter/tests/lint-code-languages.js b/src/content-linter/tests/lint-code-languages.js index 182c6a46159c..bcf22d99a30a 100644 --- a/src/content-linter/tests/lint-code-languages.js +++ b/src/content-linter/tests/lint-code-languages.js @@ -5,7 +5,7 @@ import yaml from 'js-yaml' const allFiles = walkFiles('content', '.md').concat(walkFiles('data', '.md')) const languages = Object.keys( - yaml.load(fs.readFileSync('./data/variables/code-languages.yml', 'utf8')) + yaml.load(fs.readFileSync('./data/variables/code-languages.yml', 'utf8')), ) describe.skip('lint-code-languages', () => { diff --git a/src/content-linter/tests/lint-files.js b/src/content-linter/tests/lint-files.js index f51bb2af8b0b..e8199a93ca20 100755 --- a/src/content-linter/tests/lint-files.js +++ b/src/content-linter/tests/lint-files.js @@ -29,7 +29,7 @@ jest.useFakeTimers({ legacyFakeTimers: true }) const __dirname = path.dirname(fileURLToPath(import.meta.url)) const enterpriseServerVersions = Object.keys(allVersions).filter((v) => - v.startsWith('enterprise-server@') + v.startsWith('enterprise-server@'), ) const rootDir = path.join(__dirname, '../../..') @@ -90,9 +90,9 @@ const relativeArticleLinkRegex = // const languageLinkRegex = new RegExp( `(?=^|[^\\]]\\s*)\\[[^\\]]+\\](?::\\n?[ \\t]+|\\s*\\()(?:(?:https?://(?:help|docs|developer)\\.github\\.com)?/(?:${languageCodes.join( - '|' + '|', )})(?:/[^)\\s]*)?)(?:\\)|\\s+|$)`, - 'gm' + 'gm', ) // Things matched by this RegExp: @@ -246,7 +246,7 @@ const automatedIgnorePaths = ( await Promise.all( automatedConfigFiles.map(async (p) => { return JSON.parse(await fs.readFile(p, 'utf8')).linterIgnore || [] - }) + }), ) ) .flat() @@ -260,7 +260,7 @@ const ignoreMarkdownFilesAbsPath = new Set( const exists = existsSync(p) if (!exists) { console.warn( - `WARNING: Ignored path ${p} defined in an automation pipeline does not exist. This may be expected, but if not, remove the defined path from the pipeline config.` + `WARNING: Ignored path ${p} defined in an automation pipeline does not exist. This may be expected, but if not, remove the defined path from the pipeline config.`, ) } return exists @@ -269,26 +269,26 @@ const ignoreMarkdownFilesAbsPath = new Set( walk(p, { includeBasePath: true, globs: ['**/*.md'], - }) + }), ) - .flat() + .flat(), ) // Difference between contentMarkdownAbsPaths & automatedIgnorePaths const contentMarkdownNoAutomated = [...contentMarkdownRelPaths].filter( - (p) => !ignoreMarkdownFilesAbsPath.has(p) + (p) => !ignoreMarkdownFilesAbsPath.has(p), ) // We also need to go back and get the difference between the // absolute paths list const contentMarkdownAbsPathNoAutomated = [...contentMarkdownAbsPaths].filter( - (p) => !ignoreMarkdownFilesAbsPath.has(slash(path.relative(rootDir, p))) + (p) => !ignoreMarkdownFilesAbsPath.has(slash(path.relative(rootDir, p))), ) const contentMarkdownTuples = zip(contentMarkdownNoAutomated, contentMarkdownAbsPathNoAutomated) const reusableMarkdownAbsPaths = walk(reusablesDir, mdWalkOptions).sort() const reusableMarkdownRelPaths = reusableMarkdownAbsPaths.map((p) => - slash(path.relative(rootDir, p)) + slash(path.relative(rootDir, p)), ) const reusableMarkdownTuples = zip(reusableMarkdownRelPaths, reusableMarkdownAbsPaths) @@ -312,21 +312,21 @@ const fbvTuples = zip(FbvYamlRelPaths, FbvYamlAbsPaths) // GHES release notes const ghesReleaseNotesYamlAbsPaths = walk(ghesReleaseNotesDir, yamlWalkOptions).sort() const ghesReleaseNotesYamlRelPaths = ghesReleaseNotesYamlAbsPaths.map((p) => - slash(path.relative(rootDir, p)) + slash(path.relative(rootDir, p)), ) ghesReleaseNotesToLint = zip(ghesReleaseNotesYamlRelPaths, ghesReleaseNotesYamlAbsPaths) // GHAE release notes const ghaeReleaseNotesYamlAbsPaths = walk(ghaeReleaseNotesDir, yamlWalkOptions).sort() const ghaeReleaseNotesYamlRelPaths = ghaeReleaseNotesYamlAbsPaths.map((p) => - slash(path.relative(rootDir, p)) + slash(path.relative(rootDir, p)), ) ghaeReleaseNotesToLint = zip(ghaeReleaseNotesYamlRelPaths, ghaeReleaseNotesYamlAbsPaths) // Learning tracks const learningTracksYamlAbsPaths = walk(learningTracks, yamlWalkOptions).sort() const learningTracksYamlRelPaths = learningTracksYamlAbsPaths.map((p) => - slash(path.relative(rootDir, p)) + slash(path.relative(rootDir, p)), ) learningTracksToLint = zip(learningTracksYamlRelPaths, learningTracksYamlAbsPaths) @@ -337,7 +337,7 @@ ymlToLint = [].concat( fbvTuples, ghesReleaseNotesToLint, ghaeReleaseNotesToLint, - learningTracksToLint + learningTracksToLint, ) function formatLinkError(message, links) { @@ -368,11 +368,11 @@ if (diffFiles.length > 0) { return name.slice(1, -1) } return name - }) + }), ) const filterFiles = (tuples) => tuples.filter( - ([relativePath, absolutePath]) => only.has(relativePath) || only.has(absolutePath) + ([relativePath, absolutePath]) => only.has(relativePath) || only.has(absolutePath), ) mdToLint = filterFiles(mdToLint) ymlToLint = filterFiles(ymlToLint) @@ -470,7 +470,7 @@ describe('lint markdown content', () => { const rendered = await liquid.parseAndRender(snippet, context) const parsed = yaml.load(rendered) return parsed.on.schedule - }) + }), ) ) .flat() @@ -482,7 +482,7 @@ describe('lint markdown content', () => { const placeholderStr = matches.length === 1 ? 'placeholder' : 'placeholders' const errorMessage = ` Found ${matches.length} ${placeholderStr} '${matches.join( - ', ' + ', ', )}' in this file! Please update all placeholders. ` expect(matches.length, errorMessage).toBe(0) @@ -492,7 +492,7 @@ describe('lint markdown content', () => { // We need to support some non-Early Access hidden docs in Site Policy if (isHidden) { expect( - isEarlyAccess || isSitePolicy || isSearch || hasExperimentalAlternative || isTranscript + isEarlyAccess || isSitePolicy || isSearch || hasExperimentalAlternative || isTranscript, ).toBe(true) } }) @@ -582,7 +582,7 @@ describe('lint markdown content', () => { const matchesWithExample = matches.map((match) => { const example = match.replace( /{{\s*?site\.data\.([a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]+)+)\s*?}}/g, - '{% data $1 %}' + '{% data $1 %}', ) return `${match} => ${example}` }) @@ -660,7 +660,7 @@ describe('lint markdown content', () => { }) expect( usedDeprecateProps, - `The following frontmatter properties are deprecated: ${usedDeprecateProps}. Please remove the property from your article's frontmatter.` + `The following frontmatter properties are deprecated: ${usedDeprecateProps}. Please remove the property from your article's frontmatter.`, ).toEqual([]) } }) @@ -675,7 +675,7 @@ describe('lint markdown content', () => { if (!markdownRelPath.includes('data/reusables')) { test('frontmatter contains valid liquid', async () => { const fmKeysWithLiquid = ['title', 'shortTitle', 'intro', 'product', 'permission'].filter( - (key) => Boolean(frontmatterData[key]) + (key) => Boolean(frontmatterData[key]), ) for (const key of fmKeysWithLiquid) { @@ -697,7 +697,7 @@ describe('lint markdown content', () => { const matches = content.match(patRegex) || [] const errorMessage = formatLinkError( 'You should use one of the personal access token variables from data/variables/product.yml instead of the literal phrase(s):', - matches + matches, ) expect(matches.length, errorMessage).toBe(0) }) @@ -868,10 +868,10 @@ describe('lint yaml content', () => { ...valMatches.map((match) => { const example = match.replace( /{{\s*?site\.data\.([a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]+)+)\s*?}}/g, - '{% data $1 %}' + '{% data $1 %}', ) return `Key "${key}": ${match} => ${example}` - }) + }), ) } } @@ -1003,7 +1003,7 @@ describe('lint GHAE release notes', () => { it('does not have more than one yaml file with currentWeek set to true', () => { if (dictionary.currentWeek) currentWeeksFound.push(yamlRelPath) const errorMessage = `Found more than one file with currentWeek set to true: ${currentWeeksFound.join( - '\n' + '\n', )}` expect(currentWeeksFound.length, errorMessage).not.toBeGreaterThan(1) }) @@ -1094,7 +1094,7 @@ describe('lint learning tracks', () => { } featuredTracks[version] = featuredTracksPerVersion.length - }) + }), ) Object.entries(featuredTracks).forEach(([version, numOfFeaturedTracks]) => { diff --git a/src/content-linter/tests/lint-versioning.js b/src/content-linter/tests/lint-versioning.js index 7f4810a1e4f4..09f4f7e4f591 100644 --- a/src/content-linter/tests/lint-versioning.js +++ b/src/content-linter/tests/lint-versioning.js @@ -76,7 +76,7 @@ describe('lint Liquid versioning', () => { // Now that `ifversion` supports feature-based versioning, we should have few other `if` tags. test('ifversion, not if, is used for versioning', async () => { const ifsForVersioning = ifConditionals.filter((cond) => - allowedVersionNames.some((keyword) => cond.includes(keyword)) + allowedVersionNames.some((keyword) => cond.includes(keyword)), ) const errorMessage = `Found ${ ifsForVersioning.length @@ -139,16 +139,16 @@ function validateIfversionConditionals(conds) { if (strParts.length === 3) { const [version, operator, release] = strParts const hasSemanticVersioning = Object.values(allVersions).some( - (v) => (v.hasNumberedReleases || v.internalLatestRelease) && v.shortName === version + (v) => (v.hasNumberedReleases || v.internalLatestRelease) && v.shortName === version, ) if (!hasSemanticVersioning) { errors.push( - `Found "${version}" inside "${cond}" with a "${operator}" operator, but "${version}" does not support semantic comparisons"` + `Found "${version}" inside "${cond}" with a "${operator}" operator, but "${version}" does not support semantic comparisons"`, ) } if (!allowedVersionOperators.includes(operator)) { errors.push( - `Found a "${operator}" operator inside "${cond}", but "${operator}" is not supported` + `Found a "${operator}" operator inside "${cond}", but "${operator}" is not supported`, ) } // Check that the versions in conditionals are supported @@ -166,7 +166,7 @@ function validateIfversionConditionals(conds) { ) ) { errors.push( - `Found ${release} inside "${cond}", but ${release} is not a supported GHES release` + `Found ${release} inside "${cond}", but ${release} is not a supported GHES release`, ) } } diff --git a/src/content-linter/tests/liquid-line-breaks.js b/src/content-linter/tests/liquid-line-breaks.js index ddf71f2af9c1..e3a5e79e22b0 100644 --- a/src/content-linter/tests/liquid-line-breaks.js +++ b/src/content-linter/tests/liquid-line-breaks.js @@ -62,10 +62,10 @@ describe('Liquid references', () => { const matches = content.match(liquidRefsWithLinkBreaksRegex) || [] const errorMessage = formatRefError( 'Found unexpected line breaks in Liquid reference:', - matches + matches, ) expect(matches.length, errorMessage).toBe(0) - } + }, ) // Also test the "data/variables/" YAML files @@ -95,7 +95,7 @@ describe('Liquid references', () => { const errorMessage = formatRefError( 'Found unexpected line breaks in Liquid reference:', - matches + matches, ) expect(matches.length, errorMessage).toBe(0) }) diff --git a/src/content-linter/tests/site-data-references.js b/src/content-linter/tests/site-data-references.js index 490ca27ad201..dda5ff35c195 100644 --- a/src/content-linter/tests/site-data-references.js +++ b/src/content-linter/tests/site-data-references.js @@ -63,7 +63,7 @@ describe('data references', () => { const value = getDataByLanguage(key, 'en') if (typeof value !== 'string') errors.push({ key, value, metadataFile }) }) - }) + }), ) errors = uniqWith(errors, isEqual) // remove duplicates @@ -85,12 +85,12 @@ describe('data references', () => { if (typeof value !== 'string') { const reusableFile = path.join( 'data/reusables', - getFilenameByValue(allReusables, reusablesPerFile) + getFilenameByValue(allReusables, reusablesPerFile), ) errors.push({ key, value, reusableFile }) } }) - }) + }), ) errors = uniqWith(errors, isEqual) // remove duplicates @@ -112,12 +112,12 @@ describe('data references', () => { if (typeof value !== 'string') { const variableFile = path.join( 'data/variables', - getFilenameByValue(allVariables, variablesPerFile) + getFilenameByValue(allVariables, variablesPerFile), ) errors.push({ key, value, variableFile }) } }) - }) + }), ) errors = uniqWith(errors, isEqual) // remove duplicates diff --git a/src/content-render/liquid/error-handling.js b/src/content-render/liquid/error-handling.js index b5748e577ca3..d131cb7dd5ef 100644 --- a/src/content-render/liquid/error-handling.js +++ b/src/content-render/liquid/error-handling.js @@ -3,7 +3,7 @@ export const THROW_ON_EMPTY = Boolean( process.env.THROW_ON_EMPTY ? JSON.parse(process.env.THROW_ON_EMPTY) - : JSON.parse(process.env.CI || process.env.NODE_ENV !== 'production') + : JSON.parse(process.env.CI || process.env.NODE_ENV !== 'production'), ) export class DataReferenceError extends Error {} diff --git a/src/content-render/liquid/ifversion.js b/src/content-render/liquid/ifversion.js index 70fbfead41e1..6dce3c2d0714 100644 --- a/src/content-render/liquid/ifversion.js +++ b/src/content-render/liquid/ifversion.js @@ -29,7 +29,7 @@ export default class extends Tag { this.branches.push({ cond: tagToken.args, templates: (p = []), - }) + }), ) .on('tag:elsif', (token) => { this.branches.push({ diff --git a/src/content-render/liquid/post.js b/src/content-render/liquid/post.js index 431f1319b65b..66c94c8396e3 100644 --- a/src/content-render/liquid/post.js +++ b/src/content-render/liquid/post.js @@ -15,7 +15,7 @@ function allowHtmlInShell(template) { // this workaround loses syntax highlighting but correctly handles tags like <em> and entities like &lt; template = template.replace( /``` ?shell\r?\n\s*?(\S[\s\S]*?)\r?\n.*?```/gm, - '<pre><code class="hljs language-shell">$1</code></pre>' + '<pre><code class="hljs language-shell">$1</code></pre>', ) return template } diff --git a/src/content-render/tests/data.js b/src/content-render/tests/data.js index 5fe8042b08ec..90f5f39cf696 100644 --- a/src/content-render/tests/data.js +++ b/src/content-render/tests/data.js @@ -55,7 +55,7 @@ describe('data tag', () => { currentLanguage: 'en', } await expect(page.render(context)).rejects.toThrow( - "Can't find the key 'foo.bar.tipu' in the scope., line:2, col:1" + "Can't find the key 'foo.bar.tipu' in the scope., line:2, col:1", ) }) }) diff --git a/src/content-render/tests/liquid.js b/src/content-render/tests/liquid.js index ca0a60291e1e..01e4b8ee4bda 100644 --- a/src/content-render/tests/liquid.js +++ b/src/content-render/tests/liquid.js @@ -57,7 +57,7 @@ describe('liquid template parser', () => { const output = await liquid.parseAndRender(shortVersionsTemplate, req.context) // We should have TWO results because we are supporting two shortcuts expect(output.replace(/\s\s+/g, ' ').trim()).toBe( - `I am FPT I am FTP or GHES < ${secondOldestSupportedGhes}` + `I am FPT I am FTP or GHES < ${secondOldestSupportedGhes}`, ) }) @@ -95,7 +95,7 @@ describe('liquid template parser', () => { await shortVersionsMiddleware(req, null, () => {}) const output = await liquid.parseAndRender(shortVersionsTemplate, req.context) expect(output.replace(/\s\s+/g, ' ').trim()).toBe( - `I am GHES I am GHES < ${secondOldestSupportedGhes} I am FTP or GHES < ${secondOldestSupportedGhes}` + `I am GHES I am GHES < ${secondOldestSupportedGhes} I am FTP or GHES < ${secondOldestSupportedGhes}`, ) }) @@ -109,7 +109,7 @@ describe('liquid template parser', () => { await shortVersionsMiddleware(req, null, () => {}) const output = await liquid.parseAndRender(shortVersionsTemplate, req.context) expect(output.replace(/\s\s+/g, ' ').trim()).toBe( - `I am GHES I am GHES = ${secondOldestSupportedGhes} I am ${secondOldestSupportedGhes} only` + `I am GHES I am GHES = ${secondOldestSupportedGhes} I am ${secondOldestSupportedGhes} only`, ) }) @@ -123,7 +123,7 @@ describe('liquid template parser', () => { await shortVersionsMiddleware(req, null, () => {}) const output = await liquid.parseAndRender(negativeVersionsTemplate, req.context) expect(output.replace(/\s\s+/g, ' ').trim()).toBe( - `I am not GHEC I am not GHES I am not GHES ${secondOldestSupportedGhes}` + `I am not GHEC I am not GHES I am not GHES ${secondOldestSupportedGhes}`, ) }) @@ -137,7 +137,7 @@ describe('liquid template parser', () => { await shortVersionsMiddleware(req, null, () => {}) const output = await liquid.parseAndRender(negativeVersionsTemplate, req.context) expect(output.replace(/\s\s+/g, ' ').trim()).toBe( - `I am not GHAE I am not GHEC I am not GHES ${secondOldestSupportedGhes}` + `I am not GHAE I am not GHEC I am not GHES ${secondOldestSupportedGhes}`, ) }) diff --git a/src/content-render/tests/octicon.js b/src/content-render/tests/octicon.js index 503265ab11a9..8fbbb7d6daf1 100644 --- a/src/content-render/tests/octicon.js +++ b/src/content-render/tests/octicon.js @@ -31,13 +31,13 @@ describe('octicon tag', () => { it('throws an error with invalid syntax', async () => { await expect(renderContent('{% octicon 123 %}')).rejects.toThrowError( - 'Syntax Error in tag \'octicon\' - Valid syntax: octicon "<name>" <key="value">' + 'Syntax Error in tag \'octicon\' - Valid syntax: octicon "<name>" <key="value">', ) }) it('throws an error with a non-existant octicon', async () => { await expect(renderContent('{% octicon "pizza-patrol" %}')).rejects.toThrowError( - 'Octicon pizza-patrol does not exist' + 'Octicon pizza-patrol does not exist', ) }) }) diff --git a/src/content-render/tests/render-content.js b/src/content-render/tests/render-content.js index f8ba0682ced5..9f3602a13653 100644 --- a/src/content-render/tests/render-content.js +++ b/src/content-render/tests/render-content.js @@ -108,7 +108,7 @@ describe('renderContent', () => { const html = await renderContent(template) const $ = cheerio.load(html, { xmlMode: true }) expect( - $.html().includes('&quot;<a href="/articles/about-issues">About issues</a>.&quot;') + $.html().includes('&quot;<a href="/articles/about-issues">About issues</a>.&quot;'), ).toBeTruthy() }) @@ -121,7 +121,7 @@ describe('renderContent', () => { const html = await renderContent(template) const $ = cheerio.load(html, { xmlMode: true }) expect( - $.html().includes('<code>requirements.txt</code>, <code>pipfile.lock</code>') + $.html().includes('<code>requirements.txt</code>, <code>pipfile.lock</code>'), ).toBeTruthy() }) @@ -171,7 +171,7 @@ describe('renderContent', () => { ;[1, 2, 3, 4, 5].forEach((level) => { expect( - $(`h${level}#this-is-a-level-${level} a[href="#this-is-a-level-${level}"]`).length + $(`h${level}#this-is-a-level-${level} a[href="#this-is-a-level-${level}"]`).length, ).toBe(1) }) }) @@ -219,7 +219,7 @@ plugins { $ = cheerio.load(html, { xmlMode: true }) expect($.html().includes('<pre><code class="hljs language-groovy">')).toBeTruthy() expect( - $.html().includes('<span class="hljs-string">&apos;maven-publish&apos;</span>') + $.html().includes('<span class="hljs-string">&apos;maven-publish&apos;</span>'), ).toBeTruthy() template = nl(` @@ -241,7 +241,7 @@ $resourceGroupName = "octocat-testgroup" $ = cheerio.load(html, { xmlMode: true }) expect($.html().includes('<pre><code class="hljs language-Powershell">')).toBeTruthy() expect( - $.html().includes('<span class="hljs-variable">&#x24;resourceGroupName</span>') + $.html().includes('<span class="hljs-variable">&#x24;resourceGroupName</span>'), ).toBeTruthy() }) @@ -263,7 +263,7 @@ var a = 1 const file = await renderContent(content) expect(file).toBe( '<table><thead><tr><th scope="col">Webhook event payload</th><th scope="col">Activity types</th></tr></thead>' + - '<tbody><tr><td><a href="/webhooks/event-payloads/#issues"><code>issues</code></a></td><td>- <code>opened</code><br>- <code>edited</code><br>- <code>other</code></td></tr></tbody></table>' + '<tbody><tr><td><a href="/webhooks/event-payloads/#issues"><code>issues</code></a></td><td>- <code>opened</code><br>- <code>edited</code><br>- <code>other</code></td></tr></tbody></table>', ) }) diff --git a/src/content-render/unified/annotate.js b/src/content-render/unified/annotate.js index 2e041ef61cd6..091481831450 100644 --- a/src/content-render/unified/annotate.js +++ b/src/content-render/unified/annotate.js @@ -81,12 +81,12 @@ function validate(lang, code) { } if (!languages[lang]) { throw new Error( - `Unsupported language for annotate info string. Please use one of: ${Object.keys(languages)}` + `Unsupported language for annotate info string. Please use one of: ${Object.keys(languages)}`, ) } if (!new RegExp(getRegexp(lang), 'm').test(code)) { throw new Error( - 'Make sure the comment syntax matches the language. Use single-line comments only.' + 'Make sure the comment syntax matches the language. Use single-line comments only.', ) } } @@ -127,7 +127,7 @@ function getSubnav() { ariaLabel: 'Display annotations beside the code sample', className: 'BtnGroup-item btn btn-sm tooltipped tooltipped-nw', }, - ['Beside'] + ['Beside'], ) const inlineBtn = h( 'button', @@ -138,7 +138,7 @@ function getSubnav() { ariaLabel: 'Display annotations inline as comments of the code sample', className: 'BtnGroup-item btn btn-sm tooltipped tooltipped-nw', }, - ['Inline'] + ['Inline'], ) return h('div', { className: 'BtnGroup' }, [besideBtn, inlineBtn]) @@ -158,20 +158,20 @@ function template({ lang, code, rows }) { 'div', { className: 'annotate-code' }, // pre > code matches the mdast -> hast tree of a regular fenced code block. - h('pre', h('code', { className: `language-${lang}` }, code.join('\n'))) + h('pre', h('code', { className: `language-${lang}` }, code.join('\n'))), ), h( 'div', { className: 'annotate-note' }, - mdToHast(note.map(removeComment(lang)).join('\n')) + mdToHast(note.map(removeComment(lang)).join('\n')), ), - ]) - ) + ]), + ), ), h('div', { className: 'annotate-inline' }, [ // pre > code matches the mdast -> hast tree of a regular fenced code block. h('pre', h('code', { className: `language-${lang}` }, code)), - ]) + ]), ) } diff --git a/src/content-render/unified/code-header.js b/src/content-render/unified/code-header.js index ec79a21de156..ddeeb8877ecc 100644 --- a/src/content-render/unified/code-header.js +++ b/src/content-render/unified/code-header.js @@ -63,10 +63,10 @@ export function header(lang, code, subnav) { 'aria-label': 'Copy code to clipboard', 'data-clipboard': codeId, }, - btnIcon() + btnIcon(), ), h('pre', { hidden: true, 'data-clipboard': codeId }, code), - ] + ], ) } diff --git a/src/content-render/unified/parse-info-string.js b/src/content-render/unified/parse-info-string.js index 9ddcc2004200..6512ab363532 100644 --- a/src/content-render/unified/parse-info-string.js +++ b/src/content-render/unified/parse-info-string.js @@ -26,6 +26,6 @@ function strToObj(str) { str .split(/\s+/g) .map((k) => k.split(':')) - .map(([k, ...v]) => [k, v.length ? v.join(':') : true]) + .map(([k, ...v]) => [k, v.length ? v.join(':') : true]), ) } diff --git a/src/content-render/unified/rewrite-asset-urls.js b/src/content-render/unified/rewrite-asset-urls.js index a0c344513107..32b46720e8e0 100644 --- a/src/content-render/unified/rewrite-asset-urls.js +++ b/src/content-render/unified/rewrite-asset-urls.js @@ -49,7 +49,7 @@ function getNewSrc(node) { } catch (err) { console.warn( `Failed to get a hash for ${src} ` + - '(This is mostly harmless and can happen with outdated translations).' + '(This is mostly harmless and can happen with outdated translations).', ) } } diff --git a/src/content-render/unified/rewrite-for-rowheaders.js b/src/content-render/unified/rewrite-for-rowheaders.js index a000d5b6dc60..dedcccbfae43 100644 --- a/src/content-render/unified/rewrite-for-rowheaders.js +++ b/src/content-render/unified/rewrite-for-rowheaders.js @@ -42,7 +42,7 @@ function insideRowheaders(ancestors) { (node) => node.properties && node.properties.className && - node.properties.className.includes('rowheaders') + node.properties.className.includes('rowheaders'), ) } diff --git a/src/content-render/unified/rewrite-local-links.js b/src/content-render/unified/rewrite-local-links.js index e58dea1568e9..086f4c9da4e4 100644 --- a/src/content-render/unified/rewrite-local-links.js +++ b/src/content-render/unified/rewrite-local-links.js @@ -70,7 +70,7 @@ export default function rewriteLocalLinks(context) { ) { throw new Error( `Found link text '${child.value}', expected 'AUTOTITLE'. ` + - `Find the mention of the link text '${child.value}' and change it to 'AUTOTITLE'. Case matters.` + `Find the mention of the link text '${child.value}' and change it to 'AUTOTITLE'. Case matters.`, ) } } @@ -86,7 +86,7 @@ export default function rewriteLocalLinks(context) { if (child.value && AUTOTITLE.test(child.value)) { throw new Error( `Found anchor link with text AUTOTITLE ('${node.properties.href}'). ` + - 'Update the anchor link with text that is not AUTOTITLE.' + 'Update the anchor link with text that is not AUTOTITLE.', ) } } diff --git a/src/early-access/middleware/early-access-links.js b/src/early-access/middleware/early-access-links.js index 89623ce0d2e4..e3f19b51b582 100644 --- a/src/early-access/middleware/early-access-links.js +++ b/src/early-access/middleware/early-access-links.js @@ -12,10 +12,10 @@ export default function earlyAccessContext(req, res, next) { (page) => page.hidden && page.relativePath.startsWith('early-access') && - !page.relativePath.endsWith('index.md') + !page.relativePath.endsWith('index.md'), ) .map((page) => page.permalinks) - .flat() + .flat(), ) // Get links for the current version .filter((permalink) => req.context.currentVersion === permalink.pageVersion) diff --git a/src/early-access/scripts/migrate-early-access-product.js b/src/early-access/scripts/migrate-early-access-product.js index 7b5730055031..e50aa12de3a8 100755 --- a/src/early-access/scripts/migrate-early-access-product.js +++ b/src/early-access/scripts/migrate-early-access-product.js @@ -24,15 +24,15 @@ program .description('Move a product-level early access docs set to a category level.') .requiredOption( '-o, --oldPath <PATH>', - 'Provide the path of the existing product, e.g., content/early-access/enterprise-importer' + 'Provide the path of the existing product, e.g., content/early-access/enterprise-importer', ) .requiredOption( '-n, --newPath <PATH>', - 'Provide the new path it will move under, e.g., content/migrations/using-enterprise-importer' + 'Provide the new path it will move under, e.g., content/migrations/using-enterprise-importer', ) .option( '-t, --newTitle <TITLE>', - 'Provide the new title if it is different from the existing title, e.g., Using Enterprise Importer' + 'Provide the new title if it is different from the existing title, e.g., Using Enterprise Importer', ) .parse(process.argv) @@ -111,7 +111,7 @@ parentProducToc.data.children.push(`/${path.basename(newPathId)}`) fs.writeFileSync( parentProductTocPath, - frontmatter.stringify(parentProducToc.content, parentProducToc.data, { lineWidth: 10000 }) + frontmatter.stringify(parentProducToc.content, parentProducToc.data, { lineWidth: 10000 }), ) // 6. Optionally, update the new product TOC with the new title. @@ -122,7 +122,7 @@ if (program.opts().newTitle) { fs.writeFileSync( productTocPath, - frontmatter.stringify(productToc.content, productToc.data, { lineWidth: 10000 }) + frontmatter.stringify(productToc.content, productToc.data, { lineWidth: 10000 }), ) } @@ -161,12 +161,12 @@ function moveVariable(dataRef) { const oldVariablePath = path.posix.join( process.cwd(), 'data/early-access', - `${variablePathArray.join('/')}.yml` + `${variablePathArray.join('/')}.yml`, ) const newVariablePath = path.posix.join( process.cwd(), 'data', - `${variablePathArray.join('/')}.yml` + `${variablePathArray.join('/')}.yml`, ) const nonAltPath = newVariablePath.replace('-alt.yml', '.yml') const oldAltPath = oldVariablePath.replace('.yml', '-alt.yml') diff --git a/src/early-access/scripts/symlink-from-local-repo.js b/src/early-access/scripts/symlink-from-local-repo.js index b05a0e27a135..df8c428aebc2 100755 --- a/src/early-access/scripts/symlink-from-local-repo.js +++ b/src/early-access/scripts/symlink-from-local-repo.js @@ -22,7 +22,7 @@ program .description(`Create or destroy symlinks to your local "${earlyAccessRepo}" repository.`) .option( '-p, --path-to-early-access-repo <PATH>', - `path to a local checkout of ${earlyAccessRepoUrl}` + `path to a local checkout of ${earlyAccessRepoUrl}`, ) .option('-u, --unlink', 'remove the symlinks') .parse(process.argv) @@ -49,13 +49,13 @@ if (!unlink && pathToEarlyAccessRepo) { if (!dirStats) { throw new Error( `The local "${earlyAccessRepo}" repo directory does not exist:`, - earlyAccessLocalRepoDir + earlyAccessLocalRepoDir, ) } if (dirStats && !dirStats.isDirectory()) { throw new Error( `A non-directory entry exists at the local "${earlyAccessRepo}" repo directory location:`, - earlyAccessLocalRepoDir + earlyAccessLocalRepoDir, ) } } @@ -105,7 +105,7 @@ destinationDirNames.forEach((dirName) => { } if (!fs.statSync(destDir).isDirectory()) { throw new Error( - `The early access directory '${dirName}' entry's symbolic link does not refer to a directory!` + `The early access directory '${dirName}' entry's symbolic link does not refer to a directory!`, ) } diff --git a/src/early-access/scripts/update-data-and-image-paths.js b/src/early-access/scripts/update-data-and-image-paths.js index 7899447fc3ba..6d9049cabfcb 100755 --- a/src/early-access/scripts/update-data-and-image-paths.js +++ b/src/early-access/scripts/update-data-and-image-paths.js @@ -18,7 +18,7 @@ program .description('Update data and image paths.') .option( '-p, --early-access-path <PATH>', - 'Early access filepath. Defaults to all Early Access content and data files if not provided.' + 'Early access filepath. Defaults to all Early Access content and data files if not provided.', ) .option('-a, --add', 'Add "early-access" to data and image paths.') .option('-r, --remove', 'Remove "early-access" from data and image paths.') @@ -37,7 +37,7 @@ if (earlyAccessPath && !earlyAccessPath.startsWith('content/early-access')) { } const allEarlyAccessFiles = walkFiles('content', '.md', { includeEarlyAccess: true }).concat( - walkFiles('data', ['.md', '.yml'], { includeEarlyAccess: true }) + walkFiles('data', ['.md', '.yml'], { includeEarlyAccess: true }), ) let selectFiles = allEarlyAccessFiles @@ -63,7 +63,7 @@ if (earlyAccessPath) { const dataFiles = allEarlyAccessFiles.filter((file) => { return referencedDataFiles.some((f) => - f.includes(file.replace('data/reusables', 'data/early-access/reusables')) + f.includes(file.replace('data/reusables', 'data/early-access/reusables')), ) }) @@ -87,7 +87,7 @@ selectFiles.forEach((file) => { .forEach((dataRef) => { replacements[dataRef] = dataRef.replace( /({% (?:data|indented_data_reference) )(.*)/, - '$1early-access.$2' + '$1early-access.$2', ) }) diff --git a/src/early-access/scripts/what-docs-early-access-branch.js b/src/early-access/scripts/what-docs-early-access-branch.js index c076197df1de..0b4e226f9aaf 100755 --- a/src/early-access/scripts/what-docs-early-access-branch.js +++ b/src/early-access/scripts/what-docs-early-access-branch.js @@ -26,7 +26,7 @@ async function main() { } catch (err) { if (err.status === 404) { console.log( - `There is no docs-early-access branch called '${BRANCH_NAME}' so checking out 'main' instead.` + `There is no docs-early-access branch called '${BRANCH_NAME}' so checking out 'main' instead.`, ) setOutput(OUTPUT_KEY, 'main') } else { diff --git a/src/events/components/Survey.tsx b/src/events/components/Survey.tsx index e0d87bf5122e..6f624fae16f2 100644 --- a/src/events/components/Survey.tsx +++ b/src/events/components/Survey.tsx @@ -36,7 +36,7 @@ export const Survey = () => { if (state === ViewState.END) { document .querySelector<HTMLAnchorElement>( - `footer a[href="/${locale}/site-policy/privacy-policies/github-privacy-statement"]` + `footer a[href="/${locale}/site-policy/privacy-policies/github-privacy-statement"]`, ) ?.focus() } @@ -100,7 +100,7 @@ export const Survey = () => { <label className={cx( 'btn mr-1 color-border-accent-emphasis', - state === ViewState.YES && 'color-bg-accent-emphasis' + state === ViewState.YES && 'color-bg-accent-emphasis', )} htmlFor="survey-yes" > @@ -119,7 +119,7 @@ export const Survey = () => { <label className={cx( 'btn color-border-accent-emphasis', - state === ViewState.NO && 'color-bg-danger-emphasis' + state === ViewState.NO && 'color-bg-danger-emphasis', )} htmlFor="survey-no" > diff --git a/src/events/components/events.ts b/src/events/components/events.ts index 9e30135bd324..1be6157bd05c 100644 --- a/src/events/components/events.ts +++ b/src/events/components/events.ts @@ -36,7 +36,7 @@ function uuidv4(): string { } catch (err) { // https://stackoverflow.com/a/2117523 return (<any>[1e7] + -1e3 + -4e3 + -8e3 + -1e11).replace(/[018]/g, (c: number) => - (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16) + (c ^ (crypto.getRandomValues(new Uint8Array(1))[0] & (15 >> (c / 4)))).toString(16), ) } } diff --git a/src/events/lib/hydro.js b/src/events/lib/hydro.js index b8cb0594a260..39b7bf68359a 100644 --- a/src/events/lib/hydro.js +++ b/src/events/lib/hydro.js @@ -18,7 +18,7 @@ const inProd = NODE_ENV === 'production' if (inProd && (isNil(HYDRO_SECRET) || isNil(HYDRO_ENDPOINT))) { console.warn( - 'Running in production but HYDRO_SECRET and HYDRO_ENDPOINT environment variables are not set.' + 'Running in production but HYDRO_SECRET and HYDRO_ENDPOINT environment variables are not set.', ) } @@ -30,7 +30,7 @@ if (inProd && (isNil(HYDRO_SECRET) || isNil(HYDRO_ENDPOINT))) { */ async function _publish( events, - { secret, endpoint } = { secret: HYDRO_SECRET, endpoint: HYDRO_ENDPOINT } + { secret, endpoint } = { secret: HYDRO_SECRET, endpoint: HYDRO_ENDPOINT }, ) { if (!secret || !endpoint) { return { statusCode: 200 } diff --git a/src/events/lib/middleware-errors.js b/src/events/lib/middleware-errors.js index 474eb96cd1f6..23738e9ead0f 100644 --- a/src/events/lib/middleware-errors.js +++ b/src/events/lib/middleware-errors.js @@ -27,7 +27,7 @@ export function formatErrors(errors, body) { Object.entries(pick(error, errorKeys)).map(([key, value]) => [ snakeCase(key), makeString(value), - ]) + ]), ), })) } diff --git a/src/events/lib/schema.js b/src/events/lib/schema.js index d4782613d5f1..998bd0c3c7bb 100644 --- a/src/events/lib/schema.js +++ b/src/events/lib/schema.js @@ -460,7 +460,7 @@ const preference = { 'auto:light', 'linux', 'mac', - 'windows' + 'windows', ), description: 'The application, color_mode, or os selected by the user.', }, diff --git a/src/events/middleware.js b/src/events/middleware.js index b2e1da0f84fb..266760596b3b 100644 --- a/src/events/middleware.js +++ b/src/events/middleware.js @@ -48,7 +48,7 @@ router.post( formatErrors(validate.errors, req.body).map((error) => ({ schema: hydroNames.validation, value: error, - })) + })), ) // We aren't helping bots spam us :) return res.status(400).json(isProd ? {} : validate.errors) @@ -59,6 +59,6 @@ router.post( value: omit(req.body, OMIT_FIELDS), }) return res.json({}) - }) + }), ) export default router diff --git a/src/events/tests/hydro.js b/src/events/tests/hydro.js index f7a3d3fa3f37..37ca23c87ddd 100644 --- a/src/events/tests/hydro.js +++ b/src/events/tests/hydro.js @@ -61,7 +61,7 @@ describe('Hydro', () => { { schema: 'docs.v0.ExampleEvent', value: { event_id: 'FA36EA6D' } }, { schema: 'docs.v0.ExampleEvent', value: { event_id: '4F60C35A' } }, ], - config + config, ) expect(scope.isDone()).toBeTruthy() }) diff --git a/src/ghes-releases/scripts/archive-version.js b/src/ghes-releases/scripts/archive-version.js index a2084a7151e3..ea510298f79a 100755 --- a/src/ghes-releases/scripts/archive-version.js +++ b/src/ghes-releases/scripts/archive-version.js @@ -28,17 +28,17 @@ const REMOTE_ENTERPRISE_STORAGE_URL = 'https://githubdocs.azureedge.net/enterpri program .description( - 'Scrape HTML of the oldest supported Enterprise version and add it to a temp output directory.' + 'Scrape HTML of the oldest supported Enterprise version and add it to a temp output directory.', ) .option( '-o, --output <PATH>', - `output directory to place scraped HTML files and redirects. By default, this temp directory is named 'tmpArchivalDir_<VERSION_TO_DEPRECATE>'` + `output directory to place scraped HTML files and redirects. By default, this temp directory is named 'tmpArchivalDir_<VERSION_TO_DEPRECATE>'`, ) .option('-l, --local-dev', 'Do not rewrite asset paths to enable testing scraped content locally') .option('-d, --dry-run', 'only scrape the first 10 pages for testing purposes') .option( '-p, --page <PATH>', - 'Note: this option is only used to re-scrape a page after the version was deprecated. Redirects will not be re-created because most of the deprecated content is already removed. This option scrapes a specific page in all languages. Pass the relative path to the page without a version or language prefix. ex: /admin/release-notes' + 'Note: this option is only used to re-scrape a page after the version was deprecated. Redirects will not be re-created because most of the deprecated content is already removed. This option scrapes a specific page in all languages. Pass the relative path to the page without a version or language prefix. ex: /admin/release-notes', ) .parse(process.argv) @@ -78,7 +78,7 @@ class RewriteAssetPathsPlugin { // Remove nextjs scripts and manifest.json link newBody = newBody.replace( /<script\ssrc="(\.\.\/)*_next\/static\/[\w]+\/(_buildManifest|_ssgManifest).js?".*?><\/script>/g, - '' + '', ) newBody = newBody.replace(/<link href=".*manifest.json".*?>/g, '') @@ -89,7 +89,7 @@ class RewriteAssetPathsPlugin { (match, attribute, basepath) => { const replaced = `${REMOTE_ENTERPRISE_STORAGE_URL}/${this.version}/${basepath}` return `${attribute}="${replaced}` - } + }, ) } } @@ -106,7 +106,7 @@ class RewriteAssetPathsPlugin { (match, attribute, paren, basepath) => { const replaced = `${REMOTE_ENTERPRISE_STORAGE_URL}/${this.version}/${basepath}` return `${attribute}${paren}${replaced}` - } + }, ) } } @@ -122,7 +122,7 @@ async function main() { console.log('Finish building production assets') if (dryRun) { console.log( - '\nThis is a dry run! Creating HTML for redirects and scraping the first 10 pages only.' + '\nThis is a dry run! Creating HTML for redirects and scraping the first 10 pages only.', ) } if (singlePage) { @@ -175,7 +175,7 @@ async function main() { fs.renameSync( path.join(tmpArchivalDirectory, `/localhost_${port}`), - path.join(tmpArchivalDirectory, version) + path.join(tmpArchivalDirectory, version), ) console.log(`\n\ndone scraping! added files to ${tmpArchivalDirectory}\n`) @@ -184,7 +184,7 @@ async function main() { await createRedirectsFile( permalinksPerVersion, pageMap, - path.join(tmpArchivalDirectory, version) + path.join(tmpArchivalDirectory, version), ) console.log(`next step: deprecate ${version} in lib/enterprise-server-releases.js`) } else { @@ -221,7 +221,7 @@ async function createRedirectsFile(permalinks, pageMap, outputDirectory) { fs.writeFileSync( path.join(outputDirectory, 'redirects.json'), - JSON.stringify(redirectsPerVersion, null, 2) + JSON.stringify(redirectsPerVersion, null, 2), ) console.log(`Wrote ${outputDirectory}/redirects.json`) } diff --git a/src/ghes-releases/scripts/get-version-blocks.js b/src/ghes-releases/scripts/get-version-blocks.js index b3f6ce6df8d6..e698ef805c3f 100644 --- a/src/ghes-releases/scripts/get-version-blocks.js +++ b/src/ghes-releases/scripts/get-version-blocks.js @@ -25,7 +25,8 @@ export default function getVersionBlocks(rawBlocks) { .map((arg) => arg.split(' ')) .filter( (args) => - args.some((arg) => supportedOperators.includes(arg)) && args.some((arg) => arg === 'ghes') + args.some((arg) => supportedOperators.includes(arg)) && + args.some((arg) => arg === 'ghes'), ) .map((args) => args.filter((arg) => !(arg === 'or' || (arg === 'and') | (arg === '')))) diff --git a/src/ghes-releases/scripts/release-banner.js b/src/ghes-releases/scripts/release-banner.js index 8d5f65ab2562..4dccbeba11f0 100755 --- a/src/ghes-releases/scripts/release-banner.js +++ b/src/ghes-releases/scripts/release-banner.js @@ -22,7 +22,7 @@ program .option(`-a, --action <${allowedActions.join(' or ')}>`, 'Create or remove the banner.') .option( '-v, --version <version>', - 'The version the banner applies to. Must be in <plan@release> format.' + 'The version the banner applies to. Must be in <plan@release> format.', ) .parse(process.argv) @@ -35,7 +35,7 @@ if (!allowedActions.includes(options.action)) { if (!Object.keys(allVersions).includes(options.version)) { console.log( - 'Error! You must specify --version with the full name of a supported version, e.g., enterprise-server@2.22.' + 'Error! You must specify --version with the full name of a supported version, e.g., enterprise-server@2.22.', ) process.exit(1) } diff --git a/src/ghes-releases/scripts/remove-deprecated-frontmatter.js b/src/ghes-releases/scripts/remove-deprecated-frontmatter.js index e469050bc66b..41e4bb7919be 100644 --- a/src/ghes-releases/scripts/remove-deprecated-frontmatter.js +++ b/src/ghes-releases/scripts/remove-deprecated-frontmatter.js @@ -4,7 +4,7 @@ export default function removeDeprecatedFrontmatter( file, frontmatterVersions, releaseToDeprecate, - nextOldestRelease + nextOldestRelease, ) { // skip files with no Enterprise Server versions frontmatter if (!frontmatterVersions) return false @@ -39,7 +39,7 @@ export default function removeDeprecatedFrontmatter( // Throw a warning if there are no other frontmatter versions specified. if (Object.keys(frontmatterVersions).length === 1) { console.log( - `Warning! ${file} has frontmatter versioning that will make it never appear when ${releaseToDeprecate} is deprecated. The article should probably be removed.` + `Warning! ${file} has frontmatter versioning that will make it never appear when ${releaseToDeprecate} is deprecated. The article should probably be removed.`, ) return false } diff --git a/src/ghes-releases/scripts/remove-liquid-statements.js b/src/ghes-releases/scripts/remove-liquid-statements.js index a6aed90f9ffb..d1c65f53642b 100644 --- a/src/ghes-releases/scripts/remove-liquid-statements.js +++ b/src/ghes-releases/scripts/remove-liquid-statements.js @@ -121,7 +121,7 @@ export default function removeLiquidStatements(content, release, nextOldestRelea versionBlock.newContent = versionBlock.content.replace( replaceRegex, - `$1 ${versionBlock.condKeyword}` + `$1 ${versionBlock.condKeyword}`, ) } @@ -141,7 +141,7 @@ export default function removeLiquidStatements(content, release, nextOldestRelea // Update the conditional. versionBlock.newContent = versionBlock.content.replace( versionBlock.condWithLiquid, - newCondWithLiquid + newCondWithLiquid, ) } @@ -163,7 +163,7 @@ export default function removeLiquidStatements(content, release, nextOldestRelea if (!canBeRemoved) { versionBlock.newContent = versionBlock.content.replace( versionBlock.condWithLiquid, - newCondWithLiquid + newCondWithLiquid, ) } } @@ -201,7 +201,7 @@ export default function removeLiquidStatements(content, release, nextOldestRelea if (versionBlock.hasElsif) { versionBlock.newContent = versionBlock.newContent.replace( /({%-?) elsif/, - `$1 ${versionBlock.condKeyword}` + `$1 ${versionBlock.condKeyword}`, ) } diff --git a/src/ghes-releases/scripts/remove-static-files.js b/src/ghes-releases/scripts/remove-static-files.js index 860f0cf67853..bc4f3647efea 100755 --- a/src/ghes-releases/scripts/remove-static-files.js +++ b/src/ghes-releases/scripts/remove-static-files.js @@ -22,7 +22,7 @@ const restDecoratedDir = path.join(process.cwd(), 'src/rest/data') const ghesReleaseNotesDir = 'data/release-notes/enterprise-server' const supportedEnterpriseVersions = Object.values(allVersions).filter( - (v) => v.plan === 'enterprise-server' + (v) => v.plan === 'enterprise-server', ) // GHES release notes diff --git a/src/ghes-releases/scripts/remove-version-markup.js b/src/ghes-releases/scripts/remove-version-markup.js index 2233cc2f15ed..32d664beb531 100755 --- a/src/ghes-releases/scripts/remove-version-markup.js +++ b/src/ghes-releases/scripts/remove-version-markup.js @@ -18,7 +18,7 @@ import walkFiles from '../../../script/helpers/walk-files.js' program .description( - 'Remove Liquid conditionals and update versions frontmatter for a given Enterprise Server release.' + 'Remove Liquid conditionals and update versions frontmatter for a given Enterprise Server release.', ) .option('-r, --release <NUMBER>', 'Enterprise Server release number. Example: 2.19') .parse(process.argv) @@ -37,7 +37,7 @@ if (!release) { if (!all.includes(release)) { console.log( - `You specified ${release}! Please specify a supported or deprecated release number from lib/enterprise-server-releases.js` + `You specified ${release}! Please specify a supported or deprecated release number from lib/enterprise-server-releases.js`, ) process.exit(1) } @@ -69,7 +69,7 @@ async function main() { content, release, nextOldestRelease, - file + file, ) fileChanged ||= contentChanged @@ -81,7 +81,7 @@ async function main() { value, release, nextOldestRelease, - file + file, ) fileChanged ||= contentChanged data[key] = newContent diff --git a/src/ghes-releases/scripts/sync-automated-pipeline-data.js b/src/ghes-releases/scripts/sync-automated-pipeline-data.js index 199eb4bda309..38844ce600f1 100755 --- a/src/ghes-releases/scripts/sync-automated-pipeline-data.js +++ b/src/ghes-releases/scripts/sync-automated-pipeline-data.js @@ -38,7 +38,7 @@ const numberedReleaseBaseNames = Array.from( ...Object.values(allVersions) .filter((version) => version.hasNumberedReleases) .map((version) => version.openApiBaseName), - ]) + ]), ) // A list of currently supported versions (calendar date inclusive) @@ -52,7 +52,7 @@ const versionNamesCalDate = Object.values(allVersions) .map((version) => version.apiVersions.length ? version.apiVersions.map((apiVersion) => `${version.openApiVersionName}-${apiVersion}`) - : version.openApiVersionName + : version.openApiVersionName, ) .flat() // A list of currently supported versions in the format using the short name @@ -73,7 +73,7 @@ for (const pipeline of pipelines) { // filter the directory list to only include directories that start with // basenames with numbered releases (e.g., ghes-). const existingDataDir = directoryListing.filter((directory) => - numberedReleaseBaseNames.some((basename) => directory.startsWith(basename)) + numberedReleaseBaseNames.some((basename) => directory.startsWith(basename)), ) const expectedDirectory = isCalendarDateVersioned ? versionNamesCalDate : versionNames @@ -88,7 +88,7 @@ for (const pipeline of pipelines) { const addFiles = difference(expectedDirectory, existingDataDir) if (addFiles.length > numberedReleaseBaseNames.length) { throw new Error( - 'Only one new release per numbered release version should be added at a time. Check that the lib/enterprise-server-releases.js is correct.' + 'Only one new release per numbered release version should be added at a time. Check that the lib/enterprise-server-releases.js is correct.', ) } for (const base of numberedReleaseBaseNames) { @@ -100,7 +100,7 @@ for (const pipeline of pipelines) { const previousDirName = existingDataDir.filter((directory) => directory.includes(lastRelease)) console.log( - `Copying src/${pipeline}/data/${previousDirName} to src/${pipeline}/data/${dirToAdd}` + `Copying src/${pipeline}/data/${previousDirName} to src/${pipeline}/data/${dirToAdd}`, ) await cp(`src/${pipeline}/data/${previousDirName}`, `src/${pipeline}/data/${dirToAdd}`, { recursive: true, @@ -125,7 +125,7 @@ for (const directory of addRelNoteDirs) { await mkdirp(`data/release-notes/enterprise-server/${directory}`) await cp( `data/release-notes/PLACEHOLDER-TEMPLATE.yml`, - `data/release-notes/enterprise-server/${directory}/PLACEHOLDER.yml` + `data/release-notes/enterprise-server/${directory}/PLACEHOLDER.yml`, ) } diff --git a/src/ghes-releases/scripts/update-enterprise-dates.js b/src/ghes-releases/scripts/update-enterprise-dates.js index 1ed382c86381..d0f594a30e8e 100755 --- a/src/ghes-releases/scripts/update-enterprise-dates.js +++ b/src/ghes-releases/scripts/update-enterprise-dates.js @@ -30,11 +30,11 @@ async function main() { let rawDates = [] try { rawDates = JSON.parse( - await getContents('github', 'enterprise-releases', 'master', 'releases.json') + await getContents('github', 'enterprise-releases', 'master', 'releases.json'), ) } catch { console.log( - 'Failed to get the https://github.com/github/enterprise-releases/blob/master/releases.json content. Check that your token has the correct permissions.' + 'Failed to get the https://github.com/github/enterprise-releases/blob/master/releases.json content. Check that your token has the correct permissions.', ) process.exit(1) } diff --git a/src/ghes-releases/tests/remove-liquid-statements.js b/src/ghes-releases/tests/remove-liquid-statements.js index 01e70d7cb8aa..2cfd067e0f91 100644 --- a/src/ghes-releases/tests/remove-liquid-statements.js +++ b/src/ghes-releases/tests/remove-liquid-statements.js @@ -70,16 +70,16 @@ Alpha\n\n{% else %}\n\nBravo\n\n{% ifversion ghes > 2.16 %}\n\nCharlie\n const $ = cheerio.load(newContent) expect($('.example1').text().trim()).toBe(`Alpha`) expect($('.example2').text().trim()).toBe( - `Alpha\n {% ifversion fpt or ghec %}\n Bravo\n {% endif %}` + `Alpha\n {% ifversion fpt or ghec %}\n Bravo\n {% endif %}`, ) expect($('.example3').text().trim()).toBe( - `Alpha\n {% ifversion fpt or ghec %}\n Bravo\n {% else %}\n Delta\n {% endif %}` + `Alpha\n {% ifversion fpt or ghec %}\n Bravo\n {% else %}\n Delta\n {% endif %}`, ) expect($('.example4').text().trim()).toBe( - `Alpha\n {% ifversion fpt or ghec %}\n Bravo\n {% ifversion ghae %}\n Charlie\n {% endif %}\n {% endif %}` + `Alpha\n {% ifversion fpt or ghec %}\n Bravo\n {% ifversion ghae %}\n Charlie\n {% endif %}\n {% endif %}`, ) expect($('.example5').text().trim()).toBe( - `Alpha\n {% ifversion fpt or ghec %}\n Bravo\n {% ifversion ghae %}\n Charlie\n {% endif %}\n {% else %}\n Delta\n {% endif %}` + `Alpha\n {% ifversion fpt or ghec %}\n Bravo\n {% ifversion ghae %}\n Charlie\n {% endif %}\n {% else %}\n Delta\n {% endif %}`, ) }) @@ -88,7 +88,7 @@ Alpha\n\n{% else %}\n\nBravo\n\n{% ifversion ghes > 2.16 %}\n\nCharlie\n const { newContent } = removeLiquidStatements(content, versionToDeprecate, nextOldestVersion) const $ = cheerio.load(newContent) expect($('.example1').text().trim()).toBe( - '{% ifversion not fpt and ghes %}\n\nAlpha\n\n{% endif %}' + '{% ifversion not fpt and ghes %}\n\nAlpha\n\n{% endif %}', ) expect($('.example2').text().trim()) .toBe(`{% ifversion not fpt and ghes %}\n\nAlpha\n\n{% else %}\n @@ -147,7 +147,7 @@ Alpha\n\n{% else %}\n\nBravo\n\n{% endif %}`) Alpha\n\n{% else %}\n\nCharlie\n\n{% endif %}`) expect($('.example5').text().trim()).toBe('Charlie') expect($('.example6').text().trim()).toBe( - 'Charlie\n\n{% ifversion fpt or ghes %}\n\nBravo\n\n{% endif %}' + 'Charlie\n\n{% ifversion fpt or ghes %}\n\nBravo\n\n{% endif %}', ) }) @@ -157,7 +157,7 @@ Alpha\n\n{% else %}\n\nCharlie\n\n{% endif %}`) const $ = cheerio.load(newContent) expect($('.example1').text().trim()).toBe('Alpha') expect($('.example2').text().trim()).toBe( - 'Alpha\n\n{% ifversion fpt %}\n\nBravo\n\n{% endif %}' + 'Alpha\n\n{% ifversion fpt %}\n\nBravo\n\n{% endif %}', ) expect($('.example3').text().trim()).toBe(`{% ifversion fpt %}\n Alpha\n\n{% else %}\n\nBravo\n\n{% endif %}`) @@ -208,7 +208,7 @@ describe('whitespace', () => { const $ = cheerio.load(newContent) expect($('.example5').text()).toBe('\n{% ifversion ghes %}\n Alpha\n{% endif %}\n') expect($('.example6').text()).toBe( - '\n Alpha\n{% ifversion fpt or ghes %}\n Bravo\n{% endif %}\n Charlie\n' + '\n Alpha\n{% ifversion fpt or ghes %}\n Bravo\n{% endif %}\n Charlie\n', ) expect($('.example7').text()).toBe('\nAlpha{% ifversion fpt or ghes %}\nBravo{% endif %}\n') }) diff --git a/src/github-apps/components/EnabledList.tsx b/src/github-apps/components/EnabledList.tsx index f4520d3ecab7..a1bce87adde2 100644 --- a/src/github-apps/components/EnabledList.tsx +++ b/src/github-apps/components/EnabledList.tsx @@ -67,7 +67,7 @@ export function EnabledList({ })} </ul> </Fragment> - ) + ), ) return ( diff --git a/src/github-apps/components/PermissionsList.tsx b/src/github-apps/components/PermissionsList.tsx index 958031a14573..7cf40cea711d 100644 --- a/src/github-apps/components/PermissionsList.tsx +++ b/src/github-apps/components/PermissionsList.tsx @@ -108,7 +108,7 @@ export function PermissionsList({ ) : null const additionalPermissions = operation['additional-permissions'].map( - (permission) => items[permission].displayTitle + (permission) => items[permission].displayTitle, ) const permissionsClass = operation['additional-permissions'].length ? '' diff --git a/src/github-apps/scripts/sync.js b/src/github-apps/scripts/sync.js index b1bdf46b6003..306e7a414a6c 100755 --- a/src/github-apps/scripts/sync.js +++ b/src/github-apps/scripts/sync.js @@ -63,20 +63,20 @@ export async function syncGitHubAppsData(openApiSource, sourceSchemas, progAcces // permissions for (const [permissionName, readOrWrite] of Object.entries( - progAccessData[operation.operationId].permissions + progAccessData[operation.operationId].permissions, )) { const tempTitle = permissionName.replace(/_/g, ' ') const permissionNameExists = progActorResources[permissionName] if (!permissionNameExists) { console.warn( - `The permission ${permissionName} is missing from config/locales/programmatic_actor_fine_grained_resources.en.yml. Creating a placeholder value of ${tempTitle} until it's added.` + `The permission ${permissionName} is missing from config/locales/programmatic_actor_fine_grained_resources.en.yml. Creating a placeholder value of ${tempTitle} until it's added.`, ) } const title = progActorResources[permissionName]?.title || tempTitle const resourceGroup = progActorResources[permissionName]?.resource_group || '' const displayTitle = getDisplayTitle(title, resourceGroup) const relatedPermissionNames = Object.keys( - progAccessData[operation.operationId].permissions + progAccessData[operation.operationId].permissions, ).filter((permission) => permission !== permissionName) // github app permissions @@ -94,7 +94,7 @@ export async function syncGitHubAppsData(openApiSource, sourceSchemas, progAcces 'additional-permissions': relatedPermissionNames, } serverToServerPermissions[permissionName].permissions.push( - Object.assign({}, appDataOperationWithCategory, { access: readOrWrite }, worksWithData) + Object.assign({}, appDataOperationWithCategory, { access: readOrWrite }, worksWithData), ) // fine-grained pats @@ -112,7 +112,7 @@ export async function syncGitHubAppsData(openApiSource, sourceSchemas, progAcces Object.assign({}, appDataOperationWithCategory, { 'additional-permissions': relatedPermissionNames, access: readOrWrite, - }) + }), ) } } @@ -134,7 +134,7 @@ export async function syncGitHubAppsData(openApiSource, sourceSchemas, progAcces const filename = `${pageType}.json` if (Object.keys(data).length === 0) { throw new Error( - `Generating GitHub Apps data failed for ${openApiSource}/${schemaName}. The generated data file was empty.` + `Generating GitHub Apps data failed for ${openApiSource}/${schemaName}. The generated data file was empty.`, ) } const sortedOperations = pageType.includes('permissions') @@ -160,23 +160,23 @@ async function getProgAccessData(progAccessSource) { // check for required PAT if (!process.env.GITHUB_TOKEN) { throw new Error( - 'Error! You must have the GITHUB_TOKEN environment variable set to access the programmatic access and resource files via the GitHub REST API.' + 'Error! You must have the GITHUB_TOKEN environment variable set to access the programmatic access and resource files via the GitHub REST API.', ) } if (progAccessSource) { progAccessDataRaw = yaml.load( - await readFile(path.join(progAccessSource, progAccessFilepath), 'utf8') + await readFile(path.join(progAccessSource, progAccessFilepath), 'utf8'), ) progActorResources = yaml.load( - await readFile(path.join(progAccessSource, progActorFilepath), 'utf8') + await readFile(path.join(progAccessSource, progActorFilepath), 'utf8'), ).en.programmatic_actor_fine_grained_resources } else { progAccessDataRaw = yaml.load( - await getContents('github', 'github', 'master', progAccessFilepath) + await getContents('github', 'github', 'master', progAccessFilepath), ) progActorResources = yaml.load( - await getContents('github', 'github', 'master', progActorFilepath) + await getContents('github', 'github', 'master', progActorFilepath), ).en.programmatic_actor_fine_grained_resources } diff --git a/src/github-apps/tests/rendering.js b/src/github-apps/tests/rendering.js index 97c5f4cf3eb7..8676ec336822 100644 --- a/src/github-apps/tests/rendering.js +++ b/src/github-apps/tests/rendering.js @@ -34,8 +34,8 @@ describe('REST references docs', () => { (item) => `/en/rest/${key}${ categoriesWithoutSubcategories.includes(key) ? '' : '/' + item.subcategory - }#${item.slug}` - ) + }#${item.slug}`, + ), ) } // get all of the href attributes in the anchor tags @@ -64,8 +64,8 @@ describe('REST references docs', () => { (item) => `/en/rest/${item.category}${ categoriesWithoutSubcategories.includes(item.category) ? '' : '/' + item.subcategory - }#${item.slug}` - ) + }#${item.slug}`, + ), ) } diff --git a/src/graphql/components/GraphqlPage.tsx b/src/graphql/components/GraphqlPage.tsx index f6e5503f17e0..3add5f7145fa 100644 --- a/src/graphql/components/GraphqlPage.tsx +++ b/src/graphql/components/GraphqlPage.tsx @@ -35,49 +35,49 @@ export const GraphqlPage = ({ schema, pageName, objects }: Props) => { // for each section. if (pageName === 'queries') { graphqlItems.push( - ...(schema as QueryT[]).map((item) => <Query item={item} key={item.id + item.name} />) + ...(schema as QueryT[]).map((item) => <Query item={item} key={item.id + item.name} />), ) } else if (pageName === 'enums') { graphqlItems.push( ...(schema as EnumT[]).map((item) => { return <Enum key={item.id} item={item} /> - }) + }), ) } else if (pageName === 'inputObjects') { graphqlItems.push( ...(schema as InputObjectT[]).map((item) => { return <InputObject key={item.id} item={item} /> - }) + }), ) } else if (pageName === 'interfaces' && objects) { graphqlItems.push( ...(schema as InterfaceT[]).map((item) => { return <Interface key={item.id} item={item} objects={objects} /> - }) + }), ) } else if (pageName === 'mutations') { graphqlItems.push( ...(schema as MutationT[]).map((item) => { return <Mutation key={item.id} item={item} /> - }) + }), ) } else if (pageName === 'objects') { graphqlItems.push( ...(schema as ObjectT[]).map((item) => { return <Object key={item.id} item={item} /> - }) + }), ) } else if (pageName === 'scalars') { graphqlItems.push( ...(schema as ScalarT[]).map((item) => { return <Scalar key={item.id} item={item} /> - }) + }), ) } else if (pageName === 'unions') { graphqlItems.push( ...(schema as UnionT[]).map((item) => { return <Union key={item.id} item={item} /> - }) + }), ) } diff --git a/src/graphql/components/Interface.tsx b/src/graphql/components/Interface.tsx index bb9fcde1babe..83f87b71671d 100644 --- a/src/graphql/components/Interface.tsx +++ b/src/graphql/components/Interface.tsx @@ -20,7 +20,7 @@ export function Interface({ item, objects }: Props) { const implementedBy = objects.filter( (object) => object.implements && - object.implements.some((implementsItem) => implementsItem.name === item.name) + object.implements.some((implementsItem) => implementsItem.name === item.name), ) return ( diff --git a/src/graphql/components/Query.tsx b/src/graphql/components/Query.tsx index c4925156937a..5c37f0d0e5fd 100644 --- a/src/graphql/components/Query.tsx +++ b/src/graphql/components/Query.tsx @@ -32,7 +32,7 @@ export function Query({ item }: Props) { dangerouslySetInnerHTML={{ __html: t('graphql.reference.arguments').replace( '{{ GraphQLItemTitle }}', - item.name + item.name, ), }} /> diff --git a/src/graphql/components/Table.tsx b/src/graphql/components/Table.tsx index 03c4cbb85896..794a0ff47e1e 100644 --- a/src/graphql/components/Table.tsx +++ b/src/graphql/components/Table.tsx @@ -63,7 +63,7 @@ export function Table({ fields }: Props) { dangerouslySetInnerHTML={{ __html: t('graphql.reference.arguments').replace( '{{ GraphQLItemTitle }}', - field.name + field.name, ), }} /> diff --git a/src/graphql/lib/index.js b/src/graphql/lib/index.js index 5b2f0d96ea57..6614783bb820 100644 --- a/src/graphql/lib/index.js +++ b/src/graphql/lib/index.js @@ -23,7 +23,7 @@ export function getGraphqlSchema(version, type) { if (!graphqlSchema.has(graphqlVersion)) { graphqlSchema.set( graphqlVersion, - readCompressedJsonFileFallback(`${GRAPHQL_DATA_DIR}/${graphqlVersion}/schema.json`) + readCompressedJsonFileFallback(`${GRAPHQL_DATA_DIR}/${graphqlVersion}/schema.json`), ) } return graphqlSchema.get(graphqlVersion)[type] @@ -34,7 +34,9 @@ export function getGraphqlChangelog(version) { if (!changelog.has(graphqlVersion)) { changelog.set( graphqlVersion, - readCompressedJsonFileFallbackLazily(`${GRAPHQL_DATA_DIR}/${graphqlVersion}/changelog.json`)() + readCompressedJsonFileFallbackLazily( + `${GRAPHQL_DATA_DIR}/${graphqlVersion}/changelog.json`, + )(), ) } @@ -45,7 +47,7 @@ export function getGraphqlBreakingChanges(version) { const graphqlVersion = getGraphqlVersion(version) if (!upcomingChanges.has(graphqlVersion)) { const data = readCompressedJsonFileFallbackLazily( - `${GRAPHQL_DATA_DIR}/${graphqlVersion}/upcoming-changes.json` + `${GRAPHQL_DATA_DIR}/${graphqlVersion}/upcoming-changes.json`, )() upcomingChanges.set(graphqlVersion, data) } @@ -56,7 +58,7 @@ export function getPreviews(version) { const graphqlVersion = getGraphqlVersion(version) if (!previews.has(graphqlVersion)) { const data = readCompressedJsonFileFallbackLazily( - `${GRAPHQL_DATA_DIR}/${graphqlVersion}/previews.json` + `${GRAPHQL_DATA_DIR}/${graphqlVersion}/previews.json`, )() previews.set(graphqlVersion, data) } @@ -74,7 +76,7 @@ export async function getMiniToc(context, type, items, depth = 2, markdownHeadin items, context, depth, - markdownHeading + markdownHeading, ) miniTocs.get(currentLanguage).get(graphqlVersion).set(type, graphqlMiniTocItems) } diff --git a/src/graphql/pages/breaking-changes.tsx b/src/graphql/pages/breaking-changes.tsx index 2eff9ce82039..e55c72809b34 100644 --- a/src/graphql/pages/breaking-changes.tsx +++ b/src/graphql/pages/breaking-changes.tsx @@ -63,7 +63,7 @@ export const getServerSideProps: GetServerSideProps<Props> = async (context) => slug, }, ] - }) + }), ) const titles = Object.values(headings).map((heading) => heading.title) const changelogMiniTocItems = await getAutomatedPageMiniTocItems(titles, req.context.context, 2) diff --git a/src/graphql/scripts/build-changelog.js b/src/graphql/scripts/build-changelog.js index a1af25460dd5..5aa598669631 100644 --- a/src/graphql/scripts/build-changelog.js +++ b/src/graphql/scripts/build-changelog.js @@ -42,7 +42,7 @@ export async function createChangelogEntry( newSchemaString, previews, oldUpcomingChanges, - newUpcomingChanges + newUpcomingChanges, ) { // Create schema objects out of the strings const oldSchema = await loadSchema(oldSchemaString, {}) @@ -58,14 +58,15 @@ export async function createChangelogEntry( // Do nothing } else { throw new Error( - 'This change type should be added to CHANGES_TO_REPORT or CHANGES_TO_IGNORE: ' + change.type + 'This change type should be added to CHANGES_TO_REPORT or CHANGES_TO_IGNORE: ' + + change.type, ) } }) const { schemaChangesToReport, previewChangesToReport } = segmentPreviewChanges( changesToReport, - previews + previews, ) const addedUpcomingChanges = newUpcomingChanges.filter(function (change) { @@ -96,7 +97,7 @@ export async function createChangelogEntry( const renderedScheamChanges = await Promise.all( cleanedSchemaChanges.map(async (change) => { return await renderContent(change) - }) + }), ) const schemaChange = { title: 'The GraphQL schema includes these changes:', @@ -111,7 +112,7 @@ export async function createChangelogEntry( const renderedPreviewChanges = await Promise.all( cleanedPreviewChanges.map(async (change) => { return renderContent(change) - }) + }), ) const cleanTitle = cleanPreviewTitle(previewTitle) const entryTitle = @@ -136,7 +137,7 @@ export async function createChangelogEntry( const renderedUpcomingChanges = await Promise.all( cleanedUpcomingChanges.map(async (change) => { return await renderContent(change) - }) + }), ) changelogEntry.upcomingChanges.push({ title: 'The following changes will be made to the schema:', diff --git a/src/graphql/scripts/sync.js b/src/graphql/scripts/sync.js index 303318896ac8..ae6db380e6e2 100755 --- a/src/graphql/scripts/sync.js +++ b/src/graphql/scripts/sync.js @@ -14,7 +14,7 @@ import { prependDatedEntry, createChangelogEntry } from './build-changelog.js' const graphqlDataDir = path.join(process.cwd(), 'data/graphql') const graphqlStaticDir = path.join(process.cwd(), 'src/graphql/data') const dataFilenames = JSON.parse( - await fs.readFile(path.join(process.cwd(), './src/graphql/scripts/utils/data-filenames.json')) + await fs.readFile(path.join(process.cwd(), './src/graphql/scripts/utils/data-filenames.json')), ) // check for required PAT @@ -41,7 +41,7 @@ async function main() { const previewsJson = processPreviews(safeForPublicPreviews) await updateStaticFile( previewsJson, - path.join(graphqlStaticDir, graphqlVersion, 'previews.json') + path.join(graphqlStaticDir, graphqlVersion, 'previews.json'), ) // 2. UPDATE UPCOMING CHANGES @@ -52,7 +52,7 @@ async function main() { const upcomingChangesJson = await processUpcomingChanges(safeForPublicChanges) await updateStaticFile( upcomingChangesJson, - path.join(graphqlStaticDir, graphqlVersion, 'upcoming-changes.json') + path.join(graphqlStaticDir, graphqlVersion, 'upcoming-changes.json'), ) // 3. UPDATE SCHEMAS @@ -64,7 +64,7 @@ async function main() { const schemaJsonPerVersion = await processSchemas(latestSchema, safeForPublicPreviews) await updateStaticFile( schemaJsonPerVersion, - path.join(graphqlStaticDir, graphqlVersion, 'schema.json') + path.join(graphqlStaticDir, graphqlVersion, 'schema.json'), ) // 4. UPDATE CHANGELOG @@ -75,12 +75,12 @@ async function main() { latestSchema, safeForPublicPreviews, previousUpcomingChanges.upcoming_changes, - yaml.load(safeForPublicChanges).upcoming_changes + yaml.load(safeForPublicChanges).upcoming_changes, ) if (changelogEntry) { prependDatedEntry( changelogEntry, - path.join(graphqlStaticDir, graphqlVersion, 'changelog.json') + path.join(graphqlStaticDir, graphqlVersion, 'changelog.json'), ) } } diff --git a/src/graphql/scripts/utils/process-previews.js b/src/graphql/scripts/utils/process-previews.js index ac532a350b19..6bdfdfc573a8 100644 --- a/src/graphql/scripts/utils/process-previews.js +++ b/src/graphql/scripts/utils/process-previews.js @@ -17,7 +17,7 @@ export default function processPreviews(previews) { // filter out schema members that end in `Input` or `Payload` preview.toggled_on = preview.toggled_on.filter( - (schemaMember) => !inputOrPayload.test(schemaMember) + (schemaMember) => !inputOrPayload.test(schemaMember), ) // remove unnecessary leading colon diff --git a/src/graphql/scripts/utils/process-schemas.js b/src/graphql/scripts/utils/process-schemas.js index 2d534777b56f..1afd8fc7f096 100755 --- a/src/graphql/scripts/utils/process-schemas.js +++ b/src/graphql/scripts/utils/process-schemas.js @@ -6,7 +6,7 @@ import fs from 'fs/promises' import path from 'path' const externalScalarsJSON = JSON.parse( - await fs.readFile(path.join(process.cwd(), './src/graphql/lib/non-schema-scalars.json')) + await fs.readFile(path.join(process.cwd(), './src/graphql/lib/non-schema-scalars.json')), ) const externalScalars = await Promise.all( externalScalarsJSON.map(async (scalar) => { @@ -14,7 +14,7 @@ const externalScalars = await Promise.all( scalar.id = helpers.getId(scalar.name) scalar.href = helpers.getFullLink('scalars', scalar.id) return scalar - }) + }), ) // select and format all the data from the schema that we need for the docs @@ -69,20 +69,20 @@ export default async function processSchemas(idl, previewsPerVersion) { queryArg.isDeprecated = helpers.getDeprecationStatus(arg.directives, queryArg.name) queryArg.deprecationReason = await helpers.getDeprecationReason( arg.directives, - queryArg + queryArg, ) queryArg.preview = await helpers.getPreview( arg.directives, queryArg, - previewsPerVersion + previewsPerVersion, ) queryArgs.push(queryArg) - }) + }), ) query.args = sortBy(queryArgs, 'name') data.queries.push(query) - }) + }), ) return @@ -104,12 +104,12 @@ export default async function processSchemas(idl, previewsPerVersion) { mutation.isDeprecated = helpers.getDeprecationStatus(field.directives, mutation.name) mutation.deprecationReason = await helpers.getDeprecationReason( field.directives, - mutation + mutation, ) mutation.preview = await helpers.getPreview( field.directives, mutation, - previewsPerVersion + previewsPerVersion, ) // there is only ever one input field argument, but loop anyway @@ -122,7 +122,7 @@ export default async function processSchemas(idl, previewsPerVersion) { inputField.kind = helpers.getTypeKind(inputField.type, schema) inputField.href = helpers.getFullLink(inputField.kind, inputField.id) inputFields.push(inputField) - }) + }), ) mutation.inputFields = sortBy(inputFields, 'name') @@ -131,7 +131,7 @@ export default async function processSchemas(idl, previewsPerVersion) { // first get the payload, then find payload object's fields. these are the mutation's return fields. const returnType = helpers.getType(field) const mutationReturnFields = objectsInSchema.find( - (obj) => obj.name.value === returnType + (obj) => obj.name.value === returnType, ) if (!mutationReturnFields) console.log(`no return fields found for ${returnType}`) @@ -147,25 +147,25 @@ export default async function processSchemas(idl, previewsPerVersion) { returnField.description = await helpers.getDescription(field.description.value) returnField.isDeprecated = helpers.getDeprecationStatus( field.directives, - returnField.name + returnField.name, ) returnField.deprecationReason = await helpers.getDeprecationReason( field.directives, - returnField + returnField, ) returnField.preview = await helpers.getPreview( field.directives, returnField, - previewsPerVersion + previewsPerVersion, ) returnFields.push(returnField) - }) + }), ) mutation.returnFields = sortBy(returnFields, 'name') data.mutations.push(mutation) - }) + }), ) return } @@ -199,7 +199,7 @@ export default async function processSchemas(idl, previewsPerVersion) { objectInterface.id = helpers.getId(objectInterface.name) objectInterface.href = helpers.getFullLink('interfaces', objectInterface.id) objectImplements.push(objectInterface) - }) + }), ) } @@ -220,16 +220,16 @@ export default async function processSchemas(idl, previewsPerVersion) { objectField.isDeprecated = helpers.getDeprecationStatus(field.directives) objectField.deprecationReason = await helpers.getDeprecationReason( field.directives, - objectField + objectField, ) objectField.preview = await helpers.getPreview( field.directives, objectField, - previewsPerVersion + previewsPerVersion, ) objectFields.push(objectField) - }) + }), ) } @@ -253,12 +253,12 @@ export default async function processSchemas(idl, previewsPerVersion) { graphqlInterface.isDeprecated = helpers.getDeprecationStatus(def.directives) graphqlInterface.deprecationReason = await helpers.getDeprecationReason( def.directives, - graphqlInterface + graphqlInterface, ) graphqlInterface.preview = await helpers.getPreview( def.directives, graphqlInterface, - previewsPerVersion + previewsPerVersion, ) // an interface's fields render in the "Fields" section @@ -278,16 +278,16 @@ export default async function processSchemas(idl, previewsPerVersion) { interfaceField.isDeprecated = helpers.getDeprecationStatus(field.directives) interfaceField.deprecationReason = await helpers.getDeprecationReason( field.directives, - interfaceField + interfaceField, ) interfaceField.preview = await helpers.getPreview( field.directives, interfaceField, - previewsPerVersion + previewsPerVersion, ) interfaceFields.push(interfaceField) - }) + }), ) } @@ -310,12 +310,12 @@ export default async function processSchemas(idl, previewsPerVersion) { graphqlEnum.isDeprecated = helpers.getDeprecationStatus(def.directives) graphqlEnum.deprecationReason = await helpers.getDeprecationReason( def.directives, - graphqlEnum + graphqlEnum, ) graphqlEnum.preview = await helpers.getPreview( def.directives, graphqlEnum, - previewsPerVersion + previewsPerVersion, ) await Promise.all( @@ -324,7 +324,7 @@ export default async function processSchemas(idl, previewsPerVersion) { enumValue.name = value.name.value enumValue.description = await helpers.getDescription(value.description.value) enumValues.push(enumValue) - }) + }), ) graphqlEnum.values = sortBy(enumValues, 'name') @@ -355,7 +355,7 @@ export default async function processSchemas(idl, previewsPerVersion) { possibleType.id = helpers.getId(possibleType.name) possibleType.href = helpers.getFullLink('objects', possibleType.id) possibleTypes.push(possibleType) - }) + }), ) union.possibleTypes = sortBy(possibleTypes, 'name') @@ -380,12 +380,12 @@ export default async function processSchemas(idl, previewsPerVersion) { inputObject.isDeprecated = helpers.getDeprecationStatus(def.directives) inputObject.deprecationReason = await helpers.getDeprecationReason( def.directives, - inputObject + inputObject, ) inputObject.preview = await helpers.getPreview( def.directives, inputObject, - previewsPerVersion + previewsPerVersion, ) if (def.fields.length) { @@ -402,16 +402,16 @@ export default async function processSchemas(idl, previewsPerVersion) { inputField.isDeprecated = helpers.getDeprecationStatus(field.directives) inputField.deprecationReason = await helpers.getDeprecationReason( field.directives, - inputField + inputField, ) inputField.preview = await helpers.getPreview( field.directives, inputField, - previewsPerVersion + previewsPerVersion, ) inputFields.push(inputField) - }) + }), ) } @@ -434,7 +434,7 @@ export default async function processSchemas(idl, previewsPerVersion) { scalar.preview = await helpers.getPreview(def.directives, scalar, previewsPerVersion) data.scalars.push(scalar) } - }) + }), ) // add non-schema scalars and sort all scalars alphabetically diff --git a/src/graphql/scripts/utils/schema-helpers.js b/src/graphql/scripts/utils/schema-helpers.js index 5ad867d39ba9..dc69805d80df 100644 --- a/src/graphql/scripts/utils/schema-helpers.js +++ b/src/graphql/scripts/utils/schema-helpers.js @@ -5,7 +5,7 @@ import graphql from 'graphql' import path from 'path' const graphqlTypes = JSON.parse( - await fs.readFile(path.join(process.cwd(), './src/graphql/lib/types.json')) + await fs.readFile(path.join(process.cwd(), './src/graphql/lib/types.json')), ) const { isScalarType, isObjectType, isInterfaceType, isUnionType, isEnumType, isInputObjectType } = graphql diff --git a/src/graphql/tests/build-changelog.js b/src/graphql/tests/build-changelog.js index ab25cd989c30..2cbd7d83d080 100644 --- a/src/graphql/tests/build-changelog.js +++ b/src/graphql/tests/build-changelog.js @@ -12,7 +12,7 @@ import readJsonFile from '../../../lib/read-json-file.js' const expectedChangelogEntry = readJsonFile('src/graphql/tests/fixtures/changelog-entry.json') const expectedUpdatedChangelogFile = readJsonFile( - 'src/graphql/tests/fixtures/updated-changelog-file.json' + 'src/graphql/tests/fixtures/updated-changelog-file.json', ) describe('creating a changelog from old schema and new schema', () => { @@ -89,7 +89,7 @@ upcoming_changes: newSchemaString, previews, oldUpcomingChanges, - newUpcomingChanges + newUpcomingChanges, ) expect(entry).toEqual(expectedChangelogEntry) }) diff --git a/src/graphql/tests/get-schema-files.js b/src/graphql/tests/get-schema-files.js index 6010febbfdc1..e09015208ceb 100644 --- a/src/graphql/tests/get-schema-files.js +++ b/src/graphql/tests/get-schema-files.js @@ -11,7 +11,7 @@ import { describe('graphql schema', () => { const graphqlTypes = JSON.parse(readFileSync('src/graphql/lib/types.json')).map( - (item) => item.kind + (item) => item.kind, ) for (const version in allVersions) { for (const type of graphqlTypes) { diff --git a/src/graphql/tests/validate-schema.js b/src/graphql/tests/validate-schema.js index 0086fc453ce8..035beb64f026 100644 --- a/src/graphql/tests/validate-schema.js +++ b/src/graphql/tests/validate-schema.js @@ -43,7 +43,7 @@ describe('graphql json files', () => { if (!valid) { errors = `kind: ${typeObj.kind}, name: ${typeObj.name}: ${formatAjvErrors( - schemaValidatorFunctions[type].errors + schemaValidatorFunctions[type].errors, )}` } diff --git a/src/landings/components/ArticleCards.tsx b/src/landings/components/ArticleCards.tsx index a5a0ee9c20b9..3b7935e7bda0 100644 --- a/src/landings/components/ArticleCards.tsx +++ b/src/landings/components/ArticleCards.tsx @@ -26,7 +26,7 @@ export const ArticleCards = () => { const matchesType = card.type === typeFilter?.key const matchesTopic = card.topics.some((key) => key === topicFilter?.key) return (typeFilter?.key ? matchesType : true) && (topicFilter?.key ? matchesTopic : true) - }) + }), ) }, [typeFilter, topicFilter]) diff --git a/src/landings/components/ProductGuidesContext.tsx b/src/landings/components/ProductGuidesContext.tsx index 52f1a7d04dcd..54929984192a 100644 --- a/src/landings/components/ProductGuidesContext.tsx +++ b/src/landings/components/ProductGuidesContext.tsx @@ -33,7 +33,7 @@ export const useProductGuidesContext = (): ProductGuidesContextT => { if (!context) { throw new Error( - '"useProductGuidesContext" may only be used inside "ProductGuidesContext.Provider"' + '"useProductGuidesContext" may only be used inside "ProductGuidesContext.Provider"', ) } diff --git a/src/landings/components/ProductLandingContext.tsx b/src/landings/components/ProductLandingContext.tsx index 14d012c6dfee..c7ef5196eb42 100644 --- a/src/landings/components/ProductLandingContext.tsx +++ b/src/landings/components/ProductLandingContext.tsx @@ -70,7 +70,7 @@ export const useProductLandingContext = (): ProductLandingContextT => { if (!context) { throw new Error( - '"useProductLandingContext" may only be used inside "ProductLandingContext.Provider"' + '"useProductLandingContext" may only be used inside "ProductLandingContext.Provider"', ) } @@ -90,12 +90,12 @@ export const getFeaturedLinksFromReq = (req: any): Record<string, Array<Featured fullTitle: entry.fullTitle || null, })), ] - }) + }), ) } export const getProductLandingContextFromRequest = async ( - req: any + req: any, ): Promise<ProductLandingContextT> => { const productTree = req.context.currentProductTree const page = req.context.page @@ -128,7 +128,7 @@ export const getProductLandingContextFromRequest = async ( ({ user, description }: any) => ({ username: user, description, - }) + }), ), introLinks: page.introLinks || null, diff --git a/src/landings/components/ProductReleases.tsx b/src/landings/components/ProductReleases.tsx index 2bd74c238e8d..c91f0f206048 100644 --- a/src/landings/components/ProductReleases.tsx +++ b/src/landings/components/ProductReleases.tsx @@ -59,7 +59,7 @@ export function ProductReleases() { className="text-bold" {...{ 'aria-label': `${shortTitle || title} - ${t( - 'browse_all' + 'browse_all', )} ${releaseNumber} ${t('docs')}`, }} href={`/${router.locale}/${releaseVersion}`} diff --git a/src/landings/components/SidebarProduct.tsx b/src/landings/components/SidebarProduct.tsx index 7edf46f57f48..eaad249e4694 100644 --- a/src/landings/components/SidebarProduct.tsx +++ b/src/landings/components/SidebarProduct.tsx @@ -99,13 +99,13 @@ export const SidebarProduct = () => { (page) => page.href.includes('guides') || page.href.includes('overview') || - page.href.includes('quickstart') + page.href.includes('quickstart'), ) const restPages = sidebarTree.childPages.filter( (page) => !page.href.includes('guides') && !page.href.includes('overview') && - !page.href.includes('quickstart') + !page.href.includes('quickstart'), ) return ( <> diff --git a/src/landings/components/TableOfContents.tsx b/src/landings/components/TableOfContents.tsx index 18d031f3d17a..e2a5ca36afed 100644 --- a/src/landings/components/TableOfContents.tsx +++ b/src/landings/components/TableOfContents.tsx @@ -55,7 +55,7 @@ export const TableOfContents = (props: Props) => { {(childTocItems || []).length > 0 && ( <ul className={cx( - variant === 'compact' ? 'list-style-circle pl-5' : 'list-style-none' + variant === 'compact' ? 'list-style-circle pl-5' : 'list-style-none', )} > {(childTocItems || []).map((childItem) => { diff --git a/src/landings/middleware/featured-links.js b/src/landings/middleware/featured-links.js index d6cc9fb2e353..aada28c98a19 100644 --- a/src/landings/middleware/featured-links.js +++ b/src/landings/middleware/featured-links.js @@ -30,7 +30,7 @@ export default async function featuredLinks(req, res, next) { req.context, { textOnly: true, - } + }, ) const item = { title, href: req.context.page.featuredLinks[key][i].href } @@ -42,7 +42,7 @@ export default async function featuredLinks(req, res, next) { req.context.featuredLinks[key] = await getLinkData( req.context.page.featuredLinks[key], req.context, - { title: true, intro: true, fullTitle: true } + { title: true, intro: true, fullTitle: true }, ) } } diff --git a/src/landings/pages/home.tsx b/src/landings/pages/home.tsx index 236d77d0c38f..3706d8ce5988 100644 --- a/src/landings/pages/home.tsx +++ b/src/landings/pages/home.tsx @@ -81,7 +81,7 @@ export const getServerSideProps: GetServerSideProps<Props> = async (context) => mainContext: await getMainContext(req, res), productGroups: req.context.productGroups, gettingStartedLinks: req.context.featuredLinks.gettingStarted.map( - ({ title, href, intro }: any) => ({ title, href, intro }) + ({ title, href, intro }: any) => ({ title, href, intro }), ), popularLinks: req.context.featuredLinks.popular.map(({ title, href, intro }: any) => ({ title, diff --git a/src/landings/tests/curated-homepage-links.js b/src/landings/tests/curated-homepage-links.js index 5be12128673e..35a883cc791a 100644 --- a/src/landings/tests/curated-homepage-links.js +++ b/src/landings/tests/curated-homepage-links.js @@ -16,11 +16,11 @@ describe('curated homepage links', () => { expect(linkUrl.startsWith('/en/')).toBe(true) expect( $(el).find('[data-testid=link-with-intro-title]').text().trim().length, - `Did not find a title for the linked article ${linkUrl}` + `Did not find a title for the linked article ${linkUrl}`, ).toBeGreaterThan(0) expect( $(el).find('[data-testid=link-with-intro-intro]').text().trim().length, - `Did not find an intro for the linked article ${linkUrl}` + `Did not find an intro for the linked article ${linkUrl}`, ).toBeGreaterThan(0) // ensure there's no unwanted nested HTML diff --git a/src/landings/tests/featured-links.js b/src/landings/tests/featured-links.js index d683cb358f59..e46781ff3ebf 100644 --- a/src/landings/tests/featured-links.js +++ b/src/landings/tests/featured-links.js @@ -19,13 +19,13 @@ describe('featuredLinks', () => { expect($featuredLinks.eq(0).attr('href')).toBe('/en/get-started/quickstart/set-up-git') expect($featuredLinks.eq(0).children('h3').text().startsWith('Set up Git')).toBe(true) expect($featuredLinks.eq(0).children('p').text().startsWith('At the heart of GitHub')).toBe( - true + true, ) expect($featuredLinks.eq(8).attr('href')).toBe('/en/pages') expect($featuredLinks.eq(8).children('h3').text().startsWith('GitHub Pages')).toBe(true) expect( - $featuredLinks.eq(8).children('p').text().startsWith('Learn how to create a website') + $featuredLinks.eq(8).children('p').text().startsWith('Learn how to create a website'), ).toBe(true) }) @@ -34,7 +34,7 @@ describe('featuredLinks', () => { const $featuredLinks = $('[data-testid=article-list] a') expect($featuredLinks.length > 0).toBeTruthy() expect($featuredLinks.eq(0).attr('href')).toBe( - `/en/enterprise-server@${enterpriseServerReleases.latest}/get-started/learning-about-github/githubs-products` + `/en/enterprise-server@${enterpriseServerReleases.latest}/get-started/learning-about-github/githubs-products`, ) expect($featuredLinks.eq(0).children('h3').text().startsWith('GitHub’s products')).toBe(true) expect( @@ -42,7 +42,7 @@ describe('featuredLinks', () => { .eq(0) .children('p') .text() - .startsWith("An overview of GitHub's products and pricing plans.") + .startsWith("An overview of GitHub's products and pricing plans."), ).toBe(true) }) @@ -58,13 +58,13 @@ describe('featuredLinks', () => { msg = `Enterprise article link is not rendered as expected on ${enterpriseVersionedLandingPage}` expect( $productArticlesLinks.text().includes('About licenses for GitHub Enterprise'), - msg + msg, ).toBe(true) // Confirm that the following Dotcom-only links are NOT included on this Enterprise page. msg = `Dotcom-only article link is rendered, but should not be, on ${enterpriseVersionedLandingPage}` expect($productArticlesLinks.text().includes('Adding or editing a payment method')).toBe( - false + false, ) expect($productArticlesLinks.text().includes('Setting your billing email'), msg).toBe(false) }) diff --git a/src/learning-track/lib/get-link-data.js b/src/learning-track/lib/get-link-data.js index 7d212b61e750..c6da3a979442 100644 --- a/src/learning-track/lib/get-link-data.js +++ b/src/learning-track/lib/get-link-data.js @@ -9,7 +9,7 @@ import { renderContent } from '#src/content-render/index.js' export default async ( rawLinks, context, - option = { title: true, intro: true, fullTitle: false } + option = { title: true, intro: true, fullTitle: false }, ) => { if (!rawLinks) return diff --git a/src/learning-track/lib/process-learning-tracks.js b/src/learning-track/lib/process-learning-tracks.js index 813f5714839b..a24c2449854f 100644 --- a/src/learning-track/lib/process-learning-tracks.js +++ b/src/learning-track/lib/process-learning-tracks.js @@ -37,7 +37,7 @@ export default async function processLearningTracks(rawLearningTracks, context) // fall back to English if they don't exist on disk in the translation. const track = getDataByLanguage( `learning-tracks.${context.currentProduct}.${renderedTrackName}`, - context.currentLanguage + context.currentLanguage, ) if (!track) { throw new Error(`No learning track called '${renderedTrackName}'.`) @@ -61,7 +61,7 @@ export default async function processLearningTracks(rawLearningTracks, context) if (context.currentLanguage !== 'en') { enTrack = getDataByLanguage( `learning-tracks.${context.currentProduct}.${renderedTrackName}`, - 'en' + 'en', ) // Sometimes the translations have more than just translated the // `title` and `description`, but also things that don't make sense @@ -85,12 +85,12 @@ export default async function processLearningTracks(rawLearningTracks, context) const title = await executeWithFallback( context, () => renderContent(track.title, context, renderOpts), - (enContext) => renderContent(enTrack.title, enContext, renderOpts) + (enContext) => renderContent(enTrack.title, enContext, renderOpts), ) const description = await executeWithFallback( context, () => renderContent(track.description, context, renderOpts), - (enContext) => renderContent(enTrack.description, enContext, renderOpts) + (enContext) => renderContent(enTrack.description, enContext, renderOpts), ) const learningTrack = { diff --git a/src/observability/lib/failbot.js b/src/observability/lib/failbot.js index 46ed67babdac..26486ef7e089 100644 --- a/src/observability/lib/failbot.js +++ b/src/observability/lib/failbot.js @@ -29,7 +29,7 @@ async function retryingGot(url, args) { // limit: 4, }, - }) + }), ) } diff --git a/src/observability/lib/handle-exceptions.js b/src/observability/lib/handle-exceptions.js index dda3894c9a21..3843815188aa 100644 --- a/src/observability/lib/handle-exceptions.js +++ b/src/observability/lib/handle-exceptions.js @@ -4,7 +4,7 @@ process.on('uncaughtException', async (err) => { if (err.code === 'MODULE_NOT_FOUND') { console.error('\n\n🔥 Uh oh! It looks you are missing a required npm module.') console.error( - 'Please run `npm install` to make sure you have all the required dependencies.\n\n' + 'Please run `npm install` to make sure you have all the required dependencies.\n\n', ) } diff --git a/src/observability/lib/statsd.js b/src/observability/lib/statsd.js index 593a29a42287..7b924ea3be93 100644 --- a/src/observability/lib/statsd.js +++ b/src/observability/lib/statsd.js @@ -4,7 +4,7 @@ const { HEROKU_APP_NAME, NODE_ENV, DD_API_KEY } = process.env const mock = Boolean(NODE_ENV === 'test' || !DD_API_KEY) export const tags = ['app:docs', HEROKU_APP_NAME ? `heroku_app:${HEROKU_APP_NAME}` : false].filter( - Boolean + Boolean, ) /** * @type {import('hot-shots').StatsD} diff --git a/src/observability/tests/repository-references.js b/src/observability/tests/repository-references.js index ed63cedb1cc4..13b35bfe83e1 100644 --- a/src/observability/tests/repository-references.js +++ b/src/observability/tests/repository-references.js @@ -109,7 +109,7 @@ describe('check if a GitHub-owned private repository is referenced', () => { !( filename.includes('static') && (filename.endsWith('.json') || filename.endsWith('.json.br')) - ) + ), ) test.each(filenames)('in file %s', (filename) => { @@ -131,7 +131,7 @@ describe('check if a GitHub-owned private repository is referenced', () => { You can: (1) edit the file to remove the repository reference; or - (2) if the repository is public, add the repository name to the 'PUBLIC_REPOS' variable in this test file.` + (2) if the repository is public, add the repository name to the 'PUBLIC_REPOS' variable in this test file.`, ).toHaveLength(0) }) }) diff --git a/src/pageinfo/middleware.js b/src/pageinfo/middleware.js index effe1304f44c..e3de9973f33a 100644 --- a/src/pageinfo/middleware.js +++ b/src/pageinfo/middleware.js @@ -173,10 +173,10 @@ router.get( setFastlySurrogateKey( res, `${SURROGATE_ENUMS.DEFAULT} ${makeLanguageSurrogateKey(page.languageCode)}`, - true + true, ) res.status(200).json({ info }) - }) + }), ) // Alias for the latest version diff --git a/src/pageinfo/tests/pageinfo.js b/src/pageinfo/tests/pageinfo.js index fb34c4158436..67f1ef870bd6 100644 --- a/src/pageinfo/tests/pageinfo.js +++ b/src/pageinfo/tests/pageinfo.js @@ -13,13 +13,13 @@ describe('pageinfo api', () => { // alert in case it was accidentally forgotten. if (!process.env.ROOT) { console.warn( - 'WARNING: The pageinfo tests require the ROOT environment variable to be set to the fixture root' + 'WARNING: The pageinfo tests require the ROOT environment variable to be set to the fixture root', ) } // Ditto for fixture-based translations to work if (!process.env.TRANSLATIONS_FIXTURE_ROOT) { console.warn( - 'WARNING: The pageinfo tests require the TRANSLATIONS_FIXTURE_ROOT environment variable to be set' + 'WARNING: The pageinfo tests require the TRANSLATIONS_FIXTURE_ROOT environment variable to be set', ) } }) @@ -37,7 +37,7 @@ describe('pageinfo api', () => { expect(info.product).toBe('Get started') expect(info.title).toBe('Quickstart') expect(info.intro).toBe( - 'Get started using GitHub to manage Git repositories and collaborate with others.' + 'Get started using GitHub to manage Git repositories and collaborate with others.', ) // Check that it can be cached at the CDN expect(res.headers['set-cookie']).toBeUndefined() diff --git a/src/rest/api/anchor-redirect.js b/src/rest/api/anchor-redirect.js index 6080a78813c4..abac1f9f2b96 100644 --- a/src/rest/api/anchor-redirect.js +++ b/src/rest/api/anchor-redirect.js @@ -6,7 +6,7 @@ import { defaultCacheControl } from '../../../middleware/cache-control.js' import { REST_DATA_DIR } from '../lib/index.js' const clientSideRestAPIRedirects = readCompressedJsonFileFallbackLazily( - path.join(REST_DATA_DIR, 'client-side-rest-api-redirects.json') + path.join(REST_DATA_DIR, 'client-side-rest-api-redirects.json'), ) const router = express.Router() diff --git a/src/rest/components/ClientSideRedirects.tsx b/src/rest/components/ClientSideRedirects.tsx index 7d5bccc5cf4c..7d3043ee604a 100644 --- a/src/rest/components/ClientSideRedirects.tsx +++ b/src/rest/components/ClientSideRedirects.tsx @@ -6,7 +6,7 @@ const ClientSideRedirectExceptions = dynamic( () => import('src/rest/components/ClientSideRedirectExceptions'), { ssr: false, - } + }, ) export function ClientSideRedirects() { diff --git a/src/rest/components/RestBanner.tsx b/src/rest/components/RestBanner.tsx index 012d60c6dbe2..ac5b66baa3db 100644 --- a/src/rest/components/RestBanner.tsx +++ b/src/rest/components/RestBanner.tsx @@ -64,7 +64,7 @@ export const RestBanner = () => { bannerText = t('rest.banner.ghes_api_versioned') .replace( '{{ firstGhesReleaseWithApiVersions.versionTitle }}', - firstGhesReleaseWithApiVersions.versionTitle + firstGhesReleaseWithApiVersions.versionTitle, ) .replace(/{{\s*currentVersion\s*}}/, currentVersion) } @@ -83,7 +83,7 @@ export const RestBanner = () => { dangerouslySetInnerHTML={{ __html: t('rest.banner.api_version_info').replace( /{{\s*versionWithApiVersion\s*}}/, - versionWithApiVersion === DEFAULT_VERSION ? '' : `/${versionWithApiVersion}` + versionWithApiVersion === DEFAULT_VERSION ? '' : `/${versionWithApiVersion}`, ), }} /> diff --git a/src/rest/components/RestCodeSamples.tsx b/src/rest/components/RestCodeSamples.tsx index cf4c9bd35b1f..92f0a6ba293b 100644 --- a/src/rest/components/RestCodeSamples.tsx +++ b/src/rest/components/RestCodeSamples.tsx @@ -83,7 +83,7 @@ export function RestCodeSamples({ operation, slug, heading }: Props) { const showExampleOptionMediaType = languageExamples.length > 1 && !languageExamples.every( - (example) => example.response.contentType === languageExamples[0].response.contentType + (example) => example.response.contentType === languageExamples[0].response.contentType, ) const exampleSelectOptions = languageExamples.map((example, index) => ({ text: showExampleOptionMediaType @@ -290,7 +290,7 @@ export function RestCodeSamples({ operation, slug, heading }: Props) { className={cx( styles.codeBlock, styles.requestCodeBlock, - `border-top rounded-1 my-0 ${getLanguageHighlight(selectedLanguage)}` + `border-top rounded-1 my-0 ${getLanguageHighlight(selectedLanguage)}`, )} data-highlight={getLanguageHighlight(selectedLanguage)} > @@ -350,7 +350,7 @@ export function RestCodeSamples({ operation, slug, heading }: Props) { className={cx( styles.codeBlock, styles.responseCodeBlock, - 'border-top rounded-1 my-0' + 'border-top rounded-1 my-0', )} data-highlight={'json'} style={{ maxHeight: responseMaxHeight }} diff --git a/src/rest/components/RestCollapsibleSection.tsx b/src/rest/components/RestCollapsibleSection.tsx index e32e76589910..46787a2607e9 100644 --- a/src/rest/components/RestCollapsibleSection.tsx +++ b/src/rest/components/RestCollapsibleSection.tsx @@ -71,7 +71,7 @@ export const RestCollapsibleSection = (props: SectionProps) => { } }) }, - { rootMargin: '0px 0px -85% 0px' } + { rootMargin: '0px 0px -85% 0px' }, ) // TODO: When we add the ## About the {title} API to each operation // we can remove the h2 here diff --git a/src/rest/components/RestOperation.tsx b/src/rest/components/RestOperation.tsx index 5adf4f43fcda..9b56ef1c2954 100644 --- a/src/rest/components/RestOperation.tsx +++ b/src/rest/components/RestOperation.tsx @@ -68,7 +68,7 @@ export function RestOperation({ operation }: Props) { numPreviews={numPreviews} heading={t('rest.reference.parameters').replace( '{{ RESTOperationTitle }}', - operation.title + operation.title, )} headers={headers} parameters={operation.parameters} @@ -82,7 +82,7 @@ export function RestOperation({ operation }: Props) { slug={titleSlug} heading={t('rest.reference.http_status_code').replace( '{{ RESTOperationTitle }}', - operation.title + operation.title, )} /> )} @@ -97,7 +97,7 @@ export function RestOperation({ operation }: Props) { slug={titleSlug} heading={t('rest.reference.code_samples').replace( '{{ RESTOperationTitle }}', - operation.title + operation.title, )} /> )} @@ -110,11 +110,11 @@ export function RestOperation({ operation }: Props) { operation.previews.length > 1 ? `${t('rest.reference.preview_notices').replace( '{{ RESTOperationTitle }}', - operation.title + operation.title, )}` : `${t('rest.reference.preview_notice').replace( '{{ RESTOperationTitle }}', - operation.title + operation.title, )}` } /> diff --git a/src/rest/components/get-rest-code-samples.ts b/src/rest/components/get-rest-code-samples.ts index 1a2ee274eca6..4cafd52cdd5e 100644 --- a/src/rest/components/get-rest-code-samples.ts +++ b/src/rest/components/get-rest-code-samples.ts @@ -49,7 +49,7 @@ export function getShellExample(operation: Operation, codeSample: CodeSample) { if (codeSample?.request?.bodyParameters) { requestBodyParams = `-d '${JSON.stringify(codeSample.request.bodyParameters).replace( /'/g, - "'\\''" + "'\\''", )}'` const contentType = codeSample.request.contentType @@ -164,7 +164,7 @@ export function getGHExample(operation: Operation, codeSample: CodeSample) { requestBodyParams, ].filter(Boolean) return `# GitHub CLI api\n# https://cli.github.com/manual/gh_api\n\ngh api \\\n ${args.join( - ' \\\n ' + ' \\\n ', )}` } diff --git a/src/rest/components/useClipboard.ts b/src/rest/components/useClipboard.ts index a39168daf15a..4d47649e1727 100644 --- a/src/rest/components/useClipboard.ts +++ b/src/rest/components/useClipboard.ts @@ -10,7 +10,7 @@ interface IOptions { export default function useCopyClipboard( text: string, - options?: IOptions + options?: IOptions, ): [boolean, () => Promise<void>] { const [isCopied, setIsCopied] = useState(false) const successDuration = options && options.successDuration diff --git a/src/rest/docs.js b/src/rest/docs.js index 3bb8e0a6643c..f48da91f3e24 100755 --- a/src/rest/docs.js +++ b/src/rest/docs.js @@ -9,7 +9,7 @@ const invertedVersionMapping = JSON.parse(await readFile('src/rest/lib/config.js const versionMapping = {} Object.assign( versionMapping, - ...Object.entries(invertedVersionMapping).map(([a, b]) => ({ [b]: a })) + ...Object.entries(invertedVersionMapping).map(([a, b]) => ({ [b]: a })), ) const openApiVersions = Object.values(allVersions) .map((version) => version.openApiVersionName) @@ -24,32 +24,34 @@ log(chalk.cyan.bold(' - All versions:') + ' ' + chalk.magenta('npm run sync-re log( chalk.cyan.bold(' - Dotcom only:') + ' ' + - chalk.magenta('npm run sync-rest -- --versions api.github.com ; npm run dev') + chalk.magenta('npm run sync-rest -- --versions api.github.com ; npm run dev'), ) log( chalk.cyan.bold(' - Two versions:') + ' ' + - chalk.magenta('npm run sync-rest -- --versions ghes-3.7 ghes-3.8 ; npm run dev') + chalk.magenta('npm run sync-rest -- --versions ghes-3.7 ghes-3.8 ; npm run dev'), ) log( chalk.cyan.bold(' - Dotcom and next calendar date version:') + ' ' + - chalk.magenta('npm run sync-rest -- --next --versions api.github.com ; npm run dev') + chalk.magenta('npm run sync-rest -- --next --versions api.github.com ; npm run dev'), ) log(chalk.green.bold.underline('\nWebhook docs\n')) log(chalk.green.bold(' Examples of ways you can build the Webhook docs locally:\n')) log( - chalk.cyan.bold(' - All versions:') + ' ' + chalk.magenta('npm run sync-webhooks ; npm run dev') + chalk.cyan.bold(' - All versions:') + + ' ' + + chalk.magenta('npm run sync-webhooks ; npm run dev'), ) log( chalk.cyan.bold(' - Dotcom only:') + ' ' + - chalk.magenta('npm run sync-webhooks -- --versions api.github.com ; npm run dev') + chalk.magenta('npm run sync-webhooks -- --versions api.github.com ; npm run dev'), ) log( chalk.cyan.bold(' - Two versions:') + ' ' + - chalk.magenta('npm run sync-webhooks -- --versions ghes-3.7 ghes-3.8 ; npm run dev') + chalk.magenta('npm run sync-webhooks -- --versions ghes-3.7 ghes-3.8 ; npm run dev'), ) log(chalk.green.bold('\nYou can build specific versions of the REST and Webhook docs.\n')) log(chalk.white.bold(' Versions that can be built: ', openApiVersions, '\n')) diff --git a/src/rest/lib/index.js b/src/rest/lib/index.js index 2d62cc0f438f..0251370aa531 100644 --- a/src/rest/lib/index.js +++ b/src/rest/lib/index.js @@ -103,7 +103,7 @@ export async function getRestMiniTocItems( restOperations, language, version, - context + context, ) { const apiDate = apiVersion || NOT_API_VERSIONED diff --git a/src/rest/pages/category.tsx b/src/rest/pages/category.tsx index 7975e7ad065b..ff52ea147eaa 100644 --- a/src/rest/pages/category.tsx +++ b/src/rest/pages/category.tsx @@ -114,7 +114,7 @@ export const getServerSideProps: GetServerSideProps<Props> = async (context) => let fullSubcategoryTitle const pageTocItem = tocLandingContext.tocItems.find( - (tocItem) => tocItem.fullPath === fullSubcategoryPath + (tocItem) => tocItem.fullPath === fullSubcategoryPath, ) if (pageTocItem) { @@ -134,7 +134,7 @@ export const getServerSideProps: GetServerSideProps<Props> = async (context) => subCatOperations, currentLanguage, currentVersion, - req.context + req.context, )) as MinitocItemsT miniTocItems.restOperationsMiniTocItems.forEach((operationMinitoc) => { @@ -190,7 +190,7 @@ export const getServerSideProps: GetServerSideProps<Props> = async (context) => restOperations, currentLanguage, currentVersion, - req.context + req.context, )) as MinitocItemsT restOperationsMiniTocItems && miniTocItems.push(...restOperationsMiniTocItems) diff --git a/src/rest/pages/subcategory.tsx b/src/rest/pages/subcategory.tsx index 57ef9191b2a1..f5706ddaec6d 100644 --- a/src/rest/pages/subcategory.tsx +++ b/src/rest/pages/subcategory.tsx @@ -71,7 +71,7 @@ export const getServerSideProps: GetServerSideProps<Props> = async (context) => restOperations, currentLanguage, currentVersion, - req.context + req.context, )) as MinitocItemsT restOperationsMiniTocItems && miniTocItems.push(...restOperationsMiniTocItems) diff --git a/src/rest/scripts/openapi-check.js b/src/rest/scripts/openapi-check.js index 4cd69f435d45..8b63e793e675 100755 --- a/src/rest/scripts/openapi-check.js +++ b/src/rest/scripts/openapi-check.js @@ -16,7 +16,7 @@ program .description('Generate dereferenced OpenAPI and decorated schema files.') .requiredOption( '-f, --files [files...]', - 'A list of OpenAPI description files to check. Can parse literal glob patterns.' + 'A list of OpenAPI description files to check. Can parse literal glob patterns.', ) .parse(process.argv) @@ -49,7 +49,7 @@ async function check(files) { } catch (error) { console.error(error) console.log( - `🐛 Whoops! It looks like the decorator script wasn't able to parse the dereferenced schema in file ${filename}. A recent change may not yet be supported by the decorator. Please reach out in the #docs-engineering slack channel for help.` + `🐛 Whoops! It looks like the decorator script wasn't able to parse the dereferenced schema in file ${filename}. A recent change may not yet be supported by the decorator. Please reach out in the #docs-engineering slack channel for help.`, ) process.exit(1) } diff --git a/src/rest/scripts/test-open-api-schema.js b/src/rest/scripts/test-open-api-schema.js index c2ea8b974f86..dd68f3ba70c8 100755 --- a/src/rest/scripts/test-open-api-schema.js +++ b/src/rest/scripts/test-open-api-schema.js @@ -69,7 +69,7 @@ async function createOpenAPISchemasCheck() { const subcategories = Object.keys(fileSchema[category]) if (isApiVersioned(version)) { getOnlyApiVersions(version).forEach( - (apiVersion) => (openAPICheck[apiVersion][category] = subcategories.sort()) + (apiVersion) => (openAPICheck[apiVersion][category] = subcategories.sort()), ) } else { openAPICheck[version][category] = subcategories.sort() @@ -94,7 +94,7 @@ async function createCheckContentDirectory(contentFiles) { const allCompleteVersions = applicableVersions.flatMap((version) => { return isApiVersioned(version) ? allVersions[version].apiVersions.map( - (apiVersion) => `${allVersions[version].version}.${apiVersion}` + (apiVersion) => `${allVersions[version].version}.${apiVersion}`, ) : version }) @@ -116,7 +116,7 @@ function isApiVersioned(version) { function getOnlyApiVersions(version) { return allVersions[version].apiVersions.map( - (apiVersion) => `${allVersions[version].version}.${apiVersion}` + (apiVersion) => `${allVersions[version].version}.${apiVersion}`, ) } diff --git a/src/rest/scripts/update-files.js b/src/rest/scripts/update-files.js index 7e8efa00be8c..50b907aadaa1 100755 --- a/src/rest/scripts/update-files.js +++ b/src/rest/scripts/update-files.js @@ -38,22 +38,22 @@ program .addOption( new Option( '-o, --output [docs-pipeline...]', - 'A list of docs pipelines to sync from the OpenAPI schema, separated by a space. Ex. `-o github-apps rest webhooks`.' + 'A list of docs pipelines to sync from the OpenAPI schema, separated by a space. Ex. `-o github-apps rest webhooks`.', ) .choices(['rest', 'github-apps', 'webhooks', 'rest-redirects']) - .default('rest', 'rest') + .default('rest', 'rest'), ) .addOption( new Option( '-s, --source-repo <repo>', - `The source repository to get the dereferenced files from. When the source repo is ${REST_API_DESCRIPTION_ROOT}, the bundler is not run to generate the source dereferenced OpenAPI files because the ${REST_API_DESCRIPTION_ROOT} repo already contains them.` + `The source repository to get the dereferenced files from. When the source repo is ${REST_API_DESCRIPTION_ROOT}, the bundler is not run to generate the source dereferenced OpenAPI files because the ${REST_API_DESCRIPTION_ROOT} repo already contains them.`, ) .choices(['github', REST_API_DESCRIPTION_ROOT]) - .default('github', 'github') + .default('github', 'github'), ) .option( '-v --versions [VERSIONS...]', - 'A list of undeprecated, published versions to build, separated by a space. Example `-v ghes-3.1` or `-v api.github.com github.ae`' + 'A list of undeprecated, published versions to build, separated by a space. Example `-v ghes-3.1` or `-v api.github.com github.ae`', ) .option('-d --include-deprecated', 'Includes schemas that are marked as `deprecated: true`') .option('-u --include-unpublished', 'Includes schemas that are marked as `published: false`') @@ -126,7 +126,7 @@ async function main() { await syncGitHubAppsData( TEMP_OPENAPI_DIR, restSchemas, - sourceRepo === 'github' && GITHUB_REP_DIR + sourceRepo === 'github' && GITHUB_REP_DIR, ) } @@ -156,7 +156,7 @@ async function main() { } console.log( - `\n🏁 The static REST API files are now up-to-date with \`github/${sourceRepo}\`. To revert uncommitted data changes, run \`git checkout src/**/data/*\`\n` + `\n🏁 The static REST API files are now up-to-date with \`github/${sourceRepo}\`. To revert uncommitted data changes, run \`git checkout src/**/data/*\`\n`, ) } @@ -177,7 +177,7 @@ async function getBundledFiles() { await mkdirp(TEMP_BUNDLED_OPENAPI_DIR) console.log( - `\n🏃‍♀️🏃🏃‍♀️Running \`bin/openapi bundle\` in branch '${githubBranch}' of your github/github checkout to generate the dereferenced OpenAPI schema files.\n` + `\n🏃‍♀️🏃🏃‍♀️Running \`bin/openapi bundle\` in branch '${githubBranch}' of your github/github checkout to generate the dereferenced OpenAPI schema files.\n`, ) // Format the command supplied to the bundle script in `github/github` const bundlerOptions = await getBundlerOptions() @@ -246,13 +246,13 @@ export async function normalizeDataVersionNames(sourceDirectory) { for (const schema of schemas) { const baseName = path.basename(schema, '.deref.json') const matchingSourceVersion = Object.keys(VERSION_NAMES).find((version) => - baseName.startsWith(version) + baseName.startsWith(version), ) // Update the version name to use docs convention, e.g., // api.github.com.2022-11-28 -> fpt.2022-11-28 const docsBaseName = baseName.replace( matchingSourceVersion, - VERSION_NAMES[matchingSourceVersion] + VERSION_NAMES[matchingSourceVersion], ) // Match a calendar version if it exists, e.g., .2022-11-28 const regex = /.\d{4}-\d{2}-\d{2}/ diff --git a/src/rest/scripts/utils/get-body-params.js b/src/rest/scripts/utils/get-body-params.js index 11a66dc23c2c..d30250062fc1 100644 --- a/src/rest/scripts/utils/get-body-params.js +++ b/src/rest/scripts/utils/get-body-params.js @@ -92,7 +92,7 @@ export async function getBodyParams(schema, topLevel = false) { type: 'object', name: 'key', description: await renderContent( - `A user-defined key to represent an item in \`${paramKey}\`.` + `A user-defined key to represent an item in \`${paramKey}\`.`, ), isRequired: param.required, enum: param.enum, @@ -212,10 +212,10 @@ async function getTransformedParam(param, paramType, props) { const curr = childParam.get(obj.name) return childParam.set( obj.name, - curr ? (!Object.hasOwn(curr, 'isRequired') ? obj : curr) : obj + curr ? (!Object.hasOwn(curr, 'isRequired') ? obj : curr) : obj, ) }, new Map()) - .values() + .values(), ) paramDecorated.childParamsGroups = mergedChildParamsGroups diff --git a/src/rest/scripts/utils/get-openapi-schemas.js b/src/rest/scripts/utils/get-openapi-schemas.js index 34ed65d7efb7..0d9712076e1e 100644 --- a/src/rest/scripts/utils/get-openapi-schemas.js +++ b/src/rest/scripts/utils/get-openapi-schemas.js @@ -26,20 +26,20 @@ export async function getSchemas(directory = OPEN_API_RELEASES_DIR) { const yamlContent = yaml.load(content) const releaseMatch = Object.keys(configData.versionMapping).find((name) => - fileBaseName.startsWith(name) + fileBaseName.startsWith(name), ) if (!releaseMatch) { throw new Error( `🛑 The file ${fileBaseName} does not match any known docs version name. (not one of ${Object.keys( - configData.versionMapping - )})` + configData.versionMapping, + )})`, ) } const docsName = configData.versionMapping[fileBaseName] || fileBaseName.replace(releaseMatch, configData.versionMapping[releaseMatch]) const isDeprecatedInDocs = !Object.keys(allVersions).find( - (version) => allVersions[version].openApiVersionName === docsName + (version) => allVersions[version].openApiVersionName === docsName, ) if (!yamlContent.published) { unpublished.push(newFileName) diff --git a/src/rest/scripts/utils/get-operations.js b/src/rest/scripts/utils/get-operations.js index 263498e2276f..2695cc5fee8b 100644 --- a/src/rest/scripts/utils/get-operations.js +++ b/src/rest/scripts/utils/get-operations.js @@ -21,8 +21,9 @@ export async function createOperations(schema) { return Object.entries(schema.paths) .map(([requestPath, operationsAtPath]) => Object.entries(operationsAtPath).map( - ([verb, operationProps]) => new Operation(verb, requestPath, operationProps, schema.servers) - ) + ([verb, operationProps]) => + new Operation(verb, requestPath, operationProps, schema.servers), + ), ) .flat() } diff --git a/src/rest/scripts/utils/operation.js b/src/rest/scripts/utils/operation.js index 91f4001093b2..5d0e2fa0691d 100644 --- a/src/rest/scripts/utils/operation.js +++ b/src/rest/scripts/utils/operation.js @@ -25,7 +25,7 @@ export default class Operation { if (serverVariables) { const templateVariables = {} Object.keys(serverVariables).forEach( - (key) => (templateVariables[key] = serverVariables[key].default) + (key) => (templateVariables[key] = serverVariables[key].default), ) this.serverUrl = parseTemplate(this.serverUrl).expand(templateVariables) } @@ -73,7 +73,7 @@ export default class Operation { this.codeExamples.map(async (codeExample) => { codeExample.response.description = await renderContent(codeExample.response.description) return codeExample - }) + }), ) } @@ -99,7 +99,7 @@ export default class Operation { httpStatusCode, description: responseDescription, } - }) + }), ) } @@ -108,7 +108,7 @@ export default class Operation { this.parameters.map(async (param) => { param.description = await renderContent(param.description) return param - }) + }), ) } @@ -144,7 +144,7 @@ export default class Operation { .replace(/\n`application/, '\n```\napplication') .replace(/json`$/, 'json\n```') return await renderContent(note) - }) + }), ) } } diff --git a/src/rest/scripts/utils/sync.js b/src/rest/scripts/utils/sync.js index efc2f91460d6..511e88197dac 100644 --- a/src/rest/scripts/utils/sync.js +++ b/src/rest/scripts/utils/sync.js @@ -12,7 +12,7 @@ import { REST_DATA_DIR, REST_SCHEMA_FILENAME } from '../../lib/index.js' // Ex: 'api.github.com', 'ghec', 'ghes-3.6', 'ghes-3.5', // 'ghes-3.4', 'ghes-3.3', 'ghes-3.2', 'github.ae' const OPENAPI_VERSION_NAMES = Object.keys(allVersions).map( - (elem) => allVersions[elem].openApiVersionName + (elem) => allVersions[elem].openApiVersionName, ) export async function syncRestData(sourceDirectory, restSchemas) { @@ -28,7 +28,7 @@ export async function syncRestData(sourceDirectory, restSchemas) { await processOperations(operations) } catch (error) { throw new Error( - "🐛 Whoops! It looks like the script wasn't able to parse the dereferenced schema. A recent change may not yet be supported by the decorator. Please reach out in the #docs-engineering slack channel for help." + "🐛 Whoops! It looks like the script wasn't able to parse the dereferenced schema. A recent change may not yet be supported by the decorator. Please reach out in the #docs-engineering slack channel for help.", ) } const formattedOperations = await formatRestData(operations) @@ -37,7 +37,7 @@ export async function syncRestData(sourceDirectory, restSchemas) { if (Object.keys(formattedOperations).length === 0) { throw new Error( - `Generating REST data failed for ${sourceDirectory}/${schemaName}. The generated data file was empty.` + `Generating REST data failed for ${sourceDirectory}/${schemaName}. The generated data file was empty.`, ) } if (!existsSync(targetDirectoryPath)) { @@ -46,7 +46,7 @@ export async function syncRestData(sourceDirectory, restSchemas) { const targetPath = path.join(targetDirectoryPath, REST_SCHEMA_FILENAME) await writeFile(targetPath, JSON.stringify(formattedOperations, null, 2)) console.log(`✅ Wrote ${targetPath}`) - }) + }), ) await updateRestFiles() await updateRestConfigData(restSchemas) @@ -95,7 +95,7 @@ async function formatRestData(operations) { operationsByCategory[category][subcategory] = {} const subcategoryOperations = categoryOperations.filter( - (operation) => operation.subcategory === subcategory + (operation) => operation.subcategory === subcategory, ) operationsByCategory[category][subcategory] = subcategoryOperations @@ -140,7 +140,7 @@ export async function getOpenApiSchemaFiles(schemas) { const schemaNames = schemas.map((schema) => path.basename(schema, '.json')) const OPENAPI_VERSION_NAMES = Object.keys(allVersions).map( - (elem) => allVersions[elem].openApiVersionName + (elem) => allVersions[elem].openApiVersionName, ) for (const schema of schemaNames) { diff --git a/src/rest/scripts/utils/update-markdown.js b/src/rest/scripts/utils/update-markdown.js index 0193c3009839..b437b970e27c 100644 --- a/src/rest/scripts/utils/update-markdown.js +++ b/src/rest/scripts/utils/update-markdown.js @@ -11,7 +11,7 @@ import { REST_DATA_DIR, REST_SCHEMA_FILENAME } from '../../lib/index.js' import { deprecated } from '../../../../lib/enterprise-server-releases.js' const { frontmatterDefaults, targetDirectory } = JSON.parse( - await readFile('src/rest/lib/config.json', 'utf-8') + await readFile('src/rest/lib/config.json', 'utf-8'), ) export async function updateRestFiles() { diff --git a/src/rest/tests/api.js b/src/rest/tests/api.js index 8662a0bef716..e9bcbf327007 100644 --- a/src/rest/tests/api.js +++ b/src/rest/tests/api.js @@ -10,7 +10,7 @@ import { describe('anchor-redirect api', () => { const clientSideRedirects = JSON.parse( - fs.readFileSync('src/rest/data/client-side-rest-api-redirects.json', 'utf-8') + fs.readFileSync('src/rest/data/client-side-rest-api-redirects.json', 'utf-8'), ) test('returns correct redirect to url', async () => { diff --git a/src/rest/tests/create-rest-examples.js b/src/rest/tests/create-rest-examples.js index b4d199520921..38345d12bff6 100644 --- a/src/rest/tests/create-rest-examples.js +++ b/src/rest/tests/create-rest-examples.js @@ -53,7 +53,7 @@ describe('rest example requests and responses', () => { const mergedExamples = await getCodeSamples(operation) mergedExamples.forEach((example, index) => { expect(example.request.description).toBe( - 'Example ' + (index + 1) + ': Status Code ' + example.response.statusCode + 'Example ' + (index + 1) + ': Status Code ' + example.response.statusCode, ) }) }) diff --git a/src/rest/tests/get-schema-files.js b/src/rest/tests/get-schema-files.js index 972c44f08108..323945858d45 100644 --- a/src/rest/tests/get-schema-files.js +++ b/src/rest/tests/get-schema-files.js @@ -4,7 +4,7 @@ import { getOpenApiSchemaFiles } from '../scripts/utils/sync.js' import { allVersions } from '../../../lib/all-versions.js' const supportedReleases = Object.keys(allVersions).map( - (version) => allVersions[version].openApiVersionName + (version) => allVersions[version].openApiVersionName, ) describe('rest data files are generated correctly from dereferenced openapi files', () => { test('rest schema list should include calendar date versions', async () => { diff --git a/src/rest/tests/openapi-schema.js b/src/rest/tests/openapi-schema.js index dfd00216f7b3..d80537685713 100644 --- a/src/rest/tests/openapi-schema.js +++ b/src/rest/tests/openapi-schema.js @@ -71,7 +71,7 @@ describe('markdown for each rest version', () => { const filenames = (await fs.readdir(referenceDir)) .filter( (filename) => - !excludeFromResourceNameCheck.find((excludedFile) => filename.endsWith(excludedFile)) + !excludeFromResourceNameCheck.find((excludedFile) => filename.endsWith(excludedFile)), ) .map((filename) => filename.replace('.md', '')) @@ -98,7 +98,7 @@ describe('OpenAPI schema validation', () => { // Because the rest calendar dates now have latest, next, or calendar date attached to the name, we're // now checking if the decorated file names now start with an openApiBaseName expect( - decoratedFilenames.some((versionFile) => versionFile.startsWith(openApiBaseName)) + decoratedFilenames.some((versionFile) => versionFile.startsWith(openApiBaseName)), ).toBe(true) }) }) @@ -122,7 +122,7 @@ describe('OpenAPI schema validation', () => { const operations = await getRest(version, apiVersion) expect(JSON.stringify(operations).includes('hljs language-applescript')).toBe(false) } - }) + }), ) }) }) diff --git a/src/rest/tests/rendering.js b/src/rest/tests/rendering.js index 15f31f358d34..4e47c8444847 100644 --- a/src/rest/tests/rendering.js +++ b/src/rest/tests/rendering.js @@ -63,7 +63,7 @@ describe('REST references docs', () => { expect(res.statusCode).toBe(302) expect( res.headers.location === `/en/rest/${category}` || - res.headers.location === `/en/rest/${category}/${category}` + res.headers.location === `/en/rest/${category}/${category}`, ) } // With language prefix @@ -72,7 +72,7 @@ describe('REST references docs', () => { expect(res.statusCode).toBe(301) expect( res.headers.location === `/en/rest/${category}` || - res.headers.location === `/en/rest/${category}/${category}` + res.headers.location === `/en/rest/${category}/${category}`, ) } } diff --git a/src/search/components/useMediaQuery.ts b/src/search/components/useMediaQuery.ts index 4b6d2b153bc8..433f09bf2e66 100644 --- a/src/search/components/useMediaQuery.ts +++ b/src/search/components/useMediaQuery.ts @@ -2,7 +2,7 @@ import { useState, useEffect } from 'react' export function useMediaQuery(query: string) { const [state, setState] = useState( - typeof window !== 'undefined' ? window.matchMedia(query).matches : false + typeof window !== 'undefined' ? window.matchMedia(query).matches : false, ) useEffect(() => { diff --git a/src/search/components/usePage.ts b/src/search/components/usePage.ts index a58a3a8410fc..dbf3386732fd 100644 --- a/src/search/components/usePage.ts +++ b/src/search/components/usePage.ts @@ -8,7 +8,7 @@ export const usePage = (): Info => { const page = parseInt( router.query.page && Array.isArray(router.query.page) ? router.query.page[0] - : router.query.page || '' + : router.query.page || '', ) return { page: !isNaN(page) && page >= 1 ? page : 1, diff --git a/src/search/lib/versions.js b/src/search/lib/versions.js index 61c36376149b..85fdca451cb2 100644 --- a/src/search/lib/versions.js +++ b/src/search/lib/versions.js @@ -9,5 +9,5 @@ export default Object.fromEntries( versionObject.plan === 'enterprise-server' ? versionObject.currentRelease : versionObject.miscBaseName, - ]) + ]), ) diff --git a/src/search/middleware/es-search.js b/src/search/middleware/es-search.js index 8bec4127b747..e3c0d10026a7 100644 --- a/src/search/middleware/es-search.js +++ b/src/search/middleware/es-search.js @@ -233,7 +233,7 @@ function getMatchQueries(query, { usePrefixSearch, fuzzy }) { }, }, { [matchPhraseStrategy]: { headings: { boost: BOOST_PHRASE * BOOST_HEADINGS, query } } }, - ] + ], ) // If the content is short, it is given a disproportionate advantage // in search ranking. For example, our category and map-topic pages @@ -251,7 +251,7 @@ function getMatchQueries(query, { usePrefixSearch, fuzzy }) { content_explicit: { boost: BOOST_EXPLICIT * BOOST_PHRASE, query }, }, }, - ] + ], ) } } @@ -304,7 +304,7 @@ function getMatchQueries(query, { usePrefixSearch, fuzzy }) { content: { boost: BOOST_CONTENT * BOOST_AND, query, operator: 'AND' }, }, }, - ] + ], ) } matchQueries.push( @@ -321,7 +321,7 @@ function getMatchQueries(query, { usePrefixSearch, fuzzy }) { { [matchStrategy]: { title: { boost: BOOST_TITLE, query } } }, { [matchStrategy]: { headings: { boost: BOOST_HEADINGS, query } } }, { [matchStrategy]: { content: { boost: BOOST_CONTENT, query } } }, - ] + ], ) } @@ -376,7 +376,7 @@ function getHits(hits, { indexName, debug, includeTopics, highlightFields, inclu // } // even if there was a match on 'title'. const hitHighlights = Object.fromEntries( - highlightFields.map((key) => [key, (hit.highlight && hit.highlight[key]) || []]) + highlightFields.map((key) => [key, (hit.highlight && hit.highlight[key]) || []]), ) const result = { diff --git a/src/search/middleware/search.js b/src/search/middleware/search.js index 536277e801e8..4cfd34904829 100644 --- a/src/search/middleware/search.js +++ b/src/search/middleware/search.js @@ -83,7 +83,7 @@ router.get( // to the next middleware. await handleGetSearchResultsError(req, res, error, options) } - }) + }), ) // We have more than one place where we do `try{...} catch error( THIS )` diff --git a/src/search/scripts/analyze-text.js b/src/search/scripts/analyze-text.js index 3f4e1b90a536..50daf0d7da2c 100755 --- a/src/search/scripts/analyze-text.js +++ b/src/search/scripts/analyze-text.js @@ -44,7 +44,7 @@ const shortNames = Object.fromEntries( ? info.miscBaseName + info.currentRelease : info.miscBaseName return [shortName, info] - }) + }), ) const allVersionKeys = Object.keys(shortNames) @@ -54,7 +54,7 @@ program .option('-v, --verbose', 'Verbose outputs') .addOption(new Option('-V, --version <VERSION>', 'Specific version').choices(allVersionKeys)) .addOption( - new Option('-l, --language <LANGUAGE>', 'Which language to focus on').choices(languageKeys) + new Option('-l, --language <LANGUAGE>', 'Which language to focus on').choices(languageKeys), ) .option('-u, --elasticsearch-url <url>', 'If different from $ELASTICSEARCH_URL') .argument('<text>', 'text to tokenize') @@ -67,7 +67,7 @@ async function main(opts, args) { if (!opts.elasticsearchUrl && !process.env.ELASTICSEARCH_URL) { throw new Error( 'Must passed the elasticsearch URL option or ' + - 'set the environment variable ELASTICSEARCH_URL' + 'set the environment variable ELASTICSEARCH_URL', ) } let node = opts.elasticsearchUrl || process.env.ELASTICSEARCH_URL diff --git a/src/search/scripts/build-records.js b/src/search/scripts/build-records.js index 951735830234..778aa8765718 100644 --- a/src/search/scripts/build-records.js +++ b/src/search/scripts/build-records.js @@ -30,7 +30,7 @@ export default async function buildRecords( pageVersion, languageCode, redirects, - config = {} + config = {}, ) { const { noMarkers, popularPagesFilePath } = config console.log(`\n\nBuilding records for index '${indexName}' (${languages[languageCode].name})`) @@ -85,7 +85,7 @@ export default async function buildRecords( padding: 1, borderColor: 'red', }) + - '\n' + '\n', ) } else { console.error(err) diff --git a/src/search/scripts/index-elasticsearch.js b/src/search/scripts/index-elasticsearch.js index 9c5d46b7e2d9..66481d82c390 100755 --- a/src/search/scripts/index-elasticsearch.js +++ b/src/search/scripts/index-elasticsearch.js @@ -44,7 +44,7 @@ const shortNames = Object.fromEntries( ? info.miscBaseName + info.currentRelease : info.miscBaseName return [shortName, info] - }) + }), ) const allVersionKeys = Object.keys(shortNames) @@ -54,10 +54,10 @@ program .option('-v, --verbose', 'Verbose outputs') .addOption(new Option('-V, --version [VERSION...]', 'Specific versions').choices(allVersionKeys)) .addOption( - new Option('-l, --language <LANGUAGE...>', 'Which languages to focus on').choices(languageKeys) + new Option('-l, --language <LANGUAGE...>', 'Which languages to focus on').choices(languageKeys), ) .addOption( - new Option('--not-language <LANGUAGE...>', 'Specific language to omit').choices(languageKeys) + new Option('--not-language <LANGUAGE...>', 'Specific language to omit').choices(languageKeys), ) .option('-u, --elasticsearch-url <url>', 'If different from $ELASTICSEARCH_URL') .option('-p, --index-prefix <prefix>', 'Index string to put before index name') @@ -70,7 +70,7 @@ program throw new InvalidArgumentError('Not a number.') } return parsed - } + }, ) .argument('<source-directory>', 'where the indexable files are') .parse(process.argv) @@ -87,7 +87,7 @@ async function main(opts, args) { if (!elasticsearchUrl && !process.env.ELASTICSEARCH_URL) { throw new Error( 'Must passed the elasticsearch URL option or ' + - 'set the environment variable ELASTICSEARCH_URL' + 'set the environment variable ELASTICSEARCH_URL', ) } let node = elasticsearchUrl || process.env.ELASTICSEARCH_URL @@ -159,7 +159,7 @@ async function indexAll(node, sourceDirectory, opts) { version = opts.version if (process.env.VERSION) { console.warn( - `'version' specified as argument ('${version}') AND environment variable ('${process.env.VERSION}')` + `'version' specified as argument ('${version}') AND environment variable ('${process.env.VERSION}')`, ) } } else { @@ -167,7 +167,7 @@ async function indexAll(node, sourceDirectory, opts) { version = process.env.VERSION if (!allVersionKeys.includes(version)) { throw new Error( - `Environment variable 'VERSION' (${version}) is not recognized. Must be one of ${allVersionKeys}` + `Environment variable 'VERSION' (${version}) is not recognized. Must be one of ${allVersionKeys}`, ) } } @@ -253,7 +253,7 @@ async function indexVersion( version, language, sourceDirectory, - verbose = false + verbose = false, ) { // Note, it's a bit "weird" that numbered releases versions are // called the number but that's the convention the previous @@ -422,11 +422,11 @@ async function indexVersion( onError: (error, attempts) => { console.warn( chalk.yellow( - `Failed to get a list of indexes for '${indexName}' (${error.message}). Will attempt ${attempts} more times.` - ) + `Failed to get a list of indexes for '${indexName}' (${error.message}). Will attempt ${attempts} more times.`, + ), ) }, - } + }, ) for (const index of indices) { if (index.index !== thisAlias && index.index.startsWith(indexName)) { diff --git a/src/search/scripts/sync-search-indices.js b/src/search/scripts/sync-search-indices.js index 34bb52940016..c1fcaed570b0 100755 --- a/src/search/scripts/sync-search-indices.js +++ b/src/search/scripts/sync-search-indices.js @@ -22,7 +22,7 @@ const shortNames = Object.fromEntries( ? info.miscBaseName + info.currentRelease : info.miscBaseName return [shortName, info] - }) + }), ) const allVersionKeys = [...Object.keys(shortNames), ...Object.keys(allVersions)] @@ -32,10 +32,10 @@ program .option('-v, --verbose', 'Verbose outputs') .addOption(new Option('-V, --version <VERSION>', 'Specific versions').choices(allVersionKeys)) .addOption( - new Option('-l, --language <LANGUAGE>', 'Which languages to focus on').choices(languageKeys) + new Option('-l, --language <LANGUAGE>', 'Which languages to focus on').choices(languageKeys), ) .addOption( - new Option('--not-language <LANGUAGE>', 'Specific language to omit').choices(languageKeys) + new Option('--not-language <LANGUAGE>', 'Specific language to omit').choices(languageKeys), ) .option('--no-markers', 'Do not print a marker for each parsed document') .option('--filter <MATCH>', 'Filter to only do pages that match this string') @@ -51,7 +51,7 @@ async function main(opts, args) { language = opts.language if (process.env.LANGUAGE) { console.warn( - `'language' specified as argument ('${language}') AND environment variable ('${process.env.LANGUAGE}')` + `'language' specified as argument ('${language}') AND environment variable ('${process.env.LANGUAGE}')`, ) } } else { @@ -59,7 +59,7 @@ async function main(opts, args) { language = process.env.LANGUAGE if (!languageKeys.includes(language)) { throw new Error( - `Environment variable 'VERSION' (${language}) is not recognized. Must be one of ${languageKeys}` + `Environment variable 'VERSION' (${language}) is not recognized. Must be one of ${languageKeys}`, ) } } @@ -74,7 +74,7 @@ async function main(opts, args) { version = opts.version if (process.env.VERSION) { console.warn( - `'version' specified as argument ('${version}') AND environment variable ('${process.env.VERSION}')` + `'version' specified as argument ('${version}') AND environment variable ('${process.env.VERSION}')`, ) } } else { @@ -82,7 +82,7 @@ async function main(opts, args) { version = process.env.VERSION if (!allVersionKeys.includes(version)) { throw new Error( - `Environment variable 'VERSION' (${version}) is not recognized. Must be one of ${allVersionKeys}` + `Environment variable 'VERSION' (${version}) is not recognized. Must be one of ${allVersionKeys}`, ) } } @@ -119,7 +119,7 @@ async function main(opts, args) { } assert( !indexVersion || indexVersion in allVersions, - `version must be undefined or one of ${Object.keys(allVersions)}` + `version must be undefined or one of ${Object.keys(allVersions)}`, ) const [outDirectory] = args diff --git a/src/search/scripts/sync.js b/src/search/scripts/sync.js index 4ded35acb598..1186b73f94dc 100644 --- a/src/search/scripts/sync.js +++ b/src/search/scripts/sync.js @@ -21,18 +21,18 @@ export default async function syncSearchIndexes({ // build indices for a specific language if provided; otherwise build indices for all languages const languagesToBuild = Object.keys(languages).filter((lang) => - notLanguage ? notLanguage !== lang : language ? language === lang : true + notLanguage ? notLanguage !== lang : language ? language === lang : true, ) // build indices for a specific version if provided; otherwise build indices for all versions const versionsToBuild = Object.keys(allVersions).filter((ver) => - version ? version === ver : true + version ? version === ver : true, ) console.log( `Building indices for ${chalk.yellow(language || 'all languages')} and ${chalk.yellow( - version || 'all versions' - )}.\n` + version || 'all versions', + )}.\n`, ) // Exclude WIP pages, hidden pages, index pages, etc @@ -71,7 +71,7 @@ export default async function syncSearchIndexes({ pageVersion, languageCode, redirects, - config + config, ) countRecordsTotal += records.length const fileWritten = await writeIndexRecords(indexName, records, outDirectory) diff --git a/src/search/scripts/validate-records.js b/src/search/scripts/validate-records.js index 37c7fcf37d72..1adb43217c5f 100644 --- a/src/search/scripts/validate-records.js +++ b/src/search/scripts/validate-records.js @@ -24,12 +24,12 @@ export default function validateRecords(name, records) { records.forEach((record) => { assert( isString(record.objectID) && record.objectID.length, - `objectID must be a string. received: ${record.objectID}, ${JSON.stringify(record)}` + `objectID must be a string. received: ${record.objectID}, ${JSON.stringify(record)}`, ) assert( isString(record.title) && record.title.length, - `title must be a string. received: ${record.title}, ${JSON.stringify(record)}` + `title must be a string. received: ${record.title}, ${JSON.stringify(record)}`, ) }) diff --git a/src/search/tests/api-search.js b/src/search/tests/api-search.js index 29f9d44e2b5a..72c9285e750e 100644 --- a/src/search/tests/api-search.js +++ b/src/search/tests/api-search.js @@ -19,7 +19,7 @@ import { get } from '../../../tests/helpers/e2etest.js' if (!process.env.ELASTICSEARCH_URL) { console.warn( 'None of the API search middleware tests are run because ' + - "the environment variable 'ELASTICSEARCH_URL' is currently not set." + "the environment variable 'ELASTICSEARCH_URL' is currently not set.", ) } diff --git a/src/search/tests/parse-page-sections-into-records.js b/src/search/tests/parse-page-sections-into-records.js index 889f5d2ed69c..d97e9bf42449 100644 --- a/src/search/tests/parse-page-sections-into-records.js +++ b/src/search/tests/parse-page-sections-into-records.js @@ -11,23 +11,23 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url)) const fixtures = { pageWithSections: await fs.readFile( path.join(__dirname, 'fixtures/page-with-sections.html'), - 'utf8' + 'utf8', ), pageWithoutSections: await fs.readFile( path.join(__dirname, 'fixtures/page-without-sections.html'), - 'utf8' + 'utf8', ), pageWithoutBody: await fs.readFile( path.join(__dirname, 'fixtures/page-without-body.html'), - 'utf8' + 'utf8', ), pageMultipleH1s: await fs.readFile( path.join(__dirname, 'fixtures/page-with-multiple-h1s.html'), - 'utf8' + 'utf8', ), pageHeadingParagraphNoWhitespace: await fs.readFile( path.join(__dirname, 'fixtures/page-with-heading-and-paragraph-no-whitespace.html'), - 'utf8' + 'utf8', ), } diff --git a/src/search/tests/rendering.js b/src/search/tests/rendering.js index 679b406de5c4..ba1dd1b65eae 100644 --- a/src/search/tests/rendering.js +++ b/src/search/tests/rendering.js @@ -20,7 +20,7 @@ import { SURROGATE_ENUMS } from '../../../middleware/set-fastly-surrogate-key.js if (!process.env.ELASTICSEARCH_URL) { console.warn( 'None of the API search middleware tests are run because ' + - "the environment variable 'ELASTICSEARCH_URL' is currently not set." + "the environment variable 'ELASTICSEARCH_URL' is currently not set.", ) } diff --git a/src/shielding/tests/shielding.js b/src/shielding/tests/shielding.js index 016e54a9d35b..1adb7dfc0288 100644 --- a/src/shielding/tests/shielding.js +++ b/src/shielding/tests/shielding.js @@ -31,7 +31,7 @@ describe('junk paths', () => { expect(res.statusCode).toBe(404) expect(res.headers['content-type']).toMatch('text/plain') expect(res.headers['cache-control']).toMatch('public') - } + }, ) test('any URL that ends with /index.md redirects', async () => { @@ -89,7 +89,7 @@ describe('404 pages and their content-type', () => { expect(res.statusCode).toBe(404) expect(res.headers['content-type']).toMatch('text/plain') expect(res.headers['cache-control']).toMatch('public') - } + }, ) test('valid language prefix 404 response is HTML', async () => { const res = await get('/en/something-that-doesnt-existent') diff --git a/src/webhooks/components/Webhook.tsx b/src/webhooks/components/Webhook.tsx index 9c75b59d2324..b5b2ca9b8394 100644 --- a/src/webhooks/components/Webhook.tsx +++ b/src/webhooks/components/Webhook.tsx @@ -117,7 +117,7 @@ export function Webhook({ webhook }: Props) { undefined, { shallow: true, - } + }, ) } @@ -138,7 +138,7 @@ export function Webhook({ webhook }: Props) { webhookFetcher, { revalidateOnFocus: false, - } + }, ) const currentWebhookActionType = selectedWebhookActionType || webhook.data.action @@ -155,7 +155,7 @@ export function Webhook({ webhook }: Props) { dangerouslySetInnerHTML={{ __html: t('webhooks.availability').replace( '{{ WebhookName }}', - currentWebhookAction.category + currentWebhookAction.category, ), }} /> @@ -182,7 +182,7 @@ export function Webhook({ webhook }: Props) { dangerouslySetInnerHTML={{ __html: t('webhooks.webhook_payload_object').replace( '{{ WebhookName }}', - currentWebhookAction.category + currentWebhookAction.category, ), }} /> diff --git a/src/webhooks/lib/index.js b/src/webhooks/lib/index.js index 8d8062caa37e..70843eb29f97 100644 --- a/src/webhooks/lib/index.js +++ b/src/webhooks/lib/index.js @@ -68,8 +68,8 @@ export async function getWebhooks(version) { webhooksCache.set( openApiVersion, readCompressedJsonFileFallback( - path.join(WEBHOOK_DATA_DIR, openApiVersion, WEBHOOK_SCHEMA_FILENAME) - ) + path.join(WEBHOOK_DATA_DIR, openApiVersion, WEBHOOK_SCHEMA_FILENAME), + ), ) } diff --git a/src/webhooks/middleware/webhooks.js b/src/webhooks/middleware/webhooks.js index 59a280f0cf80..e57ffe085db4 100644 --- a/src/webhooks/middleware/webhooks.js +++ b/src/webhooks/middleware/webhooks.js @@ -19,7 +19,7 @@ router.get('/v1', async function webhooks(req, res, next) { } const webhookVersion = Object.values(allVersions).find( - (version) => version.version === req.query.version + (version) => version.version === req.query.version, )?.version const notFoundError = 'No webhook found for given category and version' diff --git a/src/webhooks/pages/webhook-events-and-payloads.tsx b/src/webhooks/pages/webhook-events-and-payloads.tsx index fa6253e4aa03..c85e86f3aa4d 100644 --- a/src/webhooks/pages/webhook-events-and-payloads.tsx +++ b/src/webhooks/pages/webhook-events-and-payloads.tsx @@ -88,7 +88,7 @@ export const getServerSideProps: GetServerSideProps<Props> = async (context) => // content file const webhooksMiniTocs = await getAutomatedPageMiniTocItems( webhooks.map((webhook) => webhook.data.category), - context + context, ) webhooksMiniTocs && miniTocItems.push(...webhooksMiniTocs) diff --git a/src/webhooks/scripts/sync.js b/src/webhooks/scripts/sync.js index 5f7ac0247639..c88e59ce353b 100644 --- a/src/webhooks/scripts/sync.js +++ b/src/webhooks/scripts/sync.js @@ -18,7 +18,7 @@ export async function syncWebhookData(sourceDirectory, webhookSchemas) { const webhookSchemaData = schema.webhooks ?? schema['x-webhooks'] if (!webhookSchemaData) { console.log( - `🟡 No webhooks exist in ${sourceDirectory}/${schemaName}. No static webhook files will be generated.` + `🟡 No webhooks exist in ${sourceDirectory}/${schemaName}. No static webhook files will be generated.`, ) return } @@ -29,7 +29,7 @@ export async function syncWebhookData(sourceDirectory, webhookSchemas) { if (Object.keys(data).length === 0) { throw new Error( - `Generating Webhook data failed for ${sourceDirectory}/${schemaName}. The generated data file was empty.` + `Generating Webhook data failed for ${sourceDirectory}/${schemaName}. The generated data file was empty.`, ) } @@ -43,7 +43,7 @@ export async function syncWebhookData(sourceDirectory, webhookSchemas) { const targetPath = path.join(targetDirectory, WEBHOOK_SCHEMA_FILENAME) await writeFile(targetPath, JSON.stringify(data, null, 2)) console.log(`✅ Wrote ${targetPath}`) - }) + }), ) } @@ -54,7 +54,7 @@ async function processWebhookSchema(webhooks) { } } catch (error) { throw new Error( - "🐛 Whoops! It looks like the decorator script wasn't able to parse the dereferenced schema. A recent change may not yet be supported by the decorator. Please reach out in the #docs-engineering slack channel for help." + "🐛 Whoops! It looks like the decorator script wasn't able to parse the dereferenced schema. A recent change may not yet be supported by the decorator. Please reach out in the #docs-engineering slack channel for help.", ) } } diff --git a/src/webhooks/scripts/webhook.js b/src/webhooks/scripts/webhook.js index 826593841f3f..0c770154b5b7 100644 --- a/src/webhooks/scripts/webhook.js +++ b/src/webhooks/scripts/webhook.js @@ -26,7 +26,7 @@ export default class Webhook { this.action = get( webhook, `requestBody.content['application/json'].schema.properties.action.enum[0]`, - null + null, ) // for some webhook action types (like some pull-request webhook types) the @@ -36,7 +36,7 @@ export default class Webhook { this.action = get( webhook, `requestBody.content['application/json'].schema.oneOf[0].properties.action.enum[0]`, - null + null, ) } diff --git a/src/webhooks/tests/get-schema-files.js b/src/webhooks/tests/get-schema-files.js index 07800d7faa7e..66f44ca73009 100644 --- a/src/webhooks/tests/get-schema-files.js +++ b/src/webhooks/tests/get-schema-files.js @@ -6,7 +6,7 @@ import { allVersions } from '../../../lib/all-versions.js' describe('webhook data files are generated correctly from dereferenced openapi files', () => { test('webhook schema list should not include calendar date versions', async () => { const supportedReleases = Object.keys(allVersions).map( - (version) => allVersions[version].openApiVersionName + (version) => allVersions[version].openApiVersionName, ) const schemas = [ 'fpt-2022-08-09.json', @@ -18,7 +18,7 @@ describe('webhook data files are generated correctly from dereferenced openapi f const { webhookSchemas } = await getOpenApiSchemaFiles(schemas) expect(webhookSchemas.sort()).toEqual( - supportedReleases.sort().map((release) => `${release}.json`) + supportedReleases.sort().map((release) => `${release}.json`), ) }) }) diff --git a/src/webhooks/tests/rendering.js b/src/webhooks/tests/rendering.js index bc419d1b319f..d537a2d79afc 100644 --- a/src/webhooks/tests/rendering.js +++ b/src/webhooks/tests/rendering.js @@ -19,7 +19,7 @@ describe('webhooks events and payloads', () => { .get() const everyWebhookEventPresent = webhookNames.every((webhookName) => - domH2Ids.includes(webhookName) + domH2Ids.includes(webhookName), ) expect(everyWebhookEventPresent).toBe(true) } @@ -33,7 +33,7 @@ describe('webhooks events and payloads', () => { for (const version in allVersions) { if (!version.includes('enterprise-server') && !version.includes('github-ae')) { const $ = await getDOM( - `/en/${version}/webhooks-and-events/webhooks/webhook-events-and-payloads` + `/en/${version}/webhooks-and-events/webhooks/webhook-events-and-payloads`, ) const domH2Ids = $('h2') .map((i, h2) => $(h2).attr('id')) diff --git a/start-server.js b/start-server.js index 78ff780dd53d..b839cc35dcfb 100644 --- a/start-server.js +++ b/start-server.js @@ -24,7 +24,7 @@ async function checkPortAvailability() { if (portInUse) { console.log(`\n\n\nPort ${port} is not available. You may already have a server running.`) console.log( - `Try running \`npx kill-port ${port}\` to shut down all your running node processes.\n\n\n` + `Try running \`npx kill-port ${port}\` to shut down all your running node processes.\n\n\n`, ) console.log('\x07') // system 'beep' sound process.exit(1) diff --git a/tests/content/redirect-orphans.js b/tests/content/redirect-orphans.js index e6469a5c4b6c..a7bb9e062eb3 100644 --- a/tests/content/redirect-orphans.js +++ b/tests/content/redirect-orphans.js @@ -21,8 +21,8 @@ describe('redirect orphans', () => { throw new Error( `In ${path.join( 'content', - page.relativePath - )} redirect entry (${redirectFrom}) has a trailing slash` + page.relativePath, + )} redirect entry (${redirectFrom}) has a trailing slash`, ) } redirectFroms.set(redirectFrom, page.relativePath) @@ -34,7 +34,7 @@ describe('redirect orphans', () => { const asPath = Permalink.relativePathToSuffix(page.relativePath) if (redirectFroms.has(asPath)) { errors.push( - `${asPath} is a redirect_from in ${path.join('content', redirectFroms.get(asPath))}` + `${asPath} is a redirect_from in ${path.join('content', redirectFroms.get(asPath))}`, ) } } diff --git a/tests/content/secure-files.js b/tests/content/secure-files.js index cf7e67066b7f..37ede05b4fc2 100644 --- a/tests/content/secure-files.js +++ b/tests/content/secure-files.js @@ -34,8 +34,8 @@ describe('Secure file paths are present and have code owners if required', () => matchingEntry?.toLowerCase().includes(file.requiredCodeOwner.toLowerCase()), `Code owner for ${file.name} expected to be @${file.requiredCodeOwner.replaceAll( '@', - '' - )}` + '', + )}`, ).toBeTruthy() } }) diff --git a/tests/content/site-tree.js b/tests/content/site-tree.js index bcdcd60efa1d..2b83ff2f23b9 100644 --- a/tests/content/site-tree.js +++ b/tests/content/site-tree.js @@ -26,7 +26,7 @@ describe('siteTree', () => { test('object order and structure', () => { expect(siteTree.en[nonEnterpriseDefaultVersion].childPages[1].href).toBe('/en/get-started') expect(siteTree.en[nonEnterpriseDefaultVersion].childPages[1].childPages[0].href).toBe( - '/en/get-started/quickstart' + '/en/get-started/quickstart', ) }) @@ -43,7 +43,7 @@ describe('siteTree', () => { // Confirm the raw title contains Liquid expect(pageWithDynamicTitle.page.title).toEqual( - 'Installing {% data variables.product.prodname_enterprise %}' + 'Installing {% data variables.product.prodname_enterprise %}', ) }) }) diff --git a/tests/helpers/caching-headers.js b/tests/helpers/caching-headers.js index 02d6060d8ff6..807a9ce65946 100644 --- a/tests/helpers/caching-headers.js +++ b/tests/helpers/caching-headers.js @@ -9,6 +9,6 @@ export function checkCachingHeaders(res, defaultSurrogateKey = false, minMaxAge expect(maxAgeSeconds).toBeGreaterThanOrEqual(minMaxAge) // Because it doesn't have have a unique URL expect(res.headers['surrogate-key'].split(/\s/g)[0]).toBe( - defaultSurrogateKey ? SURROGATE_ENUMS.DEFAULT : SURROGATE_ENUMS.MANUAL + defaultSurrogateKey ? SURROGATE_ENUMS.DEFAULT : SURROGATE_ENUMS.MANUAL, ) } diff --git a/tests/helpers/e2etest.js b/tests/helpers/e2etest.js index a7a8ccc0d39a..ac1443d6b508 100644 --- a/tests/helpers/e2etest.js +++ b/tests/helpers/e2etest.js @@ -12,7 +12,7 @@ export async function get( headers, responseType, retries = 0, - } = {} + } = {}, ) { const fn = got[method] if (!fn || typeof fn !== 'function') throw new Error(`No method function for '${method}'`) @@ -25,7 +25,7 @@ export async function get( followRedirect: followAllRedirects || followRedirects, responseType, }, - isUndefined + isUndefined, ) return await fn(`http://localhost:4000${route}`, xopts) } @@ -53,7 +53,7 @@ export async function getDOMCached(route, options) { export async function getDOM( route, - { headers, allow500s = false, allow404 = false, retries = 0 } = {} + { headers, allow500s = false, allow404 = false, retries = 0 } = {}, ) { const res = await get(route, { followRedirects: true, headers, retries }) if (!allow500s && res.statusCode >= 500) { diff --git a/tests/rendering-fixtures/breadcrumbs.js b/tests/rendering-fixtures/breadcrumbs.js index f558190690db..a73635335638 100644 --- a/tests/rendering-fixtures/breadcrumbs.js +++ b/tests/rendering-fixtures/breadcrumbs.js @@ -58,7 +58,7 @@ describe('breadcrumbs', () => { test('early access article pages have breadcrumbs with product, category, and article', async () => { const $ = await getDOM('/early-access/secrets/deeper/mariana-trench') const $breadcrumbTitles = $( - '[data-testid=breadcrumbs-in-article] [data-testid=breadcrumb-title]' + '[data-testid=breadcrumbs-in-article] [data-testid=breadcrumb-title]', ) const $breadcrumbLinks = $('[data-testid=breadcrumbs-in-article] a') diff --git a/tests/rendering-fixtures/categories-and-map-topic.js b/tests/rendering-fixtures/categories-and-map-topic.js index 0ab8d79ab103..3612036af6b9 100644 --- a/tests/rendering-fixtures/categories-and-map-topic.js +++ b/tests/rendering-fixtures/categories-and-map-topic.js @@ -31,7 +31,7 @@ describe('map topics', () => { const firstArticleIntro = $('[data-testid=table-of-contents] p').first() // Its HTML in the intro is escaped and Markdown converted expect(firstArticleIntro.html()).toMatch( - 'This page uses &lt; and &gt; in the title and <code>shortTitle</code>' + 'This page uses &lt; and &gt; in the title and <code>shortTitle</code>', ) }) }) diff --git a/tests/rendering-fixtures/footer.js b/tests/rendering-fixtures/footer.js index cddd727d3ff9..c84d594d5f6e 100644 --- a/tests/rendering-fixtures/footer.js +++ b/tests/rendering-fixtures/footer.js @@ -9,7 +9,7 @@ describe('footer', () => { describe('"contact us" link', () => { test('leads to support from articles', async () => { const $ = await getDOM( - `/en/${nonEnterpriseDefaultVersion}/get-started/quickstart/hello-world` + `/en/${nonEnterpriseDefaultVersion}/get-started/quickstart/hello-world`, ) expect($('a#support').attr('href')).toBe('https://support.github.com') }) @@ -33,7 +33,7 @@ describe('footer', () => { test('codespaces product landing page leads to discussions page', async () => { const $ = await getDOM('/en/get-started') expect($('a#ask-community').attr('href')).toBe( - 'https://hubgit.com/orgs/community/discussions/categories/get-started' + 'https://hubgit.com/orgs/community/discussions/categories/get-started', ) }) }) @@ -42,7 +42,7 @@ describe('footer', () => { test('leads to https://github.community/ when clicking on the community link', async () => { const $ = await getDOM(`/en/get-started/quickstart/hello-world`) expect($('a#ask-community').attr('href')).toBe( - 'https://github.com/orgs/community/discussions' + 'https://github.com/orgs/community/discussions', ) }) }) diff --git a/tests/rendering-fixtures/guides.js b/tests/rendering-fixtures/guides.js index 5249f37fe717..4ddf18c88ffb 100644 --- a/tests/rendering-fixtures/guides.js +++ b/tests/rendering-fixtures/guides.js @@ -37,7 +37,7 @@ describe('learning tracks', () => { expect(nextWrapper.length).toBe(1) const nextLink = nextWrapper.find('a').first() expect(nextLink.attr('href')).toMatch( - 'code-security/getting-started/securing-your-organization' + 'code-security/getting-started/securing-your-organization', ) expect(nextLink.attr('href')).toMatch('learn=foo_bar') expect(nextLink.attr('href')).toMatch('learnProduct=code-security') @@ -64,7 +64,7 @@ describe('learning tracks', () => { const nav3 = $2('[data-testid=learning-track-nav]') const navPrevLink = nav3.find('a').first() expect(navPrevLink.attr('href')).toMatch( - 'code-security/getting-started/securing-your-organization' + 'code-security/getting-started/securing-your-organization', ) }) diff --git a/tests/rendering-fixtures/internal-links.js b/tests/rendering-fixtures/internal-links.js index a8da5ef9346a..23dc39c70fa0 100644 --- a/tests/rendering-fixtures/internal-links.js +++ b/tests/rendering-fixtures/internal-links.js @@ -46,18 +46,18 @@ describe('cross-version-links', () => { // Tests that the hardcoded prefix is always removed const firstLink = links.filter( - (i, element) => $(element).text() === 'Hello world always in free-pro-team' + (i, element) => $(element).text() === 'Hello world always in free-pro-team', ) expect(firstLink.attr('href')).toBe('/en/get-started/quickstart/hello-world') // Tests that the second link always goes to enterprise-server@X.Y const secondLink = links.filter( - (i, element) => $(element).text() === 'Autotitling page always in enterprise-server latest' + (i, element) => $(element).text() === 'Autotitling page always in enterprise-server latest', ) expect(secondLink.attr('href')).toBe( - `/en/enterprise-server@${enterpriseServerReleases.latest}/get-started/quickstart/hello-world` + `/en/enterprise-server@${enterpriseServerReleases.latest}/get-started/quickstart/hello-world`, ) - } + }, ) }) @@ -106,7 +106,7 @@ describe('link-rewriting', () => { const link = links.filter((i, element) => $(element).text() === 'Cross Version Linking') expect(link.attr('href')).toMatch( - `/en/enterprise-server@${enterpriseServerReleases.latest}/get-started/` + `/en/enterprise-server@${enterpriseServerReleases.latest}/get-started/`, ) }) }) diff --git a/tests/rendering-fixtures/liquid.js b/tests/rendering-fixtures/liquid.js index 7ecb9745f003..d3726e2f07ef 100644 --- a/tests/rendering-fixtures/liquid.js +++ b/tests/rendering-fixtures/liquid.js @@ -201,7 +201,7 @@ describe('extended Markdown', () => { unwantedConditions.forEach((condition) => { expect(html).not.toMatch(condition) }) - } + }, ) }) diff --git a/tests/rendering-fixtures/page-titles.js b/tests/rendering-fixtures/page-titles.js index 18fb5e4a5828..ed058eeab68a 100644 --- a/tests/rendering-fixtures/page-titles.js +++ b/tests/rendering-fixtures/page-titles.js @@ -15,7 +15,7 @@ describe('page titles', () => { test('ghes article', async () => { const $ = await getDOM(`/enterprise-server@latest/get-started/quickstart/hello-world`) expect($('title').text()).toBe( - `Hello World - GitHub Enterprise Server ${enterpriseServerReleases.latest} Docs` + `Hello World - GitHub Enterprise Server ${enterpriseServerReleases.latest} Docs`, ) }) diff --git a/tests/rendering-fixtures/playwright-rendering.spec.ts b/tests/rendering-fixtures/playwright-rendering.spec.ts index 54940d5bcdca..e58ef6c2a303 100644 --- a/tests/rendering-fixtures/playwright-rendering.spec.ts +++ b/tests/rendering-fixtures/playwright-rendering.spec.ts @@ -170,8 +170,8 @@ test('hovercards', async ({ page }) => { await page.locator('#article-contents').getByRole('link', { name: 'Quickstart' }).hover() await expect( page.getByText( - 'Get started using GitHub to manage Git repositories and collaborate with others.' - ) + 'Get started using GitHub to manage Git repositories and collaborate with others.', + ), ).toBeVisible() // now move the mouse away from hovering over the link, the hovercard should @@ -179,8 +179,8 @@ test('hovercards', async ({ page }) => { await page.mouse.move(0, 0) await expect( page.getByText( - 'Get started using GitHub to manage Git repositories and collaborate with others.' - ) + 'Get started using GitHub to manage Git repositories and collaborate with others.', + ), ).not.toBeVisible() // external links don't have a hovercard @@ -204,7 +204,7 @@ test('hovercards', async ({ page }) => { // this page's intro has two links; one in-page and one internal await page.locator('#article-intro').getByRole('link', { name: 'another link' }).hover() await expect( - page.getByText('Follow this Hello World exercise to get started with GitHub.') + page.getByText('Follow this Hello World exercise to get started with GitHub.'), ).toBeVisible() // same page anchor links have a hovercard @@ -327,7 +327,7 @@ test.describe('test nav at different viewports', () => { await expect( page.getByRole('button', { name: 'Select GitHub product version: current version is free-pro-team@latest', - }) + }), ).not.toBeVisible() // version picker is in mobile menu diff --git a/tests/rendering-fixtures/sidebar.js b/tests/rendering-fixtures/sidebar.js index 37a40d27dafd..dc4881125491 100644 --- a/tests/rendering-fixtures/sidebar.js +++ b/tests/rendering-fixtures/sidebar.js @@ -22,7 +22,7 @@ describe('sidebar', () => { // or else those pages won't become part of the site tree. But // they should not actually appear in the side bar. const earlyAccessLinks = links.filter((i, link) => - $(link).attr('href').split('/').includes('early-access') + $(link).attr('href').split('/').includes('early-access'), ) expect(earlyAccessLinks.length).toBe(0) }) @@ -58,8 +58,8 @@ describe('sidebar', () => { const $ = await getDOM('/get-started/quickstart/hello-world') expect( $( - '[data-testid=sidebar] [data-testid=sidebar-article-group] li[aria-current="true"]' - ).text() + '[data-testid=sidebar] [data-testid=sidebar-article-group] li[aria-current="true"]', + ).text(), ).toBe('Hello World') }) diff --git a/tests/rendering-fixtures/versioning.js b/tests/rendering-fixtures/versioning.js index b84fb81e5efc..2526103049ec 100644 --- a/tests/rendering-fixtures/versioning.js +++ b/tests/rendering-fixtures/versioning.js @@ -18,7 +18,7 @@ describe('article versioning', () => { const second = links.filter((i) => i === 1) expect(first.attr('href')).toBe('/en/enterprise-cloud@latest/get-started/versioning/only-ghec') expect(second.attr('href')).toBe( - '/en/enterprise-cloud@latest/get-started/versioning/only-ghec-and-ghes' + '/en/enterprise-cloud@latest/get-started/versioning/only-ghec-and-ghes', ) // Both links should 200 if you go to them expect((await head(first.attr('href'))).statusCode).toBe(200) @@ -41,7 +41,7 @@ describe('article versioning', () => { }) expect(res.statusCode).toBe(302) expect(res.headers.location).toBe( - '/en/enterprise-cloud@latest/get-started/versioning/only-ghec' + '/en/enterprise-cloud@latest/get-started/versioning/only-ghec', ) }) }) diff --git a/tests/rendering-fixtures/video-transcripts.js b/tests/rendering-fixtures/video-transcripts.js index 0d5684736a1f..37932f3e1a88 100644 --- a/tests/rendering-fixtures/video-transcripts.js +++ b/tests/rendering-fixtures/video-transcripts.js @@ -7,7 +7,7 @@ describe('transcripts', () => { test('video link from product landing page leads to video', async () => { const $ = await getDOM('/en/get-started') expect($('a#product-video').attr('href')).toBe( - '/en/get-started/video-transcripts/transcript--my-awesome-video' + '/en/get-started/video-transcripts/transcript--my-awesome-video', ) }) }) diff --git a/tests/rendering/block-robots.js b/tests/rendering/block-robots.js index 2e93df331fe4..70512314c1ec 100644 --- a/tests/rendering/block-robots.js +++ b/tests/rendering/block-robots.js @@ -60,7 +60,7 @@ describe('block robots', () => { expect(allowIndex('/en/actions/overview/intro')).toBe(true) expect(allowIndex(`/en/enterprise/${enterpriseServerReleases.latest}/user/actions`)).toBe(true) expect( - allowIndex(`/en/enterprise/${enterpriseServerReleases.oldestSupported}/user/actions`) + allowIndex(`/en/enterprise/${enterpriseServerReleases.oldestSupported}/user/actions`), ).toBe(true) }) diff --git a/tests/rendering/manifest.js b/tests/rendering/manifest.js index de55118fc71c..9b9ea5896a1c 100644 --- a/tests/rendering/manifest.js +++ b/tests/rendering/manifest.js @@ -35,7 +35,7 @@ describe('manifest', () => { const dimensions = await image.metadata() expect(dimensions.width).toBe(width) expect(dimensions.height).toBe(height) - }) + }), ) }) }) diff --git a/tests/rendering/release-notes.js b/tests/rendering/release-notes.js index eb90fe0f8e48..4a6db4a8d04e 100644 --- a/tests/rendering/release-notes.js +++ b/tests/rendering/release-notes.js @@ -20,7 +20,7 @@ describe('server', () => { expect(res.statusCode).toBe(302) expect(res.headers.location).toBe( // Note that English is the default fallback for redirects - `/en/enterprise-server@${enterpriseServerReleases.latest}/admin/release-notes` + `/en/enterprise-server@${enterpriseServerReleases.latest}/admin/release-notes`, ) }) test('basic rendering', async () => { diff --git a/tests/rendering/robots-txt.js b/tests/rendering/robots-txt.js index 1a8010c2bc8d..b22c3bf0e123 100644 --- a/tests/rendering/robots-txt.js +++ b/tests/rendering/robots-txt.js @@ -25,7 +25,7 @@ describe('robots.txt', () => { expect(robots.isAllowed('https://docs.github.com/')).toBe(true) expect(robots.isAllowed('https://docs.github.com/en')).toBe(true) expect( - robots.isAllowed('https://docs.github.com/en/articles/verifying-your-email-address') + robots.isAllowed('https://docs.github.com/en/articles/verifying-your-email-address'), ).toBe(true) }) diff --git a/tests/rendering/server.js b/tests/rendering/server.js index b4f8a3c758cd..d7c07ed05c2e 100644 --- a/tests/rendering/server.js +++ b/tests/rendering/server.js @@ -14,7 +14,7 @@ import { describe, jest } from '@jest/globals' const AZURE_STORAGE_URL = 'githubdocs.azureedge.net' const activeProducts = Object.values(productMap).filter( - (product) => !product.wip && !product.hidden + (product) => !product.wip && !product.hidden, ) jest.useFakeTimers({ legacyFakeTimers: true }) @@ -55,7 +55,7 @@ describe('server', () => { const productTitles = activeProducts.map((prod) => prod.name) const productHrefs = activeProducts.map((prod) => - prod.external ? prod.href : `/en${prod.href}` + prod.external ? prod.href : `/en${prod.href}`, ) const titlesInSidebarButNotProducts = lodash.difference(sidebarTitles, productTitles) @@ -66,19 +66,19 @@ describe('server', () => { expect( titlesInSidebarButNotProducts.length, - `Found unexpected titles in sidebar: ${titlesInSidebarButNotProducts.join(', ')}` + `Found unexpected titles in sidebar: ${titlesInSidebarButNotProducts.join(', ')}`, ).toBe(0) expect( titlesInProductsButNotSidebar.length, - `Found titles missing from sidebar: ${titlesInProductsButNotSidebar.join(', ')}` + `Found titles missing from sidebar: ${titlesInProductsButNotSidebar.join(', ')}`, ).toBe(0) expect( hrefsInSidebarButNotProducts.length, - `Found unexpected hrefs in sidebar: ${hrefsInSidebarButNotProducts.join(', ')}` + `Found unexpected hrefs in sidebar: ${hrefsInSidebarButNotProducts.join(', ')}`, ).toBe(0) expect( hrefsInProductsButNotSidebar.length, - `Found hrefs missing from sidebar: ${hrefsInProductsButNotSidebar.join(', ')}` + `Found hrefs missing from sidebar: ${hrefsInProductsButNotSidebar.join(', ')}`, ).toBe(0) }) @@ -94,11 +94,11 @@ describe('server', () => { const sidebarTitles = sidebarItems.map((el) => $(el).text().trim()) const sidebarHrefs = sidebarItems.map((el) => $(el).attr('href')) const productItems = activeProducts.filter( - (prod) => prod.external || prod.versions.includes(ep) + (prod) => prod.external || prod.versions.includes(ep), ) const productTitles = productItems.map((prod) => prod.name) const productHrefs = productItems.map((prod) => - prod.external ? prod.href : `/en/${ep}${getPathWithoutVersion(prod.href)}` + prod.external ? prod.href : `/en/${ep}${getPathWithoutVersion(prod.href)}`, ) const titlesInProductsButNotSidebar = lodash.difference(productTitles, sidebarTitles) @@ -106,11 +106,11 @@ describe('server', () => { expect( titlesInProductsButNotSidebar.length, - `Found titles missing from sidebar: ${titlesInProductsButNotSidebar.join(', ')}` + `Found titles missing from sidebar: ${titlesInProductsButNotSidebar.join(', ')}`, ).toBe(0) expect( hrefsInProductsButNotSidebar.length, - `Found hrefs missing from sidebar: ${hrefsInProductsButNotSidebar.join(', ')}` + `Found hrefs missing from sidebar: ${hrefsInProductsButNotSidebar.join(', ')}`, ).toBe(0) } }) @@ -163,8 +163,8 @@ describe('server', () => { expect($.text().includes("It looks like this page doesn't exist.")).toBe(true) expect( $.text().includes( - 'We track these errors automatically, but if the problem persists please feel free to contact us.' - ) + 'We track these errors automatically, but if the problem persists please feel free to contact us.', + ), ).toBe(true) expect($.res.statusCode).toBe(404) }) @@ -184,8 +184,8 @@ describe('server', () => { expect($.text().includes('It looks like something went wrong.')).toBe(true) expect( $.text().includes( - 'We track these errors automatically, but if the problem persists please feel free to contact us.' - ) + 'We track these errors automatically, but if the problem persists please feel free to contact us.', + ), ).toBe(true) expect($.res.statusCode).toBe(500) }) @@ -203,11 +203,11 @@ describe('server', () => { // see issue 9678 test('does not use cached intros in map topics', async () => { let $ = await getDOM( - '/en/get-started/importing-your-projects-to-github/importing-source-code-to-github/importing-a-git-repository-using-the-command-line' + '/en/get-started/importing-your-projects-to-github/importing-source-code-to-github/importing-a-git-repository-using-the-command-line', ) const articleIntro = $('[data-testid="lead"]').text() $ = await getDOM( - '/en/enterprise/2.16/user/importing-your-projects-to-github/importing-source-code-to-github' + '/en/enterprise/2.16/user/importing-your-projects-to-github/importing-source-code-to-github', ) const mapTopicIntro = $('.map-topic').first().next().text() expect(articleIntro).not.toEqual(mapTopicIntro) @@ -247,7 +247,7 @@ describe('server', () => { page.languageCode === 'en' && page.hidden && page.relativePath.startsWith('early-access') && - !page.relativePath.endsWith('index.md') + !page.relativePath.endsWith('index.md'), ) for (const { href } of hiddenPages[0].permalinks) { const $ = await getDOM(href) @@ -391,14 +391,14 @@ describe('static routes', () => { expect( (await get(`/public/ghes-${enterpriseServerReleases.latest}/schema.docs-enterprise.graphql`)) - .statusCode + .statusCode, ).toBe(200) expect( ( await get( - `/public/ghes-${enterpriseServerReleases.oldestSupported}/schema.docs-enterprise.graphql` + `/public/ghes-${enterpriseServerReleases.oldestSupported}/schema.docs-enterprise.graphql`, ) - ).statusCode + ).statusCode, ).toBe(200) expect((await get('/public/ghae/schema.docs-ghae.graphql')).statusCode).toBe(200) }) diff --git a/tests/routing/deprecated-enterprise-versions.js b/tests/routing/deprecated-enterprise-versions.js index dd796282e4a5..9ecab24a3724 100644 --- a/tests/routing/deprecated-enterprise-versions.js +++ b/tests/routing/deprecated-enterprise-versions.js @@ -29,11 +29,11 @@ describe('enterprise deprecation', () => { test('workaround for lost frontmatter redirects works in deprecated enterprise content >=2.13', async () => { const res = await get( - '/en/enterprise/2.15/user/articles/viewing-contributions-on-your-profile-page' + '/en/enterprise/2.15/user/articles/viewing-contributions-on-your-profile-page', ) expect(res.statusCode).toBe(301) expect(res.headers.location).toBe( - '/en/enterprise/2.15/user/articles/viewing-contributions-on-your-profile' + '/en/enterprise/2.15/user/articles/viewing-contributions-on-your-profile', ) }) @@ -41,7 +41,7 @@ describe('enterprise deprecation', () => { const res = await get('/enterprise/2.19/admin/categories/time') expect(res.statusCode).toBe(302) expect(res.headers.location).toBe( - '/en/enterprise-server@2.19/admin/configuration/configuring-time-synchronization' + '/en/enterprise-server@2.19/admin/configuration/configuring-time-synchronization', ) }) @@ -114,7 +114,7 @@ describe('recently deprecated redirects', () => { test('redirects enterprise-server 3.0 with actual redirect without language', async () => { const res = await get( - '/enterprise-server@3.0/github/getting-started-with-github/githubs-products' + '/enterprise-server@3.0/github/getting-started-with-github/githubs-products', ) expect(res.statusCode).toBe(302) expect(res.headers['set-cookie']).toBeUndefined() @@ -126,14 +126,14 @@ describe('recently deprecated redirects', () => { // This is based on // https://github.com/github/help-docs-archived-enterprise-versions/blob/master/3.0/redirects.json expect(res.headers.location).toBe( - '/en/enterprise-server@3.0/get-started/learning-about-github/githubs-products' + '/en/enterprise-server@3.0/get-started/learning-about-github/githubs-products', ) }) test('follow redirects enterprise-server 3.0 with actual redirect without language', async () => { const res = await get( '/enterprise-server@3.0/github/getting-started-with-github/githubs-products', - { followAllRedirects: true } + { followAllRedirects: true }, ) expect(res.statusCode).toBe(200) }) @@ -272,7 +272,7 @@ describe('JS and CSS assets', () => { headers: { Referrer: '/en/enterprise/2.17', }, - } + }, ) expect(result.statusCode).toBe(200) expect(result.headers['x-is-archived']).toBe('true') diff --git a/tests/routing/developer-site-redirects.js b/tests/routing/developer-site-redirects.js index efbc7f33ce5f..a5be49264f38 100644 --- a/tests/routing/developer-site-redirects.js +++ b/tests/routing/developer-site-redirects.js @@ -45,7 +45,7 @@ describe('developer redirects', () => { const expectedFinalPath = path.join( '/', `enterprise-server@${enterpriseServerReleases.latest}`, - newPath + newPath, ) expect(finalPath).toBe(`/en${expectedFinalPath}`) }) @@ -114,12 +114,12 @@ describe('developer redirects', () => { // We make an exception to always redirect versionless paths to the latest version. newPath = newPath.replace( '/enterprise-server/', - `/enterprise-server@${enterpriseServerReleases.latest}/` + `/enterprise-server@${enterpriseServerReleases.latest}/`, ) const res = await get(oldPath) const sameFirstPrefix = oldPath.split('/')[1] === newPath.split('/')[1] expect(res.statusCode, `${oldPath} did not redirect to ${newPath}`).toBe( - sameFirstPrefix ? 301 : 302 + sameFirstPrefix ? 301 : 302, ) expect(res.headers.location).toBe(newPath) } diff --git a/tests/routing/redirect-exceptions.js b/tests/routing/redirect-exceptions.js index 0c83c1864095..977b502dfed0 100644 --- a/tests/routing/redirect-exceptions.js +++ b/tests/routing/redirect-exceptions.js @@ -19,7 +19,7 @@ describe('redirect exceptions', () => { const newPath = redirectExceptions[oldPath] const englishNewPath = `/en${newPath.replace( '/enterprise-server@latest', - `/enterprise-server@${latest}` + `/enterprise-server@${latest}`, )}` const { statusCode, headers } = await get(oldPath, { followRedirects: false }) expect(statusCode).toBe(302) diff --git a/tests/routing/redirects.js b/tests/routing/redirects.js index 307defaeba8e..97ab352ccf3c 100644 --- a/tests/routing/redirects.js +++ b/tests/routing/redirects.js @@ -42,10 +42,10 @@ describe('redirects', () => { expect(pageRedirects['/about-issues']).toBe('/issues') expect(pageRedirects['/creating-an-issue']).toBe('/issues') expect( - pageRedirects[`/enterprise-server@${enterpriseServerReleases.latest}/about-issues`] + pageRedirects[`/enterprise-server@${enterpriseServerReleases.latest}/about-issues`], ).toBe(`/enterprise-server@${enterpriseServerReleases.latest}/issues`) expect( - pageRedirects[`/enterprise-server@${enterpriseServerReleases.latest}/creating-an-issue`] + pageRedirects[`/enterprise-server@${enterpriseServerReleases.latest}/creating-an-issue`], ).toBe(`/enterprise-server@${enterpriseServerReleases.latest}/issues`) }) @@ -243,7 +243,7 @@ describe('redirects', () => { const res = await get(`/en/enterprise-server@${lastBeforeRestoredAdminGuides}/admin/guides`) expect(res.statusCode).toBe(301) expect(res.headers.location).toBe( - enterpriseAdmin.replace(latest, lastBeforeRestoredAdminGuides) + enterpriseAdmin.replace(latest, lastBeforeRestoredAdminGuides), ) }) @@ -261,7 +261,7 @@ describe('redirects', () => { test('admin/guides redirects to admin in deep links on <2.21', async () => { const res = await get( - `/en/enterprise-server@${lastBeforeRestoredAdminGuides}/admin/guides/installation/upgrading-github-enterprise` + `/en/enterprise-server@${lastBeforeRestoredAdminGuides}/admin/guides/installation/upgrading-github-enterprise`, ) expect(res.statusCode).toBe(301) const redirectRes = await get(res.headers.location) @@ -272,7 +272,7 @@ describe('redirects', () => { test('admin/guides still redirects to admin in deep links on >=2.21', async () => { const res = await get( - `/en/enterprise-server@${firstRestoredAdminGuides}/admin/guides/installation/upgrading-github-enterprise` + `/en/enterprise-server@${firstRestoredAdminGuides}/admin/guides/installation/upgrading-github-enterprise`, ) expect(res.statusCode).toBe(301) const redirectRes = await get(res.headers.location) @@ -309,7 +309,7 @@ describe('redirects', () => { test('no product redirects to GitHub.com product on the latest version', async () => { const res = await get( - `/en/enterprise/${enterpriseServerReleases.latest}/user/articles/fork-a-repo` + `/en/enterprise/${enterpriseServerReleases.latest}/user/articles/fork-a-repo`, ) expect(res.statusCode).toBe(301) expect(res.headers.location).toBe(userArticle) @@ -323,7 +323,7 @@ describe('redirects', () => { test('no language code redirects to english', async () => { const res = await get( - `/enterprise/${enterpriseServerReleases.latest}/user/articles/fork-a-repo` + `/enterprise/${enterpriseServerReleases.latest}/user/articles/fork-a-repo`, ) expect(res.statusCode).toBe(302) expect(res.headers.location).toBe(userArticle) @@ -342,7 +342,7 @@ describe('redirects', () => { test('redirects to expected article', async () => { const res = await get( - `/en/enterprise/${enterpriseServerReleases.latest}/user${redirectFromPath}` + `/en/enterprise/${enterpriseServerReleases.latest}/user${redirectFromPath}`, ) expect(res.statusCode).toBe(301) expect(res.headers.location).toBe(userArticle) @@ -350,7 +350,7 @@ describe('redirects', () => { test('no language code redirects to english', async () => { const res = await get( - `/enterprise/${enterpriseServerReleases.latest}/user${redirectFromPath}` + `/enterprise/${enterpriseServerReleases.latest}/user${redirectFromPath}`, ) expect(res.statusCode).toBe(302) expect(res.headers.location).toBe(userArticle) @@ -369,7 +369,7 @@ describe('redirects', () => { test('no language code redirects to english', async () => { const res = await get( - '/desktop/contributing-and-collaborating-using-github-desktop/creating-an-issue-or-pull-request' + '/desktop/contributing-and-collaborating-using-github-desktop/creating-an-issue-or-pull-request', ) expect(res.statusCode).toBe(302) expect(res.headers.location).toBe(desktopGuide) @@ -377,7 +377,7 @@ describe('redirects', () => { test('desktop/guides redirects to desktop', async () => { const res = await get( - '/en/desktop/guides/contributing-and-collaborating-using-github-desktop/creating-an-issue-or-pull-request' + '/en/desktop/guides/contributing-and-collaborating-using-github-desktop/creating-an-issue-or-pull-request', ) expect(res.statusCode).toBe(301) expect(res.headers.location).toBe(desktopGuide) diff --git a/tests/routing/release-notes.js b/tests/routing/release-notes.js index e89cc9bf6144..6e25c09c8747 100644 --- a/tests/routing/release-notes.js +++ b/tests/routing/release-notes.js @@ -17,7 +17,7 @@ describe('release notes', () => { nock('https://github.github.com') .get( - '/help-docs-archived-enterprise-versions/2.19/en/enterprise-server@2.19/admin/release-notes' + '/help-docs-archived-enterprise-versions/2.19/en/enterprise-server@2.19/admin/release-notes', ) .reply(404) nock('https://github.github.com') @@ -42,7 +42,7 @@ describe('release notes', () => { const $ = await getDOM(`/en/enterprise-server@${oldestSupportedGhes}/admin/release-notes`) expect($('h1').first().text()).toBe(`Enterprise Server ${oldestSupportedGhes} release notes`) expect( - $('h2').first().text().trim().startsWith(`Enterprise Server ${oldestSupportedGhes}`) + $('h2').first().text().trim().startsWith(`Enterprise Server ${oldestSupportedGhes}`), ).toBe(true) }) diff --git a/tests/routing/versionless-redirects.js b/tests/routing/versionless-redirects.js index 9e20625c0a20..905c62a665f7 100644 --- a/tests/routing/versionless-redirects.js +++ b/tests/routing/versionless-redirects.js @@ -24,7 +24,7 @@ describe('versioned redirects', () => { const newPath = versionlessRedirects[oldPath] const englishNewPath = `/en${newPath.replace( '/enterprise-server@latest', - `/enterprise-server@${latest}` + `/enterprise-server@${latest}`, )}` const { statusCode, headers } = await get(oldPath, { followRedirects: false }) expect(statusCode).toBe(302) diff --git a/tests/translations/frame.js b/tests/translations/frame.js index ac357673b24f..2e7ea87b4271 100644 --- a/tests/translations/frame.js +++ b/tests/translations/frame.js @@ -48,7 +48,7 @@ describe('frame', () => { const $en = await getDOM(`/en/get-started`) const $ = await getDOM(`/${lang}/get-started`) expect($(`a[href="/${lang}/get-started"]`).text()).not.toEqual( - $en(`a[href="/${lang}/get-started"]`).text() + $en(`a[href="/${lang}/get-started"]`).text(), ) }) @@ -57,7 +57,7 @@ describe('frame', () => { const $en = await getDOM(`/en`) const $ = await getDOM(`/${lang}`) expect($('[data-testid="survey-form"] h2').text()).not.toEqual( - $en('[data-testid="survey-form"] h2').text() + $en('[data-testid="survey-form"] h2').text(), ) }) }) @@ -115,6 +115,6 @@ describe('release notes', () => { const url = `/${lang}/${version}/admin/release-notes` const res = await get(url) expect(res.statusCode).toBe(200) - } + }, ) }) diff --git a/tests/unit/get-applicable-versions.js b/tests/unit/get-applicable-versions.js index be7c2d8275fd..89eb18c7a51e 100644 --- a/tests/unit/get-applicable-versions.js +++ b/tests/unit/get-applicable-versions.js @@ -74,7 +74,7 @@ describe('invalid versions', () => { expect(() => { getApplicableVersions(versions, 'foo.md') }).toThrow( - 'foo.md is not available in any currently supported version. Make sure the `versions` property includes at least one supported version.' + 'foo.md is not available in any currently supported version. Make sure the `versions` property includes at least one supported version.', ) }) }) diff --git a/tests/unit/get-data.js b/tests/unit/get-data.js index 76c3932c614d..5ecf06250ace 100644 --- a/tests/unit/get-data.js +++ b/tests/unit/get-data.js @@ -59,7 +59,7 @@ describe('get-data', () => { }, }, }, - jaTranslationsRoot + jaTranslationsRoot, ) }) @@ -251,7 +251,7 @@ describe('get-data on corrupt translations', () => { }, }, }, - jaTranslationsRoot + jaTranslationsRoot, ) const ymlFile = path.join(jaTranslationsRoot, 'data', 'variables', 'everything.yml') console.assert(fs.existsSync(ymlFile), `${ymlFile} wasn't created`) diff --git a/tests/unit/get-redirect.js b/tests/unit/get-redirect.js index 80036cecd206..0c96e35fdde3 100644 --- a/tests/unit/get-redirect.js +++ b/tests/unit/get-redirect.js @@ -67,13 +67,13 @@ describe('getRedirect basics', () => { } expect(getRedirect('/desktop/guides/foo/bar', ctx)).toBe('/en/desktop/foo/bar') expect(getRedirect('/admin/guides/foo/bar', ctx)).toBe( - `/en/enterprise-server@${latest}/admin/foo/bar` + `/en/enterprise-server@${latest}/admin/foo/bar`, ) expect(getRedirect('/admin/something/else', ctx)).toBe( - `/en/enterprise-server@${latest}/admin/something/else` + `/en/enterprise-server@${latest}/admin/something/else`, ) expect(getRedirect('/insights/stuff', ctx)).toBe( - `/en/enterprise-server@${latest}/insights/stuff` + `/en/enterprise-server@${latest}/insights/stuff`, ) }) @@ -87,13 +87,13 @@ describe('getRedirect basics', () => { } // Replacing `/user` with `` worked because there exits a page of such name. expect( - getRedirect(`/enterprise-server@${previousEnterpriserServerVersion}/user/foo/bar`, ctx) + getRedirect(`/enterprise-server@${previousEnterpriserServerVersion}/user/foo/bar`, ctx), ).toBe(`/en/enterprise-server@${previousEnterpriserServerVersion}/foo/bar`) expect( getRedirect( `/enterprise-server@${previousEnterpriserServerVersion}/admin/guides/user-management`, - ctx - ) + ctx, + ), ).toBe(`/en/enterprise-server@${previousEnterpriserServerVersion}/admin/github-management`) }) @@ -106,19 +106,19 @@ describe('getRedirect basics', () => { } expect(getRedirect('/enterprise', ctx)).toBe(`/en/enterprise-server@${latest}`) expect(getRedirect(`/enterprise/${previousEnterpriserServerVersion}`, ctx)).toBe( - `/en/enterprise-server@${previousEnterpriserServerVersion}` + `/en/enterprise-server@${previousEnterpriserServerVersion}`, ) expect(getRedirect(`/enterprise/${previousEnterpriserServerVersion}/something`, ctx)).toBe( - `/en/enterprise-server@${previousEnterpriserServerVersion}/something` + `/en/enterprise-server@${previousEnterpriserServerVersion}/something`, ) // but also respect redirects if there are some expect(getRedirect(`/enterprise/${previousEnterpriserServerVersion}/foo`, ctx)).toBe( - `/en/enterprise-server@${previousEnterpriserServerVersion}/bar` + `/en/enterprise-server@${previousEnterpriserServerVersion}/bar`, ) // Unique snowflake pattern expect(getRedirect('/enterprise/github/admin/foo', ctx)).toBe( - `/en/enterprise-server@${latest}/github/admin/foo` + `/en/enterprise-server@${latest}/github/admin/foo`, ) }) diff --git a/tests/unit/get-rss-feeds.js b/tests/unit/get-rss-feeds.js index d419aab1b888..ceb77dffafaf 100644 --- a/tests/unit/get-rss-feeds.js +++ b/tests/unit/get-rss-feeds.js @@ -11,7 +11,7 @@ describe('getChangelogItems module', () => { beforeAll(async () => { const rssFeedContent = await fs.readFile( path.join(process.cwd(), 'tests/fixtures/rss-feed.xml'), - 'utf8' + 'utf8', ) nock('https://github.blog').get('/changelog/label/packages/feed').reply(200, rssFeedContent) @@ -27,7 +27,7 @@ describe('getChangelogItems module', () => { // because it explicitly uses nock() to mock the HTTP socket. // So even if we say "Don't use the cache" here, it still won't // depend on Internet access because we're using `nock` here. - true + true, ) }) diff --git a/tests/unit/page.js b/tests/unit/page.js index 62518d7b3fdb..6f1f343f8f45 100644 --- a/tests/unit/page.js +++ b/tests/unit/page.js @@ -10,7 +10,7 @@ import nonEnterpriseDefaultVersion from '../../lib/non-enterprise-default-versio const __dirname = path.dirname(fileURLToPath(import.meta.url)) const enterpriseServerVersions = Object.keys(allVersions).filter((v) => - v.startsWith('enterprise-server@') + v.startsWith('enterprise-server@'), ) // get the `free-pro-team` segment of `free-pro-team@latest` @@ -88,7 +88,7 @@ describe('Page class', () => { let rendered = await page.render(context) let $ = cheerio.load(rendered) expect($.text()).toBe( - 'This text should render on any actively supported version of Enterprise Server' + 'This text should render on any actively supported version of Enterprise Server', ) expect($.text()).not.toBe('This text should only render on non-Enterprise') @@ -99,7 +99,7 @@ describe('Page class', () => { rendered = await page.render(context) $ = cheerio.load(rendered) expect($.text()).toBe( - 'This text should render on any actively supported version of Enterprise Server' + 'This text should render on any actively supported version of Enterprise Server', ) expect($.text()).not.toBe('This text should only render on non-Enterprise') @@ -110,7 +110,7 @@ describe('Page class', () => { rendered = await page.render(context) $ = cheerio.load(rendered) expect($.text()).not.toBe( - 'This text should render on any actively supported version of Enterprise Server' + 'This text should render on any actively supported version of Enterprise Server', ) expect($.text()).toBe('This text should only render on non-Enterprise') }) @@ -172,13 +172,13 @@ describe('Page class', () => { const pageVersions = page.permalinks.map((permalink) => permalink.pageVersion) expect( enterpriseServerReleases.supported.every((version) => - pageVersions.includes(`enterprise-server@${version}`) - ) + pageVersions.includes(`enterprise-server@${version}`), + ), ).toBe(true) expect( enterpriseServerReleases.deprecated.every( - (version) => !pageVersions.includes(`enterprise-server@${version}`) - ) + (version) => !pageVersions.includes(`enterprise-server@${version}`), + ), ).toBe(true) }) @@ -188,14 +188,14 @@ describe('Page class', () => { 'pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-branches' expect( page.permalinks.find((permalink) => permalink.pageVersion === nonEnterpriseDefaultVersion) - .href + .href, ).toBe(`/en/${expectedPath}`) expect( page.permalinks.find( (permalink) => permalink.pageVersion === - `enterprise-server@${enterpriseServerReleases.oldestSupported}` - ).href + `enterprise-server@${enterpriseServerReleases.oldestSupported}`, + ).href, ).toBe(`/en/enterprise-server@${enterpriseServerReleases.oldestSupported}/${expectedPath}`) }) @@ -207,14 +207,14 @@ describe('Page class', () => { }) expect( page.permalinks.find((permalink) => permalink.pageVersion === nonEnterpriseDefaultVersion) - .href + .href, ).toBe('/en') expect( page.permalinks.find( (permalink) => permalink.pageVersion === - `enterprise-server@${enterpriseServerReleases.oldestSupported}` - ).href + `enterprise-server@${enterpriseServerReleases.oldestSupported}`, + ).href, ).toBe(`/en/enterprise-server@${enterpriseServerReleases.oldestSupported}`) }) @@ -227,10 +227,10 @@ describe('Page class', () => { expect( page.permalinks.find( (permalink) => - permalink.pageVersion === `enterprise-server@${enterpriseServerReleases.latest}` - ).href + permalink.pageVersion === `enterprise-server@${enterpriseServerReleases.latest}`, + ).href, ).toBe( - `/en/enterprise-server@${enterpriseServerReleases.latest}/products/admin/some-category/some-article` + `/en/enterprise-server@${enterpriseServerReleases.latest}/products/admin/some-category/some-article`, ) const pageVersions = page.permalinks.map((permalink) => permalink.pageVersion) expect(pageVersions.length).toBeGreaterThan(1) @@ -245,7 +245,7 @@ describe('Page class', () => { }) expect( page.permalinks.find((permalink) => permalink.pageVersion === nonEnterpriseDefaultVersion) - .href + .href, ).toBe('/en/products/actions/some-category/some-article') expect(page.permalinks.length).toBe(1) }) diff --git a/tests/unit/pages.js b/tests/unit/pages.js index 9e0789b056cf..b802fd19ff7a 100644 --- a/tests/unit/pages.js +++ b/tests/unit/pages.js @@ -32,13 +32,13 @@ describe('pages module', () => { test('every page has a non-empty `permalinks` array', async () => { const brokenPages = pages.filter( - (page) => !Array.isArray(page.permalinks) || page.permalinks.length === 0 + (page) => !Array.isArray(page.permalinks) || page.permalinks.length === 0, ) const expectation = JSON.stringify( brokenPages.map((page) => page.fullPath), null, - 2 + 2, ) expect(brokenPages.length, expectation).toBe(0) }) @@ -94,7 +94,7 @@ describe('pages module', () => { path: page.fullPath, }, null, - 2 + 2, ) }) diff --git a/tests/unit/permalink.js b/tests/unit/permalink.js index 0fb44e8c0d00..bf9866d3119e 100644 --- a/tests/unit/permalink.js +++ b/tests/unit/permalink.js @@ -16,11 +16,11 @@ describe('Permalink class', () => { 'en', 'index.md', 'Hello World', - getApplicableVersions(versions) + getApplicableVersions(versions), ) expect(permalinks.length).toBeGreaterThan(1) const homepagePermalink = permalinks.find( - (permalink) => permalink.pageVersion === nonEnterpriseDefaultVersion + (permalink) => permalink.pageVersion === nonEnterpriseDefaultVersion, ) expect(homepagePermalink.href).toBe('/en') }) @@ -35,7 +35,7 @@ describe('Permalink class', () => { 'en', `enterprise-server@${enterpriseServerReleases.latest}`, 'index.md', - 'Hello World' + 'Hello World', ) expect(permalink.href).toBe(`/en/enterprise-server@${enterpriseServerReleases.latest}`) }) @@ -45,7 +45,7 @@ describe('Permalink class', () => { 'en', nonEnterpriseDefaultVersion, 'github/index.md', - 'Hello World' + 'Hello World', ) expect(permalink.href).toBe('/en/github') }) @@ -55,7 +55,7 @@ describe('Permalink class', () => { 'en', `enterprise-server@${enterpriseServerReleases.latest}`, 'github/index.md', - 'Hello World' + 'Hello World', ) expect(permalink.href).toBe(`/en/enterprise-server@${enterpriseServerReleases.latest}/github`) }) diff --git a/tests/unit/static-assets.js b/tests/unit/static-assets.js index 5c645269ff69..5c43d5c94614 100644 --- a/tests/unit/static-assets.js +++ b/tests/unit/static-assets.js @@ -7,7 +7,7 @@ import archivedEnterpriseVersionsAssets from '../../middleware/archived-enterpri function mockRequest(path, { headers }) { const _headers = Object.fromEntries( - Object.entries(headers || {}).map(([key, value]) => [key.toLowerCase(), value]) + Object.entries(headers || {}).map(([key, value]) => [key.toLowerCase(), value]), ) return { path, diff --git a/tests/unit/toc-links.js b/tests/unit/toc-links.js index f3a3132ff453..858c257f9c1f 100644 --- a/tests/unit/toc-links.js +++ b/tests/unit/toc-links.js @@ -10,7 +10,7 @@ describe('toc links', () => { const pageList = await loadPages() const englishIndexPages = pageList.filter( - (page) => page.languageCode === 'en' && page.relativePath.endsWith('index.md') + (page) => page.languageCode === 'en' && page.relativePath.endsWith('index.md'), ) const pages = await loadPageMap(pageList)