diff --git a/src/content-linter/lib/default-markdownlint-options.js b/src/content-linter/lib/default-markdownlint-options.js deleted file mode 100644 index ccdda0329a..0000000000 --- a/src/content-linter/lib/default-markdownlint-options.js +++ /dev/null @@ -1,3 +0,0 @@ -export const defaultConfig = { - default: false, -} diff --git a/src/content-linter/lib/default-markdownlint-options.ts b/src/content-linter/lib/default-markdownlint-options.ts new file mode 100644 index 0000000000..d21f286179 --- /dev/null +++ b/src/content-linter/lib/default-markdownlint-options.ts @@ -0,0 +1,5 @@ +import type { Configuration } from 'markdownlint' + +export const defaultConfig: Configuration = { + default: false, +} diff --git a/src/content-linter/lib/helpers/get-rules.d.ts b/src/content-linter/lib/helpers/get-rules.d.ts deleted file mode 100644 index 694e3ec214..0000000000 --- a/src/content-linter/lib/helpers/get-rules.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -// get-rules.d.ts -// This is a declaration file for get-rules.js - -import type { Rule, RuleConfig } from '../../types' - -export const customRules: Rule[] -export const allRules: Rule[] -export const allConfig: RuleConfig diff --git a/src/content-linter/lib/helpers/get-rules.js b/src/content-linter/lib/helpers/get-rules.js deleted file mode 100644 index efa98024f5..0000000000 --- a/src/content-linter/lib/helpers/get-rules.js +++ /dev/null @@ -1,8 +0,0 @@ -import rules from '../../../../node_modules/markdownlint/lib/rules' -import { gitHubDocsMarkdownlint } from '../linting-rules/index' -import { baseConfig } from '../../style/base' -import { customConfig } from '../../style/github-docs' - -export const customRules = gitHubDocsMarkdownlint.rules -export const allRules = [...rules, ...gitHubDocsMarkdownlint.rules] -export const allConfig = { ...baseConfig, ...customConfig } diff --git a/src/content-linter/lib/helpers/get-rules.ts b/src/content-linter/lib/helpers/get-rules.ts new file mode 100644 index 0000000000..eaeaf8660a --- /dev/null +++ b/src/content-linter/lib/helpers/get-rules.ts @@ -0,0 +1,12 @@ +import { gitHubDocsMarkdownlint } from '@/content-linter/lib/linting-rules/index' +import { baseConfig } from '@/content-linter/style/base' +import { customConfig } from '@/content-linter/style/github-docs' +import type { Rule } from '@/content-linter/types' + +// Import markdownlint rules - external library without TypeScript declarations +// @ts-ignore - markdownlint doesn't provide TypeScript declarations +import markdownlintRules from '../../../../node_modules/markdownlint/lib/rules' + +export const customRules: Rule[] = gitHubDocsMarkdownlint.rules +export const allRules: any[] = [...markdownlintRules, ...gitHubDocsMarkdownlint.rules] +export const allConfig: Record = { ...baseConfig, ...customConfig } diff --git a/src/content-linter/lib/helpers/unified-formatter-options.js b/src/content-linter/lib/helpers/unified-formatter-options.js deleted file mode 100644 index d5efae1751..0000000000 --- a/src/content-linter/lib/helpers/unified-formatter-options.js +++ /dev/null @@ -1,9 +0,0 @@ -export const MARKDOWN_OPTIONS = { - bullet: '*', - emphasis: '_', - closeAtx: false, - fence: '`', - fences: true, - incrementListMarker: false, - strong: '*', -} diff --git a/src/content-linter/lib/helpers/unified-formatter-options.ts b/src/content-linter/lib/helpers/unified-formatter-options.ts new file mode 100644 index 0000000000..a4d20e8daa --- /dev/null +++ b/src/content-linter/lib/helpers/unified-formatter-options.ts @@ -0,0 +1,19 @@ +interface MarkdownFormatterOptions { + bullet: string + emphasis: string + closeAtx: boolean + fence: string + fences: boolean + incrementListMarker: boolean + strong: string +} + +export const MARKDOWN_OPTIONS: MarkdownFormatterOptions = { + bullet: '*', + emphasis: '_', + closeAtx: false, + fence: '`', + fences: true, + incrementListMarker: false, + strong: '*', +} diff --git a/src/content-render/liquid/error-handling.js b/src/content-render/liquid/error-handling.ts similarity index 70% rename from src/content-render/liquid/error-handling.js rename to src/content-render/liquid/error-handling.ts index d131cb7dd5..c37e1a4b2e 100644 --- a/src/content-render/liquid/error-handling.js +++ b/src/content-render/liquid/error-handling.ts @@ -1,9 +1,9 @@ // If 'THROW_ON_EMPTY' is set and it's value is '0' or 'false' it becomes // false. Or true if it's 'true' or '1'. -export const THROW_ON_EMPTY = Boolean( +export const THROW_ON_EMPTY: boolean = 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(String(process.env.CI || process.env.NODE_ENV !== 'production')), ) export class DataReferenceError extends Error {} diff --git a/src/content-render/liquid/ifversion-supported-operators.js b/src/content-render/liquid/ifversion-supported-operators.js deleted file mode 100644 index 03234759e5..0000000000 --- a/src/content-render/liquid/ifversion-supported-operators.js +++ /dev/null @@ -1 +0,0 @@ -export default ['=', '<', '>', '!='] diff --git a/src/content-render/liquid/ifversion-supported-operators.ts b/src/content-render/liquid/ifversion-supported-operators.ts new file mode 100644 index 0000000000..735c32f40c --- /dev/null +++ b/src/content-render/liquid/ifversion-supported-operators.ts @@ -0,0 +1,5 @@ +const ifversionSupportedOperators = ['=', '<', '>', '!='] as const + +export type IfversionSupportedOperator = (typeof ifversionSupportedOperators)[number] + +export default ifversionSupportedOperators diff --git a/src/content-render/liquid/index.js b/src/content-render/liquid/index.ts similarity index 69% rename from src/content-render/liquid/index.js rename to src/content-render/liquid/index.ts index 412d11b75c..ec46b21a7d 100644 --- a/src/content-render/liquid/index.js +++ b/src/content-render/liquid/index.ts @@ -1,7 +1,7 @@ import { processLiquidPost } from './post' import { engine } from './engine' -export async function renderLiquid(template, context) { +export async function renderLiquid(template: string, context: any): Promise { template = await engine.parseAndRender(template, context) template = processLiquidPost(template) return template diff --git a/src/data-directory/lib/data-schemas/code-languages.js b/src/data-directory/lib/data-schemas/code-languages.js deleted file mode 100644 index e3c89a434f..0000000000 --- a/src/data-directory/lib/data-schemas/code-languages.js +++ /dev/null @@ -1,16 +0,0 @@ -export default { - type: 'object', - additionalProperties: { - type: 'object', - required: ['name', 'comment'], - properties: { - name: { - type: 'string', - }, - comment: { - type: 'string', - enum: ['number', 'slash', 'percent', 'hyphen', 'xml', 'none'], - }, - }, - }, -} diff --git a/src/data-directory/lib/data-schemas/code-languages.ts b/src/data-directory/lib/data-schemas/code-languages.ts new file mode 100644 index 0000000000..aa7f48e996 --- /dev/null +++ b/src/data-directory/lib/data-schemas/code-languages.ts @@ -0,0 +1,37 @@ +interface CodeLanguageProperties { + name: { + type: 'string' + } + comment: { + type: 'string' + enum: ['number', 'slash', 'percent', 'hyphen', 'xml', 'none'] + } +} + +interface CodeLanguageSchema { + type: 'object' + additionalProperties: { + type: 'object' + required: ['name', 'comment'] + properties: CodeLanguageProperties + } +} + +const codeLanguagesSchema: CodeLanguageSchema = { + type: 'object', + additionalProperties: { + type: 'object', + required: ['name', 'comment'], + properties: { + name: { + type: 'string', + }, + comment: { + type: 'string', + enum: ['number', 'slash', 'percent', 'hyphen', 'xml', 'none'], + }, + }, + }, +} + +export default codeLanguagesSchema diff --git a/src/data-directory/lib/data-schemas/index.ts b/src/data-directory/lib/data-schemas/index.ts index e8d58ceb5e..160483e39d 100644 --- a/src/data-directory/lib/data-schemas/index.ts +++ b/src/data-directory/lib/data-schemas/index.ts @@ -4,10 +4,10 @@ interface DataSchemas { const dataSchemas: DataSchemas = { 'data/features': '@/data-directory/lib/data-schemas/features.js', - 'data/variables': '@/data-directory/lib/data-schemas/variables.js', + 'data/variables': '@/data-directory/lib/data-schemas/variables', 'data/learning-tracks': '@/data-directory/lib/data-schemas/learning-tracks.js', 'data/release-notes': '@/data-directory/lib/data-schemas/release-notes.js', - 'data/code-languages.yml': '@/data-directory/lib/data-schemas/code-languages.js', + 'data/code-languages.yml': '@/data-directory/lib/data-schemas/code-languages', 'data/glossaries/candidates.yml': '@/data-directory/lib/data-schemas/glossaries-candidates.js', 'data/glossaries/external.yml': '@/data-directory/lib/data-schemas/glossaries-external.js', } diff --git a/src/data-directory/lib/data-schemas/variables.js b/src/data-directory/lib/data-schemas/variables.js deleted file mode 100644 index 3cec2cc6ff..0000000000 --- a/src/data-directory/lib/data-schemas/variables.js +++ /dev/null @@ -1,7 +0,0 @@ -export default { - type: 'object', - additionalProperties: { - type: 'string', - lintable: true, - }, -} diff --git a/src/data-directory/lib/data-schemas/variables.ts b/src/data-directory/lib/data-schemas/variables.ts new file mode 100644 index 0000000000..62ba9e1937 --- /dev/null +++ b/src/data-directory/lib/data-schemas/variables.ts @@ -0,0 +1,17 @@ +interface VariableSchema { + type: 'object' + additionalProperties: { + type: 'string' + lintable: boolean + } +} + +const variablesSchema: VariableSchema = { + type: 'object', + additionalProperties: { + type: 'string', + lintable: true, + }, +} + +export default variablesSchema diff --git a/src/frame/lib/encode-bracketed-parentheses.js b/src/frame/lib/encode-bracketed-parentheses.ts similarity index 69% rename from src/frame/lib/encode-bracketed-parentheses.js rename to src/frame/lib/encode-bracketed-parentheses.ts index e3e4b30403..d0df9a4a12 100644 --- a/src/frame/lib/encode-bracketed-parentheses.js +++ b/src/frame/lib/encode-bracketed-parentheses.ts @@ -1,6 +1,6 @@ // prevent `[foo] (bar)` strings with a space between from being interpreted as markdown links // by encoding the space character -export default function encodeBracketedParentheses(input) { +export default function encodeBracketedParentheses(input: string): string { return input.replace(/] \(/g, '] (') } diff --git a/src/frame/lib/read-file-contents.js b/src/frame/lib/read-file-contents.ts similarity index 55% rename from src/frame/lib/read-file-contents.js rename to src/frame/lib/read-file-contents.ts index 9b3aefc698..299efed569 100644 --- a/src/frame/lib/read-file-contents.js +++ b/src/frame/lib/read-file-contents.ts @@ -6,8 +6,9 @@ import fm from './frontmatter' /** * Read only the frontmatter from file */ -export default async function fmfromf(filepath) { - let fileContent = await fs.readFile(filepath, 'utf8') +// Using any type for return value because frontmatter structure is complex and varies +export default async function fmfromf(filepath: string): Promise { + let fileContent: string = await fs.readFile(filepath, 'utf8') fileContent = encodeBracketedParentheses(fileContent) diff --git a/src/frame/tests/gitignore.js b/src/frame/tests/gitignore.ts similarity index 57% rename from src/frame/tests/gitignore.js rename to src/frame/tests/gitignore.ts index 989f42e63a..760ac36341 100644 --- a/src/frame/tests/gitignore.js +++ b/src/frame/tests/gitignore.ts @@ -3,9 +3,9 @@ import path from 'path' import { describe, expect, test } from 'vitest' -const gitignorePath = path.join(process.cwd(), '.gitignore') -const gitignore = await fs.readFile(gitignorePath, 'utf8') -const entries = gitignore.split(/\r?\n/) +const gitignorePath: string = path.join(process.cwd(), '.gitignore') +const gitignore: string = await fs.readFile(gitignorePath, 'utf8') +const entries: string[] = gitignore.split(/\r?\n/) describe('.gitignore file', () => { test('includes an entry for .env', () => { diff --git a/src/rest/pages/category.tsx b/src/rest/pages/category.tsx index e14eaf70fc..0a7f1d5701 100644 --- a/src/rest/pages/category.tsx +++ b/src/rest/pages/category.tsx @@ -62,7 +62,7 @@ export default function Category({ export const getServerSideProps: GetServerSideProps = async (context) => { const { default: getRest, getRestMiniTocItems } = await import('@/rest/lib/index') const nonEnterpriseDefaultVersionModule = await import( - 'src/versions/lib/non-enterprise-default-version.js' + '@/versions/lib/non-enterprise-default-version' ) const nonEnterpriseDefaultVersion = nonEnterpriseDefaultVersionModule.default as string diff --git a/src/tests/helpers/script-data.js b/src/tests/helpers/script-data.js deleted file mode 100644 index b7bc3f0070..0000000000 --- a/src/tests/helpers/script-data.js +++ /dev/null @@ -1,13 +0,0 @@ -const NEXT_DATA_QUERY = 'script#__NEXT_DATA__' -const PRIMER_DATA_QUERY = 'script#__PRIMER_DATA__' - -function getScriptData($, key) { - const data = $(key) - if (!data.length === 1) { - throw new Error(`Not exactly 1 element match for '${key}'. Found ${data.length}`) - } - return JSON.parse(data.get()[0].children[0].data) -} - -export const getNextData = ($) => getScriptData($, NEXT_DATA_QUERY) -export const getPrimerData = ($) => getScriptData($, PRIMER_DATA_QUERY) diff --git a/src/tests/helpers/script-data.ts b/src/tests/helpers/script-data.ts new file mode 100644 index 0000000000..ec028b8523 --- /dev/null +++ b/src/tests/helpers/script-data.ts @@ -0,0 +1,15 @@ +const NEXT_DATA_QUERY = 'script#__NEXT_DATA__' +const PRIMER_DATA_QUERY = 'script#__PRIMER_DATA__' + +// Using any type for $ parameter as it represents a jQuery-like selector (cheerio) +function getScriptData($: any, key: string): any { + const data = $(key) + if (data.length !== 1) { + throw new Error(`Not exactly 1 element match for '${key}'. Found ${data.length}`) + } + return JSON.parse(data.get()[0].children[0].data) +} + +// Using any types for cheerio/jQuery-like objects and parsed JSON data +export const getNextData = ($: any): any => getScriptData($, NEXT_DATA_QUERY) +export const getPrimerData = ($: any): any => getScriptData($, PRIMER_DATA_QUERY) diff --git a/src/types/markdownlint-rules.d.ts b/src/types/markdownlint-rules.d.ts new file mode 100644 index 0000000000..7e7204208e --- /dev/null +++ b/src/types/markdownlint-rules.d.ts @@ -0,0 +1,7 @@ +// Simple type declaration for markdownlint external library +// Using any types to avoid complex typing for external dependencies + +declare module '../../../../node_modules/markdownlint/lib/rules' { + const rules: any[] + export = rules +} diff --git a/src/versions/lib/non-enterprise-default-version.js b/src/versions/lib/non-enterprise-default-version.ts similarity index 94% rename from src/versions/lib/non-enterprise-default-version.js rename to src/versions/lib/non-enterprise-default-version.ts index 5a438f0bf6..23edb11252 100644 --- a/src/versions/lib/non-enterprise-default-version.js +++ b/src/versions/lib/non-enterprise-default-version.ts @@ -1,6 +1,7 @@ import { allVersions } from '@/versions/lib/all-versions' + const nonEnterpriseDefaultVersion = Object.values(allVersions).find( (version) => version.nonEnterpriseDefault, -).version +)!.version export default nonEnterpriseDefaultVersion diff --git a/src/versions/lib/remove-fpt-from-path.js b/src/versions/lib/remove-fpt-from-path.ts similarity index 86% rename from src/versions/lib/remove-fpt-from-path.js rename to src/versions/lib/remove-fpt-from-path.ts index d93a9a29a1..32ee9ded6f 100644 --- a/src/versions/lib/remove-fpt-from-path.js +++ b/src/versions/lib/remove-fpt-from-path.ts @@ -4,6 +4,6 @@ import nonEnterpriseDefaultVersion from './non-enterprise-default-version' // This is a convenience function to remove free-pro-team@latest from all // **user-facing** aspects of the site (particularly URLs) while continuing to support // free-pro-team@latest as a version both in the codebase and in content/data files. -export default function removeFPTFromPath(path) { +export default function removeFPTFromPath(path: string): string { return slash(path.replace(`/${nonEnterpriseDefaultVersion}`, '')) }