@swissjs/swite 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.
Files changed (163) hide show
  1. package/.changeset/config.json +11 -0
  2. package/.github/workflows/ci.yml +59 -0
  3. package/.github/workflows/publish.yml +50 -0
  4. package/.github/workflows/release.yml +53 -0
  5. package/BUILD_ANALYSIS.md +89 -0
  6. package/BUILD_STRATEGY.md +75 -0
  7. package/CHANGELOG.md +53 -0
  8. package/DIRECTIVE.md +488 -0
  9. package/__tests__/css-extraction.test.ts +261 -0
  10. package/__tests__/css-injection-integration.test.ts +247 -0
  11. package/__tests__/css-middleware.test.ts +191 -0
  12. package/__tests__/import-rewriter-bug.test.ts +135 -0
  13. package/dist/builder.d.ts +36 -0
  14. package/dist/builder.d.ts.map +1 -0
  15. package/dist/builder.js +772 -0
  16. package/dist/cache/compilation-cache.d.ts +33 -0
  17. package/dist/cache/compilation-cache.d.ts.map +1 -0
  18. package/dist/cache/compilation-cache.js +130 -0
  19. package/dist/cli.d.ts +3 -0
  20. package/dist/cli.d.ts.map +1 -0
  21. package/dist/cli.js +85 -0
  22. package/dist/config-loader.d.ts +8 -0
  23. package/dist/config-loader.d.ts.map +1 -0
  24. package/dist/config-loader.js +40 -0
  25. package/dist/config.d.ts +29 -0
  26. package/dist/config.d.ts.map +1 -0
  27. package/dist/config.js +7 -0
  28. package/dist/dev/pythonDevManager.d.ts +12 -0
  29. package/dist/dev/pythonDevManager.d.ts.map +1 -0
  30. package/dist/dev/pythonDevManager.js +85 -0
  31. package/dist/env.d.ts +19 -0
  32. package/dist/env.d.ts.map +1 -0
  33. package/dist/env.js +112 -0
  34. package/dist/handlers/base-handler.d.ts +21 -0
  35. package/dist/handlers/base-handler.d.ts.map +1 -0
  36. package/dist/handlers/base-handler.js +38 -0
  37. package/dist/handlers/js-handler.d.ts +10 -0
  38. package/dist/handlers/js-handler.d.ts.map +1 -0
  39. package/dist/handlers/js-handler.js +87 -0
  40. package/dist/handlers/mjs-handler.d.ts +8 -0
  41. package/dist/handlers/mjs-handler.d.ts.map +1 -0
  42. package/dist/handlers/mjs-handler.js +44 -0
  43. package/dist/handlers/node-module-handler.d.ts +16 -0
  44. package/dist/handlers/node-module-handler.d.ts.map +1 -0
  45. package/dist/handlers/node-module-handler.js +267 -0
  46. package/dist/handlers/ts-handler.d.ts +11 -0
  47. package/dist/handlers/ts-handler.d.ts.map +1 -0
  48. package/dist/handlers/ts-handler.js +120 -0
  49. package/dist/handlers/ui-handler.d.ts +12 -0
  50. package/dist/handlers/ui-handler.d.ts.map +1 -0
  51. package/dist/handlers/ui-handler.js +182 -0
  52. package/dist/handlers/uix-handler.d.ts +12 -0
  53. package/dist/handlers/uix-handler.d.ts.map +1 -0
  54. package/dist/handlers/uix-handler.js +135 -0
  55. package/dist/hmr.d.ts +20 -0
  56. package/dist/hmr.d.ts.map +1 -0
  57. package/dist/hmr.js +265 -0
  58. package/dist/import-rewriter.d.ts +3 -0
  59. package/dist/import-rewriter.d.ts.map +1 -0
  60. package/dist/import-rewriter.js +351 -0
  61. package/dist/index.d.ts +14 -0
  62. package/dist/index.d.ts.map +1 -0
  63. package/dist/index.js +13 -0
  64. package/dist/middleware/hmr-routes.d.ts +12 -0
  65. package/dist/middleware/hmr-routes.d.ts.map +1 -0
  66. package/dist/middleware/hmr-routes.js +97 -0
  67. package/dist/middleware/middleware-setup.d.ts +23 -0
  68. package/dist/middleware/middleware-setup.d.ts.map +1 -0
  69. package/dist/middleware/middleware-setup.js +596 -0
  70. package/dist/middleware/static-files.d.ts +15 -0
  71. package/dist/middleware/static-files.d.ts.map +1 -0
  72. package/dist/middleware/static-files.js +585 -0
  73. package/dist/proxy/SwiteProxyError.d.ts +6 -0
  74. package/dist/proxy/SwiteProxyError.d.ts.map +1 -0
  75. package/dist/proxy/SwiteProxyError.js +9 -0
  76. package/dist/proxy/proxyToPython.d.ts +28 -0
  77. package/dist/proxy/proxyToPython.d.ts.map +1 -0
  78. package/dist/proxy/proxyToPython.js +66 -0
  79. package/dist/resolver/bare-import-resolver.d.ts +9 -0
  80. package/dist/resolver/bare-import-resolver.d.ts.map +1 -0
  81. package/dist/resolver/bare-import-resolver.js +363 -0
  82. package/dist/resolver/symlink-registry.d.ts +13 -0
  83. package/dist/resolver/symlink-registry.d.ts.map +1 -0
  84. package/dist/resolver/symlink-registry.js +98 -0
  85. package/dist/resolver/url-resolver.d.ts +11 -0
  86. package/dist/resolver/url-resolver.d.ts.map +1 -0
  87. package/dist/resolver/url-resolver.js +268 -0
  88. package/dist/resolver/workspace-package-resolver.d.ts +10 -0
  89. package/dist/resolver/workspace-package-resolver.d.ts.map +1 -0
  90. package/dist/resolver/workspace-package-resolver.js +185 -0
  91. package/dist/resolver.d.ts +17 -0
  92. package/dist/resolver.d.ts.map +1 -0
  93. package/dist/resolver.js +191 -0
  94. package/dist/router/file-router.d.ts +19 -0
  95. package/dist/router/file-router.d.ts.map +1 -0
  96. package/dist/router/file-router.js +114 -0
  97. package/dist/server.d.ts +22 -0
  98. package/dist/server.d.ts.map +1 -0
  99. package/dist/server.js +122 -0
  100. package/dist/utils/cdn-fallback.d.ts +14 -0
  101. package/dist/utils/cdn-fallback.d.ts.map +1 -0
  102. package/dist/utils/cdn-fallback.js +36 -0
  103. package/dist/utils/file-path-resolver.d.ts +9 -0
  104. package/dist/utils/file-path-resolver.d.ts.map +1 -0
  105. package/dist/utils/file-path-resolver.js +187 -0
  106. package/dist/utils/generate-import-map-cli.d.ts +3 -0
  107. package/dist/utils/generate-import-map-cli.d.ts.map +1 -0
  108. package/dist/utils/generate-import-map-cli.js +32 -0
  109. package/dist/utils/generate-import-map.d.ts +21 -0
  110. package/dist/utils/generate-import-map.d.ts.map +1 -0
  111. package/dist/utils/generate-import-map.js +119 -0
  112. package/dist/utils/package-finder.d.ts +24 -0
  113. package/dist/utils/package-finder.d.ts.map +1 -0
  114. package/dist/utils/package-finder.js +161 -0
  115. package/dist/utils/package-registry.d.ts +36 -0
  116. package/dist/utils/package-registry.d.ts.map +1 -0
  117. package/dist/utils/package-registry.js +159 -0
  118. package/dist/utils/workspace.d.ts +6 -0
  119. package/dist/utils/workspace.d.ts.map +1 -0
  120. package/dist/utils/workspace.js +65 -0
  121. package/docs/IMPORT_REWRITING.md +164 -0
  122. package/docs/IMPORT_REWRITING_TROUBLESHOOTING.md +139 -0
  123. package/docs/PATH_RESOLUTION_GUIDE.md +221 -0
  124. package/package.json +49 -0
  125. package/src/adapters/proxy/SwiteProxyError.ts +12 -0
  126. package/src/adapters/proxy/proxyToPython.ts +88 -0
  127. package/src/build-engine/builder.ts +960 -0
  128. package/src/cli.ts +109 -0
  129. package/src/config/config-loader.ts +46 -0
  130. package/src/config/config.ts +34 -0
  131. package/src/config/env.ts +98 -0
  132. package/src/dev-engine/handlers/base-handler.ts +68 -0
  133. package/src/dev-engine/handlers/js-handler.ts +134 -0
  134. package/src/dev-engine/handlers/mjs-handler.ts +65 -0
  135. package/src/dev-engine/handlers/node-module-handler.ts +339 -0
  136. package/src/dev-engine/handlers/ts-handler.ts +143 -0
  137. package/src/dev-engine/handlers/ui-handler.ts +105 -0
  138. package/src/dev-engine/handlers/uix-handler.ts +90 -0
  139. package/src/dev-engine/hmr/hmr-client-template.ts +122 -0
  140. package/src/dev-engine/hmr/hmr.ts +173 -0
  141. package/src/dev-engine/middleware/hmr-routes.ts +120 -0
  142. package/src/dev-engine/middleware/middleware-setup.ts +351 -0
  143. package/src/dev-engine/middleware/static-files.ts +728 -0
  144. package/src/dev-engine/pythonDevManager.ts +116 -0
  145. package/src/dev-engine/router/file-router.ts +164 -0
  146. package/src/dev-engine/server.ts +152 -0
  147. package/src/index.ts +26 -0
  148. package/src/internal/cache/compilation-cache.ts +182 -0
  149. package/src/internal/generate-import-map-cli.ts +40 -0
  150. package/src/internal/generate-import-map.ts +154 -0
  151. package/src/kernel/package-finder.ts +164 -0
  152. package/src/kernel/package-registry.ts +198 -0
  153. package/src/kernel/workspace.ts +62 -0
  154. package/src/resolution/bare-import-resolver.ts +400 -0
  155. package/src/resolution/cdn/cdn-fallback.ts +37 -0
  156. package/src/resolution/path/file-path-resolver.ts +190 -0
  157. package/src/resolution/path/path-fixup.ts +19 -0
  158. package/src/resolution/resolver.ts +198 -0
  159. package/src/resolution/rewriting/import-rewriter.ts +237 -0
  160. package/src/resolution/symlink-registry.ts +114 -0
  161. package/src/resolution/url-resolver.ts +231 -0
  162. package/src/resolution/workspace-package-resolver.ts +94 -0
  163. package/tsconfig.json +37 -0
@@ -0,0 +1,135 @@
1
+ import { describe, it } from 'node:test';
2
+ import assert from 'node:assert';
3
+ import { rewriteImports } from '../src/import-rewriter.js';
4
+ import { ModuleResolver } from '../src/resolver.js';
5
+
6
+ describe('Import Rewriter - Malformed Import Bug', () => {
7
+ it('should not create malformed imports when rewriting multiple imports', async () => {
8
+ const code = `import { SwissApp } from '@swissjs/core'
9
+ import { App } from './App.uix'
10
+ import { PosAgent } from '@swiss-enterprise/ai-agents'
11
+ import { registerBusinessModules } from './modules/index.ui'`;
12
+
13
+ const resolver = new ModuleResolver('/fake/root');
14
+ const result = await rewriteImports(code, '/fake/src/index.ui', resolver);
15
+
16
+ console.log('\n=== ORIGINAL ===');
17
+ console.log(code);
18
+ console.log('\n=== REWRITTEN ===');
19
+ console.log(result);
20
+ console.log('\n=== HAS MALFORMED? ===');
21
+ console.log('Has "@"":', result.includes('@"'));
22
+ console.log('Has double quotes before import:', /"\s*import/.test(result));
23
+
24
+ // Should NOT have malformed patterns
25
+ assert(!result.includes('@"'), 'Should not contain malformed @" pattern');
26
+ assert(!/from\s+"[^"]*"\s*import/.test(result), 'Should not have double quotes before import');
27
+
28
+ // Should have valid import statements
29
+ assert(result.includes('import {'), 'Should contain import statement');
30
+ assert(result.includes('from'), 'Should contain from keyword');
31
+ });
32
+
33
+ it('should convert /swiss-lib/ paths to /swiss-packages/', async () => {
34
+ const code = `import { SwissApp } from '/swiss-lib/packages/core/dist/framework/index.ts'`;
35
+
36
+ const resolver = new ModuleResolver('/fake/root');
37
+ const result = await rewriteImports(code, '/fake/src/index.ui', resolver);
38
+
39
+ // Should convert /swiss-lib/ to /swiss-packages/
40
+ assert(!result.includes('/swiss-lib/'), 'Should not contain /swiss-lib/');
41
+ assert(result.includes('/swiss-packages/'), 'Should contain /swiss-packages/');
42
+ });
43
+
44
+ it('should preserve .ui extensions for relative imports from .ui files', async () => {
45
+ const code = `import { updatePageTitle } from './utils/seo.js'`;
46
+
47
+ const resolver = new ModuleResolver('/fake/root');
48
+ const result = await rewriteImports(code, '/fake/src/App.ui', resolver);
49
+
50
+ // Should convert .js to .ui when importing from .ui file
51
+ assert(result.includes('./utils/seo.ui'), 'Should contain .ui extension');
52
+ assert(!result.includes('./utils/seo.js'), 'Should not contain .js extension');
53
+ assert(!result.includes('./utils/seo.uix'), 'Should not contain .uix extension');
54
+ });
55
+
56
+ it('should strip CSS imports from compiled output', async () => {
57
+ // Note: CSS imports are stripped in the handler, not in rewriteImports
58
+ // This test verifies that rewriteImports skips CSS imports (doesn't process them)
59
+ const code = `import { App } from './App.uix'
60
+ import './styles/globals.css'
61
+ import './styles/theme.css'
62
+ export default App`;
63
+
64
+ const resolver = new ModuleResolver('/fake/root');
65
+ const result = await rewriteImports(code, '/fake/src/index.uix', resolver);
66
+
67
+ // rewriteImports should skip CSS imports (they're handled by the handler)
68
+ // The imports will still be in the code but won't be processed/rewritten
69
+ // CSS stripping happens in uix-handler.ts before rewriteImports is called
70
+ assert(result.includes('./App.uix'), 'Should still contain other imports');
71
+ // CSS imports are skipped, not removed - they'll be stripped by the handler
72
+ });
73
+ });
74
+
75
+ describe('ModuleResolver - swiss-lib to swiss-packages conversion', () => {
76
+ it('should convert /swiss-lib/ paths to /swiss-packages/ in import rewriting', async () => {
77
+ const code = `import { SwissApp } from '/swiss-lib/packages/core/dist/framework/index.ts'
78
+ import { App } from '/swiss-lib/packages/core/dist/component/index.ts'`;
79
+
80
+ const resolver = new ModuleResolver('/fake/root');
81
+ const result = await rewriteImports(code, '/fake/src/index.ui', resolver);
82
+
83
+ // Should convert all /swiss-lib/ to /swiss-packages/
84
+ assert(!result.includes('/swiss-lib/'), 'Should not contain /swiss-lib/');
85
+ assert(result.includes('/swiss-packages/'), 'Should contain /swiss-packages/');
86
+ assert(result.includes('/swiss-packages/core/dist/framework/index.ts'), 'Should contain converted framework path');
87
+ assert(result.includes('/swiss-packages/core/dist/component/index.ts'), 'Should contain converted component path');
88
+ });
89
+
90
+ it('should convert /swiss-lib/ paths in final pass even if missed earlier', async () => {
91
+ // Simulate code that might have /swiss-lib/ paths from compiler
92
+ const code = `import { SwissApp } from '/swiss-lib/packages/core/dist/index.js'
93
+ import './styles.css'`;
94
+
95
+ const resolver = new ModuleResolver('/fake/root');
96
+ const result = await rewriteImports(code, '/fake/src/index.ui', resolver);
97
+
98
+ // Final pass should catch any remaining /swiss-lib/
99
+ assert(!result.includes('/swiss-lib/'), 'Final pass should remove /swiss-lib/');
100
+ assert(result.includes('/swiss-packages/'), 'Final pass should add /swiss-packages/');
101
+ });
102
+
103
+ it('should ensure normalizeResult() prevents /swiss-lib/ paths from leaking', async () => {
104
+ // Test that normalizeResult() wrapper in toUrl() catches /swiss-lib/ paths
105
+ // This is tested indirectly through import rewriting, but we can also
106
+ // verify that any URL containing /swiss-lib/ gets normalized
107
+ const code = `import { test } from '/swiss-lib/packages/core/src/index.ts'
108
+ import { other } from '/swiss-lib/packages/utils/dist/helper.js'`;
109
+
110
+ const resolver = new ModuleResolver('/fake/root');
111
+ const result = await rewriteImports(code, '/fake/src/index.ui', resolver);
112
+
113
+ // normalizeResult() should ensure no /swiss-lib/ in any resolved URLs
114
+ // Even if toUrl() takes different code paths, normalizeResult() wraps all returns
115
+ assert(!result.includes('/swiss-lib/'), 'Should not contain /swiss-lib/ in any form');
116
+ assert(result.includes('/swiss-packages/'), 'Should contain /swiss-packages/');
117
+
118
+ // Test various /swiss-lib/ path patterns that might trigger different code paths in toUrl()
119
+ const variousPaths = [
120
+ '/swiss-lib/packages/core/src/index.ts',
121
+ '/swiss-lib/packages/core/dist/index.js',
122
+ '/workspace/swiss-lib/packages/core/src/index.ts', // Path that might match workspace root first
123
+ ];
124
+
125
+ for (const testPath of variousPaths) {
126
+ const testCode = `import { test } from '${testPath}'`;
127
+ const testResult = await rewriteImports(testCode, '/fake/src/index.ui', resolver);
128
+ assert(!testResult.includes('/swiss-lib/'), `Should not contain /swiss-lib/ for path: ${testPath}`);
129
+ if (testPath.includes('swiss-lib')) {
130
+ assert(testResult.includes('/swiss-packages/'), `Should contain /swiss-packages/ for path: ${testPath}`);
131
+ }
132
+ }
133
+ });
134
+ });
135
+
@@ -0,0 +1,36 @@
1
+ export interface BuildConfig {
2
+ root: string;
3
+ entry: string;
4
+ outDir: string;
5
+ publicDir?: string;
6
+ minify?: boolean;
7
+ sourcemap?: boolean;
8
+ format?: "esm" | "cjs" | "iife";
9
+ target?: string;
10
+ external?: string[];
11
+ }
12
+ export declare class SwiteBuilder {
13
+ private compiler;
14
+ private config;
15
+ private resolver;
16
+ constructor(config: BuildConfig);
17
+ build(): Promise<void>;
18
+ private cleanOutputDir;
19
+ private compileSwissFiles;
20
+ private compileDirectory;
21
+ private discoverWorkspaceDependencies;
22
+ private bundle;
23
+ private copyPublicAssets;
24
+ private findSwissFiles;
25
+ private findFiles;
26
+ private copyDir;
27
+ private formatBytes;
28
+ private findWorkspaceRoot;
29
+ private fileExists;
30
+ private createAliases;
31
+ }
32
+ /**
33
+ * Convenience function to build a project
34
+ */
35
+ export declare function build(config: BuildConfig): Promise<void>;
36
+ //# sourceMappingURL=builder.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"builder.d.ts","sourceRoot":"","sources":["../src/builder.ts"],"names":[],"mappings":"AAcA,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,MAAM,CAAC,EAAE,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAChC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,qBAAa,YAAY;IACvB,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,QAAQ,CAAiB;gBAErB,MAAM,EAAE,WAAW;IAezB,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YA6Bd,cAAc;YAMd,iBAAiB;YA+BjB,gBAAgB;YAsEhB,6BAA6B;YA+J7B,MAAM;YAsdN,gBAAgB;YAchB,cAAc;YAuBd,SAAS;YAuBT,OAAO;IAgBrB,OAAO,CAAC,WAAW;YAQL,iBAAiB;YAyBjB,UAAU;YASV,aAAa;CAiC5B;AAED;;GAEG;AACH,wBAAsB,KAAK,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAG9D"}