create-bunli 0.1.3 โ 0.3.0
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 +13 -0
- package/dist/cli.js +10 -1
- package/dist/index.js +9 -0
- package/dist/templates/advanced/.bunli/commands.gen.report.json +6 -0
- package/dist/templates/advanced/.bunli/commands.gen.ts +66 -0
- package/dist/templates/advanced/bunli.config.ts +29 -0
- package/dist/templates/advanced/package.json +2 -1
- package/dist/templates/advanced/src/index.ts +1 -1
- package/dist/templates/advanced/template.json +8 -1
- package/dist/templates/advanced/tsconfig.json +1 -1
- package/dist/templates/basic/.bunli/commands.gen.report.json +6 -0
- package/dist/templates/basic/.bunli/commands.gen.ts +66 -0
- package/dist/templates/basic/bunli.config.ts +29 -0
- package/dist/templates/basic/package.json +2 -1
- package/dist/templates/basic/src/index.ts +1 -1
- package/dist/templates/basic/tsconfig.json +1 -1
- package/dist/templates/monorepo/.bunli/commands.gen.report.json +6 -0
- package/dist/templates/monorepo/.bunli/commands.gen.ts +66 -0
- package/dist/templates/monorepo/README.md +2 -2
- package/dist/templates/monorepo/bunli.config.ts +34 -0
- package/dist/templates/monorepo/package.json +2 -1
- package/dist/templates/monorepo/packages/cli/package.json +2 -1
- package/dist/templates/monorepo/packages/cli/src/index.ts +1 -1
- package/dist/templates/monorepo/packages/core/package.json +1 -1
- package/dist/templates/monorepo/packages/utils/package.json +1 -1
- package/dist/templates/monorepo/template.json +8 -1
- package/dist/templates/monorepo/tsconfig.json +1 -1
- package/dist/templates/monorepo/turbo.json +1 -1
- package/package.json +6 -5
- package/templates/advanced/.bunli/commands.gen.report.json +6 -0
- package/templates/advanced/.bunli/commands.gen.ts +66 -0
- package/templates/advanced/bunli.config.ts +29 -0
- package/templates/advanced/package.json +2 -1
- package/templates/advanced/src/index.ts +1 -1
- package/templates/advanced/template.json +8 -1
- package/templates/advanced/tsconfig.json +1 -1
- package/templates/basic/.bunli/commands.gen.report.json +6 -0
- package/templates/basic/.bunli/commands.gen.ts +66 -0
- package/templates/basic/bunli.config.ts +29 -0
- package/templates/basic/package.json +2 -1
- package/templates/basic/src/index.ts +1 -1
- package/templates/basic/tsconfig.json +1 -1
- package/templates/monorepo/.bunli/commands.gen.report.json +6 -0
- package/templates/monorepo/.bunli/commands.gen.ts +66 -0
- package/templates/monorepo/README.md +2 -2
- package/templates/monorepo/bunli.config.ts +34 -0
- package/templates/monorepo/package.json +2 -1
- package/templates/monorepo/packages/cli/package.json +2 -1
- package/templates/monorepo/packages/cli/src/index.ts +1 -1
- package/templates/monorepo/packages/core/package.json +1 -1
- package/templates/monorepo/packages/utils/package.json +1 -1
- package/templates/monorepo/template.json +8 -1
- package/templates/monorepo/tsconfig.json +1 -1
- package/templates/monorepo/turbo.json +1 -1
- package/dist/templates/advanced/test/commands.test.ts +0 -34
- package/dist/templates/basic/test/hello.test.ts +0 -26
- package/templates/advanced/test/commands.test.ts +0 -34
- package/templates/basic/test/hello.test.ts +0 -26
package/README.md
CHANGED
|
@@ -21,6 +21,7 @@ create-bunli my-cli
|
|
|
21
21
|
- ๐งช **Testing included** - Comes with @bunli/test for CLI testing
|
|
22
22
|
- ๐จ **Best practices** - Follows Bunli conventions and patterns
|
|
23
23
|
- ๐ **Flexible sources** - Use bundled templates or any GitHub repository
|
|
24
|
+
- โก **Type generation** - All templates include codegen for enhanced developer experience
|
|
24
25
|
|
|
25
26
|
## Usage
|
|
26
27
|
|
|
@@ -205,6 +206,18 @@ Templates can include a `template.json` manifest:
|
|
|
205
206
|
}
|
|
206
207
|
```
|
|
207
208
|
|
|
209
|
+
### Type Generation
|
|
210
|
+
|
|
211
|
+
All templates include type generation configuration for enhanced developer experience:
|
|
212
|
+
|
|
213
|
+
This provides:
|
|
214
|
+
- **Autocomplete** for command names and options
|
|
215
|
+
- **Type safety** at compile time
|
|
216
|
+
- **IntelliSense** for command metadata
|
|
217
|
+
- **CLI wrappers** for programmatic execution
|
|
218
|
+
|
|
219
|
+
Learn more in the [Type Generation Guide](/docs/guides/type-generation).
|
|
220
|
+
|
|
208
221
|
### Template Variables
|
|
209
222
|
|
|
210
223
|
Use these variables in your template files:
|
package/dist/cli.js
CHANGED
|
@@ -102,6 +102,15 @@ async function getFilesToProcess(dir, manifest) {
|
|
|
102
102
|
}
|
|
103
103
|
}
|
|
104
104
|
await walk(dir);
|
|
105
|
+
if (manifest?.files?.exclude) {
|
|
106
|
+
return files.filter((file) => {
|
|
107
|
+
return !manifest.files.exclude.some((pattern) => {
|
|
108
|
+
const regexPattern = pattern.replace(/\*\*/g, ".*").replace(/\*/g, "[^/]*").replace(/\?/g, "[^/]");
|
|
109
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
110
|
+
return regex.test(file);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
}
|
|
105
114
|
return files;
|
|
106
115
|
}
|
|
107
116
|
async function runPostInstallHooks(dir, hooks) {
|
|
@@ -277,7 +286,7 @@ async function run() {
|
|
|
277
286
|
} else if (args[0] && !args[0].startsWith("-") && args[0] !== "create") {
|
|
278
287
|
process.argv.splice(2, 0, "create");
|
|
279
288
|
}
|
|
280
|
-
const cli = createCLI({
|
|
289
|
+
const cli = await createCLI({
|
|
281
290
|
name: "create-bunli",
|
|
282
291
|
version: "0.1.0",
|
|
283
292
|
description: "Scaffold new Bunli CLI projects"
|
package/dist/index.js
CHANGED
|
@@ -96,6 +96,15 @@ async function getFilesToProcess(dir, manifest) {
|
|
|
96
96
|
}
|
|
97
97
|
}
|
|
98
98
|
await walk(dir);
|
|
99
|
+
if (manifest?.files?.exclude) {
|
|
100
|
+
return files.filter((file) => {
|
|
101
|
+
return !manifest.files.exclude.some((pattern) => {
|
|
102
|
+
const regexPattern = pattern.replace(/\*\*/g, ".*").replace(/\*/g, "[^/]*").replace(/\?/g, "[^/]");
|
|
103
|
+
const regex = new RegExp(`^${regexPattern}$`);
|
|
104
|
+
return regex.test(file);
|
|
105
|
+
});
|
|
106
|
+
});
|
|
107
|
+
}
|
|
99
108
|
return files;
|
|
100
109
|
}
|
|
101
110
|
async function runPostInstallHooks(dir, hooks) {
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// This file was automatically generated by Bunli.
|
|
2
|
+
// You should NOT make any changes in this file as it will be overwritten.
|
|
3
|
+
|
|
4
|
+
import type { Command, CLI, GeneratedOptionMeta, RegisteredCommands, CommandOptions, GeneratedCommandMeta } from '@bunli/core'
|
|
5
|
+
import { createGeneratedHelpers, registerGeneratedStore } from '@bunli/core'
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
// Narrow list of command names to avoid typeof-cycles in types
|
|
10
|
+
const names = [] as const
|
|
11
|
+
type GeneratedNames = typeof names[number]
|
|
12
|
+
|
|
13
|
+
const modules: Record<GeneratedNames, Command<any>> = {
|
|
14
|
+
|
|
15
|
+
} as const
|
|
16
|
+
|
|
17
|
+
const metadata: Record<GeneratedNames, GeneratedCommandMeta> = {
|
|
18
|
+
|
|
19
|
+
} as const
|
|
20
|
+
|
|
21
|
+
export const generated = registerGeneratedStore(createGeneratedHelpers(modules, metadata))
|
|
22
|
+
|
|
23
|
+
export const commands = generated.commands
|
|
24
|
+
export const commandMeta = generated.metadata
|
|
25
|
+
|
|
26
|
+
export interface GeneratedCLI {
|
|
27
|
+
register(cli?: CLI<any>): GeneratedCLI
|
|
28
|
+
list(): Array<{
|
|
29
|
+
name: GeneratedNames
|
|
30
|
+
command: (typeof modules)[GeneratedNames]
|
|
31
|
+
metadata: (typeof metadata)[GeneratedNames]
|
|
32
|
+
}>
|
|
33
|
+
get<Name extends GeneratedNames>(name: Name): (typeof modules)[Name]
|
|
34
|
+
getMetadata<Name extends GeneratedNames>(name: Name): (typeof metadata)[Name]
|
|
35
|
+
getFlags<Name extends keyof RegisteredCommands & string>(name: Name): CommandOptions<Name>
|
|
36
|
+
getFlagsMeta<Name extends GeneratedNames>(name: Name): Record<string, GeneratedOptionMeta>
|
|
37
|
+
withCLI(cli: CLI<any>): { execute(name: string, options: unknown): Promise<void> }
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export const cli: GeneratedCLI = {
|
|
41
|
+
register: (cliInstance?: CLI<any>) => { generated.register(cliInstance); return cli },
|
|
42
|
+
list: () => generated.list(),
|
|
43
|
+
get: <Name extends GeneratedNames>(name: Name) => generated.get(name),
|
|
44
|
+
getMetadata: <Name extends GeneratedNames>(name: Name) => generated.getMetadata(name),
|
|
45
|
+
getFlags: <Name extends keyof RegisteredCommands & string>(name: Name) => generated.getFlags(name) as CommandOptions<Name>,
|
|
46
|
+
getFlagsMeta: <Name extends GeneratedNames>(name: Name) => generated.getFlagsMeta(name),
|
|
47
|
+
withCLI: (cliInstance) => generated.withCLI(cliInstance)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Enhanced helper functions
|
|
51
|
+
export const listCommands = () => generated.list().map(c => c.name)
|
|
52
|
+
export const getCommandApi = <Name extends GeneratedNames>(name: Name) => generated.getMetadata(name)
|
|
53
|
+
export const getTypedFlags = <Name extends GeneratedNames>(name: Name) => generated.getFlags(name) as CommandOptions<Name>
|
|
54
|
+
export const validateCommand = <Name extends GeneratedNames>(name: Name, flags: Record<string, unknown>) => generated.validateCommand(name, flags)
|
|
55
|
+
export const findCommandByName = <Name extends GeneratedNames>(name: Name) => generated.findByName(name)
|
|
56
|
+
export const findCommandsByDescription = (searchTerm: string) => generated.findByDescription(searchTerm)
|
|
57
|
+
export const getCommandNames = () => generated.getCommandNames()
|
|
58
|
+
|
|
59
|
+
// Auto-register on import for zero-config usage
|
|
60
|
+
export default cli
|
|
61
|
+
|
|
62
|
+
// Ensure module augmentation happens on import
|
|
63
|
+
declare module '@bunli/core' {
|
|
64
|
+
// Precise key mapping without typeof cycles
|
|
65
|
+
interface RegisteredCommands extends Record<GeneratedNames, Command<any>> {}
|
|
66
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { defineConfig } from '@bunli/core'
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
name: '{{name}}',
|
|
5
|
+
version: '{{version}}',
|
|
6
|
+
description: '{{description}}',
|
|
7
|
+
|
|
8
|
+
plugins: [],
|
|
9
|
+
|
|
10
|
+
build: {
|
|
11
|
+
entry: './src/index.ts',
|
|
12
|
+
outdir: './dist',
|
|
13
|
+
targets: ['darwin-arm64', 'darwin-x64', 'linux-x64', 'windows-x64'],
|
|
14
|
+
minify: true,
|
|
15
|
+
sourcemap: true,
|
|
16
|
+
compress: true
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
dev: {
|
|
20
|
+
watch: true,
|
|
21
|
+
inspect: false
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
test: {
|
|
25
|
+
pattern: ['**/*.test.ts', '**/*.spec.ts'],
|
|
26
|
+
coverage: true,
|
|
27
|
+
watch: false
|
|
28
|
+
}
|
|
29
|
+
})
|
|
@@ -9,11 +9,12 @@
|
|
|
9
9
|
"{{projectName}}": "./dist/index.js"
|
|
10
10
|
},
|
|
11
11
|
"scripts": {
|
|
12
|
+
"postinstall": "bunli generate",
|
|
12
13
|
"dev": "bun run src/index.ts",
|
|
13
14
|
"build": "bunli build",
|
|
14
15
|
"test": "bun test",
|
|
15
16
|
"test:watch": "bun test --watch",
|
|
16
|
-
"
|
|
17
|
+
"typecheck": "tsc --noEmit",
|
|
17
18
|
"lint": "tsc --noEmit",
|
|
18
19
|
"prepare": "bun run build"
|
|
19
20
|
},
|
|
@@ -6,7 +6,7 @@ import { serveCommand } from './commands/serve.js'
|
|
|
6
6
|
import { configCommand } from './commands/config.js'
|
|
7
7
|
import { loadConfig } from './utils/config.js'
|
|
8
8
|
|
|
9
|
-
const cli = createCLI({
|
|
9
|
+
const cli = await createCLI({
|
|
10
10
|
name: '{{projectName}}',
|
|
11
11
|
version: '0.1.0',
|
|
12
12
|
description: '{{description}}'
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// This file was automatically generated by Bunli.
|
|
2
|
+
// You should NOT make any changes in this file as it will be overwritten.
|
|
3
|
+
|
|
4
|
+
import type { Command, CLI, GeneratedOptionMeta, RegisteredCommands, CommandOptions, GeneratedCommandMeta } from '@bunli/core'
|
|
5
|
+
import { createGeneratedHelpers, registerGeneratedStore } from '@bunli/core'
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
// Narrow list of command names to avoid typeof-cycles in types
|
|
10
|
+
const names = [] as const
|
|
11
|
+
type GeneratedNames = typeof names[number]
|
|
12
|
+
|
|
13
|
+
const modules: Record<GeneratedNames, Command<any>> = {
|
|
14
|
+
|
|
15
|
+
} as const
|
|
16
|
+
|
|
17
|
+
const metadata: Record<GeneratedNames, GeneratedCommandMeta> = {
|
|
18
|
+
|
|
19
|
+
} as const
|
|
20
|
+
|
|
21
|
+
export const generated = registerGeneratedStore(createGeneratedHelpers(modules, metadata))
|
|
22
|
+
|
|
23
|
+
export const commands = generated.commands
|
|
24
|
+
export const commandMeta = generated.metadata
|
|
25
|
+
|
|
26
|
+
export interface GeneratedCLI {
|
|
27
|
+
register(cli?: CLI<any>): GeneratedCLI
|
|
28
|
+
list(): Array<{
|
|
29
|
+
name: GeneratedNames
|
|
30
|
+
command: (typeof modules)[GeneratedNames]
|
|
31
|
+
metadata: (typeof metadata)[GeneratedNames]
|
|
32
|
+
}>
|
|
33
|
+
get<Name extends GeneratedNames>(name: Name): (typeof modules)[Name]
|
|
34
|
+
getMetadata<Name extends GeneratedNames>(name: Name): (typeof metadata)[Name]
|
|
35
|
+
getFlags<Name extends keyof RegisteredCommands & string>(name: Name): CommandOptions<Name>
|
|
36
|
+
getFlagsMeta<Name extends GeneratedNames>(name: Name): Record<string, GeneratedOptionMeta>
|
|
37
|
+
withCLI(cli: CLI<any>): { execute(name: string, options: unknown): Promise<void> }
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export const cli: GeneratedCLI = {
|
|
41
|
+
register: (cliInstance?: CLI<any>) => { generated.register(cliInstance); return cli },
|
|
42
|
+
list: () => generated.list(),
|
|
43
|
+
get: <Name extends GeneratedNames>(name: Name) => generated.get(name),
|
|
44
|
+
getMetadata: <Name extends GeneratedNames>(name: Name) => generated.getMetadata(name),
|
|
45
|
+
getFlags: <Name extends keyof RegisteredCommands & string>(name: Name) => generated.getFlags(name) as CommandOptions<Name>,
|
|
46
|
+
getFlagsMeta: <Name extends GeneratedNames>(name: Name) => generated.getFlagsMeta(name),
|
|
47
|
+
withCLI: (cliInstance) => generated.withCLI(cliInstance)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Enhanced helper functions
|
|
51
|
+
export const listCommands = () => generated.list().map(c => c.name)
|
|
52
|
+
export const getCommandApi = <Name extends GeneratedNames>(name: Name) => generated.getMetadata(name)
|
|
53
|
+
export const getTypedFlags = <Name extends GeneratedNames>(name: Name) => generated.getFlags(name) as CommandOptions<Name>
|
|
54
|
+
export const validateCommand = <Name extends GeneratedNames>(name: Name, flags: Record<string, unknown>) => generated.validateCommand(name, flags)
|
|
55
|
+
export const findCommandByName = <Name extends GeneratedNames>(name: Name) => generated.findByName(name)
|
|
56
|
+
export const findCommandsByDescription = (searchTerm: string) => generated.findByDescription(searchTerm)
|
|
57
|
+
export const getCommandNames = () => generated.getCommandNames()
|
|
58
|
+
|
|
59
|
+
// Auto-register on import for zero-config usage
|
|
60
|
+
export default cli
|
|
61
|
+
|
|
62
|
+
// Ensure module augmentation happens on import
|
|
63
|
+
declare module '@bunli/core' {
|
|
64
|
+
// Precise key mapping without typeof cycles
|
|
65
|
+
interface RegisteredCommands extends Record<GeneratedNames, Command<any>> {}
|
|
66
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { defineConfig } from '@bunli/core'
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
name: '{{name}}',
|
|
5
|
+
version: '{{version}}',
|
|
6
|
+
description: '{{description}}',
|
|
7
|
+
|
|
8
|
+
build: {
|
|
9
|
+
entry: './src/index.ts',
|
|
10
|
+
outdir: './dist',
|
|
11
|
+
targets: ['native'],
|
|
12
|
+
minify: true,
|
|
13
|
+
sourcemap: true,
|
|
14
|
+
compress: false
|
|
15
|
+
},
|
|
16
|
+
|
|
17
|
+
dev: {
|
|
18
|
+
watch: true,
|
|
19
|
+
inspect: true
|
|
20
|
+
},
|
|
21
|
+
|
|
22
|
+
test: {
|
|
23
|
+
pattern: ['**/*.test.ts', '**/*.spec.ts'],
|
|
24
|
+
coverage: true,
|
|
25
|
+
watch: false
|
|
26
|
+
},
|
|
27
|
+
|
|
28
|
+
plugins: [],
|
|
29
|
+
})
|
|
@@ -8,10 +8,11 @@
|
|
|
8
8
|
"{{projectName}}": "./dist/index.js"
|
|
9
9
|
},
|
|
10
10
|
"scripts": {
|
|
11
|
+
"postinstall": "bunli generate",
|
|
11
12
|
"dev": "bun run src/index.ts",
|
|
12
13
|
"build": "bunli build",
|
|
13
14
|
"test": "bun test",
|
|
14
|
-
"
|
|
15
|
+
"typecheck": "tsc --noEmit"
|
|
15
16
|
},
|
|
16
17
|
"dependencies": {
|
|
17
18
|
"@bunli/core": "latest"
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
// This file was automatically generated by Bunli.
|
|
2
|
+
// You should NOT make any changes in this file as it will be overwritten.
|
|
3
|
+
|
|
4
|
+
import type { Command, CLI, GeneratedOptionMeta, RegisteredCommands, CommandOptions, GeneratedCommandMeta } from '@bunli/core'
|
|
5
|
+
import { createGeneratedHelpers, registerGeneratedStore } from '@bunli/core'
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
// Narrow list of command names to avoid typeof-cycles in types
|
|
10
|
+
const names = [] as const
|
|
11
|
+
type GeneratedNames = typeof names[number]
|
|
12
|
+
|
|
13
|
+
const modules: Record<GeneratedNames, Command<any>> = {
|
|
14
|
+
|
|
15
|
+
} as const
|
|
16
|
+
|
|
17
|
+
const metadata: Record<GeneratedNames, GeneratedCommandMeta> = {
|
|
18
|
+
|
|
19
|
+
} as const
|
|
20
|
+
|
|
21
|
+
export const generated = registerGeneratedStore(createGeneratedHelpers(modules, metadata))
|
|
22
|
+
|
|
23
|
+
export const commands = generated.commands
|
|
24
|
+
export const commandMeta = generated.metadata
|
|
25
|
+
|
|
26
|
+
export interface GeneratedCLI {
|
|
27
|
+
register(cli?: CLI<any>): GeneratedCLI
|
|
28
|
+
list(): Array<{
|
|
29
|
+
name: GeneratedNames
|
|
30
|
+
command: (typeof modules)[GeneratedNames]
|
|
31
|
+
metadata: (typeof metadata)[GeneratedNames]
|
|
32
|
+
}>
|
|
33
|
+
get<Name extends GeneratedNames>(name: Name): (typeof modules)[Name]
|
|
34
|
+
getMetadata<Name extends GeneratedNames>(name: Name): (typeof metadata)[Name]
|
|
35
|
+
getFlags<Name extends keyof RegisteredCommands & string>(name: Name): CommandOptions<Name>
|
|
36
|
+
getFlagsMeta<Name extends GeneratedNames>(name: Name): Record<string, GeneratedOptionMeta>
|
|
37
|
+
withCLI(cli: CLI<any>): { execute(name: string, options: unknown): Promise<void> }
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export const cli: GeneratedCLI = {
|
|
41
|
+
register: (cliInstance?: CLI<any>) => { generated.register(cliInstance); return cli },
|
|
42
|
+
list: () => generated.list(),
|
|
43
|
+
get: <Name extends GeneratedNames>(name: Name) => generated.get(name),
|
|
44
|
+
getMetadata: <Name extends GeneratedNames>(name: Name) => generated.getMetadata(name),
|
|
45
|
+
getFlags: <Name extends keyof RegisteredCommands & string>(name: Name) => generated.getFlags(name) as CommandOptions<Name>,
|
|
46
|
+
getFlagsMeta: <Name extends GeneratedNames>(name: Name) => generated.getFlagsMeta(name),
|
|
47
|
+
withCLI: (cliInstance) => generated.withCLI(cliInstance)
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
// Enhanced helper functions
|
|
51
|
+
export const listCommands = () => generated.list().map(c => c.name)
|
|
52
|
+
export const getCommandApi = <Name extends GeneratedNames>(name: Name) => generated.getMetadata(name)
|
|
53
|
+
export const getTypedFlags = <Name extends GeneratedNames>(name: Name) => generated.getFlags(name) as CommandOptions<Name>
|
|
54
|
+
export const validateCommand = <Name extends GeneratedNames>(name: Name, flags: Record<string, unknown>) => generated.validateCommand(name, flags)
|
|
55
|
+
export const findCommandByName = <Name extends GeneratedNames>(name: Name) => generated.findByName(name)
|
|
56
|
+
export const findCommandsByDescription = (searchTerm: string) => generated.findByDescription(searchTerm)
|
|
57
|
+
export const getCommandNames = () => generated.getCommandNames()
|
|
58
|
+
|
|
59
|
+
// Auto-register on import for zero-config usage
|
|
60
|
+
export default cli
|
|
61
|
+
|
|
62
|
+
// Ensure module augmentation happens on import
|
|
63
|
+
declare module '@bunli/core' {
|
|
64
|
+
// Precise key mapping without typeof cycles
|
|
65
|
+
interface RegisteredCommands extends Record<GeneratedNames, Command<any>> {}
|
|
66
|
+
}
|
|
@@ -32,7 +32,7 @@ bun run build
|
|
|
32
32
|
bun test
|
|
33
33
|
|
|
34
34
|
# Type check
|
|
35
|
-
bun run
|
|
35
|
+
bun run typecheck
|
|
36
36
|
```
|
|
37
37
|
|
|
38
38
|
## Creating a New Package
|
|
@@ -62,7 +62,7 @@ bun run release
|
|
|
62
62
|
- `dev` - Run all packages in development mode
|
|
63
63
|
- `build` - Build all packages
|
|
64
64
|
- `test` - Run all tests
|
|
65
|
-
- `
|
|
65
|
+
- `typecheck` - Type check all packages
|
|
66
66
|
- `lint` - Lint all packages
|
|
67
67
|
- `clean` - Clean all build artifacts
|
|
68
68
|
- `changeset` - Create a new changeset
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { defineConfig } from '@bunli/core'
|
|
2
|
+
|
|
3
|
+
export default defineConfig({
|
|
4
|
+
name: '{{name}}',
|
|
5
|
+
version: '{{version}}',
|
|
6
|
+
description: '{{description}}',
|
|
7
|
+
|
|
8
|
+
plugins: [],
|
|
9
|
+
|
|
10
|
+
build: {
|
|
11
|
+
entry: './packages/core/src/index.ts',
|
|
12
|
+
outdir: './packages/core/dist',
|
|
13
|
+
targets: ['darwin-arm64', 'darwin-x64', 'linux-x64', 'windows-x64'],
|
|
14
|
+
minify: true,
|
|
15
|
+
compress: true,
|
|
16
|
+
sourcemap: true
|
|
17
|
+
},
|
|
18
|
+
|
|
19
|
+
dev: {
|
|
20
|
+
watch: true,
|
|
21
|
+
inspect: false
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
test: {
|
|
25
|
+
pattern: ['**/*.test.ts', '**/*.spec.ts'],
|
|
26
|
+
coverage: true,
|
|
27
|
+
watch: false
|
|
28
|
+
},
|
|
29
|
+
|
|
30
|
+
workspace: {
|
|
31
|
+
packages: ['./packages/*'],
|
|
32
|
+
versionStrategy: 'fixed'
|
|
33
|
+
}
|
|
34
|
+
})
|
|
@@ -9,10 +9,11 @@
|
|
|
9
9
|
"packages/*"
|
|
10
10
|
],
|
|
11
11
|
"scripts": {
|
|
12
|
+
"postinstall": "bunli generate",
|
|
12
13
|
"dev": "turbo run dev",
|
|
13
14
|
"build": "turbo run build",
|
|
14
15
|
"test": "turbo run test",
|
|
15
|
-
"
|
|
16
|
+
"typecheck": "turbo run typecheck",
|
|
16
17
|
"lint": "turbo run lint",
|
|
17
18
|
"clean": "turbo run clean && rm -rf node_modules",
|
|
18
19
|
"changeset": "changeset",
|
|
@@ -9,10 +9,11 @@
|
|
|
9
9
|
"{{projectName}}": "./dist/index.js"
|
|
10
10
|
},
|
|
11
11
|
"scripts": {
|
|
12
|
+
"postinstall": "bunli generate",
|
|
12
13
|
"dev": "bun run src/index.ts",
|
|
13
14
|
"build": "bunli build",
|
|
14
15
|
"test": "bun test",
|
|
15
|
-
"
|
|
16
|
+
"typecheck": "tsc --noEmit",
|
|
16
17
|
"clean": "rm -rf dist"
|
|
17
18
|
},
|
|
18
19
|
"dependencies": {
|
|
@@ -3,7 +3,7 @@ import { createCLI } from '@bunli/core'
|
|
|
3
3
|
import { logger } from '@{{projectName}}/utils'
|
|
4
4
|
import { processCommand, analyzeCommand } from '@{{projectName}}/core'
|
|
5
5
|
|
|
6
|
-
const cli = createCLI({
|
|
6
|
+
const cli = await createCLI({
|
|
7
7
|
name: '{{projectName}}',
|
|
8
8
|
version: '0.1.0',
|
|
9
9
|
description: '{{description}}'
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "create-bunli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "Scaffold new Bunli CLI projects",
|
|
6
6
|
"bin": {
|
|
@@ -43,12 +43,13 @@
|
|
|
43
43
|
"dev": "bun run src/cli.ts",
|
|
44
44
|
"build": "bun scripts/build.ts && bun run tsc",
|
|
45
45
|
"test": "bun test",
|
|
46
|
-
"
|
|
46
|
+
"typecheck": "tsc --noEmit",
|
|
47
47
|
"prepublishOnly": "bun run build"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@bunli/core": "0.
|
|
51
|
-
"@bunli/utils": "0.
|
|
50
|
+
"@bunli/core": "0.3.0",
|
|
51
|
+
"@bunli/utils": "0.2.0",
|
|
52
|
+
"@bunli/test": "0.2.0",
|
|
52
53
|
"giget": "^2.0.0",
|
|
53
54
|
"zod": "^3.25.67"
|
|
54
55
|
},
|
|
@@ -56,4 +57,4 @@
|
|
|
56
57
|
"@types/bun": "latest",
|
|
57
58
|
"typescript": "^5.8.0"
|
|
58
59
|
}
|
|
59
|
-
}
|
|
60
|
+
}
|