From 6b512121abb75d25ca690838ce7815ff4df5be22 Mon Sep 17 00:00:00 2001 From: Jason Caldwell Date: Thu, 26 Jan 2023 21:48:13 -0500 Subject: [PATCH] Project update. [p][robotic] --- .madrun.js => .madrun.mjs | 2 +- dev/.files/bin/{envs.js => envs.mjs} | 2 +- .../{core-projects.js => core-projects.mjs} | 53 +-- .../includes/{utilities.js => utilities.mjs} | 135 ++++-- dev/.files/bin/{install.js => install.mjs} | 10 +- dev/.files/bin/{update.js => update.mjs} | 48 +- .../{custom-regexp.js => custom-regexp.mjs} | 0 .../updater/data/package.json/sort-order.json | 57 +++ .../updater/data/package.json/updates.json | 80 +++- .../bin/updater/{index.js => index.mjs} | 100 ++-- dev/.files/docs/build-info/core-projects.md | 5 +- dev/.files/madrun/{config.js => config.mjs} | 32 +- dev/.files/vite/{config.js => config.mjs} | 82 ++-- .../vite/includes/{aliases.js => aliases.mjs} | 0 package-lock.json | 429 ++++++++++++------ package.json | 14 +- vite.config.js => vite.config.mjs | 2 +- 17 files changed, 668 insertions(+), 383 deletions(-) rename .madrun.js => .madrun.mjs (88%) rename dev/.files/bin/{envs.js => envs.mjs} (99%) rename dev/.files/bin/includes/{core-projects.js => core-projects.mjs} (52%) rename dev/.files/bin/includes/{utilities.js => utilities.mjs} (90%) rename dev/.files/bin/{install.js => install.mjs} (93%) rename dev/.files/bin/{update.js => update.mjs} (92%) rename dev/.files/bin/updater/data/{custom-regexp.js => custom-regexp.mjs} (100%) create mode 100644 dev/.files/bin/updater/data/package.json/sort-order.json rename dev/.files/bin/updater/{index.js => index.mjs} (68%) rename dev/.files/madrun/{config.js => config.mjs} (51%) rename dev/.files/vite/{config.js => config.mjs} (85%) rename dev/.files/vite/includes/{aliases.js => aliases.mjs} (100%) rename vite.config.js => vite.config.mjs (89%) diff --git a/.madrun.js b/.madrun.mjs similarity index 88% rename from .madrun.js rename to .madrun.mjs index 44498b09..e297eff8 100644 --- a/.madrun.js +++ b/.madrun.mjs @@ -10,7 +10,7 @@ /* eslint-env es2021, node */ import mc from 'merge-change'; -import baseConfig from './dev/.files/madrun/config.js'; +import baseConfig from './dev/.files/madrun/config.mjs'; /* * Customizations. diff --git a/dev/.files/bin/envs.js b/dev/.files/bin/envs.mjs similarity index 99% rename from dev/.files/bin/envs.js rename to dev/.files/bin/envs.mjs index 5a5a81a4..7fbf936a 100755 --- a/dev/.files/bin/envs.js +++ b/dev/.files/bin/envs.mjs @@ -17,7 +17,7 @@ import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; import chalk from 'chalk'; -import u from './includes/utilities.js'; +import u from './includes/utilities.mjs'; u.propagateUserEnvVars(); // i.e., `USER_` env vars. diff --git a/dev/.files/bin/includes/core-projects.js b/dev/.files/bin/includes/core-projects.mjs similarity index 52% rename from dev/.files/bin/includes/core-projects.js rename to dev/.files/bin/includes/core-projects.mjs index c9e4594a..09d1c569 100644 --- a/dev/.files/bin/includes/core-projects.js +++ b/dev/.files/bin/includes/core-projects.mjs @@ -1,4 +1,3 @@ -#!/usr/bin/env node /** * Core projects. * @@ -10,31 +9,25 @@ export default { updates: { - ignore: [ - '.*', // - '!.github', - 'forks/', - ], + ignore: [], order: [ - 'forks/is-number.fork', - 'forks/to-regex-range.fork', - 'forks/fill-range.fork', - 'forks/braces.fork', - 'forks/picomatch.fork', - 'forks/micromatch.fork', - - 'forks/split-cmd.fork', - 'forks/merge-change.fork', - 'forks/spawn-please.fork', - 'forks/shescape.fork', + 'skeleton-dev-deps', + 'skeleton', + 'madrun', - '*.fork', - 'forks/*.fork', + 'is-number.fork', + 'to-regex-range.fork', + 'fill-range.fork', + 'braces.fork', + 'picomatch.fork', + 'micromatch.fork', - 'madrun', // Outlier. + 'split-cmd.fork', + 'merge-change.fork', + 'spawn-please.fork', + 'shescape.fork', - 'skeleton-dev-deps', - 'skeleton', + '*.fork', 'utilities', 'utilities.php', @@ -45,25 +38,13 @@ export default { 'utilities.node', 'utilities.cfw', 'utilities.cfp', - 'utilities.*', + 'utilities.*', 'skeleton.*', - '.github', 'private', + '.github', ], - skeletonOthers: { - globs: [ - 'skeleton-dev-deps', // - '{*.fork,forks/*.fork}', - ], - files: [ - './.gitattributes', // - './.gitignore', - './.npmignore', - './.npmrc', - ], - }, }, skeleton: { repoURL: 'https://github.com/clevercanyon/skeleton.git', diff --git a/dev/.files/bin/includes/utilities.js b/dev/.files/bin/includes/utilities.mjs similarity index 90% rename from dev/.files/bin/includes/utilities.js rename to dev/.files/bin/includes/utilities.mjs index a5ab3a3e..01750820 100755 --- a/dev/.files/bin/includes/utilities.js +++ b/dev/.files/bin/includes/utilities.mjs @@ -1,4 +1,3 @@ -#!/usr/bin/env node /** * Update CLI. * @@ -17,6 +16,8 @@ import path from 'node:path'; import { dirname } from 'desm'; import fsp from 'node:fs/promises'; +import deeps from 'deeps'; +import mc from 'merge-change'; import * as se from 'shescape'; import spawn from 'spawn-please'; @@ -36,18 +37,19 @@ const __dirname = dirname(import.meta.url); const binDir = path.resolve(__dirname, '..'); const projDir = path.resolve(__dirname, '../../../..'); -const { pkgFile, pkgName, pkgPrivate, pkgRepository } = (() => { +const { pkgFile, pkgName, pkgPrivate, pkgRepository, pkgBuildAppType } = (() => { const pkgFile = path.resolve(projDir, './package.json'); const pkg = JSON.parse(fs.readFileSync(pkgFile).toString()); if (typeof pkg !== 'object') { throw new Error('u: Unable to parse `./package.json`.'); } - const pkgName = pkg.name || ''; - const pkgPrivate = pkg.private; - const pkgRepository = pkg.repository || ''; + const pkgName = _.get(pkg, 'name', ''); + const pkgPrivate = _.get(pkg, 'private', null); + const pkgRepository = _.get(pkg, 'repository', ''); + const pkgBuildAppType = _.get(pkg, 'config.c10n.&.build.appType', ''); - return { pkgFile, pkgName, pkgPrivate, pkgRepository }; + return { pkgFile, pkgName, pkgPrivate, pkgRepository, pkgBuildAppType }; })(); const { log } = console; // Shorter reference. const echo = process.stdout.write.bind(process.stdout); @@ -69,6 +71,27 @@ const npmjsConfigVersion = '1.0.0'; // Bump when config changes in routines belo const c10nLogo = path.resolve(__dirname, '../../assets/brands/c10n/logo.png'); const c10nLogoDev = path.resolve(__dirname, '../../assets/brands/c10n/logo-dev.png'); +mc.addOperation('$default', (current, defaults) => { + const paths = Object.keys(defaults); + + for (const path of paths) { + if (undefined === deeps.get(current, path, '.')) { + deeps.set(current, path, defaults[path], true, '.'); + } + } + return paths.length > 0; +}); +mc.addOperation('$ꓺdefault', (current, defaults) => { + const paths = Object.keys(defaults); + + for (const path of paths) { + if (undefined === deeps.get(current, path, 'ꓺ')) { + deeps.set(current, path, defaults[path], true, 'ꓺ'); + } + } + return paths.length > 0; +}); + /** * Utilities. */ @@ -157,14 +180,57 @@ export default class u { throw new Error('u.pkgIncrementVersion: Failed to increment version: `' + origVersion + '`.'); } if (!opts.dryRun) { - pkg.version = version; // Update to incremented version. - const pkgPrettierCfg = { ...(await prettier.resolveConfig(pkgFile)), parser: 'json' }; - await fsp.writeFile(pkgFile, prettier.format(JSON.stringify(pkg, null, 4), pkgPrettierCfg)); + await u.updatePkg({ version }); } } - static async prettifyPkg() { + static async updatePkg(propsOrPath, value = undefined, delimiter = '.') { const pkg = await u.pkg(); // Parses current `./package.json` file. + + if (typeof propsOrPath === 'string') { + const path = propsOrPath; // String path. + deeps.set(pkg, path, value, true, delimiter); + // + } else if (typeof propsOrPath === 'object') { + const props = propsOrPath; // Object props. + mc.patch(pkg, props); // Potentially declarative ops. + } else { + throw new Error('u.updatePkg: Invalid arguments.'); + } + await fsp.writeFile(pkgFile, JSON.stringify(pkg, null, 4)); + await u.prettifyPkg(); // Sorts and runs prettier. + } + + static async prettifyPkg() { + const pkg = {}; // Sorted `./package.json`; i.e., using insertion order. + const curPkg = await u.pkg(); // Parses current `./package.json` file. + + const updatesFile = path.resolve(projDir, './dev/.files/bin/updater/data/package.json/updates.json'); + const sortOrderFile = path.resolve(projDir, './dev/.files/bin/updater/data/package.json/sort-order.json'); + + const updates = JSON.parse((await fsp.readFile(updatesFile)).toString()); + const sortOrder = JSON.parse((await fsp.readFile(sortOrderFile)).toString()); + + if (typeof updates !== 'object') { + throw new Error('u.prettifyPkg: Unable to parse `' + updatesFile + '`.'); + } + if (!Array.isArray(sortOrder)) { + throw new Error('u.prettifyPkg: Unable to parse `' + sortOrderFile + '`.'); + } + if (await u.isPkgRepo('clevercanyon/skeleton-dev-deps')) { + if (updates.$ꓺdefault?.['devDependenciesꓺ@clevercanyon/skeleton-dev-deps']) { + delete updates.$ꓺdefault['devDependenciesꓺ@clevercanyon/skeleton-dev-deps']; + } + } + mc.patch(curPkg, updates); // Potentially declarative ops. + + for (const path of sortOrder) { + const value = deeps.get(curPkg, path, 'ꓺ'); + if (undefined !== value) deeps.set(pkg, path, value, true, 'ꓺ'); + } + for (const [path, value] of Object.entries(deeps.flatten(curPkg, 'ꓺ'))) { + if (undefined === deeps.get(pkg, path, 'ꓺ')) deeps.set(pkg, path, value, true, 'ꓺ'); + } const pkgPrettierCfg = { ...(await prettier.resolveConfig(pkgFile)), parser: 'json' }; await fsp.writeFile(pkgFile, prettier.format(JSON.stringify(pkg, null, 4), pkgPrettierCfg)); } @@ -273,18 +339,15 @@ export default class u { static async githubReleaseTag() { const { owner, repo } = await u.githubOrigin(); - - // Created by Vite build process. const distZipFile = path.resolve(projDir, './.~dist.zip'); - - if (!fs.existsSync(distZipFile)) { - throw new Error('u.githubReleaseTag: Missing `./.~dist.zip`.'); - } const pkg = await u.pkg(); // Parses current `./package.json` file. if (!pkg.version) { throw new Error('u.githubReleaseTag: Package version is empty.'); } + if ((await u.isViteBuild()) && !fs.existsSync(distZipFile)) { + throw new Error('u.githubReleaseTag: Missing `./.~dist.zip` archive.'); + } const r = await octokit.request('POST /repos/{owner}/{repo}/releases', { owner, repo, @@ -299,17 +362,19 @@ export default class u { if (typeof r !== 'object' || typeof r.data !== 'object' || !r.data.id || !r.data.upload_url) { throw new Error('u.githubReleaseTag: Failed to acquire GitHub release data.'); } - await octokit.request({ - method: 'POST', - url: r.data.upload_url, - - name: 'dist.zip', - headers: { - 'content-type': 'application/zip', - 'content-length': fs.statSync(distZipFile).size, - }, - data: fs.readFileSync(distZipFile), - }); + if ((await u.isViteBuild()) && fs.existsSync(distZipFile)) { + await octokit.request({ + method: 'POST', + url: r.data.upload_url, + + name: 'dist.zip', + headers: { + 'content-type': 'application/zip', + 'content-length': fs.statSync(distZipFile).size, + }, + data: fs.readFileSync(distZipFile), + }); + } } static async githubCheckRepoOrgWideStandards(opts = { dryRun: false }) { @@ -495,9 +560,7 @@ export default class u { } } if (!opts.dryRun) { - _.set(pkg, 'config.c10n.&.github.configVersion', githubConfigVersion); - const pkgPrettierCfg = { ...(await prettier.resolveConfig(pkgFile)), parser: 'json' }; - await fsp.writeFile(pkgFile, prettier.format(JSON.stringify(pkg, null, 4), pkgPrettierCfg)); + await u.updatePkg('config.c10n.&.github.configVersion', githubConfigVersion); } } @@ -557,9 +620,7 @@ export default class u { } } if (!opts.dryRun) { - _.set(pkg, 'config.c10n.&.github.envsVersion', githubEnvsVersion); - const pkgPrettierCfg = { ...(await prettier.resolveConfig(pkgFile)), parser: 'json' }; - await fsp.writeFile(pkgFile, prettier.format(JSON.stringify(pkg, null, 4), pkgPrettierCfg)); + await u.updatePkg('config.c10n.&.github.envsVersion', githubEnvsVersion); } } @@ -1028,9 +1089,7 @@ export default class u { } } if (!opts.dryRun) { - _.set(pkg, 'config.c10n.&.npmjs.configVersions', githubConfigVersion + ',' + npmjsConfigVersion); - const pkgPrettierCfg = { ...(await prettier.resolveConfig(pkgFile)), parser: 'json' }; - await fsp.writeFile(pkgFile, prettier.format(JSON.stringify(pkg, null, 4), pkgPrettierCfg)); + await u.updatePkg('config.c10n.&.npmjs.configVersions', githubConfigVersion + ',' + npmjsConfigVersion); } } @@ -1067,6 +1126,10 @@ export default class u { * Vite utilities. */ + static async isViteBuild() { + return '' !== pkgBuildAppType; + } + static async viteBuild(opts = { mode: 'prod' }) { await u.spawn('npx', ['vite', 'build', '--mode', opts.mode]); } diff --git a/dev/.files/bin/install.js b/dev/.files/bin/install.mjs similarity index 93% rename from dev/.files/bin/install.js rename to dev/.files/bin/install.mjs index 2bafab99..7cf41c92 100755 --- a/dev/.files/bin/install.js +++ b/dev/.files/bin/install.mjs @@ -16,7 +16,7 @@ import yargs from 'yargs'; import { hideBin } from 'yargs/helpers'; import chalk from 'chalk'; -import u from './includes/utilities.js'; +import u from './includes/utilities.mjs'; u.propagateUserEnvVars(); // i.e., `USER_` env vars. @@ -99,9 +99,11 @@ class Project { * Builds the app using Vite in given mode. */ - log(chalk.green('Building with Vite; `' + this.args.mode + '` mode.')); - if (!this.args.dryRun) { - await u.viteBuild({ mode: this.args.mode }); + if (await u.isViteBuild()) { + log(chalk.green('Building with Vite; `' + this.args.mode + '` mode.')); + if (!this.args.dryRun) { + await u.viteBuild({ mode: this.args.mode }); + } } /** diff --git a/dev/.files/bin/update.js b/dev/.files/bin/update.mjs similarity index 92% rename from dev/.files/bin/update.js rename to dev/.files/bin/update.mjs index b80ed97a..b18717e3 100755 --- a/dev/.files/bin/update.js +++ b/dev/.files/bin/update.mjs @@ -24,8 +24,8 @@ import { hideBin } from 'yargs/helpers'; import chalk from 'chalk'; import * as se from 'shescape'; -import u from './includes/utilities.js'; -import coreProjects from './includes/core-projects.js'; +import u from './includes/utilities.mjs'; +import coreProjects from './includes/core-projects.mjs'; import { splitCMD } from '@clevercanyon/split-cmd.fork'; u.propagateUserEnvVars(); // i.e., `USER_` env vars. @@ -128,7 +128,7 @@ class Dotfiles { log(chalk.green('Running updater using latest `clevercanyon/skeleton`; `' + skeletonBranch + '` branch.')); if (!this.args.dryRun) { - await (await import(path.resolve(skeletonRepoDir, './dev/.files/bin/updater/index.js'))).default({ projDir, args: this.args }); + await (await import(path.resolve(skeletonRepoDir, './dev/.files/bin/updater/index.mjs'))).default({ projDir }); } /** @@ -206,9 +206,11 @@ class Project { * Updates Vite build in the given mode. */ - log(chalk.green('Updating Vite build; `' + this.args.mode + '` mode.')); - if (!this.args.dryRun) { - await u.viteBuild({ mode: this.args.mode }); + if (await u.isViteBuild()) { + log(chalk.green('Updating Vite build; `' + this.args.mode + '` mode.')); + if (!this.args.dryRun) { + await u.viteBuild({ mode: this.args.mode }); + } } /** @@ -361,28 +363,11 @@ class Projects { const devFilesDir = path.resolve(projDir, './dev/.files'); const pkgFile = path.resolve(projDir, './package.json'); - /** - * Checks `skeleton-dev-deps` considerations. - */ - - let isSkeletonDevDepsAndScriptOk = false; // Special case. - if ( - 'skeleton-dev-deps' === projDirSubpath && - (await u.isPkgRepo('clevercanyon/skeleton')) && - // - !this.args.cmd && // There's no custom CMD to run. - 1 === this.args.run.length && // Just one `update:project` script to run. - mm.isMatch(this.args.run[0], 'update:project{,:*, *}') // Pattern matching. - ) { - isSkeletonDevDepsAndScriptOk = true; // Allows `skeleton-dev-deps` `update:project` script. - // Note: `skeleton-dev-deps` has it's own set of `update:project` scripts that are ok to run. - } - /** * Validates the current glob result. */ - if (hasAllGlob && !fs.existsSync(devFilesDir) && !isSkeletonDevDepsAndScriptOk) { + if (hasAllGlob && !fs.existsSync(devFilesDir)) { log(chalk.gray('Has glob `*`. No `./dev/.files` inside `' + projDisplayDir + '`. Bypassing.')); continue; // No `./dev/.files` directory. } @@ -404,7 +389,7 @@ class Projects { log(chalk.green('Running `' + quotedCMD + (quotedArgs.length ? ' ' + quotedArgs.join(' ') : '') + '` in:') + ' ' + chalk.yellow(projDisplayDir)); if (!this.args.dryRun) { - await u.spawn(split.cmd, split.args, { cwd: projDir }); + await u.spawn(split.cmd, split.args, { cwd: projDir, stdio: 'inherit' }); } } } @@ -426,7 +411,7 @@ class Projects { log(chalk.green('Running `madrun ' + quotedCMD + (quotedArgs.length ? ' ' + quotedArgs.join(' ') : '') + '` in:') + ' ' + chalk.yellow(projDisplayDir)); if (!this.args.dryRun) { - await u.spawn('npx', ['@clevercanyon/madrun', split.cmd, ...split.args], { cwd: projDir }); + await u.spawn('npx', ['@clevercanyon/madrun', split.cmd, ...split.args], { cwd: projDir, stdio: 'inherit' }); } } } @@ -464,15 +449,6 @@ void (async () => { builder: (yargs) => { return yargs .options({ - skeletonUpdatesOthers: { - type: 'boolean', - requiresArg: false, - demandOption: false, - default: false, - description: // prettier-ignore - 'Updating `clevercanyon/skeleton` also updates some dotfiles in “other” core repos?' + - ' The “other” repos include: ../ `github`, `private`, `skeleton-dev-deps`, and `*.fork`s.', - }, message: { alias: 'm', type: 'string', @@ -567,7 +543,7 @@ void (async () => { type: 'array', requiresArg: true, demandOption: false, - default: ['*'], + default: ['*', '.github'], description: // prettier-ignore 'Glob matching is relative to `' + projsDir + '` and finds directories only.' + ' Note: Globstars `**` are not allowed given the nature of this command and will therefore throw an error.' + diff --git a/dev/.files/bin/updater/data/custom-regexp.js b/dev/.files/bin/updater/data/custom-regexp.mjs similarity index 100% rename from dev/.files/bin/updater/data/custom-regexp.js rename to dev/.files/bin/updater/data/custom-regexp.mjs diff --git a/dev/.files/bin/updater/data/package.json/sort-order.json b/dev/.files/bin/updater/data/package.json/sort-order.json new file mode 100644 index 00000000..5461bb88 --- /dev/null +++ b/dev/.files/bin/updater/data/package.json/sort-order.json @@ -0,0 +1,57 @@ +[ + "private", + "publishConfigꓺaccess", + + "version", + "license", + "name", + "description", + "repository", + "homepage", + "bugs", + "funding", + "keywords", + + "author", + "contributors", + + "type", + "files", + "bin", + "imports", + "exports", + "sideEffects", + "module", + "main", + "browser", + "unpkg", + "types", + "typesVersions", + + "dependencies", + "peerDependencies", + "peerDependenciesMeta", + "optionalDependencies", + "bundleDependencies", + "devDependencies", + + "overrides", + "workspaces", + + "cpu", + "os", + "enginesꓺnode", + "enginesꓺnpm", + + "configꓺc10nꓺ&ꓺdotfilesꓺlock", + + "configꓺc10nꓺ&ꓺbuildꓺappType", + "configꓺc10nꓺ&ꓺbuildꓺtargetEnv", + + "configꓺc10nꓺ&ꓺgithubꓺteams", + "configꓺc10nꓺ&ꓺgithubꓺlabels", + "configꓺc10nꓺ&ꓺgithubꓺconfigVersion", + "configꓺc10nꓺ&ꓺgithubꓺenvsVersion", + + "configꓺc10nꓺ&ꓺnpmjsꓺconfigVersions" +] diff --git a/dev/.files/bin/updater/data/package.json/updates.json b/dev/.files/bin/updater/data/package.json/updates.json index 5d26f135..0b39e853 100644 --- a/dev/.files/bin/updater/data/package.json/updates.json +++ b/dev/.files/bin/updater/data/package.json/updates.json @@ -1,36 +1,74 @@ { - "$unset": ["typings", "scripts"], - "$set": { + "$ꓺdefault": { + "private": true, + "publishConfigꓺaccess": "restricted", + + "version": "1.0.0", + "license": "GPL-3.0-or-later", + "name": "@clevercanyon/project", + "description": "Another great project by Clever Canyon.", + "repository": "https://github.com/clevercanyon/project", + "homepage": "https://github.com/clevercanyon/project#readme", + "bugs": "https://github.com/clevercanyon/project/issues", + "funding": "https://github.com/sponsors/clevercanyon", + "keywords": ["clevercanyon"], + "author": { "name": "Clever Canyon", "url": "https://clevercanyon.com" }, + "contributors": [], + + "type": "module", + "files": [], + "bin": {}, + "imports": {}, + "exports": null, + "sideEffects": [], + "module": "", + "main": "", + "browser": "", + "unpkg": "", + "types": "", + "typesVersions": {}, + + "dependencies": {}, + "peerDependencies": {}, + "peerDependenciesMeta": {}, + "optionalDependencies": {}, + "bundleDependencies": [], + "devDependencies": {}, + "devDependenciesꓺ@clevercanyon/skeleton-dev-deps": "*", + + "overrides": {}, + "workspaces": [], + + "cpu": [], + "os": [], + "engines": {}, + + "configꓺc10nꓺ&ꓺdotfilesꓺlock": [], + + "configꓺc10nꓺ&ꓺbuildꓺappType": "cma", + "configꓺc10nꓺ&ꓺbuildꓺtargetEnv": "any", + + "configꓺc10nꓺ&ꓺgithubꓺteams": {}, + "configꓺc10nꓺ&ꓺgithubꓺlabels": {}, + + "configꓺc10nꓺ&ꓺgithubꓺconfigVersion": "", + "configꓺc10nꓺ&ꓺgithubꓺenvsVersion": "", + "configꓺc10nꓺ&ꓺnpmjsꓺconfigVersions": "" + }, + "$set": { "funding": "https://github.com/sponsors/clevercanyon", + "workspaces": [], "cpu": ["x64", "arm64"], "os": ["darwin", "linux"], "engines": { "node": "^19.2.0 || ^19.4.0", "npm": "^8.19.3 || ^9.2.0" - }, - "workspaces": [] - }, - "devDependencies": { - "$set": { - "@clevercanyon/skeleton-dev-deps": "^1.0.0" } }, - "config": { - "c10n": { - "&": { - "dotfiles": {}, - "build": {}, - "github": { - "teams": {}, - "labels": {} - }, - "npmjs": {} - } - } - } + "$unset": ["typings", "scripts"] } diff --git a/dev/.files/bin/updater/index.js b/dev/.files/bin/updater/index.mjs similarity index 68% rename from dev/.files/bin/updater/index.js rename to dev/.files/bin/updater/index.mjs index 529bad61..dba61e94 100644 --- a/dev/.files/bin/updater/index.js +++ b/dev/.files/bin/updater/index.mjs @@ -11,27 +11,45 @@ import _ from 'lodash'; import fs from 'node:fs'; import path from 'node:path'; -import fsp from 'node:fs/promises'; - import { dirname } from 'desm'; -import { globbyStream } from 'globby'; +import fsp from 'node:fs/promises'; import chalk from 'chalk'; +import deeps from 'deeps'; import mc from 'merge-change'; import prettier from 'prettier'; import spawn from 'spawn-please'; -import customRegexp from './data/custom-regexp.js'; -import coreProjects from '../includes/core-projects.js'; +import customRegexp from './data/custom-regexp.mjs'; const { log } = console; // Shorter reference. -export default async ({ projDir, args }) => { +mc.addOperation('$default', (current, defaults) => { + const paths = Object.keys(defaults); + + for (const path of paths) { + if (undefined === deeps.get(current, path, '.')) { + deeps.set(current, path, defaults[path], true, '.'); + } + } + return paths.length > 0; +}); +mc.addOperation('$ꓺdefault', (current, defaults) => { + const paths = Object.keys(defaults); + + for (const path of paths) { + if (undefined === deeps.get(current, path, 'ꓺ')) { + deeps.set(current, path, defaults[path], true, 'ꓺ'); + } + } + return paths.length > 0; +}); + +export default async ({ projDir }) => { /** * Initializes vars. */ const __dirname = dirname(import.meta.url); - const projsDir = path.dirname(projDir); // One level up. const skeletonDir = path.resolve(__dirname, '../../../..'); /** @@ -42,7 +60,7 @@ export default async ({ projDir, args }) => { * @returns {string} Escaped string. */ const escRegExp = (str) => { - return str.replace(/[.*+?^${}()|[\]\\-]/gu, '\\$&'); + return str.replace(/[.*+?^${}()|[\]\\]/gu, '\\$&'); }; /** @@ -111,9 +129,9 @@ export default async ({ projDir, args }) => { await fsp.mkdir(path.resolve(projDir, relPath), { recursive: true }); await fsp.cp(path.resolve(skeletonDir, relPath), path.resolve(projDir, relPath), { recursive: true }); } - await fsp.chmod(path.resolve(projDir, './dev/.files/bin/envs.js'), 0o700); - await fsp.chmod(path.resolve(projDir, './dev/.files/bin/install.js'), 0o700); - await fsp.chmod(path.resolve(projDir, './dev/.files/bin/update.js'), 0o700); + await fsp.chmod(path.resolve(projDir, './dev/.files/bin/envs.mjs'), 0o700); + await fsp.chmod(path.resolve(projDir, './dev/.files/bin/install.mjs'), 0o700); + await fsp.chmod(path.resolve(projDir, './dev/.files/bin/update.mjs'), 0o700); /** * Updates semi-immutable dotfiles. @@ -125,6 +143,7 @@ export default async ({ projDir, args }) => { './.eslintrc.cjs', './.gitattributes', './.gitignore', + './.madrun.mjs', './.npmignore', './.npmrc', './.postcssrc.cjs', @@ -134,7 +153,7 @@ export default async ({ projDir, args }) => { './.stylelintrc.cjs', './.tailwindrc.cjs', './tsconfig.json', - './vite.config.js', + './vite.config.mjs', './wrangler.toml', ]) { if (await isLocked(relPath)) { @@ -152,29 +171,6 @@ export default async ({ projDir, args }) => { } await fsp.mkdir(path.dirname(path.resolve(projDir, relPath)), { recursive: true }); await fsp.writeFile(path.resolve(projDir, relPath), newFileContents); - - if (args.skeletonUpdatesOthers && (await isPkgRepo('clevercanyon/skeleton')) && coreProjects.updates.skeletonOthers.files.includes(relPath)) { - const otherGlobs = coreProjects.updates.skeletonOthers.globs; // The “others” we'll update. - const globStream = globbyStream(otherGlobs, { expandDirectories: false, onlyDirectories: true, absolute: true, cwd: projsDir, dot: false }); - - for await (const projDir of globStream) { - if (!fs.existsSync(path.resolve(projDir, './package.json'))) { - continue; // False positive. No `package.json` file. - } - let newFileContents = ''; // Initialize. - - if (fs.existsSync(path.resolve(projDir, relPath))) { - const oldFileContents = (await fsp.readFile(path.resolve(projDir, relPath))).toString(); - const oldFileMatches = customRegexp.exec(oldFileContents); // See: `./data/custom-regexp.js`. - const oldFileCustomCode = oldFileMatches ? oldFileMatches[2] : ''; // We'll preserve any custom code. - newFileContents = (await fsp.readFile(path.resolve(skeletonDir, relPath))).toString().replace(customRegexp, ($_, $1, $2, $3) => $1 + oldFileCustomCode + $3); - } else { - newFileContents = (await fsp.readFile(path.resolve(skeletonDir, relPath))).toString(); - } - await fsp.mkdir(path.dirname(path.resolve(projDir, relPath)), { recursive: true }); - await fsp.writeFile(path.resolve(projDir, relPath), newFileContents); - } - } } /** @@ -204,8 +200,9 @@ export default async ({ projDir, args }) => { if (!fs.existsSync(path.resolve(projDir, relPath))) { await fsp.cp(path.resolve(skeletonDir, relPath), path.resolve(projDir, relPath)); } - const json = JSON.parse((await fsp.readFile(path.resolve(projDir, relPath))).toString()); + let json = JSON.parse((await fsp.readFile(path.resolve(projDir, relPath))).toString()); const jsonUpdatesFile = path.resolve(skeletonDir, './dev/.files/bin/updater/data', relPath, './updates.json'); + const jsonSortOrderFile = path.resolve(skeletonDir, './dev/.files/bin/updater/data', relPath, './sort-order.json'); if (typeof json !== 'object') { throw new Error('updater: Unable to parse `' + relPath + '`.'); @@ -216,7 +213,30 @@ export default async ({ projDir, args }) => { if (typeof jsonUpdates !== 'object') { throw new Error('updater: Unable to parse `' + jsonUpdatesFile + '`.'); } - mc.patch(json, jsonUpdates); // Merges potentially declarative ops. + if ('./package.json' === relPath && (await isPkgRepo('clevercanyon/skeleton-dev-deps'))) { + if (jsonUpdates.$ꓺdefault?.['devDependenciesꓺ@clevercanyon/skeleton-dev-deps']) { + delete jsonUpdates.$ꓺdefault['devDependenciesꓺ@clevercanyon/skeleton-dev-deps']; + } + } + mc.patch(json, jsonUpdates); // Potentially declarative ops. + const prettierCfg = { ...(await prettier.resolveConfig(path.resolve(projDir, relPath))), parser: 'json' }; + await fsp.writeFile(path.resolve(projDir, relPath), prettier.format(JSON.stringify(json, null, 4), prettierCfg)); + } + if (fs.existsSync(jsonSortOrderFile)) { + const origJSON = _.cloneDeep(json); // Deep clone. + json = {}; // Sorted JSON file; i.e., using insertion order. + const jsonSortOrder = JSON.parse((await fsp.readFile(jsonSortOrderFile)).toString()); + + if (!Array.isArray(jsonSortOrder)) { + throw new Error('updater: Unable to parse `' + jsonSortOrderFile + '`.'); + } + for (const path of jsonSortOrder) { + const value = deeps.get(origJSON, path, 'ꓺ'); + if (undefined !== value) deeps.set(json, path, value, true, 'ꓺ'); + } + for (const [path, value] of Object.entries(deeps.flatten(origJSON, 'ꓺ'))) { + if (undefined === deeps.get(json, path, 'ꓺ')) deeps.set(json, path, value, true, 'ꓺ'); + } const prettierCfg = { ...(await prettier.resolveConfig(path.resolve(projDir, relPath))), parser: 'json' }; await fsp.writeFile(path.resolve(projDir, relPath), prettier.format(JSON.stringify(json, null, 4), prettierCfg)); } @@ -225,6 +245,8 @@ export default async ({ projDir, args }) => { /** * Updates `@clevercanyon/skeleton-dev-deps` in project dir. */ - log(chalk.green('Updating project to latest `@clevercanyon/skeleton-dev-deps`.')); - await spawn('npm', ['udpate', '@clevercanyon/skeleton-dev-deps', '--silent'], { cwd: projDir }); + if (!(await isPkgRepo('clevercanyon/skeleton-dev-deps'))) { + log(chalk.green('Updating project to latest `@clevercanyon/skeleton-dev-deps`.')); + await spawn('npm', ['udpate', '@clevercanyon/skeleton-dev-deps', '--silent'], { cwd: projDir }); + } }; diff --git a/dev/.files/docs/build-info/core-projects.md b/dev/.files/docs/build-info/core-projects.md index c3cceb94..c65a4606 100644 --- a/dev/.files/docs/build-info/core-projects.md +++ b/dev/.files/docs/build-info/core-projects.md @@ -10,10 +10,7 @@ Open `./dev/.files/bin/includes/core-projects.js` and change these. { updates: { ignore: [], - order: [], - skeletonOthers: { - globs: [], - } + order: [] } } ``` diff --git a/dev/.files/madrun/config.js b/dev/.files/madrun/config.mjs similarity index 51% rename from dev/.files/madrun/config.js rename to dev/.files/madrun/config.mjs index 326439e0..96c77f75 100644 --- a/dev/.files/madrun/config.js +++ b/dev/.files/madrun/config.mjs @@ -16,13 +16,13 @@ const __dirname = dirname(import.meta.url); const projDir = path.resolve(__dirname, '../../..'); export default { - 'envs': async () => ['./dev/.files/bin/envs.js {{@}}'], - 'envs:push': async () => ['./dev/.files/bin/envs.js push {{@}}'], - 'envs:pull': async () => ['./dev/.files/bin/envs.js pull {{@}}'], - 'envs:keys': async () => ['./dev/.files/bin/envs.js keys {{@}}'], - 'envs:encrypt': async () => ['./dev/.files/bin/envs.js encrypt {{@}}'], - 'envs:decrypt': async () => ['./dev/.files/bin/envs.js decrypt {{@}}'], - 'envs:install': async () => ['./dev/.files/bin/envs.js install {{@}}'], + 'envs': async () => ['./dev/.files/bin/envs.mjs {{@}}'], + 'envs:push': async () => ['./dev/.files/bin/envs.mjs push {{@}}'], + 'envs:pull': async () => ['./dev/.files/bin/envs.mjs pull {{@}}'], + 'envs:keys': async () => ['./dev/.files/bin/envs.mjs keys {{@}}'], + 'envs:encrypt': async () => ['./dev/.files/bin/envs.mjs encrypt {{@}}'], + 'envs:decrypt': async () => ['./dev/.files/bin/envs.mjs decrypt {{@}}'], + 'envs:install': async () => ['./dev/.files/bin/envs.mjs install {{@}}'], 'dev': async (args) => ['npx vite dev' + (args.mode ? '' : ' --mode=dev') + ' {{@}}'], 'preview': async (args) => ['npx vite preview' + (args.mode ? '' : ' --mode=dev') + ' {{@}}'], @@ -30,25 +30,25 @@ export default { 'install': async () => { if (fs.existsSync(path.resolve(projDir, './node_modules'))) { - return ['./dev/.files/bin/install.js {{@}}']; + return ['./dev/.files/bin/install.mjs {{@}}']; } - return ['npm ci', './dev/.files/bin/install.js {{@}}']; + return ['npm ci', './dev/.files/bin/install.mjs {{@}}']; }, 'install:project': async () => { if (fs.existsSync(path.resolve(projDir, './node_modules'))) { - return ['./dev/.files/bin/install.js project {{@}}']; + return ['./dev/.files/bin/install.mjs project {{@}}']; } - return ['npm ci', './dev/.files/bin/install.js project {{@}}']; + return ['npm ci', './dev/.files/bin/install.mjs project {{@}}']; }, - 'update': async () => ['./dev/.files/bin/update.js {{@}}'], - 'update:dotfiles': async () => ['./dev/.files/bin/update.js dotfiles {{@}}'], + 'update': async () => ['./dev/.files/bin/update.mjs {{@}}'], + 'update:dotfiles': async () => ['./dev/.files/bin/update.mjs dotfiles {{@}}'], 'update:project': async (args) => { if (args.h || args.v || args.help || args.version) { - return './dev/.files/bin/update.js project {{@}}'; + return './dev/.files/bin/update.mjs project {{@}}'; } - return ['./dev/.files/bin/update.js dotfiles {{--dryRun}}', './dev/.files/bin/update.js project {{@}}']; + return ['./dev/.files/bin/update.mjs dotfiles {{--dryRun}}', './dev/.files/bin/update.mjs project {{@}}']; }, - 'update:projects': async () => ['./dev/.files/bin/update.js projects {{@}}'], + 'update:projects': async () => ['./dev/.files/bin/update.mjs projects {{@}}'], 'wrangler': async () => ['CLOUDFLARE_API_TOKEN="${USER_CLOUDFLARE_TOKEN}" npx wrangler {{@}}'], }; diff --git a/dev/.files/vite/config.js b/dev/.files/vite/config.mjs similarity index 85% rename from dev/.files/vite/config.js rename to dev/.files/vite/config.mjs index bd55b9dc..ff1cfe2b 100644 --- a/dev/.files/vite/config.js +++ b/dev/.files/vite/config.mjs @@ -12,6 +12,7 @@ /* eslint-env es2021, node */ import _ from 'lodash'; +import mc from 'merge-change'; import fs from 'node:fs'; import path from 'node:path'; @@ -22,16 +23,13 @@ import archiver from 'archiver'; import mm from 'micromatch'; import { globby } from 'globby'; -import mc from 'merge-change'; -import prettier from 'prettier'; -import spawn from 'spawn-please'; - import { loadEnv } from 'vite'; import pluginBasicSSL from '@vitejs/plugin-basic-ssl'; import { ViteEjsPlugin as pluginEJS } from 'vite-plugin-ejs'; import { ViteMinifyPlugin as pluginMinifyHTML } from 'vite-plugin-minify'; -import importAliases from './includes/aliases.js'; +import u from '../bin/includes/utilities.mjs'; +import importAliases from './includes/aliases.mjs'; import { createRequire } from 'node:module'; const require = createRequire(import.meta.url); @@ -60,9 +58,7 @@ export default async ({ mode, command /*, ssrBuild */ }) => { /** * Package-related vars. */ - const pkgFile = path.resolve(projDir, './package.json'); - const pkg = JSON.parse((await fsp.readFile(pkgFile)).toString()); - const pkgPrettierCfg = { ...(await prettier.resolveConfig(pkgFile)), parser: 'json' }; + const pkg = await u.pkg(); // Parses current `./package.json` file. /** * Mode-related vars. @@ -129,37 +125,37 @@ export default async ({ mode, command /*, ssrBuild */ }) => { } /** - * Prepares `package.json` property updates. + * Prepares `package.json` build-related properties. */ - const origPkg = { ...pkg }; + const pkgProps = {}; // Initialize. - pkg.type = 'module'; // ES module. - pkg.files = ['/dist']; // Dist directory only. - pkg.exports = {}; // Exports object initialization. - pkg.sideEffects = ['./src/*.{html,scss,css,tsx,ts,jsx,mjs,js}']; + pkgProps.type = 'module'; // ES module, always. + pkgProps.files = ['/dist']; // Dist directory only. + pkgProps.exports = {}; // Exports object initialization. + pkgProps.sideEffects = ['./src/*.{html,scss,css,tsx,ts,jsx,mjs,js}']; if (isCMA && (isSSR || cmaEntries.length > 1)) { - mc.patch(pkg.exports, { + pkgProps.exports = { '.': { import: './dist/' + cmaEntryIndexSubpathNoExt + '.js', require: './dist/' + cmaEntryIndexSubpathNoExt + '.cjs', types: './dist/types/' + cmaEntryIndexSubpathNoExt + '.d.ts', }, - }); - pkg.module = './dist/' + cmaEntryIndexSubpathNoExt + '.js'; - pkg.main = './dist/' + cmaEntryIndexSubpathNoExt + '.cjs'; + }; + pkgProps.module = './dist/' + cmaEntryIndexSubpathNoExt + '.js'; + pkgProps.main = './dist/' + cmaEntryIndexSubpathNoExt + '.cjs'; - pkg.browser = isWeb ? pkg.module : ''; - pkg.unpkg = pkg.module; + pkgProps.browser = isWeb ? pkgProps.module : ''; + pkgProps.unpkg = pkgProps.module; - pkg.types = './dist/types/' + cmaEntryIndexSubpathNoExt + '.d.ts'; - pkg.typesVersions = { '>=3.1': { './*': ['./dist/types/*'] } }; + pkgProps.types = './dist/types/' + cmaEntryIndexSubpathNoExt + '.d.ts'; + pkgProps.typesVersions = { '>=3.1': { './*': ['./dist/types/*'] } }; for (const cmaEntrySubPathNoExt of cmaEntriesSubpathsNoExt) { if (cmaEntrySubPathNoExt === cmaEntryIndexSubpathNoExt) { continue; // Don't remap the entry index. } - mc.patch(pkg.exports, { + mc.patch(pkgProps.exports, { ['./' + cmaEntrySubPathNoExt]: { import: './dist/' + cmaEntrySubPathNoExt + '.js', require: './dist/' + cmaEntrySubPathNoExt + '.cjs', @@ -168,31 +164,31 @@ export default async ({ mode, command /*, ssrBuild */ }) => { }); } } else if (isCMA) { - mc.patch(pkg.exports, { + pkgProps.exports = { '.': { import: './dist/' + cmaEntryIndexSubpathNoExt + '.js', require: './dist/' + cmaEntryIndexSubpathNoExt + '.umd.cjs', types: './dist/types/' + cmaEntryIndexSubpathNoExt + '.d.ts', }, - }); - pkg.module = './dist/' + cmaEntryIndexSubpathNoExt + '.js'; - pkg.main = './dist/' + cmaEntryIndexSubpathNoExt + '.umd.cjs'; + }; + pkgProps.module = './dist/' + cmaEntryIndexSubpathNoExt + '.js'; + pkgProps.main = './dist/' + cmaEntryIndexSubpathNoExt + '.umd.cjs'; - pkg.browser = isWeb ? pkg.main : ''; - pkg.unpkg = pkg.main; + pkgProps.browser = isWeb ? pkgProps.main : ''; + pkgProps.unpkg = pkgProps.main; - pkg.types = './dist/types/' + cmaEntryIndexSubpathNoExt + '.d.ts'; - pkg.typesVersions = { '>=3.1': { './*': ['./dist/types/*'] } }; + pkgProps.types = './dist/types/' + cmaEntryIndexSubpathNoExt + '.d.ts'; + pkgProps.typesVersions = { '>=3.1': { './*': ['./dist/types/*'] } }; } else { - (pkg.type = 'module'), (pkg.module = pkg.main = pkg.browser = pkg.unpkg = pkg.types = ''); - (pkg.files = []), (pkg.exports = []), (pkg.sideEffects = []), (pkg.typesVersions = {}); + pkgProps.type = 'module'; // Always a module when building with Vite. + pkgProps.module = pkgProps.main = pkgProps.browser = pkgProps.unpkg = pkgProps.types = ''; + (pkgProps.exports = null), (pkgProps.files = pkgProps.sideEffects = []), (pkgProps.typesVersions = {}); } /** - * Updates `package.json` properties impacting builds. + * Pre-updates `package.json` properties impacting build process. */ - const preBuildPkg = { ...origPkg, type: pkg.type, sideEffects: pkg.sideEffects }; - await fsp.writeFile(pkgFile, prettier.format(JSON.stringify(preBuildPkg, null, 4), pkgPrettierCfg)); + await u.updatePkg({ type: pkgProps.type, sideEffects: pkgProps.sideEffects }); /** * Configures plugins for Vite. @@ -238,6 +234,11 @@ export default async ({ mode, command /*, ssrBuild */ }) => { if (postProcessed) return; postProcessed = true; + /** + * Updates `package.json` build-related properties. + */ + await u.updatePkg(pkgProps); // Also sorts and runs prettier. + /** * Copies `./.env.vault` to dist directory. */ @@ -245,16 +246,11 @@ export default async ({ mode, command /*, ssrBuild */ }) => { await fsp.copyFile(path.resolve(projDir, './.env.vault'), path.resolve(distDir, './.env.vault')); } - /** - * Writes prepared `package.json` property updates. - */ - await fsp.writeFile(pkgFile, prettier.format(JSON.stringify(pkg, null, 4), pkgPrettierCfg)); - /** * Generates typescript type declaration file(s). */ if ('build' === command) { - await spawn('npx', ['tsc', '--emitDeclarationOnly'], { cwd: projDir }); + await u.spawn('npx', ['tsc', '--emitDeclarationOnly']); } /** @@ -305,7 +301,7 @@ export default async ({ mode, command /*, ssrBuild */ }) => { * @see https://vitejs.dev/config/ */ const baseConfig = { - c10n: { pkg }, + c10n: { pkg, pkgProps }, define: { // Static replacements. $$__APP_PKG_NAME__$$: pkg.name || '', diff --git a/dev/.files/vite/includes/aliases.js b/dev/.files/vite/includes/aliases.mjs similarity index 100% rename from dev/.files/vite/includes/aliases.js rename to dev/.files/vite/includes/aliases.mjs diff --git a/package-lock.json b/package-lock.json index 8cd92b80..708bc1f4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@clevercanyon/utilities", - "version": "1.0.76", + "version": "1.0.77", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@clevercanyon/utilities", - "version": "1.0.76", + "version": "1.0.77", "cpu": [ "x64", "arm64" @@ -17,7 +17,7 @@ "linux" ], "devDependencies": { - "@clevercanyon/skeleton-dev-deps": "^1.0.87", + "@clevercanyon/skeleton-dev-deps": "^1.0.99", "@cloudflare/workers-types": "^4.20230115.0", "@types/crypto-js": "^4.1.1", "@types/locutus": "^0.0.6", @@ -39,7 +39,7 @@ "ignore": "^5.2.4", "locutus": "^2.0.16", "lodash": "^4.17.21", - "micromatch": "npm:@clevercanyon/micromatch.fork@^4.0.10", + "micromatch": "npm:@clevercanyon/micromatch.fork@^4.0.15", "react": "^18.2.0", "react-dom": "^18.2.0" } @@ -163,9 +163,9 @@ } }, "node_modules/@clevercanyon/madrun": { - "version": "1.0.23", - "resolved": "https://registry.npmjs.org/@clevercanyon/madrun/-/madrun-1.0.23.tgz", - "integrity": "sha512-t10Z1QIBqxVB3OgY6ZTEoLQXyAnseylpWONqZbSJS4dB6p4sWXcIkHeWzVhKAmXfAZzbEnCZwH9+iNXrq0581w==", + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/@clevercanyon/madrun/-/madrun-1.0.26.tgz", + "integrity": "sha512-awNZlzwLbqSopBzzEE5T3W5yYGJp1unQwC/q8li78Pnh3+TkcAQvqbBKDEW64HXqKya9rIuyWW0XRrxq1eraQQ==", "cpu": [ "x64", "arm64" @@ -181,8 +181,8 @@ "desm": "^1.3.0", "find-up": "^6.3.0", "lodash": "^4.17.21", - "shescape": "npm:@clevercanyon/shescape.fork@^1.6.5", - "spawn-please": "npm:@clevercanyon/spawn-please.fork@^2.0.2", + "shescape": "npm:@clevercanyon/shescape.fork@^1.6.6", + "spawn-please": "npm:@clevercanyon/spawn-please.fork@^2.0.4", "yargs": "^17.6.2" }, "bin": { @@ -197,13 +197,21 @@ } }, "node_modules/@clevercanyon/skeleton-dev-deps": { - "version": "1.0.87", - "resolved": "https://registry.npmjs.org/@clevercanyon/skeleton-dev-deps/-/skeleton-dev-deps-1.0.87.tgz", - "integrity": "sha512-F4SE1bTRhp49/c0ASYqkrywbz5SWhslDexiVPC+KHejhzHDi8jAQYr41NGNHwGmez8K6ys0GHzqNoribEEPcIw==", + "version": "1.0.99", + "resolved": "https://registry.npmjs.org/@clevercanyon/skeleton-dev-deps/-/skeleton-dev-deps-1.0.99.tgz", + "integrity": "sha512-AGwam+DHwhObS8N+LWjz4MFI5r/wptAHL1Wzf3oRpSTzeRuuiyhFtlx/i9y5V9CeSj9OL21vfRb33HmVzPXGsQ==", + "cpu": [ + "x64", + "arm64" + ], "dev": true, + "os": [ + "darwin", + "linux" + ], "dependencies": { - "@clevercanyon/madrun": "^1.0.23", - "@clevercanyon/split-cmd.fork": "^1.0.7", + "@clevercanyon/madrun": "^1.0.25", + "@clevercanyon/split-cmd.fork": "^1.0.10", "@octokit/core": "^4.2.0", "@octokit/plugin-paginate-rest": "^5.0.1", "@prettier/plugin-php": "^0.19.3", @@ -221,6 +229,7 @@ "archiver": "^5.3.1", "boxen": "^7.0.1", "chalk": "^5.2.0", + "deeps": "^1.4.5", "desm": "^1.3.0", "dotenv": "^16.0.3", "dotenv-vault": "^1.17.0", @@ -238,8 +247,8 @@ "install": "^0.13.0", "libsodium-wrappers": "^0.7.10", "lodash": "^4.17.21", - "merge-change": "npm:@clevercanyon/merge-change.fork@^1.8.15", - "micromatch": "npm:@clevercanyon/micromatch.fork@^4.0.10", + "merge-change": "npm:@clevercanyon/merge-change.fork@^1.8.17", + "micromatch": "npm:@clevercanyon/micromatch.fork@^4.0.14", "postcss": "^8.4.21", "postcss-preset-env": "^7.8.3", "postcss-safe-parser": "^6.0.0", @@ -253,8 +262,8 @@ "sass": "^1.57.1", "semver": "^7.3.8", "shellcheck": "^1.1.0", - "shescape": "npm:@clevercanyon/shescape.fork@^1.6.5", - "spawn-please": "npm:@clevercanyon/spawn-please.fork@^2.0.2", + "shescape": "npm:@clevercanyon/shescape.fork@^1.6.6", + "spawn-please": "npm:@clevercanyon/spawn-please.fork@^2.0.4", "stylelint": "^14.16.1", "stylelint-config-prettier": "^9.0.4", "stylelint-config-recess-order": "^3.1.0", @@ -268,15 +277,31 @@ "vite-plugin-minify": "^1.5.2", "yargs": "^17.6.2" }, + "engines": { + "node": "^19.2.0 || ^19.4.0", + "npm": "^8.19.3 || ^9.2.0" + }, "funding": { "url": "https://github.com/sponsors/clevercanyon" } }, "node_modules/@clevercanyon/split-cmd.fork": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@clevercanyon/split-cmd.fork/-/split-cmd.fork-1.0.7.tgz", - "integrity": "sha512-SmgMUk5qO6Zi+GjybrSWvr+29px0Kh3W45HQJRNzYE/vUzNnjDdFI+GaaB5U78khweWs8ZdRCFaRyePY9cOm4w==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@clevercanyon/split-cmd.fork/-/split-cmd.fork-1.0.11.tgz", + "integrity": "sha512-BjZTjyEBTN9r2oYmSG4sl3+r+84LhVLmABkeeLYcFe4+AlpkZ0Vl4KOgDw0oZHyhbm8eas0iAXtTSkZSqsLUuQ==", + "cpu": [ + "x64", + "arm64" + ], "dev": true, + "os": [ + "darwin", + "linux" + ], + "engines": { + "node": "^19.2.0 || ^19.4.0", + "npm": "^8.19.3 || ^9.2.0" + }, "funding": { "url": "https://github.com/sponsors/clevercanyon" } @@ -1295,9 +1320,9 @@ } }, "node_modules/@oclif/plugin-help/node_modules/@oclif/core": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.0.6.tgz", - "integrity": "sha512-AOgr1bBjjAyCWcaaai1z7kBULg2zodCuubnmoU7mge2IL/hh2E6F2jdI7wpPK6KI7gVqZq0PKGxsl4EOFsrErQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.0.7.tgz", + "integrity": "sha512-pj7hIH8SBeH3qha47fmyqdaBdNVEqesRgnKFh8Ytdb4S41/4BYOiQuyQGuvnKgvicH6DMxp4FbM9EQEW46V9xw==", "dev": true, "dependencies": { "@types/cli-progress": "^3.11.0", @@ -1455,9 +1480,9 @@ } }, "node_modules/@oclif/plugin-not-found/node_modules/@oclif/core": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.0.6.tgz", - "integrity": "sha512-AOgr1bBjjAyCWcaaai1z7kBULg2zodCuubnmoU7mge2IL/hh2E6F2jdI7wpPK6KI7gVqZq0PKGxsl4EOFsrErQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.0.7.tgz", + "integrity": "sha512-pj7hIH8SBeH3qha47fmyqdaBdNVEqesRgnKFh8Ytdb4S41/4BYOiQuyQGuvnKgvicH6DMxp4FbM9EQEW46V9xw==", "dev": true, "dependencies": { "@types/cli-progress": "^3.11.0", @@ -1623,9 +1648,9 @@ } }, "node_modules/@oclif/plugin-update/node_modules/@oclif/core": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.0.6.tgz", - "integrity": "sha512-AOgr1bBjjAyCWcaaai1z7kBULg2zodCuubnmoU7mge2IL/hh2E6F2jdI7wpPK6KI7gVqZq0PKGxsl4EOFsrErQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.0.7.tgz", + "integrity": "sha512-pj7hIH8SBeH3qha47fmyqdaBdNVEqesRgnKFh8Ytdb4S41/4BYOiQuyQGuvnKgvicH6DMxp4FbM9EQEW46V9xw==", "dev": true, "dependencies": { "@types/cli-progress": "^3.11.0", @@ -1786,9 +1811,9 @@ } }, "node_modules/@oclif/plugin-warn-if-update-available/node_modules/@oclif/core": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.0.6.tgz", - "integrity": "sha512-AOgr1bBjjAyCWcaaai1z7kBULg2zodCuubnmoU7mge2IL/hh2E6F2jdI7wpPK6KI7gVqZq0PKGxsl4EOFsrErQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.0.7.tgz", + "integrity": "sha512-pj7hIH8SBeH3qha47fmyqdaBdNVEqesRgnKFh8Ytdb4S41/4BYOiQuyQGuvnKgvicH6DMxp4FbM9EQEW46V9xw==", "dev": true, "dependencies": { "@types/cli-progress": "^3.11.0", @@ -3129,11 +3154,23 @@ }, "node_modules/braces": { "name": "@clevercanyon/braces.fork", - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@clevercanyon/braces.fork/-/braces.fork-3.0.7.tgz", - "integrity": "sha512-XVaG3eRrKZfiulU0kqoksvJvS/C0Cxb3HlQ450YVd3ggtBIjl8Skyg3VOmWrHIBZjLUYtJqVf+vJD5k9gv2ETA==", + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/@clevercanyon/braces.fork/-/braces.fork-3.0.11.tgz", + "integrity": "sha512-bnyeS6FzXqG2D44pC9GCLxeM5+lhcnzEzTmCBsFgnSyNHRdhW1AkCZzf4khg8Vsf6PfEgaMfZ+2ZuIflVhIUcg==", + "cpu": [ + "x64", + "arm64" + ], + "os": [ + "darwin", + "linux" + ], "dependencies": { - "fill-range": "npm:@clevercanyon/fill-range.fork@^7.0.1" + "fill-range": "npm:@clevercanyon/fill-range.fork@^7.0.10" + }, + "engines": { + "node": "^19.2.0 || ^19.4.0", + "npm": "^8.19.3 || ^9.2.0" }, "funding": { "url": "https://github.com/sponsors/clevercanyon" @@ -3927,6 +3964,15 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "node_modules/deeps": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/deeps/-/deeps-1.4.5.tgz", + "integrity": "sha512-sLkOeUZJX5Zj9aILXUWyUn2YLrKDJLgRmm5tZVTmIdh43L/6UknpzaRAFItKg9LMS+3hu6y8QAxEYavBLTzEuQ==", + "dev": true, + "engines": { + "node": ">=0.10" + } + }, "node_modules/defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -5196,11 +5242,23 @@ }, "node_modules/fill-range": { "name": "@clevercanyon/fill-range.fork", - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/@clevercanyon/fill-range.fork/-/fill-range.fork-7.0.6.tgz", - "integrity": "sha512-7R2PmtuaOk9XArg+VFGHcIT5WwruizmCanvQPKo0Ewbgk9tUghxi1MxR+0CaSf65Lo+GQQE82UyIR3fVDYZkBA==", + "version": "7.0.10", + "resolved": "https://registry.npmjs.org/@clevercanyon/fill-range.fork/-/fill-range.fork-7.0.10.tgz", + "integrity": "sha512-DHGBICP8nP7mQnH0pxt6E1glPeEXU7r5s3ajmA7aHJtCCjDgPCPL5agWPRR43QZ2e5cx+Wbi0sAWkjwl+DU6bQ==", + "cpu": [ + "x64", + "arm64" + ], + "os": [ + "darwin", + "linux" + ], "dependencies": { - "to-regex-range": "npm:@clevercanyon/to-regex-range.fork@^5.0.1" + "to-regex-range": "npm:@clevercanyon/to-regex-range.fork@^5.0.10" + }, + "engines": { + "node": "^19.2.0 || ^19.4.0", + "npm": "^8.19.3 || ^9.2.0" }, "funding": { "url": "https://github.com/sponsors/clevercanyon" @@ -6235,9 +6293,21 @@ }, "node_modules/is-number": { "name": "@clevercanyon/is-number.fork", - "version": "7.0.7", - "resolved": "https://registry.npmjs.org/@clevercanyon/is-number.fork/-/is-number.fork-7.0.7.tgz", - "integrity": "sha512-Yu/UoISlieaA+7UV7PVxc/xDz+S4YAaA5kEmFZvQ6RY3MLov0SeWJIZYg82JdpBCraceA7IQdONDnNnG3L8/Ng==", + "version": "7.0.11", + "resolved": "https://registry.npmjs.org/@clevercanyon/is-number.fork/-/is-number.fork-7.0.11.tgz", + "integrity": "sha512-byic4aCd3NB1GTfPMrS+MEf4PSA88Cl/VbpSPytID1hiVThMuolrIfF+q/esC6k1Jr1U276p6MUHZZHrcGqnrQ==", + "cpu": [ + "x64", + "arm64" + ], + "os": [ + "darwin", + "linux" + ], + "engines": { + "node": "^19.2.0 || ^19.4.0", + "npm": "^8.19.3 || ^9.2.0" + }, "funding": { "url": "https://github.com/sponsors/clevercanyon" } @@ -7064,10 +7134,22 @@ }, "node_modules/merge-change": { "name": "@clevercanyon/merge-change.fork", - "version": "1.8.15", - "resolved": "https://registry.npmjs.org/@clevercanyon/merge-change.fork/-/merge-change.fork-1.8.15.tgz", - "integrity": "sha512-Otr87syXoVEZsahERxDjVayp5b187ifcL+ZHVQZmtHlF5+l0EkAS2FS1H4SaBqKU2fs8dHv+IQsiV+widmWzKQ==", + "version": "1.8.18", + "resolved": "https://registry.npmjs.org/@clevercanyon/merge-change.fork/-/merge-change.fork-1.8.18.tgz", + "integrity": "sha512-cvuWNxB+4Zy6mrzV4p1QZd5CBfVLKZHJIQVUbCj0cUN+dqFYZGK2OhCvHYqo7AhTBWTsWdxv3N2jUuWaOGn5Pw==", + "cpu": [ + "x64", + "arm64" + ], "dev": true, + "os": [ + "darwin", + "linux" + ], + "engines": { + "node": "^19.2.0 || ^19.4.0", + "npm": "^8.19.3 || ^9.2.0" + }, "funding": { "url": "https://github.com/sponsors/clevercanyon" } @@ -7532,12 +7614,24 @@ }, "node_modules/micromatch": { "name": "@clevercanyon/micromatch.fork", - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@clevercanyon/micromatch.fork/-/micromatch.fork-4.0.10.tgz", - "integrity": "sha512-t8CXUdhCBvWEjd0FqddE8NWvPFqqaEwwsoZnPSjO837dTGM3dCcizKje1GgJcZRgX75b13xUaozF9bEHAUY+xw==", + "version": "4.0.15", + "resolved": "https://registry.npmjs.org/@clevercanyon/micromatch.fork/-/micromatch.fork-4.0.15.tgz", + "integrity": "sha512-fIIJPCWlJdW2CAhQiSNpEhKZO+FwchF9TF0cl2A0Hy15JNko2OABgrOMEvnOYDLS0llNG6usgQ4CMIHnoTWnqg==", + "cpu": [ + "x64", + "arm64" + ], + "os": [ + "darwin", + "linux" + ], "dependencies": { - "braces": "npm:@clevercanyon/braces.fork@^3.0.2", - "picomatch": "npm:@clevercanyon/picomatch.fork@^2.3.1" + "braces": "npm:@clevercanyon/braces.fork@^3.0.11", + "picomatch": "npm:@clevercanyon/picomatch.fork@^2.3.10" + }, + "engines": { + "node": "^19.2.0 || ^19.4.0", + "npm": "^8.19.3 || ^9.2.0" }, "funding": { "url": "https://github.com/sponsors/clevercanyon" @@ -8318,9 +8412,21 @@ }, "node_modules/picomatch": { "name": "@clevercanyon/picomatch.fork", - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/@clevercanyon/picomatch.fork/-/picomatch.fork-2.3.6.tgz", - "integrity": "sha512-PwSW62BLJMGLNnKlQBIoCZlBwPFol+cXambBBjKzkJBlZ5XWOR8rgA/KAlHQ5aI5NVMhqT/cjm72FhAkp7T95Q==", + "version": "2.3.10", + "resolved": "https://registry.npmjs.org/@clevercanyon/picomatch.fork/-/picomatch.fork-2.3.10.tgz", + "integrity": "sha512-m31dwVwqn0/cnqH9ixPK7jCEqoDVIK/f/2n50VihxP1g4SmFYfC8jTBKcSW7zjJANrfSxah6LBQJtcuJP4BIYA==", + "cpu": [ + "x64", + "arm64" + ], + "os": [ + "darwin", + "linux" + ], + "engines": { + "node": "^19.2.0 || ^19.4.0", + "npm": "^8.19.3 || ^9.2.0" + }, "funding": { "url": "https://github.com/sponsors/clevercanyon" } @@ -9699,9 +9805,9 @@ "dev": true }, "node_modules/rollup": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.10.1.tgz", - "integrity": "sha512-3Er+yel3bZbZX1g2kjVM+FW+RUWDxbG87fcqFM5/9HbPCTpbVp6JOLn7jlxnNlbu7s/N/uDA4EV/91E2gWnxzw==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.11.0.tgz", + "integrity": "sha512-+uWPPkpWQ2H3Qi7sNBcRfhhHJyUNgBYhG4wKe5wuGRj2m55kpo+0p5jubKNBjQODyPe6tSBE3tNpdDwEisQvAQ==", "dev": true, "bin": { "rollup": "dist/bin/rollup" @@ -9932,12 +10038,24 @@ }, "node_modules/shescape": { "name": "@clevercanyon/shescape.fork", - "version": "1.6.5", - "resolved": "https://registry.npmjs.org/@clevercanyon/shescape.fork/-/shescape.fork-1.6.5.tgz", - "integrity": "sha512-ZF2e/H9oLQEjv18EU2aH92algsdvzg2P3NulnE3PYrQOR2VNYIcdEJ7OBvDi4Fmg0vuh/6kjcU4NzMt2vlSPDA==", + "version": "1.6.7", + "resolved": "https://registry.npmjs.org/@clevercanyon/shescape.fork/-/shescape.fork-1.6.7.tgz", + "integrity": "sha512-w8dJXdD/YohbKaqo8DYycLm7RhkDxphB2M3DIZre084M+zDhFS3HtoQf5iCQ/STx+1k7fpA2v1RhwTww8ySoJg==", + "cpu": [ + "x64", + "arm64" + ], "dev": true, + "os": [ + "darwin", + "linux" + ], "dependencies": { - "which": "^2.0.0" + "which": "^2.0.2" + }, + "engines": { + "node": "^19.2.0 || ^19.4.0", + "npm": "^8.19.3 || ^9.2.0" }, "funding": { "url": "https://github.com/sponsors/clevercanyon" @@ -10022,13 +10140,25 @@ }, "node_modules/spawn-please": { "name": "@clevercanyon/spawn-please.fork", - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@clevercanyon/spawn-please.fork/-/spawn-please.fork-2.0.2.tgz", - "integrity": "sha512-nZcXI0feppLUGJMj1x3NSewQ96Aygj/0UNqSZ4ERnOq3o4O5AOGqgu62Xv0vgnMKBE7JFBN60IzJiyx5nim9nA==", + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@clevercanyon/spawn-please.fork/-/spawn-please.fork-2.0.5.tgz", + "integrity": "sha512-kRT10E384quwqEMKexJ5NAPO5ZP8yg8Bw8dwOv8E6kACvsWnROD6SPjKrHcXnwTsv/BDM7fIW4MXU8vU7nvq8A==", + "cpu": [ + "x64", + "arm64" + ], "dev": true, + "os": [ + "darwin", + "linux" + ], "dependencies": { "cross-spawn": "^7.0.3" }, + "engines": { + "node": "^19.2.0 || ^19.4.0", + "npm": "^8.19.3 || ^9.2.0" + }, "funding": { "url": "https://github.com/sponsors/clevercanyon" } @@ -10831,11 +10961,23 @@ }, "node_modules/to-regex-range": { "name": "@clevercanyon/to-regex-range.fork", - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/@clevercanyon/to-regex-range.fork/-/to-regex-range.fork-5.0.6.tgz", - "integrity": "sha512-+C7clE0FvVmNLOnHcUgOw0ot4XV5F2J01trSUO70oEc8+psUarAdWfmjmClsaAI/PiieyM6pfcqFrimqgdsABQ==", + "version": "5.0.10", + "resolved": "https://registry.npmjs.org/@clevercanyon/to-regex-range.fork/-/to-regex-range.fork-5.0.10.tgz", + "integrity": "sha512-lmLmkW7X8x3sOIoxBWfGA7IKcukcLZCpYId1rJK2+XTriUkolJdzUhJBZQfWaLIRln+EflOcUVQ7JQOo/+IoUA==", + "cpu": [ + "x64", + "arm64" + ], + "os": [ + "darwin", + "linux" + ], "dependencies": { - "is-number": "npm:@clevercanyon/is-number.fork@^7.0.0" + "is-number": "npm:@clevercanyon/is-number.fork@^7.0.11" + }, + "engines": { + "node": "^19.2.0 || ^19.4.0", + "npm": "^8.19.3 || ^9.2.0" }, "funding": { "url": "https://github.com/sponsors/clevercanyon" @@ -10869,9 +11011,9 @@ } }, "node_modules/tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", "dev": true }, "node_modules/tsutils": { @@ -11562,9 +11704,9 @@ } }, "@clevercanyon/madrun": { - "version": "1.0.23", - "resolved": "https://registry.npmjs.org/@clevercanyon/madrun/-/madrun-1.0.23.tgz", - "integrity": "sha512-t10Z1QIBqxVB3OgY6ZTEoLQXyAnseylpWONqZbSJS4dB6p4sWXcIkHeWzVhKAmXfAZzbEnCZwH9+iNXrq0581w==", + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/@clevercanyon/madrun/-/madrun-1.0.26.tgz", + "integrity": "sha512-awNZlzwLbqSopBzzEE5T3W5yYGJp1unQwC/q8li78Pnh3+TkcAQvqbBKDEW64HXqKya9rIuyWW0XRrxq1eraQQ==", "dev": true, "requires": { "boxen": "^7.0.1", @@ -11572,19 +11714,19 @@ "desm": "^1.3.0", "find-up": "^6.3.0", "lodash": "^4.17.21", - "shescape": "npm:@clevercanyon/shescape.fork@^1.6.5", - "spawn-please": "npm:@clevercanyon/spawn-please.fork@^2.0.2", + "shescape": "npm:@clevercanyon/shescape.fork@^1.6.6", + "spawn-please": "npm:@clevercanyon/spawn-please.fork@^2.0.4", "yargs": "^17.6.2" } }, "@clevercanyon/skeleton-dev-deps": { - "version": "1.0.87", - "resolved": "https://registry.npmjs.org/@clevercanyon/skeleton-dev-deps/-/skeleton-dev-deps-1.0.87.tgz", - "integrity": "sha512-F4SE1bTRhp49/c0ASYqkrywbz5SWhslDexiVPC+KHejhzHDi8jAQYr41NGNHwGmez8K6ys0GHzqNoribEEPcIw==", + "version": "1.0.99", + "resolved": "https://registry.npmjs.org/@clevercanyon/skeleton-dev-deps/-/skeleton-dev-deps-1.0.99.tgz", + "integrity": "sha512-AGwam+DHwhObS8N+LWjz4MFI5r/wptAHL1Wzf3oRpSTzeRuuiyhFtlx/i9y5V9CeSj9OL21vfRb33HmVzPXGsQ==", "dev": true, "requires": { - "@clevercanyon/madrun": "^1.0.23", - "@clevercanyon/split-cmd.fork": "^1.0.7", + "@clevercanyon/madrun": "^1.0.25", + "@clevercanyon/split-cmd.fork": "^1.0.10", "@octokit/core": "^4.2.0", "@octokit/plugin-paginate-rest": "^5.0.1", "@prettier/plugin-php": "^0.19.3", @@ -11602,6 +11744,7 @@ "archiver": "^5.3.1", "boxen": "^7.0.1", "chalk": "^5.2.0", + "deeps": "^1.4.5", "desm": "^1.3.0", "dotenv": "^16.0.3", "dotenv-vault": "^1.17.0", @@ -11619,8 +11762,8 @@ "install": "^0.13.0", "libsodium-wrappers": "^0.7.10", "lodash": "^4.17.21", - "merge-change": "npm:@clevercanyon/merge-change.fork@^1.8.15", - "micromatch": "npm:@clevercanyon/micromatch.fork@^4.0.10", + "merge-change": "npm:@clevercanyon/merge-change.fork@^1.8.17", + "micromatch": "npm:@clevercanyon/micromatch.fork@^4.0.14", "postcss": "^8.4.21", "postcss-preset-env": "^7.8.3", "postcss-safe-parser": "^6.0.0", @@ -11634,8 +11777,8 @@ "sass": "^1.57.1", "semver": "^7.3.8", "shellcheck": "^1.1.0", - "shescape": "npm:@clevercanyon/shescape.fork@^1.6.5", - "spawn-please": "npm:@clevercanyon/spawn-please.fork@^2.0.2", + "shescape": "npm:@clevercanyon/shescape.fork@^1.6.6", + "spawn-please": "npm:@clevercanyon/spawn-please.fork@^2.0.4", "stylelint": "^14.16.1", "stylelint-config-prettier": "^9.0.4", "stylelint-config-recess-order": "^3.1.0", @@ -11651,9 +11794,9 @@ } }, "@clevercanyon/split-cmd.fork": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@clevercanyon/split-cmd.fork/-/split-cmd.fork-1.0.7.tgz", - "integrity": "sha512-SmgMUk5qO6Zi+GjybrSWvr+29px0Kh3W45HQJRNzYE/vUzNnjDdFI+GaaB5U78khweWs8ZdRCFaRyePY9cOm4w==", + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/@clevercanyon/split-cmd.fork/-/split-cmd.fork-1.0.11.tgz", + "integrity": "sha512-BjZTjyEBTN9r2oYmSG4sl3+r+84LhVLmABkeeLYcFe4+AlpkZ0Vl4KOgDw0oZHyhbm8eas0iAXtTSkZSqsLUuQ==", "dev": true }, "@cloudflare/workers-types": { @@ -12252,9 +12395,9 @@ }, "dependencies": { "@oclif/core": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.0.6.tgz", - "integrity": "sha512-AOgr1bBjjAyCWcaaai1z7kBULg2zodCuubnmoU7mge2IL/hh2E6F2jdI7wpPK6KI7gVqZq0PKGxsl4EOFsrErQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.0.7.tgz", + "integrity": "sha512-pj7hIH8SBeH3qha47fmyqdaBdNVEqesRgnKFh8Ytdb4S41/4BYOiQuyQGuvnKgvicH6DMxp4FbM9EQEW46V9xw==", "dev": true, "requires": { "@types/cli-progress": "^3.11.0", @@ -12380,9 +12523,9 @@ }, "dependencies": { "@oclif/core": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.0.6.tgz", - "integrity": "sha512-AOgr1bBjjAyCWcaaai1z7kBULg2zodCuubnmoU7mge2IL/hh2E6F2jdI7wpPK6KI7gVqZq0PKGxsl4EOFsrErQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.0.7.tgz", + "integrity": "sha512-pj7hIH8SBeH3qha47fmyqdaBdNVEqesRgnKFh8Ytdb4S41/4BYOiQuyQGuvnKgvicH6DMxp4FbM9EQEW46V9xw==", "dev": true, "requires": { "@types/cli-progress": "^3.11.0", @@ -12516,9 +12659,9 @@ }, "dependencies": { "@oclif/core": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.0.6.tgz", - "integrity": "sha512-AOgr1bBjjAyCWcaaai1z7kBULg2zodCuubnmoU7mge2IL/hh2E6F2jdI7wpPK6KI7gVqZq0PKGxsl4EOFsrErQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.0.7.tgz", + "integrity": "sha512-pj7hIH8SBeH3qha47fmyqdaBdNVEqesRgnKFh8Ytdb4S41/4BYOiQuyQGuvnKgvicH6DMxp4FbM9EQEW46V9xw==", "dev": true, "requires": { "@types/cli-progress": "^3.11.0", @@ -12647,9 +12790,9 @@ }, "dependencies": { "@oclif/core": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.0.6.tgz", - "integrity": "sha512-AOgr1bBjjAyCWcaaai1z7kBULg2zodCuubnmoU7mge2IL/hh2E6F2jdI7wpPK6KI7gVqZq0PKGxsl4EOFsrErQ==", + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/@oclif/core/-/core-2.0.7.tgz", + "integrity": "sha512-pj7hIH8SBeH3qha47fmyqdaBdNVEqesRgnKFh8Ytdb4S41/4BYOiQuyQGuvnKgvicH6DMxp4FbM9EQEW46V9xw==", "dev": true, "requires": { "@types/cli-progress": "^3.11.0", @@ -13686,11 +13829,11 @@ } }, "braces": { - "version": "npm:@clevercanyon/braces.fork@3.0.7", - "resolved": "https://registry.npmjs.org/@clevercanyon/braces.fork/-/braces.fork-3.0.7.tgz", - "integrity": "sha512-XVaG3eRrKZfiulU0kqoksvJvS/C0Cxb3HlQ450YVd3ggtBIjl8Skyg3VOmWrHIBZjLUYtJqVf+vJD5k9gv2ETA==", + "version": "npm:@clevercanyon/braces.fork@3.0.11", + "resolved": "https://registry.npmjs.org/@clevercanyon/braces.fork/-/braces.fork-3.0.11.tgz", + "integrity": "sha512-bnyeS6FzXqG2D44pC9GCLxeM5+lhcnzEzTmCBsFgnSyNHRdhW1AkCZzf4khg8Vsf6PfEgaMfZ+2ZuIflVhIUcg==", "requires": { - "fill-range": "npm:@clevercanyon/fill-range.fork@^7.0.1" + "fill-range": "npm:@clevercanyon/fill-range.fork@^7.0.10" } }, "browserslist": { @@ -14246,6 +14389,12 @@ "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", "dev": true }, + "deeps": { + "version": "1.4.5", + "resolved": "https://registry.npmjs.org/deeps/-/deeps-1.4.5.tgz", + "integrity": "sha512-sLkOeUZJX5Zj9aILXUWyUn2YLrKDJLgRmm5tZVTmIdh43L/6UknpzaRAFItKg9LMS+3hu6y8QAxEYavBLTzEuQ==", + "dev": true + }, "defaults": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.4.tgz", @@ -15220,11 +15369,11 @@ "dev": true }, "fill-range": { - "version": "npm:@clevercanyon/fill-range.fork@7.0.6", - "resolved": "https://registry.npmjs.org/@clevercanyon/fill-range.fork/-/fill-range.fork-7.0.6.tgz", - "integrity": "sha512-7R2PmtuaOk9XArg+VFGHcIT5WwruizmCanvQPKo0Ewbgk9tUghxi1MxR+0CaSf65Lo+GQQE82UyIR3fVDYZkBA==", + "version": "npm:@clevercanyon/fill-range.fork@7.0.10", + "resolved": "https://registry.npmjs.org/@clevercanyon/fill-range.fork/-/fill-range.fork-7.0.10.tgz", + "integrity": "sha512-DHGBICP8nP7mQnH0pxt6E1glPeEXU7r5s3ajmA7aHJtCCjDgPCPL5agWPRR43QZ2e5cx+Wbi0sAWkjwl+DU6bQ==", "requires": { - "to-regex-range": "npm:@clevercanyon/to-regex-range.fork@^5.0.1" + "to-regex-range": "npm:@clevercanyon/to-regex-range.fork@^5.0.10" } }, "find-up": { @@ -15948,9 +16097,9 @@ "dev": true }, "is-number": { - "version": "npm:@clevercanyon/is-number.fork@7.0.7", - "resolved": "https://registry.npmjs.org/@clevercanyon/is-number.fork/-/is-number.fork-7.0.7.tgz", - "integrity": "sha512-Yu/UoISlieaA+7UV7PVxc/xDz+S4YAaA5kEmFZvQ6RY3MLov0SeWJIZYg82JdpBCraceA7IQdONDnNnG3L8/Ng==" + "version": "npm:@clevercanyon/is-number.fork@7.0.11", + "resolved": "https://registry.npmjs.org/@clevercanyon/is-number.fork/-/is-number.fork-7.0.11.tgz", + "integrity": "sha512-byic4aCd3NB1GTfPMrS+MEf4PSA88Cl/VbpSPytID1hiVThMuolrIfF+q/esC6k1Jr1U276p6MUHZZHrcGqnrQ==" }, "is-number-object": { "version": "1.0.7", @@ -16583,9 +16732,9 @@ } }, "merge-change": { - "version": "npm:@clevercanyon/merge-change.fork@1.8.15", - "resolved": "https://registry.npmjs.org/@clevercanyon/merge-change.fork/-/merge-change.fork-1.8.15.tgz", - "integrity": "sha512-Otr87syXoVEZsahERxDjVayp5b187ifcL+ZHVQZmtHlF5+l0EkAS2FS1H4SaBqKU2fs8dHv+IQsiV+widmWzKQ==", + "version": "npm:@clevercanyon/merge-change.fork@1.8.18", + "resolved": "https://registry.npmjs.org/@clevercanyon/merge-change.fork/-/merge-change.fork-1.8.18.tgz", + "integrity": "sha512-cvuWNxB+4Zy6mrzV4p1QZd5CBfVLKZHJIQVUbCj0cUN+dqFYZGK2OhCvHYqo7AhTBWTsWdxv3N2jUuWaOGn5Pw==", "dev": true }, "merge-stream": { @@ -16834,12 +16983,12 @@ "dev": true }, "micromatch": { - "version": "npm:@clevercanyon/micromatch.fork@4.0.10", - "resolved": "https://registry.npmjs.org/@clevercanyon/micromatch.fork/-/micromatch.fork-4.0.10.tgz", - "integrity": "sha512-t8CXUdhCBvWEjd0FqddE8NWvPFqqaEwwsoZnPSjO837dTGM3dCcizKje1GgJcZRgX75b13xUaozF9bEHAUY+xw==", + "version": "npm:@clevercanyon/micromatch.fork@4.0.15", + "resolved": "https://registry.npmjs.org/@clevercanyon/micromatch.fork/-/micromatch.fork-4.0.15.tgz", + "integrity": "sha512-fIIJPCWlJdW2CAhQiSNpEhKZO+FwchF9TF0cl2A0Hy15JNko2OABgrOMEvnOYDLS0llNG6usgQ4CMIHnoTWnqg==", "requires": { - "braces": "npm:@clevercanyon/braces.fork@^3.0.2", - "picomatch": "npm:@clevercanyon/picomatch.fork@^2.3.1" + "braces": "npm:@clevercanyon/braces.fork@^3.0.11", + "picomatch": "npm:@clevercanyon/picomatch.fork@^2.3.10" } }, "mime-db": { @@ -17417,9 +17566,9 @@ "dev": true }, "picomatch": { - "version": "npm:@clevercanyon/picomatch.fork@2.3.6", - "resolved": "https://registry.npmjs.org/@clevercanyon/picomatch.fork/-/picomatch.fork-2.3.6.tgz", - "integrity": "sha512-PwSW62BLJMGLNnKlQBIoCZlBwPFol+cXambBBjKzkJBlZ5XWOR8rgA/KAlHQ5aI5NVMhqT/cjm72FhAkp7T95Q==" + "version": "npm:@clevercanyon/picomatch.fork@2.3.10", + "resolved": "https://registry.npmjs.org/@clevercanyon/picomatch.fork/-/picomatch.fork-2.3.10.tgz", + "integrity": "sha512-m31dwVwqn0/cnqH9ixPK7jCEqoDVIK/f/2n50VihxP1g4SmFYfC8jTBKcSW7zjJANrfSxah6LBQJtcuJP4BIYA==" }, "pify": { "version": "2.3.0", @@ -18303,9 +18452,9 @@ } }, "rollup": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.10.1.tgz", - "integrity": "sha512-3Er+yel3bZbZX1g2kjVM+FW+RUWDxbG87fcqFM5/9HbPCTpbVp6JOLn7jlxnNlbu7s/N/uDA4EV/91E2gWnxzw==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-3.11.0.tgz", + "integrity": "sha512-+uWPPkpWQ2H3Qi7sNBcRfhhHJyUNgBYhG4wKe5wuGRj2m55kpo+0p5jubKNBjQODyPe6tSBE3tNpdDwEisQvAQ==", "dev": true, "requires": { "fsevents": "~2.3.2" @@ -18453,12 +18602,12 @@ } }, "shescape": { - "version": "npm:@clevercanyon/shescape.fork@1.6.5", - "resolved": "https://registry.npmjs.org/@clevercanyon/shescape.fork/-/shescape.fork-1.6.5.tgz", - "integrity": "sha512-ZF2e/H9oLQEjv18EU2aH92algsdvzg2P3NulnE3PYrQOR2VNYIcdEJ7OBvDi4Fmg0vuh/6kjcU4NzMt2vlSPDA==", + "version": "npm:@clevercanyon/shescape.fork@1.6.7", + "resolved": "https://registry.npmjs.org/@clevercanyon/shescape.fork/-/shescape.fork-1.6.7.tgz", + "integrity": "sha512-w8dJXdD/YohbKaqo8DYycLm7RhkDxphB2M3DIZre084M+zDhFS3HtoQf5iCQ/STx+1k7fpA2v1RhwTww8ySoJg==", "dev": true, "requires": { - "which": "^2.0.0" + "which": "^2.0.2" } }, "side-channel": { @@ -18518,9 +18667,9 @@ } }, "spawn-please": { - "version": "npm:@clevercanyon/spawn-please.fork@2.0.2", - "resolved": "https://registry.npmjs.org/@clevercanyon/spawn-please.fork/-/spawn-please.fork-2.0.2.tgz", - "integrity": "sha512-nZcXI0feppLUGJMj1x3NSewQ96Aygj/0UNqSZ4ERnOq3o4O5AOGqgu62Xv0vgnMKBE7JFBN60IzJiyx5nim9nA==", + "version": "npm:@clevercanyon/spawn-please.fork@2.0.5", + "resolved": "https://registry.npmjs.org/@clevercanyon/spawn-please.fork/-/spawn-please.fork-2.0.5.tgz", + "integrity": "sha512-kRT10E384quwqEMKexJ5NAPO5ZP8yg8Bw8dwOv8E6kACvsWnROD6SPjKrHcXnwTsv/BDM7fIW4MXU8vU7nvq8A==", "dev": true, "requires": { "cross-spawn": "^7.0.3" @@ -19134,11 +19283,11 @@ } }, "to-regex-range": { - "version": "npm:@clevercanyon/to-regex-range.fork@5.0.6", - "resolved": "https://registry.npmjs.org/@clevercanyon/to-regex-range.fork/-/to-regex-range.fork-5.0.6.tgz", - "integrity": "sha512-+C7clE0FvVmNLOnHcUgOw0ot4XV5F2J01trSUO70oEc8+psUarAdWfmjmClsaAI/PiieyM6pfcqFrimqgdsABQ==", + "version": "npm:@clevercanyon/to-regex-range.fork@5.0.10", + "resolved": "https://registry.npmjs.org/@clevercanyon/to-regex-range.fork/-/to-regex-range.fork-5.0.10.tgz", + "integrity": "sha512-lmLmkW7X8x3sOIoxBWfGA7IKcukcLZCpYId1rJK2+XTriUkolJdzUhJBZQfWaLIRln+EflOcUVQ7JQOo/+IoUA==", "requires": { - "is-number": "npm:@clevercanyon/is-number.fork@^7.0.0" + "is-number": "npm:@clevercanyon/is-number.fork@^7.0.11" } }, "tr46": { @@ -19166,9 +19315,9 @@ } }, "tslib": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.4.1.tgz", - "integrity": "sha512-tGyy4dAjRIEwI7BzsB0lynWgOpfqjUdq91XXAlIWD2OwKBH7oCl/GZG/HT4BOHrTlPMOASlMQ7veyTqpmRcrNA==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.5.0.tgz", + "integrity": "sha512-336iVw3rtn2BUK7ORdIAHTyxHGRIHVReokCR3XjbckJMK7ms8FysBfhLR8IXnAgy7T0PTPNBWKiH514FOW/WSg==", "dev": true }, "tsutils": { diff --git a/package.json b/package.json index aaf424c1..b08e953b 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,7 @@ "publishConfig": { "access": "restricted" }, - "version": "1.0.77", + "version": "1.0.78", "license": "GPL-3.0-or-later", "name": "@clevercanyon/utilities", "description": "Another great project by Clever Canyon.", @@ -89,18 +89,21 @@ "./*": ["./dist/types/*"] } }, + "dependencies": {}, "peerDependencies": { "crypto-js": "^4.1.1", "ignore": "^5.2.4", "locutus": "^2.0.16", "lodash": "^4.17.21", - "micromatch": "npm:@clevercanyon/micromatch.fork@^4.0.10", + "micromatch": "npm:@clevercanyon/micromatch.fork@^4.0.15", "react": "^18.2.0", "react-dom": "^18.2.0" }, "peerDependenciesMeta": {}, + "optionalDependencies": {}, + "bundleDependencies": [], "devDependencies": { - "@clevercanyon/skeleton-dev-deps": "^1.0.87", + "@clevercanyon/skeleton-dev-deps": "^1.0.99", "@cloudflare/workers-types": "^4.20230115.0", "@types/crypto-js": "^4.1.1", "@types/locutus": "^0.0.6", @@ -111,13 +114,13 @@ "@types/react-dom": "^18.0.10" }, "overrides": {}, + "workspaces": [], "cpu": ["x64", "arm64"], "os": ["darwin", "linux"], "engines": { "node": "^19.2.0 || ^19.4.0", "npm": "^8.19.3 || ^9.2.0" }, - "workspaces": [], "config": { "c10n": { "&": { @@ -134,7 +137,8 @@ "architects": "push" }, "labels": {}, - "configVersion": "1.0.1" + "configVersion": "1.0.1", + "envsVersion": "" }, "npmjs": { "configVersions": "1.0.1,1.0.0" diff --git a/vite.config.js b/vite.config.mjs similarity index 89% rename from vite.config.js rename to vite.config.mjs index 75a2d2b7..7b77d0a2 100644 --- a/vite.config.js +++ b/vite.config.mjs @@ -10,7 +10,7 @@ /* eslint-env es2021, node */ import mc from 'merge-change'; -import baseConfig from './dev/.files/vite/config.js'; +import baseConfig from './dev/.files/vite/config.mjs'; /* * Customizations.