Skip to content

Commit 8872a88

Browse files
authored
Convert additional data-directory files to TypeScript (#56396)
1 parent e5e13f8 commit 8872a88

File tree

9 files changed

+53
-30
lines changed

9 files changed

+53
-30
lines changed

src/content-linter/lib/helpers/get-lintable-yml.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import yaml from 'js-yaml'
22
import fs from 'fs/promises'
33

4-
import dataSchemas from '#src/data-directory/lib/data-schemas/index.js'
4+
import dataSchemas from '#src/data-directory/lib/data-schemas/index.ts'
55
import ajv from '#src/tests/lib/validate-json-schema.js'
66

77
// AJV already has a built-in way to extract out properties

src/data-directory/lib/data-directory.d.ts

Lines changed: 0 additions & 4 deletions
This file was deleted.

src/data-directory/lib/data-directory.js renamed to src/data-directory/lib/data-directory.ts

Lines changed: 38 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -4,45 +4,65 @@ import path from 'path'
44
import walk from 'walk-sync'
55
import yaml from 'js-yaml'
66
import { isRegExp, setWith } from 'lodash-es'
7-
import filenameToKey from './filename-to-key.js'
7+
import filenameToKey from './filename-to-key'
88
import matter from 'gray-matter'
99

10-
export default function dataDirectory(dir, opts = {}) {
11-
const defaultOpts = {
12-
preprocess: (content) => {
10+
interface DataDirectoryOptions {
11+
preprocess?: (content: string) => string
12+
ignorePatterns?: RegExp[]
13+
extensions?: string[]
14+
}
15+
16+
interface DataDirectoryResult {
17+
[key: string]: any
18+
}
19+
20+
export default function dataDirectory(
21+
dir: string,
22+
opts: DataDirectoryOptions = {},
23+
): DataDirectoryResult {
24+
const defaultOpts: Required<DataDirectoryOptions> = {
25+
preprocess: (content: string) => {
1326
return content
1427
},
1528
ignorePatterns: [/README\.md$/i],
1629
extensions: ['.json', '.md', '.markdown', '.yml'],
1730
}
1831

19-
opts = Object.assign({}, defaultOpts, opts)
32+
const mergedOpts = Object.assign({}, defaultOpts, opts)
2033

2134
// validate input
22-
assert(Array.isArray(opts.ignorePatterns))
23-
assert(opts.ignorePatterns.every(isRegExp))
24-
assert(Array.isArray(opts.extensions))
25-
assert(opts.extensions.length)
35+
assert(Array.isArray(mergedOpts.ignorePatterns))
36+
assert(mergedOpts.ignorePatterns.every(isRegExp))
37+
assert(Array.isArray(mergedOpts.extensions))
38+
assert(mergedOpts.extensions.length)
2639

2740
// start with an empty data object
28-
const data = {}
41+
const data: DataDirectoryResult = {}
2942

3043
// find YAML and Markdown files in the given directory, recursively
31-
const filenames = walk(dir, { includeBasePath: true }).filter((filename) => {
44+
const filenames = walk(dir, { includeBasePath: true }).filter((filename: string) => {
3245
// ignore files that match any of ignorePatterns regexes
33-
if (opts.ignorePatterns.some((pattern) => pattern.test(filename))) return false
46+
if (mergedOpts.ignorePatterns.some((pattern) => pattern.test(filename))) return false
3447

3548
// ignore files that don't have a whitelisted file extension
36-
return opts.extensions.includes(path.extname(filename).toLowerCase())
49+
return mergedOpts.extensions.includes(path.extname(filename).toLowerCase())
3750
})
3851

39-
const files = filenames.map((filename) => [filename, fs.readFileSync(filename, 'utf8')])
52+
const files: [string, string][] = filenames.map((filename: string) => [
53+
filename,
54+
fs.readFileSync(filename, 'utf8'),
55+
])
56+
4057
files.forEach(([filename, fileContent]) => {
4158
// derive `foo.bar.baz` object key from `foo/bar/baz.yml` filename
4259
const key = filenameToKey(path.relative(dir, filename))
4360
const extension = path.extname(filename).toLowerCase()
4461

45-
if (opts.preprocess) fileContent = opts.preprocess(fileContent)
62+
let processedContent = fileContent
63+
if (mergedOpts.preprocess) {
64+
processedContent = mergedOpts.preprocess(fileContent)
65+
}
4666

4767
// Add this file's data to the global data object.
4868
// Note we want to use `setWith` instead of `set` so we can customize the type during path creation.
@@ -51,17 +71,17 @@ export default function dataDirectory(dir, opts = {}) {
5171
// See https://lodash.com/docs#set for an explanation.
5272
switch (extension) {
5373
case '.json':
54-
setWith(data, key, JSON.parse(fileContent), Object)
74+
setWith(data, key, JSON.parse(processedContent), Object)
5575
break
5676
case '.yml':
57-
setWith(data, key, yaml.load(fileContent, { filename }), Object)
77+
setWith(data, key, yaml.load(processedContent, { filename }), Object)
5878
break
5979
case '.md':
6080
case '.markdown':
6181
// Use `matter` to drop frontmatter, since localized reusable Markdown files
6282
// can potentially have frontmatter, but we want to prevent the frontmatter
6383
// from being rendered.
64-
setWith(data, key, matter(fileContent).content, Object)
84+
setWith(data, key, matter(processedContent).content, Object)
6585
break
6686
}
6787
})
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1-
export default {
1+
interface DataSchemas {
2+
[key: string]: string
3+
}
4+
5+
const dataSchemas: DataSchemas = {
26
'data/features': '#src/data-directory/lib/data-schemas/features.js',
37
'data/variables': '#src/data-directory/lib/data-schemas/variables.js',
48
'data/learning-tracks': '#src/data-directory/lib/data-schemas/learning-tracks.js',
@@ -7,3 +11,5 @@ export default {
711
'data/glossaries/candidates.yml': '#src/data-directory/lib/data-schemas/glossaries-candidates.js',
812
'data/glossaries/external.yml': '#src/data-directory/lib/data-schemas/glossaries-external.js',
913
}
14+
15+
export default dataSchemas

src/data-directory/lib/filename-to-key.js renamed to src/data-directory/lib/filename-to-key.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import path from 'path'
22
import { escapeRegExp } from 'lodash-es'
3+
34
/* eslint-disable prefer-regex-literals */
45

56
// slash at the beginning of a filename
@@ -14,8 +15,8 @@ const windowsPathSeparator = new RegExp('/', 'g')
1415
const windowsDoubleSlashSeparator = new RegExp('\\\\', 'g')
1516

1617
// derive `foo.bar.baz` object key from `foo/bar/baz.yml` filename
17-
export default function filenameToKey(filename) {
18-
const extension = new RegExp(`${path.extname(filename)}$`)
18+
export default function filenameToKey(filename: string): string {
19+
const extension = new RegExp(`${escapeRegExp(path.extname(filename))}$`)
1920
const key = filename
2021
.replace(extension, '')
2122
.replace(leadingPathSeparator, '')

src/data-directory/tests/data-schemas.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { beforeAll, describe, expect, test } from 'vitest'
77

88
import { getJsonValidator, validateJson } from '#src/tests/lib/validate-json-schema.js'
99
import { formatAjvErrors } from '#src/tests/helpers/schemas.js'
10-
import dataSchemas from '#src/data-directory/lib/data-schemas/index.js'
10+
import dataSchemas from '#src/data-directory/lib/data-schemas/index.ts'
1111

1212
const schemaPaths = Object.keys(dataSchemas)
1313
const singleFilesSchemas = schemaPaths.filter((schemaPath) => extname(schemaPath))

src/data-directory/tests/filename-to-key.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { describe, expect, test } from 'vitest'
22

3-
import filenameToKey from '#src/data-directory/lib/filename-to-key.js'
3+
import filenameToKey from '#src/data-directory/lib/filename-to-key.ts'
44

55
describe('filename-to-key', () => {
66
test('converts filenames to object keys', () => {

src/data-directory/tests/index.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import path from 'path'
33

44
import { describe, expect, test } from 'vitest'
55

6-
import dataDirectory from '#src/data-directory/lib/data-directory.js'
6+
import dataDirectory from '#src/data-directory/lib/data-directory.ts'
77

88
const __dirname = path.dirname(fileURLToPath(import.meta.url))
99
const fixturesDir = path.join(__dirname, 'fixtures')

src/ghes-releases/scripts/version-utils.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import semver from 'semver'
22

33
import { supported } from '@/versions/lib/enterprise-server-releases.js'
4-
import getDataDirectory from '@/data-directory/lib/data-directory.js'
4+
import getDataDirectory from '@/data-directory/lib/data-directory'
55
import { FeatureData, FrontmatterVersions } from '@/types.js'
66

77
// Return true if lowestSupportedVersion > semVerRange

0 commit comments

Comments
 (0)