vitek-plugin 0.1.2-beta.6 → 0.2.0-beta

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 (166) hide show
  1. package/README.md +35 -4
  2. package/dist/adapters/vite/dev-server-middleware.d.ts +8 -0
  3. package/dist/adapters/vite/dev-server-middleware.d.ts.map +1 -0
  4. package/dist/adapters/vite/dev-server-middleware.js +30 -0
  5. package/dist/adapters/vite/dev-server-state.d.ts +41 -0
  6. package/dist/adapters/vite/dev-server-state.d.ts.map +1 -0
  7. package/dist/adapters/vite/dev-server-state.js +191 -0
  8. package/dist/adapters/vite/dev-server.d.ts +2 -21
  9. package/dist/adapters/vite/dev-server.d.ts.map +1 -1
  10. package/dist/adapters/vite/dev-server.js +7 -216
  11. package/dist/adapters/vite/path-utils.d.ts +20 -0
  12. package/dist/adapters/vite/path-utils.d.ts.map +1 -0
  13. package/dist/adapters/vite/path-utils.js +46 -0
  14. package/dist/adapters/vite/path-utils.test.d.ts +2 -0
  15. package/dist/adapters/vite/path-utils.test.d.ts.map +1 -0
  16. package/dist/adapters/vite/path-utils.test.js +79 -0
  17. package/dist/build/build-api-bundle.d.ts +1 -0
  18. package/dist/build/build-api-bundle.d.ts.map +1 -1
  19. package/dist/build/build-api-bundle.js +38 -3
  20. package/dist/build/build-api-bundle.test.d.ts +2 -0
  21. package/dist/build/build-api-bundle.test.d.ts.map +1 -0
  22. package/dist/build/build-api-bundle.test.js +50 -0
  23. package/dist/build/build-sockets-bundle.test.d.ts +2 -0
  24. package/dist/build/build-sockets-bundle.test.d.ts.map +1 -0
  25. package/dist/build/build-sockets-bundle.test.js +49 -0
  26. package/dist/cli/cli.d.ts +8 -0
  27. package/dist/cli/cli.d.ts.map +1 -0
  28. package/dist/cli/cli.js +25 -0
  29. package/dist/cli/fixtures/serve-config/vitek.config.d.mts +6 -0
  30. package/dist/cli/fixtures/serve-config/vitek.config.d.mts.map +1 -0
  31. package/dist/cli/fixtures/serve-config/vitek.config.mjs +19 -0
  32. package/dist/cli/init.d.ts +15 -0
  33. package/dist/cli/init.d.ts.map +1 -0
  34. package/dist/cli/init.js +99 -0
  35. package/dist/cli/init.test.d.ts +2 -0
  36. package/dist/cli/init.test.d.ts.map +1 -0
  37. package/dist/cli/init.test.js +117 -0
  38. package/dist/cli/mcp-project-config.d.ts +8 -0
  39. package/dist/cli/mcp-project-config.d.ts.map +1 -0
  40. package/dist/cli/mcp-project-config.js +26 -0
  41. package/dist/cli/mcp-project.d.ts +2 -0
  42. package/dist/cli/mcp-project.d.ts.map +1 -0
  43. package/dist/cli/mcp-project.js +101 -0
  44. package/dist/cli/serve.d.ts +27 -1
  45. package/dist/cli/serve.d.ts.map +1 -1
  46. package/dist/cli/serve.js +85 -10
  47. package/dist/cli/serve.test.d.ts +2 -0
  48. package/dist/cli/serve.test.d.ts.map +1 -0
  49. package/dist/cli/serve.test.js +108 -0
  50. package/dist/core/asyncapi/generate.test.d.ts +2 -0
  51. package/dist/core/asyncapi/generate.test.d.ts.map +1 -0
  52. package/dist/core/asyncapi/generate.test.js +120 -0
  53. package/dist/core/context/create-context.d.ts +2 -0
  54. package/dist/core/context/create-context.d.ts.map +1 -1
  55. package/dist/core/file-system/watch-api-dir.d.ts +4 -1
  56. package/dist/core/file-system/watch-api-dir.d.ts.map +1 -1
  57. package/dist/core/file-system/watch-api-dir.js +31 -6
  58. package/dist/core/file-system/watch-api-dir.test.d.ts +2 -0
  59. package/dist/core/file-system/watch-api-dir.test.d.ts.map +1 -0
  60. package/dist/core/file-system/watch-api-dir.test.js +38 -0
  61. package/dist/core/generation/run-file-generation.d.ts +2 -0
  62. package/dist/core/generation/run-file-generation.d.ts.map +1 -1
  63. package/dist/core/generation/run-file-generation.js +4 -1
  64. package/dist/core/introspection/manifest.d.ts +24 -0
  65. package/dist/core/introspection/manifest.d.ts.map +1 -0
  66. package/dist/core/introspection/manifest.js +41 -0
  67. package/dist/core/introspection/manifest.test.d.ts +2 -0
  68. package/dist/core/introspection/manifest.test.d.ts.map +1 -0
  69. package/dist/core/introspection/manifest.test.js +62 -0
  70. package/dist/core/middleware/get-applicable-middlewares.d.ts +7 -0
  71. package/dist/core/middleware/get-applicable-middlewares.d.ts.map +1 -1
  72. package/dist/core/middleware/get-applicable-middlewares.js +23 -15
  73. package/dist/core/middleware/get-applicable-middlewares.test.js +36 -1
  74. package/dist/core/openapi/generate.d.ts +3 -79
  75. package/dist/core/openapi/generate.d.ts.map +1 -1
  76. package/dist/core/openapi/generate.js +4 -419
  77. package/dist/core/openapi/generate.test.d.ts +2 -0
  78. package/dist/core/openapi/generate.test.d.ts.map +1 -0
  79. package/dist/core/openapi/generate.test.js +184 -0
  80. package/dist/core/openapi/jsdoc.d.ts +3 -0
  81. package/dist/core/openapi/jsdoc.d.ts.map +1 -0
  82. package/dist/core/openapi/jsdoc.js +68 -0
  83. package/dist/core/openapi/jsdoc.test.d.ts +2 -0
  84. package/dist/core/openapi/jsdoc.test.d.ts.map +1 -0
  85. package/dist/core/openapi/jsdoc.test.js +111 -0
  86. package/dist/core/openapi/spec-builder.d.ts +4 -0
  87. package/dist/core/openapi/spec-builder.d.ts.map +1 -0
  88. package/dist/core/openapi/spec-builder.js +257 -0
  89. package/dist/core/openapi/spec-builder.test.d.ts +2 -0
  90. package/dist/core/openapi/spec-builder.test.d.ts.map +1 -0
  91. package/dist/core/openapi/spec-builder.test.js +93 -0
  92. package/dist/core/openapi/types.d.ts +42 -0
  93. package/dist/core/openapi/types.d.ts.map +1 -0
  94. package/dist/core/openapi/types.js +5 -0
  95. package/dist/core/server/cors.d.ts +29 -0
  96. package/dist/core/server/cors.d.ts.map +1 -0
  97. package/dist/core/server/cors.js +55 -0
  98. package/dist/core/server/cors.test.d.ts +2 -0
  99. package/dist/core/server/cors.test.d.ts.map +1 -0
  100. package/dist/core/server/cors.test.js +49 -0
  101. package/dist/core/server/proxy.d.ts +16 -0
  102. package/dist/core/server/proxy.d.ts.map +1 -0
  103. package/dist/core/server/proxy.js +20 -0
  104. package/dist/core/server/proxy.test.d.ts +2 -0
  105. package/dist/core/server/proxy.test.d.ts.map +1 -0
  106. package/dist/core/server/proxy.test.js +53 -0
  107. package/dist/core/server/request-handler.d.ts +17 -3
  108. package/dist/core/server/request-handler.d.ts.map +1 -1
  109. package/dist/core/server/request-handler.js +192 -84
  110. package/dist/core/server/request-handler.test.js +287 -22
  111. package/dist/core/socket/socket-handler.test.d.ts +2 -0
  112. package/dist/core/socket/socket-handler.test.d.ts.map +1 -0
  113. package/dist/core/socket/socket-handler.test.js +107 -0
  114. package/dist/core/types/schema.test.d.ts +2 -0
  115. package/dist/core/types/schema.test.d.ts.map +1 -0
  116. package/dist/core/types/schema.test.js +41 -0
  117. package/dist/core/validation/types.d.ts +2 -1
  118. package/dist/core/validation/types.d.ts.map +1 -1
  119. package/dist/core/validation/validator.d.ts +4 -16
  120. package/dist/core/validation/validator.d.ts.map +1 -1
  121. package/dist/core/validation/validator.js +4 -16
  122. package/dist/index.d.ts +6 -1
  123. package/dist/index.d.ts.map +1 -1
  124. package/dist/index.js +2 -1
  125. package/dist/plugin/context.d.ts +15 -0
  126. package/dist/plugin/context.d.ts.map +1 -0
  127. package/dist/plugin/context.js +12 -0
  128. package/dist/plugin/options.d.ts +46 -0
  129. package/dist/plugin/options.d.ts.map +1 -0
  130. package/dist/plugin/options.js +1 -0
  131. package/dist/plugin/plugin-api.d.ts +49 -0
  132. package/dist/plugin/plugin-api.d.ts.map +1 -0
  133. package/dist/plugin/plugin-api.js +5 -0
  134. package/dist/plugin/vitek-build.d.ts +7 -0
  135. package/dist/plugin/vitek-build.d.ts.map +1 -0
  136. package/dist/plugin/vitek-build.js +104 -0
  137. package/dist/plugin/vitek-config.d.ts +4 -0
  138. package/dist/plugin/vitek-config.d.ts.map +1 -0
  139. package/dist/plugin/vitek-config.js +51 -0
  140. package/dist/plugin/vitek-config.test.d.ts +2 -0
  141. package/dist/plugin/vitek-config.test.d.ts.map +1 -0
  142. package/dist/plugin/vitek-config.test.js +62 -0
  143. package/dist/plugin/vitek-dev.d.ts +7 -0
  144. package/dist/plugin/vitek-dev.d.ts.map +1 -0
  145. package/dist/plugin/vitek-dev.js +71 -0
  146. package/dist/plugin/vitek-preview.d.ts +7 -0
  147. package/dist/plugin/vitek-preview.d.ts.map +1 -0
  148. package/dist/plugin/vitek-preview.js +107 -0
  149. package/dist/plugin/vitek-resolve.d.ts +7 -0
  150. package/dist/plugin/vitek-resolve.d.ts.map +1 -0
  151. package/dist/plugin/vitek-resolve.js +25 -0
  152. package/dist/plugin/vitek-transform.d.ts +7 -0
  153. package/dist/plugin/vitek-transform.d.ts.map +1 -0
  154. package/dist/plugin/vitek-transform.js +55 -0
  155. package/dist/plugin/vitek.d.ts +10 -0
  156. package/dist/plugin/vitek.d.ts.map +1 -0
  157. package/dist/plugin/vitek.js +27 -0
  158. package/dist/plugin.d.ts +3 -32
  159. package/dist/plugin.d.ts.map +1 -1
  160. package/dist/plugin.js +2 -274
  161. package/dist/plugin.test.js +99 -29
  162. package/dist/shared/response-helpers.d.ts +21 -0
  163. package/dist/shared/response-helpers.d.ts.map +1 -1
  164. package/dist/shared/response-helpers.js +41 -0
  165. package/dist/shared/response-helpers.test.js +54 -1
  166. package/package.json +19 -4
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitek-transform.d.ts","sourceRoot":"","sources":["../../src/plugin/vitek-transform.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAOnC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAElD,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,aAAa,GAAG,MAAM,CA2ChE"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * vitek:transform — rewrite relative imports to root-relative paths
3
+ */
4
+ import * as path from 'path';
5
+ import MagicString from 'magic-string';
6
+ import { normalizeModuleIdPath, resolveWithExtension, } from '../adapters/vite/path-utils.js';
7
+ export function createTransformPlugin(ctx) {
8
+ return {
9
+ name: 'vitek:transform',
10
+ enforce: 'pre',
11
+ // filter is supported in Vite 6.3+; ignored in Vite 5 (handler still works)
12
+ transform: {
13
+ filter: {
14
+ id: { include: /\.(tsx?|jsx?|mjs)$/, exclude: /node_modules/ },
15
+ },
16
+ handler(code, id) {
17
+ if (!ctx.root)
18
+ return null;
19
+ // Early return for Vite 5 (filter ignored); filter handles this in Vite 6.3+
20
+ if (id.includes('node_modules') || !/\.(tsx?|jsx?|mjs)$/.test(id))
21
+ return null;
22
+ const srcDir = path.resolve(ctx.root, ctx.options.srcDir ?? 'src');
23
+ const normalizedId = normalizeModuleIdPath(id, ctx.root);
24
+ if (!normalizedId.startsWith(srcDir))
25
+ return null;
26
+ const dir = path.dirname(normalizedId);
27
+ const rootSlash = path.resolve(ctx.root) + path.sep;
28
+ const relImportRe = /from\s+['"](\.\.?[^'"]+)['"]/g;
29
+ let match;
30
+ const s = new MagicString(code);
31
+ let hasChanges = false;
32
+ while ((match = relImportRe.exec(code)) !== null) {
33
+ const specifier = match[1];
34
+ const candidate = path.resolve(dir, specifier);
35
+ if (!candidate.startsWith(rootSlash))
36
+ continue;
37
+ const target = resolveWithExtension(candidate);
38
+ if (!target)
39
+ continue;
40
+ const rootRelative = path.relative(ctx.root, target).replace(/\\/g, '/');
41
+ const newSpecifier = `/${rootRelative}`;
42
+ const quote = match[0].includes('"') ? '"' : "'";
43
+ s.overwrite(match.index, match.index + match[0].length, `from ${quote}${newSpecifier}${quote}`);
44
+ hasChanges = true;
45
+ }
46
+ if (!hasChanges)
47
+ return null;
48
+ return {
49
+ code: s.toString(),
50
+ map: s.generateMap({ hires: 'boundary' }),
51
+ };
52
+ },
53
+ },
54
+ };
55
+ }
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Main Vitek plugin — aggregates sub-plugins
3
+ */
4
+ import type { Plugin } from 'vite';
5
+ import type { VitekOptions } from './options.js';
6
+ /**
7
+ * Vite plugin for Vitek — returns array of sub-plugins.
8
+ */
9
+ export declare function vitek(options?: VitekOptions): Plugin[];
10
+ //# sourceMappingURL=vitek.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vitek.d.ts","sourceRoot":"","sources":["../../src/plugin/vitek.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AASnC,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAEjD;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,GAAE,YAAiB,GAAG,MAAM,EAAE,CAa1D"}
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Main Vitek plugin — aggregates sub-plugins
3
+ */
4
+ import { API_DIR_NAME } from '../shared/constants.js';
5
+ import { createPluginContext } from './context.js';
6
+ import { createConfigPlugin } from './vitek-config.js';
7
+ import { createBuildPlugin } from './vitek-build.js';
8
+ import { createResolvePlugin } from './vitek-resolve.js';
9
+ import { createTransformPlugin } from './vitek-transform.js';
10
+ import { createDevPlugin } from './vitek-dev.js';
11
+ import { createPreviewPlugin } from './vitek-preview.js';
12
+ /**
13
+ * Vite plugin for Vitek — returns array of sub-plugins.
14
+ */
15
+ export function vitek(options = {}) {
16
+ const apiDirOption = options.apiDir || `src/${API_DIR_NAME}`;
17
+ const buildApi = options.buildApi !== false;
18
+ const ctx = createPluginContext(options, apiDirOption, buildApi);
19
+ return [
20
+ createConfigPlugin(ctx),
21
+ createBuildPlugin(ctx),
22
+ createResolvePlugin(ctx),
23
+ createTransformPlugin(ctx),
24
+ createDevPlugin(ctx),
25
+ createPreviewPlugin(ctx),
26
+ ];
27
+ }
package/dist/plugin.d.ts CHANGED
@@ -1,36 +1,7 @@
1
1
  /**
2
2
  * Main Vite plugin
3
- * Thin layer that registers the plugin and connects with adapters
3
+ * Exports VitekOptions and vitek() aggregates sub-plugins
4
4
  */
5
- import type { Plugin } from 'vite';
6
- import type { OpenApiOptions } from './core/openapi/generate.js';
7
- export interface VitekOptions {
8
- /** API directory (relative to root) */
9
- apiDir?: string;
10
- /** API base path (default: /api) */
11
- apiBasePath?: string;
12
- /** Build API bundle for preview/production (default: true). Set to false to skip. */
13
- buildApi?: boolean;
14
- /** Enable request validation (default: false) */
15
- enableValidation?: boolean;
16
- /** Logging configuration */
17
- logging?: {
18
- /** Log level: 'debug' | 'info' | 'warn' | 'error' (default: 'info') */
19
- level?: 'debug' | 'info' | 'warn' | 'error';
20
- /** Enable request/response logging (default: false) */
21
- enableRequestLogging?: boolean;
22
- /** Enable route matching logs (default: true) */
23
- enableRouteLogging?: boolean;
24
- };
25
- /** Enable OpenAPI/Swagger documentation generation */
26
- openApi?: OpenApiOptions | boolean;
27
- /** Enable WebSocket sockets (default: true). Set to false to disable, or { path: '/ws' } to customize base path. */
28
- sockets?: boolean | {
29
- path?: string;
30
- };
31
- }
32
- /**
33
- * Vite plugin for Vitek
34
- */
35
- export declare function vitek(options?: VitekOptions): Plugin;
5
+ export type { VitekOptions } from './plugin/options.js';
6
+ export { vitek } from './plugin/vitek.js';
36
7
  //# sourceMappingURL=plugin.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,MAAM,CAAC;AAcnC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4BAA4B,CAAC;AAGjE,MAAM,WAAW,YAAY;IAC3B,uCAAuC;IACvC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,oCAAoC;IACpC,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qFAAqF;IACrF,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,iDAAiD;IACjD,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAC3B,4BAA4B;IAC5B,OAAO,CAAC,EAAE;QACR,uEAAuE;QACvE,KAAK,CAAC,EAAE,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;QAC5C,uDAAuD;QACvD,oBAAoB,CAAC,EAAE,OAAO,CAAC;QAC/B,iDAAiD;QACjD,kBAAkB,CAAC,EAAE,OAAO,CAAC;KAC9B,CAAC;IACF,sDAAsD;IACtD,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC;IACnC,oHAAoH;IACpH,OAAO,CAAC,EAAE,OAAO,GAAG;QAAE,IAAI,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;CACvC;AAED;;GAEG;AACH,wBAAgB,KAAK,CAAC,OAAO,GAAE,YAAiB,GAAG,MAAM,CAsSxD"}
1
+ {"version":3,"file":"plugin.d.ts","sourceRoot":"","sources":["../src/plugin.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,YAAY,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC"}
package/dist/plugin.js CHANGED
@@ -1,277 +1,5 @@
1
1
  /**
2
2
  * Main Vite plugin
3
- * Thin layer that registers the plugin and connects with adapters
3
+ * Exports VitekOptions and vitek() aggregates sub-plugins
4
4
  */
5
- import * as path from 'path';
6
- import * as fs from 'fs';
7
- import { pathToFileURL, fileURLToPath } from 'url';
8
- import { createViteDevServerMiddleware } from './adapters/vite/dev-server.js';
9
- import { createViteLogger } from './adapters/vite/logger.js';
10
- import { createRequestHandler } from './core/server/request-handler.js';
11
- import { buildApiBundle, getApiBundleFilename } from './build/build-api-bundle.js';
12
- import { scanApiDirectory } from './core/file-system/scan-api-dir.js';
13
- import { parsedRoutesToSchema, runFileGeneration } from './core/generation/run-file-generation.js';
14
- import { buildSocketsBundle, getSocketsBundleFilename } from './build/build-sockets-bundle.js';
15
- import { createSocketHandler } from './core/socket/socket-handler.js';
16
- import { API_BASE_PATH, API_DIR_NAME, getSocketBasePath } from './shared/constants.js';
17
- /**
18
- * Vite plugin for Vitek
19
- */
20
- export function vitek(options = {}) {
21
- const apiDirOption = options.apiDir || `src/${API_DIR_NAME}`;
22
- const buildApi = options.buildApi !== false;
23
- let root;
24
- let buildOutDir;
25
- let cleanupFn = null;
26
- return {
27
- name: 'vitek',
28
- enforce: 'pre',
29
- configResolved(config) {
30
- root = config.root;
31
- buildOutDir = path.resolve(root, config.build?.outDir ?? 'dist');
32
- },
33
- async buildStart() {
34
- if (!buildApi)
35
- return;
36
- const fullApiDir = path.resolve(root, apiDirOption);
37
- if (!fs.existsSync(fullApiDir))
38
- return;
39
- const scanResult = scanApiDirectory(fullApiDir);
40
- if (scanResult.routes.length === 0 && scanResult.sockets.length === 0)
41
- return;
42
- const schema = parsedRoutesToSchema(scanResult.routes);
43
- const socketBasePath = getSocketBasePath(options.apiBasePath, typeof options.sockets === 'object' ? options.sockets?.path : undefined);
44
- try {
45
- await runFileGeneration({
46
- root,
47
- schema,
48
- sockets: scanResult.sockets,
49
- apiBasePath: options.apiBasePath ?? API_BASE_PATH,
50
- socketBasePath,
51
- openApi: options.openApi,
52
- serverPort: 5173,
53
- });
54
- }
55
- catch (err) {
56
- console.error('[vitek] Failed to generate types/services:', err instanceof Error ? err.message : err);
57
- }
58
- },
59
- resolveId(id, importer) {
60
- if (!id.startsWith('.') || !importer)
61
- return null;
62
- const fullApiDir = path.resolve(root, apiDirOption);
63
- let importerPath;
64
- if (importer.startsWith('file:')) {
65
- importerPath = fileURLToPath(importer);
66
- }
67
- else if (importer.startsWith('/')) {
68
- const virtualPath = path.join(root, importer.replace(/^\//, ''));
69
- importerPath = fs.existsSync(virtualPath) ? virtualPath : path.resolve(importer);
70
- }
71
- else {
72
- importerPath = path.resolve(importer);
73
- }
74
- const normalizedApiDir = path.resolve(fullApiDir);
75
- const normalizedImporter = path.resolve(importerPath);
76
- if (!normalizedImporter.startsWith(normalizedApiDir))
77
- return null;
78
- let resolved = path.resolve(path.dirname(normalizedImporter), id);
79
- if (!fs.existsSync(resolved)) {
80
- const ext = ['.ts', '.tsx', '.mts', '.js', '.jsx', '.mjs'].find((e) => fs.existsSync(resolved + e));
81
- if (ext)
82
- resolved += ext;
83
- }
84
- return fs.existsSync(resolved) ? pathToFileURL(resolved).href : null;
85
- },
86
- transform(code, id) {
87
- const idPath = id.startsWith('file:') ? fileURLToPath(id) : id;
88
- const srcDir = path.resolve(root, 'src');
89
- const virtualCandidate = idPath.startsWith('/') ? path.join(root, idPath.replace(/^\//, '')) : null;
90
- const normalizedId = virtualCandidate != null && fs.existsSync(virtualCandidate)
91
- ? virtualCandidate
92
- : path.resolve(idPath);
93
- if (!normalizedId.startsWith(srcDir))
94
- return null;
95
- const dir = path.dirname(normalizedId);
96
- const rootSlash = path.resolve(root) + path.sep;
97
- const rewritten = code.replace(/from\s+['"](\.\.?[^'"]+)['"]/g, (match, specifier) => {
98
- const resolved = path.resolve(dir, specifier);
99
- if (!resolved.startsWith(rootSlash))
100
- return match;
101
- let target = resolved;
102
- if (!fs.existsSync(target)) {
103
- const ext = ['.ts', '.tsx', '.mts', '.js', '.jsx', '.mjs'].find((e) => fs.existsSync(target + e));
104
- if (ext)
105
- target += ext;
106
- }
107
- if (!fs.existsSync(target))
108
- return match;
109
- const rootRelative = path.relative(root, target).replace(/\\/g, '/');
110
- const newSpecifier = `/${rootRelative}`;
111
- const quote = match.includes('"') ? '"' : "'";
112
- return `from ${quote}${newSpecifier}${quote}`;
113
- });
114
- return rewritten !== code ? { code: rewritten, map: null } : null;
115
- },
116
- async configureServer(server) {
117
- const fullApiDir = path.resolve(root, apiDirOption);
118
- if (!fs.existsSync(fullApiDir)) {
119
- server.config.logger.warn(`[vitek] API directory not found: ${fullApiDir}`);
120
- return;
121
- }
122
- const logger = createViteLogger(server.config.logger, options.logging);
123
- const socketsEnabled = options.sockets !== false;
124
- const socketBasePath = getSocketBasePath(options.apiBasePath, typeof options.sockets === 'object' ? options.sockets?.path : undefined);
125
- const { ready, middleware, cleanup, setupSockets } = createViteDevServerMiddleware({
126
- root,
127
- apiDir: fullApiDir,
128
- logger,
129
- viteServer: server,
130
- enableValidation: options.enableValidation || false,
131
- openApi: options.openApi,
132
- sockets: socketsEnabled,
133
- socketBasePath,
134
- });
135
- cleanupFn = cleanup;
136
- server.middlewares.use(middleware);
137
- await ready;
138
- if (socketsEnabled && server.httpServer) {
139
- setupSockets(server.httpServer);
140
- }
141
- logger.info('Vitek plugin initialized');
142
- const port = server.config.server?.port ?? 5173;
143
- const apiPath = options.apiBasePath ?? API_BASE_PATH;
144
- const originalPrintUrls = server.printUrls?.bind(server);
145
- if (typeof originalPrintUrls === 'function') {
146
- server.printUrls = () => {
147
- originalPrintUrls();
148
- const host = 'localhost';
149
- const apiUrl = `http://${host}:${port}${apiPath}`;
150
- server.config.logger.info(` ➜ API: ${apiUrl}`);
151
- if (socketsEnabled) {
152
- const wsUrl = `ws://${host}:${port}${socketBasePath}`;
153
- server.config.logger.info(` ➜ WS: ${wsUrl}`);
154
- }
155
- };
156
- }
157
- },
158
- async configurePreviewServer(server) {
159
- if (!buildApi) {
160
- return;
161
- }
162
- const bundlePath = path.join(buildOutDir, getApiBundleFilename());
163
- if (!fs.existsSync(bundlePath)) {
164
- server.config.logger.warn('[vitek] API bundle not found; preview serving static assets only. Run `vite build` first.');
165
- return;
166
- }
167
- const previewPort = server.config.preview?.port ?? 4173;
168
- const apiBaseUrl = `http://127.0.0.1:${previewPort}${API_BASE_PATH}`;
169
- const api = {
170
- async fetch(path, fetchOptions) {
171
- const url = `${apiBaseUrl}/${path.replace(/^\//, '')}`;
172
- const res = await fetch(url, {
173
- method: fetchOptions?.method ?? 'GET',
174
- headers: fetchOptions?.body !== undefined
175
- ? { 'Content-Type': 'application/json' }
176
- : undefined,
177
- body: fetchOptions?.body !== undefined
178
- ? JSON.stringify(fetchOptions.body)
179
- : undefined,
180
- });
181
- const text = await res.text();
182
- if (!text)
183
- return undefined;
184
- try {
185
- return JSON.parse(text);
186
- }
187
- catch {
188
- return text;
189
- }
190
- },
191
- };
192
- const noopSockets = { emit() { } };
193
- const shared = { sockets: noopSockets, api };
194
- const bundleUrl = pathToFileURL(bundlePath).href;
195
- const bundleLoadPromise = import(bundleUrl);
196
- let apiHandler = null;
197
- const apiMiddleware = (req, res, next) => {
198
- const pathname = req.url?.split('?')[0] ?? '';
199
- if (pathname !== API_BASE_PATH && !pathname.startsWith(API_BASE_PATH + '/')) {
200
- return next();
201
- }
202
- bundleLoadPromise
203
- .then((mod) => {
204
- if (!apiHandler) {
205
- apiHandler = createRequestHandler({
206
- routes: mod.routes,
207
- middlewares: mod.middlewares,
208
- shared,
209
- });
210
- server.config.logger.info('[vitek] API middleware registered for preview');
211
- }
212
- apiHandler(req, res, next);
213
- })
214
- .catch((err) => {
215
- server.config.logger.error(`[vitek] Failed to load API bundle: ${err instanceof Error ? err.message : String(err)}`);
216
- res.statusCode = 500;
217
- res.setHeader('Content-Type', 'application/json');
218
- res.end(JSON.stringify({ error: 'Internal server error', message: 'Failed to load API bundle' }));
219
- });
220
- };
221
- server.middlewares.use(apiMiddleware);
222
- const socketsEnabled = options.sockets !== false;
223
- const socketBasePath = getSocketBasePath(options.apiBasePath, typeof options.sockets === 'object' ? options.sockets?.path : undefined);
224
- const socketsBundlePath = path.join(buildOutDir, getSocketsBundleFilename());
225
- if (socketsEnabled && fs.existsSync(socketsBundlePath)) {
226
- try {
227
- const socketsUrl = pathToFileURL(socketsBundlePath).href;
228
- const mod = await import(socketsUrl);
229
- const handler = createSocketHandler({
230
- sockets: mod.sockets,
231
- socketBasePath,
232
- shared,
233
- });
234
- server.httpServer?.on('upgrade', handler);
235
- server.config.logger.info('[vitek] WebSocket sockets registered for preview');
236
- }
237
- catch (err) {
238
- server.config.logger.warn(`[vitek] Failed to load sockets bundle: ${err instanceof Error ? err.message : String(err)}`);
239
- }
240
- }
241
- },
242
- async closeBundle() {
243
- if (buildApi) {
244
- const fullApiDir = path.resolve(root, apiDirOption);
245
- try {
246
- await buildApiBundle({
247
- root,
248
- apiDir: fullApiDir,
249
- outDir: buildOutDir,
250
- });
251
- }
252
- catch (err) {
253
- console.error('[vitek] Failed to build API bundle:', err instanceof Error ? err.message : err);
254
- }
255
- const socketsEnabled = options.sockets !== false;
256
- if (socketsEnabled && fs.existsSync(fullApiDir)) {
257
- try {
258
- await buildSocketsBundle({
259
- root,
260
- apiDir: fullApiDir,
261
- outDir: buildOutDir,
262
- });
263
- }
264
- catch (err) {
265
- console.error('[vitek] Failed to build sockets bundle:', err instanceof Error ? err.message : err);
266
- }
267
- }
268
- }
269
- },
270
- buildEnd() {
271
- if (cleanupFn) {
272
- cleanupFn();
273
- cleanupFn = null;
274
- }
275
- },
276
- };
277
- }
5
+ export { vitek } from './plugin/vitek.js';