diff --git a/package.json b/package.json index 14893ff..3df4259 100644 --- a/package.json +++ b/package.json @@ -5,6 +5,8 @@ "private": true, "scripts": { "build": "lerna run build", + "lint": "yarn run eslint && yarn run prettier", + "lint:check": "yarn run eslint:check && yarn run prettier:check", "prettier": "prettier --list-different --write \"packages/**/*.ts\"", "prettier:check": "prettier --check \"packages/**/*.ts\"", "eslint": "eslint --ext .ts --fix .", diff --git a/packages/mambajs-core/src/helper.ts b/packages/mambajs-core/src/helper.ts index 2e3f60d..5d14de6 100644 --- a/packages/mambajs-core/src/helper.ts +++ b/packages/mambajs-core/src/helper.ts @@ -34,10 +34,16 @@ export interface IEmpackEnvMetaPkg { subdir: string; } +export interface IEmpackEnvMetaMountPoint { + name: string; + filename: string; +} + export interface IEmpackEnvMeta { prefix: string; packages: IEmpackEnvMetaPkg[]; specs?: string[]; + mounts?: IEmpackEnvMetaMountPoint[]; } /** diff --git a/packages/mambajs-core/src/index.ts b/packages/mambajs-core/src/index.ts index caf8915..a36b8c9 100644 --- a/packages/mambajs-core/src/index.ts +++ b/packages/mambajs-core/src/index.ts @@ -8,6 +8,7 @@ import { getSharedLibs, IBootstrapData, IEmpackEnvMeta, + IEmpackEnvMetaMountPoint, IEmpackEnvMetaPkg, ILogger, ISolvedPackage, @@ -86,11 +87,18 @@ export interface IBootstrapEmpackPackedEnvironmentOptions { * @param options * @returns The installed shared libraries as a TSharedLibs */ -export const bootstrapEmpackPackedEnvironment = async ( +export async function bootstrapEmpackPackedEnvironment( options: IBootstrapEmpackPackedEnvironmentOptions -): Promise => { +): Promise { const { empackEnvMeta } = options; + if (empackEnvMeta.mounts) { + await installMountPointToEmscriptenFS({ + mountPoints: empackEnvMeta.mounts, + ...options + }); + } + const solvedPkgs: ISolvedPackages = {}; for (const empackPkg of empackEnvMeta.packages) { solvedPkgs[empackPkg.filename] = empackPkg; @@ -100,14 +108,9 @@ export const bootstrapEmpackPackedEnvironment = async ( packages: solvedPkgs, ...options }); -}; - -export interface IInstallPackagesToEnvOptions { - /** - * The packages to install - */ - packages: ISolvedPackages; +} +export interface IInstallFilesToEnvOptions { /** * The URL (CDN or similar) from which to download packages */ @@ -139,15 +142,31 @@ export interface IInstallPackagesToEnvOptions { logger?: ILogger; } +export interface IInstallPackagesToEnvOptions + extends IInstallFilesToEnvOptions { + /** + * The packages to install + */ + packages: ISolvedPackages; +} + +export interface IInstallMountPointsToEnvOptions + extends IInstallFilesToEnvOptions { + /** + * The mount points to install + */ + mountPoints: IEmpackEnvMetaMountPoint[]; +} + /** * Install packages into an emscripten FS. * * @param options * @returns The installed shared libraries as a TSharedLibs */ -export const installPackagesToEmscriptenFS = async ( +export async function installPackagesToEmscriptenFS( options: IInstallPackagesToEnvOptions -): Promise => { +): Promise { const { packages, pkgRootUrl, Module, generateCondaMeta, logger } = options; let untarjs: IUnpackJSAPI; @@ -208,7 +227,31 @@ export const installPackagesToEmscriptenFS = async ( await waitRunDependencies(Module); return { sharedLibs: sharedLibsMap, paths: paths, untarjs }; -}; +} + +export async function installMountPointToEmscriptenFS( + options: IInstallMountPointsToEnvOptions +): Promise { + const { mountPoints, pkgRootUrl, Module, logger } = options; + + let untarjs: IUnpackJSAPI; + if (options.untarjs) { + untarjs = options.untarjs; + } else { + const untarjsReady = initUntarJS(); + untarjs = await untarjsReady; + } + + await Promise.all( + mountPoints.map(async mountPoint => { + const url = `${pkgRootUrl}/${mountPoint.filename}`; + logger?.log(`Extracting ${mountPoint.filename}`); + const extractedMountPoint = await untarjs.extract(url); + + saveFilesIntoEmscriptenFS(Module.FS, extractedMountPoint, ''); + }) + ); +} export interface IRemovePackagesFromEnvOptions { /** diff --git a/packages/mambajs-core/src/parser.ts b/packages/mambajs-core/src/parser.ts index cbb5d84..9156f4f 100644 --- a/packages/mambajs-core/src/parser.ts +++ b/packages/mambajs-core/src/parser.ts @@ -185,7 +185,7 @@ function getCondaRemoveCommandParameters( const env: string[] = []; const limits = ['-all', '--override-frozen', '--keep-env', '--dev']; let skip = false; - let envFlags = ['-n', '--name', '-p', '--prefix']; + const envFlags = ['-n', '--name', '-p', '--prefix']; limits.map((options: string) => { if (input.includes(options)) {