Skip to content

Commit 04b090f

Browse files
committed
📘 doc: ground work for virtual file system
1 parent aabe7f8 commit 04b090f

File tree

10 files changed

+160
-59
lines changed

10 files changed

+160
-59
lines changed

bun.lock

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
"elysia": "^1.4.7",
1818
"lucide-vue-next": "^0.544.0",
1919
"medium-zoom": "^1.1.0",
20+
"memfs": "^4.49.0",
2021
"monaco-editor": "^0.53.0",
2122
"monaco-editor-auto-typings": "^0.4.6",
2223
"motion-v": "^1.6.1",
@@ -42,6 +43,7 @@
4243
"@elysiajs/static": "^1.4.0",
4344
"@hono/zod-validator": "^0.7.2",
4445
"@nolebase/vitepress-plugin-inline-link-preview": "^2.18.1",
46+
"@rollup/browser": "^4.52.4",
4547
"@rollup/plugin-node-resolve": "^16.0.1",
4648
"@shikijs/vitepress-twoslash": "^3.13.0",
4749
"@tailwindcss/postcss": "^4.1.11",
@@ -325,6 +327,18 @@
325327

326328
"@js-sdsl/ordered-map": ["@js-sdsl/ordered-map@4.4.2", "", {}, "sha512-iUKgm52T8HOE/makSxjqoWhe95ZJA1/G1sYsGev2JDKUSS14KAgg1LHb+Ba+IPow0xflbnSkOsZcO08C7w1gYw=="],
327329

330+
"@jsonjoy.com/base64": ["@jsonjoy.com/base64@1.1.2", "", { "peerDependencies": { "tslib": "2" } }, "sha512-q6XAnWQDIMA3+FTiOYajoYqySkO+JSat0ytXGSuRdq9uXE7o92gzuQwQM14xaCRlBLGq3v5miDGC4vkVTn54xA=="],
331+
332+
"@jsonjoy.com/buffers": ["@jsonjoy.com/buffers@1.2.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-6RX+W5a+ZUY/c/7J5s5jK9UinLfJo5oWKh84fb4X0yK2q4WXEWUWZWuEMjvCb1YNUQhEAhUfr5scEGOH7jC4YQ=="],
333+
334+
"@jsonjoy.com/codegen": ["@jsonjoy.com/codegen@1.0.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-E8Oy+08cmCf0EK/NMxpaJZmOxPqM+6iSe2S4nlSBrPZOORoDJILxtbSUEDKQyTamm/BVAhIGllOBNU79/dwf0g=="],
335+
336+
"@jsonjoy.com/json-pack": ["@jsonjoy.com/json-pack@1.19.0", "", { "dependencies": { "@jsonjoy.com/base64": "^1.1.2", "@jsonjoy.com/buffers": "^1.2.0", "@jsonjoy.com/codegen": "^1.0.0", "@jsonjoy.com/json-pointer": "^1.0.2", "@jsonjoy.com/util": "^1.9.0", "hyperdyperid": "^1.2.0", "thingies": "^2.5.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-ed3bz2NTJOH+i/HoVOGDjI9FCIA1yW2xLFuB+7PABRJrs0Dj+SoUpHMhQgNe2xYZ3zTiT2jb6xp8VTvM1MBdcQ=="],
337+
338+
"@jsonjoy.com/json-pointer": ["@jsonjoy.com/json-pointer@1.0.2", "", { "dependencies": { "@jsonjoy.com/codegen": "^1.0.0", "@jsonjoy.com/util": "^1.9.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-Fsn6wM2zlDzY1U+v4Nc8bo3bVqgfNTGcn6dMgs6FjrEnt4ZCe60o6ByKRjOGlI2gow0aE/Q41QOigdTqkyK5fg=="],
339+
340+
"@jsonjoy.com/util": ["@jsonjoy.com/util@1.9.0", "", { "dependencies": { "@jsonjoy.com/buffers": "^1.0.0", "@jsonjoy.com/codegen": "^1.0.0" }, "peerDependencies": { "tslib": "2" } }, "sha512-pLuQo+VPRnN8hfPqUTLTHk126wuYdXVxE6aDmjSeV4NCAgyxWbiOIeNJVtID3h1Vzpoi9m4jXezf73I6LgabgQ=="],
341+
328342
"@kitajs/html": ["@kitajs/html@4.2.9", "", { "dependencies": { "csstype": "^3.1.3" } }, "sha512-FDHHf5Mi5nR0D+Btq86IV1O9XfsePVCiC5rwU4PXjw2aHja16FmIiwLZBO0CS16rJxKkibjMldyRLAW2ni2mzA=="],
329343

330344
"@kitajs/ts-html-plugin": ["@kitajs/ts-html-plugin@4.1.1", "", { "dependencies": { "chalk": "^4.1.2", "tslib": "^2.8.1", "yargs": "^17.7.2" }, "peerDependencies": { "@kitajs/html": "^4.2.5", "typescript": "^5.6.2" }, "bin": { "ts-html-plugin": "dist/cli.js", "xss-scan": "dist/cli.js" } }, "sha512-wmjyV8hmJmDOnUM/ZyPkc0UBYgUYmf32/93rkW8wr8h+HiHVMU0tEKFnmRdBjTcy9jwoC9Bnt2NuzS9l67lq5g=="],
@@ -487,6 +501,8 @@
487501

488502
"@rolldown/pluginutils": ["@rolldown/pluginutils@1.0.0-beta.42", "", {}, "sha512-N7pQzk9CyE7q0bBN/q0J8s6Db279r5kUZc6d7/wWRe9/zXqC52HQovVyu6iXPIDY4BEzzgbVLhVFXrOuGJ22ZQ=="],
489503

504+
"@rollup/browser": ["@rollup/browser@4.52.4", "", { "dependencies": { "@types/estree": "1.0.8" } }, "sha512-N9IYkGkDhr8Drq3Dbs3B07jrgJzMnVmhw4HxiZyFjU3jd7yA7Wu3wJS6crlWJQVc6AInkVqzUm0vH/T8EpDI6A=="],
505+
490506
"@rollup/plugin-inject": ["@rollup/plugin-inject@5.0.5", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "estree-walker": "^2.0.2", "magic-string": "^0.30.3" }, "peerDependencies": { "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-2+DEJbNBoPROPkgTDNe8/1YXWcqxbN5DTjASVIOx8HS+pITXushyNiBV56RB08zuptzz8gT3YfkqriTBVycepg=="],
491507

492508
"@rollup/plugin-node-resolve": ["@rollup/plugin-node-resolve@16.0.1", "", { "dependencies": { "@rollup/pluginutils": "^5.0.1", "@types/resolve": "1.20.2", "deepmerge": "^4.2.2", "is-module": "^1.0.0", "resolve": "^1.22.1" }, "peerDependencies": { "rollup": "^2.78.0||^3.0.0||^4.0.0" }, "optionalPeers": ["rollup"] }, "sha512-tk5YCxJWIG81umIvNkSod2qK5KyQW19qcBF/B78n1bjtOON6gzKoVeSzAE8yHCZEDmqkHKkxplExA8KzdJLJpA=="],
@@ -973,6 +989,8 @@
973989

974990
"glob": ["glob@10.4.5", "", { "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { "glob": "dist/esm/bin.mjs" } }, "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg=="],
975991

992+
"glob-to-regex.js": ["glob-to-regex.js@1.2.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-QMwlOQKU/IzqMUOAZWubUOT8Qft+Y0KQWnX9nK3ch0CJg0tTp4TvGZsTfudYKv2NzoQSyPcnA6TYeIQ3jGichQ=="],
993+
976994
"gopd": ["gopd@1.2.0", "", {}, "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg=="],
977995

978996
"graceful-fs": ["graceful-fs@4.2.11", "", {}, "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ=="],
@@ -1013,6 +1031,8 @@
10131031

10141032
"https-browserify": ["https-browserify@1.0.0", "", {}, "sha512-J+FkSdyD+0mA0N+81tMotaRMfSL9SGi+xpD3T6YApKsc3bGSXJlfXri3VyFOeYkfLRQisDk1W+jIFFKBeUBbBg=="],
10151033

1034+
"hyperdyperid": ["hyperdyperid@1.2.0", "", {}, "sha512-Y93lCzHYgGWdrJ66yIktxiaGULYc6oGiABxhcO5AufBeOyoIdZF7bIfLaOrbM0iGIOXQQgxxRrFEnb+Y6w1n4A=="],
1035+
10161036
"iconv-lite": ["iconv-lite@0.6.3", "", { "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" } }, "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw=="],
10171037

10181038
"ieee754": ["ieee754@1.2.1", "", {}, "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="],
@@ -1173,6 +1193,8 @@
11731193

11741194
"medium-zoom": ["medium-zoom@1.1.0", "", {}, "sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ=="],
11751195

1196+
"memfs": ["memfs@4.49.0", "", { "dependencies": { "@jsonjoy.com/json-pack": "^1.11.0", "@jsonjoy.com/util": "^1.9.0", "glob-to-regex.js": "^1.0.1", "thingies": "^2.5.0", "tree-dump": "^1.0.3", "tslib": "^2.0.0" } }, "sha512-L9uC9vGuc4xFybbdOpRLoOAOq1YEBBsocCs5NVW32DfU+CZWWIn3OVF+lB8Gp4ttBVSMazwrTrjv8ussX/e3VQ=="],
1197+
11761198
"merge-descriptors": ["merge-descriptors@2.0.0", "", {}, "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g=="],
11771199

11781200
"micromark": ["micromark@4.0.2", "", { "dependencies": { "@types/debug": "^4.0.0", "debug": "^4.0.0", "decode-named-character-reference": "^1.0.0", "devlop": "^1.0.0", "micromark-core-commonmark": "^2.0.0", "micromark-factory-space": "^2.0.0", "micromark-util-character": "^2.0.0", "micromark-util-chunked": "^2.0.0", "micromark-util-combine-extensions": "^2.0.0", "micromark-util-decode-numeric-character-reference": "^2.0.0", "micromark-util-encode": "^2.0.0", "micromark-util-normalize-identifier": "^2.0.0", "micromark-util-resolve-all": "^2.0.0", "micromark-util-sanitize-uri": "^2.0.0", "micromark-util-subtokenize": "^2.0.0", "micromark-util-symbol": "^2.0.0", "micromark-util-types": "^2.0.0" } }, "sha512-zpe98Q6kvavpCr1NPVSCMebCKfD7CA2NqZ+rykeNhONIJBpc1tFKt9hucLGwha3jNTNI8lHpctWJWoimVF4PfA=="],
@@ -1603,6 +1625,8 @@
16031625

16041626
"thenify-all": ["thenify-all@1.6.0", "", { "dependencies": { "thenify": ">= 3.1.0 < 4" } }, "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA=="],
16051627

1628+
"thingies": ["thingies@2.5.0", "", { "peerDependencies": { "tslib": "^2" } }, "sha512-s+2Bwztg6PhWUD7XMfeYm5qliDdSiZm7M7n8KjTkIsm3l/2lgVRc2/Gx/v+ZX8lT4FMA+i8aQvhcWylldc+ZNw=="],
1629+
16061630
"thread-stream": ["thread-stream@3.1.0", "", { "dependencies": { "real-require": "^0.2.0" } }, "sha512-OqyPZ9u96VohAyMfJykzmivOrY2wfMSf3C5TtFJVgN+Hm6aj+voFhlK+kZEIv2FBh1X6Xp3DlnCOfEQ3B2J86A=="],
16071631

16081632
"timers-browserify": ["timers-browserify@2.0.12", "", { "dependencies": { "setimmediate": "^1.0.4" } }, "sha512-9phl76Cqm6FhSX9Xe1ZUAMLtm1BLkKj2Qd5ApyWkXzsMRaA7dgr81kf4wJmQf/hAvg8EEyJxDo3du/0KlhPiKQ=="],
@@ -1619,6 +1643,8 @@
16191643

16201644
"tokenx": ["tokenx@1.1.0", "", {}, "sha512-KCjtiC2niPwTSuz4ktM82Ki5bjqBwYpssiHDsGr5BpejN/B3ksacRvrsdoxljdMIh2nCX78alnDkeemBmYUmTA=="],
16211645

1646+
"tree-dump": ["tree-dump@1.1.0", "", { "peerDependencies": { "tslib": "2" } }, "sha512-rMuvhU4MCDbcbnleZTFezWsaZXRFemSqAM+7jPnzUl1fo9w3YEKOxAeui0fz3OI4EU4hf23iyA7uQRVko+UaBA=="],
1647+
16221648
"trim-lines": ["trim-lines@3.0.1", "", {}, "sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg=="],
16231649

16241650
"trough": ["trough@2.2.0", "", {}, "sha512-tmMpK00BjZiUyVyvrBK7knerNgmgvcV/KLVyuma/SC+TQN167GrMRciANTz09+k3zW8L8t60jWO1GpfkZdjTaw=="],

docs/.vitepress/config.ts

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,9 @@ export default defineConfig({
2626
},
2727
languages: ['js', 'ts'],
2828
codeTransformers: [
29-
transformerTwoslash({
30-
typesCache: createFileSystemTypesCache({
31-
dir: './docs/.vitepress/cache/twoslash'
32-
})
33-
})
29+
// transformerTwoslash({
30+
// typesCache: createFileSystemTypesCache()
31+
// })
3432
],
3533
config: (md) => {
3634
md.use(lightbox, {})
@@ -48,7 +46,7 @@ export default defineConfig({
4846
},
4947
plugins: [
5048
nodePolyfills({
51-
include: ['path']
49+
include: ['path', 'crypto']
5250
}),
5351
tailwindcss(),
5452
process.env.NODE_ENV === 'production'
@@ -67,7 +65,7 @@ export default defineConfig({
6765
process.env.ANALYZE === 'true' ? analyzer() : undefined
6866
],
6967
optimizeDeps: {
70-
exclude: ['@nolebase/vitepress-plugin-inline-link-preview/client']
68+
exclude: ['@nolebase/vitepress-plugin-inline-link-preview/client', '.vitepress/cache', '@rollup/browser']
7169
},
7270
ssr: {
7371
noExternal: [

docs/components/xiao/playground/components/editor-layout.vue

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@
7171
</PopoverPortal>
7272
</PopoverRoot>
7373
</header>
74+
7475
<slot />
7576
</template>
7677

docs/components/xiao/playground/components/editor.vue

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
<template>
2-
<div id="elysia-playground-editor" class="w-full h-full" />
2+
<div id="elysia-playground-editor" class="flex flex-1 w-full h-full" />
33
</template>
44

55
<script setup lang="ts">
@@ -18,9 +18,9 @@ const newEditor = () => {
1818
editor.value?.dispose?.()
1919
editor.value = createEditor({
2020
id: 'elysia-playground-editor',
21-
code: store.code,
21+
code: store.fs['index.ts'],
2222
onChange(newCode) {
23-
store.code = newCode
23+
store.fs['index.ts'] = newCode
2424
}
2525
}).then(store.syncEditorTheme)
2626
}

docs/components/xiao/playground/playground.vue

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
<ElysiaChan />
33

44
<div
5-
class="flex flex-col sm:flex-row gap-0.5 w-full min-h-screen py-1.5 bg-gray-50 dark:bg-gray-950"
5+
class="flex flex-col sm:flex-row gap-0.5 w-full min-h-dvh py-1.5 bg-gray-50 dark:bg-gray-950"
66
>
77
<Aside />
88

@@ -30,7 +30,7 @@
3030
>
3131
<SplitterPanel
3232
:default-size="60"
33-
class="relative h-fit bg-[#eff1f5] dark:bg-[#1e1e2e] border dark:border-gray-700 rounded-2xl overflow-hidden"
33+
class="relative flex flex-col bg-[#eff1f5] dark:bg-[#1e1e2e] border dark:border-gray-700 rounded-2xl overflow-hidden"
3434
>
3535
<div
3636
class="absolute w-full h-full opacity-7.5 dark:opacity-6.25 bg-no-repeat pointer-events-none"
@@ -41,9 +41,9 @@
4141
"
4242
/>
4343
<EditorLayout>
44-
<ClientOnly>
45-
<Editor />
46-
</ClientOnly>
44+
<ClientOnly>
45+
<Editor />
46+
</ClientOnly>
4747
</EditorLayout>
4848
</SplitterPanel>
4949
<SplitterResizeHandle class="p-0.75" />
@@ -70,32 +70,44 @@ import ClientOnly from './components/client-only.vue'
7070
import Aside from './components/aside.vue'
7171
7272
const Doc = defineAsyncComponent(() => import('./components/doc.vue'))
73-
const Result = defineAsyncComponent(() => import('./components/result/result.vue'))
74-
const ElysiaChan = defineAsyncComponent(() => import('../elysia-chan/elysia-chan.vue'))
75-
const EditorLayout = defineAsyncComponent(() => import('./components/editor-layout.vue'))
73+
const Result = defineAsyncComponent(
74+
() => import('./components/result/result.vue')
75+
)
76+
const ElysiaChan = defineAsyncComponent(
77+
() => import('../elysia-chan/elysia-chan.vue')
78+
)
79+
const EditorLayout = defineAsyncComponent(
80+
() => import('./components/editor-layout.vue')
81+
)
7682
const Editor = defineAsyncComponent(() => import('./components/editor.vue'))
7783
7884
const size = useWindowSize()
7985
86+
import type { VirtualFS } from './utils'
8087
import type { Testcases } from './types'
8188
8289
const props = defineProps<{
83-
code?: string
90+
code?: string | VirtualFS
8491
testcases?: Testcases
8592
}>()
8693
8794
const store = usePlaygroundStore()
88-
const router = useRouter()
8995
90-
if (props.code) store.defaultCode = props.code
96+
if (props.code)
97+
store.defaultFS =
98+
typeof props.code === 'string' ? { 'index.ts': props.code } : props.code
99+
91100
if (props.testcases) store.testcases = props.testcases
92101
93102
store.load()
94103
95-
if (!store.code && props.code) store.run()
96-
else if (store.code) store.run({ test: true })
104+
if (!store.fs['index.ts'] && props.code) store.run()
105+
else if (store.fs['index.ts']) store.run({ test: true })
97106
98107
onMounted(() => {
108+
if (!document.documentElement.classList.contains('overscroll-none'))
109+
document.documentElement.classList.add('overscroll-none')
110+
99111
window.addEventListener('beforeunload', store.save, {
100112
passive: true
101113
})
@@ -104,6 +116,9 @@ onMounted(() => {
104116
onUnmounted(() => {
105117
store.save()
106118
window.removeEventListener('beforeunload', store.save)
119+
120+
if (document.documentElement.classList.contains('overscroll-none'))
121+
document.documentElement.classList.remove('overscroll-none')
107122
})
108123
109124
// if (typeof window !== 'undefined')
@@ -131,11 +146,12 @@ const run = () => store.run()
131146
// state sync if infinite loops occurs
132147
// so it doesn't freeze the tab
133148
watchDebounced(
134-
() => store.code,
149+
() => store.fs,
135150
() => {
136151
store.run({ test: true })
137152
},
138153
{
154+
deep: true,
139155
debounce: 8
140156
}
141157
)
Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,13 @@
1+
import { VirtualFS } from './utils'
2+
13
const getPath = () =>
24
(location.pathname.endsWith('/')
35
? location.pathname.slice(0, -1)
46
: location.pathname
57
).replace(/.html$/g, '')
68

79
export const keys = {
8-
code: () => `elysia-playground:code:${getPath()}`,
10+
fs: () => `elysia-playground:fs:${getPath()}`,
911
path: () => `elysia-playground:path:${getPath()}`,
1012
method: () => `elysia-playground:method:${getPath()}`,
1113
body: () => `elysia-playground:body:${getPath()}`,
@@ -14,21 +16,21 @@ export const keys = {
1416
} as const
1517

1618
export function save({
17-
code,
19+
fs,
1820
path,
1921
method,
2022
body,
2123
headers,
2224
cookies
2325
}: {
24-
code?: string
26+
fs?: VirtualFS
2527
path?: string
2628
method?: string
2729
body?: string
2830
headers?: string[][]
2931
cookies?: string[][]
3032
}) {
31-
if (code !== undefined) localStorage.setItem(keys.code(), code)
33+
if (fs !== undefined) localStorage.setItem(keys.fs(), JSON.stringify(fs))
3234
if (path !== undefined) localStorage.setItem(keys.path(), path)
3335
if (method !== undefined) localStorage.setItem(keys.method(), method)
3436
if (body !== undefined) localStorage.setItem(keys.body(), body)
@@ -40,19 +42,36 @@ export function save({
4042

4143
export function load<T extends keyof typeof keys>(
4244
key: T
43-
): (T extends 'headers' | 'cookies' ? string[][] : string) | undefined {
45+
):
46+
| (T extends 'fs'
47+
? VirtualFS
48+
: T extends 'headers' | 'cookies'
49+
? string[][]
50+
: string)
51+
| undefined {
4452
if (typeof localStorage === 'undefined') return
4553

4654
const item = localStorage.getItem(keys[key]())
4755
if (!item) return
4856

49-
if (key === 'headers' || key === 'cookies') {
57+
if (key === 'fs' || key === 'headers' || key === 'cookies') {
5058
try {
5159
return JSON.parse(item)
5260
} catch {
61+
if (key === 'fs' && item) {
62+
const legacyCode = localStorage.getItem(
63+
`elysia-playground:code:${getPath()}`
64+
)
65+
66+
if (legacyCode)
67+
return {
68+
'index.ts': legacyCode
69+
} as any
70+
}
71+
5372
return
5473
}
5574
}
5675

57-
return item
76+
return item as any
5877
}

0 commit comments

Comments
 (0)