@roots/bud
Version:
Configurable, extensible build tools for modern single and multi-page web applications
74 lines (73 loc) • 3.13 kB
JavaScript
import { join } from 'node:path';
import { stderr, stdin, stdout } from 'node:process';
import * as budManifest from '@roots/bud/context/bud';
import getExtensions from '@roots/bud/context/extensions';
import services from '@roots/bud/context/services';
import args from '@roots/bud-framework/bootstrap/args';
import * as projectEnv from '@roots/bud-framework/bootstrap/env';
import * as projectFiles from '@roots/bud-framework/bootstrap/files';
import * as projectPaths from '@roots/bud-framework/bootstrap/paths';
import * as filesystem from '@roots/bud-support/filesystem';
import logger from '@roots/bud-support/logger';
import whichPm from '@roots/bud-support/which-pm';
let context;
export default async function make(options = {}) {
logger.scope(`bootstrap`).log(`🏗️`, `Creating context`);
const basedir = options?.basedir ?? process.cwd();
const paths = projectPaths.get(basedir);
const fs = filesystem.get(paths.basedir);
const env = projectEnv.get(paths.basedir);
const bud = await budManifest.get(fs);
let manifest;
try {
manifest = await fs.read(join(paths.basedir, `package.json`));
if (manifest?.bud?.basedir) {
const targetPath = join(paths.basedir, manifest.bud.basedir);
logger
.scope(`bootstrap`)
.log(`🏗️`, `Directory changed`, `rebuilding context from`, join(targetPath, `package.json`));
return await make({
basedir: targetPath,
...(options ?? {}),
});
}
}
catch (error) {
logger.scope(`bootstrap`).warn(`📦`, error);
}
const files = await projectFiles.get(paths.basedir);
const extensions = getExtensions(manifest, args.use ?? [], options?.extensions);
if (!options.pm) {
const pm = await whichPm(paths.basedir);
options.pm = pm !== false ? pm : `npm`;
}
context = {
...(args ?? {}),
...options,
basedir: paths.basedir,
bin: env.BUD_JS_BIN ?? `node`,
bud: { ...bud, ...(options?.bud ?? {}) },
env: { ...(env ?? {}), ...(options?.env ?? {}) },
extensions,
files: { ...(files ?? {}), ...(options?.files ?? {}) },
label: options?.label ?? manifest?.name ?? bud?.label ?? `default`,
manifest: { ...(manifest ?? {}), ...(options?.manifest ?? {}) },
mode: options?.mode ?? `production`,
paths: { ...paths, ...(options?.paths ?? {}) },
pm: args?.pm ?? options?.pm ?? `npm`,
services: [...(services ?? []), ...(options?.services ?? [])],
stderr: options?.stderr ?? stderr,
stdin: options?.stdin ?? stdin,
stdout: options?.stdout ?? stdout,
};
logger
.unscope()
.scope(context.label, `bootstrap`)
.log(`🏗️`, `Building`, context.label)
.log(`📂`, `Directory:`, context.basedir)
.log(`📁`, `Storage:`, context.paths.storage)
.log(`😎`, `Version:`, context.bud.version)
.log(`📦`, `Package Manager:`, context.pm)
.scope(context.label);
return context;
}