Skip to content

Commit f10738b

Browse files
committed
expose all document related method from host
1 parent b1444a5 commit f10738b

File tree

25 files changed

+850
-716
lines changed

25 files changed

+850
-716
lines changed

src/app/src/app.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ const appPortal = ref<HTMLElement>()
2727
2828
const activeDocuments = ref<{ fsPath: string, title: string }[]>([])
2929
function detectActiveDocuments() {
30-
activeDocuments.value = host.document.detectActives().map((content) => {
30+
activeDocuments.value = host.document.utils.detectActives().map((content) => {
3131
return {
3232
fsPath: content.fsPath,
3333
title: content.title,

src/app/src/components/content/ContentCardReview.vue

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,13 @@ import type { PropType } from 'vue'
44
import { ref, computed, nextTick, watch, onMounted, onUnmounted } from 'vue'
55
import { DraftStatus, ContentFileExtension } from '../../types'
66
import { getFileExtension } from '../../utils/file'
7-
import { generateContentFromDocument, isEqual } from '../../utils/content'
87
import { useMonacoDiff } from '../../composables/useMonacoDiff'
98
import { useMonaco } from '../../composables/useMonaco'
109
import { useStudio } from '../../composables/useStudio'
1110
import { fromBase64ToUTF8 } from '../../utils/string'
11+
import { areContentEqual } from '../../utils/content'
1212
13-
const { ui } = useStudio()
13+
const { ui, host } = useStudio()
1414
1515
const props = defineProps({
1616
draftItem: {
@@ -89,11 +89,12 @@ watch(isOpen, () => {
8989
async function initializeEditor() {
9090
isLoadingContent.value = true
9191
92+
const generateContentFromDocument = host.document.generate.contentFromDocument
9293
const localOriginal = props.draftItem.original ? await generateContentFromDocument(props.draftItem.original as DatabaseItem) : null
9394
const gitHubOriginal = props.draftItem.githubFile?.content ? fromBase64ToUTF8(props.draftItem.githubFile.content) : null
9495
const modified = props.draftItem.modified ? await generateContentFromDocument(props.draftItem.modified as DatabasePageItem) : null
9596
96-
isAutomaticFormattingDetected.value = !isEqual(localOriginal, gitHubOriginal)
97+
isAutomaticFormattingDetected.value = !areContentEqual(localOriginal, gitHubOriginal)
9798
9899
// Wait for DOM to update before initializing Monaco
99100
await nextTick()

src/app/src/components/content/ContentEditorCode.vue

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,11 @@
22
import { computed, ref, watch } from 'vue'
33
import { ContentFileExtension, type DatabasePageItem, type DraftItem, DraftStatus, type DatabaseItem } from '../../types'
44
import type { PropType } from 'vue'
5-
import { generateContentFromDocument, isEqual, pickReservedKeysFromDocument } from '../../utils/content'
65
import { setupSuggestion } from '../../utils/monaco'
76
import { useStudio } from '../../composables/useStudio'
87
import { useMonaco } from '../../composables/useMonaco'
98
import { fromBase64ToUTF8 } from '../../utils/string'
9+
import { areContentEqual } from '../../utils/content'
1010
1111
const props = defineProps({
1212
draftItem: {
@@ -67,11 +67,11 @@ const { editor, setContent: setEditorContent } = useMonaco(editorRef, {
6767
6868
content.value = newContent
6969
70-
host.document.generateDocumentFromContent(document.value!.id, content.value).then((doc) => {
70+
host.document.generate.documentFromContent(document.value!.id, content.value).then((doc) => {
7171
localStatus.value = DraftStatus.Updated
7272
7373
document.value = {
74-
...pickReservedKeysFromDocument(props.draftItem.modified as DatabasePageItem || document.value!),
74+
...host.document.utils.pickReservedKeys(props.draftItem.modified as DatabasePageItem || document.value!),
7575
...doc,
7676
} as DatabasePageItem
7777
})
@@ -110,17 +110,18 @@ watch(() => document.value?.id + '-' + props.draftItem.version, async () => {
110110
}, { immediate: true })
111111
112112
async function setContent(document: DatabasePageItem) {
113-
const md = await generateContentFromDocument(document) || ''
113+
const contentFromDocument = host.document.generate.contentFromDocument
114+
const md = await contentFromDocument(document) || ''
114115
content.value = md
115116
setEditorContent(md, true)
116117
currentDocumentId.value = document.id
117118
118119
isAutomaticFormattingDetected.value = false
119120
if (props.draftItem.original && props.draftItem.githubFile?.content) {
120-
const localOriginal = await generateContentFromDocument(props.draftItem.original as DatabaseItem)
121+
const localOriginal = await contentFromDocument(props.draftItem.original as DatabaseItem)
121122
const gitHubOriginal = fromBase64ToUTF8(props.draftItem.githubFile.content)
122123
123-
isAutomaticFormattingDetected.value = !isEqual(localOriginal, gitHubOriginal)
124+
isAutomaticFormattingDetected.value = !areContentEqual(localOriginal, gitHubOriginal)
124125
}
125126
}
126127
</script>

src/app/src/components/content/ContentEditorText.vue

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,17 @@ import { parseMarkdown, stringifyMarkdown } from '@nuxtjs/mdc/runtime'
55
import { decompressTree, compressTree } from '@nuxt/content/runtime'
66
import type { MDCRoot } from '@nuxtjs/mdc'
77
import type { MarkdownRoot } from '@nuxt/content'
8-
import { removeReservedKeysFromDocument } from '../../utils/content'
8+
import { useStudio } from '../../composables/useStudio'
99
10+
const { host } = useStudio()
1011
const document = defineModel<DatabasePageItem>()
1112
const content = ref('')
1213
1314
watch(() => document.value?.id, async () => {
1415
if (document.value?.body) {
1516
// @ts-expect-error todo fix MarkdownRoot/MDCRoot conversion in MDC module
1617
const tree = document.value.body.type === 'minimark' ? decompressTree(document.value.body) : (document.value.body as MDCRoot)
17-
const data = removeReservedKeysFromDocument(document.value)
18+
const data = host.document.utils.removeReservedKeys(document.value)
1819
stringifyMarkdown(tree, data).then((md) => {
1920
content.value = md || ''
2021
})

src/app/src/composables/useContext.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,8 +106,8 @@ export const useContext = createSharedComposable((
106106
const rootDocumentFsPath = joinURL(fsPath, 'index.md')
107107
const navigationDocumentFsPath = joinURL(fsPath, '.navigation.yml')
108108

109-
const navigationDocument = await host.document.create(navigationDocumentFsPath, `title: ${folderName}`)
110-
const rootDocument = await host.document.create(rootDocumentFsPath, `# ${upperFirst(folderName)} root file`)
109+
const navigationDocument = await host.document.db.create(navigationDocumentFsPath, `title: ${folderName}`)
110+
const rootDocument = await host.document.db.create(rootDocumentFsPath, `# ${upperFirst(folderName)} root file`)
111111

112112
await activeTree.value.draft.create(navigationDocumentFsPath, navigationDocument)
113113
const rootDocumentDraftItem = await activeTree.value.draft.create(rootDocumentFsPath, rootDocument)
@@ -136,7 +136,7 @@ export const useContext = createSharedComposable((
136136
},
137137
[StudioItemActionId.CreateDocument]: async (params: CreateFileParams) => {
138138
const { fsPath, content } = params
139-
const document = await host.document.create(fsPath, content)
139+
const document = await host.document.db.create(fsPath, content)
140140
const draftItem = await activeTree.value.draft.create(fsPath, document as DatabaseItem)
141141
await activeTree.value.selectItemByFsPath(draftItem.fsPath)
142142
},

src/app/src/composables/useDraftBase.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ export function useDraftBase<T extends DatabaseItem | MediaItem>(
1818
const current = ref<DraftItem<DatabaseItem | MediaItem> | null>(null)
1919

2020
const ghPathPrefix = type === 'media' ? 'public' : 'content'
21-
const hostDb = type === 'media' ? host.media : host.document
21+
const hostDb = type === 'media' ? host.media : host.document.db
2222
const hookName = `studio:draft:${type}:updated` as const
2323

2424
const hooks = useHooks()
@@ -38,7 +38,7 @@ export function useDraftBase<T extends DatabaseItem | MediaItem>(
3838
const draftItem: DraftItem<T> = {
3939
fsPath,
4040
githubFile,
41-
status: getDraftStatus(item, original),
41+
status: getDraftStatus(item, original!, host.document.utils.areEqual),
4242
modified: item,
4343
}
4444

@@ -128,14 +128,14 @@ export function useDraftBase<T extends DatabaseItem | MediaItem>(
128128

129129
// Renamed draft
130130
if (existingItem.original) {
131-
await revert(existingItem.original.fsPath, { rerender: false })
131+
await revert(existingItem.original.fsPath!, { rerender: false })
132132
}
133133
}
134134
else {
135135
// @ts-expect-error upsert type is wrong, second param should be DatabaseItem | MediaItem
136136
await hostDb.upsert(draftItem.fsPath, existingItem.original)
137137
existingItem.modified = existingItem.original
138-
existingItem.status = getDraftStatus(existingItem.modified, existingItem.original)
138+
existingItem.status = getDraftStatus(existingItem.modified as DatabaseItem, existingItem.original as DatabaseItem, host.document.utils.areEqual)
139139
await storage.setItem(draftItem.fsPath, existingItem)
140140
}
141141
}

src/app/src/composables/useDraftDocuments.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import type { DatabaseItem, DraftItem, StudioHost, RawFile } from '../types'
22
import { DraftStatus } from '../types/draft'
33
import type { useGit } from './useGit'
4-
import { generateContentFromDocument } from '../utils/content'
54
import { getDraftStatus } from '../utils/draft'
65
import { createSharedComposable } from '@vueuse/core'
76
import { useHooks } from './useHooks'
@@ -26,6 +25,8 @@ export const useDraftDocuments = createSharedComposable((host: StudioHost, git:
2625
} = useDraftBase<DatabaseItem>('document', host, git, storage)
2726

2827
const hooks = useHooks()
28+
const hostDb = host.document.db
29+
const generateContentFromDocument = host.document.generate.contentFromDocument
2930

3031
async function update(fsPath: string, document: DatabaseItem): Promise<DraftItem<DatabaseItem>> {
3132
const existingItem = list.value.find(item => item.fsPath === fsPath) as DraftItem<DatabaseItem>
@@ -34,15 +35,15 @@ export const useDraftDocuments = createSharedComposable((host: StudioHost, git:
3435
}
3536

3637
const oldStatus = existingItem.status
37-
existingItem.status = getDraftStatus(document, existingItem.original)
38+
existingItem.status = getDraftStatus(document, existingItem.original as DatabaseItem, host.document.utils.areEqual)
3839
existingItem.modified = document
3940

4041
await storage.setItem(fsPath, existingItem)
4142

4243
list.value = list.value.map(item => item.fsPath === fsPath ? existingItem : item)
4344

4445
// Upsert document in database
45-
await host.document.upsert(fsPath, existingItem.modified)
46+
await hostDb.upsert(fsPath, existingItem.modified)
4647

4748
// Trigger hook to warn that draft list has changed
4849
if (existingItem.status !== oldStatus) {
@@ -61,7 +62,7 @@ export const useDraftDocuments = createSharedComposable((host: StudioHost, git:
6162
const { fsPath, newFsPath } = item
6263

6364
const existingDraftToRename = list.value.find(draftItem => draftItem.fsPath === fsPath) as DraftItem<DatabaseItem>
64-
const dbItemToRename = await host.document.get(fsPath)
65+
const dbItemToRename = await hostDb.get(fsPath)
6566
if (!dbItemToRename) {
6667
throw new Error(`Database item not found for document fsPath: ${fsPath}`)
6768
}
@@ -76,7 +77,7 @@ export const useDraftDocuments = createSharedComposable((host: StudioHost, git:
7677

7778
await remove([fsPath], { rerender: false })
7879

79-
const newDbItem = await host.document.create(newFsPath, content!)
80+
const newDbItem = await hostDb.create(newFsPath, content!)
8081

8182
await create(newFsPath, newDbItem, originalDbItem, { rerender: false })
8283
}
@@ -85,7 +86,7 @@ export const useDraftDocuments = createSharedComposable((host: StudioHost, git:
8586
}
8687

8788
async function duplicate(fsPath: string): Promise<DraftItem<DatabaseItem>> {
88-
let currentDbItem = await host.document.get(fsPath)
89+
let currentDbItem = await hostDb.get(fsPath)
8990
if (!currentDbItem) {
9091
throw new Error(`Database item not found for document fsPath: ${fsPath}`)
9192
}
@@ -103,7 +104,7 @@ export const useDraftDocuments = createSharedComposable((host: StudioHost, git:
103104

104105
const newFsPath = `${currentFsPath.split('/').slice(0, -1).join('/')}/${currentNameWithoutExtension}-copy.${currentExtension}`
105106

106-
const newDbItem = await host.document.create(newFsPath, currentContent)
107+
const newDbItem = await hostDb.create(newFsPath, currentContent)
107108

108109
return await create(newFsPath, newDbItem)
109110
}

src/app/src/composables/useStudio.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import { useDraftMedias } from './useDraftMedias'
77
import { ref } from 'vue'
88
import { useTree } from './useTree'
99
import type { RouteLocationNormalized } from 'vue-router'
10-
import type { StudioHost, GitOptions } from '../types'
10+
import type { StudioHost, GitOptions, DatabaseItem } from '../types'
1111
import { StudioFeature } from '../types'
1212
import { documentStorage, mediaStorage, nullStorageDriver } from '../utils/storage'
1313
import { useHooks } from './useHooks'
@@ -83,6 +83,7 @@ export const useStudio = createSharedComposable(() => {
8383

8484
function initDevelopmentMode(host: StudioHost, draftDocuments: ReturnType<typeof useDraftDocuments>, draftMedias: ReturnType<typeof useDraftMedias>, documentTree: ReturnType<typeof useTree>, mediaTree: ReturnType<typeof useTree>) {
8585
const hooks = useHooks()
86+
const areDocumentsEqual = host.document.utils.areEqual
8687

8788
// Disable browser storages
8889
documentStorage.mount('/', nullStorageDriver)
@@ -99,10 +100,10 @@ function initDevelopmentMode(host: StudioHost, draftDocuments: ReturnType<typeof
99100
else if (item) {
100101
// Update draft if the document is not focused or the current item is not the one that was updated
101102
if (!window.document.hasFocus() || documentTree.currentItem.value?.fsPath !== fsPath) {
102-
const document = await host.document.get(fsPath)
103+
const document = await host.document.db.get(fsPath)
103104
item.modified = document
104105
item.original = document
105-
item.status = getDraftStatus(document, item.original)
106+
item.status = getDraftStatus(document as DatabaseItem, item.original as DatabaseItem, areDocumentsEqual)
106107
item.version = item.version ? item.version + 1 : 1
107108
}
108109
}
@@ -123,7 +124,7 @@ function initDevelopmentMode(host: StudioHost, draftDocuments: ReturnType<typeof
123124
const media = await host.media.get(fsPath)
124125
item.modified = media
125126
item.original = media
126-
item.status = getDraftStatus(media, item.original)
127+
item.status = getDraftStatus(media, item.original, areDocumentsEqual)
127128
item.version = item.version ? item.version + 1 : 1
128129
}
129130
}

src/app/src/composables/useTree.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -98,10 +98,10 @@ export const useTree = (type: StudioFeature, host: StudioHost, draft: ReturnType
9898

9999
// Trigger tree rebuild to update files status
100100
async function handleDraftUpdate(selectItem: boolean = true) {
101-
const api = type === StudioFeature.Content ? host.document : host.media
102-
const list = await api.list() as DatabaseItem[]
101+
const hostDb = type === StudioFeature.Content ? host.document.db : host.media
102+
const list = await hostDb.list() as DatabaseItem[]
103103

104-
tree.value = buildTree(list, draft.list.value)
104+
tree.value = buildTree(list, draft.list.value, host.document.utils.areEqual)
105105

106106
// Reselect current item to update status
107107
if (selectItem) {

src/app/src/shared.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
1-
export { generateContentFromDocument, removeReservedKeysFromDocument } from './utils/content'
21
export { VirtualMediaCollectionName } from './utils/media'

0 commit comments

Comments
 (0)