vite-plus 0.1.6 → 0.1.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -29,7 +29,7 @@ Install Vite+ globally as `vp`:
29
29
  For Linux or macOS:
30
30
 
31
31
  ```bash
32
- curl -fsSL https://viteplus.dev/install.sh | bash
32
+ curl -fsSL https://vite.plus | bash
33
33
  ```
34
34
 
35
35
  For Windows:
@@ -138,6 +138,7 @@ Vite+ automatically wraps your package manager (pnpm, npm, or Yarn) based on `pa
138
138
  #### Maintain
139
139
 
140
140
  - **upgrade** - Update `vp` itself to the latest version
141
+ - **implode** - Remove `vp` and all related data
141
142
 
142
143
  ### Scaffolding your first Vite+ project
143
144
 
package/dist/bin.js CHANGED
@@ -19,7 +19,16 @@ import { pack } from './resolve-pack.js';
19
19
  import { test } from './resolve-test.js';
20
20
  import { resolveUniversalViteConfig } from './resolve-vite-config.js';
21
21
  import { vite } from './resolve-vite.js';
22
- import { accent, log } from './utils/terminal.js';
22
+ import { accent, errorMsg, log } from './utils/terminal.js';
23
+ function getErrorMessage(err) {
24
+ if (err instanceof Error) {
25
+ return err.message;
26
+ }
27
+ if (typeof err === 'object' && err && 'message' in err && typeof err.message === 'string') {
28
+ return err.message;
29
+ }
30
+ return String(err);
31
+ }
23
32
  // Parse command line arguments
24
33
  let args = process.argv.slice(2);
25
34
  // Transform `vp help [command]` into `vp [command] --help`
@@ -100,7 +109,7 @@ else {
100
109
  process.exit(finalExitCode);
101
110
  }
102
111
  catch (err) {
103
- console.error('[Vite+] run error:', err);
112
+ errorMsg(getErrorMessage(err));
104
113
  process.exit(1);
105
114
  }
106
115
  }
@@ -23,6 +23,7 @@ async function main() {
23
23
  const helpMessage = renderCliDoc({
24
24
  usage: 'vp config [OPTIONS]',
25
25
  summary: 'Configure Vite+ for the current project (hooks + agent integration).',
26
+ documentationUrl: 'https://viteplus.dev/guide/commit-hooks',
26
27
  sections: [
27
28
  {
28
29
  title: 'Options',
@@ -77,7 +77,10 @@ export function install(dir = '.vite-hooks') {
77
77
  const target = rel ? `${rel}/${dir}/_` : `${dir}/_`;
78
78
  const checkResult = spawnSync('git', ['config', '--local', 'core.hooksPath']);
79
79
  const existingHooksPath = checkResult.status === 0 ? checkResult.stdout?.toString().trim() : '';
80
- if (existingHooksPath && existingHooksPath !== target) {
80
+ if (existingHooksPath &&
81
+ existingHooksPath !== target &&
82
+ existingHooksPath !== '.husky' &&
83
+ !existingHooksPath.startsWith('.husky/')) {
81
84
  return {
82
85
  message: `core.hooksPath is already set to "${existingHooksPath}", skipping`,
83
86
  isError: false,
@@ -1,6 +1,6 @@
1
1
  import { t as __commonJSMin } from "./chunk-CgnkrU7a.js";
2
2
  import { o as DEFAULT_ENVS, u as resolve$1 } from "./json-BRdVJ52a.js";
3
- import { n as accent } from "./help-BAGHa8fD.js";
3
+ import { n as accent } from "./help-CbTzUdXc.js";
4
4
  import path from "node:path";
5
5
  import { stripVTControlCharacters } from "node:util";
6
6
  import color from "picocolors";
@@ -1,7 +1,7 @@
1
- import { A as select, C as cancel, E as log, N as Ct, O as note, _ as pkgRoot, c as defaultInteractive, d as promptGitHooks, i as getAgentById, n as detectAgents } from "./agent-CpNB3GIY.js";
1
+ import { A as select, C as cancel, E as log, N as Ct, O as note, _ as pkgRoot, c as defaultInteractive, d as promptGitHooks, i as getAgentById, n as detectAgents } from "./agent-CA64n2mH.js";
2
2
  import { t as lib_default } from "./lib-DxappLRQ.js";
3
3
  import { i as writeJsonFile, r as readJsonFile, s as VITE_PLUS_NAME } from "./json-BRdVJ52a.js";
4
- import { r as log$1, t as renderCliDoc } from "./help-BAGHa8fD.js";
4
+ import { i as log$1, t as renderCliDoc } from "./help-CbTzUdXc.js";
5
5
  import { dirname, join, relative } from "node:path";
6
6
  import { existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, readlinkSync, realpathSync, rmSync, symlinkSync, writeFileSync } from "node:fs";
7
7
  import { vitePlusHeader } from "../../binding/index.js";
@@ -327,7 +327,7 @@ function install(dir = ".vite-hooks") {
327
327
  "core.hooksPath"
328
328
  ]);
329
329
  const existingHooksPath = checkResult.status === 0 ? checkResult.stdout?.toString().trim() : "";
330
- if (existingHooksPath && existingHooksPath !== target) return {
330
+ if (existingHooksPath && existingHooksPath !== target && existingHooksPath !== ".husky" && !existingHooksPath.startsWith(".husky/")) return {
331
331
  message: `core.hooksPath is already set to "${existingHooksPath}", skipping`,
332
332
  isError: false
333
333
  };
@@ -366,6 +366,7 @@ async function main() {
366
366
  const helpMessage = renderCliDoc({
367
367
  usage: "vp config [OPTIONS]",
368
368
  summary: "Configure Vite+ for the current project (hooks + agent integration).",
369
+ documentationUrl: "https://viteplus.dev/guide/commit-hooks",
369
370
  sections: [{
370
371
  title: "Options",
371
372
  rows: [{
@@ -1,11 +1,11 @@
1
1
  import { i as __toESM, t as __commonJSMin } from "./chunk-CgnkrU7a.js";
2
- import { A as select, C as cancel, D as multiselect, E as log, M as text, N as Ct, S as PackageManager, T as intro, a as selectAgentTargetPaths, c as defaultInteractive, d as promptGitHooks, f as runViteFmt, g as displayRelative, j as spinner, l as downloadPackageManager$1, m as selectPackageManager, o as writeAgentInstructions, p as runViteInstall, r as detectExistingAgentTargetPaths, w as confirm, x as DependencyType, y as templatesDir } from "./agent-CpNB3GIY.js";
2
+ import { A as select, C as cancel, D as multiselect, E as log, M as text, N as Ct, S as PackageManager, T as intro, a as selectAgentTargetPaths, c as defaultInteractive, d as promptGitHooks, f as runViteFmt, g as displayRelative, j as spinner, l as downloadPackageManager$1, m as selectPackageManager, o as writeAgentInstructions, p as runViteInstall, r as detectExistingAgentTargetPaths, w as confirm, x as DependencyType, y as templatesDir } from "./agent-CA64n2mH.js";
3
3
  import { t as lib_default } from "./lib-DxappLRQ.js";
4
- import { _ as rewriteMonorepo, a as detectExistingEditor, f as installGitHooks, n as updatePackageJsonWithDeps, o as selectEditor, r as updateWorkspaceConfig, s as writeEditorConfigs, t as detectWorkspace$1, v as rewriteMonorepoProject, y as rewriteStandaloneProject } from "./workspace-CiqQdO1L.js";
4
+ import { _ as rewriteMonorepo, a as detectExistingEditor, f as installGitHooks, n as updatePackageJsonWithDeps, o as selectEditor, r as updateWorkspaceConfig, s as writeEditorConfigs, t as detectWorkspace$1, v as rewriteMonorepoProject, y as rewriteStandaloneProject } from "./workspace-CpFQmwjZ.js";
5
5
  import "./browser-CBapUTD0.js";
6
6
  import { r as readJsonFile, t as editJsonFile } from "./json-BRdVJ52a.js";
7
7
  import "./package-YAMvX5PJ.js";
8
- import { a as success, i as muted, n as accent, r as log$1, t as renderCliDoc } from "./help-BAGHa8fD.js";
8
+ import { a as muted, i as log$1, n as accent, o as success, t as renderCliDoc } from "./help-CbTzUdXc.js";
9
9
  import path from "node:path";
10
10
  import { styleText } from "node:util";
11
11
  import color from "picocolors";
@@ -253,6 +253,27 @@ function inferParentDir(templateName, workspaceInfo) {
253
253
  for (const parentDir of workspaceInfo.parentDirs) if (rule.test(parentDir)) return parentDir;
254
254
  }
255
255
  //#endregion
256
+ //#region src/create/initial-template-options.ts
257
+ function getInitialTemplateOptions(isMonorepo) {
258
+ return [
259
+ ...!isMonorepo ? [{
260
+ label: "Vite+ Monorepo",
261
+ value: BuiltinTemplate.monorepo,
262
+ hint: "Create a new Vite+ monorepo project"
263
+ }] : [],
264
+ {
265
+ label: "Vite+ Application",
266
+ value: BuiltinTemplate.application,
267
+ hint: "Create vite applications"
268
+ },
269
+ {
270
+ label: "Vite+ Library",
271
+ value: BuiltinTemplate.library,
272
+ hint: "Create vite libraries"
273
+ }
274
+ ];
275
+ }
276
+ //#endregion
256
277
  //#region ../../node_modules/.pnpm/validate-npm-package-name@7.0.2/node_modules/validate-npm-package-name/lib/builtin-modules.json
257
278
  var require_builtin_modules = /* @__PURE__ */ __commonJSMin(((exports, module) => {
258
279
  module.exports = [
@@ -3592,6 +3613,7 @@ function getScopeFromPackageName(packageName) {
3592
3613
  const helpMessage = renderCliDoc({
3593
3614
  usage: "vp create [TEMPLATE] [OPTIONS] [-- TEMPLATE_OPTIONS]",
3594
3615
  summary: "Use any builtin, local or remote template with Vite+.",
3616
+ documentationUrl: "https://viteplus.dev/guide/create",
3595
3617
  sections: [
3596
3618
  {
3597
3619
  title: "Arguments",
@@ -3682,6 +3704,7 @@ const helpMessage = renderCliDoc({
3682
3704
  const listTemplatesMessage = renderCliDoc({
3683
3705
  usage: "vp create --list",
3684
3706
  summary: "List available builtin and popular project templates.",
3707
+ documentationUrl: "https://viteplus.dev/guide/create",
3685
3708
  sections: [
3686
3709
  {
3687
3710
  title: "Vite+ Built-in Templates",
@@ -3700,7 +3723,7 @@ const listTemplatesMessage = renderCliDoc({
3700
3723
  },
3701
3724
  {
3702
3725
  label: "vite:generator",
3703
- description: "Scaffold a new code generator"
3726
+ description: "Scaffold a new code generator (monorepo only)"
3704
3727
  }
3705
3728
  ]
3706
3729
  },
@@ -3889,61 +3912,12 @@ Use \`vp create --list\` to list all available templates, or run \`vp create --h
3889
3912
  let remoteTargetDir;
3890
3913
  let shouldSetupHooks = false;
3891
3914
  if (!selectedTemplateName) {
3892
- const templates = [];
3893
- if (isMonorepo) {
3894
- for (const pkg of workspaceInfoOptional.packages) if (pkg.isTemplatePackage) templates.push({
3895
- label: pkg.name,
3896
- value: pkg.name,
3897
- hint: pkg.description ?? pkg.path
3898
- });
3899
- } else templates.push({
3900
- label: "Vite+ Monorepo",
3901
- value: BuiltinTemplate.monorepo,
3902
- hint: "Create a new Vite+ monorepo project"
3903
- });
3904
3915
  const template = await select({
3905
3916
  message: "",
3906
- options: [
3907
- ...templates,
3908
- {
3909
- label: "Vite+ Application",
3910
- value: BuiltinTemplate.application,
3911
- hint: "Create vite applications"
3912
- },
3913
- {
3914
- label: "Vite+ Library",
3915
- value: BuiltinTemplate.library,
3916
- hint: "Create vite libraries"
3917
- },
3918
- ...isMonorepo ? [{
3919
- label: "Vite+ Generator",
3920
- value: BuiltinTemplate.generator,
3921
- hint: "Scaffold a new code generator"
3922
- }] : [],
3923
- {
3924
- label: "TanStack Start",
3925
- value: "@tanstack/create-start@latest",
3926
- hint: "Create TanStack applications and libraries"
3927
- },
3928
- {
3929
- label: "Others",
3930
- value: "other",
3931
- hint: "Enter a custom template package name"
3932
- }
3933
- ]
3917
+ options: getInitialTemplateOptions(isMonorepo)
3934
3918
  });
3935
3919
  if (Ct(template)) cancelAndExit();
3936
- if (template === "other") {
3937
- const customTemplate = await text({
3938
- message: "Enter the template package name:",
3939
- placeholder: "e.g., create-next-app, create-nuxt",
3940
- validate: (value) => {
3941
- if (!value || value.trim().length === 0) return "Template name is required";
3942
- }
3943
- });
3944
- if (Ct(customTemplate)) cancelAndExit();
3945
- selectedTemplateName = customTemplate;
3946
- } else selectedTemplateName = template;
3920
+ selectedTemplateName = template;
3947
3921
  }
3948
3922
  const isBuiltinTemplate = selectedTemplateName.startsWith("vite:");
3949
3923
  if (!isBuiltinTemplate) compactOutput = false;
@@ -3952,6 +3926,10 @@ Use \`vp create --list\` to list all available templates, or run \`vp create --h
3952
3926
  log.info("You are already in a monorepo workspace.\nUse a different template or run this command outside the monorepo");
3953
3927
  cancelAndExit("Cannot create a monorepo inside an existing monorepo", 1);
3954
3928
  }
3929
+ if (selectedTemplateName === BuiltinTemplate.generator && !isMonorepo) {
3930
+ log.info("The vite:generator template requires a monorepo workspace.\nRun this command inside a Vite+ monorepo, or create one first with `vp create vite:monorepo`");
3931
+ cancelAndExit("Cannot create a generator outside a monorepo", 1);
3932
+ }
3955
3933
  if (isInSubdirectory && !compactOutput) log.info(`Detected monorepo root at ${accent(workspaceInfoOptional.rootDir)}`);
3956
3934
  if (isMonorepo && options.interactive && !targetDir) {
3957
3935
  let parentDir;
@@ -12,6 +12,9 @@ function muted(text) {
12
12
  function success(text) {
13
13
  return styleText("green", text);
14
14
  }
15
+ function errorMsg(msg) {
16
+ console.error(styleText(["red", "bold"], "error:"), msg);
17
+ }
15
18
  //#endregion
16
19
  //#region src/utils/help.ts
17
20
  function toLines(value) {
@@ -42,7 +45,8 @@ function renderRows(rows) {
42
45
  return output;
43
46
  }
44
47
  function heading(label, color) {
45
- return color ? styleText("bold", `${label}:`) : `${label}:`;
48
+ if (!color) return `${label}:`;
49
+ return label === "Usage" ? styleText("bold", `${label}:`) : styleText(["blue", "bold"], `${label}:`);
46
50
  }
47
51
  function renderCliDoc(doc, options = {}) {
48
52
  const color = options.color ?? true;
@@ -63,8 +67,12 @@ function renderCliDoc(doc, options = {}) {
63
67
  if (lines.length > 0) output.push(...lines);
64
68
  if (section.rows && section.rows.length > 0) output.push(...renderRows(section.rows));
65
69
  }
70
+ if (doc.documentationUrl) {
71
+ if (output.length > 0) output.push("");
72
+ output.push(`${heading("Documentation", color)} ${doc.documentationUrl}`);
73
+ }
66
74
  output.push("");
67
75
  return output.join("\n");
68
76
  }
69
77
  //#endregion
70
- export { success as a, muted as i, accent as n, log as r, renderCliDoc as t };
78
+ export { muted as a, log as i, accent as n, success as o, errorMsg as r, renderCliDoc as t };
@@ -1,11 +1,11 @@
1
1
  import { i as __toESM } from "./chunk-CgnkrU7a.js";
2
- import { A as select, E as log, N as Ct, S as PackageManager, a as selectAgentTargetPaths, c as defaultInteractive, d as promptGitHooks, g as displayRelative, h as upgradeYarn, j as spinner, k as outro, l as downloadPackageManager$1, m as selectPackageManager, o as writeAgentInstructions, p as runViteInstall, s as cancelAndExit, t as detectAgentConflicts, w as confirm } from "./agent-CpNB3GIY.js";
2
+ import { A as select, E as log, N as Ct, S as PackageManager, a as selectAgentTargetPaths, c as defaultInteractive, d as promptGitHooks, g as displayRelative, h as upgradeYarn, j as spinner, k as outro, l as downloadPackageManager$1, m as selectPackageManager, o as writeAgentInstructions, p as runViteInstall, s as cancelAndExit, t as detectAgentConflicts, w as confirm } from "./agent-CA64n2mH.js";
3
3
  import { t as lib_default } from "./lib-DxappLRQ.js";
4
- import { _ as rewriteMonorepo, b as createMigrationReport, c as checkViteVersion, d as detectPrettierProject, f as installGitHooks, g as preflightGitHooksSetup, h as migratePrettierToOxfmt, i as detectEditorConflicts, l as checkVitestVersion, m as migrateEslintToOxlint, o as selectEditor, p as mergeViteConfigFiles, s as writeEditorConfigs, t as detectWorkspace$1, u as detectEslintProject, x as require_semver, y as rewriteStandaloneProject } from "./workspace-CiqQdO1L.js";
4
+ import { _ as rewriteMonorepo, b as createMigrationReport, c as checkViteVersion, d as detectPrettierProject, f as installGitHooks, g as preflightGitHooksSetup, h as migratePrettierToOxfmt, i as detectEditorConflicts, l as checkVitestVersion, m as migrateEslintToOxlint, o as selectEditor, p as mergeViteConfigFiles, s as writeEditorConfigs, t as detectWorkspace$1, u as detectEslintProject, x as require_semver, y as rewriteStandaloneProject } from "./workspace-CpFQmwjZ.js";
5
5
  import "./browser-CBapUTD0.js";
6
6
  import "./json-BRdVJ52a.js";
7
7
  import { i as readNearestPackageJson, r as hasVitePlusDependency } from "./package-YAMvX5PJ.js";
8
- import { i as muted, n as accent, r as log$1, t as renderCliDoc } from "./help-BAGHa8fD.js";
8
+ import { a as muted, i as log$1, n as accent, t as renderCliDoc } from "./help-CbTzUdXc.js";
9
9
  import path from "node:path";
10
10
  import { styleText } from "node:util";
11
11
  import { vitePlusHeader } from "../../binding/index.js";
@@ -72,6 +72,7 @@ async function promptPrettierMigration(projectPath, interactive, packages) {
72
72
  const helpMessage = renderCliDoc({
73
73
  usage: "vp migrate [PATH] [OPTIONS]",
74
74
  summary: "Migrate standalone Vite, Vitest, Oxlint, Oxfmt, and Prettier projects to unified Vite+.",
75
+ documentationUrl: "https://viteplus.dev/guide/migrate",
75
76
  sections: [
76
77
  {
77
78
  title: "Arguments",
@@ -129,6 +130,46 @@ const helpMessage = renderCliDoc({
129
130
  ` ${muted("# Non-interactive mode")}`,
130
131
  ` ${accent("vp migrate --no-interactive")}`
131
132
  ]
133
+ },
134
+ {
135
+ title: "Migration Prompt",
136
+ lines: [
137
+ " Give this to a coding agent when you want it to drive the migration:",
138
+ "",
139
+ " Migrate this project to Vite+.",
140
+ " Vite+ replaces the current split tooling around runtime management, package",
141
+ " management, dev/build/test commands, linting, formatting, and packaging.",
142
+ " Run `vp help` and `vp help migrate` before making changes.",
143
+ ` Use ${accent("vp migrate --no-interactive")} in the workspace root.`,
144
+ " Make sure the project is using Vite 8+ and Vitest 4.1+ before migrating.",
145
+ "",
146
+ " After the migration:",
147
+ " - Confirm `vite` imports were rewritten to `vite-plus` where needed",
148
+ " - Confirm `vitest` imports were rewritten to `vite-plus/test` where needed",
149
+ " - Remove old `vite` and `vitest` dependencies only after those rewrites",
150
+ " are confirmed",
151
+ " - Move remaining tool-specific config into the appropriate blocks in",
152
+ " `vite.config.ts`",
153
+ "",
154
+ " Command mapping:",
155
+ " - `vp run <script>` is the equivalent of `pnpm run <script>`",
156
+ " - `vp test` runs the built-in test command, while `vp run test` runs the",
157
+ " `test` script from `package.json`",
158
+ " - `vp install`, `vp add`, and `vp remove` delegate through the package",
159
+ " manager declared by `packageManager`",
160
+ " - `vp dev`, `vp build`, `vp preview`, `vp lint`, `vp fmt`, `vp check`,",
161
+ " and `vp pack` replace the corresponding standalone tools",
162
+ " - Prefer `vp check` for validation loops",
163
+ "",
164
+ " Finally, verify the migration by running:",
165
+ ` - ${accent("vp install")}`,
166
+ ` - ${accent("vp check")}`,
167
+ ` - ${accent("vp test")}`,
168
+ ` - ${accent("vp build")}`,
169
+ "",
170
+ " Summarize the migration at the end and report any manual follow-up still",
171
+ " required."
172
+ ]
132
173
  }
133
174
  ]
134
175
  });
@@ -1,6 +1,6 @@
1
1
  import { i as __toESM, r as __require, t as __commonJSMin } from "./chunk-CgnkrU7a.js";
2
2
  import { t as lib_default } from "./lib-DxappLRQ.js";
3
- import { r as log, t as renderCliDoc } from "./help-BAGHa8fD.js";
3
+ import { i as log, r as errorMsg, t as renderCliDoc } from "./help-CbTzUdXc.js";
4
4
  import path, { delimiter, dirname, normalize, resolve } from "node:path";
5
5
  import { formatWithOptions, inspect, promisify } from "node:util";
6
6
  import { cwd } from "node:process";
@@ -8157,6 +8157,7 @@ if (args.help) {
8157
8157
  const helpMessage = renderCliDoc({
8158
8158
  usage: "vp staged [options]",
8159
8159
  summary: "Run linters on staged files using staged config from vite.config.ts.",
8160
+ documentationUrl: "https://viteplus.dev/guide/commit-hooks",
8160
8161
  sections: [{
8161
8162
  title: "Options",
8162
8163
  rows: [
@@ -8251,7 +8252,8 @@ if (args.help) {
8251
8252
  }
8252
8253
  if (stagedConfig) options.config = stagedConfig;
8253
8254
  else {
8254
- log("No \"staged\" config found in vite.config.ts. Please add a staged config:");
8255
+ log(vitePlusHeader() + "\n");
8256
+ errorMsg("No \"staged\" config found in vite.config.ts. Please add a staged config:");
8255
8257
  log("");
8256
8258
  log(" // vite.config.ts");
8257
8259
  log(" export default defineConfig({");
@@ -1,6 +1,6 @@
1
1
  import { s as VITE_PLUS_NAME } from "./json-BRdVJ52a.js";
2
2
  import { r as hasVitePlusDependency, t as detectPackageMetadata } from "./package-YAMvX5PJ.js";
3
- import { n as accent, r as log, t as renderCliDoc } from "./help-BAGHa8fD.js";
3
+ import { i as log, n as accent, t as renderCliDoc } from "./help-CbTzUdXc.js";
4
4
  import path from "node:path";
5
5
  import fs from "node:fs";
6
6
  import { vitePlusHeader } from "../../binding/index.js";
@@ -1,5 +1,5 @@
1
1
  import { i as __toESM, t as __commonJSMin } from "./chunk-CgnkrU7a.js";
2
- import { A as select, E as log, N as Ct, S as PackageManager, b as runCommandSilently, g as displayRelative, u as getSpinner, v as rulesDir } from "./agent-CpNB3GIY.js";
2
+ import { A as select, E as log, N as Ct, S as PackageManager, b as runCommandSilently, g as displayRelative, u as getSpinner, v as rulesDir } from "./agent-CA64n2mH.js";
3
3
  import { _ as YAMLMap, g as YAMLSeq, i as parseDocument, n as parse, y as Scalar } from "./browser-CBapUTD0.js";
4
4
  import { a as BASEURL_TSCONFIG_WARNING, c as VITE_PLUS_OVERRIDE_PACKAGES, i as writeJsonFile, l as VITE_PLUS_VERSION, n as isJsonFile, r as readJsonFile, s as VITE_PLUS_NAME, t as editJsonFile } from "./json-BRdVJ52a.js";
5
5
  import { n as getScopeFromPackageName, t as detectPackageMetadata } from "./package-YAMvX5PJ.js";
@@ -1911,6 +1911,7 @@ function rewriteStandaloneProject(projectPath, workspaceInfo, skipStagedMigratio
1911
1911
  }
1912
1912
  if (!skipStagedMigration) rewriteLintStagedConfigFile(projectPath, report);
1913
1913
  mergeViteConfigFiles(projectPath, silent, report);
1914
+ injectLintTypeCheckDefaults(projectPath, silent, report);
1914
1915
  mergeTsdownConfigFile(projectPath, silent, report);
1915
1916
  rewriteAllImports(projectPath, silent, report);
1916
1917
  setPackageManager(projectPath, workspaceInfo.downloadPackageManager);
@@ -1926,6 +1927,7 @@ function rewriteMonorepo(workspaceInfo, skipStagedMigration, silent = false, rep
1926
1927
  for (const pkg of workspaceInfo.packages) rewriteMonorepoProject(path.join(workspaceInfo.rootDir, pkg.path), workspaceInfo.packageManager, skipStagedMigration, silent, report);
1927
1928
  if (!skipStagedMigration) rewriteLintStagedConfigFile(workspaceInfo.rootDir, report);
1928
1929
  mergeViteConfigFiles(workspaceInfo.rootDir, silent, report);
1930
+ injectLintTypeCheckDefaults(workspaceInfo.rootDir, silent, report);
1929
1931
  mergeTsdownConfigFile(workspaceInfo.rootDir, silent, report);
1930
1932
  rewriteAllImports(workspaceInfo.rootDir, silent, report);
1931
1933
  setPackageManager(workspaceInfo.rootDir, workspaceInfo.downloadPackageManager);
@@ -2211,6 +2213,36 @@ function mergeViteConfigFiles(projectPath, silent = false, report) {
2211
2213
  }
2212
2214
  if (configs.oxfmtConfig) mergeAndRemoveJsonConfig(projectPath, viteConfig, configs.oxfmtConfig, "fmt", silent, report);
2213
2215
  }
2216
+ /**
2217
+ * Inject typeAware and typeCheck defaults into vite.config.ts lint config.
2218
+ * Called after mergeViteConfigFiles() to handle the case where no .oxlintrc.json exists
2219
+ * (e.g., newly created projects from create-vite templates).
2220
+ */
2221
+ function injectLintTypeCheckDefaults(projectPath, silent = false, report) {
2222
+ if (hasBaseUrlInTsconfig(projectPath)) return;
2223
+ injectConfigDefaults(projectPath, "lint", ".vite-plus-lint-init.oxlintrc.json", JSON.stringify({ options: {
2224
+ typeAware: true,
2225
+ typeCheck: true
2226
+ } }), silent, report);
2227
+ }
2228
+ function injectConfigDefaults(projectPath, configKey, tempFileName, tempFileContent, silent, report) {
2229
+ const configs = detectConfigs(projectPath);
2230
+ if (configs.viteConfig) {
2231
+ const content = fs.readFileSync(path.join(projectPath, configs.viteConfig), "utf8");
2232
+ if (new RegExp(`\\b${configKey}\\s*:`).test(content)) return;
2233
+ }
2234
+ const viteConfig = ensureViteConfig(projectPath, configs, silent, report);
2235
+ const tempConfigPath = path.join(projectPath, tempFileName);
2236
+ fs.writeFileSync(tempConfigPath, tempFileContent);
2237
+ const fullViteConfigPath = path.join(projectPath, viteConfig);
2238
+ let result;
2239
+ try {
2240
+ result = mergeJsonConfig(fullViteConfigPath, tempConfigPath, configKey);
2241
+ } finally {
2242
+ fs.rmSync(tempConfigPath, { force: true });
2243
+ }
2244
+ if (result.updated) fs.writeFileSync(fullViteConfigPath, result.content);
2245
+ }
2214
2246
  function mergeAndRemoveJsonConfig(projectPath, viteConfigPath, jsonConfigPath, configKey, silent = false, report) {
2215
2247
  const fullViteConfigPath = path.join(projectPath, viteConfigPath);
2216
2248
  const fullJsonConfigPath = path.join(projectPath, jsonConfigPath);
@@ -2577,7 +2609,7 @@ const VSCODE_SETTINGS = {
2577
2609
  "editor.formatOnSaveMode": "file",
2578
2610
  "editor.codeActionsOnSave": { "source.fixAll.oxc": "explicit" }
2579
2611
  };
2580
- const VSCODE_EXTENSIONS = { recommendations: ["oxc.oxc-vscode"] };
2612
+ const VSCODE_EXTENSIONS = { recommendations: ["VoidZero.vite-plus-extension-pack"] };
2581
2613
  const EDITORS = [{
2582
2614
  id: "vscode",
2583
2615
  label: "VSCode",
@@ -110,7 +110,7 @@ async function vpFmt(cwd, filePath) {
110
110
  },
111
111
  });
112
112
  if (result.exitCode !== 0) {
113
- throw new Error(`Failed to format ${filePath} with vp fmt:\n${result.stdout.toString()}${result.stderr.toString()}`);
113
+ warnMsg(`Failed to format ${filePath} with vp fmt:\n${result.stdout.toString()}${result.stderr.toString()}`);
114
114
  }
115
115
  }
116
116
  function resolveInitSpec(command, args) {
@@ -1,10 +1,8 @@
1
1
  export type Task = {
2
2
  /**
3
3
  * The command to run for the task.
4
- *
5
- * If omitted, the script from `package.json` with the same name will be used
6
4
  */
7
- command?: string;
5
+ command: string;
8
6
  /**
9
7
  * The working directory for the task, relative to the package root (not workspace root).
10
8
  */
@@ -21,11 +19,11 @@ export type Task = {
21
19
  /**
22
20
  * Environment variable names to be fingerprinted and passed to the task.
23
21
  */
24
- envs?: Array<string>;
22
+ env?: Array<string>;
25
23
  /**
26
24
  * Environment variable names to be passed to the task without fingerprinting.
27
25
  */
28
- passThroughEnvs?: Array<string>;
26
+ untrackedEnv?: Array<string>;
29
27
  /**
30
28
  * Files to include in the cache fingerprint.
31
29
  *
@@ -37,7 +35,7 @@ export type Task = {
37
35
  *
38
36
  * Patterns are relative to the package directory.
39
37
  */
40
- inputs?: Array<string | {
38
+ input?: Array<string | {
41
39
  /**
42
40
  * Automatically track which files the task reads
43
41
  */
@@ -13,7 +13,7 @@ import mri from 'mri';
13
13
  import { vitePlusHeader } from '../../binding/index.js';
14
14
  import { resolveViteConfig } from '../resolve-vite-config.js';
15
15
  import { renderCliDoc } from '../utils/help.js';
16
- import { log } from '../utils/terminal.js';
16
+ import { errorMsg, log } from '../utils/terminal.js';
17
17
  const args = mri(process.argv.slice(3), {
18
18
  alias: {
19
19
  h: 'help',
@@ -43,6 +43,7 @@ if (args.help) {
43
43
  const helpMessage = renderCliDoc({
44
44
  usage: 'vp staged [options]',
45
45
  summary: 'Run linters on staged files using staged config from vite.config.ts.',
46
+ documentationUrl: 'https://viteplus.dev/guide/commit-hooks',
46
47
  sections: [
47
48
  {
48
49
  title: 'Options',
@@ -147,7 +148,8 @@ else {
147
148
  options.config = stagedConfig;
148
149
  }
149
150
  else {
150
- log('No "staged" config found in vite.config.ts. Please add a staged config:');
151
+ log(vitePlusHeader() + '\n');
152
+ errorMsg('No "staged" config found in vite.config.ts. Please add a staged config:');
151
153
  log('');
152
154
  log(' // vite.config.ts');
153
155
  log(' export default defineConfig({');
@@ -14,7 +14,7 @@ const VSCODE_SETTINGS = {
14
14
  },
15
15
  };
16
16
  const VSCODE_EXTENSIONS = {
17
- recommendations: ['oxc.oxc-vscode'],
17
+ recommendations: ['VoidZero.vite-plus-extension-pack'],
18
18
  };
19
19
  export const EDITORS = [
20
20
  {
@@ -2,6 +2,7 @@ export type CliDoc = {
2
2
  usage?: string;
3
3
  summary?: readonly string[] | string;
4
4
  sections: readonly CliSection[];
5
+ documentationUrl?: string;
5
6
  };
6
7
  export type CliSection = {
7
8
  title: string;
@@ -33,7 +33,12 @@ function renderRows(rows) {
33
33
  return output;
34
34
  }
35
35
  function heading(label, color) {
36
- return color ? styleText('bold', `${label}:`) : `${label}:`;
36
+ if (!color) {
37
+ return `${label}:`;
38
+ }
39
+ return label === 'Usage'
40
+ ? styleText('bold', `${label}:`)
41
+ : styleText(['blue', 'bold'], `${label}:`);
37
42
  }
38
43
  export function renderCliDoc(doc, options = {}) {
39
44
  const color = options.color ?? true;
@@ -62,6 +67,12 @@ export function renderCliDoc(doc, options = {}) {
62
67
  output.push(...renderRows(section.rows));
63
68
  }
64
69
  }
70
+ if (doc.documentationUrl) {
71
+ if (output.length > 0) {
72
+ output.push('');
73
+ }
74
+ output.push(`${heading('Documentation', color)} ${doc.documentationUrl}`);
75
+ }
65
76
  output.push('');
66
77
  return output.join('\n');
67
78
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "vite-plus",
3
- "version": "0.1.6",
3
+ "version": "0.1.8",
4
4
  "license": "MIT",
5
5
  "bin": {
6
6
  "oxfmt": "./bin/oxfmt",
@@ -120,8 +120,8 @@
120
120
  },
121
121
  "./test/config": {
122
122
  "types": "./dist/test/config.d.ts",
123
- "require": "./dist/test/config.cjs",
124
- "default": "./dist/test/config.js"
123
+ "default": "./dist/test/config.js",
124
+ "require": "./dist/test/config.cjs"
125
125
  },
126
126
  "./test/coverage": {
127
127
  "types": "./dist/test/coverage.d.ts",
@@ -297,12 +297,12 @@
297
297
  "@oxc-project/types": "=0.115.0",
298
298
  "cac": "^6.7.14",
299
299
  "cross-spawn": "^7.0.5",
300
- "oxfmt": "^0.36.0",
301
- "oxlint": "^1.51.0",
302
- "oxlint-tsgolint": "^0.16.0",
300
+ "oxfmt": "=0.39.0",
301
+ "oxlint": "=1.54.0",
302
+ "oxlint-tsgolint": "=0.16.0",
303
303
  "picocolors": "^1.1.1",
304
- "@voidzero-dev/vite-plus-core": "0.1.6",
305
- "@voidzero-dev/vite-plus-test": "0.1.6"
304
+ "@voidzero-dev/vite-plus-core": "0.1.8",
305
+ "@voidzero-dev/vite-plus-test": "0.1.8"
306
306
  },
307
307
  "devDependencies": {
308
308
  "@napi-rs/cli": "^3.4.1",
@@ -320,12 +320,12 @@
320
320
  "mri": "^1.2.0",
321
321
  "rolldown-plugin-dts": "^0.22.0",
322
322
  "semver": "^7.7.3",
323
- "tsdown": "^0.21.1",
323
+ "tsdown": "^0.21.2",
324
324
  "validate-npm-package-name": "^7.0.2",
325
325
  "yaml": "^2.8.1",
326
326
  "@voidzero-dev/vite-plus-prompts": "0.0.0",
327
- "rolldown": "1.0.0-rc.8",
328
- "vite": "npm:@voidzero-dev/vite-plus-core@0.1.6"
327
+ "rolldown": "1.0.0-rc.9",
328
+ "vite": "npm:@voidzero-dev/vite-plus-core@0.1.8"
329
329
  },
330
330
  "napi": {
331
331
  "binaryName": "vite-plus",
@@ -343,12 +343,12 @@
343
343
  "node": "^20.19.0 || >=22.12.0"
344
344
  },
345
345
  "optionalDependencies": {
346
- "@voidzero-dev/vite-plus-darwin-arm64": "0.1.6",
347
- "@voidzero-dev/vite-plus-darwin-x64": "0.1.6",
348
- "@voidzero-dev/vite-plus-linux-arm64-gnu": "0.1.6",
349
- "@voidzero-dev/vite-plus-linux-x64-gnu": "0.1.6",
350
- "@voidzero-dev/vite-plus-win32-x64-msvc": "0.1.6",
351
- "@voidzero-dev/vite-plus-win32-arm64-msvc": "0.1.6"
346
+ "@voidzero-dev/vite-plus-darwin-arm64": "0.1.8",
347
+ "@voidzero-dev/vite-plus-darwin-x64": "0.1.8",
348
+ "@voidzero-dev/vite-plus-linux-arm64-gnu": "0.1.8",
349
+ "@voidzero-dev/vite-plus-linux-x64-gnu": "0.1.8",
350
+ "@voidzero-dev/vite-plus-win32-x64-msvc": "0.1.8",
351
+ "@voidzero-dev/vite-plus-win32-arm64-msvc": "0.1.8"
352
352
  },
353
353
  "scripts": {
354
354
  "build": "oxnode -C dev ./build.ts",