@@ -71,111 +71,6 @@ export interface InstallCommandOptions {
7171 dev ?: boolean
7272}
7373
74- export type DevDependencySuggestionReason = 'known-package' | 'readme-hint'
75-
76- export interface DevDependencySuggestion {
77- recommended : boolean
78- reason ?: DevDependencySuggestionReason
79- }
80-
81- const KNOWN_DEV_DEPENDENCY_PACKAGES = new Set < string > ( [
82- 'biome' ,
83- 'chai' ,
84- 'eslint' ,
85- 'esbuild' ,
86- 'husky' ,
87- 'jest' ,
88- 'lint-staged' ,
89- 'mocha' ,
90- 'oxc' ,
91- 'oxfmt' ,
92- 'oxlint' ,
93- 'playwright' ,
94- 'prettier' ,
95- 'rolldown' ,
96- 'rollup' ,
97- 'stylelint' ,
98- 'ts-jest' ,
99- 'ts-node' ,
100- 'tsx' ,
101- 'turbo' ,
102- 'typescript' ,
103- 'vite' ,
104- 'vitest' ,
105- 'webpack' ,
106- ] )
107-
108- function isKnownDevDependencyPackage ( packageName : string ) : boolean {
109- const normalized = packageName . toLowerCase ( )
110- if ( normalized . startsWith ( '@types/' ) ) {
111- return true
112- }
113- // Match scoped packages by name segment, e.g. @scope/eslint-config
114- const namePart = normalized . includes ( '/' ) ? normalized . split ( '/' ) . pop ( ) : normalized
115- if ( ! namePart ) return false
116-
117- return (
118- KNOWN_DEV_DEPENDENCY_PACKAGES . has ( normalized ) ||
119- KNOWN_DEV_DEPENDENCY_PACKAGES . has ( namePart ) ||
120- normalized . startsWith ( '@typescript-eslint/' ) ||
121- namePart . startsWith ( 'eslint-' ) ||
122- namePart . startsWith ( 'prettier-' ) ||
123- namePart . startsWith ( 'vite-' ) ||
124- namePart . startsWith ( 'webpack-' ) ||
125- namePart . startsWith ( 'babel-' )
126- )
127- }
128-
129- function escapeRegExp ( text : string ) : string {
130- return text . replace ( / [ . * + ? ^ $ { } ( ) | [ \] \\ ] / g, '\\$&' )
131- }
132-
133- function hasReadmeDevInstallHint ( packageName : string , readmeHtml ?: string | null ) : boolean {
134- if ( ! readmeHtml ) return false
135-
136- const escapedName = escapeRegExp ( packageName )
137- const escapedNpmName = escapeRegExp ( `npm:${ packageName } ` )
138- const packageSpec = `(?:${ escapedName } |${ escapedNpmName } )(?:@[\\w.-]+)?`
139-
140- const patterns = [
141- // npm install -D pkg / pnpm add --save-dev pkg
142- new RegExp (
143- String . raw `(?:npm|pnpm|yarn|bun|vlt)\s+(?:install|add|i)\s+(?:--save-dev|--dev|-d)\s+${ packageSpec } ` ,
144- 'i' ,
145- ) ,
146- // npm install pkg --save-dev / pnpm add pkg -D
147- new RegExp (
148- String . raw `(?:npm|pnpm|yarn|bun|vlt)\s+(?:install|add|i)\s+${ packageSpec } \s+(?:--save-dev|--dev|-d)` ,
149- 'i' ,
150- ) ,
151- // deno add -D npm:pkg
152- new RegExp ( String . raw `deno\s+add\s+(?:--dev|-d)\s+${ packageSpec } ` , 'i' ) ,
153- ]
154-
155- return patterns . some ( pattern => pattern . test ( readmeHtml ) )
156- }
157-
158- export function getDevDependencySuggestion (
159- packageName : string ,
160- readmeHtml ?: string | null ,
161- ) : DevDependencySuggestion {
162- if ( isKnownDevDependencyPackage ( packageName ) ) {
163- return {
164- recommended : true ,
165- reason : 'known-package' ,
166- }
167- }
168-
169- if ( hasReadmeDevInstallHint ( packageName , readmeHtml ) ) {
170- return {
171- recommended : true ,
172- reason : 'readme-hint' ,
173- }
174- }
175-
176- return { recommended : false }
177- }
178-
17974export function getDevDependencyFlag ( packageManager : PackageManagerId ) : '-D' | '-d' {
18075 return packageManager === 'bun' ? '-d' : '-D'
18176}
0 commit comments