Skip to content

Commit 9f58e42

Browse files
committed
feat(store): resourceLinks to custom cdn
1 parent 7bfb1a9 commit 9f58e42

File tree

6 files changed

+93
-22
lines changed

6 files changed

+93
-22
lines changed

src/monaco/env.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,10 @@ export interface WorkerMessage {
122122
event: 'init'
123123
tsVersion: string
124124
tsLocale?: string
125+
pkgDirUrl?: string
126+
pkgFileTextUrl?: string
127+
pkgLatestVersionUrl?: string
128+
typescriptLib?: string
125129
}
126130

127131
export function loadMonacoEnv(store: Store) {
@@ -135,11 +139,27 @@ export function loadMonacoEnv(store: Store) {
135139
resolve()
136140
}
137141
})
138-
worker.postMessage({
142+
143+
const {
144+
pkgDirUrl,
145+
pkgFileTextUrl,
146+
pkgLatestVersionUrl,
147+
typescriptLib,
148+
} = store.resourceLinks || {}
149+
150+
const message: WorkerMessage = {
139151
event: 'init',
140152
tsVersion: store.typescriptVersion,
141153
tsLocale: store.locale,
142-
} satisfies WorkerMessage)
154+
pkgDirUrl: pkgDirUrl ? String(pkgDirUrl) : undefined,
155+
pkgFileTextUrl: pkgFileTextUrl ? String(pkgFileTextUrl) : undefined,
156+
pkgLatestVersionUrl: pkgLatestVersionUrl
157+
? String(pkgLatestVersionUrl)
158+
: undefined,
159+
typescriptLib: typescriptLib ? String(typescriptLib) : undefined,
160+
}
161+
162+
worker.postMessage(message)
143163
})
144164
await init
145165
return worker

src/monaco/resource.ts

Lines changed: 7 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -16,22 +16,19 @@ export type CreateNpmFileSystemOptions = {
1616
pkgPath: string,
1717
) => string
1818
getPackageFileTextUrl?: (
19-
path: string,
2019
pkgName: string,
2120
pkgVersion: string | undefined,
2221
pkgPath: string,
2322
) => string
2423
}
2524

2625
const defaultUnpkgOptions: Required<CreateNpmFileSystemOptions> = {
27-
getPackageLatestVersionUrl: (pkgName: string) =>
26+
getPackageLatestVersionUrl: (pkgName) =>
2827
`https://unpkg.com/${pkgName}@latest/package.json`,
29-
getPackageDirectoryUrl: (
30-
pkgName: string,
31-
pkgVersion: string,
32-
pkgPath: string,
33-
) => `https://unpkg.com/${pkgName}@${pkgVersion}/${pkgPath}/?meta`,
34-
getPackageFileTextUrl: (path: string) => `https://unpkg.com/${path}`,
28+
getPackageDirectoryUrl: (pkgName, pkgVersion, pkgPath) =>
29+
`https://unpkg.com/${pkgName}@${pkgVersion}/${pkgPath}/?meta`,
30+
getPackageFileTextUrl: (pkgName, pkgVersion, pkgPath) =>
31+
`https://unpkg.com/${pkgName}@${pkgVersion || 'latest'}/${pkgPath}`,
3532
}
3633

3734
export function createNpmFileSystem(
@@ -235,7 +232,7 @@ export function createNpmFileSystem(
235232
return
236233
}
237234
const text = await fetchText(
238-
getPackageFileTextUrl(path, pkgName, _version, pkgFilePath),
235+
getPackageFileTextUrl(pkgName, _version, pkgFilePath),
239236
)
240237
if (text !== undefined) {
241238
onFetch?.(path, text)
@@ -317,7 +314,7 @@ export function createNpmFileSystem(
317314
version = modName.substring(modName.lastIndexOf('@') + 1)
318315
}
319316
if (!version && getPackageVersion) {
320-
getPackageVersion?.(pkgName)
317+
version = getPackageVersion?.(pkgName)
321318
}
322319
return [modName, pkgName, version, path]
323320
}

src/monaco/vue.worker.ts

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,14 +45,30 @@ export interface CreateData {
4545

4646
const asFileName = (uri: URI) => uri.path
4747
const asUri = (fileName: string): URI => URI.file(fileName)
48+
const createFunc = (func?: string) => (func && typeof func === 'string') ? Function(`return ${func}`)() : undefined
4849

4950
let ts: typeof import('typescript')
5051
let locale: string | undefined
52+
let resourceLinks: Record<
53+
keyof Pick<
54+
WorkerMessage,
55+
'pkgDirUrl' | 'pkgFileTextUrl' | 'pkgLatestVersionUrl'
56+
>,
57+
((...args: any[]) => string) | undefined
58+
>
5159

5260
self.onmessage = async (msg: MessageEvent<WorkerMessage>) => {
5361
if (msg.data?.event === 'init') {
5462
locale = msg.data.tsLocale
55-
ts = await importTsFromCdn(msg.data.tsVersion)
63+
ts = await importTsFromCdn(
64+
msg.data.tsVersion,
65+
createFunc(msg.data.typescriptLib),
66+
)
67+
resourceLinks = {
68+
pkgDirUrl: createFunc(msg.data.pkgDirUrl),
69+
pkgFileTextUrl: createFunc(msg.data.pkgFileTextUrl),
70+
pkgLatestVersionUrl: createFunc(msg.data.pkgLatestVersionUrl),
71+
}
5672
self.postMessage('inited')
5773
return
5874
}
@@ -82,6 +98,11 @@ self.onmessage = async (msg: MessageEvent<WorkerMessage>) => {
8298
content,
8399
)
84100
},
101+
{
102+
getPackageDirectoryUrl: resourceLinks.pkgDirUrl,
103+
getPackageFileTextUrl: resourceLinks.pkgFileTextUrl,
104+
getPackageLatestVersionUrl: resourceLinks.pkgLatestVersionUrl,
105+
},
85106
),
86107
}
87108

@@ -303,10 +324,15 @@ self.onmessage = async (msg: MessageEvent<WorkerMessage>) => {
303324
)
304325
}
305326

306-
async function importTsFromCdn(tsVersion: string) {
327+
async function importTsFromCdn(
328+
tsVersion: string,
329+
getTsCdn?: (version?: string) => string,
330+
) {
307331
const _module = globalThis.module
308332
;(globalThis as any).module = { exports: {} }
309-
const tsUrl = `https://cdn.jsdelivr.net/npm/typescript@${tsVersion}/lib/typescript.js`
333+
const tsUrl =
334+
getTsCdn?.(tsVersion) ||
335+
`https://cdn.jsdelivr.net/npm/typescript@${tsVersion}/lib/typescript.js`
310336
await import(/* @vite-ignore */ tsUrl)
311337
const ts = globalThis.module.exports
312338
globalThis.module = _module

src/output/Sandbox.vue

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,11 @@ function createSandbox() {
129129
/<!--PREVIEW-OPTIONS-PLACEHOLDER-HTML-->/,
130130
previewOptions.value?.placeholderHTML || '',
131131
)
132+
.replace(
133+
/<!--ES-MODULE-SHIMS-LINK-->/,
134+
store.value.resourceLinks?.esModuleShims ||
135+
'https://cdn.jsdelivr.net/npm/[email protected]/dist/es-module-shims.wasm.js',
136+
)
132137
sandbox.srcdoc = sandboxSrc
133138
containerRef.value?.appendChild(sandbox)
134139

src/output/srcdoc.html

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,9 @@
66
color-scheme: dark;
77
}
88
body {
9-
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
10-
Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
9+
font-family:
10+
-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu,
11+
Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif;
1112
}
1213
</style>
1314
<!-- PREVIEW-OPTIONS-HEAD-HTML -->
@@ -366,10 +367,7 @@
366367
</script>
367368

368369
<!-- ES Module Shims: Import maps polyfill for modules browsers without import maps support (all except Chrome 89+) -->
369-
<script
370-
async
371-
src="https://cdn.jsdelivr.net/npm/[email protected]/dist/es-module-shims.wasm.js"
372-
></script>
370+
<script async src="<!--ES-MODULE-SHIMS-LINK-->"></script>
373371
<script type="importmap">
374372
<!--IMPORT_MAP-->
375373
</script>

src/store.ts

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ export function useStore(
4848
typescriptVersion = ref('latest'),
4949
dependencyVersion = ref(Object.create(null)),
5050
reloadLanguageTools = ref(),
51+
resourceLinks = undefined,
5152
}: Partial<StoreState> = {},
5253
serializedState?: string,
5354
): ReplStore {
@@ -92,7 +93,9 @@ export function useStore(
9293
vueVersion,
9394
async (version) => {
9495
if (version) {
95-
const compilerUrl = `https://cdn.jsdelivr.net/npm/@vue/compiler-sfc@${version}/dist/compiler-sfc.esm-browser.js`
96+
const compilerUrl =
97+
resourceLinks?.value?.vueCompilerUrl?.(version) ||
98+
`https://cdn.jsdelivr.net/npm/@vue/compiler-sfc@${version}/dist/compiler-sfc.esm-browser.js`
9699
loading.value = true
97100
compiler.value = await import(/* @vite-ignore */ compilerUrl).finally(
98101
() => (loading.value = false),
@@ -390,6 +393,8 @@ export function useStore(
390393
deserialize,
391394
getFiles,
392395
setFiles,
396+
397+
resourceLinks,
393398
})
394399
return store
395400
}
@@ -415,6 +420,20 @@ export interface SFCOptions {
415420
template?: Partial<SFCTemplateCompileOptions>
416421
}
417422

423+
export type ResourceLinkConfigs = {
424+
esModuleShims?: string
425+
vueCompilerUrl?: (version: string) => string
426+
typescriptLib?: (version: string) => string
427+
// for monaco
428+
pkgLatestVersionUrl?: (pkgName: string) => string
429+
pkgDirUrl?: (pkgName: string, pkgVersion: string, pkgPath: string) => string
430+
pkgFileTextUrl?: (
431+
pkgName: string,
432+
pkgVersion: string | undefined,
433+
pkgPath: string,
434+
) => string
435+
}
436+
418437
export type StoreState = ToRefs<{
419438
files: Record<string, File>
420439
activeFilename: string
@@ -445,6 +464,9 @@ export type StoreState = ToRefs<{
445464
/** \{ dependencyName: version \} */
446465
dependencyVersion: Record<string, string>
447466
reloadLanguageTools?: (() => void) | undefined
467+
468+
/** Custom online resources */
469+
resourceLinks?: ResourceLinkConfigs
448470
}>
449471

450472
export interface ReplStore extends UnwrapRef<StoreState> {
@@ -468,6 +490,8 @@ export interface ReplStore extends UnwrapRef<StoreState> {
468490
deserialize(serializedState: string, checkBuiltinImportMap?: boolean): void
469491
getFiles(): Record<string, string>
470492
setFiles(newFiles: Record<string, string>, mainFile?: string): Promise<void>
493+
/** Custom online resources */
494+
resourceLinks?: ResourceLinkConfigs
471495
}
472496

473497
export type Store = Pick<
@@ -493,6 +517,7 @@ export type Store = Pick<
493517
| 'renameFile'
494518
| 'getImportMap'
495519
| 'getTsConfig'
520+
| 'resourceLinks'
496521
>
497522

498523
export class File {

0 commit comments

Comments
 (0)