entkapp 5.5.0 → 5.6.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.
Files changed (62) hide show
  1. package/README.md +1 -1
  2. package/bin/cli.js +2 -2
  3. package/bin/cli.mjs +175 -0
  4. package/index.cjs +18 -0
  5. package/index.mjs +51 -0
  6. package/package.json +7 -6
  7. package/src/EngineContext.mjs +428 -0
  8. package/src/Initializer.mjs +82 -0
  9. package/src/analyzers/CodeSmellAnalyzer.mjs +106 -0
  10. package/src/analyzers/OxcAnalyzer.mjs +11 -0
  11. package/src/api/HeadlessAPI.js +31 -16
  12. package/src/api/HeadlessAPI.mjs +369 -0
  13. package/src/api/PluginSDK.mjs +135 -0
  14. package/src/ast/ASTAnalyzer.js +17 -3
  15. package/src/ast/ASTAnalyzer.mjs +742 -0
  16. package/src/ast/AdvancedAnalysis.mjs +586 -0
  17. package/src/ast/BarrelParser.mjs +230 -0
  18. package/src/ast/DeadCodeDetector.js +7 -5
  19. package/src/ast/DeadCodeDetector.mjs +92 -0
  20. package/src/ast/MagicDetector.mjs +203 -0
  21. package/src/ast/OxcAnalyzer.mjs +188 -0
  22. package/src/ast/SecretScanner.mjs +374 -0
  23. package/src/healing/GitSandbox.mjs +82 -0
  24. package/src/healing/SelfHealer.mjs +48 -0
  25. package/src/index.js +37 -1
  26. package/src/index.mjs +1176 -0
  27. package/src/performance/GraphCache.mjs +108 -0
  28. package/src/performance/SupplyChainGuard.mjs +92 -0
  29. package/src/performance/WorkerPool.mjs +132 -0
  30. package/src/performance/WorkerTaskRunner.mjs +144 -0
  31. package/src/plugins/BasePlugin.mjs +240 -0
  32. package/src/plugins/PluginRegistry.mjs +203 -0
  33. package/src/plugins/ecosystems/BackendServices.mjs +197 -0
  34. package/src/plugins/ecosystems/GenericPlugins.mjs +142 -0
  35. package/src/plugins/ecosystems/ModernFrameworks.mjs +162 -0
  36. package/src/plugins/ecosystems/MorePlugins.mjs +562 -0
  37. package/src/plugins/ecosystems/NewPlugins.mjs +526 -0
  38. package/src/plugins/ecosystems/NextJsPlugin.mjs +45 -0
  39. package/src/plugins/ecosystems/PluginLoader.mjs +193 -0
  40. package/src/plugins/ecosystems/TypeScriptPlugin.mjs +56 -0
  41. package/src/plugins/ecosystems/UltimateBundle.mjs +1182 -0
  42. package/src/refractor/ImpactAnalyzer.mjs +92 -0
  43. package/src/refractor/SourceRewriter.mjs +86 -0
  44. package/src/refractor/TransactionManager.mjs +5 -0
  45. package/src/refractor/TypeIntegrity.mjs +4 -0
  46. package/src/resolution/BuildOrchestrator.mjs +46 -0
  47. package/src/resolution/CircularDetector.mjs +91 -0
  48. package/src/resolution/ConfigGenerator.mjs +83 -0
  49. package/src/resolution/ConfigLoader.mjs +94 -0
  50. package/src/resolution/DepencyResolver.mjs +66 -0
  51. package/src/resolution/DependencyFixer.mjs +88 -0
  52. package/src/resolution/DependencyProfiler.mjs +286 -0
  53. package/src/resolution/EntryPointDetector.mjs +134 -0
  54. package/src/resolution/FrameworkConfigParser.mjs +119 -0
  55. package/src/resolution/GraphAnalyzer.mjs +80 -0
  56. package/src/resolution/MigrationAnalyzer.mjs +60 -0
  57. package/src/resolution/PathMapper.mjs +82 -0
  58. package/src/resolution/TSConfigLoader.mjs +162 -0
  59. package/src/resolution/WorkSpaceGraph.mjs +183 -0
  60. package/src/resolution/WorkspaceDiagnostic.mjs +139 -0
  61. package/test.js +76 -0
  62. package/wrangler.toml +6 -0
@@ -0,0 +1,142 @@
1
+ /**
2
+ * ============================================================================
3
+ * Generic Ecosystem Plugins for entkapp v5.0.0
4
+ * ============================================================================
5
+ * Nuxt, Remix, SvelteKit, Astro, VitePress, and more.
6
+ * v5.0.0: All plugins implement getRequiredPackages() for dependency detection.
7
+ */
8
+ import path from 'path';
9
+ import fs from 'fs/promises';
10
+ import { BasePlugin } from '../BasePlugin.mjs';
11
+
12
+ export class NuxtPlugin extends BasePlugin {
13
+ get name() { return 'nuxt'; }
14
+ getConfigFiles() { return ['nuxt.config.mjs', 'nuxt.config.ts']; }
15
+ getRequiredPackages() { return [{ name: 'nuxt', dev: false }]; }
16
+ getRoutePatterns() {
17
+ return [/\/pages\//, /\/server\/(api|routes|middleware)\//, /\/components\/[a-zA-Z0-9_\-\/]+\.vue$/];
18
+ }
19
+ getRequiredSystemContracts() { return ['default']; }
20
+ async isActive(baseDir) {
21
+ for (const file of this.getConfigFiles()) {
22
+ try { await fs.access(path.join(baseDir, file)); return true; } catch {}
23
+ }
24
+ return false;
25
+ }
26
+ }
27
+
28
+ export class RemixPlugin extends BasePlugin {
29
+ get name() { return 'remix'; }
30
+ getConfigFiles() { return ['remix.config.mjs', 'vite.config.mjs', 'vite.config.ts']; }
31
+ getRequiredPackages() {
32
+ return [
33
+ { name: '@remix-run/react', dev: false },
34
+ { name: '@remix-run/node', dev: false, optional: true },
35
+ ];
36
+ }
37
+ getRoutePatterns() { return [/\/app\/routes\//, /\/app\/root\.(tsx|jsx)$/]; }
38
+ getRequiredSystemContracts() { return ['default', 'loader', 'action', 'meta', 'links']; }
39
+ async isActive(baseDir) {
40
+ for (const file of this.getConfigFiles()) {
41
+ try {
42
+ const content = await fs.readFile(path.join(baseDir, file), 'utf8');
43
+ if (content.includes('@remix-run/') || content.includes('remix')) return true;
44
+ } catch {}
45
+ }
46
+ return false;
47
+ }
48
+ }
49
+
50
+ export class SvelteKitPlugin extends BasePlugin {
51
+ get name() { return 'sveltekit'; }
52
+ getConfigFiles() { return ['svelte.config.mjs', 'vite.config.ts']; }
53
+ getRequiredPackages() {
54
+ return [
55
+ { name: '@sveltejs/kit', dev: false },
56
+ { name: 'svelte', dev: false },
57
+ ];
58
+ }
59
+ getRoutePatterns() {
60
+ return [/\+page\.(svelte|ts|js)$/, /\+page\.server\.(ts|js)$/, /\+layout\.(svelte|ts|js)$/, /\+server\.(ts|js)$/];
61
+ }
62
+ getRequiredSystemContracts() { return ['load', 'actions', 'GET', 'POST', 'PUT', 'DELETE', 'PATCH']; }
63
+ async isActive(baseDir) {
64
+ try { await fs.access(path.join(baseDir, 'svelte.config.mjs')); return true; } catch { return false; }
65
+ }
66
+ }
67
+
68
+ export class AstroPlugin extends BasePlugin {
69
+ get name() { return 'astro'; }
70
+ getConfigFiles() { return ['astro.config.mjs', 'astro.config.cjs', 'astro.config.ts']; }
71
+ getRequiredPackages() { return [{ name: 'astro', dev: false }]; }
72
+ getRoutePatterns() { return [/\/src\/pages\/.*\.astro$/, /\/src\/pages\/.*\.(ts|js)$/]; }
73
+ getRequiredSystemContracts() { return ['default', 'getStaticPaths']; }
74
+ async isActive(baseDir) {
75
+ for (const file of this.getConfigFiles()) {
76
+ try { await fs.access(path.join(baseDir, file)); return true; } catch {}
77
+ }
78
+ return false;
79
+ }
80
+ }
81
+
82
+ export class VitepressPlugin extends BasePlugin {
83
+ get name() { return 'vitepress'; }
84
+ getConfigFiles() { return ['package.json']; }
85
+ getRequiredPackages() { return [{ name: 'vitepress', dev: true }]; }
86
+ async isActive(baseDir) {
87
+ try {
88
+ const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
89
+ const hasDep = !!(pkgJson.dependencies?.vitepress || pkgJson.devDependencies?.vitepress);
90
+ const possibleDirs = ['.vitepress', 'docs/.vitepress', '.docs/.vitepress'];
91
+ for (const d of possibleDirs) {
92
+ try { await fs.access(path.join(baseDir, d)); return true; } catch {}
93
+ }
94
+ return hasDep;
95
+ } catch { return false; }
96
+ }
97
+ async onDiscovery({ pkgDir, data, reachableFiles, queue, projectGraph, context }) {
98
+ const hasVitepressDir = Array.from(projectGraph.keys()).some(f => f.includes('/.vitepress/'));
99
+ const hasVitepressDep = !!(data.devDependencies?.vitepress || data.dependencies?.vitepress);
100
+ if (hasVitepressDir && hasVitepressDep) {
101
+ for (const [filePath, _] of projectGraph.entries()) {
102
+ if (filePath.includes('/.vitepress/') && !reachableFiles.has(filePath)) {
103
+ reachableFiles.add(filePath);
104
+ queue.push(filePath);
105
+ }
106
+ }
107
+ if (!context.consumedRootPackages) context.consumedRootPackages = new Set();
108
+ context.consumedRootPackages.add('vitepress');
109
+ context.consumedRootPackages.add('vue');
110
+ } else if (hasVitepressDir && !hasVitepressDep) {
111
+ if (!context.unlistedDependencies) context.unlistedDependencies = [];
112
+ context.unlistedDependencies.push({
113
+ name: 'vitepress',
114
+ reason: 'Found .vitepress configuration directory but package is not in package.json'
115
+ });
116
+ }
117
+ }
118
+ }
119
+
120
+ export class GatsbyPlugin extends BasePlugin {
121
+ get name() { return 'gatsby'; }
122
+ getConfigFiles() { return ['gatsby-config.mjs', 'gatsby-config.ts', 'gatsby-node.mjs', 'gatsby-node.ts']; }
123
+ getRequiredPackages() { return [{ name: 'gatsby', dev: false }]; }
124
+ getRoutePatterns() { return [/\/src\/pages\//, /\/src\/templates\//]; }
125
+ getRequiredSystemContracts() { return ['default', 'getServerData', 'config']; }
126
+ async isActive(baseDir) {
127
+ for (const file of this.getConfigFiles()) {
128
+ try { await fs.access(path.join(baseDir, file)); return true; } catch {}
129
+ }
130
+ return false;
131
+ }
132
+ }
133
+
134
+ export class RedwoodPlugin extends BasePlugin {
135
+ get name() { return 'redwood'; }
136
+ getConfigFiles() { return ['redwood.toml']; }
137
+ getRequiredPackages() { return [{ name: '@redwoodjs/core', dev: true }]; }
138
+ async isActive(baseDir) {
139
+ try { await fs.access(path.join(baseDir, 'redwood.toml')); return true; } catch { return false; }
140
+ }
141
+ getRoutePatterns() { return [/\/web\/src\/pages\//, /\/api\/src\/functions\//]; }
142
+ }
@@ -0,0 +1,162 @@
1
+ /**
2
+ * ============================================================================
3
+ * Modern Frameworks Plugins for entkapp v5.0.0
4
+ * ============================================================================
5
+ * Built-in support for React, Vue, Svelte, Angular, Preact, Solid, Qwik, Lit.
6
+ * v5.0.0: All plugins now implement getRequiredPackages() for dependency detection.
7
+ */
8
+ import { BasePlugin } from '../BasePlugin.mjs';
9
+ import fs from 'fs/promises';
10
+ import path from 'path';
11
+
12
+ export class ReactPlugin extends BasePlugin {
13
+ get name() { return 'react'; }
14
+ getConfigFiles() { return ['package.json']; }
15
+ getRequiredPackages() {
16
+ return [
17
+ { name: 'react', dev: false },
18
+ { name: 'react-dom', dev: false },
19
+ ];
20
+ }
21
+ async isActive(baseDir) {
22
+ try {
23
+ const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
24
+ return !!(pkgJson.dependencies?.react || pkgJson.devDependencies?.react);
25
+ } catch { return false; }
26
+ }
27
+ getRoutePatterns() { return [/\.(tsx?|jsx?)$/]; }
28
+ getRequiredSystemContracts() {
29
+ return ['default', 'Component', 'PureComponent', 'Fragment', 'useEffect', 'useState',
30
+ 'useContext', 'useReducer', 'useCallback', 'useMemo', 'useRef',
31
+ 'useImperativeHandle', 'useLayoutEffect', 'useDebugValue'];
32
+ }
33
+ async analyze(node, filePath) {
34
+ if (node.explicitImports?.has('react')) node.isReactComponent = true;
35
+ if (node.rawCode && (node.rawCode.includes('</') || node.rawCode.includes('/>'))) node.hasJSX = true;
36
+ const hookMatches = node.rawCode?.match(/use[A-Z]\w+/g) || [];
37
+ if (hookMatches.length > 0) node.reactHooks = new Set(hookMatches);
38
+ }
39
+ }
40
+
41
+ export class VuePlugin extends BasePlugin {
42
+ get name() { return 'vue'; }
43
+ getConfigFiles() { return ['package.json', 'vue.config.mjs', 'vite.config.ts', 'vite.config.mjs']; }
44
+ getRequiredPackages() {
45
+ return [{ name: 'vue', dev: false }];
46
+ }
47
+ async isActive(baseDir) {
48
+ try {
49
+ const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
50
+ return !!(pkgJson.dependencies?.vue || pkgJson.devDependencies?.vue);
51
+ } catch { return false; }
52
+ }
53
+ getRoutePatterns() { return [/\.vue$/, /\.(tsx?|jsx?)$/]; }
54
+ async analyze(node, filePath) {
55
+ if (filePath.endsWith('.vue')) {
56
+ node.isVueSFC = true;
57
+ const templateMatch = node.rawCode?.match(/<template>([\s\S]*)<\/template>/);
58
+ if (templateMatch) node.vueTemplate = templateMatch[1];
59
+ const scriptMatch = node.rawCode?.match(/<script(?: setup)?(?: lang=['"]\w+['"])?>([\s\S]*)<\/script>/);
60
+ if (scriptMatch) node.vueScript = scriptMatch[1];
61
+ }
62
+ }
63
+ }
64
+
65
+ export class SveltePlugin extends BasePlugin {
66
+ get name() { return 'svelte'; }
67
+ getConfigFiles() { return ['package.json', 'svelte.config.mjs']; }
68
+ getRequiredPackages() {
69
+ return [{ name: 'svelte', dev: false }];
70
+ }
71
+ async isActive(baseDir) {
72
+ try {
73
+ const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
74
+ return !!(pkgJson.dependencies?.svelte || pkgJson.devDependencies?.svelte);
75
+ } catch { return false; }
76
+ }
77
+ getRoutePatterns() { return [/\.svelte$/, /\.(tsx?|jsx?)$/]; }
78
+ async analyze(node, filePath) {
79
+ if (filePath.endsWith('.svelte')) node.isSvelteComponent = true;
80
+ }
81
+ }
82
+
83
+ export class AngularPlugin extends BasePlugin {
84
+ get name() { return 'angular'; }
85
+ getConfigFiles() { return ['package.json', 'angular.json']; }
86
+ getRequiredPackages() {
87
+ return [
88
+ { name: '@angular/core', dev: false },
89
+ { name: '@angular/common', dev: false },
90
+ { name: '@angular/cli', dev: true, optional: true },
91
+ ];
92
+ }
93
+ async isActive(baseDir) {
94
+ try {
95
+ const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
96
+ return !!(pkgJson.dependencies?.['@angular/core'] || pkgJson.devDependencies?.['@angular/core']);
97
+ } catch { return false; }
98
+ }
99
+ getRoutePatterns() { return [/\.ts$/]; }
100
+ async analyze(node, filePath) {
101
+ if (node.rawCode?.includes('@Component') || node.rawCode?.includes('@Injectable') || node.rawCode?.includes('@NgModule'))
102
+ node.isAngularEntity = true;
103
+ }
104
+ }
105
+
106
+ export class PreactPlugin extends BasePlugin {
107
+ get name() { return 'preact'; }
108
+ getConfigFiles() { return ['package.json']; }
109
+ getRequiredPackages() { return [{ name: 'preact', dev: false }]; }
110
+ async isActive(baseDir) {
111
+ try {
112
+ const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
113
+ return !!(pkgJson.dependencies?.preact || pkgJson.devDependencies?.preact);
114
+ } catch { return false; }
115
+ }
116
+ getRoutePatterns() { return [/\.(tsx?|jsx?)$/]; }
117
+ async analyze(node) {
118
+ if (node.rawCode?.includes('render(') && node.rawCode?.includes('preact')) node.isEntry = true;
119
+ }
120
+ }
121
+
122
+ export class SolidPlugin extends BasePlugin {
123
+ get name() { return 'solid'; }
124
+ getConfigFiles() { return ['package.json', 'vite.config.ts', 'vite.config.mjs']; }
125
+ getRequiredPackages() { return [{ name: 'solid-js', dev: false }]; }
126
+ async isActive(baseDir) {
127
+ try {
128
+ const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
129
+ return !!(pkgJson.dependencies?.['solid-js'] || pkgJson.devDependencies?.['solid-js']);
130
+ } catch { return false; }
131
+ }
132
+ getRoutePatterns() { return [/\.(tsx?|jsx?)$/]; }
133
+ getRequiredSystemContracts() { return ['default', 'createSignal', 'createEffect', 'createMemo', 'createResource']; }
134
+ }
135
+
136
+ export class QwikPlugin extends BasePlugin {
137
+ get name() { return 'qwik'; }
138
+ getConfigFiles() { return ['package.json', 'vite.config.ts']; }
139
+ getRequiredPackages() { return [{ name: '@builder.io/qwik', dev: false }]; }
140
+ async isActive(baseDir) {
141
+ try {
142
+ const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
143
+ return !!(pkgJson.dependencies?.['@builder.io/qwik'] || pkgJson.devDependencies?.['@builder.io/qwik']);
144
+ } catch { return false; }
145
+ }
146
+ getRoutePatterns() { return [/\.(tsx?|jsx?)$/]; }
147
+ getRequiredSystemContracts() { return ['default', 'component$', 'useSignal', 'useStore', 'useTask$']; }
148
+ }
149
+
150
+ export class LitPlugin extends BasePlugin {
151
+ get name() { return 'lit'; }
152
+ getConfigFiles() { return ['package.json']; }
153
+ getRequiredPackages() { return [{ name: 'lit', dev: false }]; }
154
+ async isActive(baseDir) {
155
+ try {
156
+ const pkgJson = JSON.parse(await fs.readFile(path.join(baseDir, 'package.json'), 'utf8'));
157
+ return !!(pkgJson.dependencies?.lit || pkgJson.devDependencies?.lit);
158
+ } catch { return false; }
159
+ }
160
+ getRoutePatterns() { return [/\.(ts|js)$/]; }
161
+ getRequiredSystemContracts() { return ['default', 'LitElement', 'html', 'css']; }
162
+ }