import { EventEmitter } from 'events' ; export type Dependencies = { [ pkgName ] : string ; } ; export type DependencyType = 'dev' | 'dep' | 'peer' ; export type DependencyTypeFull = 'peerDependencies' | 'devDependencies' | 'dependencies' ; export interface PkgJson { devDependencies ? : Dependencies ; dependencies ? : Dependencies ; peerDependencies ? : Dependencies ; alfred ? : AlfredConfigWithUnresolvedTasks ; [ config ] : any ; } export interface PkgWithDeps { devDependencies : Dependencies ; dependencies : Dependencies ; } export interface PkgWithAllDeps { peerDependencies : Dependencies ; devDependencies : Dependencies ; dependencies : Dependencies ; } export type Env = 'production' | 'development' | 'test' ; export type EnvShortName = 'prod' | 'dev' | 'test' ; export type Platform = 'node' | 'browser' ; export type ProjectEnum = 'app' | 'lib' ; export type AlfredConfigSkill = [ string , ConfigValue ] ; export type NpmClient = 'yarn' | 'npm' | 'writeOnly' ; export type SubcommandFn = ( flags ? : Array < string > , target ? : Target ) => Promise < void > ; export type ExecutableSkillMethods = Map < string , SubcommandFn > ; export type SkillsForSubCommand = Map < string , Set < string > > ; export type SubCommandDict = Map < string , SkillTask > ; export type SkillsList = { subCommandAndSkills : SkillsForSubCommand ; subCommandDict : SubCommandDict ; } ; export interface ProjectInterface extends EventEmitter { root : string ; config : ConfigInterface ; pkg : PkgJson ; pkgPath : string ; entrypoints : Entrypoint [ ] ; targets : Target [ ] ; init : ( ) => Promise < ProjectInterface > ; skills : ( ) => Promise < SkillsList > ; learn : ( skillPkgNames : string [ ] ) => Promise < void > ; run : ( subcommand : string , skillFlags ? : string [ ] ) => Promise < void | SkillsList > ; emitAsync : ( eventName : string , eventData ? : HookEvent ) => Promise < void > ; setConfig : ( config : ConfigInterface ) => void ; getSkillMap : ( ) => Promise < SkillMap > ; writeSkillConfigs : ( skillMap : SkillMap ) => Promise < void > ; writeSkillFiles : ( skills : Skill [ ] ) => Promise < void > ; installDeps : ( dependencies : string [ ] | Dependencies , type : DependencyType , npmClient ? : NpmClient ) => Promise < void > ; findDepsToInstall : ( skills ? : Skill [ ] ) => Promise < PkgWithDeps > ; validatePkgJson : ( ) => ValidationResult ; } export type Entrypoint = { platform : Platform ; project : ProjectEnum ; filename : string ; meta ? : Record < string , string > ; } ; export type Target = { platform : Platform ; project : ProjectEnum ; env : Env ; } ; export type HandleFlagsArgs = { target : Target ; config : ConfigInterface ; } ; export interface SkillTaskModule { description : string ; subcommand : string ; runForEachTarget : boolean ; resolveSkill : ( skills : Array < Skill > , target ? : Target ) => Skill ; handleFlags ? : ( flags : Array < string > , args : HandleFlagsArgs ) => Array < string > ; } export type AlfredConfigRawSkill = string | [ string , ConfigValue ] ; export type RawExtendsConfigValue = Array < string > | string ; export interface AlfredConfigWithResolvedSkills { skills ? : AlfredConfigSkill [ ] ; npmClient ? : NpmClient ; configsDir ? : string ; autoInstall ? : boolean ; } export interface AlfredConfigWithUnresolvedSkills { skills ? : Array < AlfredConfigRawSkill > ; npmClient ? : NpmClient ; configsDir ? : string ; autoInstall ? : boolean ; } export interface AlfredConfigWithUnresolvedTasks extends AlfredConfigWithUnresolvedSkills { extends ? : RawExtendsConfigValue ; } export interface AlfredConfigWithDefaults { skills : AlfredConfigSkill [ ] ; npmClient : NpmClient ; configsDir : string ; autoInstall : boolean ; } export interface ConfigInterface extends AlfredConfigWithDefaults { getConfigWithDefaults : ( ) => AlfredConfigWithDefaults ; getConfigValues : ( ) => AlfredConfigWithResolvedSkills ; } export interface SkillTask { name : string ; module : SkillTaskModule ; config : Record < string , any > ; } export type UnresolvedTasks = Array < string | [ string , Record < string , any > ] | SkillTask > ; export type ResolvedTasks = Array < SkillTask > ; export type ConfigValue = Record < string , any > ; export type SkillFileConditionArgs = { project : ProjectInterface ; } ; export type SkillFile = { alias ? : string ; src ? : string ; dest : string ; content ? : string ; condition ? : ( args : SkillFileConditionArgs ) => boolean | Promise < boolean > ; } ; export type FileType = 'commonjs' | 'module' | 'json' ; export interface EnhancedMap < K , V > extends Map < K , V > { map ( fn ) : EnhancedMap < K , V > ; } export type SkillConfig = { alias ? : string ; filename : string ; config : ConfigValue ; fileType ? : FileType ; pkgProperty ? : string ; write ? : 'file' | 'pkg' | false ; imports ? : string [ ] ; } ; export type ParsedFlags = Record < string , boolean | string | number > ; export type RunEvent = { flags : Array < string > ; parsedFlags : ParsedFlags ; subcommand : string ; output : string [ ] ; } ; export type RunForEachTargetEvent = { target : Target ; flags : Array < string > ; parsedFlags : ParsedFlags ; subcommand : string ; output : string ; } ; export type LearnEvent = { skills : Skill [ ] ; skillsPkgNames : Array < string > ; } ; export type NewEvent = { skillsPkgNames : Array < string > ; skills : Skill [ ] ; flags : Array < string > ; } ; export type TransformsEvent = Record < string , any > ; export type HookArgs < T > = { project : ProjectInterface ; config : ConfigInterface ; targets : Target [ ] ; skill : Skill ; skillMap : SkillMap ; event : T ; } ; export type HookEvent = RunEvent | RunForEachTargetEvent | LearnEvent | NewEvent ; export type HookFn < T > = ( args : HookArgs < T > ) => void | Promise < void > ; export type DiffDeps = { diffDevDeps : string [ ] ; diffDeps : string [ ] ; } ; export type RawSupports = { envs ? : Array < Env > ; platforms ? : Array < Platform > ; projects ? : Array < ProjectEnum > ; } ; export type Supports = { envs : Array < Env > ; platforms : Array < Platform > ; projects : Array < ProjectEnum > ; } ; export type TransformArgs = { toSkill : Skill ; skillMap : SkillMap ; project : ProjectInterface ; config : ConfigInterface ; } ; export type Transforms = { [ skillName ] : ( ownSkill : Skill , transformArgs : TransformArgs ) => Skill ; } ; export interface VirtualFileSystemInterface extends Map < string , VirtualFileInterface > { add ( file ) : VirtualFileSystemInterface ; writeAllFiles ( project ) : Promise < void > ; } export interface VirtualFileInterface extends SkillFile { write ( content ) : VirtualFileInterface ; move ( filename ) : VirtualFileInterface ; delete ( ) : void ; rename ( filename ) : VirtualFileInterface ; replace ( searchValueOrContent , replaceValue ) : VirtualFileInterface ; applyDiff ( diff ) : VirtualFileInterface ; } export type CORE_SKILL = 'webpack' | 'babel' | 'parcel' | 'eslint' | 'prettier' | 'jest' | 'react' | 'redux' | 'rollup' | 'lodash' ; export type Hooks = { beforeRun ? : HookFn < RunEvent > ; run ? : HookFn < RunEvent | RunForEachTargetEvent > ; afterRun ? : HookFn < RunEvent > ; beforeLearn ? : HookFn < LearnEvent > ; afterNew ? : HookFn < NewEvent > ; beforeNew ? : HookFn < NewEvent > ; afterLearn ? : HookFn < LearnEvent > ; beforeTransforms ? : HookFn < TransformsEvent > ; afterTransforms ? : HookFn < TransformsEvent > ; } ; export interface RawSkill { name : string ; description ? : string ; supports ? : RawSupports ; pkg ? : PkgJson ; devDependencies ? : Dependencies ; dependencies ? : Dependencies ; dirs ? : Array < Dir > ; files ? : Array < SkillFile > ; configs ? : Array < SkillConfig > ; tasks ? : UnresolvedTasks ; hooks ? : Hooks ; transforms ? : Transforms ; default ? : boolean ; userConfig ? : Record < string , any > ; } export type Dir = { src : string ; dest : string ; } ; export interface SkillWithoutHelpers extends PkgWithDeps { name : string ; description : string ; pkg : PkgJson ; subcommand ? : string ; supports : Supports ; dirs : Array < Dir > ; files : VirtualFileSystemInterface ; configs : EnhancedMap < string , SkillConfig > ; tasks : Array < SkillTask > ; hooks : Hooks ; transforms : Transforms ; default : boolean ; userConfig : Record < string , any > ; } export type SkillMap = Map < string , Skill > ; export type Skill = SkillWithoutHelpers & { findConfig : ( configName : string ) => SkillConfig ; extendConfig : ( configName : string , configExtension : ConfigValue ) => Skill ; replaceConfig : ( configName : string , configReplacement : ConfigValue ) => Skill ; setWrite : ( configName : string , shouldWrite : boolean ) => Skill ; addDeps : ( pkg : Dependencies ) => Skill ; addDevDeps : ( pkg : Dependencies ) => Skill ; addImports ( configName , imports ) : Skill ; addDepsFromPkg : ( pkgs : string | string [ ] , pkg ? : PkgJson , fromPkgType ? : DependencyType , toPkgType ? : DependencyType ) => Skill ; } ; export interface Helpers < T > { findConfig : ( configName : string ) => SkillConfig ; extendConfig : ( configName : string , configExtension : ConfigValue ) => T ; replaceConfig : ( configName : string , configReplacement : ConfigValue ) => T ; setWrite : ( configName : string , shouldWrite : boolean ) => T ; addImports ( configName , imports ) : Skill ; addDeps : ( pkg : Dependencies ) => T ; addDevDeps : ( pkg : Dependencies ) => T ; addDepsFromPkg : ( pkgs : string | string [ ] , pkg ? : PkgJson , fromPkgType ? : DependencyType , toPkgType ? : DependencyType ) => T ; } export type ValidationResult = { warnings : string [ ] ; errors : string [ ] ; recommendations : string [ ] ; messagesCount : number ; criticalMessage : string ; } ;