entkapp 5.2.2 → 5.2.4
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 +1 -2
- package/entkapp/config.json +1 -12
- package/package.json +1 -1
- package/schema.json +69 -0
- package/src/plugins/PluginRegistry.js +6 -101
- package/src/plugins/ecosystems/UltimateBundle.js +1173 -159
|
@@ -1,168 +1,1182 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* ============================================================================
|
|
3
|
-
*
|
|
3
|
+
* Ultimate Ecosystem Bundle for entkapp v5.2.2
|
|
4
4
|
* ============================================================================
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* For the full plugin list, see:
|
|
9
|
-
* - ModernFrameworks.js (React, Vue, Svelte, Angular, Preact, Solid, Qwik, Lit)
|
|
10
|
-
* - GenericPlugins.js (Nuxt, Remix, SvelteKit, Astro, VitePress, Gatsby, Redwood)
|
|
11
|
-
* - BackendServices.js (GraphQL, Apollo, Prisma, Drizzle, Mongoose, Supabase, Firebase, Clerk, tRPC)
|
|
12
|
-
* - MorePlugins.js (Build tools, CSS, Linting, Testing, CI, Dev environment)
|
|
13
|
-
* - NewPlugins.js (State, Routing, UI, Animation, Validation, i18n, Monitoring, Backend)
|
|
14
|
-
* - NextJsPlugin.js (Next.js)
|
|
15
|
-
* - TypeScriptPlugin.js (TypeScript)
|
|
5
|
+
* Combined support for ALL frameworks, libraries, and tools.
|
|
6
|
+
* Consolidated from the entire entkapp ecosystem.
|
|
16
7
|
*/
|
|
8
|
+
import path from 'path';
|
|
9
|
+
import fs from 'fs/promises';
|
|
10
|
+
import { BasePlugin } from '../BasePlugin.js';
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
export class GraphQLPlugin extends BasePlugin {
|
|
14
|
+
get name() { return 'graphql'; }
|
|
15
|
+
getConfigFiles() { return ['package.json', 'graphql.config.js', 'graphql.config.ts', '.graphqlconfig', 'graphql.config.yml']; }
|
|
16
|
+
getRequiredPackages() {
|
|
17
|
+
return [{ name: 'graphql', dev: false }];
|
|
18
|
+
}
|
|
19
|
+
async isActive(baseDir) {
|
|
20
|
+
try {
|
|
21
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
22
|
+
return !!(pkgJson.dependencies?.graphql || pkgJson.devDependencies?.graphql || pkgJson.dependencies?.['@apollo/client']);
|
|
23
|
+
} catch { return false; }
|
|
24
|
+
}
|
|
25
|
+
async analyze(node, filePath) {
|
|
26
|
+
const gqlPattern = /gql\s*`([\s\S]*?)`/g;
|
|
27
|
+
const matches = node.rawCode?.match(gqlPattern) || [];
|
|
28
|
+
if (matches.length > 0) node.graphqlQueries = matches;
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export class ApolloPlugin extends BasePlugin {
|
|
33
|
+
get name() { return 'apollo'; }
|
|
34
|
+
getConfigFiles() { return ['package.json', 'apollo.config.js', 'apollo.config.ts']; }
|
|
35
|
+
getRequiredPackages() {
|
|
36
|
+
return [
|
|
37
|
+
{ name: '@apollo/client', dev: false },
|
|
38
|
+
{ name: '@apollo/server', dev: false, optional: true },
|
|
39
|
+
];
|
|
40
|
+
}
|
|
41
|
+
async isActive(baseDir) {
|
|
42
|
+
try {
|
|
43
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
44
|
+
return !!(pkgJson.dependencies?.['@apollo/client'] || pkgJson.dependencies?.['@apollo/server'] ||
|
|
45
|
+
pkgJson.devDependencies?.['@apollo/client'] || pkgJson.devDependencies?.['@apollo/server']);
|
|
46
|
+
} catch { return false; }
|
|
47
|
+
}
|
|
48
|
+
async analyze(node) {
|
|
49
|
+
if (node.rawCode?.includes('ApolloClient') || node.rawCode?.includes('ApolloServer')) node.isEntry = true;
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export class DatabasePlugin extends BasePlugin {
|
|
54
|
+
get name() { return 'database'; }
|
|
55
|
+
getConfigFiles() { return ['package.json', 'prisma/schema.prisma', 'drizzle.config.ts', 'drizzle.config.js', 'ormconfig.json']; }
|
|
56
|
+
getRequiredPackages() {
|
|
57
|
+
return [
|
|
58
|
+
{ name: '@prisma/client', dev: false, optional: true },
|
|
59
|
+
{ name: 'drizzle-orm', dev: false, optional: true },
|
|
60
|
+
{ name: 'typeorm', dev: false, optional: true },
|
|
61
|
+
];
|
|
62
|
+
}
|
|
63
|
+
async analyze(node, filePath) {
|
|
64
|
+
if (node.explicitImports?.has('@prisma/client') || node.explicitImports?.has('drizzle-orm'))
|
|
65
|
+
node.usesDatabase = true;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
export class PrismaPlugin extends BasePlugin {
|
|
70
|
+
get name() { return 'prisma'; }
|
|
71
|
+
getConfigFiles() { return ['prisma/schema.prisma', 'schema.prisma']; }
|
|
72
|
+
getRequiredPackages() {
|
|
73
|
+
return [
|
|
74
|
+
{ name: '@prisma/client', dev: false },
|
|
75
|
+
{ name: 'prisma', dev: true },
|
|
76
|
+
];
|
|
77
|
+
}
|
|
78
|
+
async isActive(baseDir) {
|
|
79
|
+
for (const f of this.getConfigFiles()) {
|
|
80
|
+
try { await fs.access(path.join(baseDir, f)); return true; } catch {}
|
|
81
|
+
}
|
|
82
|
+
try {
|
|
83
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
84
|
+
return !!(pkgJson.dependencies?.['@prisma/client'] || pkgJson.devDependencies?.prisma);
|
|
85
|
+
} catch { return false; }
|
|
86
|
+
}
|
|
87
|
+
async analyze(node) {
|
|
88
|
+
if (node.rawCode?.includes('new PrismaClient()')) node.isEntry = true;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
export class DrizzlePlugin extends BasePlugin {
|
|
93
|
+
get name() { return 'drizzle'; }
|
|
94
|
+
getConfigFiles() { return ['drizzle.config.ts', 'drizzle.config.js', 'drizzle.config.mjs']; }
|
|
95
|
+
getRequiredPackages() {
|
|
96
|
+
return [
|
|
97
|
+
{ name: 'drizzle-orm', dev: false },
|
|
98
|
+
{ name: 'drizzle-kit', dev: true },
|
|
99
|
+
];
|
|
100
|
+
}
|
|
101
|
+
async isActive(baseDir) {
|
|
102
|
+
for (const f of this.getConfigFiles()) {
|
|
103
|
+
try { await fs.access(path.join(baseDir, f)); return true; } catch {}
|
|
104
|
+
}
|
|
105
|
+
try {
|
|
106
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
107
|
+
return !!(pkgJson.dependencies?.['drizzle-orm'] || pkgJson.devDependencies?.['drizzle-orm']);
|
|
108
|
+
} catch { return false; }
|
|
109
|
+
}
|
|
110
|
+
async analyze(node) {
|
|
111
|
+
if (node.rawCode?.includes('drizzle(')) node.isEntry = true;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
export class MongoosePlugin extends BasePlugin {
|
|
116
|
+
get name() { return 'mongoose'; }
|
|
117
|
+
getConfigFiles() { return ['package.json']; }
|
|
118
|
+
getRequiredPackages() {
|
|
119
|
+
return [{ name: 'mongoose', dev: false }];
|
|
120
|
+
}
|
|
121
|
+
async isActive(baseDir) {
|
|
122
|
+
try {
|
|
123
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
124
|
+
return !!(pkgJson.dependencies?.mongoose || pkgJson.devDependencies?.mongoose);
|
|
125
|
+
} catch { return false; }
|
|
126
|
+
}
|
|
127
|
+
async analyze(node) {
|
|
128
|
+
if (node.rawCode?.includes('mongoose.model(')) node.isEntry = true;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
export class SupabasePlugin extends BasePlugin {
|
|
133
|
+
get name() { return 'supabase'; }
|
|
134
|
+
getConfigFiles() { return ['supabase/config.toml', '.env', '.env.local', 'package.json']; }
|
|
135
|
+
getRequiredPackages() {
|
|
136
|
+
return [{ name: '@supabase/supabase-js', dev: false }];
|
|
137
|
+
}
|
|
138
|
+
async isActive(baseDir) {
|
|
139
|
+
try {
|
|
140
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
141
|
+
return !!(pkgJson.dependencies?.['@supabase/supabase-js'] || pkgJson.devDependencies?.['@supabase/supabase-js']);
|
|
142
|
+
} catch { return false; }
|
|
143
|
+
}
|
|
144
|
+
async analyze(node) {
|
|
145
|
+
if (node.rawCode?.includes('createClient') && node.rawCode?.includes('supabase')) node.isEntry = true;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
export class FirebasePlugin extends BasePlugin {
|
|
150
|
+
get name() { return 'firebase'; }
|
|
151
|
+
getConfigFiles() { return ['firebase.json', '.firebaserc', 'package.json']; }
|
|
152
|
+
getRequiredPackages() {
|
|
153
|
+
return [{ name: 'firebase', dev: false }];
|
|
154
|
+
}
|
|
155
|
+
async isActive(baseDir) {
|
|
156
|
+
for (const f of ['firebase.json', '.firebaserc']) {
|
|
157
|
+
try { await fs.access(path.join(baseDir, f)); return true; } catch {}
|
|
158
|
+
}
|
|
159
|
+
try {
|
|
160
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
161
|
+
return !!(pkgJson.dependencies?.firebase || pkgJson.devDependencies?.firebase);
|
|
162
|
+
} catch { return false; }
|
|
163
|
+
}
|
|
164
|
+
async analyze(node) {
|
|
165
|
+
if (node.rawCode?.includes('initializeApp') && node.rawCode?.includes('firebase')) node.isEntry = true;
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export class ClerkPlugin extends BasePlugin {
|
|
170
|
+
get name() { return 'clerk'; }
|
|
171
|
+
getConfigFiles() { return ['package.json', '.env', '.env.local']; }
|
|
172
|
+
getRequiredPackages() {
|
|
173
|
+
return [{ name: '@clerk/nextjs', dev: false, optional: true }, { name: '@clerk/clerk-react', dev: false, optional: true }];
|
|
174
|
+
}
|
|
175
|
+
async isActive(baseDir) {
|
|
176
|
+
try {
|
|
177
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
178
|
+
const allDeps = { ...(pkgJson.dependencies || {}), ...(pkgJson.devDependencies || {}) };
|
|
179
|
+
return Object.keys(allDeps).some(k => k.startsWith('@clerk/'));
|
|
180
|
+
} catch { return false; }
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export class TRPCPlugin extends BasePlugin {
|
|
185
|
+
get name() { return 'trpc'; }
|
|
186
|
+
getConfigFiles() { return ['package.json']; }
|
|
187
|
+
getRequiredPackages() {
|
|
188
|
+
return [{ name: '@trpc/server', dev: false }, { name: '@trpc/client', dev: false }];
|
|
189
|
+
}
|
|
190
|
+
async isActive(baseDir) {
|
|
191
|
+
try {
|
|
192
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
193
|
+
const allDeps = { ...(pkgJson.dependencies || {}), ...(pkgJson.devDependencies || {}) };
|
|
194
|
+
return Object.keys(allDeps).some(k => k.startsWith('@trpc/'));
|
|
195
|
+
} catch { return false; }
|
|
196
|
+
}
|
|
197
|
+
getRequiredSystemContracts() { return ['router', 'procedure', 'createTRPCRouter']; }
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
export class NuxtPlugin extends BasePlugin {
|
|
201
|
+
get name() { return 'nuxt'; }
|
|
202
|
+
getConfigFiles() { return ['nuxt.config.js', 'nuxt.config.ts']; }
|
|
203
|
+
getRequiredPackages() { return [{ name: 'nuxt', dev: false }]; }
|
|
204
|
+
getRoutePatterns() {
|
|
205
|
+
return [/\/pages\//, /\/server\/(api|routes|middleware)\//, /\/components\/[a-zA-Z0-9_\-\/]+\.vue$/];
|
|
206
|
+
}
|
|
207
|
+
getRequiredSystemContracts() { return ['default']; }
|
|
208
|
+
async isActive(baseDir) {
|
|
209
|
+
for (const file of this.getConfigFiles()) {
|
|
210
|
+
try { await fs.access(path.join(baseDir, file)); return true; } catch {}
|
|
211
|
+
}
|
|
212
|
+
return false;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
export class RemixPlugin extends BasePlugin {
|
|
217
|
+
get name() { return 'remix'; }
|
|
218
|
+
getConfigFiles() { return ['remix.config.js', 'vite.config.js', 'vite.config.ts']; }
|
|
219
|
+
getRequiredPackages() {
|
|
220
|
+
return [
|
|
221
|
+
{ name: '@remix-run/react', dev: false },
|
|
222
|
+
{ name: '@remix-run/node', dev: false, optional: true },
|
|
223
|
+
];
|
|
224
|
+
}
|
|
225
|
+
getRoutePatterns() { return [/\/app\/routes\//, /\/app\/root\.(tsx|jsx)$/]; }
|
|
226
|
+
getRequiredSystemContracts() { return ['default', 'loader', 'action', 'meta', 'links']; }
|
|
227
|
+
async isActive(baseDir) {
|
|
228
|
+
for (const file of this.getConfigFiles()) {
|
|
229
|
+
try {
|
|
230
|
+
const content = await fs.readFile(path.join(baseDir, file), 'utf8');
|
|
231
|
+
if (content.includes('@remix-run/') || content.includes('remix')) return true;
|
|
232
|
+
} catch {}
|
|
233
|
+
}
|
|
234
|
+
return false;
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export class SvelteKitPlugin extends BasePlugin {
|
|
239
|
+
get name() { return 'sveltekit'; }
|
|
240
|
+
getConfigFiles() { return ['svelte.config.js', 'vite.config.ts']; }
|
|
241
|
+
getRequiredPackages() {
|
|
242
|
+
return [
|
|
243
|
+
{ name: '@sveltejs/kit', dev: false },
|
|
244
|
+
{ name: 'svelte', dev: false },
|
|
245
|
+
];
|
|
246
|
+
}
|
|
247
|
+
getRoutePatterns() {
|
|
248
|
+
return [/\+page\.(svelte|ts|js)$/, /\+page\.server\.(ts|js)$/, /\+layout\.(svelte|ts|js)$/, /\+server\.(ts|js)$/];
|
|
249
|
+
}
|
|
250
|
+
getRequiredSystemContracts() { return ['load', 'actions', 'GET', 'POST', 'PUT', 'DELETE', 'PATCH']; }
|
|
251
|
+
async isActive(baseDir) {
|
|
252
|
+
try { await fs.access(path.join(baseDir, 'svelte.config.js')); return true; } catch { return false; }
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
export class AstroPlugin extends BasePlugin {
|
|
257
|
+
get name() { return 'astro'; }
|
|
258
|
+
getConfigFiles() { return ['astro.config.mjs', 'astro.config.cjs', 'astro.config.ts']; }
|
|
259
|
+
getRequiredPackages() { return [{ name: 'astro', dev: false }]; }
|
|
260
|
+
getRoutePatterns() { return [/\/src\/pages\/.*\.astro$/, /\/src\/pages\/.*\.(ts|js)$/]; }
|
|
261
|
+
getRequiredSystemContracts() { return ['default', 'getStaticPaths']; }
|
|
262
|
+
async isActive(baseDir) {
|
|
263
|
+
for (const file of this.getConfigFiles()) {
|
|
264
|
+
try { await fs.access(path.join(baseDir, file)); return true; } catch {}
|
|
265
|
+
}
|
|
266
|
+
return false;
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export class VitepressPlugin extends BasePlugin {
|
|
271
|
+
get name() { return 'vitepress'; }
|
|
272
|
+
getConfigFiles() { return ['package.json']; }
|
|
273
|
+
getRequiredPackages() { return [{ name: 'vitepress', dev: true }]; }
|
|
274
|
+
async isActive(baseDir) {
|
|
275
|
+
try {
|
|
276
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
277
|
+
const hasDep = !!(pkgJson.dependencies?.vitepress || pkgJson.devDependencies?.vitepress);
|
|
278
|
+
const possibleDirs = ['.vitepress', 'docs/.vitepress', '.docs/.vitepress'];
|
|
279
|
+
for (const d of possibleDirs) {
|
|
280
|
+
try { await fs.access(path.join(baseDir, d)); return true; } catch {}
|
|
281
|
+
}
|
|
282
|
+
return hasDep;
|
|
283
|
+
} catch { return false; }
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
export class GatsbyPlugin extends BasePlugin {
|
|
288
|
+
get name() { return 'gatsby'; }
|
|
289
|
+
getConfigFiles() { return ['gatsby-config.js', 'gatsby-config.ts', 'gatsby-node.js', 'gatsby-node.ts']; }
|
|
290
|
+
getRequiredPackages() { return [{ name: 'gatsby', dev: false }]; }
|
|
291
|
+
getRoutePatterns() { return [/\/src\/pages\//, /\/src\/templates\//]; }
|
|
292
|
+
getRequiredSystemContracts() { return ['default', 'getServerData', 'config']; }
|
|
293
|
+
async isActive(baseDir) {
|
|
294
|
+
for (const file of this.getConfigFiles()) {
|
|
295
|
+
try { await fs.access(path.join(baseDir, file)); return true; } catch {}
|
|
296
|
+
}
|
|
297
|
+
return false;
|
|
298
|
+
}
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
export class RedwoodPlugin extends BasePlugin {
|
|
302
|
+
get name() { return 'redwood'; }
|
|
303
|
+
getConfigFiles() { return ['redwood.toml']; }
|
|
304
|
+
getRequiredPackages() { return [{ name: '@redwoodjs/core', dev: true }]; }
|
|
305
|
+
async isActive(baseDir) {
|
|
306
|
+
try { await fs.access(path.join(baseDir, 'redwood.toml')); return true; } catch { return false; }
|
|
307
|
+
}
|
|
308
|
+
getRoutePatterns() { return [/\/web\/src\/pages\//, /\/api\/src\/functions\//]; }
|
|
309
|
+
}
|
|
310
|
+
|
|
311
|
+
export class NextJsPlugin extends BasePlugin {
|
|
312
|
+
get name() { return 'next'; }
|
|
313
|
+
getConfigFiles() { return ['next.config.js', 'next.config.mjs', 'next.config.ts', 'next-env.d.ts']; }
|
|
314
|
+
getRequiredPackages() { return [{ name: 'next', dev: false }]; }
|
|
315
|
+
getRoutePatterns() {
|
|
316
|
+
return [/\/app\/.*\/page\.(tsx|jsx)$/, /\/pages\/.*\.tsx$/, /\/app\/.*\/layout\.(tsx|jsx)$/];
|
|
317
|
+
}
|
|
318
|
+
async isActive(baseDir) {
|
|
319
|
+
for (const file of this.getConfigFiles()) {
|
|
320
|
+
try { await fs.access(path.join(baseDir, file)); return true; } catch {}
|
|
321
|
+
}
|
|
322
|
+
return false;
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
export class ReactPlugin extends BasePlugin {
|
|
327
|
+
get name() { return 'react'; }
|
|
328
|
+
getConfigFiles() { return ['package.json']; }
|
|
329
|
+
getRequiredPackages() {
|
|
330
|
+
return [
|
|
331
|
+
{ name: 'react', dev: false },
|
|
332
|
+
{ name: 'react-dom', dev: false },
|
|
333
|
+
];
|
|
334
|
+
}
|
|
335
|
+
async isActive(baseDir) {
|
|
336
|
+
try {
|
|
337
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
338
|
+
return !!(pkgJson.dependencies?.react || pkgJson.devDependencies?.react);
|
|
339
|
+
} catch { return false; }
|
|
340
|
+
}
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
export class VuePlugin extends BasePlugin {
|
|
344
|
+
get name() { return 'vue'; }
|
|
345
|
+
getConfigFiles() { return ['package.json', 'vue.config.js', 'vite.config.ts', 'vite.config.js']; }
|
|
346
|
+
getRequiredPackages() {
|
|
347
|
+
return [{ name: 'vue', dev: false }];
|
|
348
|
+
}
|
|
349
|
+
async isActive(baseDir) {
|
|
350
|
+
try {
|
|
351
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
352
|
+
return !!(pkgJson.dependencies?.vue || pkgJson.devDependencies?.vue);
|
|
353
|
+
} catch { return false; }
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
export class SveltePlugin extends BasePlugin {
|
|
358
|
+
get name() { return 'svelte'; }
|
|
359
|
+
getConfigFiles() { return ['package.json', 'svelte.config.js']; }
|
|
360
|
+
getRequiredPackages() {
|
|
361
|
+
return [{ name: 'svelte', dev: false }];
|
|
362
|
+
}
|
|
363
|
+
async isActive(baseDir) {
|
|
364
|
+
try {
|
|
365
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
366
|
+
return !!(pkgJson.dependencies?.svelte || pkgJson.devDependencies?.svelte);
|
|
367
|
+
} catch { return false; }
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
export class AngularPlugin extends BasePlugin {
|
|
372
|
+
get name() { return 'angular'; }
|
|
373
|
+
getConfigFiles() { return ['package.json', 'angular.json']; }
|
|
374
|
+
getRequiredPackages() {
|
|
375
|
+
return [
|
|
376
|
+
{ name: '@angular/core', dev: false },
|
|
377
|
+
{ name: '@angular/common', dev: false },
|
|
378
|
+
];
|
|
379
|
+
}
|
|
380
|
+
async isActive(baseDir) {
|
|
381
|
+
try {
|
|
382
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
383
|
+
return !!(pkgJson.dependencies?.['@angular/core'] || pkgJson.devDependencies?.['@angular/core']);
|
|
384
|
+
} catch { return false; }
|
|
385
|
+
}
|
|
386
|
+
}
|
|
387
|
+
|
|
388
|
+
export class PreactPlugin extends BasePlugin {
|
|
389
|
+
get name() { return 'preact'; }
|
|
390
|
+
getConfigFiles() { return ['package.json']; }
|
|
391
|
+
getRequiredPackages() { return [{ name: 'preact', dev: false }]; }
|
|
392
|
+
async isActive(baseDir) {
|
|
393
|
+
try {
|
|
394
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
395
|
+
return !!(pkgJson.dependencies?.preact || pkgJson.devDependencies?.preact);
|
|
396
|
+
} catch { return false; }
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
export class SolidPlugin extends BasePlugin {
|
|
401
|
+
get name() { return 'solid'; }
|
|
402
|
+
getConfigFiles() { return ['package.json', 'vite.config.ts', 'vite.config.js']; }
|
|
403
|
+
getRequiredPackages() { return [{ name: 'solid-js', dev: false }]; }
|
|
404
|
+
async isActive(baseDir) {
|
|
405
|
+
try {
|
|
406
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
407
|
+
return !!(pkgJson.dependencies?.['solid-js'] || pkgJson.devDependencies?.['solid-js']);
|
|
408
|
+
} catch { return false; }
|
|
409
|
+
}
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
export class QwikPlugin extends BasePlugin {
|
|
413
|
+
get name() { return 'qwik'; }
|
|
414
|
+
getConfigFiles() { return ['package.json', 'vite.config.ts']; }
|
|
415
|
+
getRequiredPackages() { return [{ name: '@builder.io/qwik', dev: false }]; }
|
|
416
|
+
async isActive(baseDir) {
|
|
417
|
+
try {
|
|
418
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
419
|
+
return !!(pkgJson.dependencies?.['@builder.io/qwik'] || pkgJson.devDependencies?.['@builder.io/qwik']);
|
|
420
|
+
} catch { return false; }
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
export class LitPlugin extends BasePlugin {
|
|
425
|
+
get name() { return 'lit'; }
|
|
426
|
+
getConfigFiles() { return ['package.json']; }
|
|
427
|
+
getRequiredPackages() { return [{ name: 'lit', dev: false }]; }
|
|
428
|
+
async isActive(baseDir) {
|
|
429
|
+
try {
|
|
430
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
431
|
+
return !!(pkgJson.dependencies?.lit || pkgJson.devDependencies?.lit);
|
|
432
|
+
} catch { return false; }
|
|
433
|
+
}
|
|
434
|
+
}
|
|
435
|
+
|
|
436
|
+
export class VitePlugin extends BasePlugin {
|
|
437
|
+
get name() { return 'vite'; }
|
|
438
|
+
getConfigFiles() { return ['vite.config.js', 'vite.config.ts', 'vite.config.mjs', 'vite.config.cjs', 'vite-env.d.ts']; }
|
|
439
|
+
getRequiredPackages() { return [{ name: 'vite', dev: true }]; }
|
|
440
|
+
async isActive(baseDir) {
|
|
441
|
+
for (const f of this.getConfigFiles()) {
|
|
442
|
+
try { await fs.access(path.join(baseDir, f)); return true; } catch {}
|
|
443
|
+
}
|
|
444
|
+
return false;
|
|
445
|
+
}
|
|
446
|
+
}
|
|
447
|
+
|
|
448
|
+
export class EsbuildPlugin extends BasePlugin {
|
|
449
|
+
get name() { return 'esbuild'; }
|
|
450
|
+
getConfigFiles() { return ['esbuild.config.js', 'esbuild.config.mjs', 'esbuild.config.ts']; }
|
|
451
|
+
getRequiredPackages() { return [{ name: 'esbuild', dev: true }]; }
|
|
452
|
+
async isActive(baseDir) {
|
|
453
|
+
for (const f of this.getConfigFiles()) {
|
|
454
|
+
try { await fs.access(path.join(baseDir, f)); return true; } catch {}
|
|
455
|
+
}
|
|
456
|
+
return false;
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
|
|
460
|
+
export class RollupPlugin extends BasePlugin {
|
|
461
|
+
get name() { return 'rollup'; }
|
|
462
|
+
getConfigFiles() { return ['rollup.config.js', 'rollup.config.mjs', 'rollup.config.ts']; }
|
|
463
|
+
getRequiredPackages() { return [{ name: 'rollup', dev: true }]; }
|
|
464
|
+
async isActive(baseDir) {
|
|
465
|
+
for (const f of this.getConfigFiles()) {
|
|
466
|
+
try { await fs.access(path.join(baseDir, f)); return true; } catch {}
|
|
467
|
+
}
|
|
468
|
+
return false;
|
|
469
|
+
}
|
|
470
|
+
}
|
|
471
|
+
|
|
472
|
+
export class WebpackPlugin extends BasePlugin {
|
|
473
|
+
get name() { return 'webpack'; }
|
|
474
|
+
getConfigFiles() { return ['webpack.config.js', 'webpack.config.ts', 'webpack.config.mjs', 'webpack.config.cjs']; }
|
|
475
|
+
getRequiredPackages() { return [{ name: 'webpack', dev: true }]; }
|
|
476
|
+
async isActive(baseDir) {
|
|
477
|
+
for (const f of this.getConfigFiles()) {
|
|
478
|
+
try { await fs.access(path.join(baseDir, f)); return true; } catch {}
|
|
479
|
+
}
|
|
480
|
+
return false;
|
|
481
|
+
}
|
|
482
|
+
}
|
|
483
|
+
|
|
484
|
+
export class ParcelPlugin extends BasePlugin {
|
|
485
|
+
get name() { return 'parcel'; }
|
|
486
|
+
getConfigFiles() { return ['.parcelrc', '.parcelrc.json']; }
|
|
487
|
+
getRequiredPackages() { return [{ name: 'parcel', dev: true }]; }
|
|
488
|
+
async isActive(baseDir) {
|
|
489
|
+
for (const f of this.getConfigFiles()) {
|
|
490
|
+
try { await fs.access(path.join(baseDir, f)); return true; } catch {}
|
|
491
|
+
}
|
|
492
|
+
return false;
|
|
493
|
+
}
|
|
494
|
+
}
|
|
495
|
+
|
|
496
|
+
export class TurboPlugin extends BasePlugin {
|
|
497
|
+
get name() { return 'turbo'; }
|
|
498
|
+
getConfigFiles() { return ['turbo.json']; }
|
|
499
|
+
getRequiredPackages() { return [{ name: 'turbo', dev: true }]; }
|
|
500
|
+
async isActive(baseDir) {
|
|
501
|
+
try { await fs.access(path.join(baseDir, 'turbo.json')); return true; } catch { return false; }
|
|
502
|
+
}
|
|
503
|
+
}
|
|
504
|
+
|
|
505
|
+
export class NxPlugin extends BasePlugin {
|
|
506
|
+
get name() { return 'nx'; }
|
|
507
|
+
getConfigFiles() { return ['nx.json', 'workspace.json']; }
|
|
508
|
+
getRequiredPackages() { return [{ name: 'nx', dev: true }]; }
|
|
509
|
+
async isActive(baseDir) {
|
|
510
|
+
try { await fs.access(path.join(baseDir, 'nx.json')); return true; } catch { return false; }
|
|
511
|
+
}
|
|
512
|
+
}
|
|
513
|
+
|
|
514
|
+
export class TailwindPlugin extends BasePlugin {
|
|
515
|
+
get name() { return 'tailwind'; }
|
|
516
|
+
getConfigFiles() { return ['tailwind.config.js', 'tailwind.config.ts', 'tailwind.config.mjs', 'tailwind.config.cjs']; }
|
|
517
|
+
getRequiredPackages() { return [{ name: 'tailwindcss', dev: true }]; }
|
|
518
|
+
async isActive(baseDir) {
|
|
519
|
+
for (const f of this.getConfigFiles()) {
|
|
520
|
+
try { await fs.access(path.join(baseDir, f)); return true; } catch {}
|
|
521
|
+
}
|
|
522
|
+
return false;
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
export class PostcssPlugin extends BasePlugin {
|
|
527
|
+
get name() { return 'postcss'; }
|
|
528
|
+
getConfigFiles() { return ['postcss.config.js', 'postcss.config.cjs', 'postcss.config.mjs', 'postcss.config.ts', '.postcssrc']; }
|
|
529
|
+
getRequiredPackages() { return [{ name: 'postcss', dev: true }]; }
|
|
530
|
+
async isActive(baseDir) {
|
|
531
|
+
for (const f of this.getConfigFiles()) {
|
|
532
|
+
try { await fs.access(path.join(baseDir, f)); return true; } catch {}
|
|
533
|
+
}
|
|
534
|
+
return false;
|
|
535
|
+
}
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
export class UnoCSSPlugin extends BasePlugin {
|
|
539
|
+
get name() { return 'unocss'; }
|
|
540
|
+
getConfigFiles() { return ['uno.config.ts', 'uno.config.js']; }
|
|
541
|
+
getRequiredPackages() { return [{ name: 'unocss', dev: true }]; }
|
|
542
|
+
async isActive(baseDir) {
|
|
543
|
+
for (const f of this.getConfigFiles()) {
|
|
544
|
+
try { await fs.access(path.join(baseDir, f)); return true; } catch {}
|
|
545
|
+
}
|
|
546
|
+
return false;
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
|
|
550
|
+
export class StylelintPlugin extends BasePlugin {
|
|
551
|
+
get name() { return 'stylelint'; }
|
|
552
|
+
getConfigFiles() { return ['.stylelintrc', 'stylelint.config.js']; }
|
|
553
|
+
getRequiredPackages() { return [{ name: 'stylelint', dev: true }]; }
|
|
554
|
+
async isActive(baseDir) {
|
|
555
|
+
for (const f of this.getConfigFiles()) {
|
|
556
|
+
try { await fs.access(path.join(baseDir, f)); return true; } catch {}
|
|
557
|
+
}
|
|
558
|
+
return false;
|
|
559
|
+
}
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
export class EslintPlugin extends BasePlugin {
|
|
563
|
+
get name() { return 'eslint'; }
|
|
564
|
+
getConfigFiles() { return ['.eslintrc', 'eslint.config.js']; }
|
|
565
|
+
getRequiredPackages() { return [{ name: 'eslint', dev: true }]; }
|
|
566
|
+
async isActive(baseDir) {
|
|
567
|
+
for (const f of this.getConfigFiles()) {
|
|
568
|
+
try { await fs.access(path.join(baseDir, f)); return true; } catch {}
|
|
569
|
+
}
|
|
570
|
+
return false;
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
|
|
574
|
+
export class PrettierPlugin extends BasePlugin {
|
|
575
|
+
get name() { return 'prettier'; }
|
|
576
|
+
getConfigFiles() { return ['.prettierrc', 'prettier.config.js']; }
|
|
577
|
+
getRequiredPackages() { return [{ name: 'prettier', dev: true }]; }
|
|
578
|
+
async isActive(baseDir) {
|
|
579
|
+
for (const f of this.getConfigFiles()) {
|
|
580
|
+
try { await fs.access(path.join(baseDir, f)); return true; } catch {}
|
|
581
|
+
}
|
|
582
|
+
return false;
|
|
583
|
+
}
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
export class BiomePlugin extends BasePlugin {
|
|
587
|
+
get name() { return 'biome'; }
|
|
588
|
+
getConfigFiles() { return ['biome.json']; }
|
|
589
|
+
getRequiredPackages() { return [{ name: '@biomejs/biome', dev: true }]; }
|
|
590
|
+
async isActive(baseDir) {
|
|
591
|
+
try { await fs.access(path.join(baseDir, 'biome.json')); return true; } catch { return false; }
|
|
592
|
+
}
|
|
593
|
+
}
|
|
594
|
+
|
|
595
|
+
export class OxlintPlugin extends BasePlugin {
|
|
596
|
+
get name() { return 'oxlint'; }
|
|
597
|
+
getConfigFiles() { return ['oxlint.json']; }
|
|
598
|
+
getRequiredPackages() { return [{ name: 'oxlint', dev: true }]; }
|
|
599
|
+
async isActive(baseDir) {
|
|
600
|
+
try { await fs.access(path.join(baseDir, 'oxlint.json')); return true; } catch { return false; }
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
|
|
604
|
+
export class HuskyPlugin extends BasePlugin {
|
|
605
|
+
get name() { return 'husky'; }
|
|
606
|
+
getConfigFiles() { return ['.husky/pre-commit']; }
|
|
607
|
+
getRequiredPackages() { return [{ name: 'husky', dev: true }]; }
|
|
608
|
+
async isActive(baseDir) {
|
|
609
|
+
try { await fs.access(path.join(baseDir, '.husky/pre-commit')); return true; } catch { return false; }
|
|
610
|
+
}
|
|
611
|
+
}
|
|
612
|
+
|
|
613
|
+
export class LintStagedPlugin extends BasePlugin {
|
|
614
|
+
get name() { return 'lint-staged'; }
|
|
615
|
+
getConfigFiles() { return ['.lintstagedrc']; }
|
|
616
|
+
getRequiredPackages() { return [{ name: 'lint-staged', dev: true }]; }
|
|
617
|
+
async isActive(baseDir) {
|
|
618
|
+
try { await fs.access(path.join(baseDir, '.lintstagedrc')); return true; } catch { return false; }
|
|
619
|
+
}
|
|
620
|
+
}
|
|
621
|
+
|
|
622
|
+
export class CommitlintPlugin extends BasePlugin {
|
|
623
|
+
get name() { return 'commitlint'; }
|
|
624
|
+
getConfigFiles() { return ['commitlint.config.js']; }
|
|
625
|
+
getRequiredPackages() { return [{ name: '@commitlint/cli', dev: true }]; }
|
|
626
|
+
async isActive(baseDir) {
|
|
627
|
+
try { await fs.access(path.join(baseDir, 'commitlint.config.js')); return true; } catch { return false; }
|
|
628
|
+
}
|
|
629
|
+
}
|
|
630
|
+
|
|
631
|
+
export class ChangesetPlugin extends BasePlugin {
|
|
632
|
+
get name() { return 'changeset'; }
|
|
633
|
+
getConfigFiles() { return ['.changeset/config.json']; }
|
|
634
|
+
getRequiredPackages() { return [{ name: '@changesets/cli', dev: true }]; }
|
|
635
|
+
async isActive(baseDir) {
|
|
636
|
+
try { await fs.access(path.join(baseDir, '.changeset/config.json')); return true; } catch { return false; }
|
|
637
|
+
}
|
|
638
|
+
}
|
|
639
|
+
|
|
640
|
+
export class BabelPlugin extends BasePlugin {
|
|
641
|
+
get name() { return 'babel'; }
|
|
642
|
+
getConfigFiles() { return ['.babelrc', 'babel.config.js']; }
|
|
643
|
+
getRequiredPackages() { return [{ name: '@babel/core', dev: true }]; }
|
|
644
|
+
async isActive(baseDir) {
|
|
645
|
+
for (const f of this.getConfigFiles()) {
|
|
646
|
+
try { await fs.access(path.join(baseDir, f)); return true; } catch {}
|
|
647
|
+
}
|
|
648
|
+
return false;
|
|
649
|
+
}
|
|
650
|
+
}
|
|
651
|
+
|
|
652
|
+
export class SWCPlugin extends BasePlugin {
|
|
653
|
+
get name() { return 'swc'; }
|
|
654
|
+
getConfigFiles() { return ['.swcrc']; }
|
|
655
|
+
getRequiredPackages() { return [{ name: '@swc/core', dev: true }]; }
|
|
656
|
+
async isActive(baseDir) {
|
|
657
|
+
try { await fs.access(path.join(baseDir, '.swcrc')); return true; } catch { return false; }
|
|
658
|
+
}
|
|
659
|
+
}
|
|
660
|
+
|
|
661
|
+
export class JestPlugin extends BasePlugin {
|
|
662
|
+
get name() { return 'jest'; }
|
|
663
|
+
getConfigFiles() { return ['jest.config.js']; }
|
|
664
|
+
getRequiredPackages() { return [{ name: 'jest', dev: true }]; }
|
|
665
|
+
async isActive(baseDir) {
|
|
666
|
+
try { await fs.access(path.join(baseDir, 'jest.config.js')); return true; } catch { return false; }
|
|
667
|
+
}
|
|
668
|
+
}
|
|
669
|
+
|
|
670
|
+
export class VitestPlugin extends BasePlugin {
|
|
671
|
+
get name() { return 'vitest'; }
|
|
672
|
+
getConfigFiles() { return ['vitest.config.ts', 'vitest.config.js']; }
|
|
673
|
+
getRequiredPackages() { return [{ name: 'vitest', dev: true }]; }
|
|
674
|
+
async isActive(baseDir) {
|
|
675
|
+
for (const f of this.getConfigFiles()) {
|
|
676
|
+
try { await fs.access(path.join(baseDir, f)); return true; } catch {}
|
|
677
|
+
}
|
|
678
|
+
return false;
|
|
679
|
+
}
|
|
680
|
+
}
|
|
681
|
+
|
|
682
|
+
export class PlaywrightPlugin extends BasePlugin {
|
|
683
|
+
get name() { return 'playwright'; }
|
|
684
|
+
getConfigFiles() { return ['playwright.config.ts']; }
|
|
685
|
+
getRequiredPackages() { return [{ name: '@playwright/test', dev: true }]; }
|
|
686
|
+
async isActive(baseDir) {
|
|
687
|
+
try { await fs.access(path.join(baseDir, 'playwright.config.ts')); return true; } catch { return false; }
|
|
688
|
+
}
|
|
689
|
+
}
|
|
690
|
+
|
|
691
|
+
export class CypressPlugin extends BasePlugin {
|
|
692
|
+
get name() { return 'cypress'; }
|
|
693
|
+
getConfigFiles() { return ['cypress.config.ts']; }
|
|
694
|
+
getRequiredPackages() { return [{ name: 'cypress', dev: true }]; }
|
|
695
|
+
async isActive(baseDir) {
|
|
696
|
+
try { await fs.access(path.join(baseDir, 'cypress.config.ts')); return true; } catch { return false; }
|
|
697
|
+
}
|
|
698
|
+
}
|
|
699
|
+
|
|
700
|
+
export class StorybookPlugin extends BasePlugin {
|
|
701
|
+
get name() { return 'storybook'; }
|
|
702
|
+
getConfigFiles() { return ['.storybook/main.js']; }
|
|
703
|
+
getRequiredPackages() { return [{ name: 'storybook', dev: true }]; }
|
|
704
|
+
async isActive(baseDir) {
|
|
705
|
+
try { await fs.access(path.join(baseDir, '.storybook/main.js')); return true; } catch { return false; }
|
|
706
|
+
}
|
|
707
|
+
}
|
|
708
|
+
|
|
709
|
+
export class MswPlugin extends BasePlugin {
|
|
710
|
+
get name() { return 'msw'; }
|
|
711
|
+
getRequiredPackages() { return [{ name: 'msw', dev: true }]; }
|
|
712
|
+
async isActive(baseDir) {
|
|
713
|
+
try {
|
|
714
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
715
|
+
return !!(pkgJson.devDependencies?.msw);
|
|
716
|
+
} catch { return false; }
|
|
717
|
+
}
|
|
718
|
+
}
|
|
719
|
+
|
|
720
|
+
export class GithubActionsPlugin extends BasePlugin {
|
|
721
|
+
get name() { return 'github-actions'; }
|
|
722
|
+
async isActive(baseDir) {
|
|
723
|
+
try { await fs.access(path.join(baseDir, '.github/workflows')); return true; } catch { return false; }
|
|
724
|
+
}
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
export class DockerPlugin extends BasePlugin {
|
|
728
|
+
get name() { return 'docker'; }
|
|
729
|
+
async isActive(baseDir) {
|
|
730
|
+
try { await fs.access(path.join(baseDir, 'Dockerfile')); return true; } catch { return false; }
|
|
731
|
+
}
|
|
732
|
+
}
|
|
733
|
+
|
|
734
|
+
export class TerraformPlugin extends BasePlugin {
|
|
735
|
+
get name() { return 'terraform'; }
|
|
736
|
+
async isActive(baseDir) {
|
|
737
|
+
try { await fs.access(path.join(baseDir, 'main.tf')); return true; } catch { return false; }
|
|
738
|
+
}
|
|
739
|
+
}
|
|
740
|
+
|
|
741
|
+
export class EditorConfigPlugin extends BasePlugin {
|
|
742
|
+
get name() { return 'editorconfig'; }
|
|
743
|
+
async isActive(baseDir) {
|
|
744
|
+
try { await fs.access(path.join(baseDir, '.editorconfig')); return true; } catch { return false; }
|
|
745
|
+
}
|
|
746
|
+
}
|
|
747
|
+
|
|
748
|
+
export class NvmPlugin extends BasePlugin {
|
|
749
|
+
get name() { return 'nvm'; }
|
|
750
|
+
async isActive(baseDir) {
|
|
751
|
+
try { await fs.access(path.join(baseDir, '.nvmrc')); return true; } catch { return false; }
|
|
752
|
+
}
|
|
753
|
+
}
|
|
754
|
+
|
|
755
|
+
export class VoltaPlugin extends BasePlugin {
|
|
756
|
+
get name() { return 'volta'; }
|
|
757
|
+
async isActive(baseDir) {
|
|
758
|
+
try {
|
|
759
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
760
|
+
return !!(pkgJson.volta);
|
|
761
|
+
} catch { return false; }
|
|
762
|
+
}
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
export class DotenvPlugin extends BasePlugin {
|
|
766
|
+
get name() { return 'dotenv'; }
|
|
767
|
+
async isActive(baseDir) {
|
|
768
|
+
try { await fs.access(path.join(baseDir, '.env')); return true; } catch { return false; }
|
|
769
|
+
}
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
export class PnpmPlugin extends BasePlugin {
|
|
773
|
+
get name() { return 'pnpm'; }
|
|
774
|
+
async isActive(baseDir) {
|
|
775
|
+
try { await fs.access(path.join(baseDir, 'pnpm-lock.yaml')); return true; } catch { return false; }
|
|
776
|
+
}
|
|
777
|
+
}
|
|
778
|
+
|
|
779
|
+
export class YarnPlugin extends BasePlugin {
|
|
780
|
+
get name() { return 'yarn'; }
|
|
781
|
+
async isActive(baseDir) {
|
|
782
|
+
try { await fs.access(path.join(baseDir, 'yarn.lock')); return true; } catch { return false; }
|
|
783
|
+
}
|
|
784
|
+
}
|
|
785
|
+
|
|
786
|
+
export class BunPlugin extends BasePlugin {
|
|
787
|
+
get name() { return 'bun'; }
|
|
788
|
+
async isActive(baseDir) {
|
|
789
|
+
try { await fs.access(path.join(baseDir, 'bun.lockb')); return true; } catch { return false; }
|
|
790
|
+
}
|
|
791
|
+
}
|
|
792
|
+
|
|
793
|
+
export class SwiperPlugin extends BasePlugin {
|
|
794
|
+
get name() { return 'swiper'; }
|
|
795
|
+
getRequiredPackages() { return [{ name: 'swiper', dev: false }]; }
|
|
796
|
+
async isActive(baseDir) {
|
|
797
|
+
try {
|
|
798
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
799
|
+
return !!(pkgJson.dependencies?.swiper);
|
|
800
|
+
} catch { return false; }
|
|
801
|
+
}
|
|
802
|
+
}
|
|
803
|
+
|
|
804
|
+
export class QuillPlugin extends BasePlugin {
|
|
805
|
+
get name() { return 'quill'; }
|
|
806
|
+
getRequiredPackages() { return [{ name: 'quill', dev: false }]; }
|
|
807
|
+
async isActive(baseDir) {
|
|
808
|
+
try {
|
|
809
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
810
|
+
return !!(pkgJson.dependencies?.quill);
|
|
811
|
+
} catch { return false; }
|
|
812
|
+
}
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
export class EnvelopPlugin extends BasePlugin {
|
|
816
|
+
get name() { return 'envelop'; }
|
|
817
|
+
getRequiredPackages() { return [{ name: '@envelop/core', dev: false }]; }
|
|
818
|
+
async isActive(baseDir) {
|
|
819
|
+
try {
|
|
820
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
821
|
+
return !!(pkgJson.dependencies?.['@envelop/core']);
|
|
822
|
+
} catch { return false; }
|
|
823
|
+
}
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
export class HonoPlugin extends BasePlugin {
|
|
827
|
+
get name() { return 'hono'; }
|
|
828
|
+
getRequiredPackages() { return [{ name: 'hono', dev: false }]; }
|
|
829
|
+
async isActive(baseDir) {
|
|
830
|
+
try {
|
|
831
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
832
|
+
return !!(pkgJson.dependencies?.hono);
|
|
833
|
+
} catch { return false; }
|
|
834
|
+
}
|
|
835
|
+
}
|
|
836
|
+
|
|
837
|
+
export class ExpressPlugin extends BasePlugin {
|
|
838
|
+
get name() { return 'express'; }
|
|
839
|
+
getRequiredPackages() { return [{ name: 'express', dev: false }]; }
|
|
840
|
+
async isActive(baseDir) {
|
|
841
|
+
try {
|
|
842
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
843
|
+
return !!(pkgJson.dependencies?.express);
|
|
844
|
+
} catch { return false; }
|
|
845
|
+
}
|
|
846
|
+
}
|
|
847
|
+
|
|
848
|
+
export class FastifyPlugin extends BasePlugin {
|
|
849
|
+
get name() { return 'fastify'; }
|
|
850
|
+
getRequiredPackages() { return [{ name: 'fastify', dev: false }]; }
|
|
851
|
+
async isActive(baseDir) {
|
|
852
|
+
try {
|
|
853
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
854
|
+
return !!(pkgJson.dependencies?.fastify);
|
|
855
|
+
} catch { return false; }
|
|
856
|
+
}
|
|
857
|
+
}
|
|
858
|
+
|
|
859
|
+
export class NestJsPlugin extends BasePlugin {
|
|
860
|
+
get name() { return 'nestjs'; }
|
|
861
|
+
getRequiredPackages() { return [{ name: '@nestjs/core', dev: false }]; }
|
|
862
|
+
async isActive(baseDir) {
|
|
863
|
+
try {
|
|
864
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
865
|
+
return !!(pkgJson.dependencies?.['@nestjs/core']);
|
|
866
|
+
} catch { return false; }
|
|
867
|
+
}
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
export class KoaPlugin extends BasePlugin {
|
|
871
|
+
get name() { return 'koa'; }
|
|
872
|
+
getRequiredPackages() { return [{ name: 'koa', dev: false }]; }
|
|
873
|
+
async isActive(baseDir) {
|
|
874
|
+
try {
|
|
875
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
876
|
+
return !!(pkgJson.dependencies?.koa);
|
|
877
|
+
} catch { return false; }
|
|
878
|
+
}
|
|
879
|
+
}
|
|
880
|
+
|
|
881
|
+
export class ElysiaPlugin extends BasePlugin {
|
|
882
|
+
get name() { return 'elysia'; }
|
|
883
|
+
getRequiredPackages() { return [{ name: 'elysia', dev: false }]; }
|
|
884
|
+
async isActive(baseDir) {
|
|
885
|
+
try {
|
|
886
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
887
|
+
return !!(pkgJson.dependencies?.elysia);
|
|
888
|
+
} catch { return false; }
|
|
889
|
+
}
|
|
890
|
+
}
|
|
891
|
+
|
|
892
|
+
export class SocketIoPlugin extends BasePlugin {
|
|
893
|
+
get name() { return 'socket.io'; }
|
|
894
|
+
getRequiredPackages() { return [{ name: 'socket.io', dev: false }]; }
|
|
895
|
+
async isActive(baseDir) {
|
|
896
|
+
try {
|
|
897
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
898
|
+
return !!(pkgJson.dependencies?.['socket.io']);
|
|
899
|
+
} catch { return false; }
|
|
900
|
+
}
|
|
901
|
+
}
|
|
902
|
+
|
|
903
|
+
export class TypeScriptPlugin extends BasePlugin {
|
|
904
|
+
get name() { return 'typescript'; }
|
|
905
|
+
getConfigFiles() { return ['tsconfig.json', 'global.d.ts']; }
|
|
906
|
+
async isActive(baseDir) {
|
|
907
|
+
try { await fs.access(path.join(baseDir, 'tsconfig.json')); return true; } catch { return false; }
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
|
|
911
|
+
export class GrammyPlugin extends BasePlugin {
|
|
912
|
+
get name() { return 'grammy'; }
|
|
913
|
+
getRequiredPackages() { return [{ name: 'grammy', dev: false }]; }
|
|
914
|
+
async isActive(baseDir) {
|
|
915
|
+
try {
|
|
916
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
917
|
+
return !!(pkgJson.dependencies?.grammy);
|
|
918
|
+
} catch { return false; }
|
|
919
|
+
}
|
|
920
|
+
}
|
|
921
|
+
|
|
922
|
+
export class HapiPlugin extends BasePlugin {
|
|
923
|
+
get name() { return 'hapi'; }
|
|
924
|
+
getRequiredPackages() { return [{ name: '@hapi/hapi', dev: false }]; }
|
|
925
|
+
async isActive(baseDir) {
|
|
926
|
+
try {
|
|
927
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
928
|
+
return !!(pkgJson.dependencies?.['@hapi/hapi']);
|
|
929
|
+
} catch { return false; }
|
|
930
|
+
}
|
|
931
|
+
}
|
|
932
|
+
|
|
933
|
+
export class RTLCSSPlugin extends BasePlugin {
|
|
934
|
+
get name() { return 'rtlcss'; }
|
|
935
|
+
getConfigFiles() { return ['rtlcss.config.js']; }
|
|
936
|
+
getRequiredPackages() { return [{ name: 'rtlcss', dev: true }]; }
|
|
937
|
+
async isActive(baseDir) {
|
|
938
|
+
try { await fs.access(path.join(baseDir, 'rtlcss.config.js')); return true; } catch { return false; }
|
|
939
|
+
}
|
|
940
|
+
}
|
|
941
|
+
|
|
942
|
+
export class CKEditorEnginePlugin extends BasePlugin {
|
|
943
|
+
get name() { return 'ckeditor5-engine'; }
|
|
944
|
+
getRequiredPackages() { return [{ name: '@ckeditor/ckeditor5-engine', dev: false }]; }
|
|
945
|
+
async isActive(baseDir) {
|
|
946
|
+
try {
|
|
947
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
948
|
+
return !!(pkgJson.dependencies?.['@ckeditor/ckeditor5-engine']);
|
|
949
|
+
} catch { return false; }
|
|
950
|
+
}
|
|
951
|
+
}
|
|
952
|
+
|
|
953
|
+
export class NitroModulesPlugin extends BasePlugin {
|
|
954
|
+
get name() { return 'nitro-modules'; }
|
|
955
|
+
getRequiredPackages() { return [{ name: 'react-native-nitro-modules', dev: false }]; }
|
|
956
|
+
async isActive(baseDir) {
|
|
957
|
+
try {
|
|
958
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
959
|
+
return !!(pkgJson.dependencies?.['react-native-nitro-modules']);
|
|
960
|
+
} catch { return false; }
|
|
961
|
+
}
|
|
962
|
+
}
|
|
963
|
+
|
|
964
|
+
/**
|
|
965
|
+
* ============================================================================
|
|
966
|
+
* Aggregated Exports
|
|
967
|
+
* ============================================================================
|
|
968
|
+
* Use these to import all plugins at once.
|
|
969
|
+
*/
|
|
970
|
+
|
|
971
|
+
// ─── UI LIBRARIES ──────────────────────────────────────────────────────────
|
|
972
|
+
|
|
973
|
+
export class AntdPlugin extends BasePlugin {
|
|
974
|
+
get name() { return 'antd'; }
|
|
975
|
+
getRequiredPackages() { return [{ name: 'antd', dev: false }]; }
|
|
976
|
+
async isActive(baseDir) {
|
|
977
|
+
try {
|
|
978
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
979
|
+
return !!(pkgJson.dependencies?.antd || pkgJson.devDependencies?.antd);
|
|
980
|
+
} catch { return false; }
|
|
981
|
+
}
|
|
982
|
+
}
|
|
983
|
+
|
|
984
|
+
export class MuiPlugin extends BasePlugin {
|
|
985
|
+
get name() { return 'mui'; }
|
|
986
|
+
getRequiredPackages() { return [{ name: '@mui/material', dev: false }, { name: '@emotion/react', dev: false }]; }
|
|
987
|
+
async isActive(baseDir) {
|
|
988
|
+
try {
|
|
989
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
990
|
+
return !!(pkgJson.dependencies?.['@mui/material'] || pkgJson.devDependencies?.['@mui/material']);
|
|
991
|
+
} catch { return false; }
|
|
992
|
+
}
|
|
993
|
+
}
|
|
994
|
+
|
|
995
|
+
export class ShadcnPlugin extends BasePlugin {
|
|
996
|
+
get name() { return 'shadcn'; }
|
|
997
|
+
getConfigFiles() { return ['components.json']; }
|
|
998
|
+
async isActive(baseDir) {
|
|
999
|
+
try { await fs.access(path.join(baseDir, 'components.json')); return true; } catch { return false; }
|
|
1000
|
+
}
|
|
1001
|
+
}
|
|
1002
|
+
|
|
1003
|
+
export class RadixUIPlugin extends BasePlugin {
|
|
1004
|
+
get name() { return 'radix-ui'; }
|
|
1005
|
+
async isActive(baseDir) {
|
|
1006
|
+
try {
|
|
1007
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
1008
|
+
const allDeps = { ...(pkgJson.dependencies || {}), ...(pkgJson.devDependencies || {}) };
|
|
1009
|
+
return Object.keys(allDeps).some(k => k.startsWith('@radix-ui/'));
|
|
1010
|
+
} catch { return false; }
|
|
1011
|
+
}
|
|
1012
|
+
}
|
|
1013
|
+
|
|
1014
|
+
export class ChakraUIPlugin extends BasePlugin {
|
|
1015
|
+
get name() { return 'chakra-ui'; }
|
|
1016
|
+
getRequiredPackages() { return [{ name: '@chakra-ui/react', dev: false }]; }
|
|
1017
|
+
async isActive(baseDir) {
|
|
1018
|
+
try {
|
|
1019
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
1020
|
+
return !!(pkgJson.dependencies?.['@chakra-ui/react'] || pkgJson.devDependencies?.['@chakra-ui/react']);
|
|
1021
|
+
} catch { return false; }
|
|
1022
|
+
}
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
// ─── ANIMATION ───────────────────────────────────────────────────────────────
|
|
1026
|
+
|
|
1027
|
+
export class FramerMotionPlugin extends BasePlugin {
|
|
1028
|
+
get name() { return 'framer-motion'; }
|
|
1029
|
+
getRequiredPackages() { return [{ name: 'framer-motion', dev: false }]; }
|
|
1030
|
+
async isActive(baseDir) {
|
|
1031
|
+
try {
|
|
1032
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
1033
|
+
return !!(pkgJson.dependencies?.['framer-motion'] || pkgJson.devDependencies?.['framer-motion']);
|
|
1034
|
+
} catch { return false; }
|
|
1035
|
+
}
|
|
1036
|
+
}
|
|
1037
|
+
|
|
1038
|
+
export class GSAPPlugin extends BasePlugin {
|
|
1039
|
+
get name() { return 'gsap'; }
|
|
1040
|
+
getRequiredPackages() { return [{ name: 'gsap', dev: false }]; }
|
|
1041
|
+
async isActive(baseDir) {
|
|
1042
|
+
try {
|
|
1043
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
1044
|
+
return !!(pkgJson.dependencies?.gsap || pkgJson.devDependencies?.gsap);
|
|
1045
|
+
} catch { return false; }
|
|
1046
|
+
}
|
|
1047
|
+
}
|
|
1048
|
+
|
|
1049
|
+
// ─── VALIDATION ──────────────────────────────────────────────────────────────
|
|
1050
|
+
|
|
1051
|
+
export class ZodPlugin extends BasePlugin {
|
|
1052
|
+
get name() { return 'zod'; }
|
|
1053
|
+
getRequiredPackages() { return [{ name: 'zod', dev: false }]; }
|
|
1054
|
+
async isActive(baseDir) {
|
|
1055
|
+
try {
|
|
1056
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
1057
|
+
return !!(pkgJson.dependencies?.zod || pkgJson.devDependencies?.zod);
|
|
1058
|
+
} catch { return false; }
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
|
|
1062
|
+
export class YupPlugin extends BasePlugin {
|
|
1063
|
+
get name() { return 'yup'; }
|
|
1064
|
+
getRequiredPackages() { return [{ name: 'yup', dev: false }]; }
|
|
1065
|
+
async isActive(baseDir) {
|
|
1066
|
+
try {
|
|
1067
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
1068
|
+
return !!(pkgJson.dependencies?.yup || pkgJson.devDependencies?.yup);
|
|
1069
|
+
} catch { return false; }
|
|
1070
|
+
}
|
|
1071
|
+
}
|
|
1072
|
+
|
|
1073
|
+
export class ValibotPlugin extends BasePlugin {
|
|
1074
|
+
get name() { return 'valibot'; }
|
|
1075
|
+
getRequiredPackages() { return [{ name: 'valibot', dev: false }]; }
|
|
1076
|
+
async isActive(baseDir) {
|
|
1077
|
+
try {
|
|
1078
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
1079
|
+
return !!(pkgJson.dependencies?.valibot || pkgJson.devDependencies?.valibot);
|
|
1080
|
+
} catch { return false; }
|
|
1081
|
+
}
|
|
1082
|
+
}
|
|
1083
|
+
|
|
1084
|
+
// ─── I18N ───────────────────────────────────────────────────────────────────
|
|
1085
|
+
|
|
1086
|
+
export class I18nextPlugin extends BasePlugin {
|
|
1087
|
+
get name() { return 'i18next'; }
|
|
1088
|
+
getRequiredPackages() { return [{ name: 'i18next', dev: false }]; }
|
|
1089
|
+
async isActive(baseDir) {
|
|
1090
|
+
try {
|
|
1091
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
1092
|
+
return !!(pkgJson.dependencies?.i18next || pkgJson.devDependencies?.i18next);
|
|
1093
|
+
} catch { return false; }
|
|
1094
|
+
}
|
|
1095
|
+
}
|
|
1096
|
+
|
|
1097
|
+
export class VueI18nPlugin extends BasePlugin {
|
|
1098
|
+
get name() { return 'vue-i18n'; }
|
|
1099
|
+
getRequiredPackages() { return [{ name: 'vue-i18n', dev: false }]; }
|
|
1100
|
+
async isActive(baseDir) {
|
|
1101
|
+
try {
|
|
1102
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
1103
|
+
return !!(pkgJson.dependencies?.['vue-i18n'] || pkgJson.devDependencies?.['vue-i18n']);
|
|
1104
|
+
} catch { return false; }
|
|
1105
|
+
}
|
|
1106
|
+
}
|
|
1107
|
+
|
|
1108
|
+
// ─── MONITORING ─────────────────────────────────────────────────────────────
|
|
1109
|
+
|
|
1110
|
+
export class SentryPlugin extends BasePlugin {
|
|
1111
|
+
get name() { return 'sentry'; }
|
|
1112
|
+
async isActive(baseDir) {
|
|
1113
|
+
try {
|
|
1114
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
1115
|
+
const allDeps = { ...(pkgJson.dependencies || {}), ...(pkgJson.devDependencies || {}) };
|
|
1116
|
+
return Object.keys(allDeps).some(k => k.startsWith('@sentry/'));
|
|
1117
|
+
} catch { return false; }
|
|
1118
|
+
}
|
|
1119
|
+
}
|
|
1120
|
+
|
|
1121
|
+
export class OpenTelemetryPlugin extends BasePlugin {
|
|
1122
|
+
get name() { return 'opentelemetry'; }
|
|
1123
|
+
async isActive(baseDir) {
|
|
1124
|
+
try {
|
|
1125
|
+
const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
|
|
1126
|
+
const allDeps = { ...(pkgJson.dependencies || {}), ...(pkgJson.devDependencies || {}) };
|
|
1127
|
+
return Object.keys(allDeps).some(k => k.startsWith('@opentelemetry/'));
|
|
1128
|
+
} catch { return false; }
|
|
1129
|
+
}
|
|
1130
|
+
}
|
|
17
1131
|
|
|
18
|
-
// ── Frontend Frameworks ────────────────────────────────────────────────────
|
|
19
|
-
export {
|
|
20
|
-
ReactPlugin, VuePlugin, SveltePlugin, AngularPlugin,
|
|
21
|
-
PreactPlugin, SolidPlugin, QwikPlugin, LitPlugin,
|
|
22
|
-
} from './ModernFrameworks.js';
|
|
23
|
-
|
|
24
|
-
// ── Meta-Frameworks ────────────────────────────────────────────────────────
|
|
25
|
-
export {
|
|
26
|
-
NuxtPlugin, RemixPlugin, SvelteKitPlugin, AstroPlugin,
|
|
27
|
-
VitepressPlugin, GatsbyPlugin, RedwoodPlugin,
|
|
28
|
-
} from './GenericPlugins.js';
|
|
29
|
-
|
|
30
|
-
// ── Next.js ────────────────────────────────────────────────────────────────
|
|
31
|
-
export { NextJsPlugin } from './NextJsPlugin.js';
|
|
32
|
-
|
|
33
|
-
// ── TypeScript ─────────────────────────────────────────────────────────────
|
|
34
|
-
export { TypeScriptPlugin } from './TypeScriptPlugin.js';
|
|
35
|
-
|
|
36
|
-
// ── Backend Services & Data ────────────────────────────────────────────────
|
|
37
|
-
export {
|
|
38
|
-
GraphQLPlugin, ApolloPlugin, DatabasePlugin,
|
|
39
|
-
PrismaPlugin, DrizzlePlugin, MongoosePlugin,
|
|
40
|
-
SupabasePlugin, FirebasePlugin, ClerkPlugin, TRPCPlugin,
|
|
41
|
-
} from './BackendServices.js';
|
|
42
|
-
|
|
43
|
-
// ── Build Tools, Testing, Linting, CI ─────────────────────────────────────
|
|
44
|
-
export {
|
|
45
|
-
VitePlugin, EsbuildPlugin, RollupPlugin, WebpackPlugin, ParcelPlugin,
|
|
46
|
-
TurboPlugin, NxPlugin,
|
|
47
|
-
TailwindPlugin, PostcssPlugin, UnoCSSPlugin, StylelintPlugin,
|
|
48
|
-
EslintPlugin, PrettierPlugin, BiomePlugin, OxlintPlugin,
|
|
49
|
-
HuskyPlugin, LintStagedPlugin, CommitlintPlugin, ChangesetPlugin,
|
|
50
|
-
BabelPlugin, SWCPlugin,
|
|
51
|
-
JestPlugin, VitestPlugin, PlaywrightPlugin, CypressPlugin, StorybookPlugin, MswPlugin,
|
|
52
|
-
GithubActionsPlugin, DockerPlugin, TerraformPlugin,
|
|
53
|
-
EditorConfigPlugin, NvmPlugin, VoltaPlugin, DotenvPlugin,
|
|
54
|
-
PnpmPlugin, YarnPlugin, BunPlugin,
|
|
55
|
-
SwiperPlugin, QuillPlugin, EnvelopPlugin,
|
|
56
|
-
} from './MorePlugins.js';
|
|
57
|
-
|
|
58
|
-
// ── State, Routing, UI, Animation, Validation, i18n, Monitoring, Backend ──
|
|
59
|
-
export {
|
|
60
|
-
ReduxPlugin, ZustandPlugin, JotaiPlugin, RecoilPlugin, MobXPlugin, PiniaPlugin, TanStackQueryPlugin,
|
|
61
|
-
ReactRouterPlugin, TanStackRouterPlugin, VueRouterPlugin,
|
|
62
|
-
AntdPlugin, MuiPlugin, ShadcnPlugin, RadixUIPlugin, ChakraUIPlugin,
|
|
63
|
-
FramerMotionPlugin, GSAPPlugin,
|
|
64
|
-
ZodPlugin, YupPlugin, ValibotPlugin,
|
|
65
|
-
I18nextPlugin, VueI18nPlugin,
|
|
66
|
-
SentryPlugin, OpenTelemetryPlugin,
|
|
67
|
-
ExpressPlugin, FastifyPlugin, NestJsPlugin, HonoPlugin, KoaPlugin, ElysiaPlugin,
|
|
68
|
-
SocketIoPlugin,
|
|
69
|
-
} from './NewPlugins.js';
|
|
70
1132
|
|
|
71
1133
|
/**
|
|
72
|
-
*
|
|
73
|
-
*
|
|
1134
|
+
* ============================================================================
|
|
1135
|
+
* Aggregated Exports
|
|
1136
|
+
* ============================================================================
|
|
1137
|
+
* Use these to import all plugins at once.
|
|
74
1138
|
*/
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
BabelPlugin, SWCPlugin,
|
|
97
|
-
JestPlugin, VitestPlugin, PlaywrightPlugin, CypressPlugin, StorybookPlugin, MswPlugin,
|
|
98
|
-
GithubActionsPlugin, DockerPlugin, TerraformPlugin,
|
|
99
|
-
EditorConfigPlugin, NvmPlugin, VoltaPlugin, DotenvPlugin,
|
|
100
|
-
PnpmPlugin, YarnPlugin, BunPlugin,
|
|
101
|
-
SwiperPlugin, QuillPlugin, EnvelopPlugin,
|
|
102
|
-
} from './MorePlugins.js';
|
|
103
|
-
import {
|
|
104
|
-
ReduxPlugin, ZustandPlugin, JotaiPlugin, RecoilPlugin, MobXPlugin, PiniaPlugin, TanStackQueryPlugin,
|
|
105
|
-
ReactRouterPlugin, TanStackRouterPlugin, VueRouterPlugin,
|
|
106
|
-
AntdPlugin, MuiPlugin, ShadcnPlugin, RadixUIPlugin, ChakraUIPlugin,
|
|
107
|
-
FramerMotionPlugin, GSAPPlugin,
|
|
108
|
-
ZodPlugin, YupPlugin, ValibotPlugin,
|
|
109
|
-
I18nextPlugin, VueI18nPlugin,
|
|
110
|
-
SentryPlugin, OpenTelemetryPlugin,
|
|
111
|
-
ExpressPlugin, FastifyPlugin, NestJsPlugin, HonoPlugin, KoaPlugin, ElysiaPlugin,
|
|
112
|
-
SocketIoPlugin,
|
|
113
|
-
} from './NewPlugins.js';
|
|
114
|
-
|
|
115
|
-
export const UltimateBundle = [
|
|
116
|
-
// Frontend
|
|
117
|
-
ReactPlugin, VuePlugin, SveltePlugin, AngularPlugin,
|
|
118
|
-
PreactPlugin, SolidPlugin, QwikPlugin, LitPlugin,
|
|
119
|
-
// Meta-Frameworks
|
|
120
|
-
NuxtPlugin, RemixPlugin, SvelteKitPlugin, AstroPlugin,
|
|
121
|
-
VitepressPlugin, GatsbyPlugin, RedwoodPlugin,
|
|
122
|
-
NextJsPlugin, TypeScriptPlugin,
|
|
123
|
-
// Backend
|
|
124
|
-
ExpressPlugin, FastifyPlugin, NestJsPlugin, HonoPlugin, KoaPlugin, ElysiaPlugin,
|
|
125
|
-
// Data / API
|
|
126
|
-
GraphQLPlugin, ApolloPlugin, TRPCPlugin, DatabasePlugin,
|
|
127
|
-
PrismaPlugin, DrizzlePlugin, MongoosePlugin,
|
|
128
|
-
// BaaS / Auth
|
|
129
|
-
SupabasePlugin, FirebasePlugin, ClerkPlugin,
|
|
130
|
-
// State
|
|
131
|
-
ReduxPlugin, ZustandPlugin, JotaiPlugin, RecoilPlugin, MobXPlugin, PiniaPlugin, TanStackQueryPlugin,
|
|
132
|
-
// Routing
|
|
133
|
-
ReactRouterPlugin, TanStackRouterPlugin, VueRouterPlugin,
|
|
134
|
-
// UI
|
|
135
|
-
AntdPlugin, MuiPlugin, ShadcnPlugin, RadixUIPlugin, ChakraUIPlugin,
|
|
136
|
-
// Animation
|
|
137
|
-
FramerMotionPlugin, GSAPPlugin,
|
|
138
|
-
// Validation
|
|
139
|
-
ZodPlugin, YupPlugin, ValibotPlugin,
|
|
140
|
-
// i18n
|
|
141
|
-
I18nextPlugin, VueI18nPlugin,
|
|
142
|
-
// Monitoring
|
|
143
|
-
SentryPlugin, OpenTelemetryPlugin,
|
|
144
|
-
// Real-time
|
|
145
|
-
SocketIoPlugin,
|
|
146
|
-
// CSS
|
|
147
|
-
TailwindPlugin, PostcssPlugin, UnoCSSPlugin, StylelintPlugin,
|
|
148
|
-
// Linting
|
|
149
|
-
EslintPlugin, PrettierPlugin, BiomePlugin, OxlintPlugin,
|
|
150
|
-
// Git Hooks
|
|
151
|
-
HuskyPlugin, LintStagedPlugin, CommitlintPlugin, ChangesetPlugin,
|
|
152
|
-
// Transpilers
|
|
153
|
-
BabelPlugin, SWCPlugin,
|
|
154
|
-
// Build Tools
|
|
155
|
-
VitePlugin, EsbuildPlugin, RollupPlugin, WebpackPlugin, ParcelPlugin,
|
|
156
|
-
// Monorepo
|
|
157
|
-
TurboPlugin, NxPlugin,
|
|
158
|
-
// Testing
|
|
159
|
-
JestPlugin, VitestPlugin, PlaywrightPlugin, CypressPlugin, StorybookPlugin, MswPlugin,
|
|
160
|
-
// CI / Infra
|
|
161
|
-
GithubActionsPlugin, DockerPlugin, TerraformPlugin,
|
|
162
|
-
// Dev Environment
|
|
163
|
-
EditorConfigPlugin, NvmPlugin, VoltaPlugin, DotenvPlugin,
|
|
164
|
-
// Package Managers
|
|
165
|
-
PnpmPlugin, YarnPlugin, BunPlugin,
|
|
166
|
-
// Misc
|
|
167
|
-
SwiperPlugin, QuillPlugin, EnvelopPlugin,
|
|
1139
|
+
|
|
1140
|
+
export const AllPluginClasses = [
|
|
1141
|
+
GraphQLPlugin, ApolloPlugin, DatabasePlugin, PrismaPlugin, DrizzlePlugin,
|
|
1142
|
+
MongoosePlugin, SupabasePlugin, FirebasePlugin, ClerkPlugin, TRPCPlugin,
|
|
1143
|
+
NuxtPlugin, RemixPlugin, SvelteKitPlugin, AstroPlugin, VitepressPlugin,
|
|
1144
|
+
GatsbyPlugin, RedwoodPlugin, NextJsPlugin, ReactPlugin, VuePlugin,
|
|
1145
|
+
SveltePlugin, AngularPlugin, PreactPlugin, SolidPlugin, QwikPlugin,
|
|
1146
|
+
LitPlugin, VitePlugin, EsbuildPlugin, RollupPlugin, WebpackPlugin,
|
|
1147
|
+
ParcelPlugin, TurboPlugin, NxPlugin, TailwindPlugin, PostcssPlugin,
|
|
1148
|
+
UnoCSSPlugin, StylelintPlugin, EslintPlugin, PrettierPlugin, BiomePlugin,
|
|
1149
|
+
OxlintPlugin, HuskyPlugin, LintStagedPlugin, CommitlintPlugin, ChangesetPlugin,
|
|
1150
|
+
BabelPlugin, SWCPlugin, JestPlugin, VitestPlugin, PlaywrightPlugin,
|
|
1151
|
+
CypressPlugin, StorybookPlugin, MswPlugin, GithubActionsPlugin, DockerPlugin,
|
|
1152
|
+
TerraformPlugin, EditorConfigPlugin, NvmPlugin, VoltaPlugin, DotenvPlugin,
|
|
1153
|
+
PnpmPlugin, YarnPlugin, BunPlugin, SwiperPlugin, QuillPlugin, EnvelopPlugin,
|
|
1154
|
+
HonoPlugin, ExpressPlugin, FastifyPlugin, NestJsPlugin, KoaPlugin,
|
|
1155
|
+
ElysiaPlugin, SocketIoPlugin, TypeScriptPlugin, GrammyPlugin, HapiPlugin,
|
|
1156
|
+
RTLCSSPlugin, CKEditorEnginePlugin, NitroModulesPlugin, AntdPlugin, MuiPlugin,
|
|
1157
|
+
ShadcnPlugin, RadixUIPlugin, ChakraUIPlugin, FramerMotionPlugin, GSAPPlugin,
|
|
1158
|
+
ZodPlugin, YupPlugin, ValibotPlugin, I18nextPlugin, VueI18nPlugin,
|
|
1159
|
+
SentryPlugin, OpenTelemetryPlugin
|
|
168
1160
|
];
|
|
1161
|
+
|
|
1162
|
+
export const Plugins = {
|
|
1163
|
+
GraphQLPlugin, ApolloPlugin, DatabasePlugin, PrismaPlugin, DrizzlePlugin,
|
|
1164
|
+
MongoosePlugin, SupabasePlugin, FirebasePlugin, ClerkPlugin, TRPCPlugin,
|
|
1165
|
+
NuxtPlugin, RemixPlugin, SvelteKitPlugin, AstroPlugin, VitepressPlugin,
|
|
1166
|
+
GatsbyPlugin, RedwoodPlugin, NextJsPlugin, ReactPlugin, VuePlugin,
|
|
1167
|
+
SveltePlugin, AngularPlugin, PreactPlugin, SolidPlugin, QwikPlugin,
|
|
1168
|
+
LitPlugin, VitePlugin, EsbuildPlugin, RollupPlugin, WebpackPlugin,
|
|
1169
|
+
ParcelPlugin, TurboPlugin, NxPlugin, TailwindPlugin, PostcssPlugin,
|
|
1170
|
+
UnoCSSPlugin, StylelintPlugin, EslintPlugin, PrettierPlugin, BiomePlugin,
|
|
1171
|
+
OxlintPlugin, HuskyPlugin, LintStagedPlugin, CommitlintPlugin, ChangesetPlugin,
|
|
1172
|
+
BabelPlugin, SWCPlugin, JestPlugin, VitestPlugin, PlaywrightPlugin,
|
|
1173
|
+
CypressPlugin, StorybookPlugin, MswPlugin, GithubActionsPlugin, DockerPlugin,
|
|
1174
|
+
TerraformPlugin, EditorConfigPlugin, NvmPlugin, VoltaPlugin, DotenvPlugin,
|
|
1175
|
+
PnpmPlugin, YarnPlugin, BunPlugin, SwiperPlugin, QuillPlugin, EnvelopPlugin,
|
|
1176
|
+
HonoPlugin, ExpressPlugin, FastifyPlugin, NestJsPlugin, KoaPlugin,
|
|
1177
|
+
ElysiaPlugin, SocketIoPlugin, TypeScriptPlugin, GrammyPlugin, HapiPlugin,
|
|
1178
|
+
RTLCSSPlugin, CKEditorEnginePlugin, NitroModulesPlugin, AntdPlugin, MuiPlugin,
|
|
1179
|
+
ShadcnPlugin, RadixUIPlugin, ChakraUIPlugin, FramerMotionPlugin, GSAPPlugin,
|
|
1180
|
+
ZodPlugin, YupPlugin, ValibotPlugin, I18nextPlugin, VueI18nPlugin,
|
|
1181
|
+
SentryPlugin, OpenTelemetryPlugin
|
|
1182
|
+
};
|