Skip to content

Commit ba879fd

Browse files
authored
Add filepath as second argument of RenderMap transform helpers (#948)
1 parent c7058a3 commit ba879fd

File tree

4 files changed

+61
-9
lines changed

4 files changed

+61
-9
lines changed

.changeset/solid-tables-decide.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
'@codama/renderers-core': patch
3+
---
4+
5+
Add filepath as second argument of RenderMap transform helpers

packages/renderers-core/README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -246,6 +246,12 @@ const updatedRenderMap = await mapRenderMapContentAsync(renderMap, async content
246246
});
247247
```
248248

249+
Note that in both cases, a second argument is available in the mapping function that provides the relative path of the file being transformed.
250+
251+
```ts
252+
const updatedRenderMap = mapRenderMapContent(renderMap, (content, path) => `/** File: ${path} */\n\n${content}`);
253+
```
254+
249255
### Writing a `RenderMap` to the filesystem
250256

251257
When the `RenderMap` is ready to be written to the filesystem, you can use the `writeRenderMap` helper by providing the base directory where all files should be written. All paths inside the `RenderMap` will be appended to this base directory.

packages/renderers-core/src/renderMap.ts

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -61,36 +61,40 @@ export function mergeRenderMaps<TFragment extends BaseFragment>(
6161

6262
export function mapRenderMapFragment<TFragment extends BaseFragment>(
6363
renderMap: RenderMap<TFragment>,
64-
fn: (fragment: TFragment) => TFragment,
64+
fn: (fragment: TFragment, path: Path) => TFragment,
6565
): RenderMap<TFragment> {
66-
return Object.freeze(new Map([...[...renderMap.entries()].map(([key, value]) => [key, fn(value)] as const)]));
66+
return Object.freeze(new Map([...[...renderMap.entries()].map(([key, value]) => [key, fn(value, key)] as const)]));
6767
}
6868

6969
export async function mapRenderMapFragmentAsync<TFragment extends BaseFragment>(
7070
renderMap: RenderMap<TFragment>,
71-
fn: (fragment: TFragment) => Promise<TFragment>,
71+
fn: (fragment: TFragment, path: Path) => Promise<TFragment>,
7272
): Promise<RenderMap<TFragment>> {
7373
return Object.freeze(
7474
new Map(
7575
await Promise.all([
76-
...[...renderMap.entries()].map(async ([key, value]) => [key, await fn(value)] as const),
76+
...[...renderMap.entries()].map(async ([key, value]) => [key, await fn(value, key)] as const),
7777
]),
7878
),
7979
);
8080
}
8181

8282
export function mapRenderMapContent<TFragment extends BaseFragment>(
8383
renderMap: RenderMap<TFragment>,
84-
fn: (content: string) => string,
84+
fn: (content: string, path: Path) => string,
8585
): RenderMap<TFragment> {
86-
return mapRenderMapFragment(renderMap, fragment => mapFragmentContent(fragment, fn));
86+
return mapRenderMapFragment(renderMap, (fragment, path) =>
87+
mapFragmentContent(fragment, content => fn(content, path)),
88+
);
8789
}
8890

8991
export async function mapRenderMapContentAsync<TFragment extends BaseFragment>(
9092
renderMap: RenderMap<TFragment>,
91-
fn: (content: string) => Promise<string>,
93+
fn: (content: string, path: Path) => Promise<string>,
9294
): Promise<RenderMap<TFragment>> {
93-
return await mapRenderMapFragmentAsync(renderMap, fragment => mapFragmentContentAsync(fragment, fn));
95+
return await mapRenderMapFragmentAsync(renderMap, (fragment, path) =>
96+
mapFragmentContentAsync(fragment, content => fn(content, path)),
97+
);
9498
}
9599

96100
export function getFromRenderMap<TFragment extends BaseFragment>(

packages/renderers-core/test/renderMap.test.ts

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,10 @@ describe('mapRenderMapContent', () => {
152152
test('it maps the content of all entries inside a render map', () => {
153153
expect(
154154
mapRenderMapContent(
155-
createRenderMap({ pathA: { content: 'ContentA' }, pathB: { content: 'ContentB' } }),
155+
createRenderMap({
156+
pathA: { content: 'ContentA' },
157+
pathB: { content: 'ContentB' },
158+
}),
156159
content => `Mapped: ${content}`,
157160
),
158161
).toStrictEqual(
@@ -163,6 +166,23 @@ describe('mapRenderMapContent', () => {
163166
);
164167
});
165168

169+
test('it provides the path of the content being mapped', () => {
170+
expect(
171+
mapRenderMapContent(
172+
createRenderMap({
173+
pathA: { content: 'Content' },
174+
pathB: { content: 'Content' },
175+
}),
176+
(content, path) => `${content} from ${path}`,
177+
),
178+
).toStrictEqual(
179+
new Map([
180+
['pathA', { content: 'Content from pathA' }],
181+
['pathB', { content: 'Content from pathB' }],
182+
]),
183+
);
184+
});
185+
166186
test('it freezes the returned render map', () => {
167187
assert.isFrozen(mapRenderMapContent(createRenderMap(), c => c));
168188
});
@@ -186,6 +206,23 @@ describe('mapRenderMapContentAsync', () => {
186206
);
187207
});
188208

209+
test('it provides the path of the content being mapped', async () => {
210+
expect(
211+
await mapRenderMapContentAsync(
212+
createRenderMap({
213+
pathA: { content: 'Content' },
214+
pathB: { content: 'Content' },
215+
}),
216+
(content, path) => Promise.resolve(`${content} from ${path}`),
217+
),
218+
).toStrictEqual(
219+
new Map([
220+
['pathA', { content: 'Content from pathA' }],
221+
['pathB', { content: 'Content from pathB' }],
222+
]),
223+
);
224+
});
225+
189226
test('it freezes the returned render map', async () => {
190227
assert.isFrozen(await mapRenderMapContentAsync(createRenderMap(), c => Promise.resolve(c)));
191228
});

0 commit comments

Comments
 (0)