docusaurus/packages/eslint-plugin/src/util.ts
Joshua Chen afc72480ab
refactor(eslint-plugin): migrate to TS-ESLint infrastructure (#7276)
* refactor(eslint-plugin): migrate to TS-ESLint infrastructure

* fix lock
2022-04-30 17:57:57 +08:00

67 lines
1.7 KiB
TypeScript

/**
* Copyright (c) Facebook, Inc. and its affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
import {ESLintUtils} from '@typescript-eslint/utils';
import type {TSESTree} from '@typescript-eslint/types/dist/ts-estree';
type CheckTranslateChildOptions = {
ignoredStrings?: string[];
};
const isMadeOfIgnoredStrings = (text: string, ignoredStrings: string[]) =>
text
.trim()
.split(/\s+/)
.every((string) => !string || ignoredStrings.includes(string));
const isValidTranslationLabel = (
text: unknown,
{ignoredStrings}: CheckTranslateChildOptions = {},
) => {
if (!ignoredStrings) {
return typeof text === 'string';
}
return (
typeof text === 'string' && !isMadeOfIgnoredStrings(text, ignoredStrings)
);
};
export function isStringWithoutExpressions(
text: TSESTree.Node,
options?: CheckTranslateChildOptions,
): boolean {
switch (text.type) {
case 'Literal':
return isValidTranslationLabel(text.value, options);
case 'TemplateLiteral':
return (
text.expressions.length === 0 &&
isValidTranslationLabel(text.quasis[0]!.value.raw, options)
);
default:
return false;
}
}
export function isTextLabelChild(
child: TSESTree.JSXChild,
options?: CheckTranslateChildOptions,
): boolean {
switch (child.type) {
case 'JSXText':
return isValidTranslationLabel(child.value, options);
case 'JSXExpressionContainer':
return isStringWithoutExpressions(child.expression, options);
default:
return false;
}
}
export const createRule = ESLintUtils.RuleCreator(
(name) =>
`https://docusaurus.io/docs/api/misc/@docusaurus/eslint-plugin/${name}`,
);