Skip to content

Commit fef53f7

Browse files
authored
feat(useScriptNpm): support multiple providers with validation (#353)
1 parent dba1d95 commit fef53f7

File tree

1 file changed

+27
-9
lines changed

1 file changed

+27
-9
lines changed

src/runtime/registry/npm.ts

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,41 @@
11
import { withBase } from 'ufo'
22
import { useRegistryScript } from '../utils'
3-
import { object, optional, string } from '#nuxt-scripts-validator'
3+
import { object, optional, string, union, literal } from '#nuxt-scripts-validator'
44
import type { RegistryScriptInput } from '#nuxt-scripts/types'
55

6+
const PROVIDERS = ['jsdelivr', 'cdnjs', 'unpkg'] as const
7+
type Provider = (typeof PROVIDERS)[number]
8+
const providerValidator = union(PROVIDERS.map(provider => literal(provider)))
9+
610
export const NpmOptions = object({
711
packageName: string(),
812
file: optional(string()),
913
version: optional(string()),
10-
type: optional(string()),
14+
provider: optional(providerValidator),
1115
})
1216

1317
export type NpmInput = RegistryScriptInput<typeof NpmOptions, true, true, false>
1418

1519
export function useScriptNpm<T extends Record<string | symbol, any>>(_options: NpmInput) {
16-
// TODO support multiple providers? (e.g. jsdelivr, cdnjs, etc.) Only unpkg for now
17-
return useRegistryScript<T, typeof NpmOptions>(`${_options.packageName}-npm`, options => ({
18-
scriptInput: {
19-
src: withBase(options.file || '', `https://unpkg.com/${options?.packageName}@${options.version || 'latest'}`),
20-
},
21-
schema: import.meta.dev ? NpmOptions : undefined,
22-
}), _options)
20+
return useRegistryScript<T, typeof NpmOptions>(`${_options.packageName}-npm`, (options) => {
21+
const baseUrl = getProviderBaseUrl(options.provider, options.packageName, options.version)
22+
return {
23+
scriptInput: {
24+
src: withBase(options.file || '', baseUrl),
25+
},
26+
schema: import.meta.dev ? NpmOptions : undefined,
27+
}
28+
}, _options)
29+
}
30+
31+
function getProviderBaseUrl(provider: Provider = 'unpkg', packageName: string, version: string = 'latest'): string {
32+
switch (provider) {
33+
case 'jsdelivr':
34+
return `https://cdn.jsdelivr.net/npm/${packageName}@${version}/`
35+
case 'cdnjs':
36+
return `https://cdnjs.cloudflare.com/ajax/libs/${packageName}/${version}/`
37+
case 'unpkg':
38+
default:
39+
return `https://unpkg.com/${packageName}@${version}/`
40+
}
2341
}

0 commit comments

Comments
 (0)