|
1 | 1 | import { withBase } from 'ufo'
|
2 | 2 | import { useRegistryScript } from '../utils'
|
3 |
| -import { object, optional, string } from '#nuxt-scripts-validator' |
| 3 | +import { object, optional, string, union, literal } from '#nuxt-scripts-validator' |
4 | 4 | import type { RegistryScriptInput } from '#nuxt-scripts/types'
|
5 | 5 |
|
| 6 | +const PROVIDERS = ['jsdelivr', 'cdnjs', 'unpkg'] as const |
| 7 | +type Provider = (typeof PROVIDERS)[number] |
| 8 | +const providerValidator = union(PROVIDERS.map(provider => literal(provider))) |
| 9 | + |
6 | 10 | export const NpmOptions = object({
|
7 | 11 | packageName: string(),
|
8 | 12 | file: optional(string()),
|
9 | 13 | version: optional(string()),
|
10 |
| - type: optional(string()), |
| 14 | + provider: optional(providerValidator), |
11 | 15 | })
|
12 | 16 |
|
13 | 17 | export type NpmInput = RegistryScriptInput<typeof NpmOptions, true, true, false>
|
14 | 18 |
|
15 | 19 | 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 | + } |
23 | 41 | }
|
0 commit comments