@kimesh/kit 0.2.8 → 0.2.9

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 (2) hide show
  1. package/dist/index.mjs +205 -30
  2. package/package.json +4 -4
package/dist/index.mjs CHANGED
@@ -15,7 +15,7 @@ import pc from "picocolors";
15
15
  import { defu } from "defu";
16
16
  import { loadEnv, mergeConfig } from "vite";
17
17
  import vue from "@vitejs/plugin-vue";
18
- import { kimeshRouterGenerator } from "@kimesh/router-generator";
18
+ import { collectLayerRoutes, createScanner, createTreeBuilder, generateMiddlewareRegistry, generateMiddlewareTypes, generateRouteTypes, generateRoutes, kimeshRouterGenerator, mergeRoutes, scanLayerMiddleware } from "@kimesh/router-generator";
19
19
  import { generateLayerAliases, generateLayerAliases as generateLayerAliases$1, mergeLayerConfigs, prepareLayers, prepareLayers as prepareLayers$1, resolveLayers } from "@kimesh/layers";
20
20
  import { buildImportRegistry, generateDts, kimeshAutoImport, kimeshAutoImport as kimeshAutoImport$1, scanExports } from "@kimesh/auto-import";
21
21
  import { loadConfig as loadConfig$1 } from "c12";
@@ -1103,15 +1103,23 @@ function addPluginsTemplate(kimesh, discoveredPlugins) {
1103
1103
  * Each entry maps an internal alias (#kimesh/...) to the actual internal
1104
1104
  * package subpath export (@kimesh/...) that should be resolved and re-exported.
1105
1105
  */
1106
- const INTERNAL_ALIASES = [{
1107
- alias: "#kimesh/head/plugin",
1108
- packageSpecifier: "@kimesh/head/plugin",
1109
- filename: "head-plugin.mjs"
1110
- }, {
1111
- alias: "#kimesh/router-runtime/default-app",
1112
- packageSpecifier: "@kimesh/router-runtime/default-app",
1113
- filename: "router-runtime-default-app.mjs"
1114
- }];
1106
+ const INTERNAL_ALIASES = [
1107
+ {
1108
+ alias: "#kimesh/head/plugin",
1109
+ packageSpecifier: "@kimesh/head/plugin",
1110
+ filename: "head-plugin.mjs"
1111
+ },
1112
+ {
1113
+ alias: "#kimesh/router-runtime/default-app",
1114
+ packageSpecifier: "@kimesh/router-runtime/default-app",
1115
+ filename: "router-runtime-default-app.mjs"
1116
+ },
1117
+ {
1118
+ alias: "#kimesh/middleware/plugin",
1119
+ packageSpecifier: "@kimesh/router-runtime/middleware/plugin",
1120
+ filename: "middleware-plugin.mjs"
1121
+ }
1122
+ ];
1115
1123
  /**
1116
1124
  * Resolve a package specifier to an absolute file path.
1117
1125
  * This uses exsolve/createRequire to find the package from @kimesh/kit's location.
@@ -1651,7 +1659,7 @@ function debugTable(title, data) {
1651
1659
  * @returns TSConfig JSON object
1652
1660
  */
1653
1661
  function generateTsConfig(options) {
1654
- const { rootDir, srcDir, buildDir, aliases, layerAliases = {}, moduleAliases = {}, internalAliases = {}, include = ["../src/**/*", "./**/*"], exclude = ["../node_modules"] } = options;
1662
+ const { rootDir, srcDir, buildDir, aliases, layerAliases = {}, moduleAliases = {}, internalAliases = {}, include = ["../src/**/*", "./**/*"] } = options;
1655
1663
  const allAliases = {
1656
1664
  ...aliases,
1657
1665
  ...layerAliases,
@@ -1665,6 +1673,16 @@ function generateTsConfig(options) {
1665
1673
  paths[alias] = [normalizedPath];
1666
1674
  paths[`${alias}/*`] = [`${normalizedPath}/*`];
1667
1675
  }
1676
+ for (const pkg of [
1677
+ "@kimesh/router-runtime",
1678
+ "@kimesh/kit",
1679
+ "@kimesh/cli",
1680
+ "@kimesh/head",
1681
+ "@kimesh/query"
1682
+ ]) {
1683
+ paths[pkg] = [`../node_modules/${pkg}`];
1684
+ paths[`${pkg}/*`] = [`../node_modules/${pkg}/*`];
1685
+ }
1668
1686
  return {
1669
1687
  compilerOptions: {
1670
1688
  target: "ESNext",
@@ -1681,8 +1699,7 @@ function generateTsConfig(options) {
1681
1699
  baseUrl: ".",
1682
1700
  paths
1683
1701
  },
1684
- include,
1685
- exclude
1702
+ include
1686
1703
  };
1687
1704
  }
1688
1705
  /**
@@ -1696,6 +1713,8 @@ function writeTsConfig(options) {
1696
1713
  const tsconfig = generateTsConfig(options);
1697
1714
  writeFileSync(join$1(buildDir, "tsconfig.json"), JSON.stringify(tsconfig, null, 2), "utf-8");
1698
1715
  writeFileSync(join$1(buildDir, "kimesh.d.ts"), generateKimeshDts(), "utf-8");
1716
+ writeFileSync(join$1(buildDir, "plugins.d.ts"), generatePluginsDts(), "utf-8");
1717
+ writeFileSync(join$1(buildDir, "route-query.d.ts"), generateRouteQueryDts(), "utf-8");
1699
1718
  }
1700
1719
  /**
1701
1720
  * Generate kimesh.d.ts content with global type declarations
@@ -1736,6 +1755,45 @@ declare global {
1736
1755
  }
1737
1756
  `;
1738
1757
  }
1758
+ /**
1759
+ * Generate plugins.d.ts for #kimesh/plugins module
1760
+ */
1761
+ function generatePluginsDts() {
1762
+ return `/* eslint-disable */
1763
+ /* prettier-ignore */
1764
+
1765
+ /**
1766
+ * Type declarations for #kimesh/plugins virtual module
1767
+ * DO NOT EDIT - This file is auto-generated by Kimesh.
1768
+ */
1769
+
1770
+ /// <reference types="@kimesh/router-runtime" />
1771
+
1772
+ declare module '#kimesh/plugins' {
1773
+ import type { KimeshRuntimePlugin } from '@kimesh/router-runtime'
1774
+ export const plugins: KimeshRuntimePlugin[]
1775
+ }
1776
+ `;
1777
+ }
1778
+ /**
1779
+ * Generate route-query.d.ts for ?route query imports
1780
+ */
1781
+ function generateRouteQueryDts() {
1782
+ return `/* eslint-disable */
1783
+ /* prettier-ignore */
1784
+
1785
+ /**
1786
+ * Type declarations for ?route query imports (Vite virtual modules)
1787
+ * DO NOT EDIT - This file is auto-generated by Kimesh.
1788
+ */
1789
+
1790
+ declare module '*?route' {
1791
+ import type { RouteDefinition } from '@kimesh/router-runtime'
1792
+ const routeDef: RouteDefinition | undefined
1793
+ export default routeDef
1794
+ }
1795
+ `;
1796
+ }
1739
1797
 
1740
1798
  //#endregion
1741
1799
  //#region src/kit/phase2-utils.ts
@@ -2460,6 +2518,10 @@ const SUBPATH_EXPORT_MAP = {
2460
2518
  pkg: "router-runtime",
2461
2519
  file: "dist/default-app.mjs"
2462
2520
  },
2521
+ "@kimesh/router-runtime/middleware/plugin": {
2522
+ pkg: "router-runtime",
2523
+ file: "dist/middleware/plugin.mjs"
2524
+ },
2463
2525
  "kimesh/head/plugin": {
2464
2526
  pkg: "head",
2465
2527
  file: "dist/plugin.mjs"
@@ -2467,6 +2529,10 @@ const SUBPATH_EXPORT_MAP = {
2467
2529
  "kimesh/router-runtime/default-app": {
2468
2530
  pkg: "router-runtime",
2469
2531
  file: "dist/default-app.mjs"
2532
+ },
2533
+ "kimesh/router-runtime/middleware/plugin": {
2534
+ pkg: "router-runtime",
2535
+ file: "dist/middleware/plugin.mjs"
2470
2536
  }
2471
2537
  };
2472
2538
  /**
@@ -2699,6 +2765,41 @@ function kimeshPlugin(options = {}) {
2699
2765
  consola.info(`[Kimesh] Found ${state.kimesh._registries.runtimePlugins.length} module-registered plugins`);
2700
2766
  }
2701
2767
  }
2768
+ const middlewareDir = join$1(resolvedDirs.srcDir, "middleware");
2769
+ let hasMiddleware = false;
2770
+ try {
2771
+ const middlewareResult = await scanLayerMiddleware([{
2772
+ layerName: "app",
2773
+ layerPath: configRoot,
2774
+ middlewareDir,
2775
+ priority: 0
2776
+ }, ...state.resolvedLayers.filter((l) => !l.isApp).map((layer) => ({
2777
+ layerName: layer.name,
2778
+ layerPath: layer.path,
2779
+ middlewareDir: join$1(layer.path, "src", "middleware"),
2780
+ priority: layer.priority
2781
+ }))], { orderStrategy: "alphabetical" });
2782
+ hasMiddleware = middlewareResult.middleware.length > 0;
2783
+ if (hasMiddleware) {
2784
+ const registryCode = generateMiddlewareRegistry(middlewareResult);
2785
+ const registryPath = join$1(resolvedDirs.buildDir, "middleware.gen.ts");
2786
+ if (!existsSync(resolvedDirs.buildDir)) mkdirSync(resolvedDirs.buildDir, { recursive: true });
2787
+ writeFileSync(registryPath, registryCode, "utf-8");
2788
+ const typesCode = generateMiddlewareTypes(middlewareResult);
2789
+ writeFileSync(join$1(resolvedDirs.buildDir, "middleware.d.ts"), typesCode, "utf-8");
2790
+ if (debug) consola.info(`[Kimesh] Middleware: ${middlewareResult.globalMiddleware.length} global, ${middlewareResult.namedMiddleware.length} named`);
2791
+ const middlewarePluginSrc = "#kimesh/middleware/plugin";
2792
+ if (!state.kimesh._registries.runtimePlugins.some((p) => p.src === middlewarePluginSrc)) {
2793
+ state.kimesh._registries.runtimePlugins.push({
2794
+ src: middlewarePluginSrc,
2795
+ name: "middleware"
2796
+ });
2797
+ if (debug) consola.info(`[Kimesh] Auto-registered middleware plugin`);
2798
+ }
2799
+ }
2800
+ } catch (error) {
2801
+ if (debug) consola.warn(`[Kimesh] Middleware scanning failed:`, error);
2802
+ }
2702
2803
  generateModulesTypeDeclaration(config.modules, state.generatedDir);
2703
2804
  await writeTemplates(state.kimesh);
2704
2805
  const userAliases = buildAliases(config, resolvedDirs.srcDir, configRoot);
@@ -2711,7 +2812,8 @@ function kimeshPlugin(options = {}) {
2711
2812
  "#kimesh/routes": join$1(resolvedDirs.buildDir, "routes.gen.ts"),
2712
2813
  "#kimesh/app": existsSync(appVuePath) ? appVuePath : "@kimesh/router-runtime/default-app",
2713
2814
  "#kimesh/context": join$1(resolvedDirs.srcDir, "app.context.ts"),
2714
- "#kimesh/plugins": join$1(resolvedDirs.buildDir, "plugins.mjs")
2815
+ "#kimesh/plugins": join$1(resolvedDirs.buildDir, "plugins.mjs"),
2816
+ "#kimesh/middleware": join$1(resolvedDirs.buildDir, "middleware.gen.ts")
2715
2817
  };
2716
2818
  writeTsConfig({
2717
2819
  rootDir: configRoot,
@@ -2762,6 +2864,7 @@ function kimeshPlugin(options = {}) {
2762
2864
  "#kimesh/app": existsSync(appVuePath) ? appVuePath : "@kimesh/router-runtime/default-app",
2763
2865
  "#kimesh/context": join$1(resolvedDirs.srcDir, "app.context.ts"),
2764
2866
  "#kimesh/plugins": join$1(resolvedDirs.buildDir, "plugins.mjs"),
2867
+ "#kimesh/middleware": join$1(resolvedDirs.buildDir, "middleware.gen.ts"),
2765
2868
  ...userAliases,
2766
2869
  ...layerAliases,
2767
2870
  ...moduleAliases
@@ -3105,24 +3208,58 @@ async function prepare(options = {}) {
3105
3208
  });
3106
3209
  generatedFiles.push("tsconfig.json");
3107
3210
  if (verbose) consola.success(`[Kimesh] Generated .kimesh/tsconfig.json`);
3108
- const routesStubPath = join$1(buildDir, "routes.gen.ts");
3109
- if (!existsSync(routesStubPath)) {
3110
- writeFileSync(routesStubPath, `/**
3111
- * Kimesh Routes - Auto-generated
3112
- *
3113
- * This file is a stub generated by 'km prepare'.
3114
- * It will be populated with actual routes when running 'km dev' or 'km build'.
3115
- *
3116
- * DO NOT EDIT - This file is regenerated automatically.
3117
- */
3118
-
3119
- import type { RouteRecordRaw } from 'vue-router'
3120
-
3121
- export const routes: RouteRecordRaw[] = []
3122
- `, "utf-8");
3211
+ const routesDir = join$1(srcDir, "routes");
3212
+ if (existsSync(routesDir)) try {
3213
+ const layerRouteConfigs = resolvedLayers.filter((layer) => !layer.isApp).map((layer) => {
3214
+ const routesFolder = layer.config.routes?.folder || "routes";
3215
+ return {
3216
+ layerName: layer.name,
3217
+ routesDir: join$1(layer.path, "src", routesFolder),
3218
+ layerPath: layer.path,
3219
+ basePath: layer.config.routes?.basePath,
3220
+ priority: layer.priority
3221
+ };
3222
+ }).filter((cfg) => existsSync(cfg.routesDir));
3223
+ const scannerConfig = {
3224
+ srcDir: "src",
3225
+ routesDir: "routes",
3226
+ generatedDir: ".kimesh",
3227
+ extensions: [".vue"],
3228
+ importMode: "async",
3229
+ routesDirPath: routesDir,
3230
+ generatedDirPath: buildDir,
3231
+ root
3232
+ };
3233
+ const parsedRoutes = await createScanner(scannerConfig).scan();
3234
+ let routes = createTreeBuilder(scannerConfig).build(parsedRoutes);
3235
+ if (layerRouteConfigs.length > 0) {
3236
+ const layerResult = await collectLayerRoutes(layerRouteConfigs.map((l) => ({
3237
+ layer: l.layerName,
3238
+ routesDir: l.routesDir,
3239
+ basePath: l.basePath,
3240
+ priority: l.priority
3241
+ })), scannerConfig);
3242
+ if (verbose) consola.info(`[Kimesh] Collected ${layerResult.routes.length} routes from ${layerRouteConfigs.length} layers`);
3243
+ routes = mergeRoutes(routes, layerResult.routes, scannerConfig);
3244
+ }
3245
+ const routesCode = generateRoutes(routes, scannerConfig);
3246
+ writeFileSync(join$1(buildDir, "routes.gen.ts"), routesCode, "utf-8");
3123
3247
  generatedFiles.push("routes.gen.ts");
3124
- if (verbose) consola.success(`[Kimesh] Generated .kimesh/routes.gen.ts (stub)`);
3248
+ const typesCode = generateRouteTypes(routes);
3249
+ writeFileSync(join$1(buildDir, "typed-routes.d.ts"), typesCode, "utf-8");
3250
+ generatedFiles.push("typed-routes.d.ts");
3251
+ for (const layer of layerRouteConfigs) {
3252
+ const layerKimeshDir = join$1(layer.layerPath, ".kimesh");
3253
+ if (!existsSync(layerKimeshDir)) mkdirSync(layerKimeshDir, { recursive: true });
3254
+ writeFileSync(join$1(layerKimeshDir, "typed-routes.d.ts"), typesCode, "utf-8");
3255
+ if (verbose) consola.success(`[Kimesh] Generated ${layer.layerName}/.kimesh/typed-routes.d.ts`);
3256
+ }
3257
+ if (verbose) consola.success(`[Kimesh] Generated .kimesh/routes.gen.ts and typed-routes.d.ts (${routes.length} routes)`);
3258
+ } catch (error) {
3259
+ if (verbose) consola.warn(`[Kimesh] Route scanning failed: ${error}`);
3260
+ generateRoutesStub(buildDir, generatedFiles, verbose);
3125
3261
  }
3262
+ else generateRoutesStub(buildDir, generatedFiles, verbose);
3126
3263
  const pluginsStubPath = join$1(buildDir, "plugins.mjs");
3127
3264
  if (!existsSync(pluginsStubPath)) {
3128
3265
  writeFileSync(pluginsStubPath, `/**
@@ -3201,6 +3338,21 @@ declare global {
3201
3338
  // Vue Router imports
3202
3339
  const useRoute: typeof import('vue-router')['useRoute']
3203
3340
  const useRouter: typeof import('vue-router')['useRouter']
3341
+
3342
+ // Kimesh Router Runtime imports
3343
+ const createFileRoute: typeof import('@kimesh/router-runtime')['createFileRoute']
3344
+ const defineRoute: typeof import('@kimesh/router-runtime')['defineRoute']
3345
+ const defineContext: typeof import('@kimesh/router-runtime')['defineContext']
3346
+ const useKimeshContext: typeof import('@kimesh/router-runtime')['useKimeshContext']
3347
+ const useNavigate: typeof import('@kimesh/router-runtime')['useNavigate']
3348
+ const useParams: typeof import('@kimesh/router-runtime')['useParams']
3349
+ const useReactiveParams: typeof import('@kimesh/router-runtime')['useReactiveParams']
3350
+ const useSearch: typeof import('@kimesh/router-runtime')['useSearch']
3351
+ const useRuntimeConfig: typeof import('@kimesh/router-runtime')['useRuntimeConfig']
3352
+ const navigateTo: typeof import('@kimesh/router-runtime')['navigateTo']
3353
+ const abortNavigation: typeof import('@kimesh/router-runtime')['abortNavigation']
3354
+ function defineKimeshMiddleware(middleware: import('@kimesh/router-runtime').RouteMiddleware): import('@kimesh/router-runtime').RouteMiddleware
3355
+ function defineKimeshMiddleware(definition: import('@kimesh/router-runtime').MiddlewareDefinition): import('@kimesh/router-runtime').RouteMiddleware
3204
3356
  }
3205
3357
  `, "utf-8");
3206
3358
  generatedFiles.push("auto-imports.d.ts");
@@ -3246,6 +3398,29 @@ function extractModuleNames(modules) {
3246
3398
  else if (Array.isArray(mod) && typeof mod[0] === "string") names.push(mod[0]);
3247
3399
  return names;
3248
3400
  }
3401
+ /**
3402
+ * Generate stub routes.gen.ts when route scanning is not available
3403
+ */
3404
+ function generateRoutesStub(buildDir, generatedFiles, verbose) {
3405
+ const routesStubPath = join$1(buildDir, "routes.gen.ts");
3406
+ if (!existsSync(routesStubPath)) {
3407
+ writeFileSync(routesStubPath, `/**
3408
+ * Kimesh Routes - Auto-generated
3409
+ *
3410
+ * This file is a stub generated by 'km prepare'.
3411
+ * It will be populated with actual routes when running 'km dev' or 'km build'.
3412
+ *
3413
+ * DO NOT EDIT - This file is regenerated automatically.
3414
+ */
3415
+
3416
+ import type { RouteRecordRaw } from 'vue-router'
3417
+
3418
+ export const routes: RouteRecordRaw[] = []
3419
+ `, "utf-8");
3420
+ generatedFiles.push("routes.gen.ts");
3421
+ if (verbose) consola.success(`[Kimesh] Generated .kimesh/routes.gen.ts (stub)`);
3422
+ }
3423
+ }
3249
3424
 
3250
3425
  //#endregion
3251
3426
  export { DEFAULT_ALIASES, DEFAULT_IGNORE_PATTERNS, INTERNAL_ALIASES, addAlias, addBuildPlugin, addComponent, addComponentResolver, addComponentsDir, addImports, addImportsDir, addImportsPreset, addInternalAliasTemplates, addPluginsTemplate, addRuntimePlugin, addTemplate, addTypeTemplate, addVitePlugin, applyEnv, buildAliases, buildImportRegistry, buildInternalAliasMap, createDebugLogger, createDefaultRuntimeConfig, createHMRWatcher, createIgnoreFilter, createIgnoreMatcher, createKimesh, createResolver, createTimer, debug, debugTable, defineKimeshModule, defineKimeshPlugin, defineKmConfig, envToKey, executeModule, executeModules, filterIgnored, findMatchingRules, formatConflictWarning, formatError, formatTiming, formatWarning, generateDts, generateInternalAliasTemplate, generateLayerAliases, generatePluginsTemplate, generateRouteRulesManifest, getIgnorePatterns, getRedirectInfo, getRouteRule, getRuntimePlugins, hasPlugins, hasRuntimePlugin, isDebug, isDebugEnabled, keyToEnv, kimeshAutoImport, kimeshPlugin, loadConfig, matchRoutePattern, mergeLayerConfigs, mergeRouteRules, normalizeDebugConfig, normalizeModuleInput, prepare, prepareLayers, removeRuntimePlugin, resolveAlias, resolveAliasPath, resolveLayers, resolvePathFromBuild, resolvePathFromRoot, scanExports, scanPluginsDir, setDebugConfig, shouldIgnore, toTsConfigPaths, toViteAliases, tryUseKimesh, updateTemplates, useKimesh, writeTemplates };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kimesh/kit",
3
- "version": "0.2.8",
3
+ "version": "0.2.9",
4
4
  "description": "Build-time engine for Kimesh framework",
5
5
  "type": "module",
6
6
  "repository": {
@@ -31,9 +31,9 @@
31
31
  "vue": "^3.5.0"
32
32
  },
33
33
  "dependencies": {
34
- "@kimesh/auto-import": "0.2.8",
35
- "@kimesh/layers": "0.2.8",
36
- "@kimesh/router-generator": "0.2.8",
34
+ "@kimesh/auto-import": "0.2.9",
35
+ "@kimesh/layers": "0.2.9",
36
+ "@kimesh/router-generator": "0.2.9",
37
37
  "@vitejs/plugin-vue": "^6.0.3",
38
38
  "c12": "^3.3.3",
39
39
  "consola": "^3.4.2",