@echojs-ecosystem/architect 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.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/abstraction/abstraction.ts","../src/abstraction/instance/get-label.ts","../src/shared/memoize.ts","../src/shared/resolve-import.ts","../src/abstraction/instance/parse.ts","../src/config/define-config.ts","../src/config/errors.ts","../src/config/schema.ts","../src/config/load.ts","../src/vfs/get-flatten-files.ts","../src/dependencies/parse.ts","../src/rule/rule.ts","../src/vfs/get-nodes-record.ts","../src/vfs/add-directory.ts","../src/vfs/add-file.ts","../src/vfs/create-root.ts","../src/vfs/remove-node.ts","../src/vfs/watch-fs.ts","../src/presets/index.ts","../src/linter/run-rules.ts","../src/linter/lint.ts"],"names":["fs","abstraction","relative","cwd","watchConfigC12","config","parseNearestTsConfig","sep","produce","basename","join","from","switchMap","Observable","path","minimatch","rule","instance"],"mappings":"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","file":"index.js","sourcesContent":["import type { Rule } from \"../rule/types\";\nimport type { Path } from \"../vfs/types\";\nimport * as fs from \"node:fs\";\n\nexport type AbstractionName = string;\nexport type AbstractionMatcher = string;\nexport interface Abstraction {\n name: AbstractionName;\n children: Record<AbstractionMatcher, Abstraction>;\n rules: Rule[];\n fractal?: AbstractionName;\n fileTemplate?: (path: Path) => string;\n}\n\nexport interface AbstractionOptions {\n name: string;\n children?: Record<string, Abstraction>;\n rules?: Rule[];\n fractal?: string;\n fileTemplate?: ((path: Path) => string) | string;\n fileTemplateUrl?: string;\n}\n\ntype AbstractionFn = {\n (\n name: string,\n optionalConfig?: Omit<AbstractionOptions, \"name\">,\n ): Abstraction;\n (config: AbstractionOptions): Abstraction;\n};\n\nconst normalizeFileTemplate = (\n fileTemplate?: ((path: Path) => string) | string,\n fileTemplateUrl?: string,\n): ((path: Path) => string) | undefined => {\n if (fileTemplateUrl) {\n return () => fs.readFileSync(fileTemplateUrl, \"utf-8\");\n }\n if (!fileTemplate) {\n return undefined;\n }\n if (typeof fileTemplate === \"string\") {\n return () => fileTemplate;\n }\n\n return fileTemplate;\n};\n\nexport const abstraction: AbstractionFn = (\n optionsOrName: AbstractionOptions | string,\n optionalConfig?: Omit<AbstractionOptions, \"name\">,\n) => {\n if (typeof optionsOrName === \"string\") {\n return {\n name: optionsOrName,\n children: optionalConfig?.children ?? {},\n rules: optionalConfig?.rules ?? [],\n fractal: optionalConfig?.fractal,\n fileTemplate: normalizeFileTemplate(\n optionalConfig?.fileTemplate,\n optionalConfig?.fileTemplateUrl,\n ),\n };\n }\n return {\n name: optionsOrName.name,\n children: optionsOrName.children ?? {},\n rules: optionsOrName.rules ?? [],\n fractal: optionsOrName.fractal,\n fileTemplate: normalizeFileTemplate(\n optionsOrName.fileTemplate,\n optionsOrName?.fileTemplateUrl,\n ),\n };\n};\n","import type { AbstractionInstance } from \"./types\";\n\nimport { parse } from \"node:path\";\n\nexport const getAbstractionInstanceLabel = (\n instance: AbstractionInstance,\n) => {\n const { name } = parse(instance.path);\n\n if (name === instance.abstraction.name) {\n return name;\n }\n\n return `${name} (${instance.abstraction.name})`;\n};\n","export const memoize = <T extends (arg: any) => any>(fn: T): T => {\n const cache = new WeakMap();\n return function (this: any, arg: any) {\n if (cache.has(arg)) {\n return cache.get(arg);\n }\n const result = fn.call(this, arg);\n\n cache.set(arg, result);\n return result;\n } as T;\n};\n","import type { CompilerOptions } from \"typescript\";\nimport { sep } from \"node:path\";\nimport ts from \"typescript\";\n\n/**\n * Given a file name, an imported path, and a TSConfig object, produce a path to the imported file, relative to TypeScript's `baseUrl`.\n *\n * The resulting path uses OS-appropriate path separators.\n *\n * @example\n * ```tsx\n * // ./src/pages/home/ui/HomePage.tsx\n * import { Button } from \"~/shared/ui\";\n * ```\n *\n * ```json\n * // ./tsconfig.json\n * {\n * \"compilerOptions\": {\n * \"moduleResolution\": \"Bundler\",\n * \"baseUrl\": \".\",\n * \"paths\": {\n * \"~/*\": [\"./src/*\"],\n * },\n * },\n * }\n * ```\n *\n * ```tsx\n * resolveImport(\n * \"~/shared/ui\",\n * \"./src/pages/home/ui/HomePage.tsx\",\n * { moduleResolution: \"Bundler\", baseUrl: \".\", paths: { \"~/*\": [\"./src/*\"] } },\n * fs.existsSync\n * );\n * ```\n * Expected output: `src/shared/ui/index.ts`\n */\nexport const resolveImport = (\n importedPath: string,\n importerPath: string,\n tsCompilerOptions: ImperfectCompilerOptions,\n fileExists: (path: string) => boolean,\n directoryExists?: (path: string) => boolean,\n): string | null => {\n return (\n ts\n .resolveModuleName(\n importedPath,\n importerPath,\n normalizeCompilerOptions(tsCompilerOptions),\n {\n ...ts.sys,\n fileExists,\n directoryExists,\n },\n )\n .resolvedModule?.resolvedFileName?.replaceAll(\"/\", sep) ?? null\n );\n};\n\nconst imperfectKeys = {\n module: ts.ModuleKind,\n moduleResolution: {\n ...ts.ModuleResolutionKind,\n node: ts.ModuleResolutionKind.Node10,\n },\n moduleDetection: ts.ModuleDetectionKind,\n newLine: ts.NewLineKind,\n target: ts.ScriptTarget,\n};\n\n/** TypeScript has a few fields which have values from an internal enum, and refuses to take the literal values from the tsconfig.json. */\nconst normalizeCompilerOptions = (\n compilerOptions: ImperfectCompilerOptions,\n): CompilerOptions => {\n return Object.fromEntries(\n Object.entries(compilerOptions).map(([key, value]) => {\n if (\n Object.keys(imperfectKeys).includes(key) &&\n typeof value === \"string\"\n ) {\n for (const [enumKey, enumValue] of Object.entries(\n imperfectKeys[key as keyof typeof imperfectKeys],\n )) {\n if (enumKey.toLowerCase() === value.toLowerCase()) {\n return [key, enumValue];\n }\n }\n }\n return [key, value];\n }),\n ) as CompilerOptions;\n};\n\nexport interface ImperfectCompilerOptions\n extends Omit<CompilerOptions, keyof typeof imperfectKeys> {\n module?: ts.ModuleKind | keyof typeof ts.ModuleKind;\n moduleResolution?:\n | ts.ModuleResolutionKind\n | keyof typeof ts.ModuleResolutionKind\n | \"node\";\n moduleDetection?:\n | ts.ModuleDetectionKind\n | keyof typeof ts.ModuleDetectionKind;\n newLine?: ts.NewLineKind | keyof typeof ts.NewLineKind;\n target?: ts.ScriptTarget | keyof typeof ts.ScriptTarget;\n}\n","import type { Abstraction } from \"../abstraction\";\nimport type { Path, VfsNode } from \"../../vfs/types\";\nimport type { AbstractionInstance } from \"./types\";\nimport { relative } from \"node:path\";\nimport { minimatch } from \"minimatch\";\nimport { memoize } from \"../../shared\";\n\n// Так как Vfs иммутабельный,\n// то ссылки на инсансы между вызовами\n// не будут изменены, благодаря мемоизации\nexport const parseAbstractionInstance = memoize((abstraction: Abstraction) =>\n memoize((node: VfsNode): AbstractionInstance => {\n if (node.type === \"file\") {\n return {\n abstraction,\n path: node.path,\n children: [],\n childNodes: [],\n };\n }\n\n // Получаем все дочерние абстракции\n const children: Record<Path, AbstractionInstance> = {};\n\n for (const [pattern, childAbstraction] of Object.entries(\n abstraction.children\n )) {\n const nodeAbstractionInstance =\n parseAbstractionInstance(childAbstraction);\n const nodesStack: VfsNode[] = [node];\n while (nodesStack.length) {\n const currentNode = nodesStack.pop()!;\n // Если путь соответствует паттерну. То записываем или **перезаписываем** инстранс абстракции\n if (minimatch(relative(node.path, currentNode.path), pattern)) {\n children[currentNode.path] = nodeAbstractionInstance(currentNode);\n\n // Внутрь дирректории для которой создали абстракцию не идём\n continue;\n }\n\n // Если для дирректории один из прошлых матчеров создал абстракцию, тоже не идём\n if (children[currentNode.path]) {\n continue;\n }\n\n if (currentNode.type === \"folder\") {\n nodesStack.push(...currentNode.children);\n }\n }\n }\n\n // Получаем все ноды, которые не являются абстракциями\n const childNodes: Path[] = [];\n const childrenNodesStack: VfsNode[] = [node];\n\n while (childrenNodesStack.length) {\n const currentNode = childrenNodesStack.pop()!;\n\n // Если есть абстракция - игнорируем\n if (children[currentNode.path]) {\n continue;\n }\n\n if (currentNode.path !== node.path) {\n childNodes.push(currentNode.path);\n }\n\n if (currentNode.type === \"folder\") {\n childrenNodesStack.push(...currentNode.children);\n }\n }\n\n return {\n abstraction,\n path: node.path,\n childNodes: Object.values(childNodes),\n children: Object.values(children),\n };\n })\n);\n","import type { Abstraction } from \"../abstraction\";\n\nexport interface EvolutionConfig {\n /** Root abstraction */\n root: Abstraction;\n /** Base url */\n baseUrl?: string;\n /** Globs of files to check */\n files?: Array<string>;\n /** Globs of files to ignore */\n ignores?: Array<string>;\n}\n\nexport const defineConfig = (config: EvolutionConfig) => config;\n","import type { ZodError } from \"zod\";\nimport { relative } from \"node:path\";\nimport * as process from \"node:process\";\nimport { fromError } from \"zod-validation-error\";\n\nexport class ConfigurationNotFoundError extends Error {\n constructor() {\n super(`Configuration not found in ${process.cwd()}`);\n }\n}\n\nexport class ConfigurationInvalidError extends Error {\n constructor(\n public error: ZodError,\n filepath: string,\n ) {\n super(\n fromError(error, {\n prefix: `Invalid configuration in ${relative(process.cwd(), filepath)}`,\n }).toString(),\n );\n }\n}\n","import type { Abstraction } from \"../abstraction\";\nimport type { Rule } from \"../rule/types\";\nimport type { EvolutionConfig } from \"./define-config\";\nimport { z, type ZodType } from \"zod\";\n\ntype TypeToZod<T> = ZodType<T>;\n\nconst RuleSchema: TypeToZod<Rule> = z.object({\n name: z.string(),\n check: z.custom<Rule[\"check\"]>(),\n severity: z.enum([\"off\", \"warn\", \"error\"]),\n descriptionUrl: z.string().optional(),\n});\n\nconst AbstractionSchema: TypeToZod<Abstraction> = z.object({\n name: z.string(),\n children: z.record(z.lazy(() => AbstractionSchema)),\n rules: z.array(RuleSchema),\n fractal: z.string().optional(),\n fileTemplate: z.custom<Abstraction[\"fileTemplate\"]>(),\n});\n\nexport const EvolutionConfigSchema: TypeToZod<EvolutionConfig> = z.object({\n root: AbstractionSchema,\n baseUrl: z.string().optional(),\n files: z.array(z.string()).optional(),\n ignores: z.array(z.string()).optional(),\n});\n","import type { EvolutionConfig } from \"./define-config\";\nimport { loadConfig, watchConfig as watchConfigC12 } from \"c12\";\nimport { from, map, Observable, switchMap } from \"rxjs\";\nimport {\n ConfigurationInvalidError,\n ConfigurationNotFoundError,\n} from \"./errors\";\nimport { EvolutionConfigSchema } from \"./schema\";\n\nconst CONFIG_NAME = \"architect\";\n\nexport interface ConfigResult {\n config: EvolutionConfig;\n configPath: string;\n}\n\nconst parseConfigResult = (\n filepath: string,\n data: unknown,\n): ConfigResult => {\n const parseResult = EvolutionConfigSchema.safeParse(data);\n\n if (!parseResult.success) {\n throw new ConfigurationInvalidError(parseResult.error, filepath);\n }\n\n return {\n config: parseResult.data,\n configPath: filepath,\n };\n};\n\nexport const watchConfig = ({\n cwd,\n onlyOne,\n}: {\n cwd: string;\n onlyOne?: boolean;\n}) => {\n const config$ = from(\n loadConfig({\n cwd,\n name: CONFIG_NAME,\n }),\n ).pipe(\n map(({ configFile, config }) => {\n if (!configFile) {\n throw new ConfigurationNotFoundError();\n }\n return parseConfigResult(configFile, config);\n }),\n );\n\n if (onlyOne) {\n return config$;\n }\n\n return config$.pipe(\n switchMap(\n ({ configPath, config }) =>\n new Observable<ConfigResult>((subscriber) => {\n subscriber.next({ configPath, config });\n\n let unwatchCallback = () => {};\n\n watchConfigC12({\n cwd,\n name: CONFIG_NAME,\n onUpdate: (config) => {\n subscriber.next(\n parseConfigResult(configPath, config.newConfig.config),\n );\n },\n }).then(({ unwatch }) => {\n unwatchCallback = unwatch;\n });\n\n return () => unwatchCallback();\n }),\n ),\n );\n};\n","import type { VfsFile, VfsNode } from \"./types\";\nimport { memoize } from \"../shared\";\n\nexport const getFlattenFiles = memoize((node: VfsNode): VfsFile[] => {\n if (node.type === \"file\") {\n return [node];\n }\n return node.children.reduce((acc, child) => {\n if (child.type === \"file\") {\n return [...acc, child];\n }\n\n return [...acc, ...getFlattenFiles(child)];\n }, [] as VfsFile[]);\n});\n","import type { VfsNode } from \"../vfs/types\";\nimport type { DependenciesMap } from \"./types\";\nimport * as fs from \"node:fs\";\nimport { resolveImport } from \"../shared\";\nimport precinct from \"precinct\";\nimport { parse as parseNearestTsConfig } from \"tsconfck\";\nimport { getFlattenFiles } from \"../vfs/get-flatten-files\";\n\nconst { paperwork } = precinct;\n\nexport const parseDependenciesMap = async (vfs: VfsNode) => {\n const dependenciesMap: DependenciesMap = {\n dependencies: {},\n dependencyFor: {},\n };\n\n const basePath = vfs.path;\n const { tsconfig } = await parseNearestTsConfig(basePath);\n\n const files = getFlattenFiles(vfs);\n\n for (const file of files) {\n const dependencies = paperwork(file.path, {\n includeCore: false,\n fileSystem: fs,\n });\n const resolvedDependencies = dependencies\n .map((dependency) =>\n resolveImport(\n dependency,\n file.path,\n tsconfig?.compilerOptions ?? {},\n fs.existsSync,\n fs.existsSync,\n ),\n )\n .filter((dependency) => dependency !== null);\n\n dependenciesMap.dependencies[file.path] = new Set(resolvedDependencies);\n\n for (const dependency of resolvedDependencies) {\n if (!dependenciesMap.dependencyFor[dependency]) {\n dependenciesMap.dependencyFor[dependency] = new Set();\n }\n dependenciesMap.dependencyFor[dependency].add(file.path);\n }\n }\n\n return dependenciesMap;\n};\n","import type { Rule, RuleName, RuleOptions } from \"./types\";\n\ntype RuleFn = {\n (name: RuleName): Rule;\n (options: RuleOptions): Rule;\n};\n\nexport const rule: RuleFn = (config) => {\n const defaultCheck = () => ({ diagnostics: [] });\n\n if (typeof config === \"string\") {\n return {\n name: config,\n severity: \"error\",\n descriptionUrl: undefined,\n check: defaultCheck,\n };\n }\n\n return {\n name: config.name,\n severity: config.severity ?? \"error\",\n descriptionUrl: config.descriptionUrl,\n check: config.check ?? defaultCheck,\n };\n};\n","import type { Path, VfsNode } from \"./types\";\nimport { memoize } from \"../shared\";\n\nexport const getNodesRecord = memoize(\n (node: VfsNode): Record<Path, VfsNode> => {\n if (node.type === \"file\") {\n return { [node.path]: node };\n }\n\n return node.children.reduce(\n (acc, child) => {\n if (child.type === \"file\") {\n return { ...acc, [child.path]: child };\n }\n\n return { ...acc, [child.path]: child, ...getNodesRecord(child) };\n },\n {} as Record<Path, VfsNode>\n );\n }\n);\n","import type { Path, VfsFolder } from \"./types\";\nimport { basename, join, relative, sep } from \"node:path\";\nimport { produce } from \"immer\";\n\nexport const addDirectory = (tree: VfsFolder, newDirectoryPath: Path) => {\n const rootPath = tree.path;\n return produce(tree, (draft) => {\n const pathSegments = relative(rootPath, newDirectoryPath).split(sep);\n let currentFolder = draft;\n\n for (const pathSegment of pathSegments.slice(0, -1)) {\n const existingChild = currentFolder.children.find(\n (child) =>\n child.type === \"folder\" && basename(child.path) === pathSegment,\n ) as VfsFolder | undefined;\n\n if (existingChild === undefined) {\n currentFolder.children.push({\n type: \"folder\",\n path: join(currentFolder.path, pathSegment),\n children: [],\n });\n currentFolder = currentFolder.children[\n currentFolder.children.length - 1\n ] as VfsFolder;\n } else {\n currentFolder = existingChild;\n }\n }\n\n currentFolder.children.push({\n type: \"folder\",\n path: newDirectoryPath,\n children: [],\n });\n });\n};\n","import type { Path, VfsFolder } from \"./types\";\nimport { basename, join, relative, sep } from \"node:path\";\nimport { produce } from \"immer\";\n\nexport const addFile = (tree: VfsFolder, newFilePath: Path) => {\n const rootPath = tree.path;\n return produce(tree, (draft) => {\n const pathSegments = relative(rootPath, newFilePath).split(sep);\n let currentFolder = draft;\n\n for (const pathSegment of pathSegments.slice(0, -1)) {\n const existingChild = currentFolder.children.find(\n (child) =>\n child.type === \"folder\" && basename(child.path) === pathSegment,\n ) as VfsFolder | undefined;\n\n if (existingChild === undefined) {\n currentFolder.children.push({\n type: \"folder\",\n path: join(currentFolder.path, pathSegment),\n children: [],\n });\n currentFolder = currentFolder.children[\n currentFolder.children.length - 1\n ] as VfsFolder;\n } else {\n currentFolder = existingChild;\n }\n }\n\n currentFolder.children.push({ type: \"file\", path: newFilePath });\n });\n};\n","import type { Path, VfsFolder } from \"./types\";\n\nexport const createVfsRoot = (path: Path): VfsFolder => ({\n type: \"folder\",\n path,\n children: [],\n});\n","import type { Path, VfsFolder } from \"./types\";\nimport { basename, relative, sep } from \"node:path\";\nimport { produce } from \"immer\";\n\nexport const removeNode = (tree: VfsFolder, removedNodePath: Path) => {\n const rootPath = tree.path;\n return produce(tree, (draft) => {\n const pathSegments = relative(rootPath, removedNodePath).split(sep);\n let currentFolder = draft;\n\n for (const pathSegment of pathSegments.slice(0, -1)) {\n const existingChild = currentFolder.children.find(\n (child) =>\n child.type === \"folder\" && basename(child.path) === pathSegment,\n ) as VfsFolder | undefined;\n\n if (existingChild === undefined) {\n return tree;\n } else {\n currentFolder = existingChild;\n }\n }\n\n const removedNodeIndex = currentFolder.children.findIndex(\n (child) => child.path === removedNodePath,\n );\n\n if (removedNodeIndex === -1) {\n return tree;\n }\n\n currentFolder.children.splice(removedNodeIndex, 1);\n });\n};\n","import type { Path, VfsEvents } from \"./types\";\nimport { join, sep } from \"node:path\";\nimport chokidar from \"chokidar\";\nimport { type GlobbyFilterFunction, isGitIgnored } from \"globby\";\nimport { filter, from, Observable, switchMap } from \"rxjs\";\nimport { addDirectory } from \"./add-directory\";\nimport { addFile } from \"./add-file\";\nimport { createVfsRoot } from \"./create-root\";\nimport { removeNode } from \"./remove-node\";\n\nexport const watchFs = (\n path: Path,\n { onlyReady }: { onlyReady?: boolean } = {},\n) => {\n const isIgnored$ = from(isGitIgnored({ cwd: path }));\n\n let vfs$ = isIgnored$.pipe(\n switchMap((isIgnored) => createWatcherObservable({ path, isIgnored })),\n );\n\n if (onlyReady) {\n vfs$ = vfs$.pipe(filter((e) => e.type === \"ready\"));\n }\n\n return vfs$;\n};\n\nconst createWatcherObservable = ({\n path,\n isIgnored,\n}: {\n path: string;\n isIgnored: GlobbyFilterFunction;\n}) => {\n return new Observable<VfsEvents>((observer) => {\n let vfs = createVfsRoot(path);\n const watcher = chokidar.watch(path, {\n ignored: (path) =>\n path.split(sep).includes(\"node_modules\") || isIgnored(path),\n ignoreInitial: false,\n alwaysStat: true,\n awaitWriteFinish: true,\n disableGlobbing: true,\n cwd: path,\n });\n\n watcher.on(\"add\", async (relativePath) => {\n vfs = addFile(vfs, join(path, relativePath));\n observer.next({ type: \"add\", vfs });\n });\n\n watcher.on(\"addDir\", async (relativePath) => {\n vfs = addDirectory(vfs, join(path, relativePath));\n observer.next({ type: \"addDir\", vfs });\n });\n\n watcher.on(\"change\", async () => {\n observer.next({ type: \"change\", vfs });\n });\n\n watcher.on(\"unlink\", async (relativePath) => {\n vfs = removeNode(vfs, join(path, relativePath));\n observer.next({ type: \"unlink\", vfs });\n });\n\n watcher.on(\"unlinkDir\", async (relativePath) => {\n vfs = removeNode(vfs, join(path, relativePath));\n observer.next({ type: \"unlinkDir\", vfs });\n });\n\n watcher.on(\"ready\", () => {\n observer.next({ type: \"ready\", vfs });\n });\n\n return () => {\n watcher.close();\n };\n });\n};\n","import { extname, join } from \"node:path\";\nimport { minimatch } from \"minimatch\";\nimport { getAbstractionInstanceLabel } from \"../abstraction/instance/get-label\";\nimport { rule } from \"../rule/rule\";\nimport type { Diagnostic, Rule } from \"../rule/types\";\nimport { getFlattenFiles } from \"../vfs/get-flatten-files\";\nimport { getNodesRecord } from \"../vfs/get-nodes-record\";\nimport isGlob from \"is-glob\";\n\nexport type DependenciesDirectionOptions = {\n /** Glob patterns on dependency paths; matching imports bypass layer-order checks. */\n allowDownward?: readonly string[];\n};\n\nconst matchesAllowDownward = (\n dependencyPath: string,\n patterns: readonly string[],\n): boolean => {\n const normalized = dependencyPath.replace(/\\\\/g, \"/\");\n return patterns.some(\n (pattern) =>\n minimatch(normalized, pattern) || minimatch(normalized, `**/${pattern}`),\n );\n};\n\nexport const off = <T extends Rule | Rule[]>(rule: T): T => {\n if (Array.isArray(rule)) {\n return rule.map((r) => ({ ...r, severity: \"off\" as const })) as T;\n }\n return { ...rule, severity: \"off\" };\n};\n\nexport const warn = <T extends Rule | Rule[]>(rule: T): T => {\n if (Array.isArray(rule)) {\n return rule.map((r) => ({ ...r, severity: \"warn\" as const })) as T;\n }\n return { ...rule, severity: \"warn\" };\n};\n\nexport const requiredChildren = (abstractions?: string[]) =>\n rule({\n name: \"default/required-children\",\n severity: \"error\",\n check: ({ instance, root }) => {\n const diagnostics: Array<Diagnostic> = [];\n const nodesRecord = getNodesRecord(root);\n\n const reuqiredAbstractions = Object.entries(instance.abstraction.children)\n .filter(([ext]) => !isGlob(ext))\n .filter(\n ([, abstraction]) =>\n !abstractions || abstractions.includes(abstraction.name),\n );\n\n for (const [ext, abstraction] of reuqiredAbstractions) {\n const path = join(instance.path, ext);\n\n const instanceNode = nodesRecord[path];\n if (instanceNode !== undefined) {\n continue;\n }\n\n const message = `Required abstraction \"${abstraction.name}\" in \"${getAbstractionInstanceLabel(instance)}\"`;\n\n if (extname(path) === \"\") {\n diagnostics.push({\n message,\n location: { path },\n fixes: [\n {\n type: \"create-folder\",\n path,\n },\n ],\n });\n } else {\n diagnostics.push({\n message,\n location: { path },\n fixes: [\n {\n type: \"create-file\",\n path,\n content: abstraction.fileTemplate?.(path) ?? \"\",\n },\n ],\n });\n }\n }\n\n return {\n diagnostics,\n };\n },\n });\n\nexport const noUnabstractionFiles = () =>\n rule({\n name: \"default/no-unabstraction-files\",\n severity: \"error\",\n check: ({ instance, root }) => {\n const record = getNodesRecord(root);\n const files = instance.childNodes.filter(\n (node) => record[node]?.type === \"file\",\n );\n if (files.length > 0) {\n return {\n diagnostics: files.map((node) => ({\n message: ` 'Unabstraction files are not allowed in ${instance.abstraction.name}'`,\n location: { path: node },\n })),\n };\n }\n\n return {\n diagnostics: [],\n };\n },\n });\n\nexport const publicAbstraction = (name: string): Rule => ({\n name: \"default/public-abstraction\",\n severity: \"error\",\n check: ({ instance, dependenciesMap, root }) => {\n const diagnostics: Array<Diagnostic> = [];\n const nodesRecord = getNodesRecord(root);\n\n const childFilesEntires = instance.children.flatMap((childInstance) => {\n const instanceNode = nodesRecord[childInstance.path];\n const files = getFlattenFiles(instanceNode);\n return files.map((file) => [file.path, childInstance] as const);\n });\n\n const childFilesIndex = Object.fromEntries(childFilesEntires);\n\n for (const [path, childInstance] of childFilesEntires) {\n const importers = dependenciesMap.dependencyFor[path];\n\n if (!importers) {\n continue;\n }\n\n if (childInstance.abstraction.name === name) {\n continue;\n }\n\n for (const importer of importers) {\n const dependencyInstance = childFilesIndex[importer];\n if (dependencyInstance === undefined) {\n diagnostics.push({\n message: `Imports of \"${getAbstractionInstanceLabel(instance)}\" bypassing the public api are forbidden`,\n location: { path },\n });\n }\n }\n }\n\n return { diagnostics };\n },\n});\n\nexport const restrictCrossImports = () =>\n rule({\n name: \"default/restrict-cross-imports\",\n severity: \"error\",\n check: async ({ root, instance, dependenciesMap }) => {\n const diagnostics: Array<Diagnostic> = [];\n const nodesRecord = getNodesRecord(root);\n\n const childFilesEntires = instance.children.flatMap((childInstance) => {\n const instanceNode = nodesRecord[childInstance.path];\n const files = getFlattenFiles(instanceNode);\n return files.map((file) => [file.path, childInstance] as const);\n });\n\n const childFilesIndex = Object.fromEntries(childFilesEntires);\n\n for (const [path, instance] of childFilesEntires) {\n const dependencies = dependenciesMap.dependencies[path];\n\n for (const dependency of dependencies) {\n const dependencyInstance = childFilesIndex[dependency];\n if (dependencyInstance === undefined) {\n continue;\n }\n\n if (dependencyInstance.path !== instance.path) {\n diagnostics.push({\n message: `Forbidden dependency \"${getAbstractionInstanceLabel(instance)}\" <= \"${getAbstractionInstanceLabel(dependencyInstance)}\".\ncross imports are not allowed!`,\n location: { path },\n });\n }\n }\n }\n\n return { diagnostics };\n },\n });\n\nexport const dependenciesDirection = (\n order: string[],\n options?: DependenciesDirectionOptions,\n) =>\n rule({\n name: `default/dependencies-direction`,\n severity: \"error\",\n check: async ({ root, instance, dependenciesMap }) => {\n const diagnostics: Array<Diagnostic> = [];\n const nodesRecord = getNodesRecord(root);\n const allowDownward = options?.allowDownward ?? [];\n\n const childFilesEntires = instance.children.flatMap((childInstance) => {\n const instanceNode = nodesRecord[childInstance.path];\n const files = getFlattenFiles(instanceNode);\n\n return files.map((file) => [file.path, childInstance] as const);\n });\n\n const childFilesIndex = Object.fromEntries(childFilesEntires);\n\n for (const [path, instance] of childFilesEntires) {\n const dependencies = dependenciesMap.dependencies[path];\n const instanceNameIndex = order.indexOf(instance.abstraction.name);\n\n for (const dependency of dependencies) {\n if (\n allowDownward.length > 0 &&\n matchesAllowDownward(dependency, allowDownward)\n ) {\n continue;\n }\n\n const dependencyInstance = childFilesIndex[dependency];\n if (dependencyInstance === undefined) {\n continue;\n }\n\n const dependencyInstanceNameIndex = order.indexOf(\n dependencyInstance.abstraction.name,\n );\n\n if (dependencyInstanceNameIndex < instanceNameIndex) {\n diagnostics.push({\n message: `Forbidden dependency \"${instance.abstraction.name}\" <= \"${dependencyInstance.abstraction.name}\".\nallowed dependencies order: ${order.join(\" <= \")}`,\n location: { path },\n });\n }\n }\n }\n\n return { diagnostics };\n },\n });\n","import type { AbstractionInstance } from \"../abstraction/instance/types\";\nimport type { Rule, RuleContext } from \"../rule/types\";\nimport type { AugmentedDiagnostic } from \"./reporter\";\n\nexport const runRules = async ({\n root,\n instance,\n dependenciesMap,\n}: RuleContext) => {\n const ruleDiagnostics =\n (currentInstance: AbstractionInstance) => async (rule: Rule) => {\n if (rule.severity === \"off\") {\n return [];\n }\n const { diagnostics } = await rule.check({\n root,\n instance: currentInstance,\n dependenciesMap,\n });\n return diagnostics.map((d) => ({ ...d, rule }));\n };\n\n const runAbstractionRules = (\n currentInstance: AbstractionInstance,\n ): Promise<AugmentedDiagnostic[]>[] => {\n return currentInstance.abstraction.rules\n .map(ruleDiagnostics(currentInstance))\n .concat(...currentInstance.children.flatMap(runAbstractionRules));\n };\n\n return await Promise.all(runAbstractionRules(instance)).then((r) => r.flat());\n};\n","import type { AugmentedDiagnostic } from \"./reporter\";\nimport { dirname, resolve } from \"node:path\";\nimport type { EvolutionConfig } from \"../config/define-config\";\nimport { parseAbstractionInstance } from \"../abstraction/instance/parse\";\nimport { parseDependenciesMap } from \"../dependencies/parse\";\nimport { watchFs } from \"../vfs/watch-fs\";\nimport { debounceTime, type Observable, switchMap } from \"rxjs\";\nimport { runRules } from \"./run-rules\";\n\nexport interface LinterConfig {\n watch?: boolean;\n config: EvolutionConfig;\n configPath: string;\n}\n\nexport const lint = ({\n watch,\n config,\n configPath,\n}: LinterConfig): Observable<AugmentedDiagnostic[]> => {\n const rootPath = resolve(dirname(configPath), config.baseUrl ?? \"./\");\n\n const parseNode = parseAbstractionInstance(config.root);\n return watchFs(rootPath, { onlyReady: !watch }).pipe(\n debounceTime(500),\n switchMap(async ({ vfs }) => ({\n root: vfs,\n instance: parseNode(vfs),\n dependenciesMap: await parseDependenciesMap(vfs),\n })),\n switchMap(runRules),\n );\n};\n"]}
package/package.json ADDED
@@ -0,0 +1,67 @@
1
+ {
2
+ "name": "@echojs-ecosystem/architect",
3
+ "version": "0.1.0",
4
+ "description": "Architecture linter for EchoJS projects — core engine and CLI",
5
+ "files": [
6
+ "dist"
7
+ ],
8
+ "type": "module",
9
+ "sideEffects": false,
10
+ "exports": {
11
+ ".": {
12
+ "types": "./dist/index.d.ts",
13
+ "import": "./dist/index.js"
14
+ },
15
+ "./package.json": "./package.json"
16
+ },
17
+ "bin": {
18
+ "echo-architect": "./dist/cli/index.js"
19
+ },
20
+ "scripts": {
21
+ "build": "tsup",
22
+ "check-types": "tsc -p tsconfig.json --noEmit",
23
+ "typecheck": "tsc -p tsconfig.json --noEmit",
24
+ "lint": "oxlint .",
25
+ "lint:fix": "oxlint . --fix",
26
+ "format": "oxfmt --check .",
27
+ "format:fix": "oxfmt .",
28
+ "test": "vitest run",
29
+ "test:watch": "vitest",
30
+ "test:coverage": "vitest run --coverage"
31
+ },
32
+ "dependencies": {
33
+ "c12": "^1.11.2",
34
+ "chalk": "^5.3.0",
35
+ "chokidar": "^3.6.0",
36
+ "citty": "^0.1.6",
37
+ "figures": "^6.1.0",
38
+ "globby": "^14.0.2",
39
+ "immer": "^10.1.1",
40
+ "is-glob": "^4.0.3",
41
+ "minimatch": "^10.0.1",
42
+ "precinct": "^12.1.2",
43
+ "prexit": "^2.3.0",
44
+ "rxjs": "^7.8.1",
45
+ "terminal-link": "^3.0.0",
46
+ "tsconfck": "^3.1.3",
47
+ "zod": "^3.23.8",
48
+ "zod-validation-error": "^3.3.1"
49
+ },
50
+ "peerDependencies": {
51
+ "typescript": ">=5"
52
+ },
53
+ "devDependencies": {
54
+ "@echojs-ecosystem/oxc-config": "workspace:*",
55
+ "@types/is-glob": "^4.0.4",
56
+ "typescript": "5.9.2",
57
+ "vitest": "^4.1.4"
58
+ },
59
+ "publishConfig": {
60
+ "access": "public"
61
+ },
62
+ "repository": {
63
+ "type": "git",
64
+ "url": "https://github.com/echojs-ecosystem/echojs-core.git",
65
+ "directory": "packages/architect"
66
+ }
67
+ }