@funish/basis 0.0.5 → 0.0.7

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.
Files changed (39) hide show
  1. package/README.md +26 -22
  2. package/dist/chunks/config.cjs +1 -1
  3. package/dist/chunks/config.mjs +1 -1
  4. package/dist/chunks/git.cjs +1 -1
  5. package/dist/chunks/git.mjs +1 -1
  6. package/dist/chunks/init.cjs +1 -1
  7. package/dist/chunks/init.mjs +1 -1
  8. package/dist/chunks/lint.cjs +1 -1
  9. package/dist/chunks/lint.mjs +1 -1
  10. package/dist/chunks/publish.cjs +1 -1
  11. package/dist/chunks/publish.mjs +1 -1
  12. package/dist/chunks/version.cjs +1 -1
  13. package/dist/chunks/version.mjs +1 -1
  14. package/dist/config.cjs +1 -1
  15. package/dist/config.mjs +1 -1
  16. package/dist/index.cjs +1 -1
  17. package/dist/index.d.cts +3 -0
  18. package/dist/index.d.mts +3 -0
  19. package/dist/index.d.ts +3 -0
  20. package/dist/index.mjs +1 -1
  21. package/dist/shared/{basis.BzZ6Bs64.mjs → basis.1_Z0I9PT.mjs} +1 -1
  22. package/dist/shared/basis.BIUEmg1C.mjs +1 -0
  23. package/dist/shared/{basis.DFb1F94b.mjs → basis.B_nrd74H.mjs} +1 -1
  24. package/dist/shared/basis.C2jy0pwk.mjs +10 -0
  25. package/dist/shared/{basis.DADpzLwA.cjs → basis.CCOrCJM8.cjs} +1 -1
  26. package/dist/shared/{basis.C-dGsxlD.cjs → basis.CITlWl4E.cjs} +1 -1
  27. package/dist/shared/{basis.CKFXZgQI.mjs → basis.CSrt7vG8.mjs} +1 -1
  28. package/dist/shared/{basis.Dgo48zAG.cjs → basis.CjDkLZ8j.cjs} +1 -1
  29. package/dist/shared/basis.DjCUp0ej.cjs +8 -0
  30. package/dist/shared/basis.cvMXIHAl.cjs +1 -0
  31. package/dist/shared/basis.gpPjNGLA.cjs +10 -0
  32. package/dist/shared/basis.y1NlNHFi.mjs +8 -0
  33. package/package.json +1 -1
  34. package/dist/shared/basis.Bar6V_OJ.cjs +0 -10
  35. package/dist/shared/basis.CCjpKO-B.mjs +0 -8
  36. package/dist/shared/basis.DEw91E2d.mjs +0 -1
  37. package/dist/shared/basis.DVSF1f2D.cjs +0 -8
  38. package/dist/shared/basis.DfY4XEAb.cjs +0 -1
  39. package/dist/shared/basis.DzKnyliK.mjs +0 -10
package/README.md CHANGED
@@ -49,8 +49,8 @@ pnpm add -D @funish/basis
49
49
  # Or with npm
50
50
  npm install -D @funish/basis
51
51
 
52
- # Or use directly with pnpx (recommended over npx)
53
- pnpx @funish/basis init
52
+ # Or use directly without installation
53
+ npx @funish/basis init
54
54
  ```
55
55
 
56
56
  ### Initialize in Existing Project
@@ -64,7 +64,7 @@ basis init
64
64
  # 🔧 Optionally setup Git hooks and configuration
65
65
 
66
66
  # Your project now has:
67
- # ✅ basis.config.[ts|mjs|cjs] configuration file (empty, ready to customize)
67
+ # ✅ Configuration file with Git hooks that adapt to your package manager
68
68
  # ✅ Git hooks setup (if selected during init)
69
69
  # ✅ Tool-agnostic linting workflow
70
70
  # ✅ Package management through unified CLI
@@ -183,7 +183,7 @@ basis git reset --update-config # Reset config AND remove from basis.con
183
183
  basis git init
184
184
 
185
185
  # Validate commit message
186
- basis git lint-commit
186
+ basis git --lint-commit
187
187
  ```
188
188
 
189
189
  ### Project Management
@@ -212,25 +212,21 @@ basis <command> --help # Show command-specific help
212
212
 
213
213
  ## Configuration
214
214
 
215
- Basis uses a single configuration file for all its features. The `basis init` command creates an empty configuration file in your preferred format:
215
+ Basis uses a single configuration file for all its features. The `basis init` command creates a configuration file with customized Git hooks in your preferred format:
216
216
 
217
217
  ```ts
218
- // basis.config.ts (TypeScript)
219
- import { defineBasisConfig } from "@funish/basis";
220
-
221
- export default defineBasisConfig({
222
- // Configure your project here
223
- // See: https://github.com/funish/basis/tree/main/packages/basis#configuration
224
- });
225
- ```
226
-
227
- ```mjs
228
- // basis.config.mjs (ES Module)
218
+ // basis.config.ts (TypeScript) or basis.config.mjs (ES Module)
229
219
  import { defineBasisConfig } from "@funish/basis";
230
220
 
231
221
  export default defineBasisConfig({
232
222
  // Configure your project here
233
223
  // See: https://github.com/funish/basis/tree/main/packages/basis#configuration
224
+ git: {
225
+ hooks: {
226
+ "pre-commit": "pnpm exec basis lint --staged", // Auto-adapts to your package manager
227
+ "commit-msg": "pnpm exec basis git --lint-commit",
228
+ },
229
+ },
234
230
  });
235
231
  ```
236
232
 
@@ -241,9 +237,17 @@ const { defineBasisConfig } = require("@funish/basis");
241
237
  module.exports = defineBasisConfig({
242
238
  // Configure your project here
243
239
  // See: https://github.com/funish/basis/tree/main/packages/basis#configuration
240
+ git: {
241
+ hooks: {
242
+ "pre-commit": "npx basis lint --staged", // Auto-adapts to your package manager
243
+ "commit-msg": "npx basis git --lint-commit",
244
+ },
245
+ },
244
246
  });
245
247
  ```
246
248
 
249
+ > **💡 Configuration**: The generated config file only shows the Git hooks that are customized for your package manager. All other configuration options use smart defaults and can be added as needed.
250
+
247
251
  ### Full Configuration Example
248
252
 
249
253
  Here's a complete configuration with all available options:
@@ -272,8 +276,8 @@ export default defineBasisConfig({
272
276
  git: {
273
277
  // Hook commands
274
278
  hooks: {
275
- "pre-commit": "pnpm basis lint --staged",
276
- "commit-msg": "pnpm basis git lint-commit",
279
+ "pre-commit": "pnpm exec basis lint --staged",
280
+ "commit-msg": "pnpm exec basis git --lint-commit",
277
281
  },
278
282
 
279
283
  // Commit message validation
@@ -411,24 +415,24 @@ Basis integrates seamlessly with:
411
415
 
412
416
  ## Why Choose Basis?
413
417
 
414
- ### Instead of this:
418
+ ### Instead of juggling multiple tools:
415
419
 
416
420
  ```bash
417
421
  npm install package # Package management
418
422
  yarn version patch # Version management
419
423
  npm publish --tag beta # Publishing
420
424
  npx lint-staged # Linting
421
- npx husky install # Git hooks
425
+ git config --global ... # Git configuration
422
426
  ```
423
427
 
424
- ### Do this:
428
+ ### Use one unified command:
425
429
 
426
430
  ```bash
427
431
  basis add package # Unified package management
428
432
  basis version patch # Unified version management
429
433
  basis publish --tag beta # Unified publishing
430
434
  basis lint --staged # Unified linting
431
- basis git hooks # Unified git hooks
435
+ basis git setup # Unified git setup
432
436
  ```
433
437
 
434
438
  ## API
@@ -1 +1 @@
1
- "use strict";const citty=require("citty"),consola=require("consola"),utils=require("../shared/basis.DfY4XEAb.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}`)}}}catch(s){consola.consola.error("Failed to load configuration:",s),process.exit(1)}}});exports.default=config;
1
+ "use strict";const citty=require("citty"),consola=require("consola"),utils=require("../shared/basis.cvMXIHAl.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}`)}}}catch(s){consola.consola.error("Failed to load configuration:",s),process.exit(1)}}});exports.default=config;
@@ -1 +1 @@
1
- import{defineCommand as r}from"citty";import{consola as o}from"consola";import{l as a}from"../shared/basis.DEw91E2d.mjs";import"node:fs/promises";import"c12";import"../config.mjs";const f=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}`)}}}catch(g){o.error("Failed to load configuration:",g),process.exit(1)}}});export{f as default};
1
+ import{defineCommand as r}from"citty";import{consola as o}from"consola";import{l as a}from"../shared/basis.BIUEmg1C.mjs";import"node:fs/promises";import"c12";import"../config.mjs";const f=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}`)}}}catch(g){o.error("Failed to load configuration:",g),process.exit(1)}}});export{f as default};
@@ -1 +1 @@
1
- "use strict";const citty=require("citty"),consola=require("consola"),git$1=require("../shared/basis.Bar6V_OJ.cjs");require("node:child_process"),require("node:fs/promises"),require("c12/update"),require("defu"),require("ini"),require("pathe"),require("../shared/basis.DfY4XEAb.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();await git$1.setupGitConfig(e)||(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();await git$1.setupGitHooks(e)||(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(),i=e.hooks&&typeof e.hooks=="string"?[e.hooks]:Array.isArray(e.hooks)?e.hooks.filter(s=>typeof s=="string"):void 0,t=typeof e["update-config"]=="boolean"?e["update-config"]:!1;await git$1.removeGitHooks(o,i,{updateConfig:t})||(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(),i=typeof e["keep-user"]=="boolean"?e["keep-user"]:!0,t=typeof e["update-config"]=="boolean"?e["update-config"]:!1;await git$1.resetGitConfig(o,i,{updateConfig:t})||(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();await git$1.initGitRepo(e)||(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();await git$1.lintCommitMessage(e)||(consola.consola.error("Commit message validation failed"),process.exit(1))}})},async run(){}});exports.git=git;
1
+ "use strict";const citty=require("citty"),consola=require("consola"),git$1=require("../shared/basis.gpPjNGLA.cjs");require("node:child_process"),require("node:fs/promises"),require("c12/update"),require("defu"),require("ini"),require("pathe"),require("../shared/basis.cvMXIHAl.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();await git$1.setupGitConfig(e)||(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();await git$1.setupGitHooks(e)||(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(),i=e.hooks&&typeof e.hooks=="string"?[e.hooks]:Array.isArray(e.hooks)?e.hooks.filter(s=>typeof s=="string"):void 0,t=typeof e["update-config"]=="boolean"?e["update-config"]:!1;await git$1.removeGitHooks(o,i,{updateConfig:t})||(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(),i=typeof e["keep-user"]=="boolean"?e["keep-user"]:!0,t=typeof e["update-config"]=="boolean"?e["update-config"]:!1;await git$1.resetGitConfig(o,i,{updateConfig:t})||(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();await git$1.initGitRepo(e)||(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();await git$1.lintCommitMessage(e)||(consola.consola.error("Commit message validation failed"),process.exit(1))}})},async run(){}});exports.git=git;
@@ -1 +1 @@
1
- import{defineCommand as e}from"citty";import{consola as i}from"consola";import{l as r,i as c,b as p,d as m,c as f,a as d,s as u}from"../shared/basis.DzKnyliK.mjs";import"node:child_process";import"node:fs/promises";import"c12/update";import"defu";import"ini";import"pathe";import"../shared/basis.DEw91E2d.mjs";import"c12";import"../config.mjs";const l=e({meta:{name:"git",description:"Git configuration and hooks management"},subCommands:{setup:e({meta:{name:"setup",description:"Setup Git configuration and hooks"},async run(){const o=process.cwd();await u(o)||process.exit(1)}}),config:e({meta:{name:"config",description:"Setup Git configuration only"},async run(){const o=process.cwd();await d(o)||(i.error("Git configuration failed"),process.exit(1))}}),hooks:e({meta:{name:"hooks",description:"Setup Git hooks only"},async run(){const o=process.cwd();await f(o)||(i.error("Git hooks setup failed"),process.exit(1))}}),remove:e({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 t=process.cwd(),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 m(t,s,{updateConfig:a})||(i.error("Git hooks removal failed"),process.exit(1))}}),reset:e({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 t=process.cwd(),s=typeof o["keep-user"]=="boolean"?o["keep-user"]:!0,a=typeof o["update-config"]=="boolean"?o["update-config"]:!1;await p(t,s,{updateConfig:a})||(i.error("Git configuration reset failed"),process.exit(1))}}),init:e({meta:{name:"init",description:"Initialize Git repository with basis configuration"},async run(){const o=process.cwd();await c(o)||(i.error("Git initialization failed"),process.exit(1))}}),"lint-commit":e({meta:{name:"lint-commit",description:"Validate commit message"},async run(){const o=process.cwd();await r(o)||(i.error("Commit message validation failed"),process.exit(1))}})},async run(){}});export{l as git};
1
+ import{defineCommand as e}from"citty";import{consola as i}from"consola";import{l as r,i as c,b as p,d as m,c as f,a as d,s as u}from"../shared/basis.C2jy0pwk.mjs";import"node:child_process";import"node:fs/promises";import"c12/update";import"defu";import"ini";import"pathe";import"../shared/basis.BIUEmg1C.mjs";import"c12";import"../config.mjs";const l=e({meta:{name:"git",description:"Git configuration and hooks management"},subCommands:{setup:e({meta:{name:"setup",description:"Setup Git configuration and hooks"},async run(){const o=process.cwd();await u(o)||process.exit(1)}}),config:e({meta:{name:"config",description:"Setup Git configuration only"},async run(){const o=process.cwd();await d(o)||(i.error("Git configuration failed"),process.exit(1))}}),hooks:e({meta:{name:"hooks",description:"Setup Git hooks only"},async run(){const o=process.cwd();await f(o)||(i.error("Git hooks setup failed"),process.exit(1))}}),remove:e({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 t=process.cwd(),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 m(t,s,{updateConfig:a})||(i.error("Git hooks removal failed"),process.exit(1))}}),reset:e({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 t=process.cwd(),s=typeof o["keep-user"]=="boolean"?o["keep-user"]:!0,a=typeof o["update-config"]=="boolean"?o["update-config"]:!1;await p(t,s,{updateConfig:a})||(i.error("Git configuration reset failed"),process.exit(1))}}),init:e({meta:{name:"init",description:"Initialize Git repository with basis configuration"},async run(){const o=process.cwd();await c(o)||(i.error("Git initialization failed"),process.exit(1))}}),"lint-commit":e({meta:{name:"lint-commit",description:"Validate commit message"},async run(){const o=process.cwd();await r(o)||(i.error("Commit message validation failed"),process.exit(1))}})},async run(){}});export{l as git};
@@ -1 +1 @@
1
- "use strict";const citty=require("citty"),consola=require("consola"),init$1=require("../shared/basis.DVSF1f2D.cjs");require("c12/update"),require("magicast"),require("nypm"),require("pathe"),require("pkg-types"),require("../shared/basis.DfY4XEAb.cjs"),require("node:fs/promises"),require("c12"),require("../config.cjs"),require("../shared/basis.Bar6V_OJ.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 dependency installation"}},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;
1
+ "use strict";const citty=require("citty"),consola=require("consola"),init$1=require("../shared/basis.DjCUp0ej.cjs");require("c12/update"),require("magicast"),require("nypm"),require("pathe"),require("pkg-types"),require("../shared/basis.cvMXIHAl.cjs"),require("node:fs/promises"),require("c12"),require("../config.cjs"),require("../shared/basis.gpPjNGLA.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 dependency installation"}},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;
@@ -1 +1 @@
1
- import{defineCommand as o}from"citty";import{consola as r}from"consola";import{i as e}from"../shared/basis.CCjpKO-B.mjs";import"c12/update";import"magicast";import"nypm";import"pathe";import"pkg-types";import"../shared/basis.DEw91E2d.mjs";import"node:fs/promises";import"c12";import"../config.mjs";import"../shared/basis.DzKnyliK.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 dependency installation"}},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};
1
+ import{defineCommand as o}from"citty";import{consola as r}from"consola";import{i as e}from"../shared/basis.y1NlNHFi.mjs";import"c12/update";import"magicast";import"nypm";import"pathe";import"pkg-types";import"../shared/basis.BIUEmg1C.mjs";import"node:fs/promises";import"c12";import"../config.mjs";import"../shared/basis.C2jy0pwk.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 dependency installation"}},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};
@@ -1 +1 @@
1
- "use strict";const citty=require("citty"),consola=require("consola"),lint$1=require("../shared/basis.DADpzLwA.cjs");require("node:child_process"),require("fast-glob"),require("micromatch"),require("nypm"),require("pathe"),require("pkg-types"),require("../shared/basis.DfY4XEAb.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 t=process.cwd();let i=!0;if(!e.staged&&!e.project&&!e.deps&&!e.structure&&!e.docs&&!e.all&&(e.staged=!0),e.all)i=await lint$1.lintAll(t);else{const s=[];e.staged&&s.push(()=>lint$1.lintStaged(t)),e.project&&s.push(()=>lint$1.lintProject(t)),e.deps&&s.push(()=>lint$1.lintDependencies(t)),e.structure&&s.push(()=>lint$1.lintStructure(t)),e.docs&&s.push(()=>lint$1.lintDocs(t));for(const r of s)await r()||(i=!1)}i||(consola.consola.error("Some lint checks failed"),process.exit(1))}});exports.lint=lint;
1
+ "use strict";const citty=require("citty"),consola=require("consola"),lint$1=require("../shared/basis.CCOrCJM8.cjs");require("node:child_process"),require("fast-glob"),require("micromatch"),require("nypm"),require("pathe"),require("pkg-types"),require("../shared/basis.cvMXIHAl.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 t=process.cwd();let i=!0;if(!e.staged&&!e.project&&!e.deps&&!e.structure&&!e.docs&&!e.all&&(e.staged=!0),e.all)i=await lint$1.lintAll(t);else{const s=[];e.staged&&s.push(()=>lint$1.lintStaged(t)),e.project&&s.push(()=>lint$1.lintProject(t)),e.deps&&s.push(()=>lint$1.lintDependencies(t)),e.structure&&s.push(()=>lint$1.lintStructure(t)),e.docs&&s.push(()=>lint$1.lintDocs(t));for(const r of s)await r()||(i=!1)}i||(consola.consola.error("Some lint checks failed"),process.exit(1))}});exports.lint=lint;
@@ -1 +1 @@
1
- import{defineCommand as n}from"citty";import{consola as r}from"consola";import{l as a,b as c,c as l,d as p,e as d,f as u}from"../shared/basis.DFb1F94b.mjs";import"node:child_process";import"fast-glob";import"micromatch";import"nypm";import"pathe";import"pkg-types";import"../shared/basis.DEw91E2d.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:t}){const e=process.cwd();let s=!0;if(!t.staged&&!t.project&&!t.deps&&!t.structure&&!t.docs&&!t.all&&(t.staged=!0),t.all)s=await a(e);else{const o=[];t.staged&&o.push(()=>c(e)),t.project&&o.push(()=>l(e)),t.deps&&o.push(()=>p(e)),t.structure&&o.push(()=>d(e)),t.docs&&o.push(()=>u(e));for(const i of o)await i()||(s=!1)}s||(r.error("Some lint checks failed"),process.exit(1))}});export{m as lint};
1
+ import{defineCommand as n}from"citty";import{consola as r}from"consola";import{l as a,b as c,c as l,d as p,e as d,f as u}from"../shared/basis.B_nrd74H.mjs";import"node:child_process";import"fast-glob";import"micromatch";import"nypm";import"pathe";import"pkg-types";import"../shared/basis.BIUEmg1C.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:t}){const e=process.cwd();let s=!0;if(!t.staged&&!t.project&&!t.deps&&!t.structure&&!t.docs&&!t.all&&(t.staged=!0),t.all)s=await a(e);else{const o=[];t.staged&&o.push(()=>c(e)),t.project&&o.push(()=>l(e)),t.deps&&o.push(()=>p(e)),t.structure&&o.push(()=>d(e)),t.docs&&o.push(()=>u(e));for(const i of o)await i()||(s=!1)}s||(r.error("Some lint checks failed"),process.exit(1))}});export{m as lint};
@@ -1 +1 @@
1
- "use strict";const citty=require("citty"),consola=require("consola"),publish$1=require("../shared/basis.Dgo48zAG.cjs");require("node:child_process"),require("nypm"),require("pkg-types"),require("semver"),require("../shared/basis.DfY4XEAb.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;
1
+ "use strict";const citty=require("citty"),consola=require("consola"),publish$1=require("../shared/basis.CjDkLZ8j.cjs");require("node:child_process"),require("nypm"),require("pkg-types"),require("semver"),require("../shared/basis.cvMXIHAl.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;
@@ -1 +1 @@
1
- import{defineCommand as r}from"citty";import{consola as i}from"consola";import{p}from"../shared/basis.CKFXZgQI.mjs";import"node:child_process";import"nypm";import"pkg-types";import"semver";import"../shared/basis.DEw91E2d.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};
1
+ import{defineCommand as r}from"citty";import{consola as i}from"consola";import{p}from"../shared/basis.CSrt7vG8.mjs";import"node:child_process";import"nypm";import"pkg-types";import"semver";import"../shared/basis.BIUEmg1C.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};
@@ -1 +1 @@
1
- "use strict";const citty=require("citty"),consola=require("consola"),n=require("semver"),version$1=require("../shared/basis.C-dGsxlD.cjs");require("node:child_process"),require("pkg-types"),require("../shared/basis.DfY4XEAb.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 n__default=_interopDefaultCompat(n),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:n__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;
1
+ "use strict";const citty=require("citty"),consola=require("consola"),n=require("semver"),version$1=require("../shared/basis.CITlWl4E.cjs");require("node:child_process"),require("pkg-types"),require("../shared/basis.cvMXIHAl.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 n__default=_interopDefaultCompat(n),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:n__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;
@@ -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.BzZ6Bs64.mjs";import"node:child_process";import"pkg-types";import"../shared/basis.DEw91E2d.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};
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_Z0I9PT.mjs";import"node:child_process";import"pkg-types";import"../shared/basis.BIUEmg1C.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/config.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";function defineBasisConfig(e){return e}const defaultConfig={lint:{staged:{},project:{},dependencies:{checkSecurity:!0},structure:{requiredFiles:["package.json"]},docs:{checkReadme:!0}},git:{hooks:{},config:{core:{autocrlf:"input"}},commitMsg:{types:["feat","fix","docs","style","refactor","perf","test","build","ci","chore","revert"]},autoSetup:!0,autoInitGit:!0,skipGitCheck:!1,force:!1},packageManager:{autoDetect:!0},version:{tagPrefix:"v",prereleaseId:"edge"},publish:{defaultTag:"edge",stableTag:"latest"}};exports.defaultConfig=defaultConfig,exports.defineBasisConfig=defineBasisConfig;
1
+ "use strict";function defineBasisConfig(e){return e}const defaultConfig={lint:{dependencies:{checkSecurity:!0},structure:{requiredFiles:["package.json"]},docs:{checkReadme:!0}},git:{hooks:{},config:{core:{autocrlf:"input"}},commitMsg:{types:["feat","fix","docs","style","refactor","perf","test","build","ci","chore","revert"]},autoSetup:!0,autoInitGit:!0,skipGitCheck:!1,force:!1},packageManager:{autoDetect:!0},version:{tagPrefix:"v",prereleaseId:"edge"},publish:{defaultTag:"edge",stableTag:"latest"}};exports.defaultConfig=defaultConfig,exports.defineBasisConfig=defineBasisConfig;
package/dist/config.mjs CHANGED
@@ -1 +1 @@
1
- function t(e){return e}const r={lint:{staged:{},project:{},dependencies:{checkSecurity:!0},structure:{requiredFiles:["package.json"]},docs:{checkReadme:!0}},git:{hooks:{},config:{core:{autocrlf:"input"}},commitMsg:{types:["feat","fix","docs","style","refactor","perf","test","build","ci","chore","revert"]},autoSetup:!0,autoInitGit:!0,skipGitCheck:!1,force:!1},packageManager:{autoDetect:!0},version:{tagPrefix:"v",prereleaseId:"edge"},publish:{defaultTag:"edge",stableTag:"latest"}};export{r as defaultConfig,t as defineBasisConfig};
1
+ function t(e){return e}const r={lint:{dependencies:{checkSecurity:!0},structure:{requiredFiles:["package.json"]},docs:{checkReadme:!0}},git:{hooks:{},config:{core:{autocrlf:"input"}},commitMsg:{types:["feat","fix","docs","style","refactor","perf","test","build","ci","chore","revert"]},autoSetup:!0,autoInitGit:!0,skipGitCheck:!1,force:!1},packageManager:{autoDetect:!0},version:{tagPrefix:"v",prereleaseId:"edge"},publish:{defaultTag:"edge",stableTag:"latest"}};export{r as defaultConfig,t as defineBasisConfig};
package/dist/index.cjs CHANGED
@@ -1 +1 @@
1
- "use strict";const config=require("./config.cjs"),git=require("./shared/basis.Bar6V_OJ.cjs"),init=require("./shared/basis.DVSF1f2D.cjs"),lint=require("./shared/basis.DADpzLwA.cjs"),publish=require("./shared/basis.Dgo48zAG.cjs"),version=require("./shared/basis.C-dGsxlD.cjs"),utils=require("./shared/basis.DfY4XEAb.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(e=process.cwd()){this.cwd=e}getCwd(){return this.cwd}setCwd(e){this.cwd=e,this.config=null}async getConfig(){if(!this.config){const{config:e}=await utils.loadConfig({cwd:this.cwd});this.config=e}return this.config}async reloadConfig(){return this.config=null,await this.getConfig()}async setup(e={}){return await init.init(this.cwd,e)?await git.setupGit(this.cwd):!1}async release(e={},s={}){if(!await lint.lintAll(this.cwd))throw new Error("Lint checks failed. Fix issues before releasing.");const i=await version.updatePackageVersion(this.cwd,e),r=await publish.publishPackage(this.cwd,s);return{version:i,publish:r}}}function createBasis(t=process.cwd()){return new Basis(t)}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;
1
+ "use strict";const config=require("./config.cjs"),git=require("./shared/basis.gpPjNGLA.cjs"),init=require("./shared/basis.DjCUp0ej.cjs"),lint=require("./shared/basis.CCOrCJM8.cjs"),publish=require("./shared/basis.CjDkLZ8j.cjs"),version=require("./shared/basis.CITlWl4E.cjs"),utils=require("./shared/basis.cvMXIHAl.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(e=process.cwd()){this.cwd=e}getCwd(){return this.cwd}setCwd(e){this.cwd=e,this.config=null}async getConfig(){if(!this.config){const{config:e}=await utils.loadConfig({cwd:this.cwd});this.config=e}return this.config}async reloadConfig(){return this.config=null,await this.getConfig()}async setup(e={}){return await init.init(this.cwd,e)?await git.setupGit(this.cwd):!1}async release(e={},s={}){if(!await lint.lintAll(this.cwd))throw new Error("Lint checks failed. Fix issues before releasing.");const i=await version.updatePackageVersion(this.cwd,e),r=await publish.publishPackage(this.cwd,s);return{version:i,publish:r}}}function createBasis(t=process.cwd()){return new Basis(t)}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
@@ -155,12 +155,15 @@ declare function fileExists(path: string): Promise<boolean>;
155
155
  declare function getPackageManagerCommands(packageManager: string): {
156
156
  outdated: string;
157
157
  audit: string;
158
+ execPrefix: string;
158
159
  } | {
159
160
  outdated: string;
160
161
  audit: null;
162
+ execPrefix: string;
161
163
  } | {
162
164
  outdated: null;
163
165
  audit: null;
166
+ execPrefix: string;
164
167
  };
165
168
 
166
169
  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
@@ -155,12 +155,15 @@ declare function fileExists(path: string): Promise<boolean>;
155
155
  declare function getPackageManagerCommands(packageManager: string): {
156
156
  outdated: string;
157
157
  audit: string;
158
+ execPrefix: string;
158
159
  } | {
159
160
  outdated: string;
160
161
  audit: null;
162
+ execPrefix: string;
161
163
  } | {
162
164
  outdated: null;
163
165
  audit: null;
166
+ execPrefix: string;
164
167
  };
165
168
 
166
169
  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
@@ -155,12 +155,15 @@ declare function fileExists(path: string): Promise<boolean>;
155
155
  declare function getPackageManagerCommands(packageManager: string): {
156
156
  outdated: string;
157
157
  audit: string;
158
+ execPrefix: string;
158
159
  } | {
159
160
  outdated: string;
160
161
  audit: null;
162
+ execPrefix: string;
161
163
  } | {
162
164
  outdated: null;
163
165
  audit: null;
166
+ execPrefix: string;
164
167
  };
165
168
 
166
169
  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{s as e}from"./shared/basis.DzKnyliK.mjs";export{i as initGitRepo,l as lintCommitMessage,p as parseCommitMessage,r as readGitConfig,d as removeGitHooks,b as resetGitConfig,a as setupGitConfig,c as setupGitHooks,v as validateCommitMessage,w as writeGitConfig}from"./shared/basis.DzKnyliK.mjs";import{i as s}from"./shared/basis.CCjpKO-B.mjs";import{l as o}from"./shared/basis.DFb1F94b.mjs";export{a as getProjectFiles,g as getStagedFiles,d as lintDependencies,f as lintDocs,c as lintProject,b as lintStaged,e as lintStructure}from"./shared/basis.DFb1F94b.mjs";import{p as a}from"./shared/basis.CKFXZgQI.mjs";import{u as r}from"./shared/basis.BzZ6Bs64.mjs";import{l as p}from"./shared/basis.DEw91E2d.mjs";export{f as fileExists,g as getPackageManagerCommands}from"./shared/basis.DEw91E2d.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 c{config=null;cwd;constructor(t=process.cwd()){this.cwd=t}getCwd(){return this.cwd}setCwd(t){this.cwd=t,this.config=null}async getConfig(){if(!this.config){const{config:t}=await p({cwd:this.cwd});this.config=t}return this.config}async reloadConfig(){return this.config=null,await this.getConfig()}async setup(t={}){return await s(this.cwd,t)?await e(this.cwd):!1}async release(t={},n={}){if(!await o(this.cwd))throw new Error("Lint checks failed. Fix issues before releasing.");const m=await r(this.cwd,t),g=await a(this.cwd,n);return{version:m,publish:g}}}function f(i=process.cwd()){return new c(i)}const l=["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{c as Basis,l as VALID_GIT_HOOKS,f as createBasis,s as init,o as lintAll,p as loadConfig,a as publishPackage,e as setupGit,r as updatePackageVersion};
1
+ export{defaultConfig,defineBasisConfig}from"./config.mjs";import{s as e}from"./shared/basis.C2jy0pwk.mjs";export{i as initGitRepo,l as lintCommitMessage,p as parseCommitMessage,r as readGitConfig,d as removeGitHooks,b as resetGitConfig,a as setupGitConfig,c as setupGitHooks,v as validateCommitMessage,w as writeGitConfig}from"./shared/basis.C2jy0pwk.mjs";import{i as s}from"./shared/basis.y1NlNHFi.mjs";import{l as o}from"./shared/basis.B_nrd74H.mjs";export{a as getProjectFiles,g as getStagedFiles,d as lintDependencies,f as lintDocs,c as lintProject,b as lintStaged,e as lintStructure}from"./shared/basis.B_nrd74H.mjs";import{p as a}from"./shared/basis.CSrt7vG8.mjs";import{u as r}from"./shared/basis.1_Z0I9PT.mjs";import{l as p}from"./shared/basis.BIUEmg1C.mjs";export{f as fileExists,g as getPackageManagerCommands}from"./shared/basis.BIUEmg1C.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 c{config=null;cwd;constructor(t=process.cwd()){this.cwd=t}getCwd(){return this.cwd}setCwd(t){this.cwd=t,this.config=null}async getConfig(){if(!this.config){const{config:t}=await p({cwd:this.cwd});this.config=t}return this.config}async reloadConfig(){return this.config=null,await this.getConfig()}async setup(t={}){return await s(this.cwd,t)?await e(this.cwd):!1}async release(t={},n={}){if(!await o(this.cwd))throw new Error("Lint checks failed. Fix issues before releasing.");const m=await r(this.cwd,t),g=await a(this.cwd,n);return{version:m,publish:g}}}function f(i=process.cwd()){return new c(i)}const l=["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{c as Basis,l as VALID_GIT_HOOKS,f as createBasis,s as init,o as lintAll,p as loadConfig,a as publishPackage,e as setupGit,r as updatePackageVersion};
@@ -1 +1 @@
1
- import{execSync as t}from"node:child_process";import{consola as l}from"consola";import{readPackageJSON as d,resolvePackageJSON as w,writePackageJSON as v}from"pkg-types";import s from"semver";import{l as u}from"./basis.DEw91E2d.mjs";function h(e,o,m){if(o.version){if(s.valid(o.version))return o.version;throw new Error(`Invalid version format: ${o.version}. Please use semantic versioning format (e.g., 1.0.0, 2.1.0-alpha.1)`)}if(!s.valid(e))throw new Error(`Invalid current version format: ${e}. Please fix version in package.json to use semantic versioning format (e.g., 1.0.0)`);const r=s.prerelease(e),c=o.preid||(r&&typeof r[0]=="string"?r[0]:null)||m.prereleaseId||"edge";let a;o.major?a="major":o.minor?a="minor":o.prerelease?a=r?"prerelease":"prepatch":a=r?"prerelease":"patch";const i=a==="prerelease"||a.startsWith("pre")?s.inc(e,a,c):s.inc(e,a);if(!i)throw new Error(`Failed to calculate new version from ${e}. Please check your version increment options.`);return i}async function P(e,o={}){const{config:m}=await u({cwd:e}),r=m.version||{},c=await d(e),a=c.version;if(!a)throw new Error("No version found in package.json");const i=h(a,o,r),f=await w(e);await v(f,{...c,version:i});const p={oldVersion:a,newVersion:i};if(r.autoCommit){const n=o.message||r.commitMessage?.replace("{version}",i)||`chore: release v${i}`;try{t("git add package.json",{cwd:e}),t(`git commit -m "${n}"`,{cwd:e})}catch(g){l.warn("Failed to commit changes:",g)}}if(r.autoTag){const n=`${r.tagPrefix||"v"}${i}`;try{t(`git tag ${n}`,{cwd:e}),p.tagName=n}catch(g){l.warn("Failed to create git tag:",g)}}if(r.autoPush)try{t("git push",{cwd:e}),r.autoTag&&t("git push --tags",{cwd:e})}catch(n){l.warn("Failed to push changes:",n)}return p}export{P as u};
1
+ import{execSync as t}from"node:child_process";import{consola as l}from"consola";import{readPackageJSON as d,resolvePackageJSON as w,writePackageJSON as v}from"pkg-types";import s from"semver";import{l as u}from"./basis.BIUEmg1C.mjs";function h(e,o,m){if(o.version){if(s.valid(o.version))return o.version;throw new Error(`Invalid version format: ${o.version}. Please use semantic versioning format (e.g., 1.0.0, 2.1.0-alpha.1)`)}if(!s.valid(e))throw new Error(`Invalid current version format: ${e}. Please fix version in package.json to use semantic versioning format (e.g., 1.0.0)`);const r=s.prerelease(e),c=o.preid||(r&&typeof r[0]=="string"?r[0]:null)||m.prereleaseId||"edge";let a;o.major?a="major":o.minor?a="minor":o.prerelease?a=r?"prerelease":"prepatch":a=r?"prerelease":"patch";const i=a==="prerelease"||a.startsWith("pre")?s.inc(e,a,c):s.inc(e,a);if(!i)throw new Error(`Failed to calculate new version from ${e}. Please check your version increment options.`);return i}async function P(e,o={}){const{config:m}=await u({cwd:e}),r=m.version||{},c=await d(e),a=c.version;if(!a)throw new Error("No version found in package.json");const i=h(a,o,r),f=await w(e);await v(f,{...c,version:i});const p={oldVersion:a,newVersion:i};if(r.autoCommit){const n=o.message||r.commitMessage?.replace("{version}",i)||`chore: release v${i}`;try{t("git add package.json",{cwd:e}),t(`git commit -m "${n}"`,{cwd:e})}catch(g){l.warn("Failed to commit changes:",g)}}if(r.autoTag){const n=`${r.tagPrefix||"v"}${i}`;try{t(`git tag ${n}`,{cwd:e}),p.tagName=n}catch(g){l.warn("Failed to create git tag:",g)}}if(r.autoPush)try{t("git push",{cwd:e}),r.autoTag&&t("git push --tags",{cwd:e})}catch(n){l.warn("Failed to push changes:",n)}return p}export{P as u};
@@ -0,0 +1 @@
1
+ import{access as a}from"node:fs/promises";import{loadConfig as t}from"c12";import{defaultConfig as n}from"../config.mjs";async function d(e={}){return await t({name:"basis",cwd:process.cwd(),...e,defaults:{...n,...e.defaults}})}async function u(e){try{return await a(e),!0}catch{return!1}}function r(e){switch(e){case"yarn":return{outdated:"yarn outdated --json",audit:"yarn audit --level moderate",execPrefix:"yarn exec"};case"pnpm":return{outdated:"pnpm outdated --format table",audit:"pnpm audit --audit-level moderate",execPrefix:"pnpm exec"};case"bun":return{outdated:"bun outdated",audit:null,execPrefix:"bunx"};case"deno":return{outdated:null,audit:null,execPrefix:"deno task"};default:return{outdated:"npm outdated --json",audit:"npm audit --audit-level moderate",execPrefix:"npx"}}}export{u as f,r as g,d as l};
@@ -1,3 +1,3 @@
1
- import{execSync as f}from"node:child_process";import{consola as a}from"consola";import k from"fast-glob";import S from"micromatch";import{detectPackageManager as x}from"nypm";import{resolve as h}from"pathe";import{readPackageJSON as j}from"pkg-types";import{l as g,f as m,g as A}from"./basis.DEw91E2d.mjs";function $(){try{const t=f("git diff --cached --name-only",{encoding:"utf8"}).trim().split(`
1
+ import{execSync as f}from"node:child_process";import{consola as a}from"consola";import k from"fast-glob";import S from"micromatch";import{detectPackageManager as x}from"nypm";import{resolve as h}from"pathe";import{readPackageJSON as j}from"pkg-types";import{l as g,f as m,g as A}from"./basis.BIUEmg1C.mjs";function $(){try{const t=f("git diff --cached --name-only",{encoding:"utf8"}).trim().split(`
2
2
  `).filter(Boolean),r=f("git diff --cached --name-only --diff-filter=D",{encoding:"utf8"}),i=new Set(r.trim().split(`
3
3
  `).filter(Boolean));return t.filter(e=>!i.has(e))}catch{return[]}}async function y(t,r=["**/*"],i=["node_modules/**","dist/**","build/**",".git/**"]){try{return await k(r,{cwd:t,ignore:i,onlyFiles:!0,dot:!1,absolute:!1})}catch(e){return a.warn("Failed to scan project files:",e),[]}}async function R(t=process.cwd(),r){const{config:i}=await g({cwd:t,overrides:r?{lint:{staged:r}}:void 0}),e=i.lint?.staged||{},n=$();if(n.length===0)return!0;if(Object.keys(e).length===0)return a.warn("No staged lint configuration found. Add lint.staged section to your basis.config.ts"),!0;let c=!1;const s=new Set;for(const[o,u]of Object.entries(e)){const l=n.filter(d=>!s.has(d)&&S.isMatch(d.split("/").pop()||d,o));if(l.length!==0){a.start(`Linting ${l.length} files: ${o}`);try{const d=`${u} ${l.join(" ")}`;f(d,{stdio:"inherit",cwd:t});const p=[];for(const w of l)await m(h(t,w))&&p.push(w);p.length>0&&f(`git add ${p.join(" ")}`,{stdio:"inherit",cwd:t}),l.forEach(w=>s.add(w))}catch(d){c=!0,a.error(`Lint pattern '${o}' failed. Please fix the issues and try again:`,d)}}}return!c}async function v(t=process.cwd(),r){const{config:i}=await g({cwd:t,overrides:r?{lint:{project:r}}:void 0}),e=i.lint?.project||{};if(Object.keys(e).length===0)return a.warn("No project lint configuration found. Add lint.project section to your basis.config.ts"),!0;a.start("Running project-wide linting...");let n=!1;for(const[c,s]of Object.entries(e)){a.start(`Running project lint: ${c}`);try{f(s,{stdio:"inherit",cwd:t})}catch(o){n=!0,a.error(`Project lint pattern '${c}' failed. Please fix the issues and try again:`,o)}}return!n}async function E(t=process.cwd(),r){const{config:i}=await g({cwd:t,overrides:r?{lint:{dependencies:r}}:void 0}),e=i.lint?.dependencies||{};let n=!1;try{const c=await j(t),s={...c.dependencies,...c.devDependencies},o=(await x(t))?.name||"npm",u=A(o);if(a.start("Checking dependencies..."),e.blockedPackages&&e.blockedPackages.length>0){const l=Object.keys(s).filter(d=>e.blockedPackages?.includes(d));l.length>0&&(a.error(`Blocked packages found: ${l.join(", ")}. Please remove these packages from your dependencies.`),n=!0)}if(e.checkOutdated)if(u.outdated)try{f(u.outdated,{cwd:t,stdio:"pipe"})}catch(l){a.warn("Some dependencies are outdated:",l)}else a.warn(`Outdated check not available for ${o}`);if(e.checkSecurity)if(u.audit)try{f(u.audit,{cwd:t,stdio:"pipe"})}catch(l){a.error("Security vulnerabilities detected:",l),n=!0}else a.warn(`Security audit not available for ${o}`);if(e.allowedLicenses&&e.allowedLicenses.length>0){const{hasIssues:l,invalidLicenses:d}=await M(t,e.allowedLicenses);l&&(a.error("Packages with invalid licenses found:"),d.forEach(p=>a.error(` ${p}`)),n=!0)}}catch(c){a.error("Failed to check dependencies:",c),n=!0}return!n}async function D(t,r){if(r.length===0)return!0;const i=(await Promise.all(r.map(async e=>({file:e,exists:await m(h(t,e))})))).filter(e=>!e.exists);return i.length>0?(i.forEach(({file:e})=>{a.error(`Required file missing: ${e}`)}),!1):!0}async function O(t,r){if(r.length===0)return!0;const i=(await Promise.all(r.map(async e=>({dir:e,exists:await m(h(t,e))})))).filter(e=>!e.exists);return i.length>0?(i.forEach(({dir:e})=>{a.error(`Required directory missing: ${e}`)}),!1):!0}async function F(t,r,i){const e=new RegExp(i),n=(await y(t,[r])).filter(c=>{const s=c.split("/").pop()||"";return!e.test(s)});return n.length>0?(a.error(`Files with invalid naming in ${r}: ${n.slice(0,3).join(", ")}${n.length>3?"...":""}`),!1):!0}async function L(t,r,i){const e=new RegExp(i),n=new Set,c=(await y(t,[r.replace(/\/\*\*?$/,"")])).filter(async s=>{const o=h(t,s);try{return(await import("node:fs/promises").then(u=>u.stat(o))).isDirectory()}catch{return!1}});for(const s of await Promise.all(c))if(s){const o=s.split("/").pop()||"";e.test(o)||n.add(s)}return n.size>0?(a.error(`Directories with invalid naming in ${r}: ${Array.from(n).slice(0,3).join(", ")}`),!1):!0}async function C(t,r){let i=!1;for(const e of r){const{path:n,files:c,directories:s,description:o}=e;a.start(`Checking naming rule: ${o||n}`),c&&(await F(t,n,c)||(i=!0)),s&&(await L(t,n,s)||(i=!0))}return!i}async function P(t=process.cwd(),r){const{config:i}=await g({cwd:t,overrides:r?{lint:{structure:r}}:void 0}),e=i.lint?.structure||{};let n=!1;return a.start("Checking project structure..."),e.requiredFiles&&(await D(t,e.requiredFiles)||(n=!0)),e.requiredDirs&&(await O(t,e.requiredDirs)||(n=!0)),e.naming&&e.naming.length>0&&(await C(t,e.naming)||(n=!0)),!n}async function b(t=process.cwd(),r){const{config:i}=await g({cwd:t,overrides:r?{lint:{docs:r}}:void 0}),e=i.lint?.docs||{};let n=!1;a.start("Checking documentation...");const c=[];e.checkReadme!==!1&&c.push({type:"README",files:["README.md","README.rst","README.txt","readme.md"],required:!0}),e.checkChangelog&&c.push({type:"CHANGELOG",files:["CHANGELOG.md","CHANGELOG.rst","HISTORY.md","changelog.md"],required:!0});for(const{type:s,files:o,required:u}of c){const l=(await Promise.all(o.map(d=>m(h(t,d))))).some(d=>d);u&&!l&&(a.error(`No ${s} file found`),n=!0)}return!n}async function q(t=process.cwd()){const{config:r}=await g({cwd:t}),i=r.lint||{};a.start("Running comprehensive project lint...");const e=(await Promise.allSettled([v(t,i.project),E(t,i.dependencies),P(t,i.structure),b(t,i.docs)])).filter(n=>n.status==="rejected"||n.status==="fulfilled"&&!n.value);return e.length===0?!0:(a.error(`${e.length} lint check(s) failed`),!1)}async function M(t,r){try{const i=await k(["node_modules/*/package.json","node_modules/@*/*/package.json"],{cwd:t,onlyFiles:!0,absolute:!0}),e=[],n=new Set;for(const c of i)try{const s=await j(c);if(!s.name||n.has(s.name))continue;if(n.add(s.name),s.license){const o=Array.isArray(s.license)?s.license.join(", "):s.license;r.some(u=>o.includes(u))||e.push(`${s.name}: ${o}`)}}catch{}return{hasIssues:e.length>0,invalidLicenses:e}}catch(i){return a.warn("Failed to check licenses:",i),{hasIssues:!1,invalidLicenses:[]}}}export{y as a,R as b,v as c,E as d,P as e,b as f,$ as g,q as l};
@@ -0,0 +1,10 @@
1
+ import{execSync as p}from"node:child_process";import{readFile as h,unlink as M,writeFile as y,copyFile as O}from"node:fs/promises";import{updateConfig as S}from"c12/update";import{consola as a}from"consola";import{defu as x}from"defu";import v from"ini";import{resolve as u}from"pathe";import{l as d,f as g}from"./basis.BIUEmg1C.mjs";function G(){try{return p("git --version",{stdio:"pipe"}),!0}catch{return!1}}async function k(e,o=!1,r=!1){try{return await S({cwd:e,configFile:"basis.config",onUpdate:t=>{t.git&&(o&&t.git.hooks&&delete t.git.hooks,r&&t.git.config&&delete t.git.config,Object.keys(t.git).length===0&&delete t.git)}}),!0}catch{return!1}}const E=["feat","fix","docs","style","refactor","perf","test","build","ci","chore","revert"];function b(e){const o=e.trim().split(`
2
+ `),r=o[0].match(/^(\w+)(\(([^)]+)\))?(!)?:\s*(.+)$/);if(!r)return null;const[,t,,i,n,s]=r,c=o.slice(1).find(l=>l.trim())?.trim(),f=o.slice(-1)[0]?.trim();return{type:t,scope:i,description:s,body:c,footer:f,isBreaking:!!n||e.includes("BREAKING CHANGE:")}}function $(e,o={}){const r=[],{types:t=E,maxLength:i=72,minLength:n=10,scopeRequired:s=!1,allowedScopes:c=[]}=o,f=b(e);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 l=e.split(`
3
+ `)[0];return l.length>i&&r.push(`Header too long (${l.length}). Max: ${i}`),l.length<n&&r.push(`Header too short (${l.length}). Min: ${n}`),s&&!f.scope&&r.push("Scope is required"),f.scope&&c.length>0&&!c.includes(f.scope)&&r.push(`Invalid scope '${f.scope}'. Allowed: ${c.join(", ")}`),{valid:r.length===0,errors:r}}async function H(e=process.cwd(),o){if(!G())return a.warn("Git command not available, skipping commit message linting"),!0;const{config:r}=await d({cwd:e,overrides:o?{git:{commitMsg:o}}:void 0}),t=r.git?.commitMsg||{};let i;try{const s=u(".git/COMMIT_EDITMSG");await g(s)?i=(await h(s)).toString("utf8"):i=p("git log -1 --pretty=%B",{encoding:"utf8"}).trim()}catch(s){return a.error("Failed to read commit message:",s),!1}const n=$(i,t);return n.valid?!0:(a.error("Invalid commit message:"),n.errors.forEach(s=>a.error(` ${s}`)),!1)}async function j(e){const o=u(e,".git/config");if(!await g(o))return null;const r=new Date().toISOString().replace(/[:.]/g,"-"),t=u(e,`.git/config.backup.${r}`);try{return await O(o,t),t}catch(i){return a.warn("Failed to create Git config backup:",i),null}}async function m(e=process.cwd()){const o=u(e,".git/config");if(!await g(o))return{};try{const r=await h(o,"utf8");return v.parse(r)}catch(r){return a.warn("Failed to read .git/config:",r),{}}}async function w(e,o=process.cwd()){const r=u(o,".git/config");try{let t=v.stringify(e,{whitespace:!0});t=t.split(`
4
+ `).map(i=>i&&!i.startsWith("[")&&i.includes("=")?` ${i}`:i).join(`
5
+ `),await y(r,t,"utf8")}catch(t){throw a.error("Failed to write .git/config:",t),t}}function A(e,o){if(!o)return!0;for(const[r,t]of Object.entries(o)){if(typeof t!="object"||!t)continue;const i=e[r];if(!i||typeof i!="object")return!1;for(const[n,s]of Object.entries(t))if(s!==void 0&&i[n]!==s)return!1}return!0}async function C(e=process.cwd(),o){const{config:r}=await d({cwd:e,overrides:o?{git:{config:o}}:void 0}),t=r.git?.config||{};if(Object.keys(t).length===0)return!0;try{const i=await m(e);if(A(i,t))return!0;await j(e);const n=x(i,t);return await w(n,e),!0}catch(i){return a.error("Failed to setup Git configuration:",i),!1}}async function z(e=process.cwd(),o=!0,r={}){try{await j(e);const t=await m(e);if(!t||Object.keys(t).length===0)return!0;const i={};if(o&&t.user&&(i.user=t.user),t.core){const n=["repositoryformatversion","filemode","bare","logallrefupdates"],s={};n.forEach(c=>{t.core[c]!==void 0&&(s[c]=t.core[c])}),Object.keys(s).length>0&&(i.core=s)}return await w(i,e),r.updateConfig?await k(e,!1,!0):!0}catch(t){return a.error("Failed to reset Git configuration:",t),!1}}async function F(e=process.cwd(),o){const{config:r}=await d({cwd:e,overrides:o?{git:{hooks:o}}:void 0}),t=r.git?.hooks||{},i=u(e,".git/hooks");if(!await g(i))return a.error("Git hooks directory not found. Is this a Git repository?"),!1;let n=!0;for(const[s,c]of Object.entries(t)){const f=u(i,s);try{let l=`#!/bin/sh
6
+
7
+ `;if(typeof c=="string")l+=`${c}
8
+ `;else if(c&&typeof c=="object"&&"commands"in c){const I=c.commands;l+=`${I.join(`
9
+ `)}
10
+ `}await y(f,l,{mode:493})}catch(l){a.error(`Failed to setup ${s} hook:`,l),n=!1}}return n}async function B(e=process.cwd()){if(!G())return a.warn("Git command not available, cannot initialize repository"),!1;try{try{return p("git rev-parse --git-dir",{cwd:e,stdio:"pipe"}),!0}catch{return p("git init",{cwd:e,stdio:"inherit"}),a.success("Initialized Git repository"),!0}}catch(o){return a.error("Failed to initialize Git repository:",o),!1}}async function R(e=process.cwd()){const{config:o}=await d({cwd:e}),r=o.git||{},t=(await Promise.allSettled([C(e,r.config),F(e,r.hooks)])).filter(i=>i.status==="rejected"||i.status==="fulfilled"&&!i.value);return t.length===0?(a.success("Git setup completed successfully!"),!0):(a.error(`${t.length} Git setup step(s) failed`),!1)}async function q(e=process.cwd(),o,r={}){const t=u(e,".git/hooks");if(!await g(t))return a.warn("Git hooks directory not found. Is this a Git repository?"),!0;let i=!0,n;if(o&&o.length>0)n=o;else{const{config:s}=await d({cwd:e});n=Object.keys(s.git?.hooks||{})}for(const s of n){const c=u(t,s);if(await g(c))try{await M(c)}catch(f){a.error(`Failed to remove ${s} hook:`,f),i=!1}}if(!o&&r.updateConfig){const s=await k(e,!0,!1);i=i&&s}return i}export{C as a,z as b,F as c,q as d,B as i,H as l,b as p,m as r,R as s,$ as v,w};
@@ -1,3 +1,3 @@
1
- "use strict";const node_child_process=require("node:child_process"),consola=require("consola"),y=require("fast-glob"),w=require("micromatch"),nypm=require("nypm"),pathe=require("pathe"),pkgTypes=require("pkg-types"),utils=require("./basis.DfY4XEAb.cjs");function _interopDefaultCompat(t){return t&&typeof t=="object"&&"default"in t?t.default:t}const y__default=_interopDefaultCompat(y),w__default=_interopDefaultCompat(w);function getStagedFiles(){try{const t=node_child_process.execSync("git diff --cached --name-only",{encoding:"utf8"}).trim().split(`
1
+ "use strict";const node_child_process=require("node:child_process"),consola=require("consola"),y=require("fast-glob"),w=require("micromatch"),nypm=require("nypm"),pathe=require("pathe"),pkgTypes=require("pkg-types"),utils=require("./basis.cvMXIHAl.cjs");function _interopDefaultCompat(t){return t&&typeof t=="object"&&"default"in t?t.default:t}const y__default=_interopDefaultCompat(y),w__default=_interopDefaultCompat(w);function getStagedFiles(){try{const t=node_child_process.execSync("git diff --cached --name-only",{encoding:"utf8"}).trim().split(`
2
2
  `).filter(Boolean),s=node_child_process.execSync("git diff --cached --name-only --diff-filter=D",{encoding:"utf8"}),o=new Set(s.trim().split(`
3
3
  `).filter(Boolean));return t.filter(e=>!o.has(e))}catch{return[]}}async function getProjectFiles(t,s=["**/*"],o=["node_modules/**","dist/**","build/**",".git/**"]){try{return await y__default(s,{cwd:t,ignore:o,onlyFiles:!0,dot:!1,absolute:!1})}catch(e){return consola.consola.warn("Failed to scan project files:",e),[]}}async function lintStaged(t=process.cwd(),s){const{config:o}=await utils.loadConfig({cwd:t,overrides:s?{lint:{staged:s}}:void 0}),e=o.lint?.staged||{},n=getStagedFiles();if(n.length===0)return!0;if(Object.keys(e).length===0)return consola.consola.warn("No staged lint configuration found. Add lint.staged section to your basis.config.ts"),!0;let r=!1;const i=new Set;for(const[c,d]of Object.entries(e)){const a=n.filter(l=>!i.has(l)&&w__default.isMatch(l.split("/").pop()||l,c));if(a.length!==0){consola.consola.start(`Linting ${a.length} files: ${c}`);try{const l=`${d} ${a.join(" ")}`;node_child_process.execSync(l,{stdio:"inherit",cwd:t});const u=[];for(const f of a)await utils.fileExists(pathe.resolve(t,f))&&u.push(f);u.length>0&&node_child_process.execSync(`git add ${u.join(" ")}`,{stdio:"inherit",cwd:t}),a.forEach(f=>i.add(f))}catch(l){r=!0,consola.consola.error(`Lint pattern '${c}' failed. Please fix the issues and try again:`,l)}}}return!r}async function lintProject(t=process.cwd(),s){const{config:o}=await utils.loadConfig({cwd:t,overrides:s?{lint:{project:s}}:void 0}),e=o.lint?.project||{};if(Object.keys(e).length===0)return consola.consola.warn("No project lint configuration found. Add lint.project section to your basis.config.ts"),!0;consola.consola.start("Running project-wide linting...");let n=!1;for(const[r,i]of Object.entries(e)){consola.consola.start(`Running project lint: ${r}`);try{node_child_process.execSync(i,{stdio:"inherit",cwd:t})}catch(c){n=!0,consola.consola.error(`Project lint pattern '${r}' failed. Please fix the issues and try again:`,c)}}return!n}async function lintDependencies(t=process.cwd(),s){const{config:o}=await utils.loadConfig({cwd:t,overrides:s?{lint:{dependencies:s}}:void 0}),e=o.lint?.dependencies||{};let n=!1;try{const r=await pkgTypes.readPackageJSON(t),i={...r.dependencies,...r.devDependencies},c=(await nypm.detectPackageManager(t))?.name||"npm",d=utils.getPackageManagerCommands(c);if(consola.consola.start("Checking dependencies..."),e.blockedPackages&&e.blockedPackages.length>0){const a=Object.keys(i).filter(l=>e.blockedPackages?.includes(l));a.length>0&&(consola.consola.error(`Blocked packages found: ${a.join(", ")}. Please remove these packages from your dependencies.`),n=!0)}if(e.checkOutdated)if(d.outdated)try{node_child_process.execSync(d.outdated,{cwd:t,stdio:"pipe"})}catch(a){consola.consola.warn("Some dependencies are outdated:",a)}else consola.consola.warn(`Outdated check not available for ${c}`);if(e.checkSecurity)if(d.audit)try{node_child_process.execSync(d.audit,{cwd:t,stdio:"pipe"})}catch(a){consola.consola.error("Security vulnerabilities detected:",a),n=!0}else consola.consola.warn(`Security audit not available for ${c}`);if(e.allowedLicenses&&e.allowedLicenses.length>0){const{hasIssues:a,invalidLicenses:l}=await E(t,e.allowedLicenses);a&&(consola.consola.error("Packages with invalid licenses found:"),l.forEach(u=>consola.consola.error(` ${u}`)),n=!0)}}catch(r){consola.consola.error("Failed to check dependencies:",r),n=!0}return!n}async function j(t,s){if(s.length===0)return!0;const o=(await Promise.all(s.map(async e=>({file:e,exists:await utils.fileExists(pathe.resolve(t,e))})))).filter(e=>!e.exists);return o.length>0?(o.forEach(({file:e})=>{consola.consola.error(`Required file missing: ${e}`)}),!1):!0}async function $(t,s){if(s.length===0)return!0;const o=(await Promise.all(s.map(async e=>({dir:e,exists:await utils.fileExists(pathe.resolve(t,e))})))).filter(e=>!e.exists);return o.length>0?(o.forEach(({dir:e})=>{consola.consola.error(`Required directory missing: ${e}`)}),!1):!0}async function x(t,s,o){const e=new RegExp(o),n=(await getProjectFiles(t,[s])).filter(r=>{const i=r.split("/").pop()||"";return!e.test(i)});return n.length>0?(consola.consola.error(`Files with invalid naming in ${s}: ${n.slice(0,3).join(", ")}${n.length>3?"...":""}`),!1):!0}async function F(t,s,o){const e=new RegExp(o),n=new Set,r=(await getProjectFiles(t,[s.replace(/\/\*\*?$/,"")])).filter(async i=>{const c=pathe.resolve(t,i);try{return(await import("node:fs/promises").then(d=>d.stat(c))).isDirectory()}catch{return!1}});for(const i of await Promise.all(r))if(i){const c=i.split("/").pop()||"";e.test(c)||n.add(i)}return n.size>0?(consola.consola.error(`Directories with invalid naming in ${s}: ${Array.from(n).slice(0,3).join(", ")}`),!1):!0}async function v(t,s){let o=!1;for(const e of s){const{path:n,files:r,directories:i,description:c}=e;consola.consola.start(`Checking naming rule: ${c||n}`),r&&(await x(t,n,r)||(o=!0)),i&&(await F(t,n,i)||(o=!0))}return!o}async function lintStructure(t=process.cwd(),s){const{config:o}=await utils.loadConfig({cwd:t,overrides:s?{lint:{structure:s}}:void 0}),e=o.lint?.structure||{};let n=!1;return consola.consola.start("Checking project structure..."),e.requiredFiles&&(await j(t,e.requiredFiles)||(n=!0)),e.requiredDirs&&(await $(t,e.requiredDirs)||(n=!0)),e.naming&&e.naming.length>0&&(await v(t,e.naming)||(n=!0)),!n}async function lintDocs(t=process.cwd(),s){const{config:o}=await utils.loadConfig({cwd:t,overrides:s?{lint:{docs:s}}:void 0}),e=o.lint?.docs||{};let n=!1;consola.consola.start("Checking documentation...");const r=[];e.checkReadme!==!1&&r.push({type:"README",files:["README.md","README.rst","README.txt","readme.md"],required:!0}),e.checkChangelog&&r.push({type:"CHANGELOG",files:["CHANGELOG.md","CHANGELOG.rst","HISTORY.md","changelog.md"],required:!0});for(const{type:i,files:c,required:d}of r){const a=(await Promise.all(c.map(l=>utils.fileExists(pathe.resolve(t,l))))).some(l=>l);d&&!a&&(consola.consola.error(`No ${i} file found`),n=!0)}return!n}async function lintAll(t=process.cwd()){const{config:s}=await utils.loadConfig({cwd:t}),o=s.lint||{};consola.consola.start("Running comprehensive project lint...");const e=(await Promise.allSettled([lintProject(t,o.project),lintDependencies(t,o.dependencies),lintStructure(t,o.structure),lintDocs(t,o.docs)])).filter(n=>n.status==="rejected"||n.status==="fulfilled"&&!n.value);return e.length===0?!0:(consola.consola.error(`${e.length} lint check(s) failed`),!1)}async function E(t,s){try{const o=await y__default(["node_modules/*/package.json","node_modules/@*/*/package.json"],{cwd:t,onlyFiles:!0,absolute:!0}),e=[],n=new Set;for(const r of o)try{const i=await pkgTypes.readPackageJSON(r);if(!i.name||n.has(i.name))continue;if(n.add(i.name),i.license){const c=Array.isArray(i.license)?i.license.join(", "):i.license;s.some(d=>c.includes(d))||e.push(`${i.name}: ${c}`)}}catch{}return{hasIssues:e.length>0,invalidLicenses:e}}catch(o){return consola.consola.warn("Failed to check licenses:",o),{hasIssues:!1,invalidLicenses:[]}}}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 +1 @@
1
- "use strict";const node_child_process=require("node:child_process"),consola=require("consola"),pkgTypes=require("pkg-types"),n=require("semver"),utils=require("./basis.DfY4XEAb.cjs");function _interopDefaultCompat(e){return e&&typeof e=="object"&&"default"in e?e.default:e}const n__default=_interopDefaultCompat(n);function P(e,a,c){if(a.version){if(n__default.valid(a.version))return a.version;throw new Error(`Invalid version format: ${a.version}. Please use semantic versioning format (e.g., 1.0.0, 2.1.0-alpha.1)`)}if(!n__default.valid(e))throw new Error(`Invalid current version format: ${e}. Please fix version in package.json to use semantic versioning format (e.g., 1.0.0)`);const r=n__default.prerelease(e),t=a.preid||(r&&typeof r[0]=="string"?r[0]:null)||c.prereleaseId||"edge";let o;a.major?o="major":a.minor?o="minor":a.prerelease?o=r?"prerelease":"prepatch":o=r?"prerelease":"patch";const i=o==="prerelease"||o.startsWith("pre")?n__default.inc(e,o,t):n__default.inc(e,o);if(!i)throw new Error(`Failed to calculate new version from ${e}. Please check your version increment options.`);return i}async function updatePackageVersion(e,a={}){const{config:c}=await utils.loadConfig({cwd:e}),r=c.version||{},t=await pkgTypes.readPackageJSON(e),o=t.version;if(!o)throw new Error("No version found in package.json");const i=P(o,a,r),u=await pkgTypes.resolvePackageJSON(e);await pkgTypes.writePackageJSON(u,{...t,version:i});const g={oldVersion:o,newVersion:i};if(r.autoCommit){const s=a.message||r.commitMessage?.replace("{version}",i)||`chore: release v${i}`;try{node_child_process.execSync("git add package.json",{cwd:e}),node_child_process.execSync(`git commit -m "${s}"`,{cwd:e})}catch(l){consola.consola.warn("Failed to commit changes:",l)}}if(r.autoTag){const s=`${r.tagPrefix||"v"}${i}`;try{node_child_process.execSync(`git tag ${s}`,{cwd:e}),g.tagName=s}catch(l){consola.consola.warn("Failed to create git tag:",l)}}if(r.autoPush)try{node_child_process.execSync("git push",{cwd:e}),r.autoTag&&node_child_process.execSync("git push --tags",{cwd:e})}catch(s){consola.consola.warn("Failed to push changes:",s)}return g}exports.updatePackageVersion=updatePackageVersion;
1
+ "use strict";const node_child_process=require("node:child_process"),consola=require("consola"),pkgTypes=require("pkg-types"),n=require("semver"),utils=require("./basis.cvMXIHAl.cjs");function _interopDefaultCompat(e){return e&&typeof e=="object"&&"default"in e?e.default:e}const n__default=_interopDefaultCompat(n);function P(e,a,c){if(a.version){if(n__default.valid(a.version))return a.version;throw new Error(`Invalid version format: ${a.version}. Please use semantic versioning format (e.g., 1.0.0, 2.1.0-alpha.1)`)}if(!n__default.valid(e))throw new Error(`Invalid current version format: ${e}. Please fix version in package.json to use semantic versioning format (e.g., 1.0.0)`);const r=n__default.prerelease(e),t=a.preid||(r&&typeof r[0]=="string"?r[0]:null)||c.prereleaseId||"edge";let o;a.major?o="major":a.minor?o="minor":a.prerelease?o=r?"prerelease":"prepatch":o=r?"prerelease":"patch";const i=o==="prerelease"||o.startsWith("pre")?n__default.inc(e,o,t):n__default.inc(e,o);if(!i)throw new Error(`Failed to calculate new version from ${e}. Please check your version increment options.`);return i}async function updatePackageVersion(e,a={}){const{config:c}=await utils.loadConfig({cwd:e}),r=c.version||{},t=await pkgTypes.readPackageJSON(e),o=t.version;if(!o)throw new Error("No version found in package.json");const i=P(o,a,r),u=await pkgTypes.resolvePackageJSON(e);await pkgTypes.writePackageJSON(u,{...t,version:i});const g={oldVersion:o,newVersion:i};if(r.autoCommit){const s=a.message||r.commitMessage?.replace("{version}",i)||`chore: release v${i}`;try{node_child_process.execSync("git add package.json",{cwd:e}),node_child_process.execSync(`git commit -m "${s}"`,{cwd:e})}catch(l){consola.consola.warn("Failed to commit changes:",l)}}if(r.autoTag){const s=`${r.tagPrefix||"v"}${i}`;try{node_child_process.execSync(`git tag ${s}`,{cwd:e}),g.tagName=s}catch(l){consola.consola.warn("Failed to create git tag:",l)}}if(r.autoPush)try{node_child_process.execSync("git push",{cwd:e}),r.autoTag&&node_child_process.execSync("git push --tags",{cwd:e})}catch(s){consola.consola.warn("Failed to push changes:",s)}return g}exports.updatePackageVersion=updatePackageVersion;
@@ -1 +1 @@
1
- import{execSync as o}from"node:child_process";import{consola as s}from"consola";import{detectPackageManager as y,runScript as h}from"nypm";import{readPackageJSON as k}from"pkg-types";import m from"semver";import{l as b}from"./basis.DEw91E2d.mjs";function $(t,a,r){if(a.tag)return a.tag;if(a.stable||a.latest)return r.stableTag||"latest";if(m.prerelease(t)){const i=m.prerelease(t);return i&&i[0]||r.defaultTag||"edge"}return r.stableTag||"latest"}async function C(t,a,r){if(a.checkGitClean&&!r.skipTests)try{if(o("git status --porcelain",{cwd:t,encoding:"utf8"}).trim())throw new Error("Working directory is not clean. Commit your changes first.")}catch(i){s.warn("Could not check git status:",i)}if(a.checkTests&&!r.skipTests){s.start("Running tests...");try{a.testCommand?o(a.testCommand,{cwd:t,stdio:"inherit"}):await h("test",{cwd:t,silent:!1})}catch(i){throw s.error("Tests failed"),i}}if(a.buildCommand&&!r.skipBuild){s.start("Building package...");try{a.buildCommand.includes(" ")?o(a.buildCommand,{cwd:t,stdio:"inherit"}):await h(a.buildCommand,{cwd:t,silent:!1})}catch(i){throw s.error("Build failed"),i}}}async function T(t,a){if(a.autoGitPush)try{o("git push",{cwd:t}),a.createGitTag&&o("git push --tags",{cwd:t})}catch(r){s.warn("Failed to push changes:",r)}}async function v(t,a={}){const{config:r}=await b({cwd:t}),i=r.publish||{},f=await k(t),{name:d,version:n}=f;if(!d||!n)throw new Error("Missing name or version in package.json. Please ensure your package.json contains valid 'name' and 'version' fields.");if(!m.valid(n))throw new Error(`Invalid version format in package.json: ${n}. Please use semantic versioning format (e.g., 1.0.0, 2.1.0-alpha.1)`);const p=await y(t),l=p?.command||"npm";await C(t,i,a);const g=$(n,a,i),u=["publish","--tag",g,"--access",a.access||i.access||"public"];(a.registry||i.registry)&&u.push("--registry",a.registry||i.registry||""),a.dryRun&&u.push("--dry-run");const w=`${l} ${u.join(" ")}`;s.start("Publishing package...");try{if(o(w,{cwd:t,stdio:"inherit"}),!a.dryRun){const e=i.defaultTag||"edge";if(g!==e){s.start(`Also publishing to ${e} tag...`);try{let c;p?.name==="yarn"?c=`${l} tag add ${d}@${n} ${e}`:c=`${l} dist-tag add ${d}@${n} ${e}`,o(c,{cwd:t,stdio:"inherit"})}catch(c){s.warn(`Failed to add ${e} tag:`,c)}}await T(t,i)}return{packageName:d,version:n,publishTag:g,dryRun:a.dryRun||!1}}catch(e){throw s.error("Failed to publish package:",e),e}}export{v as p};
1
+ import{execSync as o}from"node:child_process";import{consola as s}from"consola";import{detectPackageManager as y,runScript as h}from"nypm";import{readPackageJSON as k}from"pkg-types";import m from"semver";import{l as b}from"./basis.BIUEmg1C.mjs";function $(t,a,r){if(a.tag)return a.tag;if(a.stable||a.latest)return r.stableTag||"latest";if(m.prerelease(t)){const i=m.prerelease(t);return i&&i[0]||r.defaultTag||"edge"}return r.stableTag||"latest"}async function C(t,a,r){if(a.checkGitClean&&!r.skipTests)try{if(o("git status --porcelain",{cwd:t,encoding:"utf8"}).trim())throw new Error("Working directory is not clean. Commit your changes first.")}catch(i){s.warn("Could not check git status:",i)}if(a.checkTests&&!r.skipTests){s.start("Running tests...");try{a.testCommand?o(a.testCommand,{cwd:t,stdio:"inherit"}):await h("test",{cwd:t,silent:!1})}catch(i){throw s.error("Tests failed"),i}}if(a.buildCommand&&!r.skipBuild){s.start("Building package...");try{a.buildCommand.includes(" ")?o(a.buildCommand,{cwd:t,stdio:"inherit"}):await h(a.buildCommand,{cwd:t,silent:!1})}catch(i){throw s.error("Build failed"),i}}}async function T(t,a){if(a.autoGitPush)try{o("git push",{cwd:t}),a.createGitTag&&o("git push --tags",{cwd:t})}catch(r){s.warn("Failed to push changes:",r)}}async function v(t,a={}){const{config:r}=await b({cwd:t}),i=r.publish||{},f=await k(t),{name:d,version:n}=f;if(!d||!n)throw new Error("Missing name or version in package.json. Please ensure your package.json contains valid 'name' and 'version' fields.");if(!m.valid(n))throw new Error(`Invalid version format in package.json: ${n}. Please use semantic versioning format (e.g., 1.0.0, 2.1.0-alpha.1)`);const p=await y(t),l=p?.command||"npm";await C(t,i,a);const g=$(n,a,i),u=["publish","--tag",g,"--access",a.access||i.access||"public"];(a.registry||i.registry)&&u.push("--registry",a.registry||i.registry||""),a.dryRun&&u.push("--dry-run");const w=`${l} ${u.join(" ")}`;s.start("Publishing package...");try{if(o(w,{cwd:t,stdio:"inherit"}),!a.dryRun){const e=i.defaultTag||"edge";if(g!==e){s.start(`Also publishing to ${e} tag...`);try{let c;p?.name==="yarn"?c=`${l} tag add ${d}@${n} ${e}`:c=`${l} dist-tag add ${d}@${n} ${e}`,o(c,{cwd:t,stdio:"inherit"})}catch(c){s.warn(`Failed to add ${e} tag:`,c)}}await T(t,i)}return{packageName:d,version:n,publishTag:g,dryRun:a.dryRun||!1}}catch(e){throw s.error("Failed to publish package:",e),e}}export{v as p};
@@ -1 +1 @@
1
- "use strict";const node_child_process=require("node:child_process"),consola=require("consola"),nypm=require("nypm"),pkgTypes=require("pkg-types"),n=require("semver"),utils=require("./basis.DfY4XEAb.cjs");function _interopDefaultCompat(a){return a&&typeof a=="object"&&"default"in a?a.default:a}const n__default=_interopDefaultCompat(n);function C(a,e,s){if(e.tag)return e.tag;if(e.stable||e.latest)return s.stableTag||"latest";if(n__default.prerelease(a)){const t=n__default.prerelease(a);return t&&t[0]||s.defaultTag||"edge"}return s.stableTag||"latest"}async function T(a,e,s){if(e.checkGitClean&&!s.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(t){consola.consola.warn("Could not check git status:",t)}if(e.checkTests&&!s.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})}catch(t){throw consola.consola.error("Tests failed"),t}}if(e.buildCommand&&!s.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})}catch(t){throw consola.consola.error("Build failed"),t}}}async function $(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})}catch(s){consola.consola.warn("Failed to push changes:",s)}}async function publishPackage(a,e={}){const{config:s}=await utils.loadConfig({cwd:a}),t=s.publish||{},p=await pkgTypes.readPackageJSON(a),{name:o,version:r}=p;if(!o||!r)throw new Error("Missing name or version in package.json. Please ensure your package.json contains valid 'name' and 'version' fields.");if(!n__default.valid(r))throw new Error(`Invalid version format in package.json: ${r}. Please use semantic versioning format (e.g., 1.0.0, 2.1.0-alpha.1)`);const g=await nypm.detectPackageManager(a),d=g?.command||"npm";await T(a,t,e);const l=C(r,e,t),u=["publish","--tag",l,"--access",e.access||t.access||"public"];(e.registry||t.registry)&&u.push("--registry",e.registry||t.registry||""),e.dryRun&&u.push("--dry-run");const h=`${d} ${u.join(" ")}`;consola.consola.start("Publishing package...");try{if(node_child_process.execSync(h,{cwd:a,stdio:"inherit"}),!e.dryRun){const i=t.defaultTag||"edge";if(l!==i){consola.consola.start(`Also publishing to ${i} tag...`);try{let c;g?.name==="yarn"?c=`${d} tag add ${o}@${r} ${i}`:c=`${d} dist-tag add ${o}@${r} ${i}`,node_child_process.execSync(c,{cwd:a,stdio:"inherit"})}catch(c){consola.consola.warn(`Failed to add ${i} tag:`,c)}}await $(a,t)}return{packageName:o,version:r,publishTag:l,dryRun:e.dryRun||!1}}catch(i){throw consola.consola.error("Failed to publish package:",i),i}}exports.publishPackage=publishPackage;
1
+ "use strict";const node_child_process=require("node:child_process"),consola=require("consola"),nypm=require("nypm"),pkgTypes=require("pkg-types"),n=require("semver"),utils=require("./basis.cvMXIHAl.cjs");function _interopDefaultCompat(a){return a&&typeof a=="object"&&"default"in a?a.default:a}const n__default=_interopDefaultCompat(n);function C(a,e,s){if(e.tag)return e.tag;if(e.stable||e.latest)return s.stableTag||"latest";if(n__default.prerelease(a)){const t=n__default.prerelease(a);return t&&t[0]||s.defaultTag||"edge"}return s.stableTag||"latest"}async function T(a,e,s){if(e.checkGitClean&&!s.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(t){consola.consola.warn("Could not check git status:",t)}if(e.checkTests&&!s.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})}catch(t){throw consola.consola.error("Tests failed"),t}}if(e.buildCommand&&!s.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})}catch(t){throw consola.consola.error("Build failed"),t}}}async function $(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})}catch(s){consola.consola.warn("Failed to push changes:",s)}}async function publishPackage(a,e={}){const{config:s}=await utils.loadConfig({cwd:a}),t=s.publish||{},p=await pkgTypes.readPackageJSON(a),{name:o,version:r}=p;if(!o||!r)throw new Error("Missing name or version in package.json. Please ensure your package.json contains valid 'name' and 'version' fields.");if(!n__default.valid(r))throw new Error(`Invalid version format in package.json: ${r}. Please use semantic versioning format (e.g., 1.0.0, 2.1.0-alpha.1)`);const g=await nypm.detectPackageManager(a),d=g?.command||"npm";await T(a,t,e);const l=C(r,e,t),u=["publish","--tag",l,"--access",e.access||t.access||"public"];(e.registry||t.registry)&&u.push("--registry",e.registry||t.registry||""),e.dryRun&&u.push("--dry-run");const h=`${d} ${u.join(" ")}`;consola.consola.start("Publishing package...");try{if(node_child_process.execSync(h,{cwd:a,stdio:"inherit"}),!e.dryRun){const i=t.defaultTag||"edge";if(l!==i){consola.consola.start(`Also publishing to ${i} tag...`);try{let c;g?.name==="yarn"?c=`${d} tag add ${o}@${r} ${i}`:c=`${d} dist-tag add ${o}@${r} ${i}`,node_child_process.execSync(c,{cwd:a,stdio:"inherit"})}catch(c){consola.consola.warn(`Failed to add ${i} tag:`,c)}}await $(a,t)}return{packageName:o,version:r,publishTag:l,dryRun:e.dryRun||!1}}catch(i){throw consola.consola.error("Failed to publish package:",i),i}}exports.publishPackage=publishPackage;
@@ -0,0 +1,8 @@
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.cvMXIHAl.cjs"),git=require("./basis.gpPjNGLA.cjs"),S={ts:{ext:"ts",label:"TypeScript"},mjs:{ext:"mjs",label:"ES Module"},cjs:{ext:"cjs",label:"CommonJS"}};function J(i,r="npm"){const o=magicast.parseModule(i==="cjs"?`const { defineBasisConfig } = require("@funish/basis");
2
+
3
+ module.exports = defineBasisConfig({});`:`import { defineBasisConfig } from "@funish/basis";
4
+
5
+ export default defineBasisConfig({});`),{execPrefix:n}=utils.getPackageManagerCommands(r),c={git:{hooks:{"pre-commit":`${n} basis lint --staged`,"commit-msg":`${n} basis git --lint-commit`}}},a=o.exports.default.$args[0];return Object.assign(a,c),a.$ast.leadingComments=[{type:"Block",value:`
6
+ Configure your project here
7
+ See: https://github.com/funish/basis/tree/main/packages/basis#configuration
8
+ `}],magicast.generateCode(o).code}async function A(i){if(await utils.fileExists(pathe.resolve(i,"tsconfig.json")))return"ts";try{if((await pkgTypes.readPackageJSON(i)).type==="module")return"mjs"}catch{}return"ts"}async function init(i=process.cwd(),r={}){const{force:o=!1,skipGitCheck:n=!1,skipInstall:c=!1}=r;consola.consola.start("Initializing basis configuration...");const a=await A(i),d=await consola.consola.prompt("Choose config file format:",{type:"select",initial:a,options:Object.entries(S).map(([e,{label:s,ext:p}])=>({value:e,label:`${s} (${p}) ${a===e?"(recommended)":""}`}))}),g=S[d].ext,m=`basis.config.${g}`,k=pathe.resolve(i,m);if(await utils.fileExists(k)&&!o)return consola.consola.error(`${m} already exists. Use --force to overwrite.`),!1;let t=!1;if(!n)if(await utils.fileExists(pathe.resolve(i,".git")))t=await consola.consola.prompt("Setup Git hooks and configuration?",{type:"confirm",initial:!0});else if(consola.consola.info("No Git repository found."),await consola.consola.prompt("Initialize Git repository?",{type:"confirm",initial:!0}))try{await git.initGitRepo(i)?t=await consola.consola.prompt("Setup Git hooks and configuration?",{type:"confirm",initial:!0}):(consola.consola.warn("Git initialization failed, skipping Git setup"),t=!1)}catch(e){consola.consola.error("Failed to initialize Git repository:",e),consola.consola.warn("Skipping Git setup"),t=!1}else consola.consola.info("Skipping Git initialization"),t=!1;const w=(await nypm.detectPackageManager(i))?.name||"npm";await update.updateConfig({cwd:i,configFile:"basis.config",createExtension:`.${g}`,onCreate:()=>J(d,w)});let l=!1;c||(l=await consola.consola.prompt("Install @funish/basis dependency now?",{type:"confirm",initial:!0}));const h=await pkgTypes.findWorkspaceDir(i)===i;if(l)try{await nypm.addDevDependency(["@funish/basis"],{workspace:h})}catch(e){consola.consola.error("Failed to install @funish/basis:",e),consola.consola.info("You can install it manually with: basis add -D @funish/basis")}if(t)try{const e=pathe.resolve(i,"package.json");if(await utils.fileExists(e)){const s=await pkgTypes.readPackageJSON(e),p=w,u="basis git setup";s.scripts=s.scripts||{};const y=p==="yarn"?"prepare":"postinstall",f=s.scripts[y];let b=!1;f?.includes(u)||(s.scripts[y]=f?`${f} && ${u}`:u,b=!0),b&&await pkgTypes.writePackageJSON(e,s)}else consola.consola.warn("No package.json found. You'll need to run git setup manually.")}catch(e){consola.consola.error("Failed to update package.json:",e),consola.consola.warn("You can manually add 'basis git setup' to your postinstall script")}return t&&!l&&(await git.setupGit(i)||consola.consola.warn("Git setup failed, but basis config was created successfully")),consola.consola.success("Basis initialization completed!"),!0}exports.init=init;
@@ -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",execPrefix:"yarn exec"};case"pnpm":return{outdated:"pnpm outdated --format table",audit:"pnpm audit --audit-level moderate",execPrefix:"pnpm exec"};case"bun":return{outdated:"bun outdated",audit:null,execPrefix:"bunx"};case"deno":return{outdated:null,audit:null,execPrefix:"deno task"};default:return{outdated:"npm outdated --json",audit:"npm audit --audit-level moderate",execPrefix:"npx"}}}exports.fileExists=fileExists,exports.getPackageManagerCommands=getPackageManagerCommands,exports.loadConfig=loadConfig;
@@ -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"),C=require("ini"),pathe=require("pathe"),utils=require("./basis.cvMXIHAl.cjs");function _interopDefaultCompat(e){return e&&typeof e=="object"&&"default"in e?e.default:e}const C__default=_interopDefaultCompat(C);function G(){try{return node_child_process.execSync("git --version",{stdio:"pipe"}),!0}catch{return!1}}async function b(e,i=!1,r=!1){try{return await update.updateConfig({cwd:e,configFile:"basis.config",onUpdate:t=>{t.git&&(i&&t.git.hooks&&delete t.git.hooks,r&&t.git.config&&delete t.git.config,Object.keys(t.git).length===0&&delete t.git)}}),!0}catch{return!1}}const M=["feat","fix","docs","style","refactor","perf","test","build","ci","chore","revert"];function parseCommitMessage(e){const i=e.trim().split(`
2
+ `),r=i[0].match(/^(\w+)(\(([^)]+)\))?(!)?:\s*(.+)$/);if(!r)return null;const[,t,,o,n,s]=r,c=i.slice(1).find(l=>l.trim())?.trim(),a=i.slice(-1)[0]?.trim();return{type:t,scope:o,description:s,body:c,footer:a,isBreaking:!!n||e.includes("BREAKING CHANGE:")}}function validateCommitMessage(e,i={}){const r=[],{types:t=M,maxLength:o=72,minLength:n=10,scopeRequired:s=!1,allowedScopes:c=[]}=i,a=parseCommitMessage(e);if(!a)return{valid:!1,errors:["Invalid commit format. Expected: type(scope): description"]};t.includes(a.type)||r.push(`Invalid type '${a.type}'. Allowed: ${t.join(", ")}`);const l=e.split(`
3
+ `)[0];return l.length>o&&r.push(`Header too long (${l.length}). Max: ${o}`),l.length<n&&r.push(`Header too short (${l.length}). Min: ${n}`),s&&!a.scope&&r.push("Scope is required"),a.scope&&c.length>0&&!c.includes(a.scope)&&r.push(`Invalid scope '${a.scope}'. Allowed: ${c.join(", ")}`),{valid:r.length===0,errors:r}}async function lintCommitMessage(e=process.cwd(),i){if(!G())return consola.consola.warn("Git command not available, skipping commit message linting"),!0;const{config:r}=await utils.loadConfig({cwd:e,overrides:i?{git:{commitMsg:i}}:void 0}),t=r.git?.commitMsg||{};let o;try{const s=pathe.resolve(".git/COMMIT_EDITMSG");await utils.fileExists(s)?o=(await promises.readFile(s)).toString("utf8"):o=node_child_process.execSync("git log -1 --pretty=%B",{encoding:"utf8"}).trim()}catch(s){return consola.consola.error("Failed to read commit message:",s),!1}const n=validateCommitMessage(o,t);return n.valid?!0:(consola.consola.error("Invalid commit message:"),n.errors.forEach(s=>consola.consola.error(` ${s}`)),!1)}async function w(e){const i=pathe.resolve(e,".git/config");if(!await utils.fileExists(i))return null;const r=new Date().toISOString().replace(/[:.]/g,"-"),t=pathe.resolve(e,`.git/config.backup.${r}`);try{return await promises.copyFile(i,t),t}catch(o){return consola.consola.warn("Failed to create Git config backup:",o),null}}async function readGitConfig(e=process.cwd()){const i=pathe.resolve(e,".git/config");if(!await utils.fileExists(i))return{};try{const r=await promises.readFile(i,"utf8");return C__default.parse(r)}catch(r){return consola.consola.warn("Failed to read .git/config:",r),{}}}async function writeGitConfig(e,i=process.cwd()){const r=pathe.resolve(i,".git/config");try{let t=C__default.stringify(e,{whitespace:!0});t=t.split(`
4
+ `).map(o=>o&&!o.startsWith("[")&&o.includes("=")?` ${o}`:o).join(`
5
+ `),await promises.writeFile(r,t,"utf8")}catch(t){throw consola.consola.error("Failed to write .git/config:",t),t}}function S(e,i){if(!i)return!0;for(const[r,t]of Object.entries(i)){if(typeof t!="object"||!t)continue;const o=e[r];if(!o||typeof o!="object")return!1;for(const[n,s]of Object.entries(t))if(s!==void 0&&o[n]!==s)return!1}return!0}async function setupGitConfig(e=process.cwd(),i){const{config:r}=await utils.loadConfig({cwd:e,overrides:i?{git:{config:i}}:void 0}),t=r.git?.config||{};if(Object.keys(t).length===0)return!0;try{const o=await readGitConfig(e);if(S(o,t))return!0;await w(e);const n=defu.defu(o,t);return await writeGitConfig(n,e),!0}catch(o){return consola.consola.error("Failed to setup Git configuration:",o),!1}}async function resetGitConfig(e=process.cwd(),i=!0,r={}){try{await w(e);const t=await readGitConfig(e);if(!t||Object.keys(t).length===0)return!0;const o={};if(i&&t.user&&(o.user=t.user),t.core){const n=["repositoryformatversion","filemode","bare","logallrefupdates"],s={};n.forEach(c=>{t.core[c]!==void 0&&(s[c]=t.core[c])}),Object.keys(s).length>0&&(o.core=s)}return await writeGitConfig(o,e),r.updateConfig?await b(e,!1,!0):!0}catch(t){return consola.consola.error("Failed to reset Git configuration:",t),!1}}async function setupGitHooks(e=process.cwd(),i){const{config:r}=await utils.loadConfig({cwd:e,overrides:i?{git:{hooks:i}}:void 0}),t=r.git?.hooks||{},o=pathe.resolve(e,".git/hooks");if(!await utils.fileExists(o))return consola.consola.error("Git hooks directory not found. Is this a Git repository?"),!1;let n=!0;for(const[s,c]of Object.entries(t)){const a=pathe.resolve(o,s);try{let l=`#!/bin/sh
6
+
7
+ `;if(typeof c=="string")l+=`${c}
8
+ `;else if(c&&typeof c=="object"&&"commands"in c){const f=c.commands;l+=`${f.join(`
9
+ `)}
10
+ `}await promises.writeFile(a,l,{mode:493})}catch(l){consola.consola.error(`Failed to setup ${s} hook:`,l),n=!1}}return n}async function initGitRepo(e=process.cwd()){if(!G())return consola.consola.warn("Git command not available, cannot initialize repository"),!1;try{try{return node_child_process.execSync("git rev-parse --git-dir",{cwd:e,stdio:"pipe"}),!0}catch{return node_child_process.execSync("git init",{cwd:e,stdio:"inherit"}),consola.consola.success("Initialized Git repository"),!0}}catch(i){return consola.consola.error("Failed to initialize Git repository:",i),!1}}async function setupGit(e=process.cwd()){const{config:i}=await utils.loadConfig({cwd:e}),r=i.git||{},t=(await Promise.allSettled([setupGitConfig(e,r.config),setupGitHooks(e,r.hooks)])).filter(o=>o.status==="rejected"||o.status==="fulfilled"&&!o.value);return t.length===0?(consola.consola.success("Git setup completed successfully!"),!0):(consola.consola.error(`${t.length} Git setup step(s) failed`),!1)}async function removeGitHooks(e=process.cwd(),i,r={}){const t=pathe.resolve(e,".git/hooks");if(!await utils.fileExists(t))return consola.consola.warn("Git hooks directory not found. Is this a Git repository?"),!0;let o=!0,n;if(i&&i.length>0)n=i;else{const{config:s}=await utils.loadConfig({cwd:e});n=Object.keys(s.git?.hooks||{})}for(const s of n){const c=pathe.resolve(t,s);if(await utils.fileExists(c))try{await promises.unlink(c)}catch(a){consola.consola.error(`Failed to remove ${s} hook:`,a),o=!1}}if(!i&&r.updateConfig){const s=await b(e,!0,!1);o=o&&s}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;
@@ -0,0 +1,8 @@
1
+ import{updateConfig as S}from"c12/update";import{consola as i}from"consola";import{parseModule as z,generateCode as B}from"magicast";import{detectPackageManager as v,addDevDependency as F}from"nypm";import{resolve as c}from"pathe";import{findWorkspaceDir as P,readPackageJSON as C,writePackageJSON as D}from"pkg-types";import{f as p,g as I}from"./basis.BIUEmg1C.mjs";import{i as J,s as M}from"./basis.C2jy0pwk.mjs";const j={ts:{ext:"ts",label:"TypeScript"},mjs:{ext:"mjs",label:"ES Module"},cjs:{ext:"cjs",label:"CommonJS"}};function N(t,l="npm"){const n=z(t==="cjs"?`const { defineBasisConfig } = require("@funish/basis");
2
+
3
+ module.exports = defineBasisConfig({});`:`import { defineBasisConfig } from "@funish/basis";
4
+
5
+ export default defineBasisConfig({});`),{execPrefix:r}=I(l),f={git:{hooks:{"pre-commit":`${r} basis lint --staged`,"commit-msg":`${r} basis git --lint-commit`}}},o=n.exports.default.$args[0];return Object.assign(o,f),o.$ast.leadingComments=[{type:"Block",value:`
6
+ Configure your project here
7
+ See: https://github.com/funish/basis/tree/main/packages/basis#configuration
8
+ `}],B(n).code}async function O(t){if(await p(c(t,"tsconfig.json")))return"ts";try{if((await C(t)).type==="module")return"mjs"}catch{}return"ts"}async function E(t=process.cwd(),l={}){const{force:n=!1,skipGitCheck:r=!1,skipInstall:f=!1}=l;i.start("Initializing basis configuration...");const o=await O(t),w=await i.prompt("Choose config file format:",{type:"select",initial:o,options:Object.entries(j).map(([a,{label:s,ext:m}])=>({value:a,label:`${s} (${m}) ${o===a?"(recommended)":""}`}))}),y=j[w].ext,b=`basis.config.${y}`,G=c(t,b);if(await p(G)&&!n)return i.error(`${b} already exists. Use --force to overwrite.`),!1;let e=!1;if(!r)if(await p(c(t,".git")))e=await i.prompt("Setup Git hooks and configuration?",{type:"confirm",initial:!0});else if(i.info("No Git repository found."),await i.prompt("Initialize Git repository?",{type:"confirm",initial:!0}))try{await J(t)?e=await i.prompt("Setup Git hooks and configuration?",{type:"confirm",initial:!0}):(i.warn("Git initialization failed, skipping Git setup"),e=!1)}catch(a){i.error("Failed to initialize Git repository:",a),i.warn("Skipping Git setup"),e=!1}else i.info("Skipping Git initialization"),e=!1;const h=(await v(t))?.name||"npm";await S({cwd:t,configFile:"basis.config",createExtension:`.${y}`,onCreate:()=>N(w,h)});let u=!1;f||(u=await i.prompt("Install @funish/basis dependency now?",{type:"confirm",initial:!0}));const $=await P(t)===t;if(u)try{await F(["@funish/basis"],{workspace:$})}catch(a){i.error("Failed to install @funish/basis:",a),i.info("You can install it manually with: basis add -D @funish/basis")}if(e)try{const a=c(t,"package.json");if(await p(a)){const s=await C(a),m=h,d="basis git setup";s.scripts=s.scripts||{};const k=m==="yarn"?"prepare":"postinstall",g=s.scripts[k];let x=!1;g?.includes(d)||(s.scripts[k]=g?`${g} && ${d}`:d,x=!0),x&&await D(a,s)}else i.warn("No package.json found. You'll need to run git setup manually.")}catch(a){i.error("Failed to update package.json:",a),i.warn("You can manually add 'basis git setup' to your postinstall script")}return e&&!u&&(await M(t)||i.warn("Git setup failed, but basis config was created successfully")),i.success("Basis initialization completed!"),!0}export{E as i};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@funish/basis",
3
- "version": "0.0.5",
3
+ "version": "0.0.7",
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",
@@ -1,10 +0,0 @@
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"),y=require("ini"),pathe=require("pathe"),utils=require("./basis.DfY4XEAb.cjs");function _interopDefaultCompat(e){return e&&typeof e=="object"&&"default"in e?e.default:e}const y__default=_interopDefaultCompat(y);async function G(e,i=!1,s=!1){try{return await update.updateConfig({cwd:e,configFile:"basis.config",onUpdate:t=>{t.git&&(i&&t.git.hooks&&delete t.git.hooks,s&&t.git.config&&delete t.git.config,Object.keys(t.git).length===0&&delete t.git)}}),!0}catch{return!1}}const P=["feat","fix","docs","style","refactor","perf","test","build","ci","chore","revert"];function parseCommitMessage(e){const i=e.trim().split(`
2
- `),s=i[0].match(/^(\w+)(\(([^)]+)\))?(!)?:\s*(.+)$/);if(!s)return null;const[,t,,o,n,r]=s,c=i.slice(1).find(l=>l.trim())?.trim(),a=i.slice(-1)[0]?.trim();return{type:t,scope:o,description:r,body:c,footer:a,isBreaking:!!n||e.includes("BREAKING CHANGE:")}}function validateCommitMessage(e,i={}){const s=[],{types:t=P,maxLength:o=72,minLength:n=10,scopeRequired:r=!1,allowedScopes:c=[]}=i,a=parseCommitMessage(e);if(!a)return{valid:!1,errors:["Invalid commit format. Expected: type(scope): description"]};t.includes(a.type)||s.push(`Invalid type '${a.type}'. Allowed: ${t.join(", ")}`);const l=e.split(`
3
- `)[0];return l.length>o&&s.push(`Header too long (${l.length}). Max: ${o}`),l.length<n&&s.push(`Header too short (${l.length}). Min: ${n}`),r&&!a.scope&&s.push("Scope is required"),a.scope&&c.length>0&&!c.includes(a.scope)&&s.push(`Invalid scope '${a.scope}'. Allowed: ${c.join(", ")}`),{valid:s.length===0,errors:s}}async function lintCommitMessage(e=process.cwd(),i){const{config:s}=await utils.loadConfig({cwd:e,overrides:i?{git:{commitMsg:i}}:void 0}),t=s.git?.commitMsg||{};let o;try{const r=pathe.resolve(".git/COMMIT_EDITMSG");await utils.fileExists(r)?o=(await promises.readFile(r)).toString("utf8"):o=node_child_process.execSync("git log -1 --pretty=%B",{encoding:"utf8"}).trim()}catch(r){return consola.consola.error("Failed to read commit message:",r),!1}const n=validateCommitMessage(o,t);return n.valid?!0:(consola.consola.error("Invalid commit message:"),n.errors.forEach(r=>consola.consola.error(` ${r}`)),!1)}async function w(e){const i=pathe.resolve(e,".git/config");if(!await utils.fileExists(i))return null;const s=new Date().toISOString().replace(/[:.]/g,"-"),t=pathe.resolve(e,`.git/config.backup.${s}`);try{return await promises.copyFile(i,t),t}catch(o){return consola.consola.warn("Failed to create Git config backup:",o),null}}async function readGitConfig(e=process.cwd()){const i=pathe.resolve(e,".git/config");if(!await utils.fileExists(i))return{};try{const s=await promises.readFile(i,"utf8");return y__default.parse(s)}catch(s){return consola.consola.warn("Failed to read .git/config:",s),{}}}async function writeGitConfig(e,i=process.cwd()){const s=pathe.resolve(i,".git/config");try{let t=y__default.stringify(e,{whitespace:!0});t=t.split(`
4
- `).map(o=>o&&!o.startsWith("[")&&o.includes("=")?` ${o}`:o).join(`
5
- `),await promises.writeFile(s,t,"utf8")}catch(t){throw consola.consola.error("Failed to write .git/config:",t),t}}function M(e,i){if(!i)return!0;for(const[s,t]of Object.entries(i)){if(typeof t!="object"||!t)continue;const o=e[s];if(!o||typeof o!="object")return!1;for(const[n,r]of Object.entries(t))if(r!==void 0&&o[n]!==r)return!1}return!0}async function setupGitConfig(e=process.cwd(),i){const{config:s}=await utils.loadConfig({cwd:e,overrides:i?{git:{config:i}}:void 0}),t=s.git?.config||{};if(Object.keys(t).length===0)return!0;try{const o=await readGitConfig(e);if(M(o,t))return!0;await w(e);const n=defu.defu(o,t);return await writeGitConfig(n,e),!0}catch(o){return consola.consola.error("Failed to setup Git configuration:",o),!1}}async function resetGitConfig(e=process.cwd(),i=!0,s={}){try{await w(e);const t=await readGitConfig(e);if(!t||Object.keys(t).length===0)return!0;const o={};if(i&&t.user&&(o.user=t.user),t.core){const n=["repositoryformatversion","filemode","bare","logallrefupdates"],r={};n.forEach(c=>{t.core[c]!==void 0&&(r[c]=t.core[c])}),Object.keys(r).length>0&&(o.core=r)}return await writeGitConfig(o,e),s.updateConfig?await G(e,!1,!0):!0}catch(t){return consola.consola.error("Failed to reset Git configuration:",t),!1}}async function setupGitHooks(e=process.cwd(),i){const{config:s}=await utils.loadConfig({cwd:e,overrides:i?{git:{hooks:i}}:void 0}),t=s.git?.hooks||{},o=pathe.resolve(e,".git/hooks");if(!await utils.fileExists(o))return consola.consola.error("Git hooks directory not found. Is this a Git repository?"),!1;let n=!0;for(const[r,c]of Object.entries(t)){const a=pathe.resolve(o,r);try{let l=`#!/bin/sh
6
-
7
- `;if(typeof c=="string")l+=`${c}
8
- `;else if(c&&typeof c=="object"&&"commands"in c){const f=c.commands;l+=`${f.join(`
9
- `)}
10
- `}await promises.writeFile(a,l,{mode:493})}catch(l){consola.consola.error(`Failed to setup ${r} hook:`,l),n=!1}}return n}async function initGitRepo(e=process.cwd()){try{try{return node_child_process.execSync("git rev-parse --git-dir",{cwd:e,stdio:"pipe"}),!0}catch{return node_child_process.execSync("git init",{cwd:e,stdio:"inherit"}),consola.consola.success("Initialized Git repository"),!0}}catch(i){return consola.consola.error("Failed to initialize Git repository:",i),!1}}async function setupGit(e=process.cwd()){const{config:i}=await utils.loadConfig({cwd:e}),s=i.git||{},t=(await Promise.allSettled([setupGitConfig(e,s.config),setupGitHooks(e,s.hooks)])).filter(o=>o.status==="rejected"||o.status==="fulfilled"&&!o.value);return t.length===0?(consola.consola.success("Git setup completed successfully!"),!0):(consola.consola.error(`${t.length} Git setup step(s) failed`),!1)}async function removeGitHooks(e=process.cwd(),i,s={}){const t=pathe.resolve(e,".git/hooks");if(!await utils.fileExists(t))return consola.consola.warn("Git hooks directory not found. Is this a Git repository?"),!0;let o=!0,n;if(i&&i.length>0)n=i;else{const{config:r}=await utils.loadConfig({cwd:e});n=Object.keys(r.git?.hooks||{})}for(const r of n){const c=pathe.resolve(t,r);if(await utils.fileExists(c))try{await promises.unlink(c)}catch(a){consola.consola.error(`Failed to remove ${r} hook:`,a),o=!1}}if(!i&&s.updateConfig){const r=await G(e,!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;
@@ -1,8 +0,0 @@
1
- import{updateConfig as S}from"c12/update";import{consola as t}from"consola";import{parseModule as $,generateCode as B}from"magicast";import{addDevDependency as z,detectPackageManager as v}from"nypm";import{resolve as r}from"pathe";import{findWorkspaceDir as D,readPackageJSON as k,writePackageJSON as F}from"pkg-types";import{f as c}from"./basis.DEw91E2d.mjs";import{i as I,s as J}from"./basis.DzKnyliK.mjs";const j={ts:{ext:"ts",label:"TypeScript"},mjs:{ext:"mjs",label:"ES Module"},cjs:{ext:"cjs",label:"CommonJS"}};function M(i){const o=$(i==="cjs"?`const { defineBasisConfig } = require("@funish/basis");
2
-
3
- module.exports = defineBasisConfig({});`:`import { defineBasisConfig } from "@funish/basis";
4
-
5
- export default defineBasisConfig({});`),l={lint:{staged:{},project:{}},git:{hooks:{},autoSetup:!0},packageManager:{autoDetect:!0}},n=o.exports.default.$args[0];return Object.assign(n,l),n.$ast.leadingComments=[{type:"Block",value:`
6
- Configure your project here
7
- See: https://github.com/funish/basis/tree/main/packages/basis#configuration
8
- `}],B(o).code}async function N(i){if(await c(r(i,"tsconfig.json")))return"ts";try{if((await k(i)).type==="module")return"mjs"}catch{}return"ts"}async function O(i=process.cwd(),o={}){const{force:l=!1,skipGitCheck:n=!1,skipInstall:G=!1}=o;t.start("Initializing basis configuration...");const w=await N(i),y=await t.prompt("Choose config file format:",{type:"select",initial:w,options:Object.entries(j).map(([e,{label:a,ext:f}])=>({value:e,label:`${a} (${f}) ${w===e?"(recommended)":""}`}))}),b=j[y].ext,h=`basis.config.${b}`,C=r(i,h);if(await c(C)&&!l)return t.error(`${h} already exists. Use --force to overwrite.`),!1;let s=!1;if(!n)if(await c(r(i,".git")))s=await t.prompt("Setup Git hooks and configuration?",{type:"confirm",initial:!0});else if(t.info("No Git repository found."),await t.prompt("Initialize Git repository?",{type:"confirm",initial:!0}))try{await I(i)?s=await t.prompt("Setup Git hooks and configuration?",{type:"confirm",initial:!0}):(t.warn("Git initialization failed, skipping Git setup"),s=!1)}catch(e){t.error("Failed to initialize Git repository:",e),t.warn("Skipping Git setup"),s=!1}else t.info("Skipping Git initialization"),s=!1;await S({cwd:i,configFile:"basis.config",createExtension:`.${b}`,onCreate:()=>M(y)});let p=!1;G||(p=await t.prompt("Install @funish/basis dependency now?",{type:"confirm",initial:!0}));const x=await D(i)===i;if(p)try{await z(["@funish/basis"],{workspace:x})}catch(e){t.error("Failed to install @funish/basis:",e),t.info("You can install it manually with: basis add -D @funish/basis")}if(s)try{const e=r(i,"package.json");if(await c(e)){const a=await k(e),f=(await v(i))?.name||"npm",u="basis git setup";a.scripts=a.scripts||{};const m=f==="yarn"?"prepare":"postinstall",d=a.scripts[m];let g=!1;d?d.includes(u)||(a.scripts[m]=`${d} && ${u}`,g=!0):(a.scripts[m]=u,g=!0),g&&await F(e,a)}else t.warn("No package.json found. You'll need to run git setup manually.")}catch(e){t.error("Failed to update package.json:",e),t.warn("You can manually add 'basis git setup' to your postinstall script")}return s&&!p&&(await J(i)||t.warn("Git setup failed, but basis config was created successfully")),t.success("Basis initialization completed!"),!0}export{O as i};
@@ -1 +0,0 @@
1
- import{access as t}from"node:fs/promises";import{loadConfig as e}from"c12";import{defaultConfig as d}from"../config.mjs";async function n(a={}){return await e({name:"basis",cwd:process.cwd(),...a,defaults:{...d,...a.defaults}})}async function u(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:null};case"deno":return{outdated:null,audit:null};default:return{outdated:"npm outdated --json",audit:"npm audit --audit-level moderate"}}}export{u as f,o as g,n as l};
@@ -1,8 +0,0 @@
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.DfY4XEAb.cjs"),git=require("./basis.Bar6V_OJ.cjs"),G={ts:{ext:"ts",label:"TypeScript"},mjs:{ext:"mjs",label:"ES Module"},cjs:{ext:"cjs",label:"CommonJS"}};function B(t){const s=magicast.parseModule(t==="cjs"?`const { defineBasisConfig } = require("@funish/basis");
2
-
3
- module.exports = defineBasisConfig({});`:`import { defineBasisConfig } from "@funish/basis";
4
-
5
- export default defineBasisConfig({});`),n={lint:{staged:{},project:{}},git:{hooks:{},autoSetup:!0},packageManager:{autoDetect:!0}},o=s.exports.default.$args[0];return Object.assign(o,n),o.$ast.leadingComments=[{type:"Block",value:`
6
- Configure your project here
7
- See: https://github.com/funish/basis/tree/main/packages/basis#configuration
8
- `}],magicast.generateCode(s).code}async function J(t){if(await utils.fileExists(pathe.resolve(t,"tsconfig.json")))return"ts";try{if((await pkgTypes.readPackageJSON(t)).type==="module")return"mjs"}catch{}return"ts"}async function init(t=process.cwd(),s={}){const{force:n=!1,skipGitCheck:o=!1,skipInstall:y=!1}=s;consola.consola.start("Initializing basis configuration...");const d=await J(t),g=await consola.consola.prompt("Choose config file format:",{type:"select",initial:d,options:Object.entries(G).map(([e,{label:i,ext:c}])=>({value:e,label:`${i} (${c}) ${d===e?"(recommended)":""}`}))}),m=G[g].ext,w=`basis.config.${m}`,b=pathe.resolve(t,w);if(await utils.fileExists(b)&&!n)return consola.consola.error(`${w} already exists. Use --force to overwrite.`),!1;let a=!1;if(!o)if(await utils.fileExists(pathe.resolve(t,".git")))a=await consola.consola.prompt("Setup Git hooks and configuration?",{type:"confirm",initial:!0});else if(consola.consola.info("No Git repository found."),await consola.consola.prompt("Initialize Git repository?",{type:"confirm",initial:!0}))try{await git.initGitRepo(t)?a=await consola.consola.prompt("Setup Git hooks and configuration?",{type:"confirm",initial:!0}):(consola.consola.warn("Git initialization failed, skipping Git setup"),a=!1)}catch(e){consola.consola.error("Failed to initialize Git repository:",e),consola.consola.warn("Skipping Git setup"),a=!1}else consola.consola.info("Skipping Git initialization"),a=!1;await update.updateConfig({cwd:t,configFile:"basis.config",createExtension:`.${m}`,onCreate:()=>B(g)});let r=!1;y||(r=await consola.consola.prompt("Install @funish/basis dependency now?",{type:"confirm",initial:!0}));const k=await pkgTypes.findWorkspaceDir(t)===t;if(r)try{await nypm.addDevDependency(["@funish/basis"],{workspace:k})}catch(e){consola.consola.error("Failed to install @funish/basis:",e),consola.consola.info("You can install it manually with: basis add -D @funish/basis")}if(a)try{const e=pathe.resolve(t,"package.json");if(await utils.fileExists(e)){const i=await pkgTypes.readPackageJSON(e),c=(await nypm.detectPackageManager(t))?.name||"npm",l="basis git setup";i.scripts=i.scripts||{};const p=c==="yarn"?"prepare":"postinstall",u=i.scripts[p];let f=!1;u?u.includes(l)||(i.scripts[p]=`${u} && ${l}`,f=!0):(i.scripts[p]=l,f=!0),f&&await pkgTypes.writePackageJSON(e,i)}else consola.consola.warn("No package.json found. You'll need to run git setup manually.")}catch(e){consola.consola.error("Failed to update package.json:",e),consola.consola.warn("You can manually add 'basis git setup' to your postinstall script")}return a&&!r&&(await git.setupGit(t)||consola.consola.warn("Git setup failed, but basis config was created successfully")),consola.consola.success("Basis initialization completed!"),!0}exports.init=init;
@@ -1 +0,0 @@
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:null};case"deno":return{outdated:null,audit:null};default:return{outdated:"npm outdated --json",audit:"npm audit --audit-level moderate"}}}exports.fileExists=fileExists,exports.getPackageManagerCommands=getPackageManagerCommands,exports.loadConfig=loadConfig;
@@ -1,10 +0,0 @@
1
- import{execSync as p}from"node:child_process";import{readFile as m,unlink as I,writeFile as y,copyFile as M}from"node:fs/promises";import{updateConfig as O}from"c12/update";import{consola as a}from"consola";import{defu as S}from"defu";import v from"ini";import{resolve as u}from"pathe";import{l as g,f as d}from"./basis.DEw91E2d.mjs";async function k(e,i=!1,r=!1){try{return await O({cwd:e,configFile:"basis.config",onUpdate:t=>{t.git&&(i&&t.git.hooks&&delete t.git.hooks,r&&t.git.config&&delete t.git.config,Object.keys(t.git).length===0&&delete t.git)}}),!0}catch{return!1}}const x=["feat","fix","docs","style","refactor","perf","test","build","ci","chore","revert"];function G(e){const i=e.trim().split(`
2
- `),r=i[0].match(/^(\w+)(\(([^)]+)\))?(!)?:\s*(.+)$/);if(!r)return null;const[,t,,o,n,s]=r,c=i.slice(1).find(l=>l.trim())?.trim(),f=i.slice(-1)[0]?.trim();return{type:t,scope:o,description:s,body:c,footer:f,isBreaking:!!n||e.includes("BREAKING CHANGE:")}}function b(e,i={}){const r=[],{types:t=x,maxLength:o=72,minLength:n=10,scopeRequired:s=!1,allowedScopes:c=[]}=i,f=G(e);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 l=e.split(`
3
- `)[0];return l.length>o&&r.push(`Header too long (${l.length}). Max: ${o}`),l.length<n&&r.push(`Header too short (${l.length}). Min: ${n}`),s&&!f.scope&&r.push("Scope is required"),f.scope&&c.length>0&&!c.includes(f.scope)&&r.push(`Invalid scope '${f.scope}'. Allowed: ${c.join(", ")}`),{valid:r.length===0,errors:r}}async function E(e=process.cwd(),i){const{config:r}=await g({cwd:e,overrides:i?{git:{commitMsg:i}}:void 0}),t=r.git?.commitMsg||{};let o;try{const s=u(".git/COMMIT_EDITMSG");await d(s)?o=(await m(s)).toString("utf8"):o=p("git log -1 --pretty=%B",{encoding:"utf8"}).trim()}catch(s){return a.error("Failed to read commit message:",s),!1}const n=b(o,t);return n.valid?!0:(a.error("Invalid commit message:"),n.errors.forEach(s=>a.error(` ${s}`)),!1)}async function $(e){const i=u(e,".git/config");if(!await d(i))return null;const r=new Date().toISOString().replace(/[:.]/g,"-"),t=u(e,`.git/config.backup.${r}`);try{return await M(i,t),t}catch(o){return a.warn("Failed to create Git config backup:",o),null}}async function w(e=process.cwd()){const i=u(e,".git/config");if(!await d(i))return{};try{const r=await m(i,"utf8");return v.parse(r)}catch(r){return a.warn("Failed to read .git/config:",r),{}}}async function h(e,i=process.cwd()){const r=u(i,".git/config");try{let t=v.stringify(e,{whitespace:!0});t=t.split(`
4
- `).map(o=>o&&!o.startsWith("[")&&o.includes("=")?` ${o}`:o).join(`
5
- `),await y(r,t,"utf8")}catch(t){throw a.error("Failed to write .git/config:",t),t}}function H(e,i){if(!i)return!0;for(const[r,t]of Object.entries(i)){if(typeof t!="object"||!t)continue;const o=e[r];if(!o||typeof o!="object")return!1;for(const[n,s]of Object.entries(t))if(s!==void 0&&o[n]!==s)return!1}return!0}async function j(e=process.cwd(),i){const{config:r}=await g({cwd:e,overrides:i?{git:{config:i}}:void 0}),t=r.git?.config||{};if(Object.keys(t).length===0)return!0;try{const o=await w(e);if(H(o,t))return!0;await $(e);const n=S(o,t);return await h(n,e),!0}catch(o){return a.error("Failed to setup Git configuration:",o),!1}}async function A(e=process.cwd(),i=!0,r={}){try{await $(e);const t=await w(e);if(!t||Object.keys(t).length===0)return!0;const o={};if(i&&t.user&&(o.user=t.user),t.core){const n=["repositoryformatversion","filemode","bare","logallrefupdates"],s={};n.forEach(c=>{t.core[c]!==void 0&&(s[c]=t.core[c])}),Object.keys(s).length>0&&(o.core=s)}return await h(o,e),r.updateConfig?await k(e,!1,!0):!0}catch(t){return a.error("Failed to reset Git configuration:",t),!1}}async function C(e=process.cwd(),i){const{config:r}=await g({cwd:e,overrides:i?{git:{hooks:i}}:void 0}),t=r.git?.hooks||{},o=u(e,".git/hooks");if(!await d(o))return a.error("Git hooks directory not found. Is this a Git repository?"),!1;let n=!0;for(const[s,c]of Object.entries(t)){const f=u(o,s);try{let l=`#!/bin/sh
6
-
7
- `;if(typeof c=="string")l+=`${c}
8
- `;else if(c&&typeof c=="object"&&"commands"in c){const F=c.commands;l+=`${F.join(`
9
- `)}
10
- `}await y(f,l,{mode:493})}catch(l){a.error(`Failed to setup ${s} hook:`,l),n=!1}}return n}async function B(e=process.cwd()){try{try{return p("git rev-parse --git-dir",{cwd:e,stdio:"pipe"}),!0}catch{return p("git init",{cwd:e,stdio:"inherit"}),a.success("Initialized Git repository"),!0}}catch(i){return a.error("Failed to initialize Git repository:",i),!1}}async function R(e=process.cwd()){const{config:i}=await g({cwd:e}),r=i.git||{},t=(await Promise.allSettled([j(e,r.config),C(e,r.hooks)])).filter(o=>o.status==="rejected"||o.status==="fulfilled"&&!o.value);return t.length===0?(a.success("Git setup completed successfully!"),!0):(a.error(`${t.length} Git setup step(s) failed`),!1)}async function q(e=process.cwd(),i,r={}){const t=u(e,".git/hooks");if(!await d(t))return a.warn("Git hooks directory not found. Is this a Git repository?"),!0;let o=!0,n;if(i&&i.length>0)n=i;else{const{config:s}=await g({cwd:e});n=Object.keys(s.git?.hooks||{})}for(const s of n){const c=u(t,s);if(await d(c))try{await I(c)}catch(f){a.error(`Failed to remove ${s} hook:`,f),o=!1}}if(!i&&r.updateConfig){const s=await k(e,!0,!1);o=o&&s}return o}export{j as a,A as b,C as c,q as d,B as i,E as l,G as p,w as r,R as s,b as v,h as w};