Socket
Socket
Sign inDemoInstall

@hi18n/eslint-plugin

Package Overview
Dependencies
129
Maintainers
1
Versions
10
Alerts
File Explorer

Advanced tools

Install Socket

Detect and block malicious and high-risk dependencies

Install

Comparing version 0.1.8 to 0.1.9

5

CHANGELOG.md

@@ -0,1 +1,6 @@

## 0.1.9
- Add internal APIs for passive importing in `@hi18n/cli`.
- Add defaultOptions to the rules (to fix type error with recent typescript-eslint)
## 0.1.8

@@ -2,0 +7,0 @@

4

dist/rules/collect-book-definitions.d.ts

@@ -13,5 +13,7 @@ import type { TSESLint } from "@typescript-eslint/utils";

declare type MessageIds = never;
declare type Options = [BookDefCallback];
export declare const meta: TSESLint.RuleMetaData<MessageIds>;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, [BookDefCallback]>>): TSESLint.RuleListener;
export declare const defaultOptions: Options;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, Options>>): TSESLint.RuleListener;
export {};
//# sourceMappingURL=collect-book-definitions.d.ts.map

@@ -7,3 +7,3 @@ "use strict";

exports.create = create;
exports.meta = void 0;
exports.meta = exports.defaultOptions = void 0;

@@ -28,2 +28,6 @@ var _util = require("../util");

exports.meta = meta;
const defaultOptions = [() => {
/* do nothing */
}];
exports.defaultOptions = defaultOptions;

@@ -30,0 +34,0 @@ function create(context) {

import type { TSESLint } from "@typescript-eslint/utils";
import { DefLocation } from "../def-location";
export declare type CatalogDef = {
locale?: string | undefined;
catalogLocation: DefLocation;
messages: Record<string, MessageDef>;
};
export declare type MessageDef = {
value: string;
};
export declare type CatalogDefCallback = (record: CatalogDef) => void;
export declare type Options = {
requestMessages?: boolean | undefined;
};
export declare type OptionList = [CatalogDefCallback, Options?];
declare type MessageIds = never;
export declare const meta: TSESLint.RuleMetaData<MessageIds>;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, [CatalogDefCallback]>>): TSESLint.RuleListener;
export declare const defaultOptions: OptionList;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, OptionList>>): TSESLint.RuleListener;
export {};
//# sourceMappingURL=collect-catalog-definitions.d.ts.map

@@ -7,3 +7,3 @@ "use strict";

exports.create = create;
exports.meta = void 0;
exports.meta = exports.defaultOptions = void 0;

@@ -14,2 +14,4 @@ var _commonTrackers = require("../common-trackers");

var _util = require("../util");
const meta = {

@@ -25,2 +27,6 @@ type: "problem",

exports.meta = meta;
const defaultOptions = [() => {
/* do nothing */
}];
exports.defaultOptions = defaultOptions;

@@ -35,7 +41,19 @@ function create(context) {

const tracker = (0, _commonTrackers.catalogTracker)();
tracker.listen('new import("@hi18n/core").Catalog()', node => {
tracker.listen('new import("@hi18n/core").Catalog()', (node, captured) => {
var _context$options$;
const catalogLocation = node.type === "NewExpression" ? (0, _defLocation.resolveAsLocation)(context.getSourceCode().scopeManager, context.getFilename(), node) : undefined;
if (!catalogLocation) return;
let locale = undefined;
const localeNode = captured["locale"];
if (localeNode.type === "Literal" && typeof localeNode.value === "string") {
locale = localeNode.value;
}
const messages = (_context$options$ = context.options[1]) !== null && _context$options$ !== void 0 && _context$options$.requestMessages ? getMessages(captured) : {};
cb({
catalogLocation
locale,
catalogLocation,
messages
});

@@ -50,2 +68,37 @@ });

}
function getMessages(captured) {
const catalogData = (0, _commonTrackers.getCatalogData)(captured);
if (catalogData.type !== "ObjectExpression") return {};
const messages = {};
for (const prop of catalogData.properties) {
if (prop.type !== "Property") continue;
const key = (0, _util.getStaticKey)(prop);
if (key === null) continue;
let value;
if (prop.value.type === "Literal" && typeof prop.value.value === "string") {
// key: "..."
value = prop.value.value;
} else if (prop.value.type === "CallExpression" && prop.value.arguments.length === 1) {
// key: msg("...")
const arg = prop.value.arguments[0];
if (arg.type === "Literal" && typeof arg.value === "string") {
value = arg.value;
} else {
continue;
}
} else {
continue;
}
messages[key] = {
value
};
}
return messages;
}
//# sourceMappingURL=collect-catalog-definitions.js.map

@@ -9,5 +9,7 @@ import type { TSESLint } from "@typescript-eslint/utils";

declare type MessageIds = never;
declare type Options = [CollectTranslationIdsCallback];
export declare const meta: TSESLint.RuleMetaData<MessageIds>;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, [CollectTranslationIdsCallback]>>): TSESLint.RuleListener;
export declare const defaultOptions: Options;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, Options>>): TSESLint.RuleListener;
export {};
//# sourceMappingURL=collect-translation-ids.d.ts.map

@@ -7,3 +7,3 @@ "use strict";

exports.create = create;
exports.meta = void 0;
exports.meta = exports.defaultOptions = void 0;

@@ -24,2 +24,6 @@ var _commonTrackers = require("../common-trackers");

exports.meta = meta;
const defaultOptions = [() => {
/* do nothing */
}];
exports.defaultOptions = defaultOptions;

@@ -26,0 +30,0 @@ function create(context) {

import type { TSESLint } from "@typescript-eslint/utils";
declare type MessageIds = "migrate-trans-jsx" | "migrate-underscore";
declare type OptionList = [Options];
declare type Options = {

@@ -7,4 +8,5 @@ bookPath: string;

export declare const meta: TSESLint.RuleMetaData<MessageIds>;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, [Options]>>): TSESLint.RuleListener;
export declare const defaultOptions: OptionList;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, OptionList>>): TSESLint.RuleListener;
export {};
//# sourceMappingURL=migrate-from-lingui.d.ts.map

@@ -9,3 +9,3 @@ "use strict";

exports.create = create;
exports.meta = void 0;
exports.meta = exports.defaultOptions = void 0;

@@ -43,2 +43,6 @@ var _nodePath = _interopRequireDefault(require("node:path"));

exports.meta = meta;
const defaultOptions = [{
bookPath: "<book path>"
}];
exports.defaultOptions = defaultOptions;
const MIGRATABLE_PROP_NAMES = ["id", // // Old name for "message"

@@ -45,0 +49,0 @@ // "defaults",

import type { TSESLint } from "@typescript-eslint/utils";
declare type MessageIds = "no-dynamic-keys";
declare type Options = [];
export declare const meta: TSESLint.RuleMetaData<MessageIds>;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, []>>): TSESLint.RuleListener;
export declare const defaultOptions: Options;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, Options>>): TSESLint.RuleListener;
export {};
//# sourceMappingURL=no-dynamic-translation-ids.d.ts.map

@@ -7,3 +7,3 @@ "use strict";

exports.create = create;
exports.meta = void 0;
exports.meta = exports.defaultOptions = void 0;

@@ -26,2 +26,4 @@ var _commonTrackers = require("../common-trackers");

exports.meta = meta;
const defaultOptions = [];
exports.defaultOptions = defaultOptions;

@@ -28,0 +30,0 @@ function create(context) {

import type { TSESLint } from "@typescript-eslint/utils";
declare type MessageIds = "missing-translation-ids";
declare type Options = [];
export declare const meta: TSESLint.RuleMetaData<MessageIds>;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, []>>): TSESLint.RuleListener;
export declare const defaultOptions: Options;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, Options>>): TSESLint.RuleListener;
export {};
//# sourceMappingURL=no-missing-translation-ids-in-types.d.ts.map

@@ -7,3 +7,3 @@ "use strict";

exports.create = create;
exports.meta = void 0;
exports.meta = exports.defaultOptions = void 0;

@@ -33,2 +33,4 @@ var _util = require("../util");

exports.meta = meta;
const defaultOptions = [];
exports.defaultOptions = defaultOptions;

@@ -35,0 +37,0 @@ function create(context) {

import type { TSESLint } from "@typescript-eslint/utils";
declare type MessageIds = "missing-translation-ids";
declare type Options = [];
export declare const meta: TSESLint.RuleMetaData<MessageIds>;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, []>>): TSESLint.RuleListener;
export declare const defaultOptions: Options;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, Options>>): TSESLint.RuleListener;
export {};
//# sourceMappingURL=no-missing-translation-ids.d.ts.map

@@ -7,3 +7,3 @@ "use strict";

exports.create = create;
exports.meta = void 0;
exports.meta = exports.defaultOptions = void 0;

@@ -31,4 +31,7 @@ var _util = require("../util");

exports.meta = meta;
const defaultOptions = [];
exports.defaultOptions = defaultOptions;
function create(context) {
const valueHints = getValueHints(context);
const tracker = (0, _commonTrackers.catalogTracker)();

@@ -40,3 +43,9 @@ tracker.listen('new import("@hi18n/core").Catalog()', (node, captured) => {

if (catalogData.type !== "ObjectExpression") return;
let locale = undefined;
const localeNode = captured["locale"];
if (localeNode.type === "Literal" && typeof localeNode.value === "string") {
locale = localeNode.value;
}
for (const prop of catalogData.properties) {

@@ -85,3 +94,8 @@ if (prop.type !== "Property") continue;

const placeholderText = `[TODO: ${missingId}]`;
let placeholderValue = `msg.todo(${JSON.stringify(`[TODO: ${missingId}]`)})`;
if (locale && valueHints && valueHints[locale] && valueHints[locale][missingId]) {
placeholderValue = `msg(${JSON.stringify(valueHints[locale][missingId])})`;
}
const insertAt = lo;

@@ -100,3 +114,3 @@

const text = `\n${" ".repeat(indent)}${JSON.stringify(missingId)}: msg.todo(${JSON.stringify(placeholderText)}),`;
const text = `\n${" ".repeat(indent)}${JSON.stringify(missingId)}: ${placeholderValue},`;
const token = context.getSourceCode().getFirstToken(catalogData);

@@ -107,3 +121,3 @@ yield fixer.insertTextAfter(token, text);

const indent = (lastCandidate.node ? lastCandidate.node : lastCandidate.commentedOut[0]).loc.start.column;
const text = `\n${" ".repeat(indent)}${JSON.stringify(missingId)}: msg.todo(${JSON.stringify(placeholderText)}),`;
const text = `\n${" ".repeat(indent)}${JSON.stringify(missingId)}: ${placeholderValue},`;
const node = extendNode(context.getSourceCode(), lastCandidate.node ? lastCandidate.node : lastCandidate.commentedOut[lastCandidate.commentedOut.length - 1]);

@@ -261,2 +275,16 @@ yield fixer.insertTextAfterRange(node.range, text);

}
function getValueHints(context) {
const valueHints = context.settings["@hi18n/value-hints"];
if (valueHints !== undefined && !isObject(valueHints)) {
throw new Error("Invalid valueHints");
}
return valueHints;
}
function isObject(obj) {
return typeof obj === "object" && obj !== null;
}
//# sourceMappingURL=no-missing-translation-ids.js.map
import type { TSESLint } from "@typescript-eslint/utils";
declare type MessageIds = "unused-translation-id";
declare type Options = [];
export declare const meta: TSESLint.RuleMetaData<MessageIds>;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, []>>): TSESLint.RuleListener;
export declare const defaultOptions: Options;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, Options>>): TSESLint.RuleListener;
export {};
//# sourceMappingURL=no-unused-translation-ids-in-types.d.ts.map

@@ -7,3 +7,3 @@ "use strict";

exports.create = create;
exports.meta = void 0;
exports.meta = exports.defaultOptions = void 0;

@@ -31,2 +31,4 @@ var _util = require("../util");

exports.meta = meta;
const defaultOptions = [];
exports.defaultOptions = defaultOptions;

@@ -33,0 +35,0 @@ function create(context) {

import type { TSESLint } from "@typescript-eslint/utils";
declare type MessageIds = "unused-translation-id";
declare type Options = [];
export declare const meta: TSESLint.RuleMetaData<MessageIds>;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, []>>): TSESLint.RuleListener;
export declare const defaultOptions: Options;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, Options>>): TSESLint.RuleListener;
export {};
//# sourceMappingURL=no-unused-translation-ids.d.ts.map

@@ -7,3 +7,3 @@ "use strict";

exports.create = create;
exports.meta = void 0;
exports.meta = exports.defaultOptions = void 0;

@@ -29,2 +29,4 @@ var _util = require("../util");

exports.meta = meta;
const defaultOptions = [];
exports.defaultOptions = defaultOptions;

@@ -31,0 +33,0 @@ function create(context) {

import { type TSESLint } from "@typescript-eslint/utils";
declare type MessageIds = "invalid-signature" | "missing-component-argument" | "extra-component-argument";
declare type Options = [];
export declare const meta: TSESLint.RuleMetaData<MessageIds>;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, []>>): TSESLint.RuleListener;
export declare const defaultOptions: Options;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, Options>>): TSESLint.RuleListener;
export {};
//# sourceMappingURL=react-component-params.d.ts.map

@@ -9,3 +9,3 @@ "use strict";

exports.create = create;
exports.meta = void 0;
exports.meta = exports.defaultOptions = void 0;

@@ -32,2 +32,4 @@ var _utils = require("@typescript-eslint/utils");

exports.meta = meta;
const defaultOptions = [];
exports.defaultOptions = defaultOptions;

@@ -34,0 +36,0 @@ function create(context) {

import type { TSESLint } from "@typescript-eslint/utils";
declare type MessageIds = "expose-book" | "clarify-catalog-reference" | "catalogs-should-be-object" | "catalogs-invalid-spread" | "catalogs-invalid-id" | "catalog-type-must-be-type-alias" | "catalog-type-must-contain-only-simple-signatures";
declare type Options = [];
export declare const meta: TSESLint.RuleMetaData<MessageIds>;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, []>>): TSESLint.RuleListener;
export declare const defaultOptions: Options;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, Options>>): TSESLint.RuleListener;
export {};
//# sourceMappingURL=well-formed-book-definitions.d.ts.map

@@ -7,3 +7,3 @@ "use strict";

exports.create = create;
exports.meta = void 0;
exports.meta = exports.defaultOptions = void 0;

@@ -40,2 +40,4 @@ var _util = require("../util");

exports.meta = meta;
const defaultOptions = [];
exports.defaultOptions = defaultOptions;

@@ -42,0 +44,0 @@ function create(context) {

import type { TSESLint } from "@typescript-eslint/utils";
declare type MessageIds = "clarify-book-reference";
declare type Options = [];
export declare const meta: TSESLint.RuleMetaData<MessageIds>;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, []>>): TSESLint.RuleListener;
export declare const defaultOptions: Options;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, Options>>): TSESLint.RuleListener;
export {};
//# sourceMappingURL=well-formed-book-references.d.ts.map

@@ -7,3 +7,3 @@ "use strict";

exports.create = create;
exports.meta = void 0;
exports.meta = exports.defaultOptions = void 0;

@@ -28,2 +28,4 @@ var _commonTrackers = require("../common-trackers");

exports.meta = meta;
const defaultOptions = [];
exports.defaultOptions = defaultOptions;

@@ -30,0 +32,0 @@ function create(context) {

import type { TSESLint } from "@typescript-eslint/utils";
declare type MessageIds = "expose-catalog" | "catalog-data-should-be-object" | "catalog-data-invalid-spread" | "catalog-data-invalid-id";
declare type Options = [];
export declare const meta: TSESLint.RuleMetaData<MessageIds>;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, []>>): TSESLint.RuleListener;
export declare const defaultOptions: Options;
export declare function create(context: Readonly<TSESLint.RuleContext<MessageIds, Options>>): TSESLint.RuleListener;
export {};
//# sourceMappingURL=well-formed-catalog-definitions.d.ts.map

@@ -7,3 +7,3 @@ "use strict";

exports.create = create;
exports.meta = void 0;
exports.meta = exports.defaultOptions = void 0;

@@ -34,2 +34,4 @@ var _util = require("../util");

exports.meta = meta;
const defaultOptions = [];
exports.defaultOptions = defaultOptions;

@@ -36,0 +38,0 @@ function create(context) {

{
"name": "@hi18n/eslint-plugin",
"version": "0.1.8",
"version": "0.1.9",
"description": "Message internationalization meets immutability and type-safety - ESLint plugin",

@@ -31,3 +31,3 @@ "keywords": [

"license": "MIT",
"packageManager": "yarn@3.2.2",
"packageManager": "yarn@3.2.3",
"files": [

@@ -72,7 +72,7 @@ "dist/**/*",

"devDependencies": {
"@babel/cli": "^7.18.9",
"@babel/core": "^7.18.9",
"@babel/cli": "^7.18.10",
"@babel/core": "^7.18.13",
"@babel/eslint-parser": "^7.18.9",
"@babel/plugin-transform-runtime": "^7.18.9",
"@babel/preset-env": "^7.18.9",
"@babel/plugin-transform-runtime": "^7.18.10",
"@babel/preset-env": "^7.18.10",
"@babel/preset-typescript": "^7.18.6",

@@ -82,21 +82,21 @@ "@hi18n/core": "0.1.9",

"@hi18n/react-context": "0.1.0",
"@jest/globals": "^28.1.3",
"@jest/globals": "^29.0.1",
"@types/babel__core": "^7.1.19",
"@types/eslint": "^8.4.5",
"@types/eslint": "^8.4.6",
"@types/node": "^17.0.32",
"@types/react": "^18.0.15",
"@typescript-eslint/parser": "^5.31.0",
"@typescript-eslint/types": "^5.31.0",
"babel-jest": "^28.1.3",
"@types/react": "^18.0.18",
"@typescript-eslint/parser": "^5.36.1",
"@typescript-eslint/types": "^5.36.1",
"babel-jest": "^29.0.1",
"babel-plugin-polyfill-corejs3": "^0.5.3",
"eslint": "^8.21.0",
"eslint-plugin-eslint-plugin": "^5.0.1",
"eslint": "^8.23.0",
"eslint-plugin-eslint-plugin": "^5.0.6",
"eslint-plugin-node": "^11.1.0",
"espree": "^9.3.3",
"jest": "^28.1.3",
"espree": "^9.4.0",
"jest": "^29.0.1",
"prettier": "^2.7.1",
"react": "^18.2.0",
"rimraf": "^3.0.2",
"typescript": "^4.7.4"
"typescript": "^4.8.2"
}
}

@@ -18,2 +18,3 @@ import type { TSESLint } from "@typescript-eslint/utils";

type MessageIds = never;
type Options = [BookDefCallback];

@@ -30,4 +31,10 @@ export const meta: TSESLint.RuleMetaData<MessageIds> = {

export const defaultOptions: Options = [
() => {
/* do nothing */
},
];
export function create(
context: Readonly<TSESLint.RuleContext<MessageIds, [BookDefCallback]>>
context: Readonly<TSESLint.RuleContext<MessageIds, Options>>
): TSESLint.RuleListener {

@@ -34,0 +41,0 @@ if (context.options[0] === undefined) {

import type { TSESLint } from "@typescript-eslint/utils";
import { catalogTracker } from "../common-trackers";
import { catalogTracker, getCatalogData } from "../common-trackers";
import { DefLocation, resolveAsLocation } from "../def-location";
import { CaptureMap } from "../tracker";
import { getStaticKey } from "../util";
export type CatalogDef = {
locale?: string | undefined;
catalogLocation: DefLocation;
messages: Record<string, MessageDef>;
};
export type MessageDef = {
value: string;
};
export type CatalogDefCallback = (record: CatalogDef) => void;
export type Options = {
requestMessages?: boolean | undefined;
};
export type OptionList = [CatalogDefCallback, Options?];
type MessageIds = never;

@@ -22,4 +34,10 @@

export const defaultOptions: OptionList = [
() => {
/* do nothing */
},
];
export function create(
context: Readonly<TSESLint.RuleContext<MessageIds, [CatalogDefCallback]>>
context: Readonly<TSESLint.RuleContext<MessageIds, OptionList>>
): TSESLint.RuleListener {

@@ -35,3 +53,3 @@ if (context.options[0] === undefined) {

const tracker = catalogTracker();
tracker.listen('new import("@hi18n/core").Catalog()', (node) => {
tracker.listen('new import("@hi18n/core").Catalog()', (node, captured) => {
const catalogLocation =

@@ -47,4 +65,17 @@ node.type === "NewExpression"

let locale: string | undefined = undefined;
const localeNode = captured["locale"]!;
if (localeNode.type === "Literal" && typeof localeNode.value === "string") {
locale = localeNode.value;
}
const messages: Record<string, MessageDef> = context.options[1]
?.requestMessages
? getMessages(captured)
: {};
cb({
locale,
catalogLocation,
messages,
});

@@ -58,1 +89,36 @@ });

}
function getMessages(captured: CaptureMap): Record<string, MessageDef> {
const catalogData = getCatalogData(captured);
if (catalogData.type !== "ObjectExpression") return {};
const messages: Record<string, MessageDef> = {};
for (const prop of catalogData.properties) {
if (prop.type !== "Property") continue;
const key = getStaticKey(prop);
if (key === null) continue;
let value: string;
if (prop.value.type === "Literal" && typeof prop.value.value === "string") {
// key: "..."
value = prop.value.value;
} else if (
prop.value.type === "CallExpression" &&
prop.value.arguments.length === 1
) {
// key: msg("...")
const arg = prop.value.arguments[0]!;
if (arg.type === "Literal" && typeof arg.value === "string") {
value = arg.value;
} else {
continue;
}
} else {
continue;
}
messages[key] = { value };
}
return messages;
}

@@ -12,2 +12,3 @@ import type { TSESLint } from "@typescript-eslint/utils";

type MessageIds = never;
type Options = [CollectTranslationIdsCallback];

@@ -24,6 +25,10 @@ export const meta: TSESLint.RuleMetaData<MessageIds> = {

export const defaultOptions: Options = [
() => {
/* do nothing */
},
];
export function create(
context: Readonly<
TSESLint.RuleContext<MessageIds, [CollectTranslationIdsCallback]>
>
context: Readonly<TSESLint.RuleContext<MessageIds, Options>>
): TSESLint.RuleListener {

@@ -30,0 +35,0 @@ if (context.options[0] === undefined) {

@@ -8,2 +8,3 @@ import path from "node:path";

type MessageIds = "migrate-trans-jsx" | "migrate-underscore";
type OptionList = [Options];

@@ -39,2 +40,8 @@ type Options = {

export const defaultOptions: OptionList = [
{
bookPath: "<book path>",
},
];
const MIGRATABLE_PROP_NAMES = [

@@ -61,3 +68,3 @@ "id",

export function create(
context: Readonly<TSESLint.RuleContext<MessageIds, [Options]>>
context: Readonly<TSESLint.RuleContext<MessageIds, OptionList>>
): TSESLint.RuleListener {

@@ -64,0 +71,0 @@ let bookPath = path.relative(

@@ -6,2 +6,3 @@ import type { TSESLint } from "@typescript-eslint/utils";

type MessageIds = "no-dynamic-keys";
type Options = [];

@@ -21,4 +22,6 @@ export const meta: TSESLint.RuleMetaData<MessageIds> = {

export const defaultOptions: Options = [];
export function create(
context: Readonly<TSESLint.RuleContext<MessageIds, []>>
context: Readonly<TSESLint.RuleContext<MessageIds, Options>>
): TSESLint.RuleListener {

@@ -25,0 +28,0 @@ const tracker = translationCallTracker();

@@ -9,2 +9,3 @@ import type { TSESLint, TSESTree } from "@typescript-eslint/utils";

type MessageIds = "missing-translation-ids";
type Options = [];

@@ -25,4 +26,6 @@ export const meta: TSESLint.RuleMetaData<MessageIds> = {

export const defaultOptions: Options = [];
export function create(
context: Readonly<TSESLint.RuleContext<MessageIds, []>>
context: Readonly<TSESLint.RuleContext<MessageIds, Options>>
): TSESLint.RuleListener {

@@ -29,0 +32,0 @@ const tracker = bookTracker();

@@ -8,2 +8,3 @@ import type { TSESLint, TSESTree } from "@typescript-eslint/utils";

type MessageIds = "missing-translation-ids";
type Options = [];

@@ -24,5 +25,8 @@ export const meta: TSESLint.RuleMetaData<MessageIds> = {

export const defaultOptions: Options = [];
export function create(
context: Readonly<TSESLint.RuleContext<MessageIds, []>>
context: Readonly<TSESLint.RuleContext<MessageIds, Options>>
): TSESLint.RuleListener {
const valueHints = getValueHints(context);
const tracker = catalogTracker();

@@ -36,2 +40,8 @@ tracker.listen('new import("@hi18n/core").Catalog()', (node, captured) => {

let locale: string | undefined = undefined;
const localeNode = captured["locale"]!;
if (localeNode.type === "Literal" && typeof localeNode.value === "string") {
locale = localeNode.value;
}
for (const prop of catalogData.properties) {

@@ -78,3 +88,15 @@ if (prop.type !== "Property") continue;

}
const placeholderText = `[TODO: ${missingId}]`;
let placeholderValue = `msg.todo(${JSON.stringify(
`[TODO: ${missingId}]`
)})`;
if (
locale &&
valueHints &&
valueHints[locale] &&
valueHints[locale]![missingId]
) {
placeholderValue = `msg(${JSON.stringify(
valueHints[locale]![missingId]
)})`;
}
const insertAt = lo;

@@ -98,3 +120,3 @@ if (insertAt === 0) {

missingId
)}: msg.todo(${JSON.stringify(placeholderText)}),`;
)}: ${placeholderValue},`;
const token = context

@@ -113,3 +135,3 @@ .getSourceCode()

missingId
)}: msg.todo(${JSON.stringify(placeholderText)}),`;
)}: ${placeholderValue},`;
const node = extendNode(

@@ -303,1 +325,18 @@ context.getSourceCode(),

}
function getValueHints<
TMessageIds extends string,
TOptions extends readonly unknown[]
>(
context: Readonly<TSESLint.RuleContext<TMessageIds, TOptions>>
): Record<string, Record<string, string>> | undefined {
const valueHints: unknown = context.settings["@hi18n/value-hints"];
if (valueHints !== undefined && !isObject(valueHints)) {
throw new Error("Invalid valueHints");
}
return valueHints as Record<string, Record<string, string>> | undefined;
}
function isObject(obj: unknown): obj is Record<string, unknown> {
return typeof obj === "object" && obj !== null;
}

@@ -8,2 +8,3 @@ import type { TSESLint } from "@typescript-eslint/utils";

type MessageIds = "unused-translation-id";
type Options = [];

@@ -24,4 +25,6 @@ export const meta: TSESLint.RuleMetaData<MessageIds> = {

export const defaultOptions: Options = [];
export function create(
context: Readonly<TSESLint.RuleContext<MessageIds, []>>
context: Readonly<TSESLint.RuleContext<MessageIds, Options>>
): TSESLint.RuleListener {

@@ -28,0 +31,0 @@ const tracker = bookTracker();

@@ -7,2 +7,3 @@ import type { TSESLint } from "@typescript-eslint/utils";

type MessageIds = "unused-translation-id";
type Options = [];

@@ -23,4 +24,6 @@ export const meta: TSESLint.RuleMetaData<MessageIds> = {

export const defaultOptions: Options = [];
export function create(
context: Readonly<TSESLint.RuleContext<MessageIds, []>>
context: Readonly<TSESLint.RuleContext<MessageIds, Options>>
): TSESLint.RuleListener {

@@ -27,0 +30,0 @@ const tracker = catalogTracker();

@@ -9,2 +9,3 @@ import { ESLintUtils, TSESTree, type TSESLint } from "@typescript-eslint/utils";

| "extra-component-argument";
type Options = [];

@@ -25,4 +26,6 @@ export const meta: TSESLint.RuleMetaData<MessageIds> = {

export const defaultOptions: Options = [];
export function create(
context: Readonly<TSESLint.RuleContext<MessageIds, []>>
context: Readonly<TSESLint.RuleContext<MessageIds, Options>>
): TSESLint.RuleListener {

@@ -29,0 +32,0 @@ const tracker = translationCallTracker();

@@ -21,2 +21,3 @@ import type { TSESLint, TSESTree } from "@typescript-eslint/utils";

| "catalog-type-must-contain-only-simple-signatures";
type Options = [];

@@ -47,4 +48,6 @@ export const meta: TSESLint.RuleMetaData<MessageIds> = {

export const defaultOptions: Options = [];
export function create(
context: Readonly<TSESLint.RuleContext<MessageIds, []>>
context: Readonly<TSESLint.RuleContext<MessageIds, Options>>
): TSESLint.RuleListener {

@@ -51,0 +54,0 @@ const tracker = bookTracker();

@@ -7,2 +7,3 @@ import type { TSESLint } from "@typescript-eslint/utils";

type MessageIds = "clarify-book-reference";
type Options = [];

@@ -23,4 +24,6 @@ export const meta: TSESLint.RuleMetaData<MessageIds> = {

export const defaultOptions: Options = [];
export function create(
context: Readonly<TSESLint.RuleContext<MessageIds, []>>
context: Readonly<TSESLint.RuleContext<MessageIds, Options>>
): TSESLint.RuleListener {

@@ -27,0 +30,0 @@ const tracker = translationCallTracker();

@@ -12,2 +12,3 @@ import type { TSESLint } from "@typescript-eslint/utils";

| "catalog-data-invalid-id";
type Options = [];

@@ -34,4 +35,6 @@ export const meta: TSESLint.RuleMetaData<MessageIds> = {

export const defaultOptions: Options = [];
export function create(
context: Readonly<TSESLint.RuleContext<MessageIds, []>>
context: Readonly<TSESLint.RuleContext<MessageIds, Options>>
): TSESLint.RuleListener {

@@ -38,0 +41,0 @@ const tracker = catalogTracker();

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is not supported yet

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc