@nuclearplayer/plugin-sdk
Advanced tools
+409
-8
@@ -1,8 +0,409 @@ | ||
| export { NuclearPluginAPI, NuclearAPI } from './api'; | ||
| export * from './types'; | ||
| export * from './types/settings'; | ||
| export * from './types/search'; | ||
| export type { ProvidersHost } from './types/providers'; | ||
| export { useSetting } from './react/useSetting'; | ||
| export * from '@nuclearplayer/model'; | ||
| //# sourceMappingURL=index.d.ts.map | ||
| export declare type Album = { | ||
| title: string; | ||
| artists: ArtistCredit[]; | ||
| tracks?: TrackRef[]; | ||
| releaseDate?: { | ||
| precision: 'year' | 'month' | 'day'; | ||
| dateIso: string; | ||
| }; | ||
| genres?: string[]; | ||
| artwork?: ArtworkSet; | ||
| source: ProviderRef; | ||
| }; | ||
| export declare type AlbumRef = { | ||
| title: string; | ||
| artists?: ArtistRef[]; | ||
| artwork?: ArtworkSet; | ||
| source: ProviderRef; | ||
| }; | ||
| export declare type Artist = { | ||
| name: string; | ||
| disambiguation?: string; | ||
| bio?: string; | ||
| onTour?: boolean; | ||
| artwork?: ArtworkSet; | ||
| tags?: string[]; | ||
| source: ProviderRef; | ||
| }; | ||
| export declare type ArtistCredit = { | ||
| name: string; | ||
| roles: string[]; | ||
| source?: ProviderRef; | ||
| }; | ||
| export declare type ArtistMetadataCapability = 'artistDetails' | 'artistAlbums' | 'artistTopTracks' | 'artistRelatedArtists'; | ||
| export declare type ArtistRef = { | ||
| name: string; | ||
| disambiguation?: string; | ||
| artwork?: ArtworkSet; | ||
| source: ProviderRef; | ||
| }; | ||
| export declare type Artwork = { | ||
| url: string; | ||
| width?: number; | ||
| height?: number; | ||
| purpose?: ArtworkPurpose; | ||
| source?: ProviderRef; | ||
| }; | ||
| export declare type ArtworkPurpose = 'avatar' | 'cover' | 'background' | 'thumbnail'; | ||
| export declare type ArtworkSet = { | ||
| items: Artwork[]; | ||
| }; | ||
| export declare type BooleanSettingDefinition = { | ||
| id: string; | ||
| title: string; | ||
| description?: string; | ||
| category: SettingCategory; | ||
| kind: 'boolean'; | ||
| default?: boolean; | ||
| hidden?: boolean; | ||
| source?: SettingSource; | ||
| widget?: BooleanWidget; | ||
| }; | ||
| export declare type BooleanWidget = { | ||
| type: 'toggle'; | ||
| }; | ||
| export declare type EnumOption = { | ||
| value: string; | ||
| label: string; | ||
| }; | ||
| export declare type EnumSettingDefinition = { | ||
| id: string; | ||
| title: string; | ||
| description?: string; | ||
| category: SettingCategory; | ||
| kind: 'enum'; | ||
| options: EnumOption[]; | ||
| default?: string; | ||
| hidden?: boolean; | ||
| source?: SettingSource; | ||
| widget?: EnumWidget; | ||
| }; | ||
| export declare type EnumWidget = { | ||
| type: 'select'; | ||
| } | { | ||
| type: 'radio'; | ||
| }; | ||
| export declare type LoadedPlugin = { | ||
| metadata: PluginMetadata; | ||
| instance: NuclearPlugin; | ||
| path: string; | ||
| }; | ||
| export declare type LocalFileInfo = { | ||
| fileUri: string; | ||
| fileSize?: number; | ||
| format?: string; | ||
| bitrateKbps?: number; | ||
| sampleRateHz?: number; | ||
| channels?: number; | ||
| fingerprint?: string; | ||
| scannedAtIso?: string; | ||
| }; | ||
| export declare type MetadataProvider = ProviderDescriptor<'metadata'> & { | ||
| searchCapabilities?: SearchCapability[]; | ||
| artistMetadataCapabilities?: ArtistMetadataCapability[]; | ||
| search?: (params: SearchParams) => Promise<SearchResults>; | ||
| searchArtists?: (params: Omit<SearchParams, 'types'>) => Promise<ArtistRef[]>; | ||
| searchAlbums?: (params: Omit<SearchParams, 'types'>) => Promise<AlbumRef[]>; | ||
| searchTracks?: (params: Omit<SearchParams, 'types'>) => Promise<Track[]>; | ||
| searchPlaylists?: (params: Omit<SearchParams, 'types'>) => Promise<PlaylistRef[]>; | ||
| fetchArtistDetails?: (query: string) => Promise<Artist>; | ||
| fetchAlbumDetails?: (query: string) => Promise<Album>; | ||
| fetchArtistAlbums?: (artistId: string) => Promise<AlbumRef[]>; | ||
| fetchArtistTopTracks?: (artistId: string) => Promise<TrackRef[]>; | ||
| fetchArtistRelatedArtists?: (artistId: string) => Promise<ArtistRef[]>; | ||
| }; | ||
| export declare class MissingCapabilityError extends Error { | ||
| constructor(capability: string); | ||
| } | ||
| export declare class NuclearAPI { | ||
| readonly Settings: Settings; | ||
| readonly Providers: Providers; | ||
| constructor(opts?: { | ||
| settingsHost?: SettingsHost; | ||
| providersHost?: ProvidersHost; | ||
| }); | ||
| } | ||
| export declare type NuclearPlugin = { | ||
| onLoad?(api: NuclearPluginAPI): void | Promise<void>; | ||
| onUnload?(): void | Promise<void>; | ||
| onEnable?(api: NuclearPluginAPI): void | Promise<void>; | ||
| onDisable?(): void | Promise<void>; | ||
| }; | ||
| export declare class NuclearPluginAPI extends NuclearAPI { | ||
| } | ||
| export declare type NumberSettingDefinition = { | ||
| id: string; | ||
| title: string; | ||
| description?: string; | ||
| category: SettingCategory; | ||
| kind: 'number'; | ||
| default?: number; | ||
| hidden?: boolean; | ||
| source?: SettingSource; | ||
| widget?: NumberWidget; | ||
| min?: number; | ||
| max?: number; | ||
| step?: number; | ||
| unit?: string; | ||
| }; | ||
| export declare type NumberWidget = { | ||
| type: 'slider'; | ||
| min?: number; | ||
| max?: number; | ||
| step?: number; | ||
| unit?: string; | ||
| } | { | ||
| type: 'number-input'; | ||
| min?: number; | ||
| max?: number; | ||
| step?: number; | ||
| unit?: string; | ||
| }; | ||
| export declare function pickArtwork(set: ArtworkSet | undefined, purpose: ArtworkPurpose, targetPx: number): Artwork | undefined; | ||
| export declare type Playlist = { | ||
| id: string; | ||
| name: string; | ||
| lastModifiedIso?: string; | ||
| items: PlaylistItem[]; | ||
| }; | ||
| export declare type PlaylistItem = { | ||
| id: string; | ||
| title: string; | ||
| artists: ArtistCredit[]; | ||
| album?: string; | ||
| durationMs?: number; | ||
| artwork?: ArtworkSet; | ||
| note?: string; | ||
| addedAtIso?: string; | ||
| source: ProviderRef; | ||
| }; | ||
| export declare type PlaylistRef = { | ||
| id: string; | ||
| name: string; | ||
| artwork?: ArtworkSet; | ||
| source: ProviderRef; | ||
| }; | ||
| export declare type PluginIcon = { | ||
| type: 'link'; | ||
| link: string; | ||
| }; | ||
| export declare type PluginManifest = { | ||
| name: string; | ||
| version: string; | ||
| description: string; | ||
| author: string; | ||
| main?: string; | ||
| nuclear?: { | ||
| displayName?: string; | ||
| category?: string; | ||
| icon?: PluginIcon; | ||
| permissions?: string[]; | ||
| }; | ||
| }; | ||
| export declare type PluginMetadata = { | ||
| id: string; | ||
| name: string; | ||
| displayName: string; | ||
| version: string; | ||
| description: string; | ||
| author: string; | ||
| category?: string; | ||
| icon?: PluginIcon; | ||
| permissions: string[]; | ||
| }; | ||
| export declare type ProviderDescriptor<K extends ProviderKind = ProviderKind> = { | ||
| id: string; | ||
| kind: K; | ||
| name: string; | ||
| pluginId?: string; | ||
| }; | ||
| export declare type ProviderKind = 'metadata' | 'streaming' | 'lyrics' | (string & {}); | ||
| export declare type ProviderRef = { | ||
| provider: string; | ||
| id: string; | ||
| url?: string; | ||
| }; | ||
| declare class Providers { | ||
| #private; | ||
| constructor(host?: ProvidersHost); | ||
| register<T extends ProviderDescriptor>(p: T): string; | ||
| unregister(id: string): boolean; | ||
| list<K extends ProviderKind = ProviderKind>(kind?: K): ProviderDescriptor<K>[]; | ||
| get<T extends ProviderDescriptor>(id: string): T | undefined; | ||
| } | ||
| export declare type ProvidersHost = { | ||
| register<T extends ProviderDescriptor>(provider: T): string; | ||
| unregister(providerId: string): boolean; | ||
| list<K extends ProviderKind = ProviderKind>(kind?: K): ProviderDescriptor<K>[]; | ||
| get<T extends ProviderDescriptor>(providerId: string): T | undefined; | ||
| clear(): void; | ||
| }; | ||
| export declare type QueueItem = { | ||
| id: string; | ||
| title: string; | ||
| artists: ArtistCredit[]; | ||
| album?: string; | ||
| durationMs?: number; | ||
| artwork?: ArtworkSet; | ||
| note?: string; | ||
| addedAtIso?: string; | ||
| source: ProviderRef; | ||
| }; | ||
| export declare type SearchCapability = SearchCategory | 'unified'; | ||
| export declare type SearchCategory = 'artists' | 'albums' | 'tracks' | 'playlists'; | ||
| export declare type SearchParams = { | ||
| query: string; | ||
| types?: SearchCategory[]; | ||
| limit?: number; | ||
| }; | ||
| export declare type SearchResults = { | ||
| artists?: ArtistRef[]; | ||
| albums?: AlbumRef[]; | ||
| tracks?: Track[]; | ||
| playlists?: PlaylistRef[]; | ||
| }; | ||
| export declare type SettingCategory = string; | ||
| export declare type SettingDefinition = BooleanSettingDefinition | NumberSettingDefinition | StringSettingDefinition | EnumSettingDefinition; | ||
| declare class Settings { | ||
| #private; | ||
| constructor(host?: SettingsHost); | ||
| register(defs: SettingDefinition[], source: SettingSource): Promise<SettingsRegistrationResult>; | ||
| get<T extends SettingValue = SettingValue>(id: string): Promise<T | undefined>; | ||
| set<T extends SettingValue = SettingValue>(id: string, value: T): Promise<void>; | ||
| subscribe<T extends SettingValue = SettingValue>(id: string, listener: (value: T | undefined) => void): () => void; | ||
| } | ||
| export declare type SettingsHost = { | ||
| register(defs: SettingDefinition[], source: SettingSource): Promise<SettingsRegistrationResult>; | ||
| get<T extends SettingValue = SettingValue>(id: string): Promise<T | undefined>; | ||
| set<T extends SettingValue = SettingValue>(id: string, value: T): Promise<void>; | ||
| subscribe<T extends SettingValue = SettingValue>(id: string, listener: (value: T | undefined) => void): () => void; | ||
| }; | ||
| export declare type SettingSource = { | ||
| type: 'core'; | ||
| } | { | ||
| type: 'plugin'; | ||
| pluginId: string; | ||
| pluginName?: string; | ||
| }; | ||
| export declare type SettingsRegistration = { | ||
| settings: SettingDefinition[]; | ||
| }; | ||
| export declare type SettingsRegistrationResult = { | ||
| registered: string[]; | ||
| }; | ||
| export declare type SettingValue = boolean | number | string | undefined; | ||
| export declare type Stream = { | ||
| url: string; | ||
| protocol: 'file' | 'http' | 'https' | 'hls'; | ||
| mimeType?: string; | ||
| bitrateKbps?: number; | ||
| codec?: string; | ||
| container?: string; | ||
| qualityLabel?: string; | ||
| durationMs?: number; | ||
| contentLengthBytes?: number; | ||
| source: ProviderRef; | ||
| }; | ||
| export declare type StringFormat = 'text' | 'url' | 'path' | 'token' | 'language'; | ||
| export declare type StringSettingDefinition = { | ||
| id: string; | ||
| title: string; | ||
| description?: string; | ||
| category: SettingCategory; | ||
| kind: 'string'; | ||
| default?: string; | ||
| hidden?: boolean; | ||
| source?: SettingSource; | ||
| widget?: StringWidget; | ||
| format?: StringFormat; | ||
| pattern?: string; | ||
| minLength?: number; | ||
| maxLength?: number; | ||
| }; | ||
| export declare type StringWidget = { | ||
| type: 'text'; | ||
| placeholder?: string; | ||
| } | { | ||
| type: 'password'; | ||
| placeholder?: string; | ||
| } | { | ||
| type: 'textarea'; | ||
| placeholder?: string; | ||
| rows?: number; | ||
| }; | ||
| export declare type Track = { | ||
| title: string; | ||
| artists: ArtistCredit[]; | ||
| album?: AlbumRef; | ||
| durationMs?: number; | ||
| trackNumber?: number; | ||
| disc?: string; | ||
| artwork?: ArtworkSet; | ||
| tags?: string[]; | ||
| source: ProviderRef; | ||
| localFile?: LocalFileInfo; | ||
| streams?: Stream[]; | ||
| }; | ||
| export declare type TrackRef = { | ||
| title: string; | ||
| artists: ArtistRef[]; | ||
| artwork?: ArtworkSet; | ||
| source: ProviderRef; | ||
| }; | ||
| export declare const useSetting: <T extends SettingValue = SettingValue>(host: SettingsHost | undefined, id: string) => readonly [T | undefined, (nextValue: T) => void]; | ||
| export { } |
+5
-3
| { | ||
| "name": "@nuclearplayer/plugin-sdk", | ||
| "version": "0.0.11", | ||
| "version": "0.0.14", | ||
| "description": "Plugin SDK for Nuclear music player", | ||
@@ -27,2 +27,3 @@ "type": "module", | ||
| "devDependencies": { | ||
| "@microsoft/api-extractor": "^7.51.1", | ||
| "@tailwindcss/vite": "^4.1.11", | ||
@@ -71,4 +72,5 @@ "@testing-library/jest-dom": "^6.6.4", | ||
| "dev": "vite", | ||
| "build": "tsc && vite build", | ||
| "build:npm": "vite build --mode npm", | ||
| "build": "tsc && vite build && api-extractor run --local && pnpm clean:dts", | ||
| "build:npm": "tsc && vite build --mode npm && api-extractor run --local && pnpm clean:dts", | ||
| "clean:dts": "rm -rf dist/api dist/react dist/test dist/types dist/types.d.ts dist/*.d.ts.map dist/tsdoc-metadata.json", | ||
| "test": "vitest --run", | ||
@@ -75,0 +77,0 @@ "test:watch": "vitest", |
| import { ProvidersHost } from '../types/providers'; | ||
| import { SettingsHost } from '../types/settings'; | ||
| import { Providers } from './providers'; | ||
| import { Settings } from './settings'; | ||
| export declare class NuclearAPI { | ||
| readonly Settings: Settings; | ||
| readonly Providers: Providers; | ||
| constructor(opts?: { | ||
| settingsHost?: SettingsHost; | ||
| providersHost?: ProvidersHost; | ||
| }); | ||
| } | ||
| export declare class NuclearPluginAPI extends NuclearAPI { | ||
| } | ||
| //# sourceMappingURL=index.d.ts.map |
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAEtC,qBAAa,UAAU;IACrB,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;gBAElB,IAAI,CAAC,EAAE;QACjB,YAAY,CAAC,EAAE,YAAY,CAAC;QAC5B,aAAa,CAAC,EAAE,aAAa,CAAC;KAC/B;CAIF;AAED,qBAAa,gBAAiB,SAAQ,UAAU;CAAG"} |
| import { ProvidersHost } from '../types/providers'; | ||
| import { ProviderDescriptor, ProviderKind } from '../types/search'; | ||
| export declare class Providers { | ||
| #private; | ||
| constructor(host?: ProvidersHost); | ||
| register<T extends ProviderDescriptor>(p: T): string; | ||
| unregister(id: string): boolean; | ||
| list<K extends ProviderKind = ProviderKind>(kind?: K): ProviderDescriptor<K>[]; | ||
| get<T extends ProviderDescriptor>(id: string): T | undefined; | ||
| } | ||
| //# sourceMappingURL=providers.d.ts.map |
| {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/api/providers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAExE,qBAAa,SAAS;;gBAGR,IAAI,CAAC,EAAE,aAAa;IAYhC,QAAQ,CAAC,CAAC,SAAS,kBAAkB,EAAE,CAAC,EAAE,CAAC;IAI3C,UAAU,CAAC,EAAE,EAAE,MAAM;IAIrB,IAAI,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,EAAE,IAAI,CAAC,EAAE,CAAC;IAIpD,GAAG,CAAC,CAAC,SAAS,kBAAkB,EAAE,EAAE,EAAE,MAAM;CAG7C"} |
| import { SettingDefinition, SettingsHost, SettingSource, SettingValue } from '../types/settings'; | ||
| export declare class Settings { | ||
| #private; | ||
| constructor(host?: SettingsHost); | ||
| register(defs: SettingDefinition[], source: SettingSource): Promise<import('..').SettingsRegistrationResult>; | ||
| get<T extends SettingValue = SettingValue>(id: string): Promise<T | undefined>; | ||
| set<T extends SettingValue = SettingValue>(id: string, value: T): Promise<void>; | ||
| subscribe<T extends SettingValue = SettingValue>(id: string, listener: (value: T | undefined) => void): () => void; | ||
| } | ||
| //# sourceMappingURL=settings.d.ts.map |
| {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/api/settings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,YAAY,EACb,MAAM,mBAAmB,CAAC;AAE3B,qBAAa,QAAQ;;gBAGP,IAAI,CAAC,EAAE,YAAY;IAY/B,QAAQ,CAAC,IAAI,EAAE,iBAAiB,EAAE,EAAE,MAAM,EAAE,aAAa;IAIzD,GAAG,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,EAAE,EAAE,EAAE,MAAM;IAIrD,GAAG,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAI/D,SAAS,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,EAC7C,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI;CAI3C"} |
| {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AACrD,cAAc,SAAS,CAAC;AACxB,cAAc,kBAAkB,CAAC;AACjC,cAAc,gBAAgB,CAAC;AAC/B,YAAY,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,cAAc,sBAAsB,CAAC"} |
| import { SettingsHost, SettingValue } from '../types/settings'; | ||
| export declare const useSetting: <T extends SettingValue = SettingValue>(host: SettingsHost | undefined, id: string) => readonly [T | undefined, (nextValue: T) => void]; | ||
| //# sourceMappingURL=useSetting.d.ts.map |
| {"version":3,"file":"useSetting.d.ts","sourceRoot":"","sources":["../../src/react/useSetting.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAEpE,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,YAAY,GAAG,YAAY,EAC9D,MAAM,YAAY,GAAG,SAAS,EAC9B,IAAI,MAAM,0CAkCU,CAAC,UAUtB,CAAC"} |
| //# sourceMappingURL=setup.d.ts.map |
| {"version":3,"file":"setup.d.ts","sourceRoot":"","sources":["../../src/test/setup.ts"],"names":[],"mappings":"AAAA,OAAO,2BAA2B,CAAC"} |
| import { SettingDefinition, SettingsHost, SettingSource, SettingValue } from '../../types/settings'; | ||
| export declare class InMemorySettingsHost implements SettingsHost { | ||
| private definitions; | ||
| private values; | ||
| private listeners; | ||
| private readonly source; | ||
| constructor(source: SettingSource); | ||
| private fullyQualified; | ||
| register(definitions: SettingDefinition[], _source: SettingSource): Promise<{ | ||
| registered: string[]; | ||
| }>; | ||
| get<T extends SettingValue = SettingValue>(id: string): Promise<T | undefined>; | ||
| set<T extends SettingValue = SettingValue>(id: string, value: T): Promise<void>; | ||
| subscribe<T extends SettingValue = SettingValue>(id: string, listener: (value: T | undefined) => void): () => void; | ||
| } | ||
| //# sourceMappingURL=inMemorySettingsHost.d.ts.map |
| {"version":3,"file":"inMemorySettingsHost.d.ts","sourceRoot":"","sources":["../../../src/test/utils/inMemorySettingsHost.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,YAAY,EACZ,aAAa,EACb,YAAY,EACb,MAAM,sBAAsB,CAAC;AAE9B,qBAAa,oBAAqB,YAAW,YAAY;IACvD,OAAO,CAAC,WAAW,CAAwC;IAC3D,OAAO,CAAC,MAAM,CAAmC;IACjD,OAAO,CAAC,SAAS,CAGb;IACJ,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAgB;gBAE3B,MAAM,EAAE,aAAa;IAIjC,OAAO,CAAC,cAAc;IAOhB,QAAQ,CAAC,WAAW,EAAE,iBAAiB,EAAE,EAAE,OAAO,EAAE,aAAa;;;IAsBjE,GAAG,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,EAAE,EAAE,EAAE,MAAM;IAKrD,GAAG,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,EAAE,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAWrE,SAAS,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,EAC7C,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,CAAC,KAAK,EAAE,CAAC,GAAG,SAAS,KAAK,IAAI;CAmB3C"} |
| import { NuclearPluginAPI } from './api'; | ||
| export type PluginIcon = { | ||
| type: 'link'; | ||
| link: string; | ||
| }; | ||
| export type PluginManifest = { | ||
| name: string; | ||
| version: string; | ||
| description: string; | ||
| author: string; | ||
| main?: string; | ||
| nuclear?: { | ||
| displayName?: string; | ||
| category?: string; | ||
| icon?: PluginIcon; | ||
| permissions?: string[]; | ||
| }; | ||
| }; | ||
| export type NuclearPlugin = { | ||
| onLoad?(api: NuclearPluginAPI): void | Promise<void>; | ||
| onUnload?(): void | Promise<void>; | ||
| onEnable?(api: NuclearPluginAPI): void | Promise<void>; | ||
| onDisable?(): void | Promise<void>; | ||
| }; | ||
| export type PluginMetadata = { | ||
| id: string; | ||
| name: string; | ||
| displayName: string; | ||
| version: string; | ||
| description: string; | ||
| author: string; | ||
| category?: string; | ||
| icon?: PluginIcon; | ||
| permissions: string[]; | ||
| }; | ||
| export type LoadedPlugin = { | ||
| metadata: PluginMetadata; | ||
| instance: NuclearPlugin; | ||
| path: string; | ||
| }; | ||
| //# sourceMappingURL=types.d.ts.map |
| {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,OAAO,CAAC;AAE9C,MAAM,MAAM,UAAU,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC;AAExD,MAAM,MAAM,cAAc,GAAG;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,CAAC,EAAE;QACR,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,IAAI,CAAC,EAAE,UAAU,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,EAAE,CAAC;KACxB,CAAC;CACH,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,MAAM,CAAC,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACrD,QAAQ,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAClC,QAAQ,CAAC,CAAC,GAAG,EAAE,gBAAgB,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IACvD,SAAS,CAAC,IAAI,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACpC,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,cAAc,CAAC;IACzB,QAAQ,EAAE,aAAa,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;CACd,CAAC"} |
| import { ProviderDescriptor, ProviderKind } from './search'; | ||
| export type ProvidersHost = { | ||
| register<T extends ProviderDescriptor>(provider: T): string; | ||
| unregister(providerId: string): boolean; | ||
| list<K extends ProviderKind = ProviderKind>(kind?: K): ProviderDescriptor<K>[]; | ||
| get<T extends ProviderDescriptor>(providerId: string): T | undefined; | ||
| clear(): void; | ||
| }; | ||
| //# sourceMappingURL=providers.d.ts.map |
| {"version":3,"file":"providers.d.ts","sourceRoot":"","sources":["../../src/types/providers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,kBAAkB,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AAEjE,MAAM,MAAM,aAAa,GAAG;IAC1B,QAAQ,CAAC,CAAC,SAAS,kBAAkB,EAAE,QAAQ,EAAE,CAAC,GAAG,MAAM,CAAC;IAC5D,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC;IACxC,IAAI,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,EACxC,IAAI,CAAC,EAAE,CAAC,GACP,kBAAkB,CAAC,CAAC,CAAC,EAAE,CAAC;IAC3B,GAAG,CAAC,CAAC,SAAS,kBAAkB,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS,CAAC;IACrE,KAAK,IAAI,IAAI,CAAC;CACf,CAAC"} |
| import { Album, AlbumRef, Artist, ArtistRef, PlaylistRef, Track, TrackRef } from '@nuclearplayer/model'; | ||
| export type SearchCategory = 'artists' | 'albums' | 'tracks' | 'playlists'; | ||
| export type SearchCapability = SearchCategory | 'unified'; | ||
| export type ArtistMetadataCapability = 'artistDetails' | 'artistAlbums' | 'artistTopTracks' | 'artistRelatedArtists'; | ||
| export type SearchParams = { | ||
| query: string; | ||
| types?: SearchCategory[]; | ||
| limit?: number; | ||
| }; | ||
| export type SearchResults = { | ||
| artists?: ArtistRef[]; | ||
| albums?: AlbumRef[]; | ||
| tracks?: Track[]; | ||
| playlists?: PlaylistRef[]; | ||
| }; | ||
| export type ProviderKind = 'metadata' | 'streaming' | 'lyrics' | (string & {}); | ||
| export type ProviderDescriptor<K extends ProviderKind = ProviderKind> = { | ||
| id: string; | ||
| kind: K; | ||
| name: string; | ||
| pluginId?: string; | ||
| }; | ||
| export type MetadataProvider = ProviderDescriptor<'metadata'> & { | ||
| searchCapabilities?: SearchCapability[]; | ||
| artistMetadataCapabilities?: ArtistMetadataCapability[]; | ||
| search?: (params: SearchParams) => Promise<SearchResults>; | ||
| searchArtists?: (params: Omit<SearchParams, 'types'>) => Promise<ArtistRef[]>; | ||
| searchAlbums?: (params: Omit<SearchParams, 'types'>) => Promise<AlbumRef[]>; | ||
| searchTracks?: (params: Omit<SearchParams, 'types'>) => Promise<Track[]>; | ||
| searchPlaylists?: (params: Omit<SearchParams, 'types'>) => Promise<PlaylistRef[]>; | ||
| fetchArtistDetails?: (query: string) => Promise<Artist>; | ||
| fetchAlbumDetails?: (query: string) => Promise<Album>; | ||
| fetchArtistAlbums?: (artistId: string) => Promise<AlbumRef[]>; | ||
| fetchArtistTopTracks?: (artistId: string) => Promise<TrackRef[]>; | ||
| fetchArtistRelatedArtists?: (artistId: string) => Promise<ArtistRef[]>; | ||
| }; | ||
| export declare class MissingCapabilityError extends Error { | ||
| constructor(capability: string); | ||
| } | ||
| //# sourceMappingURL=search.d.ts.map |
| {"version":3,"file":"search.d.ts","sourceRoot":"","sources":["../../src/types/search.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,KAAK,EACL,QAAQ,EACR,MAAM,EACN,SAAS,EACT,WAAW,EACX,KAAK,EACL,QAAQ,EACT,MAAM,sBAAsB,CAAC;AAE9B,MAAM,MAAM,cAAc,GAAG,SAAS,GAAG,QAAQ,GAAG,QAAQ,GAAG,WAAW,CAAC;AAC3E,MAAM,MAAM,gBAAgB,GAAG,cAAc,GAAG,SAAS,CAAC;AAE1D,MAAM,MAAM,wBAAwB,GAChC,eAAe,GACf,cAAc,GACd,iBAAiB,GACjB,sBAAsB,CAAC;AAE3B,MAAM,MAAM,YAAY,GAAG;IACzB,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,cAAc,EAAE,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,CAAC,EAAE,SAAS,EAAE,CAAC;IACtB,MAAM,CAAC,EAAE,QAAQ,EAAE,CAAC;IACpB,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC;IACjB,SAAS,CAAC,EAAE,WAAW,EAAE,CAAC;CAC3B,CAAC;AAEF,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,WAAW,GAAG,QAAQ,GAAG,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC;AAE/E,MAAM,MAAM,kBAAkB,CAAC,CAAC,SAAS,YAAY,GAAG,YAAY,IAAI;IACtE,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,CAAC,CAAC;IACR,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB,CAAC;AAEF,MAAM,MAAM,gBAAgB,GAAG,kBAAkB,CAAC,UAAU,CAAC,GAAG;IAC9D,kBAAkB,CAAC,EAAE,gBAAgB,EAAE,CAAC;IACxC,0BAA0B,CAAC,EAAE,wBAAwB,EAAE,CAAC;IACxD,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,YAAY,KAAK,OAAO,CAAC,aAAa,CAAC,CAAC;IAC1D,aAAa,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC9E,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC5E,YAAY,CAAC,EAAE,CAAC,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,KAAK,OAAO,CAAC,KAAK,EAAE,CAAC,CAAC;IACzE,eAAe,CAAC,EAAE,CAChB,MAAM,EAAE,IAAI,CAAC,YAAY,EAAE,OAAO,CAAC,KAChC,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAE5B,kBAAkB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACxD,iBAAiB,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,KAAK,CAAC,CAAC;IACtD,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC9D,oBAAoB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IACjE,yBAAyB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;CACxE,CAAC;AAEF,qBAAa,sBAAuB,SAAQ,KAAK;gBACnC,UAAU,EAAE,MAAM;CAI/B"} |
| export type SettingSource = { | ||
| type: 'core'; | ||
| } | { | ||
| type: 'plugin'; | ||
| pluginId: string; | ||
| pluginName?: string; | ||
| }; | ||
| export type SettingCategory = string; | ||
| export type BooleanWidget = { | ||
| type: 'toggle'; | ||
| }; | ||
| export type NumberWidget = { | ||
| type: 'slider'; | ||
| min?: number; | ||
| max?: number; | ||
| step?: number; | ||
| unit?: string; | ||
| } | { | ||
| type: 'number-input'; | ||
| min?: number; | ||
| max?: number; | ||
| step?: number; | ||
| unit?: string; | ||
| }; | ||
| export type StringWidget = { | ||
| type: 'text'; | ||
| placeholder?: string; | ||
| } | { | ||
| type: 'password'; | ||
| placeholder?: string; | ||
| } | { | ||
| type: 'textarea'; | ||
| placeholder?: string; | ||
| rows?: number; | ||
| }; | ||
| export type EnumWidget = { | ||
| type: 'select'; | ||
| } | { | ||
| type: 'radio'; | ||
| }; | ||
| export type BooleanSettingDefinition = { | ||
| id: string; | ||
| title: string; | ||
| description?: string; | ||
| category: SettingCategory; | ||
| kind: 'boolean'; | ||
| default?: boolean; | ||
| hidden?: boolean; | ||
| source?: SettingSource; | ||
| widget?: BooleanWidget; | ||
| }; | ||
| export type NumberSettingDefinition = { | ||
| id: string; | ||
| title: string; | ||
| description?: string; | ||
| category: SettingCategory; | ||
| kind: 'number'; | ||
| default?: number; | ||
| hidden?: boolean; | ||
| source?: SettingSource; | ||
| widget?: NumberWidget; | ||
| min?: number; | ||
| max?: number; | ||
| step?: number; | ||
| unit?: string; | ||
| }; | ||
| export type StringFormat = 'text' | 'url' | 'path' | 'token' | 'language'; | ||
| export type StringSettingDefinition = { | ||
| id: string; | ||
| title: string; | ||
| description?: string; | ||
| category: SettingCategory; | ||
| kind: 'string'; | ||
| default?: string; | ||
| hidden?: boolean; | ||
| source?: SettingSource; | ||
| widget?: StringWidget; | ||
| format?: StringFormat; | ||
| pattern?: string; | ||
| minLength?: number; | ||
| maxLength?: number; | ||
| }; | ||
| export type EnumOption = { | ||
| value: string; | ||
| label: string; | ||
| }; | ||
| export type EnumSettingDefinition = { | ||
| id: string; | ||
| title: string; | ||
| description?: string; | ||
| category: SettingCategory; | ||
| kind: 'enum'; | ||
| options: EnumOption[]; | ||
| default?: string; | ||
| hidden?: boolean; | ||
| source?: SettingSource; | ||
| widget?: EnumWidget; | ||
| }; | ||
| export type SettingDefinition = BooleanSettingDefinition | NumberSettingDefinition | StringSettingDefinition | EnumSettingDefinition; | ||
| export type SettingValue = boolean | number | string | undefined; | ||
| export type SettingsRegistration = { | ||
| settings: SettingDefinition[]; | ||
| }; | ||
| export type SettingsRegistrationResult = { | ||
| registered: string[]; | ||
| }; | ||
| export type SettingsHost = { | ||
| register(defs: SettingDefinition[], source: SettingSource): Promise<SettingsRegistrationResult>; | ||
| get<T extends SettingValue = SettingValue>(id: string): Promise<T | undefined>; | ||
| set<T extends SettingValue = SettingValue>(id: string, value: T): Promise<void>; | ||
| subscribe<T extends SettingValue = SettingValue>(id: string, listener: (value: T | undefined) => void): () => void; | ||
| }; | ||
| //# sourceMappingURL=settings.d.ts.map |
| {"version":3,"file":"settings.d.ts","sourceRoot":"","sources":["../../src/types/settings.ts"],"names":[],"mappings":"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"} |
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
474
26.06%54136
-13.44%16
6.67%5
-80.77%1
Infinity%