Skip to content

Commit 7e59f29

Browse files
committed
feat(dev): enable studio in development mode without auth
1 parent 18c698d commit 7e59f29

File tree

6 files changed

+65
-48
lines changed

6 files changed

+65
-48
lines changed

src/app/src/components/AppFooter.vue

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,19 @@ const user = host.user.get()
1616
1717
const repositoryUrl = computed(() => git.getBranchUrl())
1818
const userMenuItems = computed(() => [
19-
[
20-
// [{
21-
// slot: 'view-mode' as const,
22-
// }
23-
repositoryUrl.value
24-
? {
19+
repositoryUrl.value
20+
? [
21+
// [{
22+
// slot: 'view-mode' as const,
23+
// }
24+
{
2525
label: `${host.repository.owner}/${host.repository.repo}`,
2626
icon: 'i-simple-icons:github',
2727
to: repositoryUrl.value,
2828
target: '_blank',
29-
}
30-
: undefined,
31-
].filter(Boolean),
29+
},
30+
]
31+
: undefined,
3232
[{
3333
label: 'Sign out',
3434
icon: 'i-lucide-log-out',
@@ -38,7 +38,7 @@ const userMenuItems = computed(() => [
3838
})
3939
},
4040
}],
41-
])
41+
].filter(Boolean))
4242
4343
function closeStudio() {
4444
unsetActiveLocation()

src/app/src/components/header/HeaderMain.vue

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<script setup lang="ts">
22
import { useRouter, useRoute } from 'vue-router'
33
import { computed } from 'vue'
4-
import { useStudio } from '../../composables/useStudio'
4+
import { studioFlags, useStudio } from '../../composables/useStudio'
55
import type { StudioFeature } from '../../types'
66
import { useStudioState } from '../../composables/useStudioState'
77
@@ -52,6 +52,7 @@ const current = computed({
5252
/>
5353

5454
<UButton
55+
v-if="!studioFlags.dev"
5556
label="Review"
5657
color="neutral"
5758
:variant="context.draftCount.value > 0 ? 'solid' : 'soft'"

src/app/src/composables/useDraftBase.ts

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import { checkConflict, findDescendantsFromId, getDraftStatus } from '../utils/d
66
import type { useGit } from './useGit'
77
import { useHooks } from './useHooks'
88
import { ref } from 'vue'
9+
import { studioFlags } from './useStudio'
910

1011
export function useDraftBase<T extends DatabaseItem | MediaItem>(
1112
type: 'media' | 'document',
@@ -73,42 +74,44 @@ export function useDraftBase<T extends DatabaseItem | MediaItem>(
7374
await storage.removeItem(id)
7475
await hostDb.delete(id)
7576

76-
let deleteDraftItem: DraftItem<T> | null = null
77-
if (existingDraftItem) {
78-
if (existingDraftItem.status === DraftStatus.Deleted) return
77+
if (!studioFlags.dev) {
78+
let deleteDraftItem: DraftItem<T> | null = null
79+
if (existingDraftItem) {
80+
if (existingDraftItem.status === DraftStatus.Deleted) return
7981

80-
if (existingDraftItem.status === DraftStatus.Created) {
81-
list.value = list.value.filter(item => item.id !== id)
82+
if (existingDraftItem.status === DraftStatus.Created) {
83+
list.value = list.value.filter(item => item.id !== id)
84+
}
85+
else {
86+
deleteDraftItem = {
87+
id,
88+
fsPath: existingDraftItem.fsPath,
89+
status: DraftStatus.Deleted,
90+
original: existingDraftItem.original,
91+
githubFile: existingDraftItem.githubFile,
92+
}
93+
94+
list.value = list.value.map(item => item.id === id ? deleteDraftItem! : item) as DraftItem<T>[]
95+
}
8296
}
8397
else {
98+
// TODO: check if gh file has been updated
99+
const githubFile = await git.fetchFile(joinURL('content', fsPath), { cached: true }) as GithubFile
100+
84101
deleteDraftItem = {
85102
id,
86-
fsPath: existingDraftItem.fsPath,
103+
fsPath,
87104
status: DraftStatus.Deleted,
88-
original: existingDraftItem.original,
89-
githubFile: existingDraftItem.githubFile,
105+
original: originalDbItem,
106+
githubFile,
90107
}
91108

92-
list.value = list.value.map(item => item.id === id ? deleteDraftItem! : item) as DraftItem<T>[]
109+
list.value.push(deleteDraftItem)
93110
}
94-
}
95-
else {
96-
// TODO: check if gh file has been updated
97-
const githubFile = await git.fetchFile(joinURL('content', fsPath), { cached: true }) as GithubFile
98-
99-
deleteDraftItem = {
100-
id,
101-
fsPath,
102-
status: DraftStatus.Deleted,
103-
original: originalDbItem,
104-
githubFile,
105-
}
106-
107-
list.value.push(deleteDraftItem)
108-
}
109111

110-
if (deleteDraftItem) {
111-
await storage.setItem(id, deleteDraftItem)
112+
if (deleteDraftItem) {
113+
await storage.setItem(id, deleteDraftItem)
114+
}
112115
}
113116

114117
if (rerender) {

src/module/src/module.ts

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -71,8 +71,12 @@ interface ModuleOptions {
7171
}
7272
/**
7373
* Enable Nuxt Studio to edit content and media files on your filesystem.
74-
* Currently experimental.
75-
* @experimental
74+
*/
75+
dev: boolean
76+
/**
77+
* Enable Nuxt Studio to edit content and media files on your filesystem.
78+
*
79+
* @deprecated Use the 'dev' option instead.
7680
*/
7781
development?: {
7882
sync?: boolean
@@ -103,6 +107,7 @@ export default defineNuxtModule<ModuleOptions>({
103107
clientSecret: process.env.STUDIO_GITHUB_CLIENT_SECRET,
104108
},
105109
},
110+
dev: false,
106111
development: {
107112
sync: false,
108113
},
@@ -111,10 +116,7 @@ export default defineNuxtModule<ModuleOptions>({
111116
const resolver = createResolver(import.meta.url)
112117
const runtime = (...args: string[]) => resolver.resolve('./runtime', ...args)
113118

114-
if (!nuxt.options.dev) {
115-
options.development!.sync = false
116-
}
117-
119+
options.dev = nuxt.options.dev || options.development?.sync || false
118120
if (!nuxt.options.dev && !nuxt.options._prepare) {
119121
if (!options.auth?.github?.clientId && !options.auth?.github?.clientSecret) {
120122
logger.warn([
@@ -130,8 +132,8 @@ export default defineNuxtModule<ModuleOptions>({
130132

131133
nuxt.options.runtimeConfig.public.studio = {
132134
route: options.route!,
135+
dev: Boolean(options.dev),
133136
development: {
134-
sync: Boolean(options.development!.sync),
135137
server: process.env.STUDIO_DEV_SERVER,
136138
},
137139
// @ts-expect-error Autogenerated type does not match with options
@@ -176,7 +178,7 @@ export default defineNuxtModule<ModuleOptions>({
176178
]
177179
})
178180

179-
if (options.development!.sync) {
181+
if (options.dev) {
180182
nuxt.options.nitro.storage = {
181183
...nuxt.options.nitro.storage,
182184
nuxt_studio_content: {
@@ -185,7 +187,7 @@ export default defineNuxtModule<ModuleOptions>({
185187
},
186188
nuxt_studio_public_assets: {
187189
driver: 'fs',
188-
base: resolve(nuxt.options.srcDir, 'public'),
190+
base: resolve(nuxt.options.rootDir, 'public'),
189191
},
190192
}
191193
addServerHandler({
@@ -220,7 +222,7 @@ export default defineNuxtModule<ModuleOptions>({
220222
})
221223
addTemplate({
222224
filename: 'studio-public-assets.mjs',
223-
getContents: () => options.development!.sync
225+
getContents: () => options.dev
224226
? getAssetsStorageDevTemplate(assetsStorage, nuxt)
225227
: getAssetsStorageTemplate(assetsStorage, nuxt),
226228
})

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { debounce } from 'perfect-debounce'
1111
export function useStudioHost(user: StudioUser, repository: Repository) {
1212
const host = useStudioHostBase(user, repository)
1313

14-
if (!useRuntimeConfig().public.studio.development.sync) {
14+
if (!useRuntimeConfig().public.studio.dev) {
1515
return host
1616
}
1717

src/module/src/runtime/utils/activation.ts

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,17 @@ export async function defineStudioActivationPlugin(onStudioActivation: (user: St
55
const user = useState<StudioUser | null>('studio-session', () => null)
66
const config = useRuntimeConfig().public.studio
77

8+
if (config.dev) {
9+
return await onStudioActivation({
10+
provider: 'github',
11+
12+
name: 'Dev',
13+
githubToken: '',
14+
githubId: '',
15+
avatar: '',
16+
})
17+
}
18+
819
await $fetch<{ user: StudioUser }>('/__nuxt_studio/auth/session').then((session) => {
920
user.value = session?.user ?? null
1021
})

0 commit comments

Comments
 (0)