Skip to content

Commit 0e1dc78

Browse files
authored
Create & migrate a subject folder for Redirects (#39052)
1 parent 36c2210 commit 0e1dc78

40 files changed

+69
-63
lines changed

.github/actions-scripts/prune-for-preview-env.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@
1111
# need these legacy redirects. Only the redirects from
1212
# front-matter will be at play.
1313
# These static redirects json files are notoriously large
14-
echo '[]' > lib/redirects/static/archived-frontmatter-valid-urls.json
15-
echo '{}' > lib/redirects/static/archived-redirects-from-213-to-217.json
14+
echo '[]' > src/redirects/lib/static/archived-frontmatter-valid-urls.json
15+
echo '{}' > src/redirects/lib/static/archived-redirects-from-213-to-217.json

.github/actions-scripts/rendered-content-link-checker.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { JSONFile } from 'lowdb/node'
1212
import shortVersions from '../../middleware/contextualizers/short-versions.js'
1313
import contextualize from '../../middleware/context.js'
1414
import features from '../../middleware/contextualizers/features.js'
15-
import getRedirect from '../../lib/get-redirect.js'
15+
import getRedirect from '../../src/redirects/lib/get-redirect.js'
1616
import warmServer from '../../lib/warm-server.js'
1717
import { liquid } from '../../src/content-render/index.js'
1818
import { deprecated } from '../../lib/enterprise-server-releases.js'

.github/workflows/test.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ jobs:
5353
{ name: 'linting', path: 'src/content-linter/tests', },
5454
{ name: 'observability', path: 'src/observability/tests' },
5555
{ name: 'pageinfo', path: 'src/pageinfo/tests', },
56+
{ name: 'redirects', path: 'src/redirects/tests', },
5657
{ name: 'rendering', path: 'tests/rendering', },
5758
{ name: 'rendering-fixtures', path: 'tests/rendering-fixtures', },
5859
{ name: 'rest', path: 'src/rest/tests', },

content/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -382,7 +382,7 @@ Sometimes you want to link to a Dotcom-only article in Enterprise content and yo
382382
"[GitHub's Terms of Service](/free-pro-team@latest/github/site-policy/github-terms-of-service)"
383383
```
384384

385-
Sometimes the canonical home of content moves outside the docs site. None of the links included in [`lib/redirects/external-sites.json`](/lib/redirects/external-sites.json) get rewritten. See [`contributing/redirects.md`](/contributing/redirects.md) for more info about this type of redirect.
385+
Sometimes the canonical home of content moves outside the docs site. None of the links included in [`src/redirects/lib/external-sites.json`](/src/redirects/lib/external-sites.json) get rewritten. See [`contributing/redirects.md`](/contributing/redirects.md) for more info about this type of redirect.
386386

387387
### Legacy filepaths and redirects for links
388388

contributing/redirects.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ Sometimes we change the name of an article but want its old URL to redirect to i
1212

1313
### Automatic redirects for URLs that do not include a version
1414

15-
If a URL for a docs page is entered without a version segment (e.g., `https://docs.github.com/foo` instead of `https://docs.github.com/<version>/foo`), the site will automatically redirect it to the **first available version** of the page. The order of precedence is specified in `lib/all-versions.js`, where the current order is:
15+
If a URL for a docs page is entered without a version segment (e.g., `https://docs.github.com/foo` instead of `https://docs.github.com/<version>/foo`), the site will automatically redirect it to the **first available version** of the page. The order of precedence is specified in `lib/all-versions.js`, where the current order is:
1616

1717
1. Free, Pro, & Team (`fpt`)
1818
1. Enterprise Cloud (`ghec`)
@@ -25,11 +25,11 @@ If `foo.md` is available in Free, Pro, & Team, no redirect will occur because `f
2525

2626
### Redirects across versions
2727

28-
If you want the URL for one version of an article to redirect to a URL for another version, you must use [/lib/redirects/static/redirect-exceptions.txt](/lib/redirects/static/redirect-exceptions.txt) instead. For example, if you remove the Free, Pro, & Team (`fpt`) version of an article, the URL will [automatically redirect](#automatic-redirects-for-urls-that-do-not-include-a-version) to the next available version of the page. If you want it to redirect to a version that is **lower in the order of precedence**, or to a different page entirely, you must specify an exception.
28+
If you want the URL for one version of an article to redirect to a URL for another version, you must use [/src/redirects/lib/static/redirect-exceptions.txt](/src/redirects/lib/static/redirect-exceptions.txt) instead. For example, if you remove the Free, Pro, & Team (`fpt`) version of an article, the URL will [automatically redirect](#automatic-redirects-for-urls-that-do-not-include-a-version) to the next available version of the page. If you want it to redirect to a version that is **lower in the order of precedence**, or to a different page entirely, you must specify an exception.
2929

3030
Another example: we removed the `ghes` version of "[Exporting member information for your organization](https://docs.github.com/en/organizations/managing-membership-in-your-organization/exporting-member-information-for-your-organization)," but we don't want URLs that include the `enterprise-server@<release>` version segment to 404. In order to redirect `ghes` URLs to another version (such as `ghec`), we need to add an exception.
3131

32-
Each entry in [the exceptions file](/lib/redirects/static/redirect-exceptions.txt) should start with the path you want to redirect _to_, including the version, followed by an unordered list of the paths you want to redirect _from_:
32+
Each entry in [the exceptions file](/src/redirects/lib/static/redirect-exceptions.txt) should start with the path you want to redirect _to_, including the version, followed by an unordered list of the paths you want to redirect _from_:
3333

3434
```
3535
/enterprise-cloud@latest/organizations/managing-membership-in-your-organization/exporting-member-information-for-your-organization
@@ -40,11 +40,11 @@ Each entry in [the exceptions file](/lib/redirects/static/redirect-exceptions.tx
4040

4141
## External redirects
4242

43-
Sometimes the canonical home of some content moves outside the help site. For these types of redirects, we add entries to [/lib/redirects/external-sites.json](/lib/redirects/external-sites.json).
43+
Sometimes the canonical home of some content moves outside the help site. For these types of redirects, we add entries to [/src/redirects/lib/external-sites.json](/src/redirects/lib/external-sites.json).
4444

4545
## Custom redirects
4646

47-
We also have custom routing code that automatically creates redirects under the hood for things like moved Admin guide pages. This code lives in [/lib/redirects/get-old-paths-from-permalink.js](/lib/redirects/get-old-paths-from-permalink.js). All redirects for the site are compiled when the server starts by [/lib/redirects/precompile.js](/lib/redirects/precompile.js).
47+
We also have custom routing code that automatically creates redirects under the hood for things like moved Admin guide pages. This code lives in [/src/redirects/lib/get-old-paths-from-permalink.js](/src/redirects/lib/get-old-paths-from-permalink.js). All redirects for the site are compiled when the server starts by [/src/redirects/lib/precompile.js](/src/redirects/lib/precompile.js).
4848

4949
See [Links and image paths](../content/README.md#links-and-image-paths) for info on how links and images are rewritten on the fly at page render time.
5050

lib/find-page.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { getLanguageCode } from './patterns.js'
2-
import getRedirect from './get-redirect.js'
2+
import getRedirect from '#src/redirects/lib/get-redirect.js'
33

44
export default function findPage(href, pages, redirects) {
55
if (Array.isArray(pages)) throw new Error("'pages' is not supposed to be an array")

lib/page.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import path from 'path'
33
import cheerio from 'cheerio'
44
import patterns from './patterns.js'
55
import getApplicableVersions from './get-applicable-versions.js'
6-
import generateRedirectsForPermalinks from './redirects/permalinks.js'
6+
import generateRedirectsForPermalinks from '#src/redirects/lib/permalinks.js'
77
import getEnglishHeadings from './get-english-headings.js'
88
import getTocItems from './get-toc-items.js'
99
import pathUtils from './path-utils.js'

lib/update-internal-links.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,10 @@ import {
1313
getPathWithoutVersion,
1414
getVersionStringFromPath,
1515
} from './path-utils.js'
16-
import loadRedirects from './redirects/precompile.js'
16+
import loadRedirects from '#src/redirects/lib/precompile.js'
1717
import patterns from './patterns.js'
1818
import { loadUnversionedTree, loadPages, loadPageMap } from './page-data.js'
19-
import getRedirect, { splitPathByLanguage } from './get-redirect.js'
19+
import getRedirect, { splitPathByLanguage } from '#src/redirects/lib/get-redirect.js'
2020
import nonEnterpriseDefaultVersion from './non-enterprise-default-version.js'
2121
import { deprecated } from './enterprise-server-releases.js'
2222

lib/warm-server.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import statsd from '#src/observability/lib/statsd.js'
22
import { loadUnversionedTree, loadSiteTree, loadPages, loadPageMap } from './page-data.js'
3-
import loadRedirects from './redirects/precompile.js'
3+
import loadRedirects from '#src/redirects/lib/precompile.js'
44

55
// Instrument these functions so that
66
// it's wrapped in a timer that reports to Datadog

middleware/archived-enterprise-versions.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import got from 'got'
1515
import { readCompressedJsonFileFallbackLazily } from '../lib/read-json-file.js'
1616
import { archivedCacheControl, languageCacheControl } from './cache-control.js'
1717
import { pathLanguagePrefixed, languagePrefixPathRegex } from '../lib/languages.js'
18-
import getRedirect, { splitPathByLanguage } from '../lib/get-redirect.js'
18+
import getRedirect, { splitPathByLanguage } from '../src/redirects/lib/get-redirect.js'
1919
import getRemoteJSON from './get-remote-json.js'
2020

2121
const REMOTE_ENTERPRISE_STORAGE_URL = 'https://githubdocs.azureedge.net/enterprise'
@@ -34,10 +34,10 @@ function splitByLanguage(uri) {
3434
// `readJsonFileLazily()` function will, at import-time, check that
3535
// the path does exist.
3636
const archivedRedirects = readCompressedJsonFileFallbackLazily(
37-
'./lib/redirects/static/archived-redirects-from-213-to-217.json',
37+
'./src/redirects/lib/static/archived-redirects-from-213-to-217.json',
3838
)
3939
const archivedFrontmatterValidURLS = readCompressedJsonFileFallbackLazily(
40-
'./lib/redirects/static/archived-frontmatter-valid-urls.json',
40+
'./src/redirects/lib/static/archived-frontmatter-valid-urls.json',
4141
)
4242

4343
// Combine all the things you need to make sure the response is

middleware/index.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ import detectLanguage from './detect-language.js'
2121
import reloadTree from './reload-tree.js'
2222
import context from './context.js'
2323
import shortVersions from './contextualizers/short-versions.js'
24-
import languageCodeRedirects from './redirects/language-code-redirects.js'
25-
import handleRedirects from './redirects/handle-redirects.js'
24+
import languageCodeRedirects from '#src/redirects/middleware/language-code-redirects.js'
25+
import handleRedirects from '#src/redirects/middleware/handle-redirects.js'
2626
import findPage from './find-page.js'
2727
import blockRobots from './block-robots.js'
2828
import archivedEnterpriseVersionsAssets from './archived-enterprise-versions-assets.js'

middleware/reload-tree.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ import languages, { languageKeys } from '../lib/languages.js'
2020
import createTree from '../lib/create-tree.js'
2121
import warmServer from '../lib/warm-server.js'
2222
import { loadSiteTree, loadPages, loadPageMap } from '../lib/page-data.js'
23-
import loadRedirects from '../lib/redirects/precompile.js'
23+
import loadRedirects from '#src/redirects/lib/precompile.js'
2424

2525
const languagePrefixRegex = new RegExp(`^/(${languageKeys.join('|')})(/|$)`)
2626
const englishPrefixRegex = /^\/en(\/|$)/

script/content-migrations/update-developer-site-links.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import walk from 'walk-sync'
55
import frontmatter from '../../lib/read-frontmatter.js'
66
import { loadPages, loadPageMap } from '../../lib/page-data.js'
77
import patterns from '../../lib/patterns.js'
8-
import loadRedirects from '../../lib/redirects/precompile.js'
8+
import loadRedirects from '../../src/redirects/lib/precompile.js'
99
import { allVersionKeys } from '../../lib/all-versions.js'
1010

1111
// get all content and data files

script/i18n/create-translation-health-report.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ console.warn = console.error = (...args) => {
6161
// Weird import syntax, but forces it to load after process.env... changes
6262
const { languageKeys } = await import('../../lib/languages.js')
6363
const { loadPages, loadPageMap } = await import('../../lib/page-data.js')
64-
const { precompileRedirects } = await import('../../lib/redirects/precompile.js')
64+
const { precompileRedirects } = await import('../../src/redirects/lib/precompile.js')
6565
const { allVersions, allVersionKeys } = await import('../../lib/all-versions.js')
6666
const { getProductStringFromPath } = await import('../../lib/path-utils.js')
6767

script/move-category-to-product.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ import { mkdirp } from 'mkdirp'
1212
import { program } from 'commander'
1313
import { execSync } from 'child_process'
1414
import frontmatter from '../lib/read-frontmatter.js'
15-
import addRedirectToFrontmatter from './helpers/add-redirect-to-frontmatter.js'
15+
import addRedirectToFrontmatter from '../src/redirects/scripts/helpers/add-redirect-to-frontmatter.js'
1616
import walkFiles from './helpers/walk-files.js'
1717

1818
const contentFiles = walkFiles('content', '.md')

script/reconcile-filenames-with-ids.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import GithubSlugger from 'github-slugger'
1616
import { decode } from 'html-entities'
1717
import frontmatter from '../lib/read-frontmatter.js'
1818
import { execSync } from 'child_process'
19-
import addRedirectToFrontmatter from './helpers/add-redirect-to-frontmatter.js'
19+
import addRedirectToFrontmatter from '../src/redirects/scripts/helpers/add-redirect-to-frontmatter.js'
2020

2121
const slugger = new GithubSlugger()
2222

src/content-render/unified/rewrite-local-links.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import findPage from '../../../lib/find-page.js'
1414
const isProd = process.env.NODE_ENV === 'production'
1515

1616
const supportedPlans = new Set(Object.values(allVersions).map((v) => v.plan))
17-
const externalRedirects = readJsonFile('./lib/redirects/external-sites.json')
17+
const externalRedirects = readJsonFile('./src/redirects/lib/external-sites.json')
1818

1919
// Meaning it can be 'AUTOTITLE ' or ' AUTOTITLE' or 'AUTOTITLE'
2020
const AUTOTITLE = /^\s*AUTOTITLE\s*$/

src/early-access/scripts/migrate-early-access-product.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import { program } from 'commander'
1414
import { execFileSync } from 'child_process'
1515
import frontmatter from '../../../lib/read-frontmatter.js'
1616
import patterns from '../../../lib/patterns.js'
17-
import addRedirectToFrontmatter from '../../../script/helpers/add-redirect-to-frontmatter.js'
17+
import addRedirectToFrontmatter from '#src/redirects/scripts/helpers/add-redirect-to-frontmatter.js'
1818
import walkFiles from '../../../script/helpers/walk-files.js'
1919

2020
const contentFiles = walkFiles('content', '.md', { includeEarlyAccess: true })

src/ghes-releases/scripts/archive-version.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ import http from 'http'
1717

1818
import createApp from '../../../lib/app.js'
1919
import EnterpriseServerReleases from '../../../lib/enterprise-server-releases.js'
20-
import loadRedirects from '../../../lib/redirects/precompile.js'
20+
import loadRedirects from '#src/redirects/lib/precompile.js'
2121
import { loadPageMap } from '../../../lib/page-data.js'
2222
import { languageKeys } from '../../../lib/languages.js'
2323

src/pageinfo/middleware.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import {
1111
import shortVersions from '../../middleware/contextualizers/short-versions.js'
1212
import contextualize from '../../middleware/context.js'
1313
import features from '../../middleware/contextualizers/features.js'
14-
import getRedirect from '../../lib/get-redirect.js'
14+
import getRedirect from '#src/redirects/lib/get-redirect.js'
1515
import { isArchivedVersionByPath } from '../../lib/is-archived-version.js'
1616

1717
const router = express.Router()
File renamed without changes.

lib/get-redirect.js renamed to src/redirects/lib/get-redirect.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
import { languageKeys } from './languages.js'
2-
import nonEnterpriseDefaultVersion from './non-enterprise-default-version.js'
3-
import { allVersions } from './all-versions.js'
1+
import { languageKeys } from '../../../lib/languages.js'
2+
import nonEnterpriseDefaultVersion from '../../../lib/non-enterprise-default-version.js'
3+
import { allVersions } from '../../../lib/all-versions.js'
44
import {
55
latest,
66
supported,
77
deprecatedWithFunctionalRedirects,
8-
} from './enterprise-server-releases.js'
9-
import { getPathWithLanguage } from './path-utils.js'
8+
} from '../../../lib/enterprise-server-releases.js'
9+
import { getPathWithLanguage } from '../../../lib/path-utils.js'
1010

1111
const languagePrefixRegex = new RegExp(`^/(${languageKeys.join('|')})/`)
1212
const nonEnterpriseDefaultVersionPrefix = `/${nonEnterpriseDefaultVersion}`

lib/redirects/permalinks.js renamed to src/redirects/lib/permalinks.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import nonEnterpriseDefaultVersion from '../non-enterprise-default-version.js'
2-
import { getPathWithoutVersion } from '../path-utils.js'
1+
import nonEnterpriseDefaultVersion from '../../../lib/non-enterprise-default-version.js'
2+
import { getPathWithoutVersion } from '../../../lib/path-utils.js'
33

44
export default function permalinkRedirects(permalinks, redirectFrom) {
55
const redirects = {}

lib/redirects/precompile.js renamed to src/redirects/lib/precompile.js

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,17 @@
1-
import { readCompressedJsonFileFallback } from '../read-json-file.js'
1+
import { readCompressedJsonFileFallback } from '../../../lib/read-json-file.js'
22
import getExceptionRedirects from './exception-redirects.js'
3-
import { latest } from '../enterprise-server-releases.js'
3+
import { latest } from '../../../lib/enterprise-server-releases.js'
44

5-
const EXCEPTIONS_FILE = './lib/redirects/static/redirect-exceptions.txt'
5+
const EXCEPTIONS_FILE = './src/redirects/lib/static/redirect-exceptions.txt'
66

77
// This function runs at server warmup and precompiles possible redirect routes.
88
// It outputs them in key-value pairs within a neat Javascript object: { oldPath: newPath }
99
export async function precompileRedirects(pageList) {
10-
const allRedirects = readCompressedJsonFileFallback('./lib/redirects/static/developer.json')
10+
const allRedirects = readCompressedJsonFileFallback('./src/redirects/lib/static/developer.json')
1111

12-
const externalRedirects = readCompressedJsonFileFallback('./lib/redirects/external-sites.json')
12+
const externalRedirects = readCompressedJsonFileFallback(
13+
'./src/redirects/lib/external-sites.json',
14+
)
1315
Object.assign(allRedirects, externalRedirects)
1416

1517
// CURRENT PAGES PERMALINKS AND FRONTMATTER

middleware/redirects/handle-redirects.js renamed to src/redirects/middleware/handle-redirects.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import patterns from '../../lib/patterns.js'
1+
import patterns from '../../../lib/patterns.js'
22
import { URL } from 'url'
3-
import { pathLanguagePrefixed } from '../../lib/languages.js'
4-
import { deprecatedWithFunctionalRedirects } from '../../lib/enterprise-server-releases.js'
5-
import getRedirect from '../../lib/get-redirect.js'
6-
import { defaultCacheControl, languageCacheControl } from '../cache-control.js'
3+
import { pathLanguagePrefixed } from '../../../lib/languages.js'
4+
import { deprecatedWithFunctionalRedirects } from '../../../lib/enterprise-server-releases.js'
5+
import getRedirect from '../lib/get-redirect.js'
6+
import { defaultCacheControl, languageCacheControl } from '../../../middleware/cache-control.js'
77

88
export default function handleRedirects(req, res, next) {
99
// never redirect assets

middleware/redirects/language-code-redirects.js renamed to src/redirects/middleware/language-code-redirects.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import languages from '../../lib/languages.js'
2-
import { defaultCacheControl } from '../cache-control.js'
1+
import languages from '../../../lib/languages.js'
2+
import { defaultCacheControl } from '../../../middleware/cache-control.js'
33

44
const redirectPatterns = Object.values(languages)
55
.map((language) => language.redirectPatterns || [])

tests/content/redirect-orphans.js renamed to src/redirects/tests/content/redirect-orphans.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@ import path from 'path'
22

33
import { jest } from '@jest/globals'
44

5-
import { loadPages } from '../../lib/page-data.js'
6-
import Permalink from '../../lib/permalink.js'
5+
import { loadPages } from '../../../../lib/page-data.js'
6+
import Permalink from '../../../../lib/permalink.js'
77

88
describe('redirect orphans', () => {
99
// Because calling `loadPages` will trigger a warmup, this can potentially

tests/routing/developer-site-redirects.js renamed to src/redirects/tests/routing/developer-site-redirects.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import { jest } from '@jest/globals'
22
import path from 'path'
3-
import enterpriseServerReleases from '../../lib/enterprise-server-releases.js'
4-
import { get } from '../helpers/e2etest.js'
5-
import readJsonFile from '../../lib/read-json-file.js'
3+
import enterpriseServerReleases from '../../../../lib/enterprise-server-releases.js'
4+
import { get } from '../../../../tests/helpers/e2etest.js'
5+
import readJsonFile from '../../../../lib/read-json-file.js'
66

77
jest.useFakeTimers({ legacyFakeTimers: true })
88

0 commit comments

Comments
 (0)