@funish/basis 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +54 -11
- package/dist/chunks/config.cjs +1 -1
- package/dist/chunks/config.mjs +1 -1
- package/dist/chunks/git.cjs +1 -1
- package/dist/chunks/git.mjs +1 -1
- package/dist/chunks/init.cjs +1 -1
- package/dist/chunks/init.mjs +1 -1
- package/dist/chunks/lint.cjs +1 -1
- package/dist/chunks/lint.mjs +1 -1
- package/dist/chunks/publish.cjs +1 -1
- package/dist/chunks/publish.mjs +1 -1
- package/dist/chunks/version.cjs +1 -1
- package/dist/chunks/version.mjs +1 -1
- package/dist/index.cjs +1 -1
- package/dist/index.d.cts +9 -15
- package/dist/index.d.mts +9 -15
- package/dist/index.d.ts +9 -15
- package/dist/index.mjs +1 -1
- package/dist/shared/{basis.CASkqgVR.mjs → basis.0WCUjjhy.mjs} +1 -1
- package/dist/shared/basis.1ZgFrMJb.mjs +7 -0
- package/dist/shared/basis.B4p52ive.cjs +1 -0
- package/dist/shared/basis.BEOfVK6U.cjs +3 -0
- package/dist/shared/basis.BJhSbOyA.cjs +1 -0
- package/dist/shared/basis.C8S2dWvt.cjs +7 -0
- package/dist/shared/{basis.BjS41bTE.cjs → basis.CHVACS4W.cjs} +1 -1
- package/dist/shared/basis.CkZpidFZ.mjs +1 -0
- package/dist/shared/basis.DcC8NBqt.mjs +3 -0
- package/dist/shared/basis.DzMHJtq5.mjs +10 -0
- package/dist/shared/basis.plLH3j3N.mjs +1 -0
- package/dist/shared/basis.sOTOmfHG.cjs +10 -0
- package/package.json +3 -1
- package/dist/shared/basis.BglwV-us.mjs +0 -1
- package/dist/shared/basis.Bhi6kSAJ.cjs +0 -1
- package/dist/shared/basis.C7U9rUSl.mjs +0 -1
- package/dist/shared/basis.D2srGCU3.cjs +0 -1
- package/dist/shared/basis.D3bv4yUV.mjs +0 -3
- package/dist/shared/basis.DHqql56x.mjs +0 -10
- package/dist/shared/basis.DXBdQ4nF.mjs +0 -1
- package/dist/shared/basis.DcyVtmjR.cjs +0 -1
- package/dist/shared/basis.FJWRn1Ix.cjs +0 -3
- package/dist/shared/basis.QoGvLLsN.cjs +0 -10
package/README.md
CHANGED
|
@@ -57,9 +57,13 @@ pnpx @funish/basis init
|
|
|
57
57
|
cd your-existing-project
|
|
58
58
|
basis init
|
|
59
59
|
|
|
60
|
+
# Interactive setup will ask you to:
|
|
61
|
+
# 📁 Choose config format (.ts/.mjs/.cjs) - auto-detected based on your project
|
|
62
|
+
# 🔧 Optionally setup Git hooks and configuration
|
|
63
|
+
|
|
60
64
|
# Your project now has:
|
|
61
|
-
# ✅ basis.config.ts configuration file
|
|
62
|
-
# ✅ Git hooks setup (
|
|
65
|
+
# ✅ basis.config.[ts|mjs|cjs] configuration file (empty, ready to customize)
|
|
66
|
+
# ✅ Git hooks setup (if selected during init)
|
|
63
67
|
# ✅ Tool-agnostic linting workflow
|
|
64
68
|
# ✅ Package management through unified CLI
|
|
65
69
|
# ✅ Version management with semantic versioning
|
|
@@ -184,11 +188,16 @@ basis git lint-commit
|
|
|
184
188
|
|
|
185
189
|
```bash
|
|
186
190
|
# Initialize configuration
|
|
187
|
-
basis init # Initialize basis configuration
|
|
191
|
+
basis init # Initialize basis configuration (interactive)
|
|
188
192
|
basis init --force # Overwrite existing configuration
|
|
189
193
|
basis init --skip-git-check # Skip git directory check
|
|
190
194
|
basis init --skip-install # Skip dependency installation
|
|
191
195
|
|
|
196
|
+
# Interactive setup will:
|
|
197
|
+
# 1. Auto-detect recommended config format (.ts/.mjs/.cjs)
|
|
198
|
+
# 2. Ask you to choose your preferred format
|
|
199
|
+
# 3. Offer to setup Git hooks and configuration
|
|
200
|
+
|
|
192
201
|
# Configuration
|
|
193
202
|
basis config # Show current configuration
|
|
194
203
|
basis config --json # Output configuration as JSON
|
|
@@ -201,7 +210,41 @@ basis <command> --help # Show command-specific help
|
|
|
201
210
|
|
|
202
211
|
## Configuration
|
|
203
212
|
|
|
204
|
-
Basis uses a single configuration file for all its features:
|
|
213
|
+
Basis uses a single configuration file for all its features. The `basis init` command creates an empty configuration file in your preferred format:
|
|
214
|
+
|
|
215
|
+
```ts
|
|
216
|
+
// basis.config.ts (TypeScript)
|
|
217
|
+
import { defineBasisConfig } from "@funish/basis";
|
|
218
|
+
|
|
219
|
+
export default defineBasisConfig({
|
|
220
|
+
// Configure your project here
|
|
221
|
+
// See: https://github.com/funish/basis/tree/main/packages/basis#configuration
|
|
222
|
+
});
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
```mjs
|
|
226
|
+
// basis.config.mjs (ES Module)
|
|
227
|
+
import { defineBasisConfig } from "@funish/basis";
|
|
228
|
+
|
|
229
|
+
export default defineBasisConfig({
|
|
230
|
+
// Configure your project here
|
|
231
|
+
// See: https://github.com/funish/basis/tree/main/packages/basis#configuration
|
|
232
|
+
});
|
|
233
|
+
```
|
|
234
|
+
|
|
235
|
+
```cjs
|
|
236
|
+
// basis.config.cjs (CommonJS)
|
|
237
|
+
const { defineBasisConfig } = require("@funish/basis");
|
|
238
|
+
|
|
239
|
+
module.exports = defineBasisConfig({
|
|
240
|
+
// Configure your project here
|
|
241
|
+
// See: https://github.com/funish/basis/tree/main/packages/basis#configuration
|
|
242
|
+
});
|
|
243
|
+
```
|
|
244
|
+
|
|
245
|
+
### Full Configuration Example
|
|
246
|
+
|
|
247
|
+
Here's a complete configuration with all available options:
|
|
205
248
|
|
|
206
249
|
```ts
|
|
207
250
|
// basis.config.ts
|
|
@@ -212,14 +255,14 @@ export default defineBasisConfig({
|
|
|
212
255
|
lint: {
|
|
213
256
|
// Staged files linting patterns
|
|
214
257
|
staged: {
|
|
215
|
-
"*.{ts,tsx,js,jsx}": "eslint --fix",
|
|
216
|
-
"*.{json,md,yml,yaml}": "prettier --write",
|
|
217
|
-
"*.vue": "vue-tsc --noEmit && eslint --fix",
|
|
258
|
+
"*.{ts,tsx,js,jsx}": "pnpm eslint --fix",
|
|
259
|
+
"*.{json,md,yml,yaml}": "pnpm prettier --write",
|
|
260
|
+
"*.vue": "pnpm vue-tsc --noEmit && pnpm eslint --fix",
|
|
218
261
|
},
|
|
219
262
|
// Project-wide linting commands
|
|
220
263
|
project: {
|
|
221
|
-
typecheck: "tsc --noEmit",
|
|
222
|
-
"format-check": "prettier --check .",
|
|
264
|
+
typecheck: "pnpm tsc --noEmit",
|
|
265
|
+
"format-check": "pnpm prettier --check .",
|
|
223
266
|
},
|
|
224
267
|
},
|
|
225
268
|
|
|
@@ -227,8 +270,8 @@ export default defineBasisConfig({
|
|
|
227
270
|
git: {
|
|
228
271
|
// Hook commands
|
|
229
272
|
hooks: {
|
|
230
|
-
"pre-commit": "basis lint --staged",
|
|
231
|
-
"commit-msg": "basis git lint-commit",
|
|
273
|
+
"pre-commit": "pnpm basis lint --staged",
|
|
274
|
+
"commit-msg": "pnpm basis git lint-commit",
|
|
232
275
|
},
|
|
233
276
|
|
|
234
277
|
// Commit message validation
|
package/dist/chunks/config.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const citty=require("citty"),consola=require("consola"),utils=require("../shared/basis.
|
|
1
|
+
"use strict";const citty=require("citty"),consola=require("consola"),utils=require("../shared/basis.BJhSbOyA.cjs");require("node:fs/promises"),require("c12"),require("../config.cjs");const config=citty.defineCommand({meta:{name:"config",description:"View current basis configuration"},args:{json:{type:"boolean",description:"Output configuration as JSON"},path:{type:"boolean",description:"Show configuration file path"}},async run({args:e}){try{const s=process.cwd(),{config:o,configFile:t}=await utils.loadConfig({cwd:s});if(e.path){t?consola.consola.info(`Configuration file: ${t}`):(consola.consola.warn("No configuration file found"),consola.consola.info("Run `basis init` to create one"));return}if(Object.keys(o).length===0){consola.consola.warn("No configuration found"),consola.consola.info("Run `basis init` to create a basis.config.ts file");return}if(e.json)consola.consola.log(JSON.stringify(o,null,2));else{if(consola.consola.info("Current basis configuration:"),t&&consola.consola.log(`\u{1F4C1} Config file: ${t}`),o.lint){if(consola.consola.log(""),consola.consola.log("\u{1F4DD} Lint:"),o.lint.staged){consola.consola.log(" Staged files:");for(const[n,i]of Object.entries(o.lint.staged))consola.consola.log(` ${n}: ${i}`)}if(o.lint.project){consola.consola.log(" Project:");for(const[n,i]of Object.entries(o.lint.project))consola.consola.log(` ${n}: ${i}`)}}if(o.git&&(consola.consola.log(""),consola.consola.log("\u{1F527} Git:"),o.git.commitMsg&&(consola.consola.log(" Commit message:"),o.git.commitMsg.types&&consola.consola.log(` Types: ${o.git.commitMsg.types.join(", ")}`),o.git.commitMsg.maxLength&&consola.consola.log(` Max length: ${o.git.commitMsg.maxLength}`),o.git.commitMsg.minLength&&consola.consola.log(` Min length: ${o.git.commitMsg.minLength}`)),o.git.hooks)){consola.consola.log(" Hooks:");for(const[n,i]of Object.entries(o.git.hooks))consola.consola.log(` ${n}: ${i}`)}}consola.consola.success("Configuration loaded successfully")}catch(s){consola.consola.error("Failed to load configuration:",s),process.exit(1)}}});exports.default=config;
|
package/dist/chunks/config.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineCommand as r}from"citty";import{consola as o}from"consola";import{l as a}from"../shared/basis.
|
|
1
|
+
import{defineCommand as r}from"citty";import{consola as o}from"consola";import{l as a}from"../shared/basis.CkZpidFZ.mjs";import"node:fs/promises";import"c12";import"../config.mjs";const c=r({meta:{name:"config",description:"View current basis configuration"},args:{json:{type:"boolean",description:"Output configuration as JSON"},path:{type:"boolean",description:"Show configuration file path"}},async run({args:s}){try{const g=process.cwd(),{config:i,configFile:e}=await a({cwd:g});if(s.path){e?o.info(`Configuration file: ${e}`):(o.warn("No configuration file found"),o.info("Run `basis init` to create one"));return}if(Object.keys(i).length===0){o.warn("No configuration found"),o.info("Run `basis init` to create a basis.config.ts file");return}if(s.json)o.log(JSON.stringify(i,null,2));else{if(o.info("Current basis configuration:"),e&&o.log(`\u{1F4C1} Config file: ${e}`),i.lint){if(o.log(""),o.log("\u{1F4DD} Lint:"),i.lint.staged){o.log(" Staged files:");for(const[t,n]of Object.entries(i.lint.staged))o.log(` ${t}: ${n}`)}if(i.lint.project){o.log(" Project:");for(const[t,n]of Object.entries(i.lint.project))o.log(` ${t}: ${n}`)}}if(i.git&&(o.log(""),o.log("\u{1F527} Git:"),i.git.commitMsg&&(o.log(" Commit message:"),i.git.commitMsg.types&&o.log(` Types: ${i.git.commitMsg.types.join(", ")}`),i.git.commitMsg.maxLength&&o.log(` Max length: ${i.git.commitMsg.maxLength}`),i.git.commitMsg.minLength&&o.log(` Min length: ${i.git.commitMsg.minLength}`)),i.git.hooks)){o.log(" Hooks:");for(const[t,n]of Object.entries(i.git.hooks))o.log(` ${t}: ${n}`)}}o.success("Configuration loaded successfully")}catch(g){o.error("Failed to load configuration:",g),process.exit(1)}}});export{c as default};
|
package/dist/chunks/git.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const citty=require("citty"),consola=require("consola"),git$1=require("../shared/basis.
|
|
1
|
+
"use strict";const citty=require("citty"),consola=require("consola"),git$1=require("../shared/basis.sOTOmfHG.cjs");require("node:child_process"),require("node:fs/promises"),require("c12/update"),require("defu"),require("ini"),require("pathe"),require("../shared/basis.BJhSbOyA.cjs"),require("c12"),require("../config.cjs");const git=citty.defineCommand({meta:{name:"git",description:"Git configuration and hooks management"},subCommands:{setup:citty.defineCommand({meta:{name:"setup",description:"Setup Git configuration and hooks"},async run(){const e=process.cwd();await git$1.setupGit(e)||process.exit(1)}}),config:citty.defineCommand({meta:{name:"config",description:"Setup Git configuration only"},async run(){const e=process.cwd();consola.consola.start("Setting up Git configuration..."),await git$1.setupGitConfig(e)?consola.consola.success("Git configuration completed successfully!"):(consola.consola.error("Git configuration failed"),process.exit(1))}}),hooks:citty.defineCommand({meta:{name:"hooks",description:"Setup Git hooks only"},async run(){const e=process.cwd();consola.consola.start("Setting up Git hooks..."),await git$1.setupGitHooks(e)?consola.consola.success("Git hooks setup completed successfully!"):(consola.consola.error("Git hooks setup failed"),process.exit(1))}}),remove:citty.defineCommand({meta:{name:"remove",description:"Remove Git hooks"},args:{hooks:{type:"positional",description:"Specific hook names to remove (optional)",required:!1},"update-config":{type:"boolean",description:"Also remove hooks configuration from basis.config.ts",default:!1}},async run({args:e}){const o=process.cwd();consola.consola.start("Removing Git hooks...");const s=e.hooks&&typeof e.hooks=="string"?[e.hooks]:Array.isArray(e.hooks)?e.hooks.filter(t=>typeof t=="string"):void 0,i=typeof e["update-config"]=="boolean"?e["update-config"]:!1;await git$1.removeGitHooks(o,s,{updateConfig:i})?consola.consola.success("Git hooks removed successfully!"):(consola.consola.error("Git hooks removal failed"),process.exit(1))}}),reset:citty.defineCommand({meta:{name:"reset",description:"Reset Git configuration (keeps user info by default)"},args:{"keep-user":{type:"boolean",description:"Keep user information (name, email)",default:!0},"update-config":{type:"boolean",description:"Also remove git config from basis.config.ts",default:!1}},async run({args:e}){const o=process.cwd();consola.consola.start("Resetting Git configuration...");const s=typeof e["keep-user"]=="boolean"?e["keep-user"]:!0,i=typeof e["update-config"]=="boolean"?e["update-config"]:!1;await git$1.resetGitConfig(o,s,{updateConfig:i})?consola.consola.success("Git configuration reset successfully!"):(consola.consola.error("Git configuration reset failed"),process.exit(1))}}),init:citty.defineCommand({meta:{name:"init",description:"Initialize Git repository with basis configuration"},async run(){const e=process.cwd();consola.consola.start("Initializing Git repository..."),await git$1.initGitRepo(e)?consola.consola.success("Git repository initialized successfully!"):(consola.consola.error("Git initialization failed"),process.exit(1))}}),"lint-commit":citty.defineCommand({meta:{name:"lint-commit",description:"Validate commit message"},async run(){const e=process.cwd();consola.consola.start("Validating commit message..."),await git$1.lintCommitMessage(e)?consola.consola.success("Commit message validation passed!"):(consola.consola.error("Commit message validation failed"),process.exit(1))}})},async run(){const e=process.cwd();await git$1.setupGit(e)||process.exit(1)}});exports.git=git;
|
package/dist/chunks/git.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineCommand as t}from"citty";import{consola as e}from"consola";import{b as
|
|
1
|
+
import{defineCommand as t}from"citty";import{consola as e}from"consola";import{b as r,l as c,i as p,c as m,r as u,s as f,a as l}from"../shared/basis.DzMHJtq5.mjs";import"node:child_process";import"node:fs/promises";import"c12/update";import"defu";import"ini";import"pathe";import"../shared/basis.CkZpidFZ.mjs";import"c12";import"../config.mjs";const d=t({meta:{name:"git",description:"Git configuration and hooks management"},subCommands:{setup:t({meta:{name:"setup",description:"Setup Git configuration and hooks"},async run(){const o=process.cwd();await r(o)||process.exit(1)}}),config:t({meta:{name:"config",description:"Setup Git configuration only"},async run(){const o=process.cwd();e.start("Setting up Git configuration..."),await l(o)?e.success("Git configuration completed successfully!"):(e.error("Git configuration failed"),process.exit(1))}}),hooks:t({meta:{name:"hooks",description:"Setup Git hooks only"},async run(){const o=process.cwd();e.start("Setting up Git hooks..."),await f(o)?e.success("Git hooks setup completed successfully!"):(e.error("Git hooks setup failed"),process.exit(1))}}),remove:t({meta:{name:"remove",description:"Remove Git hooks"},args:{hooks:{type:"positional",description:"Specific hook names to remove (optional)",required:!1},"update-config":{type:"boolean",description:"Also remove hooks configuration from basis.config.ts",default:!1}},async run({args:o}){const i=process.cwd();e.start("Removing Git hooks...");const s=o.hooks&&typeof o.hooks=="string"?[o.hooks]:Array.isArray(o.hooks)?o.hooks.filter(n=>typeof n=="string"):void 0,a=typeof o["update-config"]=="boolean"?o["update-config"]:!1;await u(i,s,{updateConfig:a})?e.success("Git hooks removed successfully!"):(e.error("Git hooks removal failed"),process.exit(1))}}),reset:t({meta:{name:"reset",description:"Reset Git configuration (keeps user info by default)"},args:{"keep-user":{type:"boolean",description:"Keep user information (name, email)",default:!0},"update-config":{type:"boolean",description:"Also remove git config from basis.config.ts",default:!1}},async run({args:o}){const i=process.cwd();e.start("Resetting Git configuration...");const s=typeof o["keep-user"]=="boolean"?o["keep-user"]:!0,a=typeof o["update-config"]=="boolean"?o["update-config"]:!1;await m(i,s,{updateConfig:a})?e.success("Git configuration reset successfully!"):(e.error("Git configuration reset failed"),process.exit(1))}}),init:t({meta:{name:"init",description:"Initialize Git repository with basis configuration"},async run(){const o=process.cwd();e.start("Initializing Git repository..."),await p(o)?e.success("Git repository initialized successfully!"):(e.error("Git initialization failed"),process.exit(1))}}),"lint-commit":t({meta:{name:"lint-commit",description:"Validate commit message"},async run(){const o=process.cwd();e.start("Validating commit message..."),await c(o)?e.success("Commit message validation passed!"):(e.error("Commit message validation failed"),process.exit(1))}})},async run(){const o=process.cwd();await r(o)||process.exit(1)}});export{d as git};
|
package/dist/chunks/init.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const citty=require("citty"),consola=require("consola"),init$1=require("../shared/basis.
|
|
1
|
+
"use strict";const citty=require("citty"),consola=require("consola"),init$1=require("../shared/basis.C8S2dWvt.cjs");require("c12/update"),require("magicast"),require("nypm"),require("pathe"),require("pkg-types"),require("../shared/basis.BJhSbOyA.cjs"),require("node:fs/promises"),require("c12"),require("../config.cjs"),require("../shared/basis.sOTOmfHG.cjs"),require("node:child_process"),require("defu"),require("ini");const init=citty.defineCommand({meta:{name:"init",description:"Initialize basis configuration"},args:{force:{type:"boolean",alias:"f",description:"Overwrite existing configuration"},"skip-git-check":{type:"boolean",description:"Skip git directory check"},"skip-install":{type:"boolean",description:"Skip showing install command"}},async run({args:e}){try{await init$1.init(process.cwd(),{force:e.force,skipGitCheck:e["skip-git-check"],skipInstall:e["skip-install"]})}catch(i){consola.consola.error("Init failed:",i),process.exit(1)}}});exports.default=init;
|
package/dist/chunks/init.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineCommand as o}from"citty";import{consola as r}from"consola";import{i as e}from"../shared/basis.
|
|
1
|
+
import{defineCommand as o}from"citty";import{consola as r}from"consola";import{i as e}from"../shared/basis.1ZgFrMJb.mjs";import"c12/update";import"magicast";import"nypm";import"pathe";import"pkg-types";import"../shared/basis.CkZpidFZ.mjs";import"node:fs/promises";import"c12";import"../config.mjs";import"../shared/basis.DzMHJtq5.mjs";import"node:child_process";import"defu";import"ini";const p=o({meta:{name:"init",description:"Initialize basis configuration"},args:{force:{type:"boolean",alias:"f",description:"Overwrite existing configuration"},"skip-git-check":{type:"boolean",description:"Skip git directory check"},"skip-install":{type:"boolean",description:"Skip showing install command"}},async run({args:i}){try{await e(process.cwd(),{force:i.force,skipGitCheck:i["skip-git-check"],skipInstall:i["skip-install"]})}catch(t){r.error("Init failed:",t),process.exit(1)}}});export{p as default};
|
package/dist/chunks/lint.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const citty=require("citty"),consola=require("consola"),lint$1=require("../shared/basis.
|
|
1
|
+
"use strict";const citty=require("citty"),consola=require("consola"),lint$1=require("../shared/basis.BEOfVK6U.cjs");require("node:child_process"),require("fast-glob"),require("micromatch"),require("nypm"),require("pathe"),require("pkg-types"),require("../shared/basis.BJhSbOyA.cjs"),require("node:fs/promises"),require("c12"),require("../config.cjs");const lint=citty.defineCommand({meta:{name:"lint",description:"Run comprehensive project linting and quality checks"},args:{staged:{type:"boolean",description:"Lint only staged files using configured commands",default:!1},project:{type:"boolean",description:"Run project-wide lint commands",default:!1},deps:{type:"boolean",description:"Check dependencies (outdated, security, blocked packages)",default:!1},structure:{type:"boolean",description:"Check project structure (required files/dirs, naming conventions)",default:!1},docs:{type:"boolean",description:"Check documentation (README, CHANGELOG)",default:!1},all:{type:"boolean",description:"Run all lint checks",default:!1}},async run({args:e}){const s=process.cwd();let c=!0;if(!e.staged&&!e.project&&!e.deps&&!e.structure&&!e.docs&&!e.all&&(e.staged=!0),e.all)c=await lint$1.lintAll(s);else{const t=[];e.staged&&t.push(()=>lint$1.lintStaged(s)),e.project&&t.push(()=>lint$1.lintProject(s)),e.deps&&t.push(()=>lint$1.lintDependencies(s)),e.structure&&t.push(()=>lint$1.lintStructure(s)),e.docs&&t.push(()=>lint$1.lintDocs(s));for(const i of t)await i()||(c=!1)}c?(consola.consola.success("All lint checks completed successfully!"),process.exit(0)):(consola.consola.error("Some lint checks failed"),process.exit(1))}});exports.lint=lint;
|
package/dist/chunks/lint.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineCommand as n}from"citty";import{consola as i}from"consola";import{e as r,l as a,a as l,b as p,c as d,d as u}from"../shared/basis.
|
|
1
|
+
import{defineCommand as n}from"citty";import{consola as i}from"consola";import{e as r,l as a,a as l,b as p,c as d,d as u}from"../shared/basis.DcC8NBqt.mjs";import"node:child_process";import"fast-glob";import"micromatch";import"nypm";import"pathe";import"pkg-types";import"../shared/basis.CkZpidFZ.mjs";import"node:fs/promises";import"c12";import"../config.mjs";const m=n({meta:{name:"lint",description:"Run comprehensive project linting and quality checks"},args:{staged:{type:"boolean",description:"Lint only staged files using configured commands",default:!1},project:{type:"boolean",description:"Run project-wide lint commands",default:!1},deps:{type:"boolean",description:"Check dependencies (outdated, security, blocked packages)",default:!1},structure:{type:"boolean",description:"Check project structure (required files/dirs, naming conventions)",default:!1},docs:{type:"boolean",description:"Check documentation (README, CHANGELOG)",default:!1},all:{type:"boolean",description:"Run all lint checks",default:!1}},async run({args:e}){const t=process.cwd();let o=!0;if(!e.staged&&!e.project&&!e.deps&&!e.structure&&!e.docs&&!e.all&&(e.staged=!0),e.all)o=await r(t);else{const s=[];e.staged&&s.push(()=>a(t)),e.project&&s.push(()=>l(t)),e.deps&&s.push(()=>p(t)),e.structure&&s.push(()=>d(t)),e.docs&&s.push(()=>u(t));for(const c of s)await c()||(o=!1)}o?(i.success("All lint checks completed successfully!"),process.exit(0)):(i.error("Some lint checks failed"),process.exit(1))}});export{m as lint};
|
package/dist/chunks/publish.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const citty=require("citty"),consola=require("consola"),publish$1=require("../shared/basis.
|
|
1
|
+
"use strict";const citty=require("citty"),consola=require("consola"),publish$1=require("../shared/basis.B4p52ive.cjs");require("node:child_process"),require("nypm"),require("pkg-types"),require("semver"),require("../shared/basis.BJhSbOyA.cjs"),require("node:fs/promises"),require("c12"),require("../config.cjs");const publish=citty.defineCommand({meta:{name:"publish",description:"Publish package to npm registry"},args:{tag:{type:"string",description:"Specific npm tag to publish to",alias:"t"},stable:{type:"boolean",description:"Publish as stable release (latest tag)",alias:"s"},latest:{type:"boolean",description:"Publish to latest tag",alias:"l"},dryRun:{type:"boolean",description:"Perform a dry run without actually publishing",alias:"d"},access:{type:"string",description:"Package access level (public/private)",alias:"a"},registry:{type:"string",description:"NPM registry URL",alias:"r"},skipBuild:{type:"boolean",description:"Skip build step"},skipTests:{type:"boolean",description:"Skip test step"}},async run({args:e}){try{const i=process.cwd(),t={tag:e.tag,stable:e.stable,latest:e.latest,dryRun:e.dryRun,access:e.access,registry:e.registry,skipBuild:e.skipBuild,skipTests:e.skipTests},s=await publish$1.publishPackage(i,t);s.dryRun?consola.consola.success("Dry run completed successfully"):consola.consola.success(`Published ${s.packageName}@${s.version} to ${s.publishTag}`)}catch(i){consola.consola.error("Failed to publish:",i),process.exit(1)}}});exports.default=publish;
|
package/dist/chunks/publish.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineCommand as r}from"citty";import{consola as i}from"consola";import{p}from"../shared/basis.
|
|
1
|
+
import{defineCommand as r}from"citty";import{consola as i}from"consola";import{p}from"../shared/basis.plLH3j3N.mjs";import"node:child_process";import"nypm";import"pkg-types";import"semver";import"../shared/basis.CkZpidFZ.mjs";import"node:fs/promises";import"c12";import"../config.mjs";const o=r({meta:{name:"publish",description:"Publish package to npm registry"},args:{tag:{type:"string",description:"Specific npm tag to publish to",alias:"t"},stable:{type:"boolean",description:"Publish as stable release (latest tag)",alias:"s"},latest:{type:"boolean",description:"Publish to latest tag",alias:"l"},dryRun:{type:"boolean",description:"Perform a dry run without actually publishing",alias:"d"},access:{type:"string",description:"Package access level (public/private)",alias:"a"},registry:{type:"string",description:"NPM registry URL",alias:"r"},skipBuild:{type:"boolean",description:"Skip build step"},skipTests:{type:"boolean",description:"Skip test step"}},async run({args:t}){try{const e=process.cwd(),a={tag:t.tag,stable:t.stable,latest:t.latest,dryRun:t.dryRun,access:t.access,registry:t.registry,skipBuild:t.skipBuild,skipTests:t.skipTests},s=await p(e,a);s.dryRun?i.success("Dry run completed successfully"):i.success(`Published ${s.packageName}@${s.version} to ${s.publishTag}`)}catch(e){i.error("Failed to publish:",e),process.exit(1)}}});export{o as default};
|
package/dist/chunks/version.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const citty=require("citty"),consola=require("consola"),g=require("semver"),version$1=require("../shared/basis.
|
|
1
|
+
"use strict";const citty=require("citty"),consola=require("consola"),g=require("semver"),version$1=require("../shared/basis.CHVACS4W.cjs");require("node:child_process"),require("pkg-types"),require("../shared/basis.BJhSbOyA.cjs"),require("node:fs/promises"),require("c12"),require("../config.cjs");function _interopDefaultCompat(e){return e&&typeof e=="object"&&"default"in e?e.default:e}const g__default=_interopDefaultCompat(g),version=citty.defineCommand({meta:{name:"version",description:"Update package version"},args:{version:{type:"positional",description:"Version to set (patch, minor, major, prerelease, or specific version like 1.2.3)",required:!1},preid:{type:"string",description:"Prerelease identifier (alpha, beta, rc)"},tag:{type:"string",description:"Git tag name"},message:{type:"string",description:"Commit message template",alias:"m"}},async run({args:e}){try{const i=process.cwd(),r=e.version,o={preid:e.preid,message:e.message,tag:e.tag};r&&(["patch","minor","major","prerelease"].includes(r)?o[r]=!0:g__default.valid(r)?o.version=r:(consola.consola.error(`Invalid version argument: ${r}`),consola.consola.info("Valid options: patch, minor, major, prerelease, or specific version (e.g., 1.2.3)"),process.exit(1)));const s=await version$1.updatePackageVersion(i,o);consola.consola.success(`Version updated: ${s.oldVersion} \u2192 ${s.newVersion}`),s.tagName&&consola.consola.info(`Git tag created: ${s.tagName}`)}catch(i){consola.consola.error("Failed to update version:",i),process.exit(1)}}});exports.default=version;
|
package/dist/chunks/version.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{defineCommand as a}from"citty";import{consola as r}from"consola";import n from"semver";import{u as p}from"../shared/basis.
|
|
1
|
+
import{defineCommand as a}from"citty";import{consola as r}from"consola";import n from"semver";import{u as p}from"../shared/basis.0WCUjjhy.mjs";import"node:child_process";import"pkg-types";import"../shared/basis.CkZpidFZ.mjs";import"node:fs/promises";import"c12";import"../config.mjs";const m=a({meta:{name:"version",description:"Update package version"},args:{version:{type:"positional",description:"Version to set (patch, minor, major, prerelease, or specific version like 1.2.3)",required:!1},preid:{type:"string",description:"Prerelease identifier (alpha, beta, rc)"},tag:{type:"string",description:"Git tag name"},message:{type:"string",description:"Commit message template",alias:"m"}},async run({args:i}){try{const s=process.cwd(),e=i.version,t={preid:i.preid,message:i.message,tag:i.tag};e&&(["patch","minor","major","prerelease"].includes(e)?t[e]=!0:n.valid(e)?t.version=e:(r.error(`Invalid version argument: ${e}`),r.info("Valid options: patch, minor, major, prerelease, or specific version (e.g., 1.2.3)"),process.exit(1)));const o=await p(s,t);r.success(`Version updated: ${o.oldVersion} \u2192 ${o.newVersion}`),o.tagName&&r.info(`Git tag created: ${o.tagName}`)}catch(s){r.error("Failed to update version:",s),process.exit(1)}}});export{m as default};
|
package/dist/index.cjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const config=require("./config.cjs"),git=require("./shared/basis.
|
|
1
|
+
"use strict";const config=require("./config.cjs"),git=require("./shared/basis.sOTOmfHG.cjs"),init=require("./shared/basis.C8S2dWvt.cjs"),lint=require("./shared/basis.BEOfVK6U.cjs"),publish=require("./shared/basis.B4p52ive.cjs"),version=require("./shared/basis.CHVACS4W.cjs"),utils=require("./shared/basis.BJhSbOyA.cjs");require("node:child_process"),require("node:fs/promises"),require("c12/update"),require("consola"),require("defu"),require("ini"),require("pathe"),require("magicast"),require("nypm"),require("pkg-types"),require("fast-glob"),require("micromatch"),require("semver"),require("c12");class Basis{config=null;cwd;constructor(t=process.cwd()){this.cwd=t}async getConfig(){if(!this.config){const{config:t}=await utils.loadConfig({cwd:this.cwd});this.config=t}return this.config}async init(t={}){return await init.init(this.cwd,t)}async lintStaged(){const t=await this.getConfig();return await lint.lintStaged(this.cwd,t.lint?.staged)}async lintProject(){const t=await this.getConfig();return await lint.lintProject(this.cwd,t.lint?.project)}async lintDependencies(){const t=await this.getConfig();return await lint.lintDependencies(this.cwd,t.lint?.dependencies)}async lintStructure(){const t=await this.getConfig();return await lint.lintStructure(this.cwd,t.lint?.structure)}async lintDocs(){const t=await this.getConfig();return await lint.lintDocs(this.cwd,t.lint?.docs)}async lintAll(){return await lint.lintAll(this.cwd)}async lintCommitMessage(){const t=await this.getConfig();return await git.lintCommitMessage(this.cwd,t.git?.commitMsg)}async setupGitHooks(){const t=await this.getConfig();return await git.setupGitHooks(this.cwd,t.git?.hooks)}async setupGitConfig(){const t=await this.getConfig();return await git.setupGitConfig(this.cwd,t.git?.config)}async setupGit(){return await git.setupGit(this.cwd)}async initGitRepo(){return await git.initGitRepo(this.cwd)}async removeGitHooks(t=!1){return await git.removeGitHooks(this.cwd,void 0,{updateConfig:t})}async resetGitConfig(t=!0,e=!1){return await git.resetGitConfig(this.cwd,t,{updateConfig:e})}async updateVersion(t={}){return await version.updatePackageVersion(this.cwd,t)}async setVersion(t){return await version.updatePackageVersion(this.cwd,{version:t})}async patchVersion(){return await version.updatePackageVersion(this.cwd,{})}async minorVersion(){return await version.updatePackageVersion(this.cwd,{minor:!0})}async majorVersion(){return await version.updatePackageVersion(this.cwd,{major:!0})}async prereleaseVersion(t){return await version.updatePackageVersion(this.cwd,{prerelease:!0,preid:t})}async publish(t={}){return await publish.publishPackage(this.cwd,t)}async publishDryRun(t={}){return await publish.publishPackage(this.cwd,{...t,dryRun:!0})}async publishToTag(t,e={}){return await publish.publishPackage(this.cwd,{...e,tag:t})}async publishStable(t={}){return await publish.publishPackage(this.cwd,{...t,stable:!0})}getCwd(){return this.cwd}setCwd(t){this.cwd=t,this.config=null}async reloadConfig(){return this.config=null,await this.getConfig()}async setup(t={}){return await this.init(t)?await this.setupGit():!1}async release(t={},e={}){if(!await this.lintAll())throw new Error("Lint checks failed. Fix issues before releasing.");const s=await this.updateVersion(t),a=await this.publish(e);return{version:s,publish:a}}}function createBasis(i=process.cwd()){return new Basis(i)}const VALID_GIT_HOOKS=["applypatch-msg","pre-applypatch","post-applypatch","pre-commit","pre-merge-commit","prepare-commit-msg","commit-msg","post-commit","pre-rebase","post-checkout","post-merge","pre-push","pre-receive","update","proc-receive","post-receive","post-update","reference-transaction","push-to-checkout","pre-auto-gc","post-rewrite","sendemail-validate","fsmonitor-watchman","p4-changelist","p4-prepare-changelist","p4-post-changelist","p4-pre-submit","post-index-change"];exports.defaultConfig=config.defaultConfig,exports.defineBasisConfig=config.defineBasisConfig,exports.initGitRepo=git.initGitRepo,exports.lintCommitMessage=git.lintCommitMessage,exports.parseCommitMessage=git.parseCommitMessage,exports.readGitConfig=git.readGitConfig,exports.removeGitHooks=git.removeGitHooks,exports.resetGitConfig=git.resetGitConfig,exports.setupGit=git.setupGit,exports.setupGitConfig=git.setupGitConfig,exports.setupGitHooks=git.setupGitHooks,exports.validateCommitMessage=git.validateCommitMessage,exports.writeGitConfig=git.writeGitConfig,exports.init=init.init,exports.getProjectFiles=lint.getProjectFiles,exports.getStagedFiles=lint.getStagedFiles,exports.lintAll=lint.lintAll,exports.lintDependencies=lint.lintDependencies,exports.lintDocs=lint.lintDocs,exports.lintProject=lint.lintProject,exports.lintStaged=lint.lintStaged,exports.lintStructure=lint.lintStructure,exports.publishPackage=publish.publishPackage,exports.updatePackageVersion=version.updatePackageVersion,exports.fileExists=utils.fileExists,exports.getPackageManagerCommands=utils.getPackageManagerCommands,exports.loadConfig=utils.loadConfig,exports.Basis=Basis,exports.VALID_GIT_HOOKS=VALID_GIT_HOOKS,exports.createBasis=createBasis;
|
package/dist/index.d.cts
CHANGED
|
@@ -192,26 +192,13 @@ declare function removeGitHooks(cwd?: string, hooksToRemove?: string[], options?
|
|
|
192
192
|
* Initialize basis configuration in the current project
|
|
193
193
|
*/
|
|
194
194
|
declare function init(cwd?: string, options?: InitOptions): Promise<boolean>;
|
|
195
|
-
/**
|
|
196
|
-
* Preview generated configuration
|
|
197
|
-
*/
|
|
198
|
-
declare function previewBasisConfig(options?: {
|
|
199
|
-
enableStagedLinting?: boolean;
|
|
200
|
-
enableCommitMsgLinting?: boolean;
|
|
201
|
-
customLintPatterns?: string[];
|
|
202
|
-
customExcludePatterns?: string[];
|
|
203
|
-
}): string;
|
|
204
|
-
/**
|
|
205
|
-
* Create minimal configuration for quick setup
|
|
206
|
-
*/
|
|
207
|
-
declare function createMinimalConfig(): string;
|
|
208
195
|
|
|
209
196
|
/**
|
|
210
197
|
* Get staged files (only existing files, not deleted ones)
|
|
211
198
|
*/
|
|
212
199
|
declare function getStagedFiles(): string[];
|
|
213
200
|
/**
|
|
214
|
-
* Get all project files based on patterns
|
|
201
|
+
* Get all project files based on patterns using fast-glob
|
|
215
202
|
*/
|
|
216
203
|
declare function getProjectFiles(cwd: string, patterns?: string[], exclude?: string[]): Promise<string[]>;
|
|
217
204
|
/**
|
|
@@ -254,5 +241,12 @@ declare function loadConfig(options?: LoadConfigOptions<BasisConfig>): Promise<c
|
|
|
254
241
|
* Check if file or directory exists
|
|
255
242
|
*/
|
|
256
243
|
declare function fileExists(path: string): Promise<boolean>;
|
|
244
|
+
/**
|
|
245
|
+
* Get package manager specific commands
|
|
246
|
+
*/
|
|
247
|
+
declare function getPackageManagerCommands(packageManager: string): {
|
|
248
|
+
outdated: string;
|
|
249
|
+
audit: string;
|
|
250
|
+
};
|
|
257
251
|
|
|
258
|
-
export { Basis, BasisConfig, CommitMessage, GitConfig, GitConfigData, InitOptions, LintConfig, PublishOptions, PublishResult, VersionOptions, VersionUpdateResult, createBasis,
|
|
252
|
+
export { Basis, BasisConfig, CommitMessage, GitConfig, GitConfigData, InitOptions, LintConfig, PublishOptions, PublishResult, VersionOptions, VersionUpdateResult, createBasis, fileExists, getPackageManagerCommands, getProjectFiles, getStagedFiles, init, initGitRepo, lintAll, lintCommitMessage, lintDependencies, lintDocs, lintProject, lintStaged, lintStructure, loadConfig, parseCommitMessage, publishPackage, readGitConfig, removeGitHooks, resetGitConfig, setupGit, setupGitConfig, setupGitHooks, updatePackageVersion, validateCommitMessage, writeGitConfig };
|
package/dist/index.d.mts
CHANGED
|
@@ -192,26 +192,13 @@ declare function removeGitHooks(cwd?: string, hooksToRemove?: string[], options?
|
|
|
192
192
|
* Initialize basis configuration in the current project
|
|
193
193
|
*/
|
|
194
194
|
declare function init(cwd?: string, options?: InitOptions): Promise<boolean>;
|
|
195
|
-
/**
|
|
196
|
-
* Preview generated configuration
|
|
197
|
-
*/
|
|
198
|
-
declare function previewBasisConfig(options?: {
|
|
199
|
-
enableStagedLinting?: boolean;
|
|
200
|
-
enableCommitMsgLinting?: boolean;
|
|
201
|
-
customLintPatterns?: string[];
|
|
202
|
-
customExcludePatterns?: string[];
|
|
203
|
-
}): string;
|
|
204
|
-
/**
|
|
205
|
-
* Create minimal configuration for quick setup
|
|
206
|
-
*/
|
|
207
|
-
declare function createMinimalConfig(): string;
|
|
208
195
|
|
|
209
196
|
/**
|
|
210
197
|
* Get staged files (only existing files, not deleted ones)
|
|
211
198
|
*/
|
|
212
199
|
declare function getStagedFiles(): string[];
|
|
213
200
|
/**
|
|
214
|
-
* Get all project files based on patterns
|
|
201
|
+
* Get all project files based on patterns using fast-glob
|
|
215
202
|
*/
|
|
216
203
|
declare function getProjectFiles(cwd: string, patterns?: string[], exclude?: string[]): Promise<string[]>;
|
|
217
204
|
/**
|
|
@@ -254,5 +241,12 @@ declare function loadConfig(options?: LoadConfigOptions<BasisConfig>): Promise<c
|
|
|
254
241
|
* Check if file or directory exists
|
|
255
242
|
*/
|
|
256
243
|
declare function fileExists(path: string): Promise<boolean>;
|
|
244
|
+
/**
|
|
245
|
+
* Get package manager specific commands
|
|
246
|
+
*/
|
|
247
|
+
declare function getPackageManagerCommands(packageManager: string): {
|
|
248
|
+
outdated: string;
|
|
249
|
+
audit: string;
|
|
250
|
+
};
|
|
257
251
|
|
|
258
|
-
export { Basis, BasisConfig, CommitMessage, GitConfig, GitConfigData, InitOptions, LintConfig, PublishOptions, PublishResult, VersionOptions, VersionUpdateResult, createBasis,
|
|
252
|
+
export { Basis, BasisConfig, CommitMessage, GitConfig, GitConfigData, InitOptions, LintConfig, PublishOptions, PublishResult, VersionOptions, VersionUpdateResult, createBasis, fileExists, getPackageManagerCommands, getProjectFiles, getStagedFiles, init, initGitRepo, lintAll, lintCommitMessage, lintDependencies, lintDocs, lintProject, lintStaged, lintStructure, loadConfig, parseCommitMessage, publishPackage, readGitConfig, removeGitHooks, resetGitConfig, setupGit, setupGitConfig, setupGitHooks, updatePackageVersion, validateCommitMessage, writeGitConfig };
|
package/dist/index.d.ts
CHANGED
|
@@ -192,26 +192,13 @@ declare function removeGitHooks(cwd?: string, hooksToRemove?: string[], options?
|
|
|
192
192
|
* Initialize basis configuration in the current project
|
|
193
193
|
*/
|
|
194
194
|
declare function init(cwd?: string, options?: InitOptions): Promise<boolean>;
|
|
195
|
-
/**
|
|
196
|
-
* Preview generated configuration
|
|
197
|
-
*/
|
|
198
|
-
declare function previewBasisConfig(options?: {
|
|
199
|
-
enableStagedLinting?: boolean;
|
|
200
|
-
enableCommitMsgLinting?: boolean;
|
|
201
|
-
customLintPatterns?: string[];
|
|
202
|
-
customExcludePatterns?: string[];
|
|
203
|
-
}): string;
|
|
204
|
-
/**
|
|
205
|
-
* Create minimal configuration for quick setup
|
|
206
|
-
*/
|
|
207
|
-
declare function createMinimalConfig(): string;
|
|
208
195
|
|
|
209
196
|
/**
|
|
210
197
|
* Get staged files (only existing files, not deleted ones)
|
|
211
198
|
*/
|
|
212
199
|
declare function getStagedFiles(): string[];
|
|
213
200
|
/**
|
|
214
|
-
* Get all project files based on patterns
|
|
201
|
+
* Get all project files based on patterns using fast-glob
|
|
215
202
|
*/
|
|
216
203
|
declare function getProjectFiles(cwd: string, patterns?: string[], exclude?: string[]): Promise<string[]>;
|
|
217
204
|
/**
|
|
@@ -254,5 +241,12 @@ declare function loadConfig(options?: LoadConfigOptions<BasisConfig>): Promise<c
|
|
|
254
241
|
* Check if file or directory exists
|
|
255
242
|
*/
|
|
256
243
|
declare function fileExists(path: string): Promise<boolean>;
|
|
244
|
+
/**
|
|
245
|
+
* Get package manager specific commands
|
|
246
|
+
*/
|
|
247
|
+
declare function getPackageManagerCommands(packageManager: string): {
|
|
248
|
+
outdated: string;
|
|
249
|
+
audit: string;
|
|
250
|
+
};
|
|
257
251
|
|
|
258
|
-
export { Basis, BasisConfig, CommitMessage, GitConfig, GitConfigData, InitOptions, LintConfig, PublishOptions, PublishResult, VersionOptions, VersionUpdateResult, createBasis,
|
|
252
|
+
export { Basis, BasisConfig, CommitMessage, GitConfig, GitConfigData, InitOptions, LintConfig, PublishOptions, PublishResult, VersionOptions, VersionUpdateResult, createBasis, fileExists, getPackageManagerCommands, getProjectFiles, getStagedFiles, init, initGitRepo, lintAll, lintCommitMessage, lintDependencies, lintDocs, lintProject, lintStaged, lintStructure, loadConfig, parseCommitMessage, publishPackage, readGitConfig, removeGitHooks, resetGitConfig, setupGit, setupGitConfig, setupGitHooks, updatePackageVersion, validateCommitMessage, writeGitConfig };
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
export{defaultConfig,defineBasisConfig}from"./config.mjs";import{l as r,s as n,a as o,b as c,i as p,r as
|
|
1
|
+
export{defaultConfig,defineBasisConfig}from"./config.mjs";import{l as r,s as n,a as o,b as c,i as p,r as u,c as w}from"./shared/basis.DzMHJtq5.mjs";export{p as parseCommitMessage,d as readGitConfig,v as validateCommitMessage,w as writeGitConfig}from"./shared/basis.DzMHJtq5.mjs";import{i as g}from"./shared/basis.1ZgFrMJb.mjs";import{l as h,a as l,b as m,c as d,d as f,e as y}from"./shared/basis.DcC8NBqt.mjs";export{f as getProjectFiles,g as getStagedFiles}from"./shared/basis.DcC8NBqt.mjs";import{p as e}from"./shared/basis.plLH3j3N.mjs";import{u as i}from"./shared/basis.0WCUjjhy.mjs";import{l as C}from"./shared/basis.CkZpidFZ.mjs";export{f as fileExists,g as getPackageManagerCommands}from"./shared/basis.CkZpidFZ.mjs";import"node:child_process";import"node:fs/promises";import"c12/update";import"consola";import"defu";import"ini";import"pathe";import"magicast";import"nypm";import"pkg-types";import"fast-glob";import"micromatch";import"semver";import"c12";class G{config=null;cwd;constructor(t=process.cwd()){this.cwd=t}async getConfig(){if(!this.config){const{config:t}=await C({cwd:this.cwd});this.config=t}return this.config}async init(t={}){return await g(this.cwd,t)}async lintStaged(){const t=await this.getConfig();return await h(this.cwd,t.lint?.staged)}async lintProject(){const t=await this.getConfig();return await l(this.cwd,t.lint?.project)}async lintDependencies(){const t=await this.getConfig();return await m(this.cwd,t.lint?.dependencies)}async lintStructure(){const t=await this.getConfig();return await d(this.cwd,t.lint?.structure)}async lintDocs(){const t=await this.getConfig();return await f(this.cwd,t.lint?.docs)}async lintAll(){return await y(this.cwd)}async lintCommitMessage(){const t=await this.getConfig();return await r(this.cwd,t.git?.commitMsg)}async setupGitHooks(){const t=await this.getConfig();return await n(this.cwd,t.git?.hooks)}async setupGitConfig(){const t=await this.getConfig();return await o(this.cwd,t.git?.config)}async setupGit(){return await c(this.cwd)}async initGitRepo(){return await p(this.cwd)}async removeGitHooks(t=!1){return await u(this.cwd,void 0,{updateConfig:t})}async resetGitConfig(t=!0,s=!1){return await w(this.cwd,t,{updateConfig:s})}async updateVersion(t={}){return await i(this.cwd,t)}async setVersion(t){return await i(this.cwd,{version:t})}async patchVersion(){return await i(this.cwd,{})}async minorVersion(){return await i(this.cwd,{minor:!0})}async majorVersion(){return await i(this.cwd,{major:!0})}async prereleaseVersion(t){return await i(this.cwd,{prerelease:!0,preid:t})}async publish(t={}){return await e(this.cwd,t)}async publishDryRun(t={}){return await e(this.cwd,{...t,dryRun:!0})}async publishToTag(t,s={}){return await e(this.cwd,{...s,tag:t})}async publishStable(t={}){return await e(this.cwd,{...t,stable:!0})}getCwd(){return this.cwd}setCwd(t){this.cwd=t,this.config=null}async reloadConfig(){return this.config=null,await this.getConfig()}async setup(t={}){return await this.init(t)?await this.setupGit():!1}async release(t={},s={}){if(!await this.lintAll())throw new Error("Lint checks failed. Fix issues before releasing.");const b=await this.updateVersion(t),k=await this.publish(s);return{version:b,publish:k}}}function v(a=process.cwd()){return new G(a)}const V=["applypatch-msg","pre-applypatch","post-applypatch","pre-commit","pre-merge-commit","prepare-commit-msg","commit-msg","post-commit","pre-rebase","post-checkout","post-merge","pre-push","pre-receive","update","proc-receive","post-receive","post-update","reference-transaction","push-to-checkout","pre-auto-gc","post-rewrite","sendemail-validate","fsmonitor-watchman","p4-changelist","p4-prepare-changelist","p4-post-changelist","p4-pre-submit","post-index-change"];export{G as Basis,V as VALID_GIT_HOOKS,v as createBasis,g as init,p as initGitRepo,y as lintAll,r as lintCommitMessage,m as lintDependencies,f as lintDocs,l as lintProject,h as lintStaged,d as lintStructure,C as loadConfig,e as publishPackage,u as removeGitHooks,w as resetGitConfig,c as setupGit,o as setupGitConfig,n as setupGitHooks,i as updatePackageVersion};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{execSync as g}from"node:child_process";import{consola as s}from"consola";import{readPackageJSON as v,resolvePackageJSON as f,writePackageJSON as h}from"pkg-types";import m from"semver";import{l as $}from"./basis.
|
|
1
|
+
import{execSync as g}from"node:child_process";import{consola as s}from"consola";import{readPackageJSON as v,resolvePackageJSON as f,writePackageJSON as h}from"pkg-types";import m from"semver";import{l as $}from"./basis.CkZpidFZ.mjs";async function P(r,o={}){const{config:u}=await $({cwd:r}),i=u.version||{},d=await v(r),t=d.version;if(!t)throw new Error("No version found in package.json");const n=o.version?m.valid(o.version)?o.version:(()=>{throw new Error(`Invalid version format: ${o.version}`)})():(()=>{if(!m.valid(t))throw new Error(`Invalid current version format: ${t}`);const e=m.prerelease(t),c=o.preid||(e&&typeof e[0]=="string"?e[0]:null)||i.prereleaseId||"edge";let a;o.major?a="major":o.minor?a="minor":o.prerelease?a=e?"prerelease":"prepatch":a=e?"prerelease":"patch";const l=a==="prerelease"||a.startsWith("pre")?m.inc(t,a,c):m.inc(t,a);if(!l)throw new Error("Failed to calculate new version");return l})();s.info(`Updating version: ${t} \u2192 ${n}`);const w=await f(r);await h(w,{...d,version:n});const p={oldVersion:t,newVersion:n};if(i.autoCommit){const e=o.message||i.commitMessage?.replace("{version}",n)||`chore: release v${n}`;try{g("git add package.json",{cwd:r}),g(`git commit -m "${e}"`,{cwd:r}),s.success(`Committed version update: ${e}`)}catch(c){s.warn("Failed to commit changes:",c)}}if(i.autoTag){const e=`${i.tagPrefix||"v"}${n}`;try{g(`git tag ${e}`,{cwd:r}),s.success(`Created git tag: ${e}`),p.tagName=e}catch(c){s.warn("Failed to create git tag:",c)}}if(i.autoPush)try{g("git push",{cwd:r}),i.autoTag&&g("git push --tags",{cwd:r}),s.success("Pushed changes to remote")}catch(e){s.warn("Failed to push changes:",e)}return p}export{P as u};
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import{updateConfig as k}from"c12/update";import{consola as s}from"consola";import{parseModule as C,builders as b,generateCode as j}from"magicast";import{detectPackageManager as x,addDevDependency as v,installDependencies as D}from"nypm";import{resolve as c}from"pathe";import{readPackageJSON as w,writePackageJSON as B}from"pkg-types";import{f as l}from"./basis.CkZpidFZ.mjs";import{b as S}from"./basis.DzMHJtq5.mjs";const n={ts:{ext:"ts",label:"TypeScript"},mjs:{ext:"mjs",label:"ES Module"},cjs:{ext:"cjs",label:"CommonJS"}};function G(i){const t=C("");if(i==="cjs"){t.imports.$prepend({from:"@funish/basis",imported:"defineBasisConfig",local:"defineBasisConfig"}),t.exports.default=b.functionCall("defineBasisConfig",{});const o=t.exports.default.$args[0];o.$ast.leadingComments=[{type:"Block",value:`
|
|
2
|
+
Configure your project here
|
|
3
|
+
See: https://github.com/funish/basis/tree/main/packages/basis#configuration
|
|
4
|
+
`}]}else{t.imports.$prepend({from:"@funish/basis",imported:"defineBasisConfig",local:"defineBasisConfig"}),t.exports.default=b.functionCall("defineBasisConfig",{});const o=t.exports.default.$args[0];o.$ast.leadingComments=[{type:"Block",value:`
|
|
5
|
+
Configure your project here
|
|
6
|
+
See: https://github.com/funish/basis/tree/main/packages/basis#configuration
|
|
7
|
+
`}]}return j(t).code}async function z(i){if(await l(c(i,"tsconfig.json")))return"ts";try{if((await w(i)).type==="module")return"mjs"}catch{}return"ts"}async function E(i=process.cwd(),t={}){const{force:o=!1,skipGitCheck:$=!1,skipInstall:f=!1}=t;s.start("Initializing basis configuration...");const p=await z(i),m=await s.prompt("Choose config file format:",{type:"select",initial:p,options:[{value:"ts",label:`${n.ts.label} (${n.ts.ext}) ${p==="ts"?"(recommended)":""}`},{value:"mjs",label:`${n.mjs.label} (${n.mjs.ext}) ${p==="mjs"?"(recommended)":""}`},{value:"cjs",label:`${n.cjs.label} (${n.cjs.ext}) ${p==="cjs"?"(recommended)":""}`}]}),g=n[m].ext,r=`basis.config.${g}`,y=c(i,r);if(await l(y)&&!o)return s.error(`${r} already exists. Use --force to overwrite.`),!1;let d=!1;if(!$){if(await l(c(i,".git")))d=await s.prompt("Setup Git hooks and configuration?",{type:"confirm",initial:!0});else if(s.warn("No .git directory found. Git hooks will not work properly."),!await s.prompt("Continue anyway?",{type:"confirm",initial:!1}))return s.info("Initialization cancelled."),!1}const u=(await x(i))?.name||"npm";s.info(`Detected package manager: ${u}`),await k({cwd:i,configFile:"basis.config",createExtension:g,onCreate:()=>(s.info(`Creating ${r}...`),G(m))}),s.success(`Created ${r}`);try{const e=await w(i),h=!!(e.workspaces||await l(c(i,"pnpm-workspace.yaml")));f?!e.devDependencies?.["@funish/basis"]&&!e.dependencies?.["@funish/basis"]&&(e.devDependencies=e.devDependencies||{},e.devDependencies["@funish/basis"]="latest",s.info("Added @funish/basis to devDependencies")):(await v("@funish/basis",{cwd:i,silent:!1,workspace:h}),s.success("Added @funish/basis to devDependencies"));const a="basis git --setup";e.scripts=e.scripts||{},u==="pnpm"?e.scripts.postinstall?e.scripts.postinstall.includes(a)||(e.scripts.postinstall=`${e.scripts.postinstall} && ${a}`):e.scripts.postinstall=a:u==="yarn"?e.scripts.prepare?e.scripts.prepare.includes(a)||(e.scripts.prepare=`${e.scripts.prepare} && ${a}`):e.scripts.prepare=a:e.scripts.postinstall?e.scripts.postinstall.includes(a)||(e.scripts.postinstall=`${e.scripts.postinstall} && ${a}`):e.scripts.postinstall=a,await B(c(i,"package.json"),e),s.success(`Updated package.json scripts${f?" and dependencies":""}`),f?(s.info("Skipped dependency installation"),s.info("Run your package manager's install command to complete setup")):(s.start("Installing dependencies..."),await D({cwd:i,silent:!1}),s.success("Dependencies installed successfully"))}catch(e){return s.error("Failed to setup dependencies:",e),!1}return d&&(s.start("Setting up Git hooks and configuration..."),await S(i)?s.success("Git setup completed!"):s.warn("Git setup failed, but basis config was created successfully")),s.success("Basis initialization completed!"),s.info("You can now:"),s.info(` - Edit ${r} to customize your configuration`),d||s.info(" - Run `basis git --setup` to install git hooks"),!0}export{E as i};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const node_child_process=require("node:child_process"),consola=require("consola"),nypm=require("nypm"),pkgTypes=require("pkg-types"),g=require("semver"),utils=require("./basis.BJhSbOyA.cjs");function _interopDefaultCompat(a){return a&&typeof a=="object"&&"default"in a?a.default:a}const g__default=_interopDefaultCompat(g);async function k(a,e,o){if(e.checkGitClean&&!o.skipTests)try{if(node_child_process.execSync("git status --porcelain",{cwd:a,encoding:"utf8"}).trim())throw new Error("Working directory is not clean. Commit your changes first.")}catch(s){consola.consola.warn("Could not check git status:",s)}if(e.checkTests&&!o.skipTests){consola.consola.start("Running tests...");try{e.testCommand?node_child_process.execSync(e.testCommand,{cwd:a,stdio:"inherit"}):await nypm.runScript("test",{cwd:a,silent:!1}),consola.consola.success("Tests passed")}catch(s){throw consola.consola.error("Tests failed"),s}}if(e.buildCommand&&!o.skipBuild){consola.consola.start("Building package...");try{e.buildCommand.includes(" ")?node_child_process.execSync(e.buildCommand,{cwd:a,stdio:"inherit"}):await nypm.runScript(e.buildCommand,{cwd:a,silent:!1}),consola.consola.success("Build completed")}catch(s){throw consola.consola.error("Build failed"),s}}}async function C(a,e){if(e.autoGitPush)try{node_child_process.execSync("git push",{cwd:a}),e.createGitTag&&node_child_process.execSync("git push --tags",{cwd:a}),consola.consola.success("Pushed changes to remote")}catch(o){consola.consola.warn("Failed to push changes:",o)}}async function publishPackage(a,e={}){const{config:o}=await utils.loadConfig({cwd:a}),s=o.publish||{},p=await pkgTypes.readPackageJSON(a),{name:i,version:c}=p;if(!i||!c)throw new Error("Missing name or version in package.json");if(!g__default.valid(c))throw new Error(`Invalid version format in package.json: ${c}`);const u=await nypm.detectPackageManager(a),l=u?.command||"npm";await k(a,s,e);let n;if(e.tag)n=e.tag;else if(e.stable||e.latest)n=s.stableTag||"latest";else if(g__default.prerelease(c)){const t=g__default.prerelease(c);n=t&&t[0]||s.defaultTag||"edge"}else n=s.stableTag||"latest";consola.consola.info(`Publishing ${i}@${c} to tag: ${n}`);const d=["publish","--tag",n,"--access",e.access||s.access||"public"];(e.registry||s.registry)&&d.push("--registry",e.registry||s.registry||""),e.dryRun&&d.push("--dry-run");const h=`${l} ${d.join(" ")}`;consola.consola.start("Publishing package...");try{if(node_child_process.execSync(h,{cwd:a,stdio:"inherit"}),e.dryRun)consola.consola.success("Dry run completed successfully");else{consola.consola.success(`Published ${i}@${c} to ${n}`);const t=s.defaultTag||"edge";if(n!==t){consola.consola.start(`Also publishing to ${t} tag...`);try{let r;u?.name==="yarn"?r=`${l} tag add ${i}@${c} ${t}`:r=`${l} dist-tag add ${i}@${c} ${t}`,node_child_process.execSync(r,{cwd:a,stdio:"inherit"}),consola.consola.success(`Also published ${i}@${c} to ${t}`)}catch(r){consola.consola.warn(`Failed to add ${t} tag:`,r)}}await C(a,s)}return{packageName:i,version:c,publishTag:n,dryRun:e.dryRun||!1}}catch(t){throw consola.consola.error("Failed to publish package:",t),t}}exports.publishPackage=publishPackage;
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";const node_child_process=require("node:child_process"),consola=require("consola"),P=require("fast-glob"),$=require("micromatch"),nypm=require("nypm"),pathe=require("pathe"),pkgTypes=require("pkg-types"),utils=require("./basis.BJhSbOyA.cjs");function _interopDefaultCompat(e){return e&&typeof e=="object"&&"default"in e?e.default:e}const P__default=_interopDefaultCompat(P),$__default=_interopDefaultCompat($);function getStagedFiles(){try{const e=node_child_process.execSync("git diff --cached --name-only",{encoding:"utf8"}).trim().split(`
|
|
2
|
+
`).filter(Boolean),i=node_child_process.execSync("git diff --cached --name-only --diff-filter=D",{encoding:"utf8"}),s=new Set(i.trim().split(`
|
|
3
|
+
`).filter(Boolean));return e.filter(n=>!s.has(n))}catch{return[]}}async function getProjectFiles(e,i=["**/*"],s=["node_modules/**","dist/**","build/**",".git/**"]){try{return await P__default(i,{cwd:e,ignore:s,onlyFiles:!0,dot:!1,absolute:!1})}catch(n){return consola.consola.warn("Failed to scan project files:",n),[]}}async function lintStaged(e=process.cwd(),i){const{config:s}=await utils.loadConfig({cwd:e,overrides:i?{lint:{staged:i}}:void 0}),n=s.lint?.staged||{},c=getStagedFiles();if(c.length===0)return consola.consola.info("No staged files to lint"),!0;if(Object.keys(n).length===0)return consola.consola.warn("No staged lint configuration found"),!0;let o=!1;const t=new Set;for(const[d,u]of Object.entries(n)){const r=c.filter(l=>!t.has(l)&&$__default.isMatch(l.split("/").pop()||l,d));if(r.length!==0){consola.consola.start(`Linting ${r.length} files: ${d}`);try{const l=`${u} ${r.join(" ")}`;node_child_process.execSync(l,{stdio:"inherit",cwd:e});const f=[];for(const a of r)await utils.fileExists(pathe.resolve(e,a))&&f.push(a);f.length>0&&node_child_process.execSync(`git add ${f.join(" ")}`,{stdio:"inherit",cwd:e}),r.forEach(a=>t.add(a)),consola.consola.success(`${d}`)}catch(l){o=!0,consola.consola.error(`${d} failed:`,l)}}}return!o}async function lintProject(e=process.cwd(),i){const{config:s}=await utils.loadConfig({cwd:e,overrides:i?{lint:{project:i}}:void 0}),n=s.lint?.project||{};if(Object.keys(n).length===0)return consola.consola.warn("No project lint configuration found"),!0;consola.consola.start("Running project-wide linting...");let c=!1;for(const[o,t]of Object.entries(n)){consola.consola.start(`Running project lint: ${o}`);try{node_child_process.execSync(t,{stdio:"inherit",cwd:e}),consola.consola.success(`${o}`)}catch(d){c=!0,consola.consola.error(`${o} failed:`,d)}}return!c}async function lintDependencies(e=process.cwd(),i){const{config:s}=await utils.loadConfig({cwd:e,overrides:i?{lint:{dependencies:i}}:void 0}),n=s.lint?.dependencies||{};let c=!1;try{const o=await pkgTypes.readPackageJSON(e),t={...o.dependencies,...o.devDependencies},d=(await nypm.detectPackageManager(e))?.name||"npm",u=utils.getPackageManagerCommands(d);if(consola.consola.start("Checking dependencies..."),n.blockedPackages&&n.blockedPackages.length>0){const r=Object.keys(t).filter(l=>n.blockedPackages?.includes(l));r.length>0?(consola.consola.error(`Blocked packages found: ${r.join(", ")}`),c=!0):consola.consola.success("No blocked packages found")}if(n.checkOutdated)try{node_child_process.execSync(u.outdated,{cwd:e,stdio:"pipe"}),consola.consola.success("All dependencies are up to date")}catch(r){consola.consola.warn("\u26A0 Some dependencies are outdated:",r)}if(n.checkSecurity)try{node_child_process.execSync(u.audit,{cwd:e,stdio:"pipe"}),consola.consola.success("No security vulnerabilities found")}catch(r){consola.consola.error("Security vulnerabilities detected:",r),c=!0}n.allowedLicenses&&n.allowedLicenses.length>0&&consola.consola.info("\u{1F4DD} License checking requires manual review or additional tooling")}catch(o){consola.consola.error("Failed to check dependencies:",o),c=!0}return!c}async function lintStructure(e=process.cwd(),i){const{config:s}=await utils.loadConfig({cwd:e,overrides:i?{lint:{structure:i}}:void 0}),n=s.lint?.structure||{};let c=!1;if(consola.consola.start("Checking project structure..."),n.requiredFiles)for(const o of n.requiredFiles){const t=pathe.resolve(e,o);await utils.fileExists(t)?consola.consola.success(`Required file found: ${o}`):(consola.consola.error(`Required file missing: ${o}`),c=!0)}if(n.requiredDirs)for(const o of n.requiredDirs){const t=pathe.resolve(e,o);await utils.fileExists(t)?consola.consola.success(`Required directory found: ${o}`):(consola.consola.error(`Required directory missing: ${o}`),c=!0)}if(n.naming&&n.naming.length>0)for(const o of n.naming){const{path:t,files:d,directories:u,description:r}=o;consola.consola.start(`Checking naming rule: ${r||t}`);const l=await getProjectFiles(e,[t]);if(d){const f=new RegExp(d),a=l.filter(p=>{const g=p.split("/").pop()||"";return!f.test(g)});a.length>0?(consola.consola.error(`Files with invalid naming in ${t}: ${a.slice(0,3).join(", ")}${a.length>3?"...":""}`),c=!0):l.length>0&&consola.consola.success(`All files in ${t} follow naming convention`)}if(u){const f=new RegExp(u),a=new Set;l.forEach(g=>{const h=g.split("/");h.pop(),h.forEach(w=>a.add(w))});const p=Array.from(a).filter(g=>!f.test(g));p.length>0?(consola.consola.error(`Directories with invalid naming in ${t}: ${p.slice(0,3).join(", ")}`),c=!0):a.size>0&&consola.consola.success(`All directories in ${t} follow naming convention`)}}return!c}async function lintDocs(e=process.cwd(),i){const{config:s}=await utils.loadConfig({cwd:e,overrides:i?{lint:{docs:i}}:void 0}),n=s.lint?.docs||{};let c=!1;if(consola.consola.start("Checking documentation..."),n.checkReadme!==!1){const o=["README.md","README.rst","README.txt","readme.md"];(await Promise.all(o.map(t=>utils.fileExists(pathe.resolve(e,t))))).some(t=>t)?consola.consola.success("README file found"):(consola.consola.error("No README file found"),c=!0)}if(n.checkChangelog){const o=["CHANGELOG.md","CHANGELOG.rst","HISTORY.md","changelog.md"];(await Promise.all(o.map(t=>utils.fileExists(pathe.resolve(e,t))))).some(t=>t)?consola.consola.success("CHANGELOG file found"):(consola.consola.error("No CHANGELOG file found"),c=!0)}return!c}async function lintAll(e=process.cwd()){const{config:i}=await utils.loadConfig({cwd:e}),s=i.lint||{};consola.consola.start("Running comprehensive project lint...");const n=(await Promise.allSettled([lintProject(e,s.project),lintDependencies(e,s.dependencies),lintStructure(e,s.structure),lintDocs(e,s.docs)])).filter(c=>c.status==="rejected"||c.status==="fulfilled"&&!c.value);return n.length===0?(consola.consola.success("All lint checks passed!"),!0):(consola.consola.error(`${n.length} lint check(s) failed`),!1)}exports.getProjectFiles=getProjectFiles,exports.getStagedFiles=getStagedFiles,exports.lintAll=lintAll,exports.lintDependencies=lintDependencies,exports.lintDocs=lintDocs,exports.lintProject=lintProject,exports.lintStaged=lintStaged,exports.lintStructure=lintStructure;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";const promises=require("node:fs/promises"),c12=require("c12"),config=require("../config.cjs");async function loadConfig(e={}){return await c12.loadConfig({name:"basis",cwd:process.cwd(),...e,defaults:{...config.defaultConfig,...e.defaults}})}async function fileExists(e){try{return await promises.access(e),!0}catch{return!1}}function getPackageManagerCommands(e){switch(e){case"yarn":return{outdated:"yarn outdated --json",audit:"yarn audit --level moderate"};case"pnpm":return{outdated:"pnpm outdated --format table",audit:"pnpm audit --audit-level moderate"};case"bun":return{outdated:"bun outdated",audit:"bun audit --audit-level moderate"};default:return{outdated:"npm outdated --json",audit:"npm audit --audit-level moderate"}}}exports.fileExists=fileExists,exports.getPackageManagerCommands=getPackageManagerCommands,exports.loadConfig=loadConfig;
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
"use strict";const update=require("c12/update"),consola=require("consola"),magicast=require("magicast"),nypm=require("nypm"),pathe=require("pathe"),pkgTypes=require("pkg-types"),utils=require("./basis.BJhSbOyA.cjs"),git=require("./basis.sOTOmfHG.cjs"),o={ts:{ext:"ts",label:"TypeScript"},mjs:{ext:"mjs",label:"ES Module"},cjs:{ext:"cjs",label:"CommonJS"}};function D(e){const i=magicast.parseModule("");if(e==="cjs"){i.imports.$prepend({from:"@funish/basis",imported:"defineBasisConfig",local:"defineBasisConfig"}),i.exports.default=magicast.builders.functionCall("defineBasisConfig",{});const t=i.exports.default.$args[0];t.$ast.leadingComments=[{type:"Block",value:`
|
|
2
|
+
Configure your project here
|
|
3
|
+
See: https://github.com/funish/basis/tree/main/packages/basis#configuration
|
|
4
|
+
`}]}else{i.imports.$prepend({from:"@funish/basis",imported:"defineBasisConfig",local:"defineBasisConfig"}),i.exports.default=magicast.builders.functionCall("defineBasisConfig",{});const t=i.exports.default.$args[0];t.$ast.leadingComments=[{type:"Block",value:`
|
|
5
|
+
Configure your project here
|
|
6
|
+
See: https://github.com/funish/basis/tree/main/packages/basis#configuration
|
|
7
|
+
`}]}return magicast.generateCode(i).code}async function B(e){if(await utils.fileExists(pathe.resolve(e,"tsconfig.json")))return"ts";try{if((await pkgTypes.readPackageJSON(e)).type==="module")return"mjs"}catch{}return"ts"}async function init(e=process.cwd(),i={}){const{force:t=!1,skipGitCheck:f=!1,skipInstall:l=!1}=i;consola.consola.start("Initializing basis configuration...");const c=await B(e),d=await consola.consola.prompt("Choose config file format:",{type:"select",initial:c,options:[{value:"ts",label:`${o.ts.label} (${o.ts.ext}) ${c==="ts"?"(recommended)":""}`},{value:"mjs",label:`${o.mjs.label} (${o.mjs.ext}) ${c==="mjs"?"(recommended)":""}`},{value:"cjs",label:`${o.cjs.label} (${o.cjs.ext}) ${c==="cjs"?"(recommended)":""}`}]}),u=o[d].ext,n=`basis.config.${u}`,g=pathe.resolve(e,n);if(await utils.fileExists(g)&&!t)return consola.consola.error(`${n} already exists. Use --force to overwrite.`),!1;let r=!1;if(!f){if(await utils.fileExists(pathe.resolve(e,".git")))r=await consola.consola.prompt("Setup Git hooks and configuration?",{type:"confirm",initial:!0});else if(consola.consola.warn("No .git directory found. Git hooks will not work properly."),!await consola.consola.prompt("Continue anyway?",{type:"confirm",initial:!1}))return consola.consola.info("Initialization cancelled."),!1}const p=(await nypm.detectPackageManager(e))?.name||"npm";consola.consola.info(`Detected package manager: ${p}`),await update.updateConfig({cwd:e,configFile:"basis.config",createExtension:u,onCreate:()=>(consola.consola.info(`Creating ${n}...`),D(d))}),consola.consola.success(`Created ${n}`);try{const s=await pkgTypes.readPackageJSON(e),m=!!(s.workspaces||await utils.fileExists(pathe.resolve(e,"pnpm-workspace.yaml")));l?!s.devDependencies?.["@funish/basis"]&&!s.dependencies?.["@funish/basis"]&&(s.devDependencies=s.devDependencies||{},s.devDependencies["@funish/basis"]="latest",consola.consola.info("Added @funish/basis to devDependencies")):(await nypm.addDevDependency("@funish/basis",{cwd:e,silent:!1,workspace:m}),consola.consola.success("Added @funish/basis to devDependencies"));const a="basis git --setup";s.scripts=s.scripts||{},p==="pnpm"?s.scripts.postinstall?s.scripts.postinstall.includes(a)||(s.scripts.postinstall=`${s.scripts.postinstall} && ${a}`):s.scripts.postinstall=a:p==="yarn"?s.scripts.prepare?s.scripts.prepare.includes(a)||(s.scripts.prepare=`${s.scripts.prepare} && ${a}`):s.scripts.prepare=a:s.scripts.postinstall?s.scripts.postinstall.includes(a)||(s.scripts.postinstall=`${s.scripts.postinstall} && ${a}`):s.scripts.postinstall=a,await pkgTypes.writePackageJSON(pathe.resolve(e,"package.json"),s),consola.consola.success(`Updated package.json scripts${l?" and dependencies":""}`),l?(consola.consola.info("Skipped dependency installation"),consola.consola.info("Run your package manager's install command to complete setup")):(consola.consola.start("Installing dependencies..."),await nypm.installDependencies({cwd:e,silent:!1}),consola.consola.success("Dependencies installed successfully"))}catch(s){return consola.consola.error("Failed to setup dependencies:",s),!1}return r&&(consola.consola.start("Setting up Git hooks and configuration..."),await git.setupGit(e)?consola.consola.success("Git setup completed!"):consola.consola.warn("Git setup failed, but basis config was created successfully")),consola.consola.success("Basis initialization completed!"),consola.consola.info("You can now:"),consola.consola.info(` - Edit ${n} to customize your configuration`),r||consola.consola.info(" - Run `basis git --setup` to install git hooks"),!0}exports.init=init;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";const node_child_process=require("node:child_process"),consola=require("consola"),pkgTypes=require("pkg-types"),g=require("semver"),utils=require("./basis.
|
|
1
|
+
"use strict";const node_child_process=require("node:child_process"),consola=require("consola"),pkgTypes=require("pkg-types"),g=require("semver"),utils=require("./basis.BJhSbOyA.cjs");function _interopDefaultCompat(e){return e&&typeof e=="object"&&"default"in e?e.default:e}const g__default=_interopDefaultCompat(g);async function updatePackageVersion(e,t={}){const{config:u}=await utils.loadConfig({cwd:e}),r=u.version||{},i=await pkgTypes.readPackageJSON(e),s=i.version;if(!s)throw new Error("No version found in package.json");const c=t.version?g__default.valid(t.version)?t.version:(()=>{throw new Error(`Invalid version format: ${t.version}`)})():(()=>{if(!g__default.valid(s))throw new Error(`Invalid current version format: ${s}`);const o=g__default.prerelease(s),n=t.preid||(o&&typeof o[0]=="string"?o[0]:null)||r.prereleaseId||"edge";let a;t.major?a="major":t.minor?a="minor":t.prerelease?a=o?"prerelease":"prepatch":a=o?"prerelease":"patch";const d=a==="prerelease"||a.startsWith("pre")?g__default.inc(s,a,n):g__default.inc(s,a);if(!d)throw new Error("Failed to calculate new version");return d})();consola.consola.info(`Updating version: ${s} \u2192 ${c}`);const p=await pkgTypes.resolvePackageJSON(e);await pkgTypes.writePackageJSON(p,{...i,version:c});const l={oldVersion:s,newVersion:c};if(r.autoCommit){const o=t.message||r.commitMessage?.replace("{version}",c)||`chore: release v${c}`;try{node_child_process.execSync("git add package.json",{cwd:e}),node_child_process.execSync(`git commit -m "${o}"`,{cwd:e}),consola.consola.success(`Committed version update: ${o}`)}catch(n){consola.consola.warn("Failed to commit changes:",n)}}if(r.autoTag){const o=`${r.tagPrefix||"v"}${c}`;try{node_child_process.execSync(`git tag ${o}`,{cwd:e}),consola.consola.success(`Created git tag: ${o}`),l.tagName=o}catch(n){consola.consola.warn("Failed to create git tag:",n)}}if(r.autoPush)try{node_child_process.execSync("git push",{cwd:e}),r.autoTag&&node_child_process.execSync("git push --tags",{cwd:e}),consola.consola.success("Pushed changes to remote")}catch(o){consola.consola.warn("Failed to push changes:",o)}return l}exports.updatePackageVersion=updatePackageVersion;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{access as t}from"node:fs/promises";import{loadConfig as e}from"c12";import{defaultConfig as d}from"../config.mjs";async function u(a={}){return await e({name:"basis",cwd:process.cwd(),...a,defaults:{...d,...a.defaults}})}async function n(a){try{return await t(a),!0}catch{return!1}}function o(a){switch(a){case"yarn":return{outdated:"yarn outdated --json",audit:"yarn audit --level moderate"};case"pnpm":return{outdated:"pnpm outdated --format table",audit:"pnpm audit --audit-level moderate"};case"bun":return{outdated:"bun outdated",audit:"bun audit --audit-level moderate"};default:return{outdated:"npm outdated --json",audit:"npm audit --audit-level moderate"}}}export{n as f,o as g,u as l};
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
import{execSync as p}from"node:child_process";import{consola as e}from"consola";import S from"fast-glob";import N from"micromatch";import{detectPackageManager as O}from"nypm";import{resolve as w}from"pathe";import{readPackageJSON as P}from"pkg-types";import{l as h,f as k,g as C}from"./basis.CkZpidFZ.mjs";function j(){try{const t=p("git diff --cached --name-only",{encoding:"utf8"}).trim().split(`
|
|
2
|
+
`).filter(Boolean),o=p("git diff --cached --name-only --diff-filter=D",{encoding:"utf8"}),s=new Set(o.trim().split(`
|
|
3
|
+
`).filter(Boolean));return t.filter(i=>!s.has(i))}catch{return[]}}async function v(t,o=["**/*"],s=["node_modules/**","dist/**","build/**",".git/**"]){try{return await S(o,{cwd:t,ignore:s,onlyFiles:!0,dot:!1,absolute:!1})}catch(i){return e.warn("Failed to scan project files:",i),[]}}async function q(t=process.cwd(),o){const{config:s}=await h({cwd:t,overrides:o?{lint:{staged:o}}:void 0}),i=s.lint?.staged||{},c=j();if(c.length===0)return e.info("No staged files to lint"),!0;if(Object.keys(i).length===0)return e.warn("No staged lint configuration found"),!0;let n=!1;const r=new Set;for(const[f,u]of Object.entries(i)){const a=c.filter(l=>!r.has(l)&&N.isMatch(l.split("/").pop()||l,f));if(a.length!==0){e.start(`Linting ${a.length} files: ${f}`);try{const l=`${u} ${a.join(" ")}`;p(l,{stdio:"inherit",cwd:t});const g=[];for(const d of a)await k(w(t,d))&&g.push(d);g.length>0&&p(`git add ${g.join(" ")}`,{stdio:"inherit",cwd:t}),a.forEach(d=>r.add(d)),e.success(`${f}`)}catch(l){n=!0,e.error(`${f} failed:`,l)}}}return!n}async function E(t=process.cwd(),o){const{config:s}=await h({cwd:t,overrides:o?{lint:{project:o}}:void 0}),i=s.lint?.project||{};if(Object.keys(i).length===0)return e.warn("No project lint configuration found"),!0;e.start("Running project-wide linting...");let c=!1;for(const[n,r]of Object.entries(i)){e.start(`Running project lint: ${n}`);try{p(r,{stdio:"inherit",cwd:t}),e.success(`${n}`)}catch(f){c=!0,e.error(`${n} failed:`,f)}}return!c}async function A(t=process.cwd(),o){const{config:s}=await h({cwd:t,overrides:o?{lint:{dependencies:o}}:void 0}),i=s.lint?.dependencies||{};let c=!1;try{const n=await P(t),r={...n.dependencies,...n.devDependencies},f=(await O(t))?.name||"npm",u=C(f);if(e.start("Checking dependencies..."),i.blockedPackages&&i.blockedPackages.length>0){const a=Object.keys(r).filter(l=>i.blockedPackages?.includes(l));a.length>0?(e.error(`Blocked packages found: ${a.join(", ")}`),c=!0):e.success("No blocked packages found")}if(i.checkOutdated)try{p(u.outdated,{cwd:t,stdio:"pipe"}),e.success("All dependencies are up to date")}catch(a){e.warn("\u26A0 Some dependencies are outdated:",a)}if(i.checkSecurity)try{p(u.audit,{cwd:t,stdio:"pipe"}),e.success("No security vulnerabilities found")}catch(a){e.error("Security vulnerabilities detected:",a),c=!0}i.allowedLicenses&&i.allowedLicenses.length>0&&e.info("\u{1F4DD} License checking requires manual review or additional tooling")}catch(n){e.error("Failed to check dependencies:",n),c=!0}return!c}async function R(t=process.cwd(),o){const{config:s}=await h({cwd:t,overrides:o?{lint:{structure:o}}:void 0}),i=s.lint?.structure||{};let c=!1;if(e.start("Checking project structure..."),i.requiredFiles)for(const n of i.requiredFiles){const r=w(t,n);await k(r)?e.success(`Required file found: ${n}`):(e.error(`Required file missing: ${n}`),c=!0)}if(i.requiredDirs)for(const n of i.requiredDirs){const r=w(t,n);await k(r)?e.success(`Required directory found: ${n}`):(e.error(`Required directory missing: ${n}`),c=!0)}if(i.naming&&i.naming.length>0)for(const n of i.naming){const{path:r,files:f,directories:u,description:a}=n;e.start(`Checking naming rule: ${a||r}`);const l=await v(t,[r]);if(f){const g=new RegExp(f),d=l.filter(y=>{const m=y.split("/").pop()||"";return!g.test(m)});d.length>0?(e.error(`Files with invalid naming in ${r}: ${d.slice(0,3).join(", ")}${d.length>3?"...":""}`),c=!0):l.length>0&&e.success(`All files in ${r} follow naming convention`)}if(u){const g=new RegExp(u),d=new Set;l.forEach(m=>{const $=m.split("/");$.pop(),$.forEach(D=>d.add(D))});const y=Array.from(d).filter(m=>!g.test(m));y.length>0?(e.error(`Directories with invalid naming in ${r}: ${y.slice(0,3).join(", ")}`),c=!0):d.size>0&&e.success(`All directories in ${r} follow naming convention`)}}return!c}async function b(t=process.cwd(),o){const{config:s}=await h({cwd:t,overrides:o?{lint:{docs:o}}:void 0}),i=s.lint?.docs||{};let c=!1;if(e.start("Checking documentation..."),i.checkReadme!==!1){const n=["README.md","README.rst","README.txt","readme.md"];(await Promise.all(n.map(r=>k(w(t,r))))).some(r=>r)?e.success("README file found"):(e.error("No README file found"),c=!0)}if(i.checkChangelog){const n=["CHANGELOG.md","CHANGELOG.rst","HISTORY.md","changelog.md"];(await Promise.all(n.map(r=>k(w(t,r))))).some(r=>r)?e.success("CHANGELOG file found"):(e.error("No CHANGELOG file found"),c=!0)}return!c}async function F(t=process.cwd()){const{config:o}=await h({cwd:t}),s=o.lint||{};e.start("Running comprehensive project lint...");const i=(await Promise.allSettled([E(t,s.project),A(t,s.dependencies),R(t,s.structure),b(t,s.docs)])).filter(c=>c.status==="rejected"||c.status==="fulfilled"&&!c.value);return i.length===0?(e.success("All lint checks passed!"),!0):(e.error(`${i.length} lint check(s) failed`),!1)}export{E as a,A as b,R as c,b as d,F as e,v as f,j as g,q as l};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import{execSync as p}from"node:child_process";import{readFile as G,unlink as k,writeFile as v,copyFile as I}from"node:fs/promises";import{updateConfig as x}from"c12/update";import{consola as s}from"consola";import{defu as M}from"defu";import b from"ini";import{resolve as l}from"pathe";import{l as d,f as g}from"./basis.CkZpidFZ.mjs";async function $(i,o=!1,r=!1){try{return await x({cwd:i,configFile:"basis.config",onUpdate:t=>{t.git&&(o&&t.git.hooks&&(delete t.git.hooks,s.success("Removed hooks configuration from basis.config.ts")),r&&t.git.config&&(delete t.git.config,s.success("Removed git config from basis.config.ts")),Object.keys(t.git).length===0&&(delete t.git,s.success("Removed empty git section from basis.config.ts")))}}),!0}catch{return!1}}const S=["feat","fix","docs","style","refactor","perf","test","build","ci","chore","revert"];function F(i){const o=i.trim().split(`
|
|
2
|
+
`),r=o[0].match(/^(\w+)(\(([^)]+)\))?(!)?:\s*(.+)$/);if(!r)return null;const[,t,,e,c,n]=r,a=o.slice(1).find(u=>u.trim())?.trim(),f=o.slice(-1)[0]?.trim();return{type:t,scope:e,description:n,body:a,footer:f,isBreaking:!!c||i.includes("BREAKING CHANGE:")}}function j(i,o={}){const r=[],{types:t=S,maxLength:e=72,minLength:c=10,scopeRequired:n=!1,allowedScopes:a=[]}=o,f=F(i);if(!f)return{valid:!1,errors:["Invalid commit format. Expected: type(scope): description"]};t.includes(f.type)||r.push(`Invalid type '${f.type}'. Allowed: ${t.join(", ")}`);const u=i.split(`
|
|
3
|
+
`)[0];return u.length>e&&r.push(`Header too long (${u.length}). Max: ${e}`),u.length<c&&r.push(`Header too short (${u.length}). Min: ${c}`),n&&!f.scope&&r.push("Scope is required"),f.scope&&a.length>0&&!a.includes(f.scope)&&r.push(`Invalid scope '${f.scope}'. Allowed: ${a.join(", ")}`),{valid:r.length===0,errors:r}}async function E(i=process.cwd(),o){const{config:r}=await d({cwd:i,overrides:o?{git:{commitMsg:o}}:void 0}),t=r.git?.commitMsg||{};let e;try{const n=l(".git/COMMIT_EDITMSG");await g(n)?e=(await G(n)).toString("utf8"):e=p("git log -1 --pretty=%B",{encoding:"utf8"}).trim()}catch(n){return s.error("Failed to read commit message:",n),!1}const c=j(e,t);return c.valid?(s.success("Commit message is valid"),!0):(s.error("Invalid commit message:"),c.errors.forEach(n=>s.error(` ${n}`)),!1)}async function C(i){const o=l(i,".git/config");if(!await g(o))return null;const r=new Date().toISOString().replace(/[:.]/g,"-"),t=l(i,`.git/config.backup.${r}`);try{return await I(o,t),s.info(`\u{1F4C4} Created backup: ${t}`),t}catch(e){return s.warn("Failed to create Git config backup:",e),null}}async function m(i=process.cwd()){const o=l(i,".git/config");if(!await g(o))return s.info("No .git/config found, will create new one"),{};try{const r=await G(o,"utf8"),t=b.parse(r);return s.success(`Read existing Git configuration from ${o}`),t}catch(r){return s.warn("Failed to read .git/config:",r),{}}}async function w(i,o=process.cwd()){const r=l(o,".git/config");try{let t=b.stringify(i,{whitespace:!0});t=t.split(`
|
|
4
|
+
`).map(e=>e&&!e.startsWith("[")&&e.includes("=")?` ${e}`:e).join(`
|
|
5
|
+
`),await v(r,t,"utf8"),s.success(`Git configuration written to ${r}`)}catch(t){throw s.error("Failed to write .git/config:",t),t}}function R(i,o){if(!o)return!0;for(const[r,t]of Object.entries(o)){if(typeof t!="object"||!t)continue;const e=i[r];if(!e||typeof e!="object")return!1;for(const[c,n]of Object.entries(t))if(n!==void 0&&e[c]!==n)return!1}return!0}async function h(i=process.cwd(),o){const{config:r}=await d({cwd:i,overrides:o?{git:{config:o}}:void 0}),t=r.git?.config||{};if(Object.keys(t).length===0)return s.info("No Git configuration settings to apply"),!0;try{const e=await m(i);if(R(e,t))return s.success("Git configuration is already up to date"),!0;const c=await C(i),n=M(e,t);return await w(n,i),s.success("Git configuration setup completed"),c&&s.info(`\u{1F4BE} Original config backed up to: ${c.split("/").pop()}`),!0}catch(e){return s.error("Failed to setup Git configuration:",e),!1}}async function B(i=process.cwd(),o=!0,r={}){try{const t=await C(i),e=await m(i);if(!e||Object.keys(e).length===0)return s.info("No Git configuration found to reset"),!0;const c={};if(o&&e.user&&(c.user=e.user,s.info("\u{1F512} Keeping user configuration (name, email)")),e.core){const n=["repositoryformatversion","filemode","bare","logallrefupdates"],a={};n.forEach(f=>{e.core[f]!==void 0&&(a[f]=e.core[f])}),Object.keys(a).length>0&&(c.core=a,s.info("\u{1F512} Keeping essential core Git settings"))}return await w(c,i),s.success("Git configuration reset completed"),t&&s.info(`\u{1F4BE} Original config backed up to: ${t.split("/").pop()}`),r.updateConfig?await $(i,!1,!0):!0}catch(t){return s.error("Failed to reset Git configuration:",t),!1}}async function y(i=process.cwd(),o){const{config:r}=await d({cwd:i,overrides:o?{git:{hooks:o}}:void 0}),t=r.git?.hooks||{},e=l(i,".git/hooks");if(!await g(e))return s.error("Git hooks directory not found. Is this a Git repository?"),!1;let c=!0;for(const[n,a]of Object.entries(t)){const f=l(e,n);try{let u=`#!/bin/sh
|
|
6
|
+
|
|
7
|
+
`;if(typeof a=="string")u+=`${a}
|
|
8
|
+
`;else if(a&&typeof a=="object"&&"commands"in a){const O=a.commands;u+=`${O.join(`
|
|
9
|
+
`)}
|
|
10
|
+
`}await v(f,u,{mode:493}),s.success(`Setup ${n} hook`)}catch(u){s.error(`Failed to setup ${n} hook:`,u),c=!1}}return c}async function H(i=process.cwd()){try{try{p("git rev-parse --git-dir",{cwd:i,stdio:"pipe"}),s.info("Git repository already exists")}catch{p("git init",{cwd:i,stdio:"inherit"}),s.success("Initialized Git repository")}const o=await h(i),r=await y(i);return o&&r}catch(o){return s.error("Failed to initialize Git repository:",o),!1}}async function N(i=process.cwd()){const{config:o}=await d({cwd:i}),r=o.git||{};s.start("Setting up Git configuration...");const t=(await Promise.allSettled([h(i,r.config),y(i,r.hooks)])).filter(e=>e.status==="rejected"||e.status==="fulfilled"&&!e.value);return t.length===0?(s.success("Git setup completed successfully!"),!0):(s.error(`${t.length} Git setup step(s) failed`),!1)}async function A(i=process.cwd(),o,r={}){const t=l(i,".git/hooks");if(!await g(t))return s.warn("Git hooks directory not found. Is this a Git repository?"),!0;let e=!0;if(o&&o.length>0)for(const c of o){const n=l(t,c);if(await g(n))try{await k(n),s.success(`Removed ${c} hook`)}catch(a){s.error(`Failed to remove ${c} hook:`,a),e=!1}}else{const{config:c}=await d({cwd:i}),n=c.git?.hooks||{};for(const a of Object.keys(n)){const f=l(t,a);if(await g(f))try{await k(f),s.success(`Removed ${a} hook`)}catch(u){s.error(`Failed to remove ${a} hook:`,u),e=!1}}if(r.updateConfig){const a=await $(i,!0,!1);e=e&&a}}return e}export{h as a,N as b,B as c,m as d,H as i,E as l,F as p,A as r,y as s,j as v,w};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{execSync as d}from"node:child_process";import{consola as a}from"consola";import{detectPackageManager as y,runScript as p}from"nypm";import{readPackageJSON as $}from"pkg-types";import h from"semver";import{l as b}from"./basis.CkZpidFZ.mjs";async function k(e,t,n){if(t.checkGitClean&&!n.skipTests)try{if(d("git status --porcelain",{cwd:e,encoding:"utf8"}).trim())throw new Error("Working directory is not clean. Commit your changes first.")}catch(i){a.warn("Could not check git status:",i)}if(t.checkTests&&!n.skipTests){a.start("Running tests...");try{t.testCommand?d(t.testCommand,{cwd:e,stdio:"inherit"}):await p("test",{cwd:e,silent:!1}),a.success("Tests passed")}catch(i){throw a.error("Tests failed"),i}}if(t.buildCommand&&!n.skipBuild){a.start("Building package...");try{t.buildCommand.includes(" ")?d(t.buildCommand,{cwd:e,stdio:"inherit"}):await p(t.buildCommand,{cwd:e,silent:!1}),a.success("Build completed")}catch(i){throw a.error("Build failed"),i}}}async function C(e,t){if(t.autoGitPush)try{d("git push",{cwd:e}),t.createGitTag&&d("git push --tags",{cwd:e}),a.success("Pushed changes to remote")}catch(n){a.warn("Failed to push changes:",n)}}async function T(e,t={}){const{config:n}=await b({cwd:e}),i=n.publish||{},f=await $(e),{name:o,version:r}=f;if(!o||!r)throw new Error("Missing name or version in package.json");if(!h.valid(r))throw new Error(`Invalid version format in package.json: ${r}`);const m=await y(e),u=m?.command||"npm";await k(e,i,t);let c;if(t.tag)c=t.tag;else if(t.stable||t.latest)c=i.stableTag||"latest";else if(h.prerelease(r)){const s=h.prerelease(r);c=s&&s[0]||i.defaultTag||"edge"}else c=i.stableTag||"latest";a.info(`Publishing ${o}@${r} to tag: ${c}`);const g=["publish","--tag",c,"--access",t.access||i.access||"public"];(t.registry||i.registry)&&g.push("--registry",t.registry||i.registry||""),t.dryRun&&g.push("--dry-run");const w=`${u} ${g.join(" ")}`;a.start("Publishing package...");try{if(d(w,{cwd:e,stdio:"inherit"}),t.dryRun)a.success("Dry run completed successfully");else{a.success(`Published ${o}@${r} to ${c}`);const s=i.defaultTag||"edge";if(c!==s){a.start(`Also publishing to ${s} tag...`);try{let l;m?.name==="yarn"?l=`${u} tag add ${o}@${r} ${s}`:l=`${u} dist-tag add ${o}@${r} ${s}`,d(l,{cwd:e,stdio:"inherit"}),a.success(`Also published ${o}@${r} to ${s}`)}catch(l){a.warn(`Failed to add ${s} tag:`,l)}}await C(e,i)}return{packageName:o,version:r,publishTag:c,dryRun:t.dryRun||!1}}catch(s){throw a.error("Failed to publish package:",s),s}}export{T as p};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
"use strict";const node_child_process=require("node:child_process"),promises=require("node:fs/promises"),update=require("c12/update"),consola=require("consola"),defu=require("defu"),k=require("ini"),pathe=require("pathe"),utils=require("./basis.BJhSbOyA.cjs");function _interopDefaultCompat(t){return t&&typeof t=="object"&&"default"in t?t.default:t}const k__default=_interopDefaultCompat(k);async function G(t,i=!1,s=!1){try{return await update.updateConfig({cwd:t,configFile:"basis.config",onUpdate:e=>{e.git&&(i&&e.git.hooks&&(delete e.git.hooks,consola.consola.success("Removed hooks configuration from basis.config.ts")),s&&e.git.config&&(delete e.git.config,consola.consola.success("Removed git config from basis.config.ts")),Object.keys(e.git).length===0&&(delete e.git,consola.consola.success("Removed empty git section from basis.config.ts")))}}),!0}catch{return!1}}const P=["feat","fix","docs","style","refactor","perf","test","build","ci","chore","revert"];function parseCommitMessage(t){const i=t.trim().split(`
|
|
2
|
+
`),s=i[0].match(/^(\w+)(\(([^)]+)\))?(!)?:\s*(.+)$/);if(!s)return null;const[,e,,o,c,n]=s,r=i.slice(1).find(l=>l.trim())?.trim(),a=i.slice(-1)[0]?.trim();return{type:e,scope:o,description:n,body:r,footer:a,isBreaking:!!c||t.includes("BREAKING CHANGE:")}}function validateCommitMessage(t,i={}){const s=[],{types:e=P,maxLength:o=72,minLength:c=10,scopeRequired:n=!1,allowedScopes:r=[]}=i,a=parseCommitMessage(t);if(!a)return{valid:!1,errors:["Invalid commit format. Expected: type(scope): description"]};e.includes(a.type)||s.push(`Invalid type '${a.type}'. Allowed: ${e.join(", ")}`);const l=t.split(`
|
|
3
|
+
`)[0];return l.length>o&&s.push(`Header too long (${l.length}). Max: ${o}`),l.length<c&&s.push(`Header too short (${l.length}). Min: ${c}`),n&&!a.scope&&s.push("Scope is required"),a.scope&&r.length>0&&!r.includes(a.scope)&&s.push(`Invalid scope '${a.scope}'. Allowed: ${r.join(", ")}`),{valid:s.length===0,errors:s}}async function lintCommitMessage(t=process.cwd(),i){const{config:s}=await utils.loadConfig({cwd:t,overrides:i?{git:{commitMsg:i}}:void 0}),e=s.git?.commitMsg||{};let o;try{const n=pathe.resolve(".git/COMMIT_EDITMSG");await utils.fileExists(n)?o=(await promises.readFile(n)).toString("utf8"):o=node_child_process.execSync("git log -1 --pretty=%B",{encoding:"utf8"}).trim()}catch(n){return consola.consola.error("Failed to read commit message:",n),!1}const c=validateCommitMessage(o,e);return c.valid?(consola.consola.success("Commit message is valid"),!0):(consola.consola.error("Invalid commit message:"),c.errors.forEach(n=>consola.consola.error(` ${n}`)),!1)}async function b(t){const i=pathe.resolve(t,".git/config");if(!await utils.fileExists(i))return null;const s=new Date().toISOString().replace(/[:.]/g,"-"),e=pathe.resolve(t,`.git/config.backup.${s}`);try{return await promises.copyFile(i,e),consola.consola.info(`\u{1F4C4} Created backup: ${e}`),e}catch(o){return consola.consola.warn("Failed to create Git config backup:",o),null}}async function readGitConfig(t=process.cwd()){const i=pathe.resolve(t,".git/config");if(!await utils.fileExists(i))return consola.consola.info("No .git/config found, will create new one"),{};try{const s=await promises.readFile(i,"utf8"),e=k__default.parse(s);return consola.consola.success(`Read existing Git configuration from ${i}`),e}catch(s){return consola.consola.warn("Failed to read .git/config:",s),{}}}async function writeGitConfig(t,i=process.cwd()){const s=pathe.resolve(i,".git/config");try{let e=k__default.stringify(t,{whitespace:!0});e=e.split(`
|
|
4
|
+
`).map(o=>o&&!o.startsWith("[")&&o.includes("=")?` ${o}`:o).join(`
|
|
5
|
+
`),await promises.writeFile(s,e,"utf8"),consola.consola.success(`Git configuration written to ${s}`)}catch(e){throw consola.consola.error("Failed to write .git/config:",e),e}}function x(t,i){if(!i)return!0;for(const[s,e]of Object.entries(i)){if(typeof e!="object"||!e)continue;const o=t[s];if(!o||typeof o!="object")return!1;for(const[c,n]of Object.entries(e))if(n!==void 0&&o[c]!==n)return!1}return!0}async function setupGitConfig(t=process.cwd(),i){const{config:s}=await utils.loadConfig({cwd:t,overrides:i?{git:{config:i}}:void 0}),e=s.git?.config||{};if(Object.keys(e).length===0)return consola.consola.info("No Git configuration settings to apply"),!0;try{const o=await readGitConfig(t);if(x(o,e))return consola.consola.success("Git configuration is already up to date"),!0;const c=await b(t),n=defu.defu(o,e);return await writeGitConfig(n,t),consola.consola.success("Git configuration setup completed"),c&&consola.consola.info(`\u{1F4BE} Original config backed up to: ${c.split("/").pop()}`),!0}catch(o){return consola.consola.error("Failed to setup Git configuration:",o),!1}}async function resetGitConfig(t=process.cwd(),i=!0,s={}){try{const e=await b(t),o=await readGitConfig(t);if(!o||Object.keys(o).length===0)return consola.consola.info("No Git configuration found to reset"),!0;const c={};if(i&&o.user&&(c.user=o.user,consola.consola.info("\u{1F512} Keeping user configuration (name, email)")),o.core){const n=["repositoryformatversion","filemode","bare","logallrefupdates"],r={};n.forEach(a=>{o.core[a]!==void 0&&(r[a]=o.core[a])}),Object.keys(r).length>0&&(c.core=r,consola.consola.info("\u{1F512} Keeping essential core Git settings"))}return await writeGitConfig(c,t),consola.consola.success("Git configuration reset completed"),e&&consola.consola.info(`\u{1F4BE} Original config backed up to: ${e.split("/").pop()}`),s.updateConfig?await G(t,!1,!0):!0}catch(e){return consola.consola.error("Failed to reset Git configuration:",e),!1}}async function setupGitHooks(t=process.cwd(),i){const{config:s}=await utils.loadConfig({cwd:t,overrides:i?{git:{hooks:i}}:void 0}),e=s.git?.hooks||{},o=pathe.resolve(t,".git/hooks");if(!await utils.fileExists(o))return consola.consola.error("Git hooks directory not found. Is this a Git repository?"),!1;let c=!0;for(const[n,r]of Object.entries(e)){const a=pathe.resolve(o,n);try{let l=`#!/bin/sh
|
|
6
|
+
|
|
7
|
+
`;if(typeof r=="string")l+=`${r}
|
|
8
|
+
`;else if(r&&typeof r=="object"&&"commands"in r){const f=r.commands;l+=`${f.join(`
|
|
9
|
+
`)}
|
|
10
|
+
`}await promises.writeFile(a,l,{mode:493}),consola.consola.success(`Setup ${n} hook`)}catch(l){consola.consola.error(`Failed to setup ${n} hook:`,l),c=!1}}return c}async function initGitRepo(t=process.cwd()){try{try{node_child_process.execSync("git rev-parse --git-dir",{cwd:t,stdio:"pipe"}),consola.consola.info("Git repository already exists")}catch{node_child_process.execSync("git init",{cwd:t,stdio:"inherit"}),consola.consola.success("Initialized Git repository")}const i=await setupGitConfig(t),s=await setupGitHooks(t);return i&&s}catch(i){return consola.consola.error("Failed to initialize Git repository:",i),!1}}async function setupGit(t=process.cwd()){const{config:i}=await utils.loadConfig({cwd:t}),s=i.git||{};consola.consola.start("Setting up Git configuration...");const e=(await Promise.allSettled([setupGitConfig(t,s.config),setupGitHooks(t,s.hooks)])).filter(o=>o.status==="rejected"||o.status==="fulfilled"&&!o.value);return e.length===0?(consola.consola.success("Git setup completed successfully!"),!0):(consola.consola.error(`${e.length} Git setup step(s) failed`),!1)}async function removeGitHooks(t=process.cwd(),i,s={}){const e=pathe.resolve(t,".git/hooks");if(!await utils.fileExists(e))return consola.consola.warn("Git hooks directory not found. Is this a Git repository?"),!0;let o=!0;if(i&&i.length>0)for(const c of i){const n=pathe.resolve(e,c);if(await utils.fileExists(n))try{await promises.unlink(n),consola.consola.success(`Removed ${c} hook`)}catch(r){consola.consola.error(`Failed to remove ${c} hook:`,r),o=!1}}else{const{config:c}=await utils.loadConfig({cwd:t}),n=c.git?.hooks||{};for(const r of Object.keys(n)){const a=pathe.resolve(e,r);if(await utils.fileExists(a))try{await promises.unlink(a),consola.consola.success(`Removed ${r} hook`)}catch(l){consola.consola.error(`Failed to remove ${r} hook:`,l),o=!1}}if(s.updateConfig){const r=await G(t,!0,!1);o=o&&r}}return o}exports.initGitRepo=initGitRepo,exports.lintCommitMessage=lintCommitMessage,exports.parseCommitMessage=parseCommitMessage,exports.readGitConfig=readGitConfig,exports.removeGitHooks=removeGitHooks,exports.resetGitConfig=resetGitConfig,exports.setupGit=setupGit,exports.setupGitConfig=setupGitConfig,exports.setupGitHooks=setupGitHooks,exports.validateCommitMessage=validateCommitMessage,exports.writeGitConfig=writeGitConfig;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@funish/basis",
|
|
3
|
-
"version": "0.0.
|
|
3
|
+
"version": "0.0.3",
|
|
4
4
|
"description": "A unified development toolkit with CLI for package management, versioning, publishing, linting, and git hooks management for JavaScript/TypeScript projects.",
|
|
5
5
|
"main": "dist/index.mjs",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -60,6 +60,8 @@
|
|
|
60
60
|
"c12": "3.0.4",
|
|
61
61
|
"citty": "0.1.6",
|
|
62
62
|
"consola": "3.4.2",
|
|
63
|
+
"defu": "6.1.4",
|
|
64
|
+
"fast-glob": "3.3.3",
|
|
63
65
|
"ini": "5.0.0",
|
|
64
66
|
"magicast": "0.3.5",
|
|
65
67
|
"micromatch": "4.0.8",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{execSync as d}from"node:child_process";import{consola as e}from"consola";import{detectPackageManager as w,runScript as y}from"nypm";import{readPackageJSON as $}from"pkg-types";import h from"semver";import{l as k}from"./basis.C7U9rUSl.mjs";async function b(a,t,o){if(t.checkGitClean&&!o.skipTests)try{if(d("git status --porcelain",{cwd:a,encoding:"utf8"}).trim())throw new Error("Working directory is not clean. Commit your changes first.")}catch(i){e.warn("Could not check git status:",i)}if(t.checkTests&&!o.skipTests){e.start("Running tests...");try{t.testCommand?d(t.testCommand,{cwd:a,stdio:"inherit"}):await y("test",{cwd:a,silent:!1}),e.success("Tests passed")}catch(i){throw e.error("Tests failed"),i}}if(t.buildCommand&&!o.skipBuild){e.start("Building package...");try{d(t.buildCommand,{cwd:a,stdio:"inherit"}),e.success("Build completed")}catch(i){throw e.error("Build failed"),i}}}async function T(a,t){if(t.autoGitPush)try{d("git push",{cwd:a}),t.createGitTag&&d("git push --tags",{cwd:a}),e.success("Pushed changes to remote")}catch(o){e.warn("Failed to push changes:",o)}}async function C(a,t={}){const{config:o}=await k({cwd:a}),i=o.publish||{},m=await $(a),{name:n,version:c}=m;if(!n||!c)throw new Error("Missing name or version in package.json");if(!h.valid(c))throw new Error(`Invalid version format in package.json: ${c}`);const p=await w(a),u=p?.command||"npm";await b(a,i,t);let r;if(t.tag)r=t.tag;else if(t.stable||t.latest)r=i.stableTag||"latest";else if(h.prerelease(c)){const s=h.prerelease(c);r=s&&s[0]||i.defaultTag||"edge"}else r=i.stableTag||"latest";e.info(`Publishing ${n}@${c} to tag: ${r}`);const g=["publish","--tag",r,"--access",t.access||i.access||"public"];(t.registry||i.registry)&&g.push("--registry",t.registry||i.registry||""),t.dryRun&&g.push("--dry-run");const f=`${u} ${g.join(" ")}`;e.start("Publishing package...");try{if(d(f,{cwd:a,stdio:"inherit"}),t.dryRun)e.success("Dry run completed successfully");else{e.success(`Published ${n}@${c} to ${r}`);const s=i.defaultTag||"edge";if(r!==s){e.start(`Also publishing to ${s} tag...`);try{let l;p?.name==="yarn"?l=`${u} tag add ${n}@${c} ${s}`:l=`${u} dist-tag add ${n}@${c} ${s}`,d(l,{cwd:a,stdio:"inherit"}),e.success(`Also published ${n}@${c} to ${s}`)}catch(l){e.warn(`Failed to add ${s} tag:`,l)}}await T(a,i)}return{packageName:n,version:c,publishTag:r,dryRun:t.dryRun||!1}}catch(s){throw e.error("Failed to publish package:",s),s}}export{C as p};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";const node_child_process=require("node:child_process"),consola=require("consola"),nypm=require("nypm"),pkgTypes=require("pkg-types"),g=require("semver"),utils=require("./basis.DcyVtmjR.cjs");function _interopDefaultCompat(e){return e&&typeof e=="object"&&"default"in e?e.default:e}const g__default=_interopDefaultCompat(g);async function k(e,t,n){if(t.checkGitClean&&!n.skipTests)try{if(node_child_process.execSync("git status --porcelain",{cwd:e,encoding:"utf8"}).trim())throw new Error("Working directory is not clean. Commit your changes first.")}catch(s){consola.consola.warn("Could not check git status:",s)}if(t.checkTests&&!n.skipTests){consola.consola.start("Running tests...");try{t.testCommand?node_child_process.execSync(t.testCommand,{cwd:e,stdio:"inherit"}):await nypm.runScript("test",{cwd:e,silent:!1}),consola.consola.success("Tests passed")}catch(s){throw consola.consola.error("Tests failed"),s}}if(t.buildCommand&&!n.skipBuild){consola.consola.start("Building package...");try{node_child_process.execSync(t.buildCommand,{cwd:e,stdio:"inherit"}),consola.consola.success("Build completed")}catch(s){throw consola.consola.error("Build failed"),s}}}async function C(e,t){if(t.autoGitPush)try{node_child_process.execSync("git push",{cwd:e}),t.createGitTag&&node_child_process.execSync("git push --tags",{cwd:e}),consola.consola.success("Pushed changes to remote")}catch(n){consola.consola.warn("Failed to push changes:",n)}}async function publishPackage(e,t={}){const{config:n}=await utils.loadConfig({cwd:e}),s=n.publish||{},p=await pkgTypes.readPackageJSON(e),{name:i,version:c}=p;if(!i||!c)throw new Error("Missing name or version in package.json");if(!g__default.valid(c))throw new Error(`Invalid version format in package.json: ${c}`);const d=await nypm.detectPackageManager(e),l=d?.command||"npm";await k(e,s,t);let o;if(t.tag)o=t.tag;else if(t.stable||t.latest)o=s.stableTag||"latest";else if(g__default.prerelease(c)){const a=g__default.prerelease(c);o=a&&a[0]||s.defaultTag||"edge"}else o=s.stableTag||"latest";consola.consola.info(`Publishing ${i}@${c} to tag: ${o}`);const u=["publish","--tag",o,"--access",t.access||s.access||"public"];(t.registry||s.registry)&&u.push("--registry",t.registry||s.registry||""),t.dryRun&&u.push("--dry-run");const h=`${l} ${u.join(" ")}`;consola.consola.start("Publishing package...");try{if(node_child_process.execSync(h,{cwd:e,stdio:"inherit"}),t.dryRun)consola.consola.success("Dry run completed successfully");else{consola.consola.success(`Published ${i}@${c} to ${o}`);const a=s.defaultTag||"edge";if(o!==a){consola.consola.start(`Also publishing to ${a} tag...`);try{let r;d?.name==="yarn"?r=`${l} tag add ${i}@${c} ${a}`:r=`${l} dist-tag add ${i}@${c} ${a}`,node_child_process.execSync(r,{cwd:e,stdio:"inherit"}),consola.consola.success(`Also published ${i}@${c} to ${a}`)}catch(r){consola.consola.warn(`Failed to add ${a} tag:`,r)}}await C(e,s)}return{packageName:i,version:c,publishTag:o,dryRun:t.dryRun||!1}}catch(a){throw consola.consola.error("Failed to publish package:",a),a}}exports.publishPackage=publishPackage;
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{access as t}from"node:fs/promises";import{loadConfig as o}from"c12";import{defaultConfig as s}from"../config.mjs";async function f(a={}){return await o({name:"basis",cwd:process.cwd(),...a,defaults:{...s,...a.defaults}})}async function r(a){try{return await t(a),!0}catch{return!1}}export{r as f,f as l};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";const promises=require("node:fs/promises"),consola=require("consola"),magicast=require("magicast"),nypm=require("nypm"),pathe=require("pathe"),pkgTypes=require("pkg-types"),utils=require("./basis.DcyVtmjR.cjs");function v(){const e=magicast.parseModule("export default {}"),i=magicast.builders.functionCall("defineBasisConfig",[{}]),n={staged:{},project:{}},c={hooks:{}},o=i.$args[0];o.lint=n,o.git=c,e.exports.default=i,e.imports.$prepend({from:"@funish/basis",imported:"defineBasisConfig"});const{code:a}=magicast.generateCode(e);return a}function C(e){const{enableStagedLinting:i=!1,enableCommitMsgLinting:n=!1,customLintPatterns:c,customExcludePatterns:o}=e,a=magicast.parseModule("export default defineBasisConfig({})"),t=a.exports.default.$args[0];t.lint={},t.lint.staged={},i&&(t.lint.staged["*.{js,ts,jsx,tsx}"]="eslint --fix",t.lint.staged["*.{css,scss,less}"]="stylelint --fix"),t.lint.project={patterns:c||["src/**/*","lib/**/*","*.{js,ts,jsx,tsx}"],exclude:o||["node_modules/**","dist/**","build/**"]},t.git={},t.git.hooks={},i&&(t.git.hooks["pre-commit"]="basis lint --staged"),n&&(t.git.hooks["commit-msg"]="basis git --lint-commit"),t.git.commitMsg={},a.imports.$items.some(s=>s.from==="@funish/basis")||a.imports.$prepend({from:"@funish/basis",imported:"defineBasisConfig"});const{code:l}=magicast.generateCode(a);return l}async function D(){const e=await consola.consola.prompt("Enable staged files linting?",{type:"confirm",initial:!0}),i=await consola.consola.prompt("Enable commit message linting?",{type:"confirm",initial:!0});let n;if(await consola.consola.prompt("Customize lint file patterns?",{type:"confirm",initial:!1})){const c=await consola.consola.prompt("Enter lint patterns (comma-separated):",{type:"text",initial:"src/**/*,lib/**/*,*.{js,ts,jsx,tsx}"});typeof c=="string"&&(n=c.split(",").map(o=>o.trim()))}return{enableStagedLinting:e,enableCommitMsgLinting:i,customLintPatterns:n}}async function init(e=process.cwd(),i={}){const{force:n=!1,skipGitCheck:c=!1,skipInstall:o=!1}=i;consola.consola.start("Initializing basis configuration...");const a=pathe.resolve(e,"basis.config.ts");if(await utils.fileExists(a)&&!n)return consola.consola.error("basis.config.ts already exists. Use --force to overwrite."),!1;if(!c&&!await utils.fileExists(pathe.resolve(e,".git"))&&(consola.consola.warn("No .git directory found. Git hooks will not work properly."),!await consola.consola.prompt("Continue anyway?",{type:"confirm",initial:!1})))return consola.consola.info("Initialization cancelled."),!1;let t;if(await consola.consola.prompt("Use interactive setup?",{type:"confirm",initial:!0})){const s=await D();t=C(s)}else t=v();const l=(await nypm.detectPackageManager(e))?.name||"npm";consola.consola.info(`Detected package manager: ${l}`),await promises.writeFile(a,t,"utf-8"),consola.consola.success("Created basis.config.ts with dynamic configuration");try{const s=await pkgTypes.readPackageJSON(e),p=!!(s.workspaces||await utils.fileExists(pathe.resolve(e,"pnpm-workspace.yaml")));o?!s.devDependencies?.["@funish/basis"]&&!s.dependencies?.["@funish/basis"]&&(s.devDependencies=s.devDependencies||{},s.devDependencies["@funish/basis"]="latest",consola.consola.info("Added @funish/basis to devDependencies")):(await nypm.addDevDependency("@funish/basis",{cwd:e,silent:!1,workspace:p}),consola.consola.success("Added @funish/basis to devDependencies"));const r="basis git --setup";s.scripts=s.scripts||{},l==="pnpm"?s.scripts.postinstall?s.scripts.postinstall.includes(r)||(s.scripts.postinstall=`${s.scripts.postinstall} && ${r}`):s.scripts.postinstall=r:l==="yarn"?s.scripts.prepare?s.scripts.prepare.includes(r)||(s.scripts.prepare=`${s.scripts.prepare} && ${r}`):s.scripts.prepare=r:s.scripts.postinstall?s.scripts.postinstall.includes(r)||(s.scripts.postinstall=`${s.scripts.postinstall} && ${r}`):s.scripts.postinstall=r,await pkgTypes.writePackageJSON(pathe.resolve(e,"package.json"),s),consola.consola.success(`Updated package.json scripts${o?" and dependencies":""}`),o?(consola.consola.info("Skipped dependency installation"),consola.consola.info("Run your package manager's install command to complete setup")):(consola.consola.start("Installing dependencies..."),await nypm.installDependencies({cwd:e,silent:!1}),consola.consola.success("Dependencies installed successfully"))}catch(s){return consola.consola.error("Failed to setup dependencies:",s),!1}return consola.consola.success("Basis initialization completed!"),consola.consola.info("You can now:"),consola.consola.info(" - Edit basis.config.ts to customize your configuration"),consola.consola.info(" - Run `basis git setup` to install git hooks"),!0}function previewBasisConfig(e={}){return C(e)}function createMinimalConfig(){const e=magicast.parseModule("export default defineBasisConfig({})"),i=e.exports.default.$args[0];i.lint={staged:{}},i.git={hooks:{},commitMsg:{}},e.imports.$prepend({from:"@funish/basis",imported:"defineBasisConfig"});const{code:n}=magicast.generateCode(e);return n}exports.createMinimalConfig=createMinimalConfig,exports.init=init,exports.previewBasisConfig=previewBasisConfig;
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
import{execSync as p}from"node:child_process";import{readdir as C,stat as N}from"node:fs/promises";import{consola as e}from"consola";import v from"micromatch";import{detectPackageManager as O}from"nypm";import{resolve as w,join as P}from"pathe";import{readPackageJSON as q}from"pkg-types";import{l as m,f as y}from"./basis.C7U9rUSl.mjs";function j(){try{const t=p("git diff --cached --name-only",{encoding:"utf8"}).trim().split(`
|
|
2
|
-
`).filter(Boolean),s=p("git diff --cached --name-only --diff-filter=D",{encoding:"utf8"}),c=new Set(s.trim().split(`
|
|
3
|
-
`).filter(Boolean));return t.filter(i=>!c.has(i))}catch{return[]}}async function E(t,s=["**/*"],c=["node_modules/**","dist/**","build/**",".git/**"]){const i=[];async function o(n,r=0){if(!(r>10))try{const u=await C(n);for(const g of u){const a=P(n,g),d=a.replace(`${t}/`,"");if(c.some(l=>v.isMatch(d,l)))continue;const f=await N(a);f.isDirectory()?await o(a,r+1):f.isFile()&&s.some(l=>v.isMatch(d,l))&&i.push(d)}}catch{}}return await o(t),i}async function F(t=process.cwd(),s){const{config:c}=await m({cwd:t,overrides:s?{lint:{staged:s}}:void 0}),i=c.lint?.staged||{},o=j();if(o.length===0)return e.info("No staged files to lint"),!0;if(Object.keys(i).length===0)return e.warn("No staged lint configuration found"),!0;let n=!1;const r=new Set;for(const[u,g]of Object.entries(i)){const a=o.filter(d=>!r.has(d)&&v.isMatch(d.split("/").pop()||d,u));if(a.length!==0){e.start(`Linting ${a.length} files: ${u}`);try{const d=`${g} ${a.join(" ")}`;p(d,{stdio:"inherit",cwd:t});const f=[];for(const l of a)await y(w(t,l))&&f.push(l);f.length>0&&p(`git add ${f.join(" ")}`,{stdio:"inherit",cwd:t}),a.forEach(l=>r.add(l)),e.success(`\u2713 ${u}`)}catch(d){n=!0,e.error(`\u2717 ${u} failed:`,d)}}}return!n}async function b(t=process.cwd(),s){const{config:c}=await m({cwd:t,overrides:s?{lint:{project:s}}:void 0}),i=c.lint?.project||{};if(Object.keys(i).length===0)return e.warn("No project lint configuration found"),!0;e.start("Running project-wide linting...");let o=!1;for(const[n,r]of Object.entries(i)){e.start(`Running project lint: ${n}`);try{p(r,{stdio:"inherit",cwd:t}),e.success(`\u2713 ${n}`)}catch(u){o=!0,e.error(`\u2717 ${n} failed:`,u)}}return!o}async function A(t=process.cwd(),s){const{config:c}=await m({cwd:t,overrides:s?{lint:{dependencies:s}}:void 0}),i=c.lint?.dependencies||{};let o=!1;try{const n=await q(t),r={...n.dependencies,...n.devDependencies},u=(await O(t))?.name||"npm",g=G(u);if(e.start("Checking dependencies..."),i.blockedPackages&&i.blockedPackages.length>0){const a=Object.keys(r).filter(d=>i.blockedPackages?.includes(d));a.length>0?(e.error(`\u2717 Blocked packages found: ${a.join(", ")}`),o=!0):e.success("\u2713 No blocked packages found")}if(i.checkOutdated)try{p(g.outdated,{cwd:t,stdio:"pipe"}),e.success("\u2713 All dependencies are up to date")}catch(a){e.warn("\u26A0 Some dependencies are outdated:",a)}if(i.checkSecurity)try{p(g.audit,{cwd:t,stdio:"pipe"}),e.success("\u2713 No security vulnerabilities found")}catch(a){e.error("\u2717 Security vulnerabilities detected:",a),o=!0}i.allowedLicenses&&i.allowedLicenses.length>0&&e.info("\u{1F4DD} License checking requires manual review or additional tooling")}catch(n){e.error("Failed to check dependencies:",n),o=!0}return!o}async function R(t=process.cwd(),s){const{config:c}=await m({cwd:t,overrides:s?{lint:{structure:s}}:void 0}),i=c.lint?.structure||{};let o=!1;if(e.start("Checking project structure..."),i.requiredFiles)for(const n of i.requiredFiles){const r=w(t,n);await y(r)?e.success(`\u2713 Required file found: ${n}`):(e.error(`\u2717 Required file missing: ${n}`),o=!0)}if(i.requiredDirs)for(const n of i.requiredDirs){const r=w(t,n);await y(r)?e.success(`\u2713 Required directory found: ${n}`):(e.error(`\u2717 Required directory missing: ${n}`),o=!0)}if(i.naming&&i.naming.length>0)for(const n of i.naming){const{path:r,files:u,directories:g,description:a}=n;e.start(`Checking naming rule: ${a||r}`);const d=await E(t,[r]);if(u){const f=new RegExp(u),l=d.filter(k=>{const h=k.split("/").pop()||"";return!f.test(h)});l.length>0?(e.error(`\u2717 Files with invalid naming in ${r}: ${l.slice(0,3).join(", ")}${l.length>3?"...":""}`),o=!0):d.length>0&&e.success(`\u2713 All files in ${r} follow naming convention`)}if(g){const f=new RegExp(g),l=new Set;d.forEach(h=>{const $=h.split("/");$.pop(),$.forEach(S=>l.add(S))});const k=Array.from(l).filter(h=>!f.test(h));k.length>0?(e.error(`\u2717 Directories with invalid naming in ${r}: ${k.slice(0,3).join(", ")}`),o=!0):l.size>0&&e.success(`\u2713 All directories in ${r} follow naming convention`)}}return!o}async function D(t=process.cwd(),s){const{config:c}=await m({cwd:t,overrides:s?{lint:{docs:s}}:void 0}),i=c.lint?.docs||{};let o=!1;if(e.start("Checking documentation..."),i.checkReadme!==!1){const n=["README.md","README.rst","README.txt","readme.md"];(await Promise.all(n.map(r=>y(w(t,r))))).some(r=>r)?e.success("\u2713 README file found"):(e.error("\u2717 No README file found"),o=!0)}if(i.checkChangelog){const n=["CHANGELOG.md","CHANGELOG.rst","HISTORY.md","changelog.md"];(await Promise.all(n.map(r=>y(w(t,r))))).some(r=>r)?e.success("\u2713 CHANGELOG file found"):(e.error("\u2717 No CHANGELOG file found"),o=!0)}return!o}async function M(t=process.cwd()){const{config:s}=await m({cwd:t}),c=s.lint||{};e.start("Running comprehensive project lint...");const i=(await Promise.allSettled([b(t,c.project),A(t,c.dependencies),R(t,c.structure),D(t,c.docs)])).filter(o=>o.status==="rejected"||o.status==="fulfilled"&&!o.value);return i.length===0?(e.success("\u2705 All lint checks passed!"),!0):(e.error(`\u274C ${i.length} lint check(s) failed`),!1)}function G(t){switch(t){case"yarn":return{outdated:"yarn outdated --json",audit:"yarn audit --level moderate"};case"pnpm":return{outdated:"pnpm outdated --format table",audit:"pnpm audit --audit-level moderate"};case"bun":return{outdated:"bun outdated",audit:"bun audit --audit-level moderate"};default:return{outdated:"npm outdated --json",audit:"npm audit --audit-level moderate"}}}export{b as a,A as b,R as c,D as d,M as e,E as f,j as g,F as l};
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
import{execSync as p}from"node:child_process";import{readFile as m,unlink as G,writeFile as w,copyFile as E}from"node:fs/promises";import{consola as r}from"consola";import b from"ini";import{parseModule as S,generateCode as x}from"magicast";import{resolve as l}from"pathe";import{l as d,f as g}from"./basis.C7U9rUSl.mjs";const I=["feat","fix","docs","style","refactor","perf","test","build","ci","chore","revert"];function $(o){const s=o.trim().split(`
|
|
2
|
-
`),i=s[0].match(/^(\w+)(\(([^)]+)\))?(!)?:\s*(.+)$/);if(!i)return null;const[,e,,t,c,a]=i,n=s.slice(1).find(f=>f.trim())?.trim(),u=s.slice(-1)[0]?.trim();return{type:e,scope:t,description:a,body:n,footer:u,isBreaking:!!c||o.includes("BREAKING CHANGE:")}}function F(o,s={}){const i=[],{types:e=I,maxLength:t=72,minLength:c=10,scopeRequired:a=!1,allowedScopes:n=[]}=s,u=$(o);if(!u)return{valid:!1,errors:["Invalid commit format. Expected: type(scope): description"]};e.includes(u.type)||i.push(`Invalid type '${u.type}'. Allowed: ${e.join(", ")}`);const f=o.split(`
|
|
3
|
-
`)[0];return f.length>t&&i.push(`Header too long (${f.length}). Max: ${t}`),f.length<c&&i.push(`Header too short (${f.length}). Min: ${c}`),a&&!u.scope&&i.push("Scope is required"),u.scope&&n.length>0&&!n.includes(u.scope)&&i.push(`Invalid scope '${u.scope}'. Allowed: ${n.join(", ")}`),{valid:i.length===0,errors:i}}async function M(o=process.cwd(),s){const{config:i}=await d({cwd:o,overrides:s?{git:{commitMsg:s}}:void 0}),e=i.git?.commitMsg||{};let t;try{const a=l(".git/COMMIT_EDITMSG");await g(a)?t=(await m(a)).toString("utf8"):t=p("git log -1 --pretty=%B",{encoding:"utf8"}).trim()}catch(a){return r.error("\u2717 Failed to read commit message:",a),!1}const c=F(t,e);return c.valid?(r.success("\u2713 Commit message is valid"),!0):(r.error("\u2717 Invalid commit message:"),c.errors.forEach(a=>r.error(` ${a}`)),!1)}async function j(o){const s=l(o,".git/config");if(!await g(s))return null;const i=new Date().toISOString().replace(/[:.]/g,"-"),e=l(o,`.git/config.backup.${i}`);try{return await E(s,e),r.info(`\u{1F4C4} Created backup: ${e}`),e}catch(t){return r.warn("Failed to create Git config backup:",t),null}}async function h(o=process.cwd()){const s=l(o,".git/config");if(!await g(s))return r.info("No .git/config found, will create new one"),{};try{const i=await m(s,"utf8"),e=b.parse(i);return r.success(`\u2713 Read existing Git configuration from ${s}`),e}catch(i){return r.warn("Failed to read .git/config:",i),{}}}async function y(o,s=process.cwd()){const i=l(s,".git/config");try{let e=b.stringify(o,{whitespace:!0});e=e.split(`
|
|
4
|
-
`).map(t=>t&&!t.startsWith("[")&&t.includes("=")?` ${t}`:t).join(`
|
|
5
|
-
`),await w(i,e,"utf8"),r.success(`\u2713 Git configuration written to ${i}`)}catch(e){throw r.error("Failed to write .git/config:",e),e}}function R(o){const s={};return o&&Object.entries(o).forEach(([i,e])=>{typeof e=="object"&&e!==null&&(s[i]||(s[i]={}),Object.entries(e).forEach(([t,c])=>{c!==void 0&&(s[i][t]=c)}))}),s}function N(o,s){const i={...o};return Object.entries(s).forEach(([e,t])=>{typeof t=="object"&&t!==null&&(i[e]||(i[e]={}),Object.entries(t).forEach(([c,a])=>{a!==void 0&&(i[e][c]=a,r.info(`\u{1F527} Setting ${e}.${c} = ${a}`))}))}),i}async function k(o=process.cwd(),s){const{config:i}=await d({cwd:o,overrides:s?{git:{config:s}}:void 0}),e=i.git?.config||{};if(Object.keys(e).length===0)return r.info("No Git configuration settings to apply"),!0;try{const t=await j(o),c=await h(o),a=R(e),n=N(c,a);return await y(n,o),r.success("\u2713 Git configuration setup completed"),t&&r.info(`\u{1F4BE} Original config backed up to: ${t.split("/").pop()}`),!0}catch(t){return r.error("\u2717 Failed to setup Git configuration:",t),!1}}async function B(o=process.cwd(),s=!0,i={}){try{const e=await j(o),t=await h(o);if(!t||Object.keys(t).length===0)return r.info("No Git configuration found to reset"),!0;const c={};if(s&&t.user&&(c.user=t.user,r.info("\u{1F512} Keeping user configuration (name, email)")),t.core){const a=["repositoryformatversion","filemode","bare","logallrefupdates"],n={};a.forEach(u=>{t.core[u]!==void 0&&(n[u]=t.core[u])}),Object.keys(n).length>0&&(c.core=n,r.info("\u{1F512} Keeping essential core Git settings"))}return await y(c,o),r.success("\u2713 Git configuration reset completed"),e&&r.info(`\u{1F4BE} Original config backed up to: ${e.split("/").pop()}`),i.updateConfig?await C(o,!1,!0):!0}catch(e){return r.error("\u2717 Failed to reset Git configuration:",e),!1}}async function v(o=process.cwd(),s){const{config:i}=await d({cwd:o,overrides:s?{git:{hooks:s}}:void 0}),e=i.git?.hooks||{},t=l(o,".git/hooks");if(!await g(t))return r.error("\u2717 Git hooks directory not found. Is this a Git repository?"),!1;let c=!0;for(const[a,n]of Object.entries(e)){const u=l(t,a);try{let f=`#!/bin/sh
|
|
6
|
-
|
|
7
|
-
`;if(typeof n=="string")f+=`${n}
|
|
8
|
-
`;else if(n&&typeof n=="object"&&"commands"in n){const O=n.commands;f+=`${O.join(`
|
|
9
|
-
`)}
|
|
10
|
-
`}await w(u,f,{mode:493}),r.success(`\u2713 Setup ${a} hook`)}catch(f){r.error(`\u2717 Failed to setup ${a} hook:`,f),c=!1}}return c}async function H(o=process.cwd()){try{try{p("git rev-parse --git-dir",{cwd:o,stdio:"pipe"}),r.info("Git repository already exists")}catch{p("git init",{cwd:o,stdio:"inherit"}),r.success("\u2713 Initialized Git repository")}const s=await k(o),i=await v(o);return s&&i}catch(s){return r.error("\u2717 Failed to initialize Git repository:",s),!1}}async function A(o=process.cwd()){const{config:s}=await d({cwd:o}),i=s.git||{};r.start("Setting up Git configuration...");const e=(await Promise.allSettled([k(o,i.config),v(o,i.hooks)])).filter(t=>t.status==="rejected"||t.status==="fulfilled"&&!t.value);return e.length===0?(r.success("\u2705 Git setup completed successfully!"),!0):(r.error(`\u274C ${e.length} Git setup step(s) failed`),!1)}async function C(o,s=!1,i=!1){const e=l(o,"basis.config.ts");if(!await g(e))return r.info("No basis.config.ts found to update"),!0;try{const t=await m(e,"utf8"),c=S(t),a=c.exports.default;if(!a||!a.$args?.[0])return r.warn("Could not parse basis.config.ts structure"),!1;const n=a.$args[0];n.git&&(s&&n.git.hooks&&(delete n.git.hooks,r.success("\u2713 Removed hooks configuration from basis.config.ts")),i&&n.git.config&&(delete n.git.config,r.success("\u2713 Removed git config from basis.config.ts")),Object.keys(n.git).length===0&&(delete n.git,r.success("\u2713 Removed empty git section from basis.config.ts")));const{code:u}=x(c);return await w(e,u,"utf8"),!0}catch(t){return r.error("\u2717 Failed to update basis.config.ts:",t),!1}}async function K(o=process.cwd(),s,i={}){const e=l(o,".git/hooks");if(!await g(e))return r.warn("Git hooks directory not found. Is this a Git repository?"),!0;let t=!0;if(s&&s.length>0)for(const c of s){const a=l(e,c);if(await g(a))try{await G(a),r.success(`\u2713 Removed ${c} hook`)}catch(n){r.error(`\u2717 Failed to remove ${c} hook:`,n),t=!1}}else{const{config:c}=await d({cwd:o}),a=c.git?.hooks||{};for(const n of Object.keys(a)){const u=l(e,n);if(await g(u))try{await G(u),r.success(`\u2713 Removed ${n} hook`)}catch(f){r.error(`\u2717 Failed to remove ${n} hook:`,f),t=!1}}if(i.updateConfig){const n=await C(o,!0,!1);t=t&&n}}return t}export{k as a,A as b,B as c,h as d,H as i,M as l,$ as p,K as r,v as s,F as v,y as w};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{writeFile as b}from"node:fs/promises";import{consola as t}from"consola";import{parseModule as f,generateCode as m,builders as y}from"magicast";import{detectPackageManager as k,addDevDependency as h,installDependencies as x}from"nypm";import{resolve as d}from"pathe";import{readPackageJSON as C,writePackageJSON as $}from"pkg-types";import{f as u}from"./basis.C7U9rUSl.mjs";function v(){const i=f("export default {}"),n=y.functionCall("defineBasisConfig",[{}]),a={staged:{},project:{}},c={hooks:{}},o=n.$args[0];o.lint=a,o.git=c,i.exports.default=n,i.imports.$prepend({from:"@funish/basis",imported:"defineBasisConfig"});const{code:r}=m(i);return r}function g(i){const{enableStagedLinting:n=!1,enableCommitMsgLinting:a=!1,customLintPatterns:c,customExcludePatterns:o}=i,r=f("export default defineBasisConfig({})"),e=r.exports.default.$args[0];e.lint={},e.lint.staged={},n&&(e.lint.staged["*.{js,ts,jsx,tsx}"]="eslint --fix",e.lint.staged["*.{css,scss,less}"]="stylelint --fix"),e.lint.project={patterns:c||["src/**/*","lib/**/*","*.{js,ts,jsx,tsx}"],exclude:o||["node_modules/**","dist/**","build/**"]},e.git={},e.git.hooks={},n&&(e.git.hooks["pre-commit"]="basis lint --staged"),a&&(e.git.hooks["commit-msg"]="basis git --lint-commit"),e.git.commitMsg={},r.imports.$items.some(s=>s.from==="@funish/basis")||r.imports.$prepend({from:"@funish/basis",imported:"defineBasisConfig"});const{code:l}=m(r);return l}async function D(){const i=await t.prompt("Enable staged files linting?",{type:"confirm",initial:!0}),n=await t.prompt("Enable commit message linting?",{type:"confirm",initial:!0});let a;if(await t.prompt("Customize lint file patterns?",{type:"confirm",initial:!1})){const c=await t.prompt("Enter lint patterns (comma-separated):",{type:"text",initial:"src/**/*,lib/**/*,*.{js,ts,jsx,tsx}"});typeof c=="string"&&(a=c.split(",").map(o=>o.trim()))}return{enableStagedLinting:i,enableCommitMsgLinting:n,customLintPatterns:a}}async function j(i=process.cwd(),n={}){const{force:a=!1,skipGitCheck:c=!1,skipInstall:o=!1}=n;t.start("Initializing basis configuration...");const r=d(i,"basis.config.ts");if(await u(r)&&!a)return t.error("basis.config.ts already exists. Use --force to overwrite."),!1;if(!c&&!await u(d(i,".git"))&&(t.warn("No .git directory found. Git hooks will not work properly."),!await t.prompt("Continue anyway?",{type:"confirm",initial:!1})))return t.info("Initialization cancelled."),!1;let e;if(await t.prompt("Use interactive setup?",{type:"confirm",initial:!0})){const s=await D();e=g(s)}else e=v();const l=(await k(i))?.name||"npm";t.info(`Detected package manager: ${l}`),await b(r,e,"utf-8"),t.success("Created basis.config.ts with dynamic configuration");try{const s=await C(i),w=!!(s.workspaces||await u(d(i,"pnpm-workspace.yaml")));o?!s.devDependencies?.["@funish/basis"]&&!s.dependencies?.["@funish/basis"]&&(s.devDependencies=s.devDependencies||{},s.devDependencies["@funish/basis"]="latest",t.info("Added @funish/basis to devDependencies")):(await h("@funish/basis",{cwd:i,silent:!1,workspace:w}),t.success("Added @funish/basis to devDependencies"));const p="basis git --setup";s.scripts=s.scripts||{},l==="pnpm"?s.scripts.postinstall?s.scripts.postinstall.includes(p)||(s.scripts.postinstall=`${s.scripts.postinstall} && ${p}`):s.scripts.postinstall=p:l==="yarn"?s.scripts.prepare?s.scripts.prepare.includes(p)||(s.scripts.prepare=`${s.scripts.prepare} && ${p}`):s.scripts.prepare=p:s.scripts.postinstall?s.scripts.postinstall.includes(p)||(s.scripts.postinstall=`${s.scripts.postinstall} && ${p}`):s.scripts.postinstall=p,await $(d(i,"package.json"),s),t.success(`Updated package.json scripts${o?" and dependencies":""}`),o?(t.info("Skipped dependency installation"),t.info("Run your package manager's install command to complete setup")):(t.start("Installing dependencies..."),await x({cwd:i,silent:!1}),t.success("Dependencies installed successfully"))}catch(s){return t.error("Failed to setup dependencies:",s),!1}return t.success("Basis initialization completed!"),t.info("You can now:"),t.info(" - Edit basis.config.ts to customize your configuration"),t.info(" - Run `basis git setup` to install git hooks"),!0}function B(i={}){return g(i)}function M(){const i=f("export default defineBasisConfig({})"),n=i.exports.default.$args[0];n.lint={staged:{}},n.git={hooks:{},commitMsg:{}},i.imports.$prepend({from:"@funish/basis",imported:"defineBasisConfig"});const{code:a}=m(i);return a}export{M as c,j as i,B as p};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
"use strict";const promises=require("node:fs/promises"),c12=require("c12"),config=require("../config.cjs");async function loadConfig(s={}){return await c12.loadConfig({name:"basis",cwd:process.cwd(),...s,defaults:{...config.defaultConfig,...s.defaults}})}async function fileExists(s){try{return await promises.access(s),!0}catch{return!1}}exports.fileExists=fileExists,exports.loadConfig=loadConfig;
|
|
@@ -1,3 +0,0 @@
|
|
|
1
|
-
"use strict";const node_child_process=require("node:child_process"),promises=require("node:fs/promises"),consola=require("consola"),w=require("micromatch"),nypm=require("nypm"),pathe=require("pathe"),pkgTypes=require("pkg-types"),utils=require("./basis.DcyVtmjR.cjs");function _interopDefaultCompat(e){return e&&typeof e=="object"&&"default"in e?e.default:e}const w__default=_interopDefaultCompat(w);function getStagedFiles(){try{const e=node_child_process.execSync("git diff --cached --name-only",{encoding:"utf8"}).trim().split(`
|
|
2
|
-
`).filter(Boolean),s=node_child_process.execSync("git diff --cached --name-only --diff-filter=D",{encoding:"utf8"}),c=new Set(s.trim().split(`
|
|
3
|
-
`).filter(Boolean));return e.filter(t=>!c.has(t))}catch{return[]}}async function getProjectFiles(e,s=["**/*"],c=["node_modules/**","dist/**","build/**",".git/**"]){const t=[];async function i(n,o=0){if(!(o>10))try{const d=await promises.readdir(n);for(const f of d){const r=pathe.join(n,f),a=r.replace(`${e}/`,"");if(c.some(l=>w__default.isMatch(a,l)))continue;const u=await promises.stat(r);u.isDirectory()?await i(r,o+1):u.isFile()&&s.some(l=>w__default.isMatch(a,l))&&t.push(a)}}catch{}}return await i(e),t}async function lintStaged(e=process.cwd(),s){const{config:c}=await utils.loadConfig({cwd:e,overrides:s?{lint:{staged:s}}:void 0}),t=c.lint?.staged||{},i=getStagedFiles();if(i.length===0)return consola.consola.info("No staged files to lint"),!0;if(Object.keys(t).length===0)return consola.consola.warn("No staged lint configuration found"),!0;let n=!1;const o=new Set;for(const[d,f]of Object.entries(t)){const r=i.filter(a=>!o.has(a)&&w__default.isMatch(a.split("/").pop()||a,d));if(r.length!==0){consola.consola.start(`Linting ${r.length} files: ${d}`);try{const a=`${f} ${r.join(" ")}`;node_child_process.execSync(a,{stdio:"inherit",cwd:e});const u=[];for(const l of r)await utils.fileExists(pathe.resolve(e,l))&&u.push(l);u.length>0&&node_child_process.execSync(`git add ${u.join(" ")}`,{stdio:"inherit",cwd:e}),r.forEach(l=>o.add(l)),consola.consola.success(`\u2713 ${d}`)}catch(a){n=!0,consola.consola.error(`\u2717 ${d} failed:`,a)}}}return!n}async function lintProject(e=process.cwd(),s){const{config:c}=await utils.loadConfig({cwd:e,overrides:s?{lint:{project:s}}:void 0}),t=c.lint?.project||{};if(Object.keys(t).length===0)return consola.consola.warn("No project lint configuration found"),!0;consola.consola.start("Running project-wide linting...");let i=!1;for(const[n,o]of Object.entries(t)){consola.consola.start(`Running project lint: ${n}`);try{node_child_process.execSync(o,{stdio:"inherit",cwd:e}),consola.consola.success(`\u2713 ${n}`)}catch(d){i=!0,consola.consola.error(`\u2717 ${n} failed:`,d)}}return!i}async function lintDependencies(e=process.cwd(),s){const{config:c}=await utils.loadConfig({cwd:e,overrides:s?{lint:{dependencies:s}}:void 0}),t=c.lint?.dependencies||{};let i=!1;try{const n=await pkgTypes.readPackageJSON(e),o={...n.dependencies,...n.devDependencies},d=(await nypm.detectPackageManager(e))?.name||"npm",f=F(d);if(consola.consola.start("Checking dependencies..."),t.blockedPackages&&t.blockedPackages.length>0){const r=Object.keys(o).filter(a=>t.blockedPackages?.includes(a));r.length>0?(consola.consola.error(`\u2717 Blocked packages found: ${r.join(", ")}`),i=!0):consola.consola.success("\u2713 No blocked packages found")}if(t.checkOutdated)try{node_child_process.execSync(f.outdated,{cwd:e,stdio:"pipe"}),consola.consola.success("\u2713 All dependencies are up to date")}catch(r){consola.consola.warn("\u26A0 Some dependencies are outdated:",r)}if(t.checkSecurity)try{node_child_process.execSync(f.audit,{cwd:e,stdio:"pipe"}),consola.consola.success("\u2713 No security vulnerabilities found")}catch(r){consola.consola.error("\u2717 Security vulnerabilities detected:",r),i=!0}t.allowedLicenses&&t.allowedLicenses.length>0&&consola.consola.info("\u{1F4DD} License checking requires manual review or additional tooling")}catch(n){consola.consola.error("Failed to check dependencies:",n),i=!0}return!i}async function lintStructure(e=process.cwd(),s){const{config:c}=await utils.loadConfig({cwd:e,overrides:s?{lint:{structure:s}}:void 0}),t=c.lint?.structure||{};let i=!1;if(consola.consola.start("Checking project structure..."),t.requiredFiles)for(const n of t.requiredFiles){const o=pathe.resolve(e,n);await utils.fileExists(o)?consola.consola.success(`\u2713 Required file found: ${n}`):(consola.consola.error(`\u2717 Required file missing: ${n}`),i=!0)}if(t.requiredDirs)for(const n of t.requiredDirs){const o=pathe.resolve(e,n);await utils.fileExists(o)?consola.consola.success(`\u2713 Required directory found: ${n}`):(consola.consola.error(`\u2717 Required directory missing: ${n}`),i=!0)}if(t.naming&&t.naming.length>0)for(const n of t.naming){const{path:o,files:d,directories:f,description:r}=n;consola.consola.start(`Checking naming rule: ${r||o}`);const a=await getProjectFiles(e,[o]);if(d){const u=new RegExp(d),l=a.filter(p=>{const g=p.split("/").pop()||"";return!u.test(g)});l.length>0?(consola.consola.error(`\u2717 Files with invalid naming in ${o}: ${l.slice(0,3).join(", ")}${l.length>3?"...":""}`),i=!0):a.length>0&&consola.consola.success(`\u2713 All files in ${o} follow naming convention`)}if(f){const u=new RegExp(f),l=new Set;a.forEach(g=>{const h=g.split("/");h.pop(),h.forEach(m=>l.add(m))});const p=Array.from(l).filter(g=>!u.test(g));p.length>0?(consola.consola.error(`\u2717 Directories with invalid naming in ${o}: ${p.slice(0,3).join(", ")}`),i=!0):l.size>0&&consola.consola.success(`\u2713 All directories in ${o} follow naming convention`)}}return!i}async function lintDocs(e=process.cwd(),s){const{config:c}=await utils.loadConfig({cwd:e,overrides:s?{lint:{docs:s}}:void 0}),t=c.lint?.docs||{};let i=!1;if(consola.consola.start("Checking documentation..."),t.checkReadme!==!1){const n=["README.md","README.rst","README.txt","readme.md"];(await Promise.all(n.map(o=>utils.fileExists(pathe.resolve(e,o))))).some(o=>o)?consola.consola.success("\u2713 README file found"):(consola.consola.error("\u2717 No README file found"),i=!0)}if(t.checkChangelog){const n=["CHANGELOG.md","CHANGELOG.rst","HISTORY.md","changelog.md"];(await Promise.all(n.map(o=>utils.fileExists(pathe.resolve(e,o))))).some(o=>o)?consola.consola.success("\u2713 CHANGELOG file found"):(consola.consola.error("\u2717 No CHANGELOG file found"),i=!0)}return!i}async function lintAll(e=process.cwd()){const{config:s}=await utils.loadConfig({cwd:e}),c=s.lint||{};consola.consola.start("Running comprehensive project lint...");const t=(await Promise.allSettled([lintProject(e,c.project),lintDependencies(e,c.dependencies),lintStructure(e,c.structure),lintDocs(e,c.docs)])).filter(i=>i.status==="rejected"||i.status==="fulfilled"&&!i.value);return t.length===0?(consola.consola.success("\u2705 All lint checks passed!"),!0):(consola.consola.error(`\u274C ${t.length} lint check(s) failed`),!1)}function F(e){switch(e){case"yarn":return{outdated:"yarn outdated --json",audit:"yarn audit --level moderate"};case"pnpm":return{outdated:"pnpm outdated --format table",audit:"pnpm audit --audit-level moderate"};case"bun":return{outdated:"bun outdated",audit:"bun audit --audit-level moderate"};default:return{outdated:"npm outdated --json",audit:"npm audit --audit-level moderate"}}}exports.getProjectFiles=getProjectFiles,exports.getStagedFiles=getStagedFiles,exports.lintAll=lintAll,exports.lintDependencies=lintDependencies,exports.lintDocs=lintDocs,exports.lintProject=lintProject,exports.lintStaged=lintStaged,exports.lintStructure=lintStructure;
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use strict";const node_child_process=require("node:child_process"),promises=require("node:fs/promises"),consola=require("consola"),G=require("ini"),magicast=require("magicast"),pathe=require("pathe"),utils=require("./basis.DcyVtmjR.cjs");function _interopDefaultCompat(o){return o&&typeof o=="object"&&"default"in o?o.default:o}const G__default=_interopDefaultCompat(G),P=["feat","fix","docs","style","refactor","perf","test","build","ci","chore","revert"];function parseCommitMessage(o){const i=o.trim().split(`
|
|
2
|
-
`),s=i[0].match(/^(\w+)(\(([^)]+)\))?(!)?:\s*(.+)$/);if(!s)return null;const[,e,,t,r,c]=s,n=i.slice(1).find(l=>l.trim())?.trim(),a=i.slice(-1)[0]?.trim();return{type:e,scope:t,description:c,body:n,footer:a,isBreaking:!!r||o.includes("BREAKING CHANGE:")}}function validateCommitMessage(o,i={}){const s=[],{types:e=P,maxLength:t=72,minLength:r=10,scopeRequired:c=!1,allowedScopes:n=[]}=i,a=parseCommitMessage(o);if(!a)return{valid:!1,errors:["Invalid commit format. Expected: type(scope): description"]};e.includes(a.type)||s.push(`Invalid type '${a.type}'. Allowed: ${e.join(", ")}`);const l=o.split(`
|
|
3
|
-
`)[0];return l.length>t&&s.push(`Header too long (${l.length}). Max: ${t}`),l.length<r&&s.push(`Header too short (${l.length}). Min: ${r}`),c&&!a.scope&&s.push("Scope is required"),a.scope&&n.length>0&&!n.includes(a.scope)&&s.push(`Invalid scope '${a.scope}'. Allowed: ${n.join(", ")}`),{valid:s.length===0,errors:s}}async function lintCommitMessage(o=process.cwd(),i){const{config:s}=await utils.loadConfig({cwd:o,overrides:i?{git:{commitMsg:i}}:void 0}),e=s.git?.commitMsg||{};let t;try{const c=pathe.resolve(".git/COMMIT_EDITMSG");await utils.fileExists(c)?t=(await promises.readFile(c)).toString("utf8"):t=node_child_process.execSync("git log -1 --pretty=%B",{encoding:"utf8"}).trim()}catch(c){return consola.consola.error("\u2717 Failed to read commit message:",c),!1}const r=validateCommitMessage(t,e);return r.valid?(consola.consola.success("\u2713 Commit message is valid"),!0):(consola.consola.error("\u2717 Invalid commit message:"),r.errors.forEach(c=>consola.consola.error(` ${c}`)),!1)}async function k(o){const i=pathe.resolve(o,".git/config");if(!await utils.fileExists(i))return null;const s=new Date().toISOString().replace(/[:.]/g,"-"),e=pathe.resolve(o,`.git/config.backup.${s}`);try{return await promises.copyFile(i,e),consola.consola.info(`\u{1F4C4} Created backup: ${e}`),e}catch(t){return consola.consola.warn("Failed to create Git config backup:",t),null}}async function readGitConfig(o=process.cwd()){const i=pathe.resolve(o,".git/config");if(!await utils.fileExists(i))return consola.consola.info("No .git/config found, will create new one"),{};try{const s=await promises.readFile(i,"utf8"),e=G__default.parse(s);return consola.consola.success(`\u2713 Read existing Git configuration from ${i}`),e}catch(s){return consola.consola.warn("Failed to read .git/config:",s),{}}}async function writeGitConfig(o,i=process.cwd()){const s=pathe.resolve(i,".git/config");try{let e=G__default.stringify(o,{whitespace:!0});e=e.split(`
|
|
4
|
-
`).map(t=>t&&!t.startsWith("[")&&t.includes("=")?` ${t}`:t).join(`
|
|
5
|
-
`),await promises.writeFile(s,e,"utf8"),consola.consola.success(`\u2713 Git configuration written to ${s}`)}catch(e){throw consola.consola.error("Failed to write .git/config:",e),e}}function x(o){const i={};return o&&Object.entries(o).forEach(([s,e])=>{typeof e=="object"&&e!==null&&(i[s]||(i[s]={}),Object.entries(e).forEach(([t,r])=>{r!==void 0&&(i[s][t]=r)}))}),i}function S(o,i){const s={...o};return Object.entries(i).forEach(([e,t])=>{typeof t=="object"&&t!==null&&(s[e]||(s[e]={}),Object.entries(t).forEach(([r,c])=>{c!==void 0&&(s[e][r]=c,consola.consola.info(`\u{1F527} Setting ${e}.${r} = ${c}`))}))}),s}async function setupGitConfig(o=process.cwd(),i){const{config:s}=await utils.loadConfig({cwd:o,overrides:i?{git:{config:i}}:void 0}),e=s.git?.config||{};if(Object.keys(e).length===0)return consola.consola.info("No Git configuration settings to apply"),!0;try{const t=await k(o),r=await readGitConfig(o),c=x(e),n=S(r,c);return await writeGitConfig(n,o),consola.consola.success("\u2713 Git configuration setup completed"),t&&consola.consola.info(`\u{1F4BE} Original config backed up to: ${t.split("/").pop()}`),!0}catch(t){return consola.consola.error("\u2717 Failed to setup Git configuration:",t),!1}}async function resetGitConfig(o=process.cwd(),i=!0,s={}){try{const e=await k(o),t=await readGitConfig(o);if(!t||Object.keys(t).length===0)return consola.consola.info("No Git configuration found to reset"),!0;const r={};if(i&&t.user&&(r.user=t.user,consola.consola.info("\u{1F512} Keeping user configuration (name, email)")),t.core){const c=["repositoryformatversion","filemode","bare","logallrefupdates"],n={};c.forEach(a=>{t.core[a]!==void 0&&(n[a]=t.core[a])}),Object.keys(n).length>0&&(r.core=n,consola.consola.info("\u{1F512} Keeping essential core Git settings"))}return await writeGitConfig(r,o),consola.consola.success("\u2713 Git configuration reset completed"),e&&consola.consola.info(`\u{1F4BE} Original config backed up to: ${e.split("/").pop()}`),s.updateConfig?await b(o,!1,!0):!0}catch(e){return consola.consola.error("\u2717 Failed to reset Git configuration:",e),!1}}async function setupGitHooks(o=process.cwd(),i){const{config:s}=await utils.loadConfig({cwd:o,overrides:i?{git:{hooks:i}}:void 0}),e=s.git?.hooks||{},t=pathe.resolve(o,".git/hooks");if(!await utils.fileExists(t))return consola.consola.error("\u2717 Git hooks directory not found. Is this a Git repository?"),!1;let r=!0;for(const[c,n]of Object.entries(e)){const a=pathe.resolve(t,c);try{let l=`#!/bin/sh
|
|
6
|
-
|
|
7
|
-
`;if(typeof n=="string")l+=`${n}
|
|
8
|
-
`;else if(n&&typeof n=="object"&&"commands"in n){const u=n.commands;l+=`${u.join(`
|
|
9
|
-
`)}
|
|
10
|
-
`}await promises.writeFile(a,l,{mode:493}),consola.consola.success(`\u2713 Setup ${c} hook`)}catch(l){consola.consola.error(`\u2717 Failed to setup ${c} hook:`,l),r=!1}}return r}async function initGitRepo(o=process.cwd()){try{try{node_child_process.execSync("git rev-parse --git-dir",{cwd:o,stdio:"pipe"}),consola.consola.info("Git repository already exists")}catch{node_child_process.execSync("git init",{cwd:o,stdio:"inherit"}),consola.consola.success("\u2713 Initialized Git repository")}const i=await setupGitConfig(o),s=await setupGitHooks(o);return i&&s}catch(i){return consola.consola.error("\u2717 Failed to initialize Git repository:",i),!1}}async function setupGit(o=process.cwd()){const{config:i}=await utils.loadConfig({cwd:o}),s=i.git||{};consola.consola.start("Setting up Git configuration...");const e=(await Promise.allSettled([setupGitConfig(o,s.config),setupGitHooks(o,s.hooks)])).filter(t=>t.status==="rejected"||t.status==="fulfilled"&&!t.value);return e.length===0?(consola.consola.success("\u2705 Git setup completed successfully!"),!0):(consola.consola.error(`\u274C ${e.length} Git setup step(s) failed`),!1)}async function b(o,i=!1,s=!1){const e=pathe.resolve(o,"basis.config.ts");if(!await utils.fileExists(e))return consola.consola.info("No basis.config.ts found to update"),!0;try{const t=await promises.readFile(e,"utf8"),r=magicast.parseModule(t),c=r.exports.default;if(!c||!c.$args?.[0])return consola.consola.warn("Could not parse basis.config.ts structure"),!1;const n=c.$args[0];n.git&&(i&&n.git.hooks&&(delete n.git.hooks,consola.consola.success("\u2713 Removed hooks configuration from basis.config.ts")),s&&n.git.config&&(delete n.git.config,consola.consola.success("\u2713 Removed git config from basis.config.ts")),Object.keys(n.git).length===0&&(delete n.git,consola.consola.success("\u2713 Removed empty git section from basis.config.ts")));const{code:a}=magicast.generateCode(r);return await promises.writeFile(e,a,"utf8"),!0}catch(t){return consola.consola.error("\u2717 Failed to update basis.config.ts:",t),!1}}async function removeGitHooks(o=process.cwd(),i,s={}){const e=pathe.resolve(o,".git/hooks");if(!await utils.fileExists(e))return consola.consola.warn("Git hooks directory not found. Is this a Git repository?"),!0;let t=!0;if(i&&i.length>0)for(const r of i){const c=pathe.resolve(e,r);if(await utils.fileExists(c))try{await promises.unlink(c),consola.consola.success(`\u2713 Removed ${r} hook`)}catch(n){consola.consola.error(`\u2717 Failed to remove ${r} hook:`,n),t=!1}}else{const{config:r}=await utils.loadConfig({cwd:o}),c=r.git?.hooks||{};for(const n of Object.keys(c)){const a=pathe.resolve(e,n);if(await utils.fileExists(a))try{await promises.unlink(a),consola.consola.success(`\u2713 Removed ${n} hook`)}catch(l){consola.consola.error(`\u2717 Failed to remove ${n} hook:`,l),t=!1}}if(s.updateConfig){const n=await b(o,!0,!1);t=t&&n}}return t}exports.initGitRepo=initGitRepo,exports.lintCommitMessage=lintCommitMessage,exports.parseCommitMessage=parseCommitMessage,exports.readGitConfig=readGitConfig,exports.removeGitHooks=removeGitHooks,exports.resetGitConfig=resetGitConfig,exports.setupGit=setupGit,exports.setupGitConfig=setupGitConfig,exports.setupGitHooks=setupGitHooks,exports.validateCommitMessage=validateCommitMessage,exports.writeGitConfig=writeGitConfig;
|