@anweb/nuxt-ancore 1.1.2 → 1.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.
package/dist/index.d.mts CHANGED
@@ -1 +1 @@
1
- export { default as api } from '../dist/runtime/utils/api.js';
1
+ export * from '../dist/runtime/utils/index.js';
package/dist/index.d.ts CHANGED
@@ -1 +1 @@
1
- export { default as api } from '../dist/runtime/utils/api.js';
1
+ export * from '../dist/runtime/utils/index.js';
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- export { default as api } from '../dist/runtime/utils/api.js';
1
+ export * from '../dist/runtime/utils/index.js';
package/dist/module.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "AnCore",
3
3
  "configKey": "ancore",
4
- "version": "1.1.2",
4
+ "version": "1.3.0",
5
5
  "builder": {
6
6
  "@nuxt/module-builder": "1.0.1",
7
7
  "unbuild": "3.5.0"
package/dist/module.mjs CHANGED
@@ -1,14 +1,17 @@
1
- import { defineNuxtModule, createResolver } from '@nuxt/kit';
1
+ import { defineNuxtModule, createResolver, addImportsDir } from '@nuxt/kit';
2
2
 
3
3
  const module = defineNuxtModule({
4
4
  meta: {
5
5
  name: "AnCore",
6
6
  configKey: "ancore"
7
7
  },
8
- // Default configuration options of the Nuxt module
9
8
  defaults: {},
10
- setup(_options, _nuxt) {
11
- createResolver(import.meta.url);
9
+ async setup(_options, _nuxt) {
10
+ const { resolve } = createResolver(import.meta.url);
11
+ _nuxt.options.runtimeConfig.public.ancore = {};
12
+ _nuxt.options.alias["#ancore/utils"] = resolve("./runtime/utils");
13
+ _nuxt.options.alias["#ancore/types"] = resolve("./runtime/types");
14
+ addImportsDir(resolve("./runtime/composables"));
12
15
  }
13
16
  });
14
17
 
@@ -0,0 +1,16 @@
1
+ import type { NitroFetchRequest } from 'nitropack';
2
+ import { type Ref, type ComputedRef } from 'vue';
3
+ import { useAsyncData } from '#app';
4
+ interface TConfig {
5
+ request: NitroFetchRequest;
6
+ }
7
+ interface TUseData<TData, TError> {
8
+ init: () => Promise<void>;
9
+ loading: ComputedRef<boolean>;
10
+ request: Ref<NitroFetchRequest>;
11
+ data: ComputedRef<TData>;
12
+ error: ComputedRef<TError>;
13
+ status: ReturnType<typeof useAsyncData>['status'];
14
+ }
15
+ export declare const useData: <TData = unknown, TError = unknown>(config: TConfig) => TUseData<TData, TError>;
16
+ export {};
@@ -0,0 +1,30 @@
1
+ import { computed, ref } from "vue";
2
+ import { useAsyncData } from "#app";
3
+ import { userApi } from "#ancore/utils";
4
+ export const useData = (config) => {
5
+ const request = ref(config.request);
6
+ const loading = computed(() => {
7
+ return status.value === "pending";
8
+ });
9
+ const key = computed(() => {
10
+ return request.value.toString();
11
+ });
12
+ const {
13
+ data,
14
+ error,
15
+ execute,
16
+ status
17
+ } = useAsyncData(
18
+ key,
19
+ () => userApi(request.value, { method: "GET" }),
20
+ { immediate: false }
21
+ );
22
+ return {
23
+ init: execute,
24
+ loading,
25
+ request,
26
+ data,
27
+ error,
28
+ status
29
+ };
30
+ };
@@ -0,0 +1,20 @@
1
+ import type { Rules } from 'async-validator';
2
+ import { type UseAsyncValidatorExecuteReturn } from '@vueuse/integrations/useAsyncValidator';
3
+ interface TFormParams<T> {
4
+ rules?: Rules;
5
+ empty: Record<keyof T, unknown>;
6
+ data?: Partial<T> | null;
7
+ }
8
+ declare const _default: <T = unknown>(params: TFormParams<T>) => {
9
+ state: [T] extends [import("vue").Ref<any, any>] ? import("@vue/shared").IfAny<T, import("vue").Ref<T, T>, T> : import("vue").Ref<import("vue").UnwrapRef<T>, T | import("vue").UnwrapRef<T>>;
10
+ merge: (data: T) => void;
11
+ validator: {
12
+ check: () => Promise<UseAsyncValidatorExecuteReturn>;
13
+ errors: import("vue").Ref<Record<string, import("async-validator").ValidateError[]> | undefined, Record<string, import("async-validator").ValidateError[]> | undefined>;
14
+ };
15
+ history: {
16
+ isChanged: import("vue").ComputedRef<boolean>;
17
+ reset: () => void;
18
+ };
19
+ };
20
+ export default _default;
@@ -0,0 +1,68 @@
1
+ import {
2
+ useAsyncValidator
3
+ } from "@vueuse/integrations/useAsyncValidator";
4
+ import { useRefHistory } from "@vueuse/core";
5
+ import { computed, ref, nextTick, watchEffect, watch } from "vue";
6
+ export default (params) => {
7
+ const state = ref(params.empty ? { ...params.empty } : {});
8
+ const keys = Object.keys(params.empty);
9
+ let validatorExecute;
10
+ const validatorErrors = ref();
11
+ const History = useRefHistory(state, { deep: true });
12
+ const init = () => {
13
+ if (params.data) merge(params.data);
14
+ if (params.rules) initValidate();
15
+ void nextTick(History.clear);
16
+ };
17
+ const merge = (data) => {
18
+ for (const key of keys) {
19
+ state.value[key] = data[key];
20
+ }
21
+ };
22
+ const initValidate = () => {
23
+ if (!params.rules) return;
24
+ const validator = useAsyncValidator(
25
+ state,
26
+ params.rules,
27
+ { manual: true }
28
+ );
29
+ validatorExecute = validator.execute;
30
+ watchEffect(() => {
31
+ validatorErrors.value = validator.errorFields.value;
32
+ });
33
+ };
34
+ const first = computed(() => {
35
+ return History.history.value.at(-1)?.snapshot;
36
+ });
37
+ const isChanged = computed(() => {
38
+ if (History.history.value.length === 1) return false;
39
+ const firstOne = JSON.stringify(first.value);
40
+ const last = JSON.stringify(History.last.value.snapshot);
41
+ return firstOne !== last;
42
+ });
43
+ watch(state, () => {
44
+ if (validatorErrors.value) {
45
+ validatorErrors.value = void 0;
46
+ }
47
+ }, { deep: true });
48
+ init();
49
+ return {
50
+ state,
51
+ merge: (data) => {
52
+ merge(data);
53
+ },
54
+ validator: {
55
+ check: () => {
56
+ return validatorExecute();
57
+ },
58
+ errors: validatorErrors
59
+ },
60
+ history: {
61
+ isChanged,
62
+ reset: () => {
63
+ state.value = first.value;
64
+ void nextTick(History.clear);
65
+ }
66
+ }
67
+ };
68
+ };
@@ -0,0 +1,27 @@
1
+ import type { NitroFetchRequest } from 'nitropack';
2
+ import { type UseEventBusReturn } from '@vueuse/core';
3
+ import type { TWS as TWSDefault } from '#ancore/types';
4
+ interface TConfig<TData, TFilter, TWS extends TWSDefault> {
5
+ request: NitroFetchRequest;
6
+ filter?: TFilter;
7
+ reverse?: boolean;
8
+ events?: {
9
+ bus: UseEventBusReturn<any, any>;
10
+ callback: (list: TData[], count: number, data: any) => number | void;
11
+ }[];
12
+ ws?: {
13
+ type: TWS['type'];
14
+ callback: (list: TData[], count: number, data: any) => number | void;
15
+ }[];
16
+ }
17
+ declare const _default: <TData, TFilter = unknown, TWS extends TWSDefault = TWSDefault>(config: TConfig<TData, TFilter, TWS>) => {
18
+ init: (newFilter?: TFilter) => Promise<void>;
19
+ inited: import("vue").Ref<boolean, boolean>;
20
+ filter: [Partial<TFilter>] extends [import("vue").Ref<any, any>] ? import("@vue/shared").IfAny<import("vue").Ref<any, any> & Partial<TFilter>, import("vue").Ref<import("vue").Ref<any, any> & Partial<TFilter>, import("vue").Ref<any, any> & Partial<TFilter>>, import("vue").Ref<any, any> & Partial<TFilter>> : import("vue").Ref<import("vue").UnwrapRef<Partial<TFilter>>, Partial<TFilter> | import("vue").UnwrapRef<Partial<TFilter>>>;
21
+ loading: import("vue").ComputedRef<boolean>;
22
+ items: TData[];
23
+ count: import("vue").Ref<number | null, number | null>;
24
+ error: import("vue").Ref<import("#app").NuxtError<unknown> | undefined, import("#app").NuxtError<unknown> | undefined>;
25
+ status: import("vue").Ref<import("#app").AsyncDataRequestStatus, import("#app").AsyncDataRequestStatus>;
26
+ };
27
+ export default _default;
@@ -0,0 +1,82 @@
1
+ import { useEventBus } from "@vueuse/core";
2
+ import { computed, ref, reactive, watch } from "vue";
3
+ import { useAsyncData } from "#app";
4
+ import { userApi, toQuery } from "#ancore/utils";
5
+ export default (config) => {
6
+ const busWS = useEventBus("ws");
7
+ const inited = ref(false);
8
+ const filter = ref(config.filter || {});
9
+ const items = reactive([]);
10
+ const count = ref(null);
11
+ const init = async (newFilter) => {
12
+ if (newFilter) {
13
+ filter.value = { ...newFilter };
14
+ } else if (config.filter) {
15
+ filter.value = { ...config.filter };
16
+ }
17
+ await execute();
18
+ refresh();
19
+ if (config.events) {
20
+ for (const event of config.events) {
21
+ event.bus.on((data2) => {
22
+ const newCount = event.callback(items, count.value || 0, data2);
23
+ if (newCount || newCount === 0) {
24
+ count.value = newCount;
25
+ }
26
+ });
27
+ }
28
+ }
29
+ if (config.ws) {
30
+ busWS.on((data2) => {
31
+ const event = config.ws?.find((item) => item.type === data2.type);
32
+ if (event) {
33
+ const newCount = event.callback(items, count.value || 0, data2.data);
34
+ if (newCount || newCount === 0) {
35
+ count.value = newCount;
36
+ }
37
+ }
38
+ });
39
+ }
40
+ inited.value = true;
41
+ };
42
+ const refresh = () => {
43
+ if (!data.value) return;
44
+ if (!filter.value.skip) {
45
+ count.value = null;
46
+ items.length = 0;
47
+ }
48
+ if (config.reverse) {
49
+ items.unshift(...data.value.items);
50
+ } else {
51
+ items.push(...data.value.items);
52
+ }
53
+ count.value = data.value.count;
54
+ };
55
+ const key = computed(() => {
56
+ return config.request + "?" + toQuery(filter.value);
57
+ });
58
+ const loading = computed(() => {
59
+ return status.value === "pending";
60
+ });
61
+ const {
62
+ data,
63
+ error,
64
+ execute,
65
+ status
66
+ } = useAsyncData(
67
+ key,
68
+ () => userApi(config.request, { method: "GET", query: filter.value }),
69
+ { immediate: false }
70
+ );
71
+ watch(data, refresh);
72
+ return {
73
+ init,
74
+ inited,
75
+ filter,
76
+ loading,
77
+ items,
78
+ count,
79
+ error,
80
+ status
81
+ };
82
+ };
@@ -0,0 +1,3 @@
1
+ export * from './nuxt.js';
2
+ export * from './ws.js';
3
+ export * from './responseList.js';
@@ -0,0 +1,3 @@
1
+ export * from "./nuxt";
2
+ export * from "./ws.js";
3
+ export * from "./responseList.js";
@@ -0,0 +1,8 @@
1
+ import type { TApi } from '#ancore/utils'
2
+
3
+
4
+ declare module '#app' {
5
+ interface NuxtApp {
6
+ $api: TApi
7
+ }
8
+ }
@@ -0,0 +1,4 @@
1
+ export interface TResponseList<TData> {
2
+ items: TData[];
3
+ count: number;
4
+ }
File without changes
@@ -0,0 +1,4 @@
1
+ export interface TWS {
2
+ type: string;
3
+ data: unknown;
4
+ }
File without changes
@@ -1,3 +1,3 @@
1
1
  import type { NitroFetchOptions, NitroFetchRequest } from 'nitropack';
2
- declare const _default: <TData = unknown, TError = unknown>(request: NitroFetchRequest, opts: NitroFetchOptions<string>) => Promise<import("nitropack").TypedInternalResponse<NitroFetchRequest, TData, "get">>;
3
- export default _default;
2
+ export declare const api: <TData = unknown, TError = unknown>(request: NitroFetchRequest, opts: NitroFetchOptions<string>) => Promise<TData>;
3
+ export type TApi = typeof api;
@@ -1,6 +1,6 @@
1
- export default async (request, opts) => {
1
+ export const api = (request, opts) => {
2
2
  try {
3
- return await $fetch(
3
+ return $fetch(
4
4
  request,
5
5
  { ...opts }
6
6
  );
@@ -0,0 +1 @@
1
+ export declare const asyncInit: (fInit: () => Promise<void>) => Promise<void>;
@@ -0,0 +1,9 @@
1
+ import { useNuxtApp } from "#app";
2
+ export const asyncInit = async (fInit) => {
3
+ const nuxtApp = useNuxtApp();
4
+ if (!!nuxtApp.vueApp._instance?.isMounted) {
5
+ void fInit();
6
+ } else {
7
+ await fInit();
8
+ }
9
+ };
@@ -0,0 +1,4 @@
1
+ export * from './api.js';
2
+ export * from './asyncInit.js';
3
+ export * from './userApi.js';
4
+ export * from './toQuery.js';
@@ -0,0 +1,4 @@
1
+ export * from "./api.js";
2
+ export * from "./asyncInit.js";
3
+ export * from "./userApi.js";
4
+ export * from "./toQuery.js";
@@ -0,0 +1,4 @@
1
+ type TValue = string | number | boolean | undefined | null;
2
+ export type TQueryObject = Record<string, TValue | TValue[]>;
3
+ export declare const toQuery: (params: TQueryObject) => string;
4
+ export {};
@@ -0,0 +1,3 @@
1
+ export const toQuery = (params) => {
2
+ return Object.entries(params).filter(([, value]) => value != null).map(([key, value]) => `${encodeURIComponent(key)}=${encodeURIComponent(String(value))}`).join("&");
3
+ };
@@ -0,0 +1,2 @@
1
+ import type { NitroFetchOptions, NitroFetchRequest } from 'nitropack';
2
+ export declare const userApi: <TData = unknown, TError = unknown>(request: NitroFetchRequest, opts: NitroFetchOptions<string>) => Promise<TData>;
@@ -0,0 +1,10 @@
1
+ import { useNuxtApp } from "#app";
2
+ import { api as coreApi } from "#ancore/utils";
3
+ export const userApi = (request, opts) => {
4
+ const { $api } = useNuxtApp();
5
+ if ($api) {
6
+ return $api(request, opts);
7
+ } else {
8
+ return coreApi(request, opts);
9
+ }
10
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@anweb/nuxt-ancore",
3
- "version": "1.1.2",
3
+ "version": "1.3.0",
4
4
  "description": "AnCore Nuxt module",
5
5
  "repository": "https://github.com/ANLTD/ancore",
6
6
  "license": "MIT",
@@ -13,7 +13,8 @@
13
13
  "./module": {
14
14
  "types": "./dist/types.d.mts",
15
15
  "import": "./dist/module.mjs"
16
- }
16
+ },
17
+ "./composables/*": "./dist/runtime/composables/*"
17
18
  },
18
19
  "main": "./dist/module.mjs",
19
20
  "typesVersions": {
@@ -36,7 +37,10 @@
36
37
  "release:major": "npm run prepack && changelogen --bump major --release && npm publish --access public && git push --follow-tags"
37
38
  },
38
39
  "dependencies": {
39
- "@nuxt/kit": "^4.0.0"
40
+ "@nuxt/kit": "^4.0.0",
41
+ "@vueuse/core": "^13.5.0",
42
+ "@vueuse/integrations": "^13.5.0",
43
+ "async-validator": "^4.2.5"
40
44
  },
41
45
  "devDependencies": {
42
46
  "@nuxt/devtools": "^2.6.2",
@@ -47,4 +51,4 @@
47
51
  "nuxt": "^4.0.0",
48
52
  "typescript": "~5.8.3"
49
53
  }
50
- }
54
+ }