diff --git a/.changeset/tame-rabbits-wink.md b/.changeset/tame-rabbits-wink.md new file mode 100644 index 00000000..5de2b86e --- /dev/null +++ b/.changeset/tame-rabbits-wink.md @@ -0,0 +1,5 @@ +--- +"@pinefile/pine": patch +--- + +Fix so config can be loaded from package.json diff --git a/packages/pine/src/config.ts b/packages/pine/src/config.ts index b6778855..83911797 100644 --- a/packages/pine/src/config.ts +++ b/packages/pine/src/config.ts @@ -1,11 +1,14 @@ import fs from 'fs'; import path from 'path'; import dotenv from 'dotenv'; -import { isObject } from '@pinefile/utils'; +import { isObject, merge } from '@pinefile/utils'; import { Options } from './args'; +import { findFile } from './file'; import { LogLevel, setLogger, Logger } from './logger'; import { Runner } from './runner'; +const isDev = process.argv.some((a) => a.includes('packages/pine/src/bin.ts')); + export type Config = { /** * Dynamic config properties. @@ -74,19 +77,45 @@ export type Config = { */ export type ConfigFunction = (cfg: Config) => Config; -const isDev = process.argv.some((a) => a.includes('packages/pine/src/bin.ts')); +let pkgConfig = {}; + +/** + * Load config from package.json. + */ +export const loadPkgConfig = () => { + if (Object.keys(pkgConfig).length) { + return pkgConfig; + } -let config: Config = { - dotenv: [], - env: {}, - esbuild: !isDev, - logLevel: 'info', - options: {}, - root: '', - require: [], - task: '', + const file = findFile('package.json'); + if (!file) { + return pkgConfig; + } + + try { + // eslint-disable-next-line + const pkg = require(file); + pkgConfig = (typeof pkg === 'object' ? pkg?.pine : null) || {}; + // eslint-disable-next-line + } catch (err) {} + + return pkgConfig; }; +let config: Config = merge( + { + dotenv: [], + env: {}, + esbuild: !isDev, + logLevel: 'info', + options: {}, + root: '', + require: [], + task: '', + }, + loadPkgConfig() +); + const isError = (error: any): error is NodeJS.ErrnoException => error instanceof Error;