import type {SearchAndReplaceRegExp} from "@foxxmd/regex-buddy-core"; export interface ConditionalSearchAndReplaceRegExp extends SearchAndReplaceRegExp, Whennable { } export type ConditionalSearchAndReplaceTerm = Exclude export type SearchAndReplaceTerm = string | ConditionalSearchAndReplaceTerm; export type ExternalMetadataTerm = boolean | undefined | Whennable; export type PlayTransformParts = Extract, Y> & Whennable; //export type PlayTransformUserParts = PlayTransformUserStage & { when?: WhenConditionsConfig }; //export type PlayTransformMetaParts = PlayTransformMetadataStage & { when?: WhenConditionsConfig }; export type PlayTransformPartsArray = PlayTransformParts[]; /** Represents the weakly-defined user config. May be an array of parts or one parts object */ export type PlayTransformPartsConfig = PlayTransformPartsArray | PlayTransformParts; export interface PlayTransformPartsAtomic { title?: T artists?: T albumArtists?: T album?: T duration?: T meta?: T } export type StageTypeMetadata = 'spotify' | 'musicbrainz' | 'native'; export type StageTypeUser = 'user'; export type StageType = StageTypeMetadata | StageTypeUser | string; export const STAGE_TYPES_USER: StageTypeUser[] = ['user']; export const STAGE_TYPES_METADATA: StageTypeMetadata[] = ['spotify','musicbrainz','native']; export const STAGE_TYPES: StageType[] = [...STAGE_TYPES_METADATA, ...STAGE_TYPES_USER]; export interface StageTyped { type: StageType } export interface NotStageTyped { //type?: never } export type MaybeStageTyped = StageTyped | NotStageTyped; export interface StageTypedConfig { type: StageType } export interface Whennable { when?: WhenConditionsConfig } export type FlowControlTerm = 'continue' | 'stop' export const FLOW_CONTROL_TERM = { continue: 'continue', stop: 'stop' } as const satisfies Record; export interface FlowControl { onSuccess: FlowControlTerm onFailure: FlowControlTerm onSkip: FlowControlTerm failureReturnPartial: boolean } export interface StageConfig extends StageTypedConfig, Whennable, Partial { name?: string stageHash?: string } export interface UntypedStageConfig extends Whennable, Partial { name?: string } export interface AtomicStageConfig extends StageConfig, PlayTransformPartsAtomic {} export interface PlayTransformStageTyped extends PlayTransformPartsAtomic { type: StageType } export interface PlayTransformMetadataStage extends StageConfig, PlayTransformPartsAtomic { score?: number // all?: ExternalMetadataTerm type: StageTypeMetadata } export interface PlayTransformUserStage extends StageConfig, PlayTransformPartsAtomic { type: StageTypeUser } export interface PlayTransformNativeStage extends StageConfig, PlayTransformPartsAtomic { type: 'native' } export interface PlayTransformGenericStage extends StageConfig, PlayTransformPartsAtomic { type: string } export interface UntypedPlayTransformUserStage extends UntypedStageConfig, PlayTransformPartsAtomic { } export type PlayTransformStage = PlayTransformMetadataStage | PlayTransformUserStage | PlayTransformNativeStage | UntypedPlayTransformUserStage | PlayTransformGenericStage; /** Represents the plain json user-configured structure (input) */ export interface PlayTransformHooksConfig { preCompare?: PlayTransformPartsConfig compare?: { candidate?: PlayTransformPartsConfig existing?: PlayTransformPartsConfig } postCompare?: PlayTransformPartsConfig } /** Represents the final, strongly-typed transform configuration used during runtime */ export interface PlayTransformHooks extends PlayTransformHooksConfig { preCompare?: PlayTransformPartsArray compare?: { candidate?: PlayTransformPartsArray existing?: PlayTransformPartsArray } postCompare?: PlayTransformPartsArray } export type PlayTransformRules = PlayTransformHooks export type TransformHook = 'preCompare' | 'compare' | 'candidate' | 'existing' | 'postCompare'; export const TRANSFORM_HOOK = { preCompare: 'preCompare' as TransformHook, candidate: 'candidate' as TransformHook, existing: 'existing' as TransformHook, postCompare: 'postCompare' as TransformHook, } export type PlayTransformConfig = PlayTransformHooksConfig; export type PlayTransformOptions = PlayTransformConfig & { log?: boolean | 'all' } export type WhenParts = PlayTransformPartsAtomic; export type WhenConditions = WhenParts[]; export type WhenConditionsConfig = WhenConditions;