catlint 1.2.1 → 2.0.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 (143) hide show
  1. package/dist/cjs/cli/commands/init.d.ts +1 -0
  2. package/dist/cjs/cli/commands/lint.d.ts +1 -0
  3. package/dist/cjs/cli/index.d.ts +2 -0
  4. package/dist/cjs/config/api/defineConfig.d.ts +2 -0
  5. package/dist/cjs/config/api/loadConfig.d.ts +3 -0
  6. package/dist/cjs/config/index.d.ts +3 -0
  7. package/dist/cjs/config/types/config.d.ts +17 -0
  8. package/dist/cjs/config/types/configAdapter.d.ts +2 -0
  9. package/dist/cjs/core/api/index.d.ts +3 -0
  10. package/dist/cjs/core/api/lintProject.d.ts +2 -0
  11. package/dist/cjs/core/api/linter.d.ts +5 -0
  12. package/dist/cjs/core/index.d.ts +2 -0
  13. package/dist/cjs/core/models/index.d.ts +1 -0
  14. package/dist/cjs/core/models/lintResult/index.d.ts +1 -0
  15. package/dist/cjs/core/models/lintResult/model.d.ts +7 -0
  16. package/dist/cjs/index.d.ts +4 -0
  17. package/dist/cjs/ir/index.d.ts +1 -0
  18. package/dist/cjs/ir/models/File.d.ts +6 -0
  19. package/dist/cjs/ir/models/IRParser.d.ts +2 -0
  20. package/dist/cjs/ir/models/Node.d.ts +13 -0
  21. package/dist/cjs/ir/models/index.d.ts +3 -0
  22. package/dist/cjs/rules/helpers/defaultAdapter.d.ts +9 -0
  23. package/dist/cjs/rules/index.d.ts +1 -0
  24. package/dist/cjs/rules/models/index.d.ts +2 -0
  25. package/dist/cjs/rules/models/message/index.d.ts +1 -0
  26. package/dist/cjs/rules/models/message/model.d.ts +10 -0
  27. package/dist/cjs/rules/models/rule/index.d.ts +2 -0
  28. package/dist/cjs/rules/models/rule/model.d.ts +12 -0
  29. package/dist/cjs/rules/models/rule/service.d.ts +2 -0
  30. package/dist/cjs/shared/pattern/loadFiles.d.ts +1 -0
  31. package/dist/esm/cli/commands/init.d.ts +1 -0
  32. package/dist/esm/cli/commands/init.js +18 -0
  33. package/dist/esm/cli/commands/lint.d.ts +1 -0
  34. package/dist/esm/cli/commands/lint.js +6 -0
  35. package/dist/esm/cli/index.d.ts +2 -0
  36. package/dist/esm/cli/index.js +15 -0
  37. package/dist/esm/config/api/defineConfig.d.ts +2 -0
  38. package/dist/esm/config/api/defineConfig.js +8 -0
  39. package/dist/esm/config/api/loadConfig.d.ts +3 -0
  40. package/dist/esm/config/api/loadConfig.js +22 -0
  41. package/dist/esm/config/index.d.ts +3 -0
  42. package/dist/esm/config/index.js +3 -0
  43. package/dist/esm/config/types/config.d.ts +17 -0
  44. package/dist/esm/config/types/config.js +8 -0
  45. package/dist/esm/config/types/configAdapter.d.ts +2 -0
  46. package/dist/esm/config/types/configAdapter.js +8 -0
  47. package/dist/esm/core/api/index.d.ts +3 -0
  48. package/dist/esm/core/api/index.js +3 -0
  49. package/dist/esm/core/api/lintProject.d.ts +2 -0
  50. package/dist/esm/core/api/lintProject.js +16 -0
  51. package/dist/esm/core/api/linter.d.ts +5 -0
  52. package/dist/esm/core/api/linter.js +15 -0
  53. package/dist/esm/core/index.d.ts +2 -0
  54. package/dist/esm/core/index.js +2 -0
  55. package/dist/esm/core/models/index.d.ts +1 -0
  56. package/dist/esm/core/models/index.js +1 -0
  57. package/dist/esm/core/models/lintResult/index.d.ts +1 -0
  58. package/dist/esm/core/models/lintResult/index.js +1 -0
  59. package/dist/esm/core/models/lintResult/model.d.ts +7 -0
  60. package/dist/esm/core/models/lintResult/model.js +1 -0
  61. package/dist/esm/index.d.ts +4 -0
  62. package/dist/esm/index.js +4 -0
  63. package/dist/esm/ir/index.d.ts +1 -0
  64. package/dist/esm/ir/index.js +1 -0
  65. package/dist/esm/ir/models/File.d.ts +6 -0
  66. package/dist/esm/ir/models/File.js +1 -0
  67. package/dist/esm/ir/models/IRParser.d.ts +2 -0
  68. package/dist/esm/ir/models/IRParser.js +1 -0
  69. package/dist/esm/ir/models/Node.d.ts +13 -0
  70. package/dist/esm/ir/models/Node.js +8 -0
  71. package/dist/esm/ir/models/index.d.ts +3 -0
  72. package/dist/esm/ir/models/index.js +3 -0
  73. package/dist/esm/rules/helpers/defaultAdapter.d.ts +9 -0
  74. package/dist/esm/rules/helpers/defaultAdapter.js +16 -0
  75. package/dist/esm/rules/index.d.ts +1 -0
  76. package/dist/esm/rules/index.js +1 -0
  77. package/dist/esm/rules/models/index.d.ts +2 -0
  78. package/dist/esm/rules/models/index.js +2 -0
  79. package/dist/esm/rules/models/message/index.d.ts +1 -0
  80. package/dist/esm/rules/models/message/index.js +1 -0
  81. package/dist/esm/rules/models/message/model.d.ts +10 -0
  82. package/dist/esm/rules/models/message/model.js +6 -0
  83. package/dist/esm/rules/models/rule/index.d.ts +2 -0
  84. package/dist/esm/rules/models/rule/index.js +2 -0
  85. package/dist/esm/rules/models/rule/model.d.ts +12 -0
  86. package/dist/esm/rules/models/rule/model.js +1 -0
  87. package/dist/esm/rules/models/rule/service.d.ts +2 -0
  88. package/dist/esm/rules/models/rule/service.js +9 -0
  89. package/dist/esm/shared/pattern/loadFiles.d.ts +1 -0
  90. package/dist/esm/shared/pattern/loadFiles.js +6 -0
  91. package/dist/types/cli/commands/init.d.ts +1 -0
  92. package/dist/types/cli/commands/lint.d.ts +1 -0
  93. package/dist/types/cli/index.d.ts +2 -0
  94. package/dist/types/config/api/defineConfig.d.ts +2 -0
  95. package/dist/types/config/api/loadConfig.d.ts +3 -0
  96. package/dist/types/config/index.d.ts +3 -0
  97. package/dist/types/config/types/config.d.ts +17 -0
  98. package/dist/types/config/types/configAdapter.d.ts +2 -0
  99. package/dist/types/core/api/index.d.ts +3 -0
  100. package/dist/types/core/api/lintProject.d.ts +2 -0
  101. package/dist/types/core/api/linter.d.ts +5 -0
  102. package/dist/types/core/index.d.ts +2 -0
  103. package/dist/types/core/models/index.d.ts +1 -0
  104. package/dist/types/core/models/lintResult/index.d.ts +1 -0
  105. package/dist/types/core/models/lintResult/model.d.ts +7 -0
  106. package/dist/types/index.d.ts +4 -0
  107. package/dist/types/ir/index.d.ts +1 -0
  108. package/dist/types/ir/models/File.d.ts +6 -0
  109. package/dist/types/ir/models/IRParser.d.ts +2 -0
  110. package/dist/types/ir/models/Node.d.ts +13 -0
  111. package/dist/types/ir/models/index.d.ts +3 -0
  112. package/dist/types/rules/helpers/defaultAdapter.d.ts +9 -0
  113. package/dist/types/rules/index.d.ts +1 -0
  114. package/dist/types/rules/models/index.d.ts +2 -0
  115. package/dist/types/rules/models/message/index.d.ts +1 -0
  116. package/dist/types/rules/models/message/model.d.ts +10 -0
  117. package/dist/types/rules/models/rule/index.d.ts +2 -0
  118. package/dist/types/rules/models/rule/model.d.ts +12 -0
  119. package/dist/types/rules/models/rule/service.d.ts +2 -0
  120. package/dist/types/shared/pattern/loadFiles.d.ts +1 -0
  121. package/package.json +40 -15
  122. package/src/cli/commands/init.ts +1 -1
  123. package/src/config/api/loadConfig.ts +1 -1
  124. package/src/core/api/lintProject.ts +1 -1
  125. package/tsconfig.build.json +9 -0
  126. package/tsconfig.cjs.json +11 -0
  127. package/tsconfig.esm.json +11 -0
  128. package/tsconfig.json +3 -2
  129. package/dist/chunk-XMKWAQ3V.js +0 -4934
  130. package/dist/cli/index.cjs +0 -27896
  131. package/dist/cli/index.js +0 -22995
  132. package/dist/index.cjs +0 -4976
  133. package/dist/index.js +0 -50
  134. package/legacy/group/model.ts +0 -6
  135. package/legacy/group/service.ts +0 -13
  136. package/legacy/shared/yagni/index.ts +0 -4
  137. package/legacy/shared/yagni/noUnusedFeatures/index.ts +0 -4
  138. package/legacy/shared/yagni/noUnusedFeatures/main.ts +0 -10
  139. package/legacy/shared/yagni/noUnusedFeatures/noUnusedClasses.ts +0 -26
  140. package/legacy/shared/yagni/noUnusedFeatures/noUnusedFunctions.ts +0 -26
  141. package/legacy/shared/yagni/noUnusedFeatures/noUnusedVariables.ts +0 -26
  142. package/legacy/shared/yagni/utils.ts +0 -5
  143. package/tsup.config.ts +0 -13
@@ -0,0 +1 @@
1
+ export declare const init: () => Promise<void>;
@@ -0,0 +1 @@
1
+ export declare const lint: () => Promise<void>;
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { Config, NormalizedConfig } from '../types/config';
2
+ export declare function defineConfig(config: Config): NormalizedConfig;
@@ -0,0 +1,3 @@
1
+ import type { NormalizedConfig } from '../types/config';
2
+ export declare const loadConfigFromFile: (filePath: string) => Promise<NormalizedConfig | null>;
3
+ export declare const loadConfig: (projectPath: string) => Promise<NormalizedConfig>;
@@ -0,0 +1,3 @@
1
+ export * from './types/config';
2
+ export * from './api/defineConfig';
3
+ export * from './api/loadConfig';
@@ -0,0 +1,17 @@
1
+ import type { IRParser } from '../../ir/models/IRParser';
2
+ import type { AdaptedRule, Rule } from '../../rules/models/rule/model';
3
+ export interface Config {
4
+ lint: {
5
+ includes: string[];
6
+ excludes: string[];
7
+ };
8
+ parsers: {
9
+ pattern: string;
10
+ parser: IRParser;
11
+ }[];
12
+ rules: Rule[];
13
+ }
14
+ export interface NormalizedConfig extends Config {
15
+ rules: AdaptedRule[];
16
+ }
17
+ export declare const defaultConfig: NormalizedConfig;
@@ -0,0 +1,2 @@
1
+ import type { Config, NormalizedConfig } from './config';
2
+ export declare const adaptConfig: (c: Config) => NormalizedConfig;
@@ -0,0 +1,3 @@
1
+ export * from './linter';
2
+ export * from './lintProject';
3
+ export * from './linter';
@@ -0,0 +1,2 @@
1
+ import type { NormalizedConfig } from '../../config/types/config';
2
+ export declare const lintProject: (config: NormalizedConfig, projectDir: string) => Promise<import("..").LintResult[][]>;
@@ -0,0 +1,5 @@
1
+ import type { LintResult } from '../models/lintResult/model';
2
+ import type { IRFile } from '../../ir/models/File';
3
+ import type { AdaptedRule } from '../../rules/models/rule/model';
4
+ export declare function travelFile(file: IRFile): (rule: AdaptedRule) => LintResult;
5
+ export declare function lintFile(file: IRFile, rules: AdaptedRule[]): LintResult[];
@@ -0,0 +1,2 @@
1
+ export * from './models';
2
+ export * from './api';
@@ -0,0 +1 @@
1
+ export * from './lintResult';
@@ -0,0 +1 @@
1
+ export * from './model';
@@ -0,0 +1,7 @@
1
+ import type { Message } from '../../../rules/models/message/model';
2
+ export type LintResult = {
3
+ name: string;
4
+ messages: Message[];
5
+ subrules: LintResult[];
6
+ isCorrect: boolean;
7
+ };
@@ -0,0 +1,4 @@
1
+ export * from './config';
2
+ export * from './core';
3
+ export * from './ir';
4
+ export * from './rules';
@@ -0,0 +1 @@
1
+ export * from './models';
@@ -0,0 +1,6 @@
1
+ import type { IRNode } from './Node';
2
+ export interface IRFile {
3
+ name: string;
4
+ extensions: string[];
5
+ program: IRNode[];
6
+ }
@@ -0,0 +1,2 @@
1
+ import type { IRFile } from './File';
2
+ export type IRParser = (filename: string, content: string) => IRFile;
@@ -0,0 +1,13 @@
1
+ export declare enum IRKind {
2
+ Codeline = 0,
3
+ Literal = 1,
4
+ Function = 2,
5
+ Class = 3,
6
+ Variable = 4
7
+ }
8
+ export interface IRNode {
9
+ line: number;
10
+ kind: IRKind;
11
+ name: string;
12
+ value: IRNode[];
13
+ }
@@ -0,0 +1,3 @@
1
+ export * from './File';
2
+ export * from './IRParser';
3
+ export * from './Node';
@@ -0,0 +1,9 @@
1
+ import type { AdaptedRule, Rule } from '../models/rule/model';
2
+ /**
3
+ * @function defaultAdapter recursively adapts a Rule to an AdaptedRule by providing default values for undefined/null fields.
4
+ *
5
+ * @param rule the rule to adapt
6
+ * @returns a AdaptedRule without undefined/null fields
7
+ *
8
+ */
9
+ export declare const defaultAdapter: (rule: Rule) => AdaptedRule;
@@ -0,0 +1 @@
1
+ export * from './models';
@@ -0,0 +1,2 @@
1
+ export * from './rule';
2
+ export * from './message';
@@ -0,0 +1 @@
1
+ export * from './model';
@@ -0,0 +1,10 @@
1
+ export declare enum Level {
2
+ Error = "ERROR",
3
+ Warning = "WARNING",
4
+ Info = "INFO"
5
+ }
6
+ export interface Message {
7
+ message: string;
8
+ line: number;
9
+ level: Level;
10
+ }
@@ -0,0 +1,2 @@
1
+ export * from './model';
2
+ export * from './service';
@@ -0,0 +1,12 @@
1
+ import type { IRFile } from '../../../ir/models/File';
2
+ import type { Message } from '../../models/message/model';
3
+ export type RuleFn = (file: IRFile) => Message[];
4
+ export interface Rule {
5
+ name: string;
6
+ fn?: RuleFn;
7
+ subrules?: Rule[];
8
+ }
9
+ export interface AdaptedRule extends Rule {
10
+ fn: RuleFn;
11
+ subrules: AdaptedRule[];
12
+ }
@@ -0,0 +1,2 @@
1
+ import type { Rule, RuleFn } from './model';
2
+ export declare const createRule: (name: string, fn: (subrule: (subrule: Rule) => void) => RuleFn) => Rule;
@@ -0,0 +1 @@
1
+ export declare const loadFiles: (baseDir: string, includes: string[], excludes?: string[]) => Promise<string[]>;
@@ -0,0 +1 @@
1
+ export declare const init: () => Promise<void>;
@@ -0,0 +1,18 @@
1
+ import inquirer from 'inquirer';
2
+ import * as fs from 'fs';
3
+ import { defaultConfig } from '../../config/index';
4
+ import { inspect } from 'util';
5
+ export const init = async () => {
6
+ const { useTypescript } = await inquirer.prompt([
7
+ {
8
+ type: 'confirm',
9
+ name: 'useTypescript',
10
+ message: 'Do you want to use typescript?',
11
+ default: true,
12
+ },
13
+ ]);
14
+ fs.writeFileSync(`catlint.config.${useTypescript ? 'ts' : 'js'}`, `import { defineConfig } from 'catlint/config';
15
+
16
+ export default defineConfig(${inspect(defaultConfig)});
17
+ `);
18
+ };
@@ -0,0 +1 @@
1
+ export declare const lint: () => Promise<void>;
@@ -0,0 +1,6 @@
1
+ import { defaultConfig, loadConfig } from '../../config/index';
2
+ import { lintProject } from '../../core/api/lintProject';
3
+ export const lint = async () => {
4
+ const config = (await loadConfig('.')) ?? defaultConfig;
5
+ lintProject(config, '.');
6
+ };
@@ -0,0 +1,2 @@
1
+ #!/usr/bin/env node
2
+ export {};
@@ -0,0 +1,15 @@
1
+ #!/usr/bin/env node
2
+ import { Command } from 'commander';
3
+ import { init } from './commands/init';
4
+ import { lint } from './commands/lint';
5
+ const program = new Command();
6
+ program.name('catlint').description('A linter for detecting code bad practices').version('0.0.1');
7
+ program
8
+ .command('init')
9
+ .description('Inits CatLint in your current project folder')
10
+ .action(async () => await init());
11
+ program
12
+ .command('lint')
13
+ .description('Lints the current project')
14
+ .action(async () => await lint());
15
+ program.parse();
@@ -0,0 +1,2 @@
1
+ import type { Config, NormalizedConfig } from '../types/config';
2
+ export declare function defineConfig(config: Config): NormalizedConfig;
@@ -0,0 +1,8 @@
1
+ import { defaultAdapter } from '../../rules/helpers/defaultAdapter';
2
+ export function defineConfig(config) {
3
+ const normalizedConfig = {
4
+ ...config,
5
+ rules: config.rules.map((rule) => defaultAdapter(rule)),
6
+ };
7
+ return normalizedConfig;
8
+ }
@@ -0,0 +1,3 @@
1
+ import type { NormalizedConfig } from '../types/config';
2
+ export declare const loadConfigFromFile: (filePath: string) => Promise<NormalizedConfig | null>;
3
+ export declare const loadConfig: (projectPath: string) => Promise<NormalizedConfig>;
@@ -0,0 +1,22 @@
1
+ import { adaptConfig } from '../types/configAdapter';
2
+ import * as path from 'path';
3
+ import { pathToFileURL } from 'url';
4
+ export const loadConfigFromFile = async (filePath) => {
5
+ try {
6
+ const config = await import(pathToFileURL(filePath).href);
7
+ return adaptConfig(config.default);
8
+ }
9
+ catch {
10
+ console.log(`No config file found at ${filePath}`);
11
+ return null;
12
+ }
13
+ };
14
+ export const loadConfig = async (projectPath) => {
15
+ const configPath = path.join(process.cwd(), projectPath) + '/catlint.config';
16
+ const config = (await loadConfigFromFile(configPath + '.js')) ??
17
+ (await loadConfigFromFile(configPath + '.ts'));
18
+ if (!config) {
19
+ throw new Error('No config file found');
20
+ }
21
+ return config;
22
+ };
@@ -0,0 +1,3 @@
1
+ export * from './types/config';
2
+ export * from './api/defineConfig';
3
+ export * from './api/loadConfig';
@@ -0,0 +1,3 @@
1
+ export * from './types/config';
2
+ export * from './api/defineConfig';
3
+ export * from './api/loadConfig';
@@ -0,0 +1,17 @@
1
+ import type { IRParser } from '../../ir/models/IRParser';
2
+ import type { AdaptedRule, Rule } from '../../rules/models/rule/model';
3
+ export interface Config {
4
+ lint: {
5
+ includes: string[];
6
+ excludes: string[];
7
+ };
8
+ parsers: {
9
+ pattern: string;
10
+ parser: IRParser;
11
+ }[];
12
+ rules: Rule[];
13
+ }
14
+ export interface NormalizedConfig extends Config {
15
+ rules: AdaptedRule[];
16
+ }
17
+ export declare const defaultConfig: NormalizedConfig;
@@ -0,0 +1,8 @@
1
+ export const defaultConfig = {
2
+ lint: {
3
+ includes: ['**/*.ts'],
4
+ excludes: ['node_modules/**'],
5
+ },
6
+ parsers: [],
7
+ rules: [],
8
+ };
@@ -0,0 +1,2 @@
1
+ import type { Config, NormalizedConfig } from './config';
2
+ export declare const adaptConfig: (c: Config) => NormalizedConfig;
@@ -0,0 +1,8 @@
1
+ import { defaultAdapter } from '../../rules/helpers/defaultAdapter';
2
+ export const adaptConfig = (config) => {
3
+ const normalizedConfig = {
4
+ ...config,
5
+ rules: config.rules.map((rule) => defaultAdapter(rule)),
6
+ };
7
+ return normalizedConfig;
8
+ };
@@ -0,0 +1,3 @@
1
+ export * from './linter';
2
+ export * from './lintProject';
3
+ export * from './linter';
@@ -0,0 +1,3 @@
1
+ export * from './linter';
2
+ export * from './lintProject';
3
+ export * from './linter';
@@ -0,0 +1,2 @@
1
+ import type { NormalizedConfig } from '../../config/types/config';
2
+ export declare const lintProject: (config: NormalizedConfig, projectDir: string) => Promise<import("..").LintResult[][]>;
@@ -0,0 +1,16 @@
1
+ import { loadFiles } from '../../shared/pattern/loadFiles';
2
+ import { lintFile } from './linter';
3
+ import * as fs from 'fs';
4
+ import { Minimatch } from 'minimatch';
5
+ export const lintProject = async (config, projectDir) => {
6
+ const files = await loadFiles(projectDir, config.lint.includes, config.lint.excludes);
7
+ return files
8
+ .map((filePath) => {
9
+ const fileContent = fs.readFileSync(filePath, 'utf-8');
10
+ const parser = config.parsers.find((parser) => new Minimatch(parser.pattern).match(filePath));
11
+ if (!parser)
12
+ console.error(`No parser found for file ${filePath}`);
13
+ return parser?.parser(fileContent, filePath) ?? {};
14
+ })
15
+ .map((file) => lintFile(file, config.rules));
16
+ };
@@ -0,0 +1,5 @@
1
+ import type { LintResult } from '../models/lintResult/model';
2
+ import type { IRFile } from '../../ir/models/File';
3
+ import type { AdaptedRule } from '../../rules/models/rule/model';
4
+ export declare function travelFile(file: IRFile): (rule: AdaptedRule) => LintResult;
5
+ export declare function lintFile(file: IRFile, rules: AdaptedRule[]): LintResult[];
@@ -0,0 +1,15 @@
1
+ export function travelFile(file) {
2
+ const travelRule = (rule) => {
3
+ return {
4
+ name: rule.name,
5
+ messages: rule.fn(file),
6
+ subrules: rule.subrules.map(travelRule),
7
+ isCorrect: rule.fn(file).length === 0 && rule.subrules.every((r) => travelRule(r).isCorrect),
8
+ };
9
+ };
10
+ return travelRule;
11
+ }
12
+ export function lintFile(file, rules) {
13
+ const results = rules.map((rule) => travelFile(file)(rule));
14
+ return results;
15
+ }
@@ -0,0 +1,2 @@
1
+ export * from './models';
2
+ export * from './api';
@@ -0,0 +1,2 @@
1
+ export * from './models';
2
+ export * from './api';
@@ -0,0 +1 @@
1
+ export * from './lintResult';
@@ -0,0 +1 @@
1
+ export * from './lintResult';
@@ -0,0 +1 @@
1
+ export * from './model';
@@ -0,0 +1 @@
1
+ export * from './model';
@@ -0,0 +1,7 @@
1
+ import type { Message } from '../../../rules/models/message/model';
2
+ export type LintResult = {
3
+ name: string;
4
+ messages: Message[];
5
+ subrules: LintResult[];
6
+ isCorrect: boolean;
7
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,4 @@
1
+ export * from './config';
2
+ export * from './core';
3
+ export * from './ir';
4
+ export * from './rules';
@@ -0,0 +1,4 @@
1
+ export * from './config';
2
+ export * from './core';
3
+ export * from './ir';
4
+ export * from './rules';
@@ -0,0 +1 @@
1
+ export * from './models';
@@ -0,0 +1 @@
1
+ export * from './models';
@@ -0,0 +1,6 @@
1
+ import type { IRNode } from './Node';
2
+ export interface IRFile {
3
+ name: string;
4
+ extensions: string[];
5
+ program: IRNode[];
6
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { IRFile } from './File';
2
+ export type IRParser = (filename: string, content: string) => IRFile;
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ export declare enum IRKind {
2
+ Codeline = 0,
3
+ Literal = 1,
4
+ Function = 2,
5
+ Class = 3,
6
+ Variable = 4
7
+ }
8
+ export interface IRNode {
9
+ line: number;
10
+ kind: IRKind;
11
+ name: string;
12
+ value: IRNode[];
13
+ }
@@ -0,0 +1,8 @@
1
+ export var IRKind;
2
+ (function (IRKind) {
3
+ IRKind[IRKind["Codeline"] = 0] = "Codeline";
4
+ IRKind[IRKind["Literal"] = 1] = "Literal";
5
+ IRKind[IRKind["Function"] = 2] = "Function";
6
+ IRKind[IRKind["Class"] = 3] = "Class";
7
+ IRKind[IRKind["Variable"] = 4] = "Variable";
8
+ })(IRKind || (IRKind = {}));
@@ -0,0 +1,3 @@
1
+ export * from './File';
2
+ export * from './IRParser';
3
+ export * from './Node';
@@ -0,0 +1,3 @@
1
+ export * from './File';
2
+ export * from './IRParser';
3
+ export * from './Node';
@@ -0,0 +1,9 @@
1
+ import type { AdaptedRule, Rule } from '../models/rule/model';
2
+ /**
3
+ * @function defaultAdapter recursively adapts a Rule to an AdaptedRule by providing default values for undefined/null fields.
4
+ *
5
+ * @param rule the rule to adapt
6
+ * @returns a AdaptedRule without undefined/null fields
7
+ *
8
+ */
9
+ export declare const defaultAdapter: (rule: Rule) => AdaptedRule;
@@ -0,0 +1,16 @@
1
+ const EMPTY_FN = () => [];
2
+ /**
3
+ * @function defaultAdapter recursively adapts a Rule to an AdaptedRule by providing default values for undefined/null fields.
4
+ *
5
+ * @param rule the rule to adapt
6
+ * @returns a AdaptedRule without undefined/null fields
7
+ *
8
+ */
9
+ export const defaultAdapter = (rule) => {
10
+ const { name, fn = EMPTY_FN, subrules = [] } = rule;
11
+ return {
12
+ name,
13
+ fn,
14
+ subrules: subrules.map(defaultAdapter),
15
+ };
16
+ };
@@ -0,0 +1 @@
1
+ export * from './models';
@@ -0,0 +1 @@
1
+ export * from './models';
@@ -0,0 +1,2 @@
1
+ export * from './rule';
2
+ export * from './message';
@@ -0,0 +1,2 @@
1
+ export * from './rule';
2
+ export * from './message';
@@ -0,0 +1 @@
1
+ export * from './model';
@@ -0,0 +1 @@
1
+ export * from './model';
@@ -0,0 +1,10 @@
1
+ export declare enum Level {
2
+ Error = "ERROR",
3
+ Warning = "WARNING",
4
+ Info = "INFO"
5
+ }
6
+ export interface Message {
7
+ message: string;
8
+ line: number;
9
+ level: Level;
10
+ }
@@ -0,0 +1,6 @@
1
+ export var Level;
2
+ (function (Level) {
3
+ Level["Error"] = "ERROR";
4
+ Level["Warning"] = "WARNING";
5
+ Level["Info"] = "INFO";
6
+ })(Level || (Level = {}));
@@ -0,0 +1,2 @@
1
+ export * from './model';
2
+ export * from './service';
@@ -0,0 +1,2 @@
1
+ export * from './model';
2
+ export * from './service';
@@ -0,0 +1,12 @@
1
+ import type { IRFile } from '../../../ir/models/File';
2
+ import type { Message } from '../../models/message/model';
3
+ export type RuleFn = (file: IRFile) => Message[];
4
+ export interface Rule {
5
+ name: string;
6
+ fn?: RuleFn;
7
+ subrules?: Rule[];
8
+ }
9
+ export interface AdaptedRule extends Rule {
10
+ fn: RuleFn;
11
+ subrules: AdaptedRule[];
12
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { Rule, RuleFn } from './model';
2
+ export declare const createRule: (name: string, fn: (subrule: (subrule: Rule) => void) => RuleFn) => Rule;
@@ -0,0 +1,9 @@
1
+ export const createRule = (name, fn) => {
2
+ const subrules = [];
3
+ const ruleFn = fn((subrule) => subrules.push(subrule));
4
+ return {
5
+ name,
6
+ fn: ruleFn,
7
+ subrules,
8
+ };
9
+ };
@@ -0,0 +1 @@
1
+ export declare const loadFiles: (baseDir: string, includes: string[], excludes?: string[]) => Promise<string[]>;
@@ -0,0 +1,6 @@
1
+ import { glob } from 'glob';
2
+ export const loadFiles = async (baseDir, includes, excludes = []) => {
3
+ const included = (await Promise.all(includes.map((pattern) => glob(pattern, { cwd: baseDir, absolute: true })))).flat();
4
+ const excluded = (await Promise.all(excludes.map((pattern) => glob(pattern, { cwd: baseDir, absolute: true })))).flat();
5
+ return included.filter((file) => !excluded.includes(file));
6
+ };