export interface SystemjsConfigFile extends SystemjsConfigData {
	browserConfig: SystemjsConfigData;
	nodeConfig: SystemjsConfigData;
	devConfig: SystemjsConfigData;
}

export interface ModuleMapping<T> {
	[module: string]: T;
}

export type ModuleFileMapping = ModuleMapping<string[]>;
export type ModuleImportMapping = ModuleMapping<string>;
export type ModuleMetaData =
	ModuleMetaDataBase|
	ModuleMetaDataCJS|
	ModuleMetaDataAMD|
	GlobalModuleMetaData;
export type ModuleFormat = 'esm'|'amd'|'cjs'|'global'|'system'|string

export interface ModuleMetaDataBase {
	format: 'esm'|'system'|string;
	ModuleMetaData: any;
	crossOrigin: 'anonymous'|'use-credentials';
	esModule: boolean;
	integrity: string;
	loader: string;
	nonce: string;
	sourceMap: any;
	scriptLoad: boolean;
}

export interface ModuleMetaDataCJS extends ModuleMetaDataBase {
	format: 'cjs';
	deps: string[];
	globals: ModuleImportMapping;
}

export interface ModuleMetaDataAMD extends ModuleMetaDataBase {
	format: 'amd';
	deps: string[];
}

export interface GlobalModuleMetaData extends ModuleMetaDataBase {
	format: 'global';
	exports: string|string[];
	deps: string[];
	globals: ModuleImportMapping;
}

export interface PackageDefine {
	defaultExtension: string|true;
	format: ModuleFormat;
	main: string;
	map: ModuleImportMapping|ModuleMapping<ModuleImportMapping>;
	meta: ModuleMapping<ModuleMetaData>;
}

export interface PartialPackageDefine {
	defaultExtension?: string|true;
	format?: ModuleFormat;
	main?: string;
	map?: ModuleImportMapping|ModuleMapping<Partial<ModuleImportMapping>>;
	meta?: ModuleMapping<Partial<ModuleMetaData>>;
}

export interface SystemjsConfigData {
	baseUrl: string;
	bundles: {};
	depCache: ModuleFileMapping;
	map: ModuleImportMapping|ModuleMapping<ModuleImportMapping>;
	meta: ModuleMapping<ModuleMetaData>;
	packages: ModuleMapping<PackageDefine>;
	packageConfigPaths: string[];
	paths: ModuleImportMapping;
	pluginFirst: boolean;
	transpiler: string|false;
	warnings: boolean;
	wasm: boolean;
}
