@knapsack/app
Version:
Build Design Systems with Knapsack
160 lines • 5.8 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.bootstrap = bootstrap;
exports.bootstrapFromConfig = bootstrapFromConfig;
exports.bootstrapFromConfigFile = bootstrapFromConfigFile;
exports.findConfigAndBootstrap = findConfigAndBootstrap;
exports.bootstrapForCli = bootstrapForCli;
exports.getBrain = getBrain;
const file_utils_1 = require("@knapsack/file-utils");
const zod_1 = require("zod");
const server_utils_1 = require("../server/server-utils");
const config_1 = require("./config");
const log_1 = require("../cli/log");
const patterns_1 = require("../domains/patterns/patterns");
const navs_1 = require("../domains/navs/navs");
const custom_pages_1 = require("../domains/blocks/custom-pages");
const design_tokens_1 = require("../domains/design-tokens/design-tokens");
const asset_sets_1 = require("../domains/patterns/asset-sets");
const app__server_1 = require("./plugins/app--server");
const files_1 = require("../domains/files/files");
const db_1 = require("../db");
let isReady = false;
let brain = {
patterns: null,
customPages: null,
tokens: null,
assetSets: null,
navs: null,
config: null,
files: null,
db: null,
};
/**
* Take config and then start up the whole system!
*/
function bootstrap(config,
/**
* path that config file paths are relative from
*/
configPathBase = process.cwd()) {
(0, log_1.updateLogMetadata)({
knapsackMeta: {
siteId: config.cloud?.siteId,
appClientVersion: (0, file_utils_1.findUpPkgJson)(__dirname).pkg?.version,
},
});
config.templateRenderers.forEach((renderer) => renderer.setConfig({
dataDir: config.data,
userConfigDir: configPathBase,
}));
const db = new db_1.Db(config);
const assetSets = new asset_sets_1.AssetSets({
dataDir: config.data,
publicDir: config.public,
});
const patterns = new patterns_1.Patterns({
assetSets,
dataDir: config.data,
templateRenderers: config.templateRenderers,
db,
config,
});
const customPages = new custom_pages_1.CustomPages({ dataDir: config.data });
const navs = new navs_1.Navs({ dataDir: config.data });
const tokens = new design_tokens_1.DesignTokens({
designTokensConfig: config.designTokens ?? {},
dataDir: config.data,
publicDir: config.public,
distDir: config.designTokens?.distDir || (0, file_utils_1.join)(config.dist, './tokens'),
siteId: config.cloud?.siteId,
});
const files = new files_1.Files({ dataDir: config.data });
config.plugins = [...(config.plugins ?? []), (0, app__server_1.configure)()].filter(Boolean);
brain = {
patterns,
customPages,
tokens,
navs,
assetSets,
config,
files,
db,
};
log_1.log.verbose('Brain built');
isReady = true;
return brain;
}
function bootstrapFromConfig({ configPathBase, config: userConfig, configFilePath, }) {
(0, file_utils_1.assertsIsAbsolutePath)(configPathBase);
const config = (0, config_1.processConfig)({ userConfig, configPathBase, configFilePath });
return bootstrap(config, configPathBase);
}
/**
* Take config file path and then start up the whole system!
*/
function bootstrapFromConfigFile(
/**
* path to `knapsack.config.js`
*/
configPath) {
(0, server_utils_1.fileExistsOrExit)(configPath);
// Resolve to absolute path if not already
const absConfigPath = (0, file_utils_1.isAbsolute)(configPath)
? configPath
: (0, file_utils_1.join)(process.cwd(), configPath);
(0, file_utils_1.assertsIsAbsolutePath)(absConfigPath);
try {
// eslint-disable-next-line @typescript-eslint/no-var-requires, global-require
const userConfig = require(absConfigPath);
const configPathBase = (0, file_utils_1.dirname)(absConfigPath);
return bootstrapFromConfig({
configPathBase,
configFilePath: absConfigPath,
config: userConfig,
});
}
catch (e) {
log_1.log.error(`Error loading config file "${(0, file_utils_1.relative)(process.cwd(), absConfigPath)}":`, e instanceof zod_1.z.ZodError ? zod_1.z.prettifyError(e) : e);
process.exit(1);
}
}
function findConfigAndBootstrap() {
const configPath = file_utils_1.findUp.sync(['knapsack.config.cjs', 'knapsack.config.js'], {
cwd: process.cwd(),
type: 'file',
});
if (!configPath) {
throw new Error(`Could not find a knapsack.config.cjs file`);
}
(0, file_utils_1.assertsIsAbsolutePath)(configPath);
return bootstrapFromConfigFile(configPath);
}
function bootstrapForCli() {
// get cli arg `--config` path
const configFlagIndex = process.argv.indexOf('--config');
const configDir = configFlagIndex !== -1
? (0, file_utils_1.join)(process.cwd(), process.argv[configFlagIndex + 1])
: process.cwd();
const configPath = file_utils_1.findUp.sync(['knapsack.config.cjs', 'knapsack.config.js'], {
cwd: configDir,
type: 'file',
});
if (!configPath) {
log_1.log.error(`Could not find a knapsack.config.cjs file in current directory or above. If it is located in a subdirectory, you can use the --config flag to specify the path to it.`);
process.exit(1);
}
(0, file_utils_1.assertsIsAbsolutePath)(configPath);
return bootstrapFromConfigFile(configPath);
}
/**
* Get the Brain created from a previous bootstrap
*/
function getBrain() {
if (!isReady) {
log_1.log.error('Not ready yet! You cannot "getBrain()" before "bootstrap()" or "bootstrapFromConfigFile()" has been run');
process.exit(1);
}
return brain;
}
//# sourceMappingURL=bootstrap.js.map