Skip to content

Commit 7a520cf

Browse files
committed
remove fsPath before storing file
1 parent 59d087b commit 7a520cf

File tree

3 files changed

+60
-49
lines changed

3 files changed

+60
-49
lines changed

src/module/src/runtime/host.dev.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { useStudioHost as useStudioHostBase } from './host'
22
import type { StudioUser, DatabaseItem, Repository } from 'nuxt-studio/app'
33
import { getCollectionByFilePath, generateIdFromFsPath, generateFsPathFromId, getCollectionById } from './utils/collection'
4-
import { populateDocumentbasedOnCollectionInfo } from './utils/document'
4+
import { normalizeDocument } from './utils/document'
55
import { createStorage } from 'unstorage'
66
import httpDriver from 'unstorage/drivers/http'
77
import { useRuntimeConfig } from '#imports'
@@ -35,9 +35,9 @@ export function useStudioHost(user: StudioUser, repository: Repository) {
3535
}
3636

3737
const id = generateIdFromFsPath(fsPath, collectionInfo)
38-
const doc = populateDocumentbasedOnCollectionInfo(id, collectionInfo, upsertedDocument)
38+
const document = normalizeDocument(id, collectionInfo, upsertedDocument)
3939

40-
const content = await host.document.generate.contentFromDocument(doc)
40+
const content = await host.document.generate.contentFromDocument(document)
4141

4242
await devStorage.setItem(fsPath, content, {
4343
headers: {

src/module/src/runtime/host.ts

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import { ensure } from './utils/ensure'
33
import type { CollectionInfo, CollectionItemBase, CollectionSource, DatabaseAdapter } from '@nuxt/content'
44
import type { ContentDatabaseAdapter } from '../types/content'
55
import { getCollectionByFilePath, generateIdFromFsPath, generateRecordDeletion, generateRecordInsert, generateFsPathFromId, getCollectionById } from './utils/collection'
6-
import { populateDocumentbasedOnCollectionInfo, isDocumentMatchingContent, normalizeDocument, generateDocumentFromContent, generateContentFromDocument, areDocumentsEqual, pickReservedKeysFromDocument, removeReservedKeysFromDocument } from './utils/document'
6+
import { normalizeDocument, isDocumentMatchingContent, generateDocumentFromContent, generateContentFromDocument, areDocumentsEqual, pickReservedKeysFromDocument, removeReservedKeysFromDocument } from './utils/document'
77
import { kebabCase } from 'scule'
88
import type { StudioHost, StudioUser, DatabaseItem, MediaItem, Repository } from 'nuxt-studio/app'
99
import type { RouteLocationNormalized, Router } from 'vue-router'
@@ -194,7 +194,14 @@ export function useStudioHost(user: StudioUser, repository: Repository): StudioH
194194
const id = generateIdFromFsPath(fsPath, collectionInfo)
195195
const item = await useContentCollectionQuery(collectionInfo.name).where('id', '=', id).first()
196196

197-
return item ? normalizeDocument(fsPath, item as DatabaseItem) : undefined
197+
if (!item) {
198+
return undefined
199+
}
200+
201+
return {
202+
...item,
203+
fsPath,
204+
}
198205
},
199206
list: async (): Promise<DatabaseItem[]> => {
200207
const collections = Object.values(useContentCollections()).filter(collection => collection.name !== 'info')
@@ -205,7 +212,10 @@ export function useStudioHost(user: StudioUser, repository: Repository): StudioH
205212
const source = getCollectionSourceById(document.id, collection.source)
206213
const fsPath = generateFsPathFromId(document.id, source!)
207214

208-
return normalizeDocument(fsPath, document)
215+
return {
216+
...document,
217+
fsPath,
218+
}
209219
})
210220
}))
211221

@@ -225,11 +235,14 @@ export function useStudioHost(user: StudioUser, repository: Repository): StudioH
225235
}
226236

227237
const document = await generateDocumentFromContent(id, content)
228-
const collectionDocument = populateDocumentbasedOnCollectionInfo(id, collectionInfo, document!)
238+
const normalizedDocument = normalizeDocument(id, collectionInfo, document!)
229239

230-
await host.document.db.upsert(fsPath, collectionDocument)
240+
await host.document.db.upsert(fsPath, normalizedDocument)
231241

232-
return normalizeDocument(fsPath, collectionDocument!)
242+
return {
243+
...normalizedDocument,
244+
fsPath,
245+
}
233246
},
234247
upsert: async (fsPath: string, document: CollectionItemBase) => {
235248
const collectionInfo = getCollectionByFilePath(fsPath, useContentCollections())
@@ -239,10 +252,10 @@ export function useStudioHost(user: StudioUser, repository: Repository): StudioH
239252

240253
const id = generateIdFromFsPath(fsPath, collectionInfo)
241254

242-
const doc = populateDocumentbasedOnCollectionInfo(id, collectionInfo, document)
255+
const normalizedDocument = normalizeDocument(id, collectionInfo, document)
243256

244257
await useContentDatabaseAdapter(collectionInfo.name).exec(generateRecordDeletion(collectionInfo, id))
245-
await useContentDatabaseAdapter(collectionInfo.name).exec(generateRecordInsert(collectionInfo, doc))
258+
await useContentDatabaseAdapter(collectionInfo.name).exec(generateRecordInsert(collectionInfo, normalizedDocument))
246259
},
247260
delete: async (fsPath: string) => {
248261
const collection = getCollectionByFilePath(fsPath, useContentCollections())

src/module/src/runtime/utils/document.ts

Lines changed: 36 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,43 @@ const reservedKeys = ['id', 'fsPath', 'stem', 'extension', '__hash__', 'path', '
2020
/*
2121
** Normalization utils
2222
*/
23-
export function normalizeDocument(fsPath: string, document: DatabaseItem): DatabaseItem {
24-
return {
25-
...document,
26-
fsPath,
23+
export function normalizeDocument(id: string, collectionInfo: CollectionInfo, document: CollectionItemBase) {
24+
const parsedContent = [
25+
pathMetaTransform,
26+
].reduce((acc, fn) => collectionInfo.type === 'page' ? fn(acc as PageCollectionItemBase) : acc, { ...document, id } as PageCollectionItemBase)
27+
const result = { id } as DatabaseItem
28+
const meta = parsedContent.meta as Record<string, unknown>
29+
30+
const collectionKeys = getOrderedSchemaKeys(collectionInfo.schema)
31+
for (const key of Object.keys(parsedContent)) {
32+
if (collectionKeys.includes(key)) {
33+
result[key] = parsedContent[key as keyof PageCollectionItemBase]
34+
}
35+
else {
36+
meta[key] = parsedContent[key as keyof PageCollectionItemBase]
37+
}
38+
}
39+
40+
// Clean fsPath from meta to avoid storing it in the database
41+
if (meta.fsPath) {
42+
Reflect.deleteProperty(meta, 'fsPath')
2743
}
44+
45+
result.meta = meta
46+
47+
// Storing `content` into `rawbody` field
48+
// TODO: handle rawbody
49+
// if (collectionKeys.includes('rawbody')) {
50+
// result.rawbody = result.rawbody ?? file.body
51+
// }
52+
53+
if (collectionKeys.includes('seo')) {
54+
const seo = result.seo = (result.seo || {}) as PageCollectionItemBase['seo']
55+
seo.title = seo.title || result.title as string
56+
seo.description = seo.description || result.description as string
57+
}
58+
59+
return result
2860
}
2961

3062
export function pickReservedKeysFromDocument(document: DatabaseItem): DatabaseItem {
@@ -183,40 +215,6 @@ export function areDocumentsEqual(document1: Record<string, unknown>, document2:
183215
/*
184216
** Generation utils
185217
*/
186-
export function populateDocumentbasedOnCollectionInfo(id: string, collectionInfo: CollectionInfo, document: CollectionItemBase) {
187-
const parsedContent = [
188-
pathMetaTransform,
189-
].reduce((acc, fn) => collectionInfo.type === 'page' ? fn(acc as PageCollectionItemBase) : acc, { ...document, id } as PageCollectionItemBase)
190-
const result = { id } as DatabaseItem
191-
const meta = parsedContent.meta as Record<string, unknown>
192-
193-
const collectionKeys = getOrderedSchemaKeys(collectionInfo.schema)
194-
for (const key of Object.keys(parsedContent)) {
195-
if (collectionKeys.includes(key)) {
196-
result[key] = parsedContent[key as keyof PageCollectionItemBase]
197-
}
198-
else {
199-
meta[key] = parsedContent[key as keyof PageCollectionItemBase]
200-
}
201-
}
202-
203-
result.meta = meta
204-
205-
// Storing `content` into `rawbody` field
206-
// TODO: handle rawbody
207-
// if (collectionKeys.includes('rawbody')) {
208-
// result.rawbody = result.rawbody ?? file.body
209-
// }
210-
211-
if (collectionKeys.includes('seo')) {
212-
const seo = result.seo = (result.seo || {}) as PageCollectionItemBase['seo']
213-
seo.title = seo.title || result.title as string
214-
seo.description = seo.description || result.description as string
215-
}
216-
217-
return result
218-
}
219-
220218
export async function generateDocumentFromContent(id: string, content: string): Promise<DatabaseItem | null> {
221219
const [_id, _hash] = id.split('#')
222220
const extension = getFileExtension(id)

0 commit comments

Comments
 (0)