@route-forge/vue 0.1.0 → 0.2.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.
package/README.md CHANGED
@@ -13,13 +13,13 @@ pnpm add @route-forge/vue @route-forge/core
13
13
  ```ts
14
14
  // main.ts
15
15
  import { createApp } from 'vue'
16
- import { ForgePlugin } from '@route-forge/vue'
16
+ import { createRouteForgePlugin } from '@route-forge/vue'
17
17
  import App from './App.vue'
18
18
 
19
19
  const app = createApp(App)
20
- app.use(ForgePlugin, {
20
+ app.use(createRouteForgePlugin({
21
21
  endpoint: '/_forge/routes',
22
- })
22
+ }))
23
23
  app.mount('#app')
24
24
  ```
25
25
 
@@ -27,7 +27,7 @@ app.mount('#app')
27
27
  <script setup lang="ts">
28
28
  import { useForgeRoute } from '@route-forge/vue'
29
29
 
30
- const { data: route } = useForgeRoute('login.show')
30
+ const url = useForgeRoute('public', 'login.show')
31
31
  </script>
32
32
  ```
33
33
 
package/dist/index.cjs CHANGED
@@ -11,7 +11,7 @@ function createRouteForgePlugin(options) {
11
11
  install(app) {
12
12
  app.provide(FORGE_INJECTION_KEY, forge);
13
13
  app.config.globalProperties.$forge = {
14
- route: (name, params) => forge.route(name, params)
14
+ route: (level, name, params) => forge.route(level, name, params)
15
15
  };
16
16
  }
17
17
  };
@@ -29,11 +29,11 @@ function useForgeApi() {
29
29
  const forge = useForge();
30
30
  const pending = vue.ref(false);
31
31
  const error = vue.ref(null);
32
- async function call(name, params) {
32
+ async function call(level, name, params) {
33
33
  pending.value = true;
34
34
  error.value = null;
35
35
  try {
36
- const data = await forge.api(name, params);
36
+ const data = await forge.api(level, name, params);
37
37
  return { data, error: null };
38
38
  } catch (e) {
39
39
  error.value = e;
@@ -58,22 +58,23 @@ function useForgeLevel(level) {
58
58
  });
59
59
  return { loaded, error };
60
60
  }
61
- function useForgeRoute(name, params) {
61
+ function useForgeRoute(level, name, params) {
62
62
  const forge = useForge();
63
63
  return vue.computed(() => {
64
+ const lvl = typeof level === "function" ? level() : level;
64
65
  const n = typeof name === "function" ? name() : name;
65
66
  const p = params ? params() : void 0;
66
- return forge.route(n, p);
67
+ return forge.route(lvl, n, p);
67
68
  });
68
69
  }
69
70
 
70
71
  // src/composables/useForgeByPrefix.ts
71
- function useForgeByPrefix(prefix, separator = ".") {
72
+ function useForgeByPrefix(level, prefix, separator = ".") {
72
73
  const forge = useForge();
73
74
  const join = (suffix) => suffix ? `${prefix}${separator}${suffix}` : prefix;
74
75
  return {
75
- api: (suffix, params) => forge.api(join(suffix), params),
76
- route: (suffix, params) => forge.route(join(suffix), params)
76
+ api: (suffix, params) => forge.api(level, join(suffix), params),
77
+ route: (suffix, params) => forge.route(level, join(suffix), params)
77
78
  };
78
79
  }
79
80
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugin.ts","../src/composables/useForgeApi.ts","../src/composables/useForgeLevel.ts","../src/composables/useForgeRoute.ts","../src/composables/useForgeByPrefix.ts"],"names":["createRouteForge","inject","ref","onMounted","computed"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Vue 3 插件入口\n * @see .docs/SPEC.md §4.1.7\n *\n * 提供:\n * - 全局属性 $forge(route() 工具)\n * - inject symbol 注入 RouteForge 实例供 composable 使用\n */\n\nimport type { App, InjectionKey } from 'vue';\nimport { inject, reactive, readonly } from 'vue';\nimport {\n createRouteForge,\n type RouteForge,\n type RouteForgeOptions,\n} from '@route-forge/core';\n\nexport const FORGE_INJECTION_KEY: InjectionKey<RouteForge> = Symbol('route-forge');\n\nexport interface RouteForgePluginOptions extends RouteForgeOptions {}\n\nexport function createRouteForgePlugin(options: RouteForgePluginOptions) {\n const forge = createRouteForge(options);\n\n return {\n install(app: App) {\n app.provide(FORGE_INJECTION_KEY, forge);\n app.config.globalProperties.$forge = {\n route: (name: string, params?: Record<string, unknown>) =>\n forge.route(name, params),\n };\n },\n };\n}\n\nexport function useForge(): RouteForge {\n const forge = inject(FORGE_INJECTION_KEY);\n if (!forge) {\n throw new Error(\n '[route-forge/vue] useForge() must be used inside an app with createRouteForgePlugin() installed',\n );\n }\n return forge;\n}\n\nexport { readonly, reactive };\n","/**\n * useForgeApi:包装 forge.api(),自动管理 loading/error 状态\n * @see .docs/SPEC.md §4.1.7\n */\n\nimport { ref } from 'vue';\nimport { useForge } from '../plugin.js';\nimport type { ApiCallParams } from '@route-forge/core';\n\nexport interface UseForgeApiReturn {\n pending: ReturnType<typeof ref<boolean>>;\n error: ReturnType<typeof ref<unknown>>;\n call: (name: string, params?: ApiCallParams) => Promise<{\n data: unknown;\n error: unknown;\n }>;\n}\n\nexport function useForgeApi(): UseForgeApiReturn {\n const forge = useForge();\n const pending = ref(false);\n const error = ref<unknown>(null);\n\n async function call(name: string, params?: ApiCallParams) {\n pending.value = true;\n error.value = null;\n try {\n const data = await forge.api(name, params);\n return { data, error: null };\n } catch (e) {\n error.value = e;\n return { data: undefined, error: e };\n } finally {\n pending.value = false;\n }\n }\n\n return { pending, error, call };\n}\n","/**\n * useForgeLevel:声明组件依赖某层级,挂载时自动 forge.load(level),销毁时不主动失效\n * @see .docs/SPEC.md §4.1.7\n */\n\nimport { onMounted, ref } from 'vue';\nimport { useForge } from '../plugin.js';\n\nexport interface UseForgeLevelReturn {\n loaded: ReturnType<typeof ref<boolean>>;\n error: ReturnType<typeof ref<unknown>>;\n}\n\nexport function useForgeLevel(level: string): UseForgeLevelReturn {\n const forge = useForge();\n const loaded = ref(false);\n const error = ref<unknown>(null);\n\n onMounted(async () => {\n try {\n await forge.load(level);\n loaded.value = true;\n } catch (e) {\n error.value = e;\n }\n });\n\n return { loaded, error };\n}\n","/**\n * useForgeRoute:仅生成 URL,不发请求(用于 <a href>、外部跳转等)\n * @see .docs/SPEC.md §4.1.7\n */\n\nimport { computed, type ComputedRef } from 'vue';\nimport { useForge } from '../plugin.js';\n\nexport function useForgeRoute(\n name: string | (() => string),\n params?: () => Record<string, unknown>,\n): ComputedRef<string> {\n const forge = useForge();\n return computed(() => {\n const n = typeof name === 'function' ? name() : name;\n const p = params ? params() : undefined;\n return forge.route(n, p);\n });\n}\n","/**\n * useForgeByPrefix:带名字前缀的封装,方便后续减少名称传入\n * @see .docs/SPEC.md §4.1.7\n *\n * 示例:\n * const { api } = useForgeByPrefix('admin.users');\n * await api('show', { user: 1 }); // 等价于 forge.api('admin.users.show', { user: 1 })\n */\n\nimport { useForge } from '../plugin.js';\nimport type { ApiCallParams } from '@route-forge/core';\n\nexport interface UseForgeByPrefixReturn {\n api: (suffix: string, params?: ApiCallParams) => Promise<unknown>;\n route: (suffix: string, params?: Record<string, unknown>) => string;\n}\n\nexport function useForgeByPrefix(prefix: string, separator = '.'): UseForgeByPrefixReturn {\n const forge = useForge();\n\n const join = (suffix: string) => (suffix ? `${prefix}${separator}${suffix}` : prefix);\n\n return {\n api: (suffix, params) => forge.api(join(suffix), params),\n route: (suffix, params) => forge.route(join(suffix), params),\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/plugin.ts","../src/composables/useForgeApi.ts","../src/composables/useForgeLevel.ts","../src/composables/useForgeRoute.ts","../src/composables/useForgeByPrefix.ts"],"names":["createRouteForge","inject","ref","onMounted","computed"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Vue 3 插件入口\n * @see .docs/SPEC.md §4.1.7\n *\n * 提供:\n * - 全局属性 $forge(route() 工具)\n * - inject symbol 注入 RouteForge 实例供 composable 使用\n */\n\nimport type { App, InjectionKey, Plugin } from 'vue';\nimport { inject, reactive, readonly } from 'vue';\nimport { createRouteForge, type RouteForge, type RouteForgeOptions } from '@route-forge/core';\n\nexport const FORGE_INJECTION_KEY: InjectionKey<RouteForge> = Symbol('route-forge');\n\nexport interface RouteForgePluginOptions extends RouteForgeOptions {}\n\nexport function createRouteForgePlugin(options: RouteForgePluginOptions): Plugin<[]> {\n const forge = createRouteForge(options);\n\n return {\n install(app: App) {\n app.provide(FORGE_INJECTION_KEY, forge);\n app.config.globalProperties.$forge = {\n route: (level: string, name: string, params?: Record<string, unknown>) =>\n forge.route(level, name, params),\n };\n },\n };\n}\n\nexport function useForge(): RouteForge {\n const forge = inject(FORGE_INJECTION_KEY);\n if (!forge) {\n throw new Error(\n '[route-forge/vue] useForge() must be used inside an app with createRouteForgePlugin() installed',\n );\n }\n return forge;\n}\n\nexport { readonly, reactive };\n","/**\n * useForgeApi:包装 forge.api(),自动管理 loading/error 状态\n * @see .docs/SPEC.md §4.1.7\n */\n\nimport { ref } from 'vue';\nimport { useForge } from '../plugin.js';\nimport type { ApiCallParams } from '@route-forge/core';\n\nexport interface UseForgeApiReturn {\n pending: ReturnType<typeof ref<boolean>>;\n error: ReturnType<typeof ref<unknown>>;\n call: (level: string, name: string, params?: ApiCallParams) => Promise<{\n data: unknown;\n error: unknown;\n }>;\n}\n\nexport function useForgeApi(): UseForgeApiReturn {\n const forge = useForge();\n const pending = ref(false);\n const error = ref<unknown>(null);\n\n async function call(level: string, name: string, params?: ApiCallParams) {\n pending.value = true;\n error.value = null;\n try {\n const data = await forge.api(level, name, params);\n return { data, error: null };\n } catch (e) {\n error.value = e;\n return { data: undefined, error: e };\n } finally {\n pending.value = false;\n }\n }\n\n return { pending, error, call };\n}\n","/**\n * useForgeLevel:声明组件依赖某层级,挂载时自动 forge.load(level),销毁时不主动失效\n * @see .docs/SPEC.md §4.1.7\n */\n\nimport { onMounted, ref } from 'vue';\nimport { useForge } from '../plugin.js';\n\nexport interface UseForgeLevelReturn {\n loaded: ReturnType<typeof ref<boolean>>;\n error: ReturnType<typeof ref<unknown>>;\n}\n\nexport function useForgeLevel(level: string): UseForgeLevelReturn {\n const forge = useForge();\n const loaded = ref(false);\n const error = ref<unknown>(null);\n\n onMounted(async () => {\n try {\n await forge.load(level);\n loaded.value = true;\n } catch (e) {\n error.value = e;\n }\n });\n\n return { loaded, error };\n}\n","/**\n * useForgeRoute:仅生成 URL,不发请求(用于 <a href>、外部跳转等)\n * @see .docs/SPEC.md §4.1.7\n */\n\nimport { computed, type ComputedRef } from 'vue';\nimport { useForge } from '../plugin.js';\n\nexport function useForgeRoute(\n level: string | (() => string),\n name: string | (() => string),\n params?: () => Record<string, unknown>,\n): ComputedRef<string> {\n const forge = useForge();\n return computed(() => {\n const lvl = typeof level === 'function' ? level() : level;\n const n = typeof name === 'function' ? name() : name;\n const p = params ? params() : undefined;\n return forge.route(lvl, n, p);\n });\n}\n","/**\n * useForgeByPrefix:带层级 + 名字前缀的封装,方便后续减少名称传入\n * @see .docs/SPEC.md §4.1.7\n *\n * 示例:\n * const { api } = useForgeByPrefix('admin', 'users');\n * await api('show', { user: 1 }); // 等价于 forge.api('admin', 'users.show', { user: 1 })\n */\n\nimport { useForge } from '../plugin.js';\nimport type { ApiCallParams } from '@route-forge/core';\n\nexport interface UseForgeByPrefixReturn {\n api: (suffix: string, params?: ApiCallParams) => Promise<unknown>;\n route: (suffix: string, params?: Record<string, unknown>) => string;\n}\n\nexport function useForgeByPrefix(level: string, prefix: string, separator = '.'): UseForgeByPrefixReturn {\n const forge = useForge();\n\n const join = (suffix: string) => (suffix ? `${prefix}${separator}${suffix}` : prefix);\n\n return {\n api: (suffix, params) => forge.api(level, join(suffix), params),\n route: (suffix, params) => forge.route(level, join(suffix), params),\n };\n}\n"]}
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- import { InjectionKey, App, ref, ComputedRef } from 'vue';
1
+ import { InjectionKey, Plugin, ref, ComputedRef } from 'vue';
2
2
  import { RouteForge, RouteForgeOptions, ApiCallParams } from '@route-forge/core';
3
3
 
4
4
  /**
@@ -13,9 +13,7 @@ import { RouteForge, RouteForgeOptions, ApiCallParams } from '@route-forge/core'
13
13
  declare const FORGE_INJECTION_KEY: InjectionKey<RouteForge>;
14
14
  interface RouteForgePluginOptions extends RouteForgeOptions {
15
15
  }
16
- declare function createRouteForgePlugin(options: RouteForgePluginOptions): {
17
- install(app: App): void;
18
- };
16
+ declare function createRouteForgePlugin(options: RouteForgePluginOptions): Plugin<[]>;
19
17
  declare function useForge(): RouteForge;
20
18
 
21
19
  /**
@@ -26,7 +24,7 @@ declare function useForge(): RouteForge;
26
24
  interface UseForgeApiReturn {
27
25
  pending: ReturnType<typeof ref<boolean>>;
28
26
  error: ReturnType<typeof ref<unknown>>;
29
- call: (name: string, params?: ApiCallParams) => Promise<{
27
+ call: (level: string, name: string, params?: ApiCallParams) => Promise<{
30
28
  data: unknown;
31
29
  error: unknown;
32
30
  }>;
@@ -49,21 +47,21 @@ declare function useForgeLevel(level: string): UseForgeLevelReturn;
49
47
  * @see .docs/SPEC.md §4.1.7
50
48
  */
51
49
 
52
- declare function useForgeRoute(name: string | (() => string), params?: () => Record<string, unknown>): ComputedRef<string>;
50
+ declare function useForgeRoute(level: string | (() => string), name: string | (() => string), params?: () => Record<string, unknown>): ComputedRef<string>;
53
51
 
54
52
  /**
55
- * useForgeByPrefix:带名字前缀的封装,方便后续减少名称传入
53
+ * useForgeByPrefix:带层级 + 名字前缀的封装,方便后续减少名称传入
56
54
  * @see .docs/SPEC.md §4.1.7
57
55
  *
58
56
  * 示例:
59
- * const { api } = useForgeByPrefix('admin.users');
60
- * await api('show', { user: 1 }); // 等价于 forge.api('admin.users.show', { user: 1 })
57
+ * const { api } = useForgeByPrefix('admin', 'users');
58
+ * await api('show', { user: 1 }); // 等价于 forge.api('admin', 'users.show', { user: 1 })
61
59
  */
62
60
 
63
61
  interface UseForgeByPrefixReturn {
64
62
  api: (suffix: string, params?: ApiCallParams) => Promise<unknown>;
65
63
  route: (suffix: string, params?: Record<string, unknown>) => string;
66
64
  }
67
- declare function useForgeByPrefix(prefix: string, separator?: string): UseForgeByPrefixReturn;
65
+ declare function useForgeByPrefix(level: string, prefix: string, separator?: string): UseForgeByPrefixReturn;
68
66
 
69
67
  export { FORGE_INJECTION_KEY, type RouteForgePluginOptions, type UseForgeApiReturn, type UseForgeByPrefixReturn, type UseForgeLevelReturn, createRouteForgePlugin, useForge, useForgeApi, useForgeByPrefix, useForgeLevel, useForgeRoute };
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { InjectionKey, App, ref, ComputedRef } from 'vue';
1
+ import { InjectionKey, Plugin, ref, ComputedRef } from 'vue';
2
2
  import { RouteForge, RouteForgeOptions, ApiCallParams } from '@route-forge/core';
3
3
 
4
4
  /**
@@ -13,9 +13,7 @@ import { RouteForge, RouteForgeOptions, ApiCallParams } from '@route-forge/core'
13
13
  declare const FORGE_INJECTION_KEY: InjectionKey<RouteForge>;
14
14
  interface RouteForgePluginOptions extends RouteForgeOptions {
15
15
  }
16
- declare function createRouteForgePlugin(options: RouteForgePluginOptions): {
17
- install(app: App): void;
18
- };
16
+ declare function createRouteForgePlugin(options: RouteForgePluginOptions): Plugin<[]>;
19
17
  declare function useForge(): RouteForge;
20
18
 
21
19
  /**
@@ -26,7 +24,7 @@ declare function useForge(): RouteForge;
26
24
  interface UseForgeApiReturn {
27
25
  pending: ReturnType<typeof ref<boolean>>;
28
26
  error: ReturnType<typeof ref<unknown>>;
29
- call: (name: string, params?: ApiCallParams) => Promise<{
27
+ call: (level: string, name: string, params?: ApiCallParams) => Promise<{
30
28
  data: unknown;
31
29
  error: unknown;
32
30
  }>;
@@ -49,21 +47,21 @@ declare function useForgeLevel(level: string): UseForgeLevelReturn;
49
47
  * @see .docs/SPEC.md §4.1.7
50
48
  */
51
49
 
52
- declare function useForgeRoute(name: string | (() => string), params?: () => Record<string, unknown>): ComputedRef<string>;
50
+ declare function useForgeRoute(level: string | (() => string), name: string | (() => string), params?: () => Record<string, unknown>): ComputedRef<string>;
53
51
 
54
52
  /**
55
- * useForgeByPrefix:带名字前缀的封装,方便后续减少名称传入
53
+ * useForgeByPrefix:带层级 + 名字前缀的封装,方便后续减少名称传入
56
54
  * @see .docs/SPEC.md §4.1.7
57
55
  *
58
56
  * 示例:
59
- * const { api } = useForgeByPrefix('admin.users');
60
- * await api('show', { user: 1 }); // 等价于 forge.api('admin.users.show', { user: 1 })
57
+ * const { api } = useForgeByPrefix('admin', 'users');
58
+ * await api('show', { user: 1 }); // 等价于 forge.api('admin', 'users.show', { user: 1 })
61
59
  */
62
60
 
63
61
  interface UseForgeByPrefixReturn {
64
62
  api: (suffix: string, params?: ApiCallParams) => Promise<unknown>;
65
63
  route: (suffix: string, params?: Record<string, unknown>) => string;
66
64
  }
67
- declare function useForgeByPrefix(prefix: string, separator?: string): UseForgeByPrefixReturn;
65
+ declare function useForgeByPrefix(level: string, prefix: string, separator?: string): UseForgeByPrefixReturn;
68
66
 
69
67
  export { FORGE_INJECTION_KEY, type RouteForgePluginOptions, type UseForgeApiReturn, type UseForgeByPrefixReturn, type UseForgeLevelReturn, createRouteForgePlugin, useForge, useForgeApi, useForgeByPrefix, useForgeLevel, useForgeRoute };
package/dist/index.js CHANGED
@@ -9,7 +9,7 @@ function createRouteForgePlugin(options) {
9
9
  install(app) {
10
10
  app.provide(FORGE_INJECTION_KEY, forge);
11
11
  app.config.globalProperties.$forge = {
12
- route: (name, params) => forge.route(name, params)
12
+ route: (level, name, params) => forge.route(level, name, params)
13
13
  };
14
14
  }
15
15
  };
@@ -27,11 +27,11 @@ function useForgeApi() {
27
27
  const forge = useForge();
28
28
  const pending = ref(false);
29
29
  const error = ref(null);
30
- async function call(name, params) {
30
+ async function call(level, name, params) {
31
31
  pending.value = true;
32
32
  error.value = null;
33
33
  try {
34
- const data = await forge.api(name, params);
34
+ const data = await forge.api(level, name, params);
35
35
  return { data, error: null };
36
36
  } catch (e) {
37
37
  error.value = e;
@@ -56,22 +56,23 @@ function useForgeLevel(level) {
56
56
  });
57
57
  return { loaded, error };
58
58
  }
59
- function useForgeRoute(name, params) {
59
+ function useForgeRoute(level, name, params) {
60
60
  const forge = useForge();
61
61
  return computed(() => {
62
+ const lvl = typeof level === "function" ? level() : level;
62
63
  const n = typeof name === "function" ? name() : name;
63
64
  const p = params ? params() : void 0;
64
- return forge.route(n, p);
65
+ return forge.route(lvl, n, p);
65
66
  });
66
67
  }
67
68
 
68
69
  // src/composables/useForgeByPrefix.ts
69
- function useForgeByPrefix(prefix, separator = ".") {
70
+ function useForgeByPrefix(level, prefix, separator = ".") {
70
71
  const forge = useForge();
71
72
  const join = (suffix) => suffix ? `${prefix}${separator}${suffix}` : prefix;
72
73
  return {
73
- api: (suffix, params) => forge.api(join(suffix), params),
74
- route: (suffix, params) => forge.route(join(suffix), params)
74
+ api: (suffix, params) => forge.api(level, join(suffix), params),
75
+ route: (suffix, params) => forge.route(level, join(suffix), params)
75
76
  };
76
77
  }
77
78
 
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/plugin.ts","../src/composables/useForgeApi.ts","../src/composables/useForgeLevel.ts","../src/composables/useForgeRoute.ts","../src/composables/useForgeByPrefix.ts"],"names":["ref"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Vue 3 插件入口\n * @see .docs/SPEC.md §4.1.7\n *\n * 提供:\n * - 全局属性 $forge(route() 工具)\n * - inject symbol 注入 RouteForge 实例供 composable 使用\n */\n\nimport type { App, InjectionKey } from 'vue';\nimport { inject, reactive, readonly } from 'vue';\nimport {\n createRouteForge,\n type RouteForge,\n type RouteForgeOptions,\n} from '@route-forge/core';\n\nexport const FORGE_INJECTION_KEY: InjectionKey<RouteForge> = Symbol('route-forge');\n\nexport interface RouteForgePluginOptions extends RouteForgeOptions {}\n\nexport function createRouteForgePlugin(options: RouteForgePluginOptions) {\n const forge = createRouteForge(options);\n\n return {\n install(app: App) {\n app.provide(FORGE_INJECTION_KEY, forge);\n app.config.globalProperties.$forge = {\n route: (name: string, params?: Record<string, unknown>) =>\n forge.route(name, params),\n };\n },\n };\n}\n\nexport function useForge(): RouteForge {\n const forge = inject(FORGE_INJECTION_KEY);\n if (!forge) {\n throw new Error(\n '[route-forge/vue] useForge() must be used inside an app with createRouteForgePlugin() installed',\n );\n }\n return forge;\n}\n\nexport { readonly, reactive };\n","/**\n * useForgeApi:包装 forge.api(),自动管理 loading/error 状态\n * @see .docs/SPEC.md §4.1.7\n */\n\nimport { ref } from 'vue';\nimport { useForge } from '../plugin.js';\nimport type { ApiCallParams } from '@route-forge/core';\n\nexport interface UseForgeApiReturn {\n pending: ReturnType<typeof ref<boolean>>;\n error: ReturnType<typeof ref<unknown>>;\n call: (name: string, params?: ApiCallParams) => Promise<{\n data: unknown;\n error: unknown;\n }>;\n}\n\nexport function useForgeApi(): UseForgeApiReturn {\n const forge = useForge();\n const pending = ref(false);\n const error = ref<unknown>(null);\n\n async function call(name: string, params?: ApiCallParams) {\n pending.value = true;\n error.value = null;\n try {\n const data = await forge.api(name, params);\n return { data, error: null };\n } catch (e) {\n error.value = e;\n return { data: undefined, error: e };\n } finally {\n pending.value = false;\n }\n }\n\n return { pending, error, call };\n}\n","/**\n * useForgeLevel:声明组件依赖某层级,挂载时自动 forge.load(level),销毁时不主动失效\n * @see .docs/SPEC.md §4.1.7\n */\n\nimport { onMounted, ref } from 'vue';\nimport { useForge } from '../plugin.js';\n\nexport interface UseForgeLevelReturn {\n loaded: ReturnType<typeof ref<boolean>>;\n error: ReturnType<typeof ref<unknown>>;\n}\n\nexport function useForgeLevel(level: string): UseForgeLevelReturn {\n const forge = useForge();\n const loaded = ref(false);\n const error = ref<unknown>(null);\n\n onMounted(async () => {\n try {\n await forge.load(level);\n loaded.value = true;\n } catch (e) {\n error.value = e;\n }\n });\n\n return { loaded, error };\n}\n","/**\n * useForgeRoute:仅生成 URL,不发请求(用于 <a href>、外部跳转等)\n * @see .docs/SPEC.md §4.1.7\n */\n\nimport { computed, type ComputedRef } from 'vue';\nimport { useForge } from '../plugin.js';\n\nexport function useForgeRoute(\n name: string | (() => string),\n params?: () => Record<string, unknown>,\n): ComputedRef<string> {\n const forge = useForge();\n return computed(() => {\n const n = typeof name === 'function' ? name() : name;\n const p = params ? params() : undefined;\n return forge.route(n, p);\n });\n}\n","/**\n * useForgeByPrefix:带名字前缀的封装,方便后续减少名称传入\n * @see .docs/SPEC.md §4.1.7\n *\n * 示例:\n * const { api } = useForgeByPrefix('admin.users');\n * await api('show', { user: 1 }); // 等价于 forge.api('admin.users.show', { user: 1 })\n */\n\nimport { useForge } from '../plugin.js';\nimport type { ApiCallParams } from '@route-forge/core';\n\nexport interface UseForgeByPrefixReturn {\n api: (suffix: string, params?: ApiCallParams) => Promise<unknown>;\n route: (suffix: string, params?: Record<string, unknown>) => string;\n}\n\nexport function useForgeByPrefix(prefix: string, separator = '.'): UseForgeByPrefixReturn {\n const forge = useForge();\n\n const join = (suffix: string) => (suffix ? `${prefix}${separator}${suffix}` : prefix);\n\n return {\n api: (suffix, params) => forge.api(join(suffix), params),\n route: (suffix, params) => forge.route(join(suffix), params),\n };\n}\n"]}
1
+ {"version":3,"sources":["../src/plugin.ts","../src/composables/useForgeApi.ts","../src/composables/useForgeLevel.ts","../src/composables/useForgeRoute.ts","../src/composables/useForgeByPrefix.ts"],"names":["ref"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * Vue 3 插件入口\n * @see .docs/SPEC.md §4.1.7\n *\n * 提供:\n * - 全局属性 $forge(route() 工具)\n * - inject symbol 注入 RouteForge 实例供 composable 使用\n */\n\nimport type { App, InjectionKey, Plugin } from 'vue';\nimport { inject, reactive, readonly } from 'vue';\nimport { createRouteForge, type RouteForge, type RouteForgeOptions } from '@route-forge/core';\n\nexport const FORGE_INJECTION_KEY: InjectionKey<RouteForge> = Symbol('route-forge');\n\nexport interface RouteForgePluginOptions extends RouteForgeOptions {}\n\nexport function createRouteForgePlugin(options: RouteForgePluginOptions): Plugin<[]> {\n const forge = createRouteForge(options);\n\n return {\n install(app: App) {\n app.provide(FORGE_INJECTION_KEY, forge);\n app.config.globalProperties.$forge = {\n route: (level: string, name: string, params?: Record<string, unknown>) =>\n forge.route(level, name, params),\n };\n },\n };\n}\n\nexport function useForge(): RouteForge {\n const forge = inject(FORGE_INJECTION_KEY);\n if (!forge) {\n throw new Error(\n '[route-forge/vue] useForge() must be used inside an app with createRouteForgePlugin() installed',\n );\n }\n return forge;\n}\n\nexport { readonly, reactive };\n","/**\n * useForgeApi:包装 forge.api(),自动管理 loading/error 状态\n * @see .docs/SPEC.md §4.1.7\n */\n\nimport { ref } from 'vue';\nimport { useForge } from '../plugin.js';\nimport type { ApiCallParams } from '@route-forge/core';\n\nexport interface UseForgeApiReturn {\n pending: ReturnType<typeof ref<boolean>>;\n error: ReturnType<typeof ref<unknown>>;\n call: (level: string, name: string, params?: ApiCallParams) => Promise<{\n data: unknown;\n error: unknown;\n }>;\n}\n\nexport function useForgeApi(): UseForgeApiReturn {\n const forge = useForge();\n const pending = ref(false);\n const error = ref<unknown>(null);\n\n async function call(level: string, name: string, params?: ApiCallParams) {\n pending.value = true;\n error.value = null;\n try {\n const data = await forge.api(level, name, params);\n return { data, error: null };\n } catch (e) {\n error.value = e;\n return { data: undefined, error: e };\n } finally {\n pending.value = false;\n }\n }\n\n return { pending, error, call };\n}\n","/**\n * useForgeLevel:声明组件依赖某层级,挂载时自动 forge.load(level),销毁时不主动失效\n * @see .docs/SPEC.md §4.1.7\n */\n\nimport { onMounted, ref } from 'vue';\nimport { useForge } from '../plugin.js';\n\nexport interface UseForgeLevelReturn {\n loaded: ReturnType<typeof ref<boolean>>;\n error: ReturnType<typeof ref<unknown>>;\n}\n\nexport function useForgeLevel(level: string): UseForgeLevelReturn {\n const forge = useForge();\n const loaded = ref(false);\n const error = ref<unknown>(null);\n\n onMounted(async () => {\n try {\n await forge.load(level);\n loaded.value = true;\n } catch (e) {\n error.value = e;\n }\n });\n\n return { loaded, error };\n}\n","/**\n * useForgeRoute:仅生成 URL,不发请求(用于 <a href>、外部跳转等)\n * @see .docs/SPEC.md §4.1.7\n */\n\nimport { computed, type ComputedRef } from 'vue';\nimport { useForge } from '../plugin.js';\n\nexport function useForgeRoute(\n level: string | (() => string),\n name: string | (() => string),\n params?: () => Record<string, unknown>,\n): ComputedRef<string> {\n const forge = useForge();\n return computed(() => {\n const lvl = typeof level === 'function' ? level() : level;\n const n = typeof name === 'function' ? name() : name;\n const p = params ? params() : undefined;\n return forge.route(lvl, n, p);\n });\n}\n","/**\n * useForgeByPrefix:带层级 + 名字前缀的封装,方便后续减少名称传入\n * @see .docs/SPEC.md §4.1.7\n *\n * 示例:\n * const { api } = useForgeByPrefix('admin', 'users');\n * await api('show', { user: 1 }); // 等价于 forge.api('admin', 'users.show', { user: 1 })\n */\n\nimport { useForge } from '../plugin.js';\nimport type { ApiCallParams } from '@route-forge/core';\n\nexport interface UseForgeByPrefixReturn {\n api: (suffix: string, params?: ApiCallParams) => Promise<unknown>;\n route: (suffix: string, params?: Record<string, unknown>) => string;\n}\n\nexport function useForgeByPrefix(level: string, prefix: string, separator = '.'): UseForgeByPrefixReturn {\n const forge = useForge();\n\n const join = (suffix: string) => (suffix ? `${prefix}${separator}${suffix}` : prefix);\n\n return {\n api: (suffix, params) => forge.api(level, join(suffix), params),\n route: (suffix, params) => forge.route(level, join(suffix), params),\n };\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@route-forge/vue",
3
- "version": "0.1.0",
3
+ "version": "0.2.0",
4
4
  "description": "Route Forge 的 Vue 3 集成:插件 + composable(useForgeApi/useForgeLevel/useForgeRoute/useForgeByPrefix)",
5
5
  "license": "MIT",
6
6
  "author": "阿杰很厉害 <506907958@qq.com>",
@@ -36,17 +36,18 @@
36
36
  "@vue/test-utils": "^2.4.0",
37
37
  "jsdom": "^24.0.0",
38
38
  "tsup": "^8.0.0",
39
- "vitest": "^1.4.0",
39
+ "vitest": "4.1.0",
40
40
  "vue": "^3.4.0"
41
41
  },
42
42
  "dependencies": {
43
- "@route-forge/core": "0.1.0"
43
+ "@route-forge/core": "0.2.0"
44
44
  },
45
45
  "publishConfig": {
46
46
  "access": "public"
47
47
  },
48
48
  "scripts": {
49
49
  "build": "tsup",
50
+ "dev": "tsup --watch",
50
51
  "test": "vitest run",
51
52
  "test:watch": "vitest",
52
53
  "lint": "tsc --noEmit",