Skip to content

Commit ffabaef

Browse files
authored
Replace getIndex with getIndexes and recognize index.*.js as an index (#3)
1 parent ec63053 commit ffabaef

File tree

4 files changed

+125
-35
lines changed

4 files changed

+125
-35
lines changed

README.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -184,13 +184,13 @@ function isSliced(layerOrName: Folder | LayerName): boolean;
184184

185185
Determine if this layer is sliced. You can pass the folder of a layer or the name (lowercase). Only layers Shared and App are not sliced, the rest are.
186186

187-
#### `getIndex`
187+
#### `getIndexes`
188188

189189
```ts
190-
function getIndex(fileOrFolder: File | Folder): File | undefined;
190+
function getIndexes(fileOrFolder: File | Folder): File[];
191191
```
192192

193-
Get the index (public API) of a slice or segment. When a segment is a file, it is its own index.
193+
Get the index (public API) of a slice or segment. When a segment is a file, it is its own index. When a segment is a folder, it returns an array of index files within that folder. Multiple index files (e.g., `index.client.js`, `index.server.js`) are supported.
194194

195195
#### `isIndex`
196196

src/fsd-aware-traverse.ts

Lines changed: 14 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -154,20 +154,27 @@ export function isSliced(layerOrName: Folder | LayerName): boolean {
154154
* Get the index (public API) of a slice or segment.
155155
*
156156
* When a segment is a file, it is its own index.
157+
* When a segment is a folder, it returns an array of index files within that folder.
158+
* Multiple index files (e.g., `index.client.js`, `index.server.js`) are supported.
157159
*/
158-
export function getIndex(fileOrFolder: File | Folder): File | undefined {
160+
export function getIndexes(fileOrFolder: File | Folder): File[] {
159161
if (fileOrFolder.type === "file") {
160-
return fileOrFolder;
161-
} else {
162-
return fileOrFolder.children.find(isIndex) as File | undefined;
162+
return [fileOrFolder];
163163
}
164+
165+
return fileOrFolder.children.filter(isIndex);
164166
}
165167

166168
/** Determine if a given file or folder is an index file. */
167169
export function isIndex(fileOrFolder: File | Folder): boolean {
168-
return (
169-
fileOrFolder.type === "file" && parse(fileOrFolder.path).name === "index"
170-
);
170+
if (fileOrFolder.type === "file") {
171+
const separator = ".";
172+
const parsedFileName = parse(fileOrFolder.path).name;
173+
174+
return parsedFileName.split(separator).at(0) === "index";
175+
}
176+
177+
return false;
171178
}
172179

173180
/**

src/index.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ export {
55
getAllSlices,
66
getAllSegments,
77
isSliced,
8-
getIndex,
8+
getIndexes,
99
isSlice,
1010
isIndex,
1111
isCrossImportPublicApi,

src/specs/fsd-aware-traverse.spec.ts

Lines changed: 107 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import { join } from "node:path";
2-
import { test, expect } from "vitest";
2+
import { test, expect, describe } from "vitest";
33

44
import {
55
getAllSlices,
6-
getIndex,
6+
getIndexes,
77
getSlices,
88
isSlice,
99
isSliced,
@@ -123,28 +123,111 @@ test("isSliced", () => {
123123
).toBe(true);
124124
});
125125

126-
test("getIndex", () => {
127-
const indexFile: File = {
128-
type: "file",
129-
path: joinFromRoot("project", "src", "shared", "index.ts"),
130-
};
131-
const fileSegment: File = {
132-
type: "file",
133-
path: joinFromRoot("project", "src", "entities", "user", "ui.ts"),
134-
};
135-
const folderSegment = parseIntoFolder(
136-
`
137-
📄 Avatar.tsx
138-
📄 User.tsx
139-
📄 index.ts
140-
`,
141-
joinFromRoot("project", "src", "entities", "user", "ui"),
142-
);
143-
expect(getIndex(indexFile)).toEqual(indexFile);
144-
expect(getIndex(fileSegment)).toEqual(fileSegment);
145-
expect(getIndex(folderSegment)).toEqual({
146-
type: "file",
147-
path: joinFromRoot("project", "src", "entities", "user", "ui", "index.ts"),
126+
describe("getIndexes", () => {
127+
test("basic functionality", () => {
128+
const indexFile: File = {
129+
type: "file",
130+
path: joinFromRoot("project", "src", "shared", "index.ts"),
131+
};
132+
const fileSegment: File = {
133+
type: "file",
134+
path: joinFromRoot("project", "src", "entities", "user", "ui.ts"),
135+
};
136+
const folderSegment = parseIntoFolder(
137+
`
138+
📄 Avatar.tsx
139+
📄 User.tsx
140+
📄 index.ts
141+
`,
142+
joinFromRoot("project", "src", "entities", "user", "ui"),
143+
);
144+
expect(getIndexes(indexFile)).toEqual([indexFile]);
145+
expect(getIndexes(fileSegment)).toEqual([fileSegment]);
146+
expect(getIndexes(folderSegment)).toEqual([
147+
{
148+
type: "file",
149+
path: joinFromRoot(
150+
"project",
151+
"src",
152+
"entities",
153+
"user",
154+
"ui",
155+
"index.ts",
156+
),
157+
},
158+
]);
159+
});
160+
161+
test("recognizes index.server.js as index file", () => {
162+
const indexServerFile: File = {
163+
type: "file",
164+
path: joinFromRoot("project", "src", "shared", "index.server.js"),
165+
};
166+
const nonIndexFile: File = {
167+
type: "file",
168+
path: joinFromRoot("project", "src", "entities", "user", "ui.ts"),
169+
};
170+
const folderSegment = parseIntoFolder(
171+
`
172+
📄 Avatar.tsx
173+
📄 User.tsx
174+
📄 index.server.js
175+
`,
176+
joinFromRoot("project", "src", "entities", "user", "ui"),
177+
);
178+
179+
expect(getIndexes(indexServerFile)).toEqual([indexServerFile]);
180+
expect(getIndexes(nonIndexFile)).toEqual([nonIndexFile]);
181+
expect(getIndexes(folderSegment)).toEqual([
182+
{
183+
type: "file",
184+
path: joinFromRoot(
185+
"project",
186+
"src",
187+
"entities",
188+
"user",
189+
"ui",
190+
"index.server.js",
191+
),
192+
},
193+
]);
194+
});
195+
196+
test("handles multiple index files", () => {
197+
const folderSegment = parseIntoFolder(
198+
`
199+
📄 Avatar.tsx
200+
📄 User.tsx
201+
📄 index.client.js
202+
📄 index.server.js
203+
`,
204+
joinFromRoot("project", "src", "entities", "user", "ui"),
205+
);
206+
207+
expect(getIndexes(folderSegment)).toEqual([
208+
{
209+
type: "file",
210+
path: joinFromRoot(
211+
"project",
212+
"src",
213+
"entities",
214+
"user",
215+
"ui",
216+
"index.client.js",
217+
),
218+
},
219+
{
220+
type: "file",
221+
path: joinFromRoot(
222+
"project",
223+
"src",
224+
"entities",
225+
"user",
226+
"ui",
227+
"index.server.js",
228+
),
229+
},
230+
]);
148231
});
149232
});
150233

0 commit comments

Comments
 (0)