@ feature- sliced/ 文件系统
一套用于查找文件系统中的FSD根并与之合作的公用设备.
该项目旨在开发工具,用于 特色设计。 。 。 .
安装
pnpm add @feature-sliced/filesystem
npm install --save @feature-sliced/filesystem
类型定义构建于QQ.
API 密码
resolveImport
function resolveImport(
importedPath: string,
importerPath: string,
tsCompilerOptions: typescript.CompilerOptions,
fileExists: (path: string) => boolean,
directoryExists?: (path: string) => boolean,
): string | null;
给出文件名、 导入路径和 TSConfig 对象, 生成导入文件的路径, 相对于 TypeScript 的路径 baseUrl。 。 。 .
示例
// /project/src/pages/home/ui/HomePage.tsx
import { Button } from "~/shared/ui";
// ./tsconfig.json
{
"compilerOptions": {
"moduleResolution": "Bundler",
"baseUrl": ".",
"paths": {
"~/*": ["./src/*"]
}
}
}
resolveImport(
"~/shared/ui",
"./src/pages/home/ui/HomePage.tsx",
{ moduleResolution: "Bundler", baseUrl: ".", paths: { "~/*": ["./src/*"] } },
fs.existsSync,
);
预期产出: /project/src/shared/ui/index.ts。 。 。 .
layerSequence, (中文(简体) ), unslicedLayers,以及 conventionalSegmentNames
FSD中重要名称的定义.
export const layerSequence: Array<LayerName> = [
"shared",
"entities",
"features",
"widgets",
"pages",
"app",
];
export const unslicedLayers = ["shared", "app"];
export const conventionalSegmentNames = ["ui", "api", "lib", "model", "config"];
FSD - 意识向上
简单表示文件系统的一组倒转函数 :
export interface File {
type: "file";
path: string;
}
export interface Folder {
type: "folder";
path: string;
children: Array<File | Folder>;
}
所有倒转函数在层文件夹上识别前缀(下划线或数字后加下划线等). _app 或者说 6_shared) (中文(简体) ). 图层名称总是在没有前缀的情况下报告,而返回的则 Folder 对象保留物理、前缀路径.
getLayers
export type LayerName =
| "shared"
| "entities"
| "features"
| "widgets"
| "pages"
| "app";
function getLayers(fsdRoot: Folder): Partial<Record<LayerName, Folder>>;
从 FSD 根中提取层 。 返回图层名称映射到文件夹对象。 前缀地层( 如. 6_shared, (中文(简体) ), _app) 被绘制到其冠名上(shared, (中文(简体) ), app) (中文(简体) ). 当同一层的前缀和非前缀的变体同时存在时,前缀的一取胜.
getSlices
function getSlices(
slicedLayer: Folder,
additionalSegmentNames: Array<string> = [],
): Record<string, Folder>;
从 a 提取切片 切开 层。 返回切片名称映射( 可能包含斜线) 到文件夹对象 .
当文件夹至少有一个文件夹/文件并有常规片段的名称时, 就会被检测为切片(ui, (中文(简体) ), api, (中文(简体) ), model, (中文(简体) ), lib, (中文(简体) ), config) (中文(简体) ). 如果您的工程包含没有这些片段的片段,您可以提供额外的片段名称.
getSegments
function getSegments(
sliceOrUnslicedLayer: Folder,
): Record<string, Folder | File>;
从切片或切片取出片段 未切开 层。 将分区名称映射到文件夹或文件对象.
getAllSlices
function getAllSlices(
fsdRoot: Folder,
additionalSegmentNames: Array<string> = [],
): Record<string, Folder & { layerName: string }>;
从 FSD 根的所有层提取切片 。 返回切片名称映射到文件夹对象( 可能包含斜线), 并加增 layerName 属性。 这个 layerName 是条形(前缀-已勾接)层名.
当文件夹至少有一个文件夹/文件并有常规片段的名称时, 就会被检测为切片(ui, (中文(简体) ), api, (中文(简体) ), model, (中文(简体) ), lib, (中文(简体) ), config) (中文(简体) ). 如果您的工程包含没有这些片段的片段,您可以提供额外的片段名称.
getAllSegments
function getAllSegments(fsdRoot: Folder): Array<{
segment: Folder | File;
segmentName: string;
sliceName: string | null;
layerName: LayerName;
}>;
从 FSD 根的所有切片和分层中提取段 。 在 FSD 根( 层, 切片) 中返回一个平整的段数组及其名称和位置 .
isSliced
[注]
不要和他们混淆isSlice,这个函数根据文件夹包含的片段来决定文件夹是否像切片.
export type LayerName =
| "shared"
| "entities"
| "features"
| "widgets"
| "pages"
| "app";
function isSliced(layerOrName: Folder | LayerName): boolean;
确定此层是否被切开 。 您可以通过一层的文件夹或名称( 小写) 。 只有共享层和App层没有被切片,其余部分是.
getIndexes
function getIndexes(fileOrFolder: File | Folder): File[];
获取切片或片段的索引(公共 API) 。 当一个片段是一个文件时,它是它自己的索引. 当一个片段是文件夹时,它会返回该文件夹内的一系列索引文件. 多个索引文件(例如, index.client.js, (中文(简体) ), index.server.js) 得到支持.
isIndex
function isIndex(fileOrFolder: File | Folder): boolean;
确定一个给定的文件或文件夹是否是一个索引文件(只有文件可以成为索引,为方便而接受文件夹,但总是返回虚假).
isSlice
[注]
不要和他们混淆isSliced,该函数根据 FSD 确定一个层是否包含切片.
function isSlice(
folder: Folder,
additionalSegmentNames: Array<string> = [],
): boolean;
确定此文件夹是否为切片 .
剪切被定义为包含至少一个部分的文件夹. 如果项目中的某些片段仅包含非常规片段,则可以提供额外的片段名称.
isCrossImportPublicApi
function isCrossImportPublicApi(
file: File,
{
inSlice,
forSlice,
layerPath,
}: { inSlice: string; forSlice: string; layerPath: string },
): boolean;
检查某个文件是否是切片中定义的交叉导入公共 API inSlice 切片时 forSlice 在某一层.
例如:
const file = { path: "./src/entities/user/@x/product.ts", type: "file" };
isCrossImportPublicApi(file, {
inSlice: "user",
forSlice: "product",
layerPath: "./src/entities",
}); // true