From f44027854d4b40377e27396abd90e44f2bf71691 Mon Sep 17 00:00:00 2001 From: cha0s Date: Wed, 3 Jan 2024 19:23:11 -0600 Subject: [PATCH] feat: flecks add --- TODO.md | 2 +- packages/core/src/server/commands.js | 21 +++++++++++++++++++++ packages/core/src/server/flecks.js | 11 +++++++++++ packages/create-fleck/src/cli.js | 10 +++------- 4 files changed, 36 insertions(+), 8 deletions(-) diff --git a/TODO.md b/TODO.md index 24793ff..ed7184f 100644 --- a/TODO.md +++ b/TODO.md @@ -32,7 +32,7 @@ - [ ] `$flecks/db/sequelize` should be `$flecks/db.sequelize` - [x] `url()` in styles breaks HMR - [ ] 2 underscores for `FLECKS_ENV` variables -- [ ] flecks add +- [x] flecks add # Next diff --git a/packages/core/src/server/commands.js b/packages/core/src/server/commands.js index 60713e1..e427ef7 100644 --- a/packages/core/src/server/commands.js +++ b/packages/core/src/server/commands.js @@ -7,6 +7,7 @@ import flatten from 'lodash.flatten'; import rimraf from 'rimraf'; import D from '../debug'; +import Flecks from './flecks'; const { FLECKS_CORE_ROOT = process.cwd(), @@ -45,6 +46,26 @@ export const spawnWith = (cmd, opts = {}) => { export default (program, flecks) => { const commands = { + add: { + args: [ + new Argument('>', 'fleck'), + ], + description: 'add a fleck to your application', + action: async (fleck, opts) => { + const { + noYarn, + } = opts; + await processCode( + noYarn + ? spawn('npm', ['install', fleck], {stdio: 'inherit'}) + : spawn('yarn', ['add', fleck], {stdio: 'inherit'}), + ); + await Flecks.addFleckToYml(fleck); + }, + options: [ + ['--no-yarn', 'use npm instead of yarn'], + ], + }, clean: { description: 'remove node_modules, lock file, build artifacts, then reinstall', action: (opts) => { diff --git a/packages/core/src/server/flecks.js b/packages/core/src/server/flecks.js index 1a23573..4e45525 100644 --- a/packages/core/src/server/flecks.js +++ b/packages/core/src/server/flecks.js @@ -3,6 +3,7 @@ import { realpathSync, statSync, } from 'fs'; +import {readFile, writeFile} from 'fs/promises'; import { basename, dirname, @@ -10,10 +11,12 @@ import { isAbsolute, join, resolve, + sep, } from 'path'; import babelmerge from 'babel-merge'; import enhancedResolve from 'enhanced-resolve'; +import {dump as dumpYml, load as loadYml} from 'js-yaml'; import {addHook} from 'pirates'; import D from '../debug'; @@ -40,6 +43,14 @@ export default class ServerFlecks extends Flecks { this.rcs = options.rcs || {}; } + static async addFleckToYml(fleck, path) { + const key = [fleck].concat(path ? `.${sep}${join('packages', path, 'src')}` : []).join(':'); + const ymlPath = join(FLECKS_CORE_ROOT, 'build', 'flecks.yml'); + let yml = loadYml(await readFile(ymlPath)); + yml = Object.fromEntries(Object.entries(yml).concat([[key, {}]])); + await writeFile(ymlPath, dumpYml(yml, {sortKeys: true})); + } + get aliasedConfig() { const aliases = this.aliases(); return Object.fromEntries( diff --git a/packages/create-fleck/src/cli.js b/packages/create-fleck/src/cli.js index 97c6210..3d1eb5d 100644 --- a/packages/create-fleck/src/cli.js +++ b/packages/create-fleck/src/cli.js @@ -1,8 +1,8 @@ -import {readFile, stat, writeFile} from 'fs/promises'; +import {stat} from 'fs/promises'; import {join, normalize} from 'path'; import {build, move, validate} from '@flecks/create-app/server'; -import {dumpYml, Flecks, loadYml} from '@flecks/core/server'; +import {Flecks} from '@flecks/core/server'; import {confirm} from '@inquirer/prompts'; const { @@ -65,11 +65,7 @@ const create = async (flecks) => { await move(name, join(__dirname, 'template'), destination, 'fleck', flecks); await build(destination); if (isMonorepo && await confirm({message: 'Add fleck to `build/flecks.yml`?'})) { - const key = `${name}:${join('.', 'packages', pkg)}`; - const ymlPath = join(FLECKS_CORE_ROOT, 'build', 'flecks.yml'); - let yml = loadYml(await readFile(ymlPath)); - yml = Object.fromEntries(Object.entries(yml).concat([[key, {}]])); - await writeFile(ymlPath, dumpYml(yml, {forceQuotes: true, sortKeys: true})); + await Flecks.addFleckToYml(name, pkg); } };