Skip to content

Commit 9339af9

Browse files
committed
refactor collection metadata
1 parent ceb7697 commit 9339af9

File tree

13 files changed

+73
-55
lines changed

13 files changed

+73
-55
lines changed

packages/core/src/generators/schema.ts

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
import { schemaComposer } from 'graphql-compose';
22
import { composeWithJson } from 'graphql-compose-json';
3-
import { defaultsDeep, merge } from 'lodash-es';
3+
import { defaultsDeep, get, merge } from 'lodash-es';
44
import plur from 'plur';
55
import { VFile } from 'vfile';
66

@@ -59,7 +59,17 @@ export async function generateSchema(
5959
defaultsDeep(
6060
{},
6161
getFieldOverrides(collection, config),
62-
...nodes.map((node) => merge({}, node, preknownSchemaFragments))
62+
...nodes.map((node) =>
63+
merge(
64+
{
65+
_flatbread: {
66+
reference: get(node, node?._flatbread?.referenceField),
67+
},
68+
},
69+
node,
70+
preknownSchemaFragments
71+
)
72+
)
6373
),
6474
{ schemaComposer }
6575
),
@@ -170,11 +180,9 @@ const fetchPreknownSchemaFragments = (
170180

171181
function getTransformerExtensionMap(transformer: Transformer[]) {
172182
const transformerMap = new Map();
173-
transformer.forEach((t) => {
174-
t.extensions.forEach((extension) => {
175-
transformerMap.set(extension, t);
176-
});
177-
});
183+
transformer.forEach((t) =>
184+
t.extensions.forEach((extension) => transformerMap.set(extension, t))
185+
);
178186
return transformerMap;
179187
}
180188

packages/core/src/types.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,13 @@ export type ContentNode = BaseContentNode & {
2323
export interface FlatbreadConfig {
2424
source: Source;
2525
transformer?: Transformer | Transformer[];
26-
content: Content;
26+
content: Partial<CollectionEntry>[];
2727
}
2828

2929
export interface LoadedFlatbreadConfig {
3030
source: Source;
3131
transformer: Transformer[];
32-
content: Content;
32+
content: CollectionEntry[];
3333
loaded: {
3434
extensions: string[];
3535
};
@@ -69,9 +69,8 @@ export type EntryNode = Record<string, any>;
6969
*/
7070
export interface Source {
7171
initialize?: (flatbreadConfig: LoadedFlatbreadConfig) => void;
72-
fetchByType?: (path: string) => Promise<any[]>;
7372
fetch: (
74-
allContentTypes: Record<string, any>[]
73+
allContentTypes: CollectionEntry[]
7574
) => Promise<Record<string, VFile[]>>;
7675
}
7776

@@ -93,12 +92,14 @@ export interface Override {
9392
}
9493

9594
/**
96-
* An array of content descriptions which can be used to retrieve content nodes.
95+
* A collection entry which can be used to retrieve content nodes.
9796
*
9897
* This is paired with a `Source` (and, *optionally*, a `Transformer`) plugin.
9998
*/
100-
export type Content = {
99+
export interface CollectionEntry {
101100
collection: string;
102101
overrides?: Override[];
102+
referenceField: string;
103+
103104
[key: string]: any;
104-
}[];
105+
}

packages/core/src/utils/initializeConfig.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import { defaultsDeep } from 'lodash-es';
2+
import { CollectionEntry } from '../../dist';
13
import { LoadedFlatbreadConfig, Transformer } from '../types';
24

35
export function initializeConfig(config: any): LoadedFlatbreadConfig {
@@ -10,5 +12,10 @@ export function initializeConfig(config: any): LoadedFlatbreadConfig {
1012
.map((transformer: Transformer) => transformer.extensions || [])
1113
.flat(),
1214
};
15+
16+
config.content = config.content?.map((content: CollectionEntry) =>
17+
defaultsDeep(content, { referenceField: 'id' })
18+
);
19+
1320
return config;
1421
}

packages/source-filesystem/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,7 @@
4141
},
4242
"devDependencies": {
4343
"@flatbread/core": "workspace:*",
44+
"@sindresorhus/slugify": "^2.1.0",
4445
"@types/lodash-es": "4.17.6",
4546
"@types/node": "16.11.47",
4647
"tsup": "6.2.1",

packages/source-filesystem/src/index.ts

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1-
import { defaultsDeep } from 'lodash-es';
1+
import slugify from '@sindresorhus/slugify';
2+
import { defaultsDeep, merge } from 'lodash-es';
23
import { read } from 'to-vfile';
34

4-
import type { LoadedFlatbreadConfig, SourcePlugin } from '@flatbread/core';
5+
import type {
6+
CollectionEntry,
7+
LoadedFlatbreadConfig,
8+
SourcePlugin,
9+
} from '@flatbread/core';
510
import type { VFile } from 'vfile';
611
import type {
712
FileNode,
@@ -18,16 +23,27 @@ import gatherFileNodes from './utils/gatherFileNodes';
1823
* @returns An array of content nodes
1924
*/
2025
async function getNodesFromDirectory(
21-
path: string,
26+
collectionEntry: CollectionEntry,
2227
config: InitializedSourceFilesystemConfig
2328
): Promise<VFile[]> {
2429
const { extensions } = config;
25-
const nodes: FileNode[] = await gatherFileNodes(path, { extensions });
30+
const nodes: FileNode[] = await gatherFileNodes(collectionEntry.path, {
31+
extensions,
32+
});
2633

2734
return Promise.all(
2835
nodes.map(async (node: FileNode): Promise<VFile> => {
2936
const file = await read(node.path);
30-
file.data = node.data;
37+
file.data = merge(node.data, {
38+
_flatbread: {
39+
referenceField: collectionEntry.referenceField,
40+
collection: collectionEntry.collection,
41+
filename: file.basename,
42+
path: file.path,
43+
slug: slugify(file.stem ?? ''),
44+
},
45+
});
46+
3147
return file;
3248
})
3349
);
@@ -40,16 +56,16 @@ async function getNodesFromDirectory(
4056
* @returns
4157
*/
4258
async function getAllNodes(
43-
allContentTypes: Record<string, any>[],
59+
allCollectionEntries: CollectionEntry[],
4460
config: InitializedSourceFilesystemConfig
4561
): Promise<Record<string, VFile[]>> {
4662
const nodeEntries = await Promise.all(
47-
allContentTypes.map(
63+
allCollectionEntries.map(
4864
async (contentType): Promise<Record<string, any>> =>
4965
new Promise(async (res) =>
5066
res([
5167
contentType.collection,
52-
await getNodesFromDirectory(contentType.path, config),
68+
await getNodesFromDirectory(contentType, config),
5369
])
5470
)
5571
)
@@ -76,9 +92,7 @@ const source: SourcePlugin = (sourceConfig?: sourceFilesystemConfig) => {
7692
const { extensions } = flatbreadConfig.loaded;
7793
config = defaultsDeep(sourceConfig ?? {}, { extensions });
7894
},
79-
fetchByType: (path: string) => getNodesFromDirectory(path, config),
80-
fetch: (allContentTypes: Record<string, any>[]) =>
81-
getAllNodes(allContentTypes, config),
95+
fetch: (content: CollectionEntry[]) => getAllNodes(content, config),
8296
};
8397
};
8498

packages/transformer-markdown/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
"node": "^14.13.1 || >=16.0.0"
3636
},
3737
"dependencies": {
38-
"@sindresorhus/slugify": "^2.1.0",
3938
"graphql": "16.5.0",
4039
"gray-matter": "^4.0.3",
4140
"lodash-es": "^4.17.21",

packages/transformer-markdown/src/index.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
import matter from 'gray-matter';
2-
import slugify from '@sindresorhus/slugify';
3-
import { html, excerpt, timeToRead } from './graphql/schema-helpers';
2+
import { excerpt, html, timeToRead } from './graphql/schema-helpers';
43

5-
import type { MarkdownTransformerConfig } from './types';
64
import type { EntryNode, TransformerPlugin } from '@flatbread/core';
75
import type { VFile } from 'vfile';
6+
import type { MarkdownTransformerConfig } from './types';
87

98
export * from './types';
109

@@ -20,9 +19,6 @@ export const parse = (
2019
): EntryNode => {
2120
const { data, content } = matter(String(input), config.grayMatter);
2221
return {
23-
_filename: input.basename,
24-
_path: input.path,
25-
_slug: slugify(input.stem ?? ''),
2622
...input.data,
2723
...data,
2824
_content: {

packages/transformer-yaml/package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
"node": "^14.13.1 || >=16.0.0"
3636
},
3737
"dependencies": {
38-
"@sindresorhus/slugify": "^2.1.0",
3938
"js-yaml": "^4.1.0"
4039
},
4140
"devDependencies": {

packages/transformer-yaml/src/index.ts

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
1-
import yaml from 'js-yaml';
2-
import type { YAMLException } from 'js-yaml';
3-
import slugify from '@sindresorhus/slugify';
41
import type { EntryNode, TransformerPlugin } from '@flatbread/core';
2+
import type { YAMLException } from 'js-yaml';
3+
import yaml from 'js-yaml';
54
import { VFile } from 'vfile';
65

76
/**
@@ -18,9 +17,6 @@ export const parse = (input: VFile): EntryNode => {
1817

1918
if (typeof doc === 'object') {
2019
return {
21-
_filename: input.basename,
22-
_path: input.path,
23-
_slug: slugify(input.stem ?? ''),
2420
...input.data,
2521
...doc,
2622
};

packages/transformer-yaml/src/tests/snapshots/index.test.ts.md

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,6 @@ Generated by [AVA](https://avajs.dev).
99
> Snapshot 1
1010
1111
{
12-
_filename: undefined,
13-
_path: undefined,
14-
_slug: '',
1512
date_joined: Date 2021-02-25 16:41:59 558ms UTC {},
1613
enjoys: [
1714
'cats',

0 commit comments

Comments
 (0)