feat: schema builder's create flow

This commit is contained in:
Florian Sylvain committed 2026-10-20 00:29:01 +02:00
1 parent f514146fed
commit 083cc9e23e
71 files changed
+7223 -61

No files matched your search

+31 -2
View File
@@ -76,6 +76,16 @@ export const builtinTypes = [
fields: key === 'articles' ? articleFields : new Array(count),
}))
export function createdType(body: Record<string, unknown>) {
return {
id: 4,
icon: null,
created_at: '2026-10-19T09:30:00Z',
updated_at: '2026-10-19T09:30:00Z',
...body,
}
}
export function manyTypes(count: number) {
return Array.from({ length: count }, (_, index) => ({
...customTypes[0]!,
@@ -92,12 +102,24 @@ export function failWith(status: number): Responder {
}
}
export function failWithBody(status: number, body: string): Responder {
return () => {
throw new ApiError(status, undefined, body)
}
}
export const networkFailure: Responder = () => {
throw new NetworkError()
}
export interface PostedRequest {
url: string
body: Record<string, unknown>
}
export interface SchemaMount {
role?: string
create?: (body: PostedRequest['body']) => unknown
width?: number
content?: Responder
builtin?: Responder
@@ -107,9 +129,11 @@ export interface SchemaMount {
let wrapper: VueWrapper | undefined
export const calls: string[] = []
export const posts: PostedRequest[] = []
export async function mountAt(path: string, options: SchemaMount = {}, shellOnly = false) {
calls.length = 0
posts.length = 0
localStorage.clear()
setViewportWidth(options.width ?? DESKTOP_WIDTH)
const pinia = createPinia()
@@ -130,10 +154,15 @@ export async function mountAt(path: string, options: SchemaMount = {}, shellOnly
role: (options.role ?? 'owner') as never,
}
session.status = 'ready'
const request = vi.fn(async (url: string) => {
const request = vi.fn(async (url: string, init?: RequestInit) => {
if (init?.method === 'POST') {
const body = JSON.parse(String(init.body)) as PostedRequest['body']
posts.push({ url, body })
return (options.create ?? (() => createdType(body)))(body)
}
calls.push(url)
if (url === '/v1/content-type') {
return (options.content ?? (() => customTypes))()
return (options.content ?? (() => [...customTypes]))()
}
if (url === '/v1/builtin-type') {
return (options.builtin ?? (() => builtinTypes))()