async-usage
Version:
Declarative dynamic imports for everyone!
82 lines (67 loc) • 1.85 kB
text/typescript
import { useChunks } from './use-сhunks';
import { chunkImporterFactory } from './chunk-factory';
import { ImportFactory, IChunkPlugin, Chunk, ImportFunction, ChunksUse, ChunkImportOptions, ExtendedChunksMap } from './types';
import { isStr } from './util';
export interface IAsyncUsageOptions<C extends Chunk> {
basePath: string;
plugins?: IChunkPlugin<C>[];
}
export function createAsyncUsage<
I extends ImportFactory<any> = ImportFactory<any>,
C extends Chunk = I extends ImportFactory<infer U> ? U : any
>(
importFactory: I,
options: IAsyncUsageOptions<C> | string = ''
): ChunksUse<C> {
const {
basePath = '',
plugins = []
} = isStr(options) ? { basePath: options } : options;
const cif = chunkImporterFactory<C>(
importFactory,
basePath,
plugins
);
function use(chunkMap: string, relativePath?: string): ImportFunction<C>;
function use(chunkMap: ChunkImportOptions, relativePath?: string): ExtendedChunksMap<C>;
function use(chunkMap: ChunkImportOptions | string, relativePath?: string): ExtendedChunksMap<C> | ImportFunction<C> {
if (isStr(chunkMap)) {
return cif(chunkMap, relativePath);
}
const chunks = useChunks(
cif,
chunkMap,
relativePath
);
const factory = function (
this: ExtendedChunksMap<C>,
cm: ChunkImportOptions,
rp?: string
): ExtendedChunksMap<C> {
return {
...this,
...use(cm, rp)
};
};
return {
...chunks,
with: factory,
and: factory,
clean() {
const {
and: _a,
with: _w,
clean: _c,
...chunks
} = this;
return chunks;
}
} as ExtendedChunksMap<C>;
}
return use as ChunksUse<C>;
}
export {
ProfilePlugin,
cachePlugin
} from './plugins';
export * from './types';