corsa-oxlint 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +171 -0
  3. package/dist/_virtual/_rolldown/runtime.js +13 -0
  4. package/dist/ast_utils.d.ts +17 -0
  5. package/dist/ast_utils.js +21 -0
  6. package/dist/ast_utils.js.map +1 -0
  7. package/dist/checker.d.ts +11 -0
  8. package/dist/checker.js +80 -0
  9. package/dist/checker.js.map +1 -0
  10. package/dist/compat.d.ts +194 -0
  11. package/dist/compat.js +103 -0
  12. package/dist/compat.js.map +1 -0
  13. package/dist/context.d.ts +24 -0
  14. package/dist/context.js +134 -0
  15. package/dist/context.js.map +1 -0
  16. package/dist/eslint_utils.d.ts +19 -0
  17. package/dist/eslint_utils.js +48 -0
  18. package/dist/eslint_utils.js.map +1 -0
  19. package/dist/index.d.ts +12 -0
  20. package/dist/index.js +11 -0
  21. package/dist/json_schema.d.ts +11 -0
  22. package/dist/json_schema.js +17 -0
  23. package/dist/json_schema.js.map +1 -0
  24. package/dist/node_map.d.ts +18 -0
  25. package/dist/node_map.js +52 -0
  26. package/dist/node_map.js.map +1 -0
  27. package/dist/parser_services.d.ts +16 -0
  28. package/dist/parser_services.js +48 -0
  29. package/dist/parser_services.js.map +1 -0
  30. package/dist/plugin.d.ts +26 -0
  31. package/dist/plugin.js +83 -0
  32. package/dist/plugin.js.map +1 -0
  33. package/dist/registry.d.ts +12 -0
  34. package/dist/registry.js +35 -0
  35. package/dist/registry.js.map +1 -0
  36. package/dist/rule_tester.d.ts +37 -0
  37. package/dist/rule_tester.js +120 -0
  38. package/dist/rule_tester.js.map +1 -0
  39. package/dist/rules/ast.d.ts +16 -0
  40. package/dist/rules/ast.js +56 -0
  41. package/dist/rules/ast.js.map +1 -0
  42. package/dist/rules/await_thenable.d.ts +16 -0
  43. package/dist/rules/await_thenable.js +23 -0
  44. package/dist/rules/await_thenable.js.map +1 -0
  45. package/dist/rules/index.d.ts +473 -0
  46. package/dist/rules/index.js +120 -0
  47. package/dist/rules/index.js.map +1 -0
  48. package/dist/rules/no_array_delete.d.ts +16 -0
  49. package/dist/rules/no_array_delete.js +29 -0
  50. package/dist/rules/no_array_delete.js.map +1 -0
  51. package/dist/rules/no_base_to_string.d.ts +16 -0
  52. package/dist/rules/no_base_to_string.js +66 -0
  53. package/dist/rules/no_base_to_string.js.map +1 -0
  54. package/dist/rules/no_floating_promises.d.ts +16 -0
  55. package/dist/rules/no_floating_promises.js +42 -0
  56. package/dist/rules/no_floating_promises.js.map +1 -0
  57. package/dist/rules/no_for_in_array.d.ts +16 -0
  58. package/dist/rules/no_for_in_array.js +16 -0
  59. package/dist/rules/no_for_in_array.js.map +1 -0
  60. package/dist/rules/no_implied_eval.d.ts +16 -0
  61. package/dist/rules/no_implied_eval.js +35 -0
  62. package/dist/rules/no_implied_eval.js.map +1 -0
  63. package/dist/rules/no_mixed_enums.d.ts +16 -0
  64. package/dist/rules/no_mixed_enums.js +41 -0
  65. package/dist/rules/no_mixed_enums.js.map +1 -0
  66. package/dist/rules/no_unsafe_assignment.d.ts +16 -0
  67. package/dist/rules/no_unsafe_assignment.js +41 -0
  68. package/dist/rules/no_unsafe_assignment.js.map +1 -0
  69. package/dist/rules/no_unsafe_return.d.ts +16 -0
  70. package/dist/rules/no_unsafe_return.js +56 -0
  71. package/dist/rules/no_unsafe_return.js.map +1 -0
  72. package/dist/rules/no_unsafe_unary_minus.d.ts +16 -0
  73. package/dist/rules/no_unsafe_unary_minus.js +28 -0
  74. package/dist/rules/no_unsafe_unary_minus.js.map +1 -0
  75. package/dist/rules/only_throw_error.d.ts +16 -0
  76. package/dist/rules/only_throw_error.js +16 -0
  77. package/dist/rules/only_throw_error.js.map +1 -0
  78. package/dist/rules/prefer_find.d.ts +16 -0
  79. package/dist/rules/prefer_find.js +25 -0
  80. package/dist/rules/prefer_find.js.map +1 -0
  81. package/dist/rules/prefer_includes.d.ts +16 -0
  82. package/dist/rules/prefer_includes.js +21 -0
  83. package/dist/rules/prefer_includes.js.map +1 -0
  84. package/dist/rules/prefer_promise_reject_errors.d.ts +16 -0
  85. package/dist/rules/prefer_promise_reject_errors.js +52 -0
  86. package/dist/rules/prefer_promise_reject_errors.js.map +1 -0
  87. package/dist/rules/prefer_regexp_exec.d.ts +16 -0
  88. package/dist/rules/prefer_regexp_exec.js +20 -0
  89. package/dist/rules/prefer_regexp_exec.js.map +1 -0
  90. package/dist/rules/prefer_string_starts_ends_with.d.ts +16 -0
  91. package/dist/rules/prefer_string_starts_ends_with.js +53 -0
  92. package/dist/rules/prefer_string_starts_ends_with.js.map +1 -0
  93. package/dist/rules/require_array_sort_compare.d.ts +16 -0
  94. package/dist/rules/require_array_sort_compare.js +36 -0
  95. package/dist/rules/require_array_sort_compare.js.map +1 -0
  96. package/dist/rules/restrict_plus_operands.d.ts +16 -0
  97. package/dist/rules/restrict_plus_operands.js +62 -0
  98. package/dist/rules/restrict_plus_operands.js.map +1 -0
  99. package/dist/rules/rule_creator.d.ts +16 -0
  100. package/dist/rules/rule_creator.js +22 -0
  101. package/dist/rules/rule_creator.js.map +1 -0
  102. package/dist/rules/type_utils.d.ts +56 -0
  103. package/dist/rules/type_utils.js +102 -0
  104. package/dist/rules/type_utils.js.map +1 -0
  105. package/dist/rules/use_unknown_in_catch_callback_variable.d.ts +16 -0
  106. package/dist/rules/use_unknown_in_catch_callback_variable.js +19 -0
  107. package/dist/rules/use_unknown_in_catch_callback_variable.js.map +1 -0
  108. package/dist/session.d.ts +32 -0
  109. package/dist/session.js +179 -0
  110. package/dist/session.js.map +1 -0
  111. package/dist/ts_eslint.d.ts +22 -0
  112. package/dist/ts_eslint.js +30 -0
  113. package/dist/ts_eslint.js.map +1 -0
  114. package/dist/ts_estree.d.ts +2 -0
  115. package/dist/ts_estree.js +2 -0
  116. package/dist/types.d.ts +136 -0
  117. package/dist/types.js +1 -0
  118. package/dist/utils.d.ts +22 -0
  119. package/dist/utils.js +22 -0
  120. package/dist/utils.js.map +1 -0
  121. package/package.json +69 -0
@@ -0,0 +1,24 @@
1
+ import { ContextWithParserOptions, ResolvedProjectConfig, TypeAwareParserOptions } from "./types.js";
2
+
3
+ //#region src/bindings/nodejs/typescript_oxlint/ts/context.d.ts
4
+ declare function defaultTsgoExecutable(rootDir: string, platform?: NodeJS.Platform): string;
5
+ declare function resolveProjectConfig(context: ContextWithParserOptions): ResolvedProjectConfig;
6
+ /**
7
+ * Resolves the type-aware parser options visible to a rule.
8
+ *
9
+ * Oxlint exposes a fixed `context.languageOptions.parserOptions` object at
10
+ * runtime, so `oxlint-plugin-typescript-go` stores its richer configuration under
11
+ * `settings.typescriptOxlint` and rehydrates the expected
12
+ * `typescript-eslint`-style shape from there.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * const parserOptions = resolveTypeAwareParserOptions(context);
17
+ * parserOptions.tsgo?.mode;
18
+ * ```
19
+ */
20
+ declare function resolveTypeAwareParserOptions(context: ContextWithParserOptions): TypeAwareParserOptions;
21
+ declare function mergeTypeAwareParserOptions(base: TypeAwareParserOptions | undefined, override: TypeAwareParserOptions | undefined): TypeAwareParserOptions;
22
+ //#endregion
23
+ export { defaultTsgoExecutable, mergeTypeAwareParserOptions, resolveProjectConfig, resolveTypeAwareParserOptions };
24
+ //# sourceMappingURL=context.d.ts.map
@@ -0,0 +1,134 @@
1
+ import { existsSync, mkdirSync, writeFileSync } from "node:fs";
2
+ import { dirname, resolve } from "node:path";
3
+ //#region src/bindings/nodejs/typescript_oxlint/ts/context.ts
4
+ const DEFAULT_CACHE_LIFETIME_MS = 250;
5
+ const DEFAULT_PROJECT_PATTERNS = [
6
+ "*.ts",
7
+ "*.tsx",
8
+ "*.js",
9
+ "*.jsx"
10
+ ];
11
+ const DEFAULT_TS_CONFIG = { compilerOptions: {
12
+ module: "esnext",
13
+ target: "es2022",
14
+ strict: true
15
+ } };
16
+ function defaultTsgoExecutable(rootDir, platform = process.platform) {
17
+ return resolve(rootDir, platform === "win32" ? ".cache/tsgo.exe" : ".cache/tsgo");
18
+ }
19
+ function resolveProjectConfig(context) {
20
+ const filename = resolve(context.filename);
21
+ const parserOptions = resolveTypeAwareParserOptions(context);
22
+ const rootDir = resolve(parserOptions.tsconfigRootDir ?? context.cwd);
23
+ const runtime = resolveRuntimeOptions(rootDir, parserOptions);
24
+ const configPath = resolveExplicitProject(rootDir, parserOptions) ?? discoverTsconfig(filename, rootDir) ?? resolveDefaultProject(rootDir, filename, parserOptions.projectService);
25
+ if (!configPath) throw new Error(`oxlint-plugin-typescript-go could not resolve a tsconfig for ${filename}`);
26
+ return {
27
+ filename,
28
+ rootDir,
29
+ configPath,
30
+ runtime
31
+ };
32
+ }
33
+ /**
34
+ * Resolves the type-aware parser options visible to a rule.
35
+ *
36
+ * Oxlint exposes a fixed `context.languageOptions.parserOptions` object at
37
+ * runtime, so `oxlint-plugin-typescript-go` stores its richer configuration under
38
+ * `settings.typescriptOxlint` and rehydrates the expected
39
+ * `typescript-eslint`-style shape from there.
40
+ *
41
+ * @example
42
+ * ```ts
43
+ * const parserOptions = resolveTypeAwareParserOptions(context);
44
+ * parserOptions.tsgo?.mode;
45
+ * ```
46
+ */
47
+ function resolveTypeAwareParserOptions(context) {
48
+ return mergeTypeAwareParserOptions(resolveSettingsParserOptions(context.settings?.typescriptOxlint), mergeTypeAwareParserOptions(context.parserOptions, context.languageOptions?.parserOptions));
49
+ }
50
+ function resolveRuntimeOptions(rootDir, parserOptions) {
51
+ return {
52
+ executable: resolve(parserOptions.tsgo?.executable ?? process.env.TSGO_EXECUTABLE ?? defaultTsgoExecutable(rootDir)),
53
+ cwd: resolve(parserOptions.tsgo?.cwd ?? rootDir),
54
+ mode: parserOptions.tsgo?.mode ?? "msgpack",
55
+ cacheLifetimeMs: parserOptions.tsgo?.cacheLifetimeMs ?? DEFAULT_CACHE_LIFETIME_MS
56
+ };
57
+ }
58
+ function resolveExplicitProject(rootDir, parserOptions) {
59
+ return asArray(parserOptions.project).map((project) => {
60
+ return resolve(rootDir, project);
61
+ }).find(existsSync);
62
+ }
63
+ function discoverTsconfig(filename, rootDir) {
64
+ let current = dirname(filename);
65
+ const boundary = resolve(rootDir);
66
+ while (current.startsWith(boundary)) {
67
+ const candidate = resolve(current, "tsconfig.json");
68
+ if (existsSync(candidate)) return candidate;
69
+ const parent = dirname(current);
70
+ if (parent === current) break;
71
+ current = parent;
72
+ }
73
+ }
74
+ function resolveDefaultProject(rootDir, filename, projectService) {
75
+ if (!projectService) return;
76
+ if (projectService !== true && projectService.defaultProject) return resolve(rootDir, projectService.defaultProject);
77
+ if (!matchesDefaultProject(filename, projectService)) return;
78
+ const id = Buffer.from(filename).toString("hex").slice(0, 24);
79
+ const cacheDir = resolve(rootDir, ".cache/typescript_oxlint/default");
80
+ const configPath = resolve(cacheDir, `${id}.tsconfig.json`);
81
+ if (!existsSync(configPath)) {
82
+ mkdirSync(cacheDir, { recursive: true });
83
+ writeFileSync(configPath, JSON.stringify({
84
+ ...DEFAULT_TS_CONFIG,
85
+ files: [filename]
86
+ }, null, 2));
87
+ }
88
+ return configPath;
89
+ }
90
+ function matchesDefaultProject(filename, projectService) {
91
+ return ((projectService === true ? void 0 : projectService.allowDefaultProject) ?? DEFAULT_PROJECT_PATTERNS).some((pattern) => globMatch(filename, pattern));
92
+ }
93
+ function globMatch(value, pattern) {
94
+ const escaped = pattern.replaceAll(".", "\\.").replaceAll("*", ".*");
95
+ return new RegExp(`${escaped}$`).test(value);
96
+ }
97
+ function asArray(value) {
98
+ return value ? Array.isArray(value) ? value : [value] : [];
99
+ }
100
+ function resolveSettingsParserOptions(settings) {
101
+ if (!settings) return {};
102
+ const { parserOptions, ...inline } = settings;
103
+ return mergeTypeAwareParserOptions(inline, parserOptions);
104
+ }
105
+ function mergeTypeAwareParserOptions(base, override) {
106
+ if (!base) return override ?? {};
107
+ if (!override) return base;
108
+ return {
109
+ ...base,
110
+ ...override,
111
+ project: override.project ?? base.project,
112
+ projectService: mergeProjectService(base.projectService, override.projectService),
113
+ tsconfigRootDir: override.tsconfigRootDir ?? base.tsconfigRootDir,
114
+ tsgo: {
115
+ ...base.tsgo,
116
+ ...override.tsgo
117
+ }
118
+ };
119
+ }
120
+ function mergeProjectService(base, override) {
121
+ if (override === void 0) return base;
122
+ if (typeof override === "boolean") return override;
123
+ if (base === void 0 || typeof base === "boolean") return override;
124
+ return {
125
+ ...base,
126
+ ...override,
127
+ allowDefaultProject: override.allowDefaultProject ?? base.allowDefaultProject,
128
+ defaultProject: override.defaultProject ?? base.defaultProject
129
+ };
130
+ }
131
+ //#endregion
132
+ export { defaultTsgoExecutable, mergeTypeAwareParserOptions, resolveProjectConfig, resolveTypeAwareParserOptions };
133
+
134
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","names":[],"sources":["../ts/context.ts"],"sourcesContent":["import { existsSync, mkdirSync, writeFileSync } from \"node:fs\";\nimport { dirname, resolve } from \"node:path\";\n\nimport type {\n ContextWithParserOptions,\n ProjectServiceOptions,\n ResolvedProjectConfig,\n ResolvedRuntimeOptions,\n TypeAwareParserOptions,\n TypescriptOxlintSettings,\n} from \"./types\";\n\nconst DEFAULT_CACHE_LIFETIME_MS = 250;\nconst DEFAULT_PROJECT_PATTERNS = [\"*.ts\", \"*.tsx\", \"*.js\", \"*.jsx\"];\nconst DEFAULT_TS_CONFIG = {\n compilerOptions: {\n module: \"esnext\",\n target: \"es2022\",\n strict: true,\n },\n};\n\nexport function defaultTsgoExecutable(rootDir: string, platform = process.platform): string {\n return resolve(rootDir, platform === \"win32\" ? \".cache/tsgo.exe\" : \".cache/tsgo\");\n}\n\nexport function resolveProjectConfig(context: ContextWithParserOptions): ResolvedProjectConfig {\n const filename = resolve(context.filename);\n const parserOptions = resolveTypeAwareParserOptions(context);\n const rootDir = resolve(parserOptions.tsconfigRootDir ?? context.cwd);\n const runtime = resolveRuntimeOptions(rootDir, parserOptions);\n const configPath =\n resolveExplicitProject(rootDir, parserOptions) ??\n discoverTsconfig(filename, rootDir) ??\n resolveDefaultProject(rootDir, filename, parserOptions.projectService);\n if (!configPath) {\n throw new Error(`oxlint-plugin-typescript-go could not resolve a tsconfig for ${filename}`);\n }\n return { filename, rootDir, configPath, runtime };\n}\n\n/**\n * Resolves the type-aware parser options visible to a rule.\n *\n * Oxlint exposes a fixed `context.languageOptions.parserOptions` object at\n * runtime, so `oxlint-plugin-typescript-go` stores its richer configuration under\n * `settings.typescriptOxlint` and rehydrates the expected\n * `typescript-eslint`-style shape from there.\n *\n * @example\n * ```ts\n * const parserOptions = resolveTypeAwareParserOptions(context);\n * parserOptions.tsgo?.mode;\n * ```\n */\nexport function resolveTypeAwareParserOptions(\n context: ContextWithParserOptions,\n): TypeAwareParserOptions {\n return mergeTypeAwareParserOptions(\n resolveSettingsParserOptions(context.settings?.typescriptOxlint),\n mergeTypeAwareParserOptions(context.parserOptions, context.languageOptions?.parserOptions),\n );\n}\n\nfunction resolveRuntimeOptions(\n rootDir: string,\n parserOptions: TypeAwareParserOptions,\n): ResolvedRuntimeOptions {\n return {\n executable: resolve(\n parserOptions.tsgo?.executable ??\n process.env.TSGO_EXECUTABLE ??\n defaultTsgoExecutable(rootDir),\n ),\n cwd: resolve(parserOptions.tsgo?.cwd ?? rootDir),\n mode: parserOptions.tsgo?.mode ?? \"msgpack\",\n cacheLifetimeMs: parserOptions.tsgo?.cacheLifetimeMs ?? DEFAULT_CACHE_LIFETIME_MS,\n };\n}\n\nfunction resolveExplicitProject(\n rootDir: string,\n parserOptions: TypeAwareParserOptions,\n): string | undefined {\n const projects = asArray(parserOptions.project).map((project) => {\n return resolve(rootDir, project);\n });\n return projects.find(existsSync);\n}\n\nfunction discoverTsconfig(filename: string, rootDir: string): string | undefined {\n let current = dirname(filename);\n const boundary = resolve(rootDir);\n while (current.startsWith(boundary)) {\n const candidate = resolve(current, \"tsconfig.json\");\n if (existsSync(candidate)) {\n return candidate;\n }\n const parent = dirname(current);\n if (parent === current) {\n break;\n }\n current = parent;\n }\n return undefined;\n}\n\nfunction resolveDefaultProject(\n rootDir: string,\n filename: string,\n projectService: boolean | ProjectServiceOptions | undefined,\n): string | undefined {\n if (!projectService) {\n return undefined;\n }\n if (projectService !== true && projectService.defaultProject) {\n return resolve(rootDir, projectService.defaultProject);\n }\n if (!matchesDefaultProject(filename, projectService as true | ProjectServiceOptions)) {\n return undefined;\n }\n const id = Buffer.from(filename).toString(\"hex\").slice(0, 24);\n const cacheDir = resolve(rootDir, \".cache/typescript_oxlint/default\");\n const configPath = resolve(cacheDir, `${id}.tsconfig.json`);\n if (!existsSync(configPath)) {\n mkdirSync(cacheDir, { recursive: true });\n writeFileSync(\n configPath,\n JSON.stringify(\n {\n ...DEFAULT_TS_CONFIG,\n files: [filename],\n },\n null,\n 2,\n ),\n );\n }\n return configPath;\n}\n\nfunction matchesDefaultProject(\n filename: string,\n projectService: true | ProjectServiceOptions,\n): boolean {\n const patterns =\n (projectService === true ? undefined : projectService.allowDefaultProject) ??\n DEFAULT_PROJECT_PATTERNS;\n return patterns.some((pattern: string) => globMatch(filename, pattern));\n}\n\nfunction globMatch(value: string, pattern: string): boolean {\n const escaped = pattern.replaceAll(\".\", \"\\\\.\").replaceAll(\"*\", \".*\");\n return new RegExp(`${escaped}$`).test(value);\n}\n\nfunction asArray(value: string | string[] | undefined): string[] {\n return value ? (Array.isArray(value) ? value : [value]) : [];\n}\n\nfunction resolveSettingsParserOptions(\n settings: TypescriptOxlintSettings | undefined,\n): TypeAwareParserOptions {\n if (!settings) {\n return {};\n }\n const { parserOptions, ...inline } = settings;\n return mergeTypeAwareParserOptions(inline, parserOptions);\n}\n\nexport function mergeTypeAwareParserOptions(\n base: TypeAwareParserOptions | undefined,\n override: TypeAwareParserOptions | undefined,\n): TypeAwareParserOptions {\n if (!base) {\n return override ?? {};\n }\n if (!override) {\n return base;\n }\n return {\n ...base,\n ...override,\n project: override.project ?? base.project,\n projectService: mergeProjectService(base.projectService, override.projectService),\n tsconfigRootDir: override.tsconfigRootDir ?? base.tsconfigRootDir,\n tsgo: {\n ...base.tsgo,\n ...override.tsgo,\n },\n };\n}\n\nfunction mergeProjectService(\n base: boolean | ProjectServiceOptions | undefined,\n override: boolean | ProjectServiceOptions | undefined,\n): boolean | ProjectServiceOptions | undefined {\n if (override === undefined) {\n return base;\n }\n if (typeof override === \"boolean\") {\n return override;\n }\n if (base === undefined || typeof base === \"boolean\") {\n return override;\n }\n return {\n ...base,\n ...override,\n allowDefaultProject: override.allowDefaultProject ?? base.allowDefaultProject,\n defaultProject: override.defaultProject ?? base.defaultProject,\n };\n}\n"],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import { ContextWithParserOptions, ParserServices } from "./types.js";
2
+ import { getParserServices } from "./parser_services.js";
3
+
4
+ //#region src/bindings/nodejs/typescript_oxlint/ts/eslint_utils.d.ts
5
+ /**
6
+ * Self-hosted `typescript-eslint`-style utility surface that swaps parser
7
+ * service access over to tsgo-backed implementations.
8
+ */
9
+ declare const ESLintUtils: Readonly<{
10
+ RuleCreator(urlCreator: (ruleName: string) => string): (rule: any) => never;
11
+ getParserServices(context: ContextWithParserOptions, allowWithoutFullTypeInformation?: boolean): ParserServices;
12
+ }>;
13
+ declare const RuleCreator: (urlCreator: (ruleName: string) => string) => (rule: any) => never;
14
+ declare function applyDefault<Values extends readonly unknown[], Defaults extends readonly unknown[]>(values: Values | undefined, defaults: Defaults): readonly unknown[];
15
+ declare function deepMerge<T>(base: T, override: unknown): T;
16
+ declare function nullThrows<T>(value: T | null | undefined, message?: string): T;
17
+ //#endregion
18
+ export { ESLintUtils, RuleCreator, applyDefault, deepMerge, getParserServices, nullThrows };
19
+ //# sourceMappingURL=eslint_utils.d.ts.map
@@ -0,0 +1,48 @@
1
+ import { getParserServices } from "./parser_services.js";
2
+ import { decorateRule } from "./plugin.js";
3
+ //#region src/bindings/nodejs/typescript_oxlint/ts/eslint_utils.ts
4
+ /**
5
+ * Self-hosted `typescript-eslint`-style utility surface that swaps parser
6
+ * service access over to tsgo-backed implementations.
7
+ */
8
+ const ESLintUtils = Object.freeze({
9
+ RuleCreator(urlCreator) {
10
+ return (rule) => {
11
+ const docs = rule.meta?.docs;
12
+ return decorateRule({
13
+ ...rule,
14
+ meta: {
15
+ ...rule.meta,
16
+ docs: {
17
+ ...docs,
18
+ url: urlCreator(rule.name)
19
+ }
20
+ },
21
+ defaultOptions: rule.defaultOptions ?? []
22
+ });
23
+ };
24
+ },
25
+ getParserServices(context, allowWithoutFullTypeInformation = false) {
26
+ return getParserServices(context, allowWithoutFullTypeInformation);
27
+ }
28
+ });
29
+ const RuleCreator = ESLintUtils.RuleCreator;
30
+ function applyDefault(values, defaults) {
31
+ return deepMerge(defaults, values ?? []);
32
+ }
33
+ function deepMerge(base, override) {
34
+ if (Array.isArray(base) && Array.isArray(override)) return base.map((value, index) => deepMerge(value, override[index]));
35
+ if (isObject(base) && isObject(override)) return Object.fromEntries([...new Set([...Object.keys(base), ...Object.keys(override)])].map((key) => [key, deepMerge(base[key], override[key])]));
36
+ return override ?? base;
37
+ }
38
+ function nullThrows(value, message = "Expected value to be present") {
39
+ if (value == null) throw new Error(message);
40
+ return value;
41
+ }
42
+ function isObject(value) {
43
+ return typeof value === "object" && value !== null && !Array.isArray(value);
44
+ }
45
+ //#endregion
46
+ export { ESLintUtils, RuleCreator, applyDefault, deepMerge, getParserServices, nullThrows };
47
+
48
+ //# sourceMappingURL=eslint_utils.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"eslint_utils.js","names":[],"sources":["../ts/eslint_utils.ts"],"sourcesContent":["import { getParserServices } from \"./parser_services\";\nimport { decorateRule } from \"./plugin\";\nimport type { ContextWithParserOptions } from \"./types\";\n\n/**\n * Self-hosted `typescript-eslint`-style utility surface that swaps parser\n * service access over to tsgo-backed implementations.\n */\nexport const ESLintUtils = Object.freeze({\n RuleCreator(urlCreator: (ruleName: string) => string) {\n return (rule: any) => {\n const docs = rule.meta?.docs;\n return decorateRule({\n ...rule,\n meta: {\n ...rule.meta,\n docs: {\n ...docs,\n url: urlCreator(rule.name),\n },\n },\n defaultOptions: rule.defaultOptions ?? [],\n } as never);\n };\n },\n getParserServices(context: ContextWithParserOptions, allowWithoutFullTypeInformation = false) {\n return getParserServices(context, allowWithoutFullTypeInformation);\n },\n});\n\nexport const RuleCreator = ESLintUtils.RuleCreator;\nexport { getParserServices } from \"./parser_services\";\n\nexport function applyDefault<\n Values extends readonly unknown[],\n Defaults extends readonly unknown[],\n>(values: Values | undefined, defaults: Defaults): readonly unknown[] {\n return deepMerge(defaults, values ?? []) as readonly unknown[];\n}\n\nexport function deepMerge<T>(base: T, override: unknown): T {\n if (Array.isArray(base) && Array.isArray(override)) {\n return base.map((value, index) => deepMerge(value, override[index])) as unknown as T;\n }\n if (isObject(base) && isObject(override)) {\n return Object.fromEntries(\n [...new Set([...Object.keys(base), ...Object.keys(override)])].map((key) => [\n key,\n deepMerge((base as any)[key], (override as any)[key]),\n ]),\n ) as T;\n }\n return (override ?? base) as T;\n}\n\nexport function nullThrows<T>(\n value: T | null | undefined,\n message = \"Expected value to be present\",\n): T {\n if (value == null) {\n throw new Error(message);\n }\n return value;\n}\n\nfunction isObject(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n"],"mappings":";;;;;;;AAQA,MAAa,cAAc,OAAO,OAAO;CACvC,YAAY,YAA0C;AACpD,UAAQ,SAAc;GACpB,MAAM,OAAO,KAAK,MAAM;AACxB,UAAO,aAAa;IAClB,GAAG;IACH,MAAM;KACJ,GAAG,KAAK;KACR,MAAM;MACJ,GAAG;MACH,KAAK,WAAW,KAAK,KAAK;MAC3B;KACF;IACD,gBAAgB,KAAK,kBAAkB,EAAE;IAC1C,CAAU;;;CAGf,kBAAkB,SAAmC,kCAAkC,OAAO;AAC5F,SAAO,kBAAkB,SAAS,gCAAgC;;CAErE,CAAC;AAEF,MAAa,cAAc,YAAY;AAGvC,SAAgB,aAGd,QAA4B,UAAwC;AACpE,QAAO,UAAU,UAAU,UAAU,EAAE,CAAC;;AAG1C,SAAgB,UAAa,MAAS,UAAsB;AAC1D,KAAI,MAAM,QAAQ,KAAK,IAAI,MAAM,QAAQ,SAAS,CAChD,QAAO,KAAK,KAAK,OAAO,UAAU,UAAU,OAAO,SAAS,OAAO,CAAC;AAEtE,KAAI,SAAS,KAAK,IAAI,SAAS,SAAS,CACtC,QAAO,OAAO,YACZ,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,OAAO,KAAK,KAAK,EAAE,GAAG,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,KAAK,QAAQ,CAC1E,KACA,UAAW,KAAa,MAAO,SAAiB,KAAK,CACtD,CAAC,CACH;AAEH,QAAQ,YAAY;;AAGtB,SAAgB,WACd,OACA,UAAU,gCACP;AACH,KAAI,SAAS,KACX,OAAM,IAAI,MAAM,QAAQ;AAE1B,QAAO;;AAGT,SAAS,SAAS,OAAkD;AAClE,QAAO,OAAO,UAAU,YAAY,UAAU,QAAQ,CAAC,MAAM,QAAQ,MAAM"}
@@ -0,0 +1,12 @@
1
+ import { ast_utils_d_exports } from "./ast_utils.js";
2
+ import { ContextWithParserOptions, ParserServices, ParserServicesWithTypeInformation, ProjectServiceOptions, TsgoNode, TsgoProgramShape, TsgoSignature, TsgoSymbol, TsgoType, TsgoTypeCheckerShape, TypeAwareParserOptions } from "./types.js";
3
+ import { AST_NODE_TYPES, AST_TOKEN_TYPES, TSESTree } from "./compat.js";
4
+ import { getParserServices } from "./parser_services.js";
5
+ import { ESLintUtils, RuleCreator } from "./eslint_utils.js";
6
+ import { json_schema_d_exports } from "./json_schema.js";
7
+ import { ts_eslint_d_exports, tseslint } from "./ts_eslint.js";
8
+ import { utils_d_exports } from "./utils.js";
9
+ import { definePlugin, defineRule, eslintCompatPlugin } from "./plugin.js";
10
+ import { RuleTester } from "./rule_tester.js";
11
+ import { index_d_exports } from "./rules/index.js";
12
+ export { ast_utils_d_exports as ASTUtils, AST_NODE_TYPES, AST_TOKEN_TYPES, type ContextWithParserOptions, ESLintUtils, json_schema_d_exports as JSONSchema, type ParserServices, type ParserServicesWithTypeInformation, type ProjectServiceOptions, RuleCreator, RuleTester, ts_eslint_d_exports as TSESLint, TSESTree, type TsgoNode, type TsgoProgramShape, type TsgoSignature, type TsgoSymbol, type TsgoType, type TsgoTypeCheckerShape, type TypeAwareParserOptions, utils_d_exports as Utils, definePlugin, defineRule, eslintCompatPlugin, getParserServices, index_d_exports as rules, tseslint };
package/dist/index.js ADDED
@@ -0,0 +1,11 @@
1
+ import { ast_utils_exports } from "./ast_utils.js";
2
+ import { AST_NODE_TYPES, AST_TOKEN_TYPES, TSESTree } from "./compat.js";
3
+ import { getParserServices } from "./parser_services.js";
4
+ import { definePlugin, defineRule, eslintCompatPlugin } from "./plugin.js";
5
+ import { ESLintUtils, RuleCreator } from "./eslint_utils.js";
6
+ import { json_schema_exports } from "./json_schema.js";
7
+ import { ts_eslint_exports, tseslint } from "./ts_eslint.js";
8
+ import { utils_exports } from "./utils.js";
9
+ import { RuleTester } from "./rule_tester.js";
10
+ import { rules_exports } from "./rules/index.js";
11
+ export { ast_utils_exports as ASTUtils, AST_NODE_TYPES, AST_TOKEN_TYPES, ESLintUtils, json_schema_exports as JSONSchema, RuleCreator, RuleTester, ts_eslint_exports as TSESLint, TSESTree, utils_exports as Utils, definePlugin, defineRule, eslintCompatPlugin, getParserServices, rules_exports as rules, tseslint };
@@ -0,0 +1,11 @@
1
+ declare namespace json_schema_d_exports {
2
+ export { JSONSchema, JSONSchema4, tupleSchema };
3
+ }
4
+ type JSONSchema4 = Record<string, unknown>;
5
+ declare function tupleSchema(...items: readonly JSONSchema4[]): JSONSchema4;
6
+ declare const JSONSchema: Readonly<{
7
+ tupleSchema: typeof tupleSchema;
8
+ }>;
9
+ //#endregion
10
+ export { JSONSchema, JSONSchema4, json_schema_d_exports, tupleSchema };
11
+ //# sourceMappingURL=json_schema.d.ts.map
@@ -0,0 +1,17 @@
1
+ import { __exportAll } from "./_virtual/_rolldown/runtime.js";
2
+ //#region src/bindings/nodejs/typescript_oxlint/ts/json_schema.ts
3
+ var json_schema_exports = /* @__PURE__ */ __exportAll({
4
+ JSONSchema: () => JSONSchema,
5
+ tupleSchema: () => tupleSchema
6
+ });
7
+ function tupleSchema(...items) {
8
+ return {
9
+ items,
10
+ type: "array"
11
+ };
12
+ }
13
+ const JSONSchema = Object.freeze({ tupleSchema });
14
+ //#endregion
15
+ export { JSONSchema, json_schema_exports, tupleSchema };
16
+
17
+ //# sourceMappingURL=json_schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json_schema.js","names":[],"sources":["../ts/json_schema.ts"],"sourcesContent":["export type JSONSchema4 = Record<string, unknown>;\n\nexport function tupleSchema(...items: readonly JSONSchema4[]): JSONSchema4 {\n return {\n items,\n type: \"array\",\n };\n}\n\nexport const JSONSchema = Object.freeze({\n tupleSchema,\n});\n"],"mappings":";;;;;;AAEA,SAAgB,YAAY,GAAG,OAA4C;AACzE,QAAO;EACL;EACA,MAAM;EACP;;AAGH,MAAa,aAAa,OAAO,OAAO,EACtC,aACD,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { ContextWithParserOptions, TsgoNode } from "./types.js";
2
+ import { Node } from "@oxlint/plugins";
3
+
4
+ //#region src/bindings/nodejs/typescript_oxlint/ts/node_map.d.ts
5
+ declare function createNodeMaps(context: ContextWithParserOptions): {
6
+ esTreeNodeToTSNodeMap: {
7
+ get(node: Node): TsgoNode;
8
+ has(node: Node): boolean;
9
+ };
10
+ tsNodeToESTreeNodeMap: {
11
+ get(node: TsgoNode): Node;
12
+ has(node: TsgoNode): boolean;
13
+ };
14
+ };
15
+ declare function toPosition(node: Node | TsgoNode): number;
16
+ //#endregion
17
+ export { createNodeMaps, toPosition };
18
+ //# sourceMappingURL=node_map.d.ts.map
@@ -0,0 +1,52 @@
1
+ //#region src/bindings/nodejs/typescript_oxlint/ts/node_map.ts
2
+ const estreeToTsgo = /* @__PURE__ */ new WeakMap();
3
+ const tsgoToEstree = /* @__PURE__ */ new WeakMap();
4
+ function createNodeMaps(context) {
5
+ return {
6
+ esTreeNodeToTSNodeMap: {
7
+ get(node) {
8
+ let current = estreeToTsgo.get(node);
9
+ if (!current) {
10
+ current = createTsgoNode(context.filename, node);
11
+ estreeToTsgo.set(node, current);
12
+ tsgoToEstree.set(current, node);
13
+ }
14
+ return current;
15
+ },
16
+ has(node) {
17
+ return estreeToTsgo.has(node);
18
+ }
19
+ },
20
+ tsNodeToESTreeNodeMap: {
21
+ get(node) {
22
+ const value = tsgoToEstree.get(node);
23
+ if (!value) throw new Error("oxlint-plugin-typescript-go could not map tsgo node back to ESTree");
24
+ return value;
25
+ },
26
+ has(node) {
27
+ return tsgoToEstree.has(node);
28
+ }
29
+ }
30
+ };
31
+ }
32
+ function toPosition(node) {
33
+ return "pos" in node ? node.pos : assertRange(node)[0];
34
+ }
35
+ function createTsgoNode(fileName, node) {
36
+ const [pos, end] = assertRange(node);
37
+ return {
38
+ fileName,
39
+ pos,
40
+ end,
41
+ range: [pos, end]
42
+ };
43
+ }
44
+ function assertRange(node) {
45
+ const range = node.range;
46
+ if (!range) throw new Error("oxlint-plugin-typescript-go requires ESTree nodes with range data");
47
+ return range;
48
+ }
49
+ //#endregion
50
+ export { createNodeMaps, toPosition };
51
+
52
+ //# sourceMappingURL=node_map.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"node_map.js","names":[],"sources":["../ts/node_map.ts"],"sourcesContent":["import type { Node } from \"@oxlint/plugins\";\n\nimport type { ContextWithParserOptions, TsgoNode } from \"./types\";\n\nconst estreeToTsgo = new WeakMap<object, TsgoNode>();\nconst tsgoToEstree = new WeakMap<object, Node>();\n\nexport function createNodeMaps(context: ContextWithParserOptions): {\n esTreeNodeToTSNodeMap: {\n get(node: Node): TsgoNode;\n has(node: Node): boolean;\n };\n tsNodeToESTreeNodeMap: {\n get(node: TsgoNode): Node;\n has(node: TsgoNode): boolean;\n };\n} {\n return {\n esTreeNodeToTSNodeMap: {\n get(node) {\n let current = estreeToTsgo.get(node);\n if (!current) {\n current = createTsgoNode(context.filename, node);\n estreeToTsgo.set(node, current);\n tsgoToEstree.set(current, node);\n }\n return current;\n },\n has(node) {\n return estreeToTsgo.has(node);\n },\n },\n tsNodeToESTreeNodeMap: {\n get(node) {\n const value = tsgoToEstree.get(node);\n if (!value) {\n throw new Error(\"oxlint-plugin-typescript-go could not map tsgo node back to ESTree\");\n }\n return value;\n },\n has(node) {\n return tsgoToEstree.has(node);\n },\n },\n };\n}\n\nexport function toPosition(node: Node | TsgoNode): number {\n return \"pos\" in node ? node.pos : assertRange(node)[0];\n}\n\nfunction createTsgoNode(fileName: string, node: Node): TsgoNode {\n const [pos, end] = assertRange(node);\n return {\n fileName,\n pos,\n end,\n range: [pos, end],\n };\n}\n\nfunction assertRange(node: Node): readonly [number, number] {\n const range = (node as Node & { range?: readonly [number, number] }).range;\n if (!range) {\n throw new Error(\"oxlint-plugin-typescript-go requires ESTree nodes with range data\");\n }\n return range;\n}\n"],"mappings":";AAIA,MAAM,+BAAe,IAAI,SAA2B;AACpD,MAAM,+BAAe,IAAI,SAAuB;AAEhD,SAAgB,eAAe,SAS7B;AACA,QAAO;EACL,uBAAuB;GACrB,IAAI,MAAM;IACR,IAAI,UAAU,aAAa,IAAI,KAAK;AACpC,QAAI,CAAC,SAAS;AACZ,eAAU,eAAe,QAAQ,UAAU,KAAK;AAChD,kBAAa,IAAI,MAAM,QAAQ;AAC/B,kBAAa,IAAI,SAAS,KAAK;;AAEjC,WAAO;;GAET,IAAI,MAAM;AACR,WAAO,aAAa,IAAI,KAAK;;GAEhC;EACD,uBAAuB;GACrB,IAAI,MAAM;IACR,MAAM,QAAQ,aAAa,IAAI,KAAK;AACpC,QAAI,CAAC,MACH,OAAM,IAAI,MAAM,qEAAqE;AAEvF,WAAO;;GAET,IAAI,MAAM;AACR,WAAO,aAAa,IAAI,KAAK;;GAEhC;EACF;;AAGH,SAAgB,WAAW,MAA+B;AACxD,QAAO,SAAS,OAAO,KAAK,MAAM,YAAY,KAAK,CAAC;;AAGtD,SAAS,eAAe,UAAkB,MAAsB;CAC9D,MAAM,CAAC,KAAK,OAAO,YAAY,KAAK;AACpC,QAAO;EACL;EACA;EACA;EACA,OAAO,CAAC,KAAK,IAAI;EAClB;;AAGH,SAAS,YAAY,MAAuC;CAC1D,MAAM,QAAS,KAAsD;AACrE,KAAI,CAAC,MACH,OAAM,IAAI,MAAM,oEAAoE;AAEtF,QAAO"}
@@ -0,0 +1,16 @@
1
+ import { ContextWithParserOptions, ParserServices } from "./types.js";
2
+
3
+ //#region src/bindings/nodejs/typescript_oxlint/ts/parser_services.d.ts
4
+ /**
5
+ * Returns `typescript-eslint`-style parser services backed by tsgo.
6
+ *
7
+ * @example
8
+ * ```ts
9
+ * const services = getParserServices(context);
10
+ * const checker = services.program.getTypeChecker();
11
+ * ```
12
+ */
13
+ declare function getParserServices(context: ContextWithParserOptions, allowWithoutFullTypeInformation?: boolean): ParserServices;
14
+ //#endregion
15
+ export { getParserServices };
16
+ //# sourceMappingURL=parser_services.d.ts.map
@@ -0,0 +1,48 @@
1
+ import { createNodeMaps } from "./node_map.js";
2
+ import { createProgram, createTypeChecker } from "./checker.js";
3
+ //#region src/bindings/nodejs/typescript_oxlint/ts/parser_services.ts
4
+ const parserServices = /* @__PURE__ */ new WeakMap();
5
+ /**
6
+ * Returns `typescript-eslint`-style parser services backed by tsgo.
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * const services = getParserServices(context);
11
+ * const checker = services.program.getTypeChecker();
12
+ * ```
13
+ */
14
+ function getParserServices(context, allowWithoutFullTypeInformation = false) {
15
+ const current = parserServices.get(context);
16
+ if (current) return current;
17
+ try {
18
+ const maps = createNodeMaps(context);
19
+ const services = {
20
+ program: createProgram(context),
21
+ ...maps,
22
+ hasFullTypeInformation: true,
23
+ getTypeAtLocation(node) {
24
+ return createTypeChecker(context).getTypeAtLocation(node);
25
+ },
26
+ getSymbolAtLocation(node) {
27
+ return createTypeChecker(context).getSymbolAtLocation(node);
28
+ }
29
+ };
30
+ parserServices.set(context, services);
31
+ return services;
32
+ } catch (error) {
33
+ if (!allowWithoutFullTypeInformation) throw error;
34
+ const fallback = {
35
+ program: createProgram(context),
36
+ ...createNodeMaps(context),
37
+ hasFullTypeInformation: false,
38
+ getTypeAtLocation() {},
39
+ getSymbolAtLocation() {}
40
+ };
41
+ parserServices.set(context, fallback);
42
+ return fallback;
43
+ }
44
+ }
45
+ //#endregion
46
+ export { getParserServices };
47
+
48
+ //# sourceMappingURL=parser_services.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser_services.js","names":[],"sources":["../ts/parser_services.ts"],"sourcesContent":["import { createProgram, createTypeChecker } from \"./checker\";\nimport { createNodeMaps } from \"./node_map\";\nimport type {\n ContextWithParserOptions,\n ParserServices,\n ParserServicesWithTypeInformation,\n} from \"./types\";\n\nconst parserServices = new WeakMap<object, ParserServices>();\n\n/**\n * Returns `typescript-eslint`-style parser services backed by tsgo.\n *\n * @example\n * ```ts\n * const services = getParserServices(context);\n * const checker = services.program.getTypeChecker();\n * ```\n */\nexport function getParserServices(\n context: ContextWithParserOptions,\n allowWithoutFullTypeInformation = false,\n): ParserServices {\n const current = parserServices.get(context);\n if (current) {\n return current;\n }\n try {\n const maps = createNodeMaps(context);\n const program = createProgram(context);\n const services: ParserServicesWithTypeInformation = {\n program,\n ...maps,\n hasFullTypeInformation: true,\n getTypeAtLocation(node) {\n return createTypeChecker(context).getTypeAtLocation(node);\n },\n getSymbolAtLocation(node) {\n return createTypeChecker(context).getSymbolAtLocation(node);\n },\n };\n parserServices.set(context, services);\n return services;\n } catch (error) {\n if (!allowWithoutFullTypeInformation) {\n throw error;\n }\n const fallback: ParserServices = {\n program: createProgram(context),\n ...createNodeMaps(context),\n hasFullTypeInformation: false,\n getTypeAtLocation() {\n return undefined;\n },\n getSymbolAtLocation() {\n return undefined;\n },\n };\n parserServices.set(context, fallback);\n return fallback;\n }\n}\n"],"mappings":";;;AAQA,MAAM,iCAAiB,IAAI,SAAiC;;;;;;;;;;AAW5D,SAAgB,kBACd,SACA,kCAAkC,OAClB;CAChB,MAAM,UAAU,eAAe,IAAI,QAAQ;AAC3C,KAAI,QACF,QAAO;AAET,KAAI;EACF,MAAM,OAAO,eAAe,QAAQ;EAEpC,MAAM,WAA8C;GAClD,SAFc,cAAc,QAAQ;GAGpC,GAAG;GACH,wBAAwB;GACxB,kBAAkB,MAAM;AACtB,WAAO,kBAAkB,QAAQ,CAAC,kBAAkB,KAAK;;GAE3D,oBAAoB,MAAM;AACxB,WAAO,kBAAkB,QAAQ,CAAC,oBAAoB,KAAK;;GAE9D;AACD,iBAAe,IAAI,SAAS,SAAS;AACrC,SAAO;UACA,OAAO;AACd,MAAI,CAAC,gCACH,OAAM;EAER,MAAM,WAA2B;GAC/B,SAAS,cAAc,QAAQ;GAC/B,GAAG,eAAe,QAAQ;GAC1B,wBAAwB;GACxB,oBAAoB;GAGpB,sBAAsB;GAGvB;AACD,iBAAe,IAAI,SAAS,SAAS;AACrC,SAAO"}
@@ -0,0 +1,26 @@
1
+ import { Plugin, Rule } from "@oxlint/plugins";
2
+
3
+ //#region src/bindings/nodejs/typescript_oxlint/ts/plugin.d.ts
4
+ type PluginShape = Plugin;
5
+ type RuleShape = Rule;
6
+ declare function definePlugin<Plugin extends PluginShape>(plugin: Plugin): Plugin;
7
+ /**
8
+ * Defines a single Oxlint rule with `typescript-eslint`-style parser services.
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * export default defineRule({
13
+ * meta: { schema: [], messages: { demo: "demo" } },
14
+ * create(context) {
15
+ * const services = context.parserServices;
16
+ * return {};
17
+ * },
18
+ * });
19
+ * ```
20
+ */
21
+ declare function defineRule<Rule extends RuleShape>(rule: Rule): Rule;
22
+ declare function eslintCompatPlugin<Plugin extends PluginShape>(plugin: Plugin): Plugin;
23
+ declare function decorateRule<Rule extends RuleShape>(rule: Rule): Rule;
24
+ //#endregion
25
+ export { decorateRule, definePlugin, defineRule, eslintCompatPlugin };
26
+ //# sourceMappingURL=plugin.d.ts.map
package/dist/plugin.js ADDED
@@ -0,0 +1,83 @@
1
+ import { resolveTypeAwareParserOptions } from "./context.js";
2
+ import { getParserServices } from "./parser_services.js";
3
+ import { definePlugin as definePlugin$1, defineRule as defineRule$1, eslintCompatPlugin as eslintCompatPlugin$1 } from "@oxlint/plugins";
4
+ //#region src/bindings/nodejs/typescript_oxlint/ts/plugin.ts
5
+ function definePlugin(plugin) {
6
+ return definePlugin$1({
7
+ ...plugin,
8
+ rules: wrapRules(plugin.rules ?? {})
9
+ });
10
+ }
11
+ /**
12
+ * Defines a single Oxlint rule with `typescript-eslint`-style parser services.
13
+ *
14
+ * @example
15
+ * ```ts
16
+ * export default defineRule({
17
+ * meta: { schema: [], messages: { demo: "demo" } },
18
+ * create(context) {
19
+ * const services = context.parserServices;
20
+ * return {};
21
+ * },
22
+ * });
23
+ * ```
24
+ */
25
+ function defineRule(rule) {
26
+ return defineRule$1(decorateRule(rule));
27
+ }
28
+ function eslintCompatPlugin(plugin) {
29
+ return eslintCompatPlugin$1(definePlugin(plugin));
30
+ }
31
+ function decorateRule(rule) {
32
+ if (rule.create) return {
33
+ ...rule,
34
+ create(context) {
35
+ return rule.create(decorateContext(context));
36
+ }
37
+ };
38
+ if ("createOnce" in rule && typeof rule.createOnce === "function") return {
39
+ ...rule,
40
+ createOnce(context) {
41
+ return rule.createOnce(decorateContext(context));
42
+ }
43
+ };
44
+ return rule;
45
+ }
46
+ function wrapRules(rules) {
47
+ return Object.fromEntries(Object.entries(rules).map(([name, rule]) => [name, decorateRule(rule)]));
48
+ }
49
+ function decorateContext(context) {
50
+ const parserOptions = Object.freeze(resolveTypeAwareParserOptions(context));
51
+ const baseLanguageOptions = context.languageOptions;
52
+ const languageOptions = Object.freeze({
53
+ ...baseLanguageOptions,
54
+ parserOptions
55
+ });
56
+ return Object.create(context, {
57
+ languageOptions: {
58
+ configurable: true,
59
+ enumerable: true,
60
+ get() {
61
+ return languageOptions;
62
+ }
63
+ },
64
+ parserOptions: {
65
+ configurable: true,
66
+ enumerable: false,
67
+ get() {
68
+ return parserOptions;
69
+ }
70
+ },
71
+ parserServices: {
72
+ configurable: true,
73
+ enumerable: false,
74
+ get() {
75
+ return getParserServices(context);
76
+ }
77
+ }
78
+ });
79
+ }
80
+ //#endregion
81
+ export { decorateRule, definePlugin, defineRule, eslintCompatPlugin };
82
+
83
+ //# sourceMappingURL=plugin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"plugin.js","names":["defineOxlintPlugin","defineOxlintRule","oxlintEslintCompatPlugin"],"sources":["../ts/plugin.ts"],"sourcesContent":["import {\n type Context as OxlintContext,\n type Plugin as OxlintPlugin,\n type Rule as OxlintRule,\n definePlugin as defineOxlintPlugin,\n defineRule as defineOxlintRule,\n eslintCompatPlugin as oxlintEslintCompatPlugin,\n} from \"@oxlint/plugins\";\n\nimport { resolveTypeAwareParserOptions } from \"./context\";\nimport { getParserServices } from \"./parser_services\";\nimport type { ContextWithParserOptions, ParserServices } from \"./types\";\n\ntype PluginShape = OxlintPlugin;\ntype RuleShape = OxlintRule;\n\nexport function definePlugin<Plugin extends PluginShape>(plugin: Plugin): Plugin {\n return defineOxlintPlugin({\n ...plugin,\n rules: wrapRules(plugin.rules ?? {}),\n } as OxlintPlugin) as Plugin;\n}\n\n/**\n * Defines a single Oxlint rule with `typescript-eslint`-style parser services.\n *\n * @example\n * ```ts\n * export default defineRule({\n * meta: { schema: [], messages: { demo: \"demo\" } },\n * create(context) {\n * const services = context.parserServices;\n * return {};\n * },\n * });\n * ```\n */\nexport function defineRule<Rule extends RuleShape>(rule: Rule): Rule {\n return defineOxlintRule(decorateRule(rule) as OxlintRule) as Rule;\n}\n\nexport function eslintCompatPlugin<Plugin extends PluginShape>(plugin: Plugin): Plugin {\n return oxlintEslintCompatPlugin(definePlugin(plugin)) as Plugin;\n}\n\nexport function decorateRule<Rule extends RuleShape>(rule: Rule): Rule {\n if (rule.create) {\n return {\n ...rule,\n create(context) {\n return rule.create!(decorateContext(context));\n },\n } as Rule;\n }\n if (\"createOnce\" in rule && typeof (rule as any).createOnce === \"function\") {\n return {\n ...rule,\n createOnce(context) {\n return (rule as any).createOnce(decorateContext(context));\n },\n } as Rule;\n }\n return rule;\n}\n\nfunction wrapRules(rules: Record<string, RuleShape>): Record<string, RuleShape> {\n return Object.fromEntries(\n Object.entries(rules).map(([name, rule]) => [name, decorateRule(rule)]),\n );\n}\n\nfunction decorateContext(context: ContextWithParserOptions): ContextWithParserOptions {\n const parserOptions = Object.freeze(resolveTypeAwareParserOptions(context));\n const baseLanguageOptions = context.languageOptions;\n const languageOptions = Object.freeze({\n ...baseLanguageOptions,\n parserOptions,\n });\n return Object.create(context as OxlintContext, {\n languageOptions: {\n configurable: true,\n enumerable: true,\n get() {\n return languageOptions;\n },\n },\n parserOptions: {\n configurable: true,\n enumerable: false,\n get() {\n return parserOptions;\n },\n },\n parserServices: {\n configurable: true,\n enumerable: false,\n get(): ParserServices {\n return getParserServices(context);\n },\n },\n }) as ContextWithParserOptions;\n}\n"],"mappings":";;;;AAgBA,SAAgB,aAAyC,QAAwB;AAC/E,QAAOA,eAAmB;EACxB,GAAG;EACH,OAAO,UAAU,OAAO,SAAS,EAAE,CAAC;EACrC,CAAiB;;;;;;;;;;;;;;;;AAiBpB,SAAgB,WAAmC,MAAkB;AACnE,QAAOC,aAAiB,aAAa,KAAK,CAAe;;AAG3D,SAAgB,mBAA+C,QAAwB;AACrF,QAAOC,qBAAyB,aAAa,OAAO,CAAC;;AAGvD,SAAgB,aAAqC,MAAkB;AACrE,KAAI,KAAK,OACP,QAAO;EACL,GAAG;EACH,OAAO,SAAS;AACd,UAAO,KAAK,OAAQ,gBAAgB,QAAQ,CAAC;;EAEhD;AAEH,KAAI,gBAAgB,QAAQ,OAAQ,KAAa,eAAe,WAC9D,QAAO;EACL,GAAG;EACH,WAAW,SAAS;AAClB,UAAQ,KAAa,WAAW,gBAAgB,QAAQ,CAAC;;EAE5D;AAEH,QAAO;;AAGT,SAAS,UAAU,OAA6D;AAC9E,QAAO,OAAO,YACZ,OAAO,QAAQ,MAAM,CAAC,KAAK,CAAC,MAAM,UAAU,CAAC,MAAM,aAAa,KAAK,CAAC,CAAC,CACxE;;AAGH,SAAS,gBAAgB,SAA6D;CACpF,MAAM,gBAAgB,OAAO,OAAO,8BAA8B,QAAQ,CAAC;CAC3E,MAAM,sBAAsB,QAAQ;CACpC,MAAM,kBAAkB,OAAO,OAAO;EACpC,GAAG;EACH;EACD,CAAC;AACF,QAAO,OAAO,OAAO,SAA0B;EAC7C,iBAAiB;GACf,cAAc;GACd,YAAY;GACZ,MAAM;AACJ,WAAO;;GAEV;EACD,eAAe;GACb,cAAc;GACd,YAAY;GACZ,MAAM;AACJ,WAAO;;GAEV;EACD,gBAAgB;GACd,cAAc;GACd,YAAY;GACZ,MAAsB;AACpB,WAAO,kBAAkB,QAAQ;;GAEpC;EACF,CAAC"}
@@ -0,0 +1,12 @@
1
+ import { ContextWithParserOptions } from "./types.js";
2
+ import { resolveProjectConfig } from "./context.js";
3
+ import { TsgoProjectSession } from "./session.js";
4
+
5
+ //#region src/bindings/nodejs/typescript_oxlint/ts/registry.d.ts
6
+ declare function sessionForContext(context: ContextWithParserOptions): {
7
+ project: ReturnType<typeof resolveProjectConfig>;
8
+ session: TsgoProjectSession;
9
+ };
10
+ //#endregion
11
+ export { sessionForContext };
12
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1,35 @@
1
+ import { resolveProjectConfig } from "./context.js";
2
+ import { TsgoProjectSession } from "./session.js";
3
+ //#region src/bindings/nodejs/typescript_oxlint/ts/registry.ts
4
+ const sessions = /* @__PURE__ */ new Map();
5
+ let installedExitHook = false;
6
+ function sessionForContext(context) {
7
+ const project = resolveProjectConfig(context);
8
+ const key = [
9
+ project.configPath,
10
+ project.runtime.executable,
11
+ project.runtime.cwd,
12
+ project.runtime.mode
13
+ ].join("::");
14
+ let session = sessions.get(key);
15
+ if (!session) {
16
+ session = new TsgoProjectSession(project, project.runtime);
17
+ sessions.set(key, session);
18
+ }
19
+ installExitHook();
20
+ return {
21
+ project,
22
+ session
23
+ };
24
+ }
25
+ function installExitHook() {
26
+ if (installedExitHook) return;
27
+ installedExitHook = true;
28
+ process.on("exit", () => {
29
+ for (const session of sessions.values()) session.close();
30
+ });
31
+ }
32
+ //#endregion
33
+ export { sessionForContext };
34
+
35
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","names":[],"sources":["../ts/registry.ts"],"sourcesContent":["import type { ContextWithParserOptions } from \"./types\";\nimport { resolveProjectConfig } from \"./context\";\nimport { TsgoProjectSession } from \"./session\";\n\nconst sessions = new Map<string, TsgoProjectSession>();\nlet installedExitHook = false;\n\nexport function sessionForContext(context: ContextWithParserOptions): {\n project: ReturnType<typeof resolveProjectConfig>;\n session: TsgoProjectSession;\n} {\n const project = resolveProjectConfig(context);\n const key = [\n project.configPath,\n project.runtime.executable,\n project.runtime.cwd,\n project.runtime.mode,\n ].join(\"::\");\n let session = sessions.get(key);\n if (!session) {\n session = new TsgoProjectSession(project, project.runtime);\n sessions.set(key, session);\n }\n installExitHook();\n return { project, session };\n}\n\nfunction installExitHook(): void {\n if (installedExitHook) {\n return;\n }\n installedExitHook = true;\n process.on(\"exit\", () => {\n for (const session of sessions.values()) {\n session.close();\n }\n });\n}\n"],"mappings":";;;AAIA,MAAM,2BAAW,IAAI,KAAiC;AACtD,IAAI,oBAAoB;AAExB,SAAgB,kBAAkB,SAGhC;CACA,MAAM,UAAU,qBAAqB,QAAQ;CAC7C,MAAM,MAAM;EACV,QAAQ;EACR,QAAQ,QAAQ;EAChB,QAAQ,QAAQ;EAChB,QAAQ,QAAQ;EACjB,CAAC,KAAK,KAAK;CACZ,IAAI,UAAU,SAAS,IAAI,IAAI;AAC/B,KAAI,CAAC,SAAS;AACZ,YAAU,IAAI,mBAAmB,SAAS,QAAQ,QAAQ;AAC1D,WAAS,IAAI,KAAK,QAAQ;;AAE5B,kBAAiB;AACjB,QAAO;EAAE;EAAS;EAAS;;AAG7B,SAAS,kBAAwB;AAC/B,KAAI,kBACF;AAEF,qBAAoB;AACpB,SAAQ,GAAG,cAAc;AACvB,OAAK,MAAM,WAAW,SAAS,QAAQ,CACrC,SAAQ,OAAO;GAEjB"}