@quiteer/vite 0.0.2 → 0.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/client.d.ts ADDED
@@ -0,0 +1,29 @@
1
+ // This file is an augmentation to the built-in ImportMeta interface
2
+ // Thus cannot contain any top-level imports
3
+ // <https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation>
4
+
5
+ // This is tested in `packages/vite/src/node/__tests_dts__/typeOptions.ts`
6
+ interface ViteTypeOptions {
7
+ // strictImportMetaEnv: unknown
8
+ }
9
+
10
+ type ImportMetaEnvFallbackKey
11
+ = 'strictImportMetaEnv' extends keyof ViteTypeOptions ? never : string
12
+
13
+ interface ImportMetaEnv extends Record<ImportMetaEnvFallbackKey, any> {
14
+ BASE_URL: string
15
+ MODE: string
16
+ DEV: boolean
17
+ PROD: boolean
18
+ SSR: boolean
19
+ }
20
+
21
+ interface ImportMeta {
22
+ url: string
23
+
24
+ readonly hot?: import('./hot.js').ViteHotContext
25
+
26
+ readonly env: ImportMetaEnv
27
+
28
+ glob: import('./importGlob.js').ImportGlobFunction
29
+ }
@@ -12,7 +12,7 @@ import { pathExists } from "fs-extra";
12
12
  import { getPortPromise } from "portfinder";
13
13
 
14
14
  //#region package.json
15
- var version = "0.0.2";
15
+ var version = "0.0.3";
16
16
 
17
17
  //#endregion
18
18
  //#region src/defaults.ts
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@quiteer/vite",
3
3
  "type": "module",
4
- "version": "0.0.2",
4
+ "version": "0.0.3",
5
5
  "description": "在 vite 的基础上增强的前端架构 cli",
6
6
  "author": "quiteer",
7
7
  "license": "ISC",
@@ -15,6 +15,9 @@
15
15
  "types": "./dist/index.d.mts",
16
16
  "import": "./dist/index.mjs",
17
17
  "require": "./dist/index.mjs"
18
+ },
19
+ "./client": {
20
+ "types": "./client.d.ts"
18
21
  }
19
22
  },
20
23
  "main": "./dist/index.mjs",
@@ -22,6 +25,9 @@
22
25
  "types": "./dist/index.d.mts",
23
26
  "typesVersions": {
24
27
  "*": {
28
+ "client": [
29
+ "./client.d.ts"
30
+ ],
25
31
  "*": [
26
32
  "./src/*"
27
33
  ]
@@ -30,6 +36,10 @@
30
36
  "bin": {
31
37
  "qvite": "./dist/bin/qvite.mjs"
32
38
  },
39
+ "files": [
40
+ "client.d.ts",
41
+ "dist"
42
+ ],
33
43
  "publishConfig": {
34
44
  "access": "public",
35
45
  "registry": "https://registry.npmjs.org/"
@@ -47,8 +57,8 @@
47
57
  "vite": "npm:rolldown-vite@7.2.2",
48
58
  "zx": "^8.8.5",
49
59
  "@quiteer/is": "0.0.2",
50
- "@quiteer/utils": "0.0.2",
51
- "@quiteer/vite-plugins": "^0.0.2"
60
+ "@quiteer/vite-plugins": "^0.0.2",
61
+ "@quiteer/utils": "0.0.2"
52
62
  },
53
63
  "devDependencies": {},
54
64
  "scripts": {
package/cli.ts DELETED
@@ -1,62 +0,0 @@
1
- #!/usr/bin/env node
2
- import { cac } from 'cac'
3
- import { version } from './package.json'
4
-
5
- import { build } from './src/build'
6
- import { getConfig } from './src/getConfig'
7
- import { store } from './src/store'
8
- import { watch } from './src/watch'
9
-
10
- interface Options {
11
- minify: boolean
12
- }
13
-
14
- interface DevOptions extends Options {
15
- mode: string
16
- port: number
17
- }
18
-
19
- interface BuildOptions extends Options {
20
- mode: string
21
- }
22
-
23
- const cli = cac('qvite')
24
-
25
- cli.option('--minify', '使代码进行压缩 ', { default: false })
26
-
27
- cli
28
- .command('[config-file]', 'qvite dev ,启动开发环境热更新') // default command
29
- .alias('dev')
30
- .option('-m , --mode <mode>', '[development | production | test | staging | ...] 环境模式 ', { default: 'development' })
31
- .option('-p , --port <port>', '[number] 渲染进程的端口号 ,如果占用会切换非占用的端口 ', { default: 8090 })
32
- .action(async (configFile: string = 'qvite.config.ts', options: DevOptions) => {
33
- const { mode, port, minify } = options
34
-
35
- store.set('command', 'serve')
36
- store.set('config', configFile)
37
- store.set('mode', mode)
38
- store.set('port', port)
39
- store.set('minify', !!minify)
40
-
41
- const config = await getConfig(configFile)
42
- watch(config)
43
- })
44
-
45
- cli
46
- .command('build [root]', '开始构建服务 , 若不指定平台则默认当前操作系统的架构类型')
47
- .option('-m , --mode <mode>', '[development | production | test | staging | ...] 环境模式 ', { default: 'production' })
48
- .action(async (configFile: string = 'qvite.config.ts', options: BuildOptions) => {
49
- const { mode, minify } = options
50
-
51
- store.set('command', 'build')
52
- store.set('config', configFile)
53
- store.set('mode', mode)
54
- store.set('minify', minify)
55
-
56
- const config = await getConfig(configFile)
57
- build(config)
58
- })
59
-
60
- cli.help()
61
- cli.version(version)
62
- cli.parse()
package/index.ts DELETED
@@ -1,106 +0,0 @@
1
- import type { UserConfig as TsdownUserConfig } from 'tsdown'
2
- import type { UserConfig as ViteUserConfig } from 'vite'
3
- import type { QviteConfig, QviteConfigExport, QviteConfigFnObject } from './src/typings'
4
- import { defineConfig as tsdownDefineConfig } from 'tsdown'
5
- import { defineConfig as viteDefineConfig } from 'vite'
6
-
7
- export type * from './src/typings'
8
-
9
- /**
10
- * `@quiteer/vite` 配置声明函数(类型辅助)
11
- *
12
- * 为 `qvite.config.ts` 提供强类型提示,支持对象、Promise 与函数多种导出形式
13
- *
14
- * @param config - 可为对象、Promise 或按环境返回配置的函数
15
- * @returns 与入参同构的配置对象/函数,用于类型推断,无运行时副作用
16
- * @throws {TypeError} 不抛出异常(纯类型辅助),运行时直接返回
17
- *
18
- * @example
19
- * ```ts
20
- * import { defineConfig } from 'qvite'
21
- * export default defineConfig({ mode: 'development', vite: { plugins: [] } })
22
- * ```
23
- *
24
- * @remarks
25
- * - 函数重载覆盖对象、Promise、函数等场景
26
- * - 仅用于 TS 类型推断,运行时原样返回
27
- *
28
- * @security
29
- * 不读取文件、不处理敏感信息
30
- *
31
- * @performance
32
- * 常量时间返回,无额外开销
33
- */
34
- export function defineConfig(config: QviteConfig): QviteConfig
35
-
36
- export function defineConfig(config: Promise<QviteConfig>): Promise<QviteConfig>
37
-
38
- export function defineConfig(config: QviteConfigFnObject): QviteConfigFnObject
39
-
40
- export function defineConfig(config: QviteConfigExport): QviteConfigExport
41
-
42
- export function defineConfig(config: QviteConfigExport): QviteConfigExport {
43
- return config
44
- }
45
-
46
- // 类型导出通过 dts 文件与 typesVersions 提供,避免在 JS 解析阶段出现命名导出未定义的问题
47
-
48
- /**
49
- * 暴露 Vite 的 `defineConfig`(类型辅助包装)
50
- *
51
- * 为 Vite 配置文件提供强类型提示;内部委托给 `vite.defineConfig`
52
- *
53
- * @param config - Vite 配置对象或按环境返回配置的函数
54
- * @returns 与入参同构的配置对象/函数,用于类型推断
55
- *
56
- * @example
57
- * ```ts
58
- * import { defineViteConfig } from 'qvite'
59
- * export default defineViteConfig({ plugins: [] })
60
- * ```
61
- *
62
- * @remarks
63
- * - 纯类型辅助,运行时直接委托给 Vite 的 `defineConfig`
64
- *
65
- * @security
66
- * 无敏感信息处理
67
- *
68
- * @performance
69
- * 常量时间委托,无额外开销
70
- */
71
- export function defineViteConfig(
72
- config: Parameters<typeof viteDefineConfig>[0]
73
- ): ReturnType<typeof viteDefineConfig> {
74
- return viteDefineConfig(config as ViteUserConfig)
75
- }
76
-
77
- /**
78
- * 暴露 tsdown 的 `defineConfig`(类型辅助包装)
79
- *
80
- * 为 tsdown 配置文件提供强类型提示;内部委托给 `tsdown.defineConfig`
81
- *
82
- * @param config - tsdown 配置对象或配置数组
83
- * @returns 与入参同构的配置对象/数组,用于类型推断
84
- *
85
- * @example
86
- * ```ts
87
- * import { defineTsdownConfig } from 'qvite'
88
- * export default defineTsdownConfig([
89
- * { name: 'client', entry: ['src/index.ts'], outDir: 'dist/client', platform: 'node' }
90
- * ])
91
- * ```
92
- *
93
- * @remarks
94
- * - 纯类型辅助,运行时直接委托给 tsdown 的 `defineConfig`
95
- *
96
- * @security
97
- * 无敏感信息处理
98
- *
99
- * @performance
100
- * 常量时间委托,无额外开销
101
- */
102
- export function defineTsdownConfig(
103
- config: Parameters<typeof tsdownDefineConfig>[0]
104
- ): ReturnType<typeof tsdownDefineConfig> {
105
- return tsdownDefineConfig(config as TsdownUserConfig | TsdownUserConfig[])
106
- }
package/src/build.ts DELETED
@@ -1,43 +0,0 @@
1
- import type { QviteConfig } from './typings'
2
- import { build as viteBuild } from 'vite'
3
-
4
- import { normalizeConfig, toViteInlineConfig } from './transform'
5
-
6
- /**
7
- * 执行构建流程(生产模式)
8
- *
9
- * 先构建 tsdown 产物(若配置提供),再调用 Vite 的 `build` 完成前端打包
10
- *
11
- * @param options - Qvite 配置对象,含 `vite` 与 `tsdown` 等子配置
12
- * @returns Promise<void> 构建完成无返回值
13
- * @throws {Error} 当 Vite 或 tsdown 构建失败时抛出异常
14
- *
15
- * @example
16
- * ```ts
17
- * await build({ mode: 'production', minify: true, vite: { build: { outDir: 'dist' } } })
18
- * ```
19
- *
20
- * @remarks
21
- * - `minify` 会映射为 Vite 的 `build.minify`
22
- * - 若 `tsdown` 配置存在,则会先执行 `tsdownBuild`
23
- *
24
- * @security
25
- * 不写入敏感信息,仅调用编译器
26
- *
27
- * @performance
28
- * 构建性能取决于 Vite/tsdown 自身实现
29
- */
30
- export async function build(options: QviteConfig): Promise<void> {
31
- const normalized = await normalizeConfig(options)
32
-
33
- if (normalized.tsdown && (
34
- (Array.isArray(normalized.tsdown) && normalized.tsdown.length > 0)
35
- || (!Array.isArray(normalized.tsdown) && Object.keys(normalized.tsdown).length > 0)
36
- )) {
37
- const { build: tsdownBuild } = await import('tsdown') as any
38
- await tsdownBuild(normalized.tsdown as any)
39
- }
40
-
41
- const inline = await toViteInlineConfig(normalized)
42
- await viteBuild(inline)
43
- }
package/src/defaults.ts DELETED
@@ -1,36 +0,0 @@
1
- import type { QviteConfig } from './typings'
2
- import { fileURLToPath } from 'node:url'
3
-
4
- export const defaultOptions = {
5
- plugins: {
6
- Vue: [{ customElement: true }],
7
- UnoCSS: false,
8
- VueDevTools: [{}],
9
- VueJsx: [{}],
10
- Progress: [{}],
11
- FileChangeLogger: [{}],
12
- RemoveConsole: [{}],
13
- MockRouter: [{}]
14
- },
15
- html: {
16
-
17
- },
18
- env: {
19
- obfuscate: false,
20
- requiredKeys: ['desc']
21
- },
22
- vite: {
23
- server: {
24
- port: 3000,
25
- strictPort: false
26
- },
27
- resolve: {
28
- alias: {
29
- '@': fileURLToPath(new URL('./src', import.meta.url))
30
- }
31
- },
32
- build: {
33
- minify: false
34
- }
35
- }
36
- } satisfies QviteConfig
package/src/getConfig.ts DELETED
@@ -1,52 +0,0 @@
1
- import type { Command, Mode, QviteConfig, QviteConfigFn } from './typings'
2
- import { join } from 'node:path'
3
- import { isFunction } from '@quiteer/is'
4
- import { parserConfig } from '@quiteer/parser-config'
5
- import { deepMerge } from '@quiteer/utils'
6
- import { pathExists } from 'fs-extra'
7
- import { loadEnv } from 'vite'
8
- import { store } from './store'
9
-
10
- const NOT_FOUND = '找不到 qvite.config.ts | qvite.config.js | qvite.config.json , 请在根目录下添加配置文件 , 或显式的指定配置文件路径(相对于根目录)'
11
- const PARSING_FAILED = '找到了配置文件,但解析配置文件失败!'
12
-
13
- const root = store.get('root') as string
14
-
15
- async function configPath(filePath: string) {
16
- if (filePath)
17
- return join(root, filePath)
18
-
19
- const configList = ['ts', 'mjs', 'cjs', 'js'].map(suffix => `${join(root, 'qvite.config')}.${suffix}`)
20
-
21
- const index = (await Promise.all(configList.map(path => pathExists(path)))).findIndex(flag => flag)
22
-
23
- if (index > -1)
24
- return configList[index]
25
-
26
- throw new Error(NOT_FOUND)
27
- }
28
-
29
- export async function getConfig(filePath: string): Promise<QviteConfig> {
30
- const path = await configPath(filePath)
31
-
32
- const command = store.get<Command>('command')!
33
- const mode = store.get<Mode>('mode')!
34
- const modeEnv = loadEnv(mode, root, store.get<string[]>('prefixes')!)
35
- const defaultEnv = loadEnv('', root, store.get<string[]>('prefixes')!)
36
-
37
- const env = deepMerge({}, defaultEnv, modeEnv)
38
- try {
39
- const option: QviteConfig = await parserConfig(path, 'qvite.config')
40
-
41
- if (isFunction(option)) {
42
- const configFn = option as QviteConfigFn
43
- return configFn({ command, mode, env, root })
44
- }
45
-
46
- return option
47
- }
48
- catch (error) {
49
- console.error('error :>> ', error)
50
- throw new Error(PARSING_FAILED)
51
- }
52
- }
package/src/plugins.ts DELETED
@@ -1,14 +0,0 @@
1
- import type { PluginOption } from 'vite'
2
- import type { QvitePlugins } from './typings'
3
- import { fileChangeLoggerPlugin, mockRouterPlugin, Progress, removeConsolePlugin, UnoCSS, Vue, VueDevTools, VueJsx } from '@quiteer/vite-plugins'
4
-
5
- export default {
6
- FileChangeLogger: fileChangeLoggerPlugin,
7
- MockRouter: mockRouterPlugin,
8
- RemoveConsole: removeConsolePlugin,
9
- Progress,
10
- Vue,
11
- VueDevTools,
12
- VueJsx,
13
- UnoCSS
14
- } satisfies Record<keyof QvitePlugins, (...args: any[]) => PluginOption>
package/src/store.ts DELETED
@@ -1,13 +0,0 @@
1
- import { cwd } from 'node:process'
2
- import { PersistentStore } from '@quiteer/utils'
3
-
4
- export const store = PersistentStore.getInstance('qvite')
5
-
6
- store.set('root', cwd())
7
- store.set('command', 'serve')
8
- store.set('config', 'qvite.config.ts')
9
- store.set('mode', 'development')
10
- store.set('env', {})
11
- store.set('minify', false)
12
- store.set('port', 8080)
13
- store.set('prefixes', ['QVITE_', 'VITE_'])
package/src/transform.ts DELETED
@@ -1,50 +0,0 @@
1
- import type { InlineConfig, Plugin } from 'vite'
2
- import type { QviteConfig, QvitePlugins } from './typings'
3
- import { deepMerge } from '@quiteer/utils'
4
- import { envConfigPlugin, virtualHtmlPlugin } from '@quiteer/vite-plugins'
5
- import { mergeConfig } from 'vite'
6
- import { defaultOptions } from './defaults'
7
- import defaultPlugins from './plugins'
8
- import { store } from './store'
9
-
10
- type NormalizeConfig = Required<QviteConfig>
11
-
12
- export async function normalizeConfig(raw: QviteConfig): Promise<NormalizeConfig> {
13
- const config = deepMerge<QviteConfig>(defaultOptions, raw) as NormalizeConfig
14
- return config
15
- }
16
-
17
- export function geVitePlugins(config: NormalizeConfig) {
18
- const { html, env, plugins } = config
19
-
20
- const pluginKeys = Object.keys(plugins) as (keyof QvitePlugins)[]
21
-
22
- const vitePlugins = pluginKeys.map((key) => {
23
- const pluginOptions = plugins[key]
24
-
25
- const pluginFn = defaultPlugins[key] as (...args: any[]) => Plugin
26
-
27
- if (Array.isArray(pluginOptions)) {
28
- return pluginFn(...pluginOptions as any[])
29
- }
30
-
31
- return null
32
- }).filter(Boolean) as Plugin[]
33
- return [...vitePlugins, virtualHtmlPlugin(html), envConfigPlugin(env)]
34
- }
35
-
36
- export async function toViteInlineConfig(config: NormalizeConfig): Promise<InlineConfig> {
37
- const mode = store.get<string>('mode')!
38
- const root = store.get<string>('root')!
39
-
40
- const plugins = geVitePlugins(config)
41
-
42
- const inline: InlineConfig = mergeConfig({
43
- configFile: false,
44
- root,
45
- mode,
46
- plugins
47
- }, { ...config.vite })
48
-
49
- return inline
50
- }
package/src/typings.ts DELETED
@@ -1,48 +0,0 @@
1
- import type { EnvConfigPluginOptions, fileChangeLoggerPlugin, mockRouterPlugin, Progress, removeConsolePlugin, UnoCSS, VirtualHtmlOptions, Vue, VueDevTools, VueJsx } from '@quiteer/vite-plugins'
2
- import type { UserConfig } from 'tsdown'
3
- import type { UserConfig as ViteUserConfig } from 'vite'
4
-
5
- export type { EnvConfig } from '@quiteer/vite-plugins'
6
-
7
- export type PluginOptions<T extends (...args: any) => any> = boolean | Parameters<T>
8
-
9
- export interface QvitePlugins {
10
- Vue?: PluginOptions<typeof Vue>
11
- UnoCSS?: PluginOptions<typeof UnoCSS>
12
- VueJsx?: PluginOptions<typeof VueJsx>
13
- Progress?: PluginOptions<typeof Progress>
14
- VueDevTools?: PluginOptions<typeof VueDevTools>
15
- RemoveConsole?: PluginOptions<typeof removeConsolePlugin>
16
- MockRouter?: PluginOptions<typeof mockRouterPlugin>
17
- FileChangeLogger?: PluginOptions<typeof fileChangeLoggerPlugin>
18
- }
19
-
20
- export interface QviteConfig {
21
- vite?: ViteUserConfig
22
- tsdown?: UserConfig | UserConfig[]
23
- plugins?: QvitePlugins
24
- html?: VirtualHtmlOptions
25
- env?: EnvConfigPluginOptions
26
- }
27
-
28
- export type Mode = 'development' | 'production' | 'test' | 'staging' | 'production' | string
29
-
30
- export type Command = 'build' | 'serve'
31
-
32
- export interface ConfigEnv<T = Record<string, string>> {
33
- command: Command
34
- mode: Mode
35
- env: T
36
- root: string
37
- }
38
-
39
- export type QviteConfigFnObject = (env: ConfigEnv) => QviteConfig
40
- export type QviteConfigFnPromise = (env: ConfigEnv) => Promise<QviteConfig>
41
- export type QviteConfigFn = (env: ConfigEnv) => QviteConfig | Promise<QviteConfig>
42
-
43
- export type QviteConfigExport
44
- = | QviteConfig
45
- | Promise<QviteConfig>
46
- | QviteConfigFnObject
47
- | QviteConfigFnPromise
48
- | QviteConfigFn
package/src/watch.ts DELETED
@@ -1,60 +0,0 @@
1
- import type { QviteConfig } from './typings'
2
- import { getPortPromise } from 'portfinder'
3
- import { createServer } from 'vite'
4
- import { store } from './store'
5
- import { normalizeConfig, toViteInlineConfig } from './transform'
6
-
7
- /**
8
- * 启动开发服务器(热更新)
9
- *
10
- * 根据规范化配置启动 Vite Dev Server,自动选择可用端口,并打印访问地址
11
- *
12
- * @param options - Qvite 配置对象,包含 `vite` 与 `tsdown`
13
- * @returns Promise<void>
14
- * @throws {Error} 当端口查找或 Vite 启动失败时抛出异常
15
- *
16
- * @example
17
- * ```ts
18
- * await watch({ port: 3000, vite: { plugins: [] } })
19
- * ```
20
- *
21
- * @remarks
22
- * - 若配置的 `port` 被占用,将自动选取下一个可用端口
23
- * - 启动前执行一次 tsdown 构建,便于开发期产物可用
24
- *
25
- * @security
26
- * 不暴露敏感信息,仅打印本地 URL
27
- *
28
- * @performance
29
- * 端口探测为 O(1) 近似成本,服务性能由 Vite 决定
30
- */
31
- export async function watch(options: QviteConfig): Promise<void> {
32
- const normalized = await normalizeConfig(options)
33
- const port = normalized.vite?.server?.port || store.get<number>('port')!
34
-
35
- const p = await getPortPromise({
36
- port
37
- })
38
-
39
- store.set('port', p)
40
-
41
- const inline = await toViteInlineConfig(normalized)
42
-
43
- const viteDevServer = await createServer({
44
- ...inline,
45
- server: { ...inline.server, port: p }
46
- })
47
-
48
- await viteDevServer.listen(p)
49
- viteDevServer.printUrls()
50
-
51
- if (normalized.tsdown) {
52
- const { build: tsdownBuild } = await import('tsdown')
53
- if (!Array.isArray(normalized.tsdown)) {
54
- await tsdownBuild(normalized.tsdown)
55
- }
56
- else {
57
- await Promise.all(normalized.tsdown.map(tsdownBuild))
58
- }
59
- }
60
- }
package/tsconfig.json DELETED
@@ -1,24 +0,0 @@
1
- {
2
- "compilerOptions": {
3
- "target": "ESNext",
4
- "jsx": "preserve",
5
- "lib": ["DOM", "ESNext"],
6
- "baseUrl": ".",
7
- "module": "ESNext",
8
- "moduleResolution": "bundler",
9
- "paths": {
10
- "@/*": ["./src/*"]
11
- },
12
- "resolveJsonModule": true,
13
- "types": ["node"],
14
- "strict": true,
15
- "strictNullChecks": true,
16
- "noUnusedLocals": true,
17
- "outDir": "./dist",
18
- "allowSyntheticDefaultImports": true,
19
- "esModuleInterop": true,
20
- "forceConsistentCasingInFileNames": true
21
- },
22
- "include": ["src/**/*", "typings/**/*"],
23
- "exclude": ["node_modules", "dist"]
24
- }
package/tsdown.config.ts DELETED
@@ -1,22 +0,0 @@
1
- import { defineConfig } from 'tsdown'
2
-
3
- export default defineConfig([
4
- {
5
- name: 'qvite-api',
6
- outDir: 'dist',
7
- entry: ['index.ts'],
8
- platform: 'node',
9
- minify: false,
10
- dts: true,
11
- external: ['fsevents']
12
- },
13
- {
14
- name: 'qvite-cli',
15
- outDir: 'dist/bin',
16
- platform: 'node',
17
- dts: false,
18
- minify: false,
19
- entry: { qvite: 'cli.ts' },
20
- external: ['fsevents']
21
- }
22
- ])