@coaction/vue 1.5.0 → 2.1.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
@@ -1,17 +1,15 @@
1
1
  # @coaction/vue
2
2
 
3
- ![Node CI](https://github.com/unadlib/coaction/workflows/Node%20CI/badge.svg)
4
- [![npm](https://img.shields.io/npm/v/@coaction/vue.svg)](https://www.npmjs.com/package/@coaction/vue)
5
- ![license](https://img.shields.io/npm/l/@coaction/vue)
3
+ ![Node CI](https://github.com/coactionjs/coaction/workflows/Node%20CI/badge.svg) [![npm](https://img.shields.io/npm/v/@coaction/vue.svg)](https://www.npmjs.com/package/@coaction/vue) ![license](https://img.shields.io/npm/l/@coaction/vue)
6
4
 
7
5
  A Coaction integration tool for Vue
8
6
 
9
7
  ## Installation
10
8
 
11
- You can install it via npm, yarn or pnpm.
9
+ Install it with pnpm:
12
10
 
13
11
  ```sh
14
- npm install coaction @coaction/vue
12
+ pnpm add coaction @coaction/vue
15
13
  ```
16
14
 
17
15
  ## Usage
@@ -50,4 +48,4 @@ console.log(selectors.count.value);
50
48
 
51
49
  ## Documentation
52
50
 
53
- You can find the documentation [here](https://github.com/unadlib/coaction).
51
+ You can find the documentation [here](https://github.com/coactionjs/coaction).
package/dist/index.d.mts CHANGED
@@ -1,34 +1,48 @@
1
- import { ISlices, Slice, StoreOptions, Store, SliceState, ClientStoreOptions, Asyncify } from 'coaction';
2
- export * from 'coaction';
3
- import { ComputedRef } from 'vue';
1
+ import { Asyncify, ClientStoreOptions, ISlices, Slice, SliceState, Store, StoreOptions } from "coaction";
2
+ import { ComputedRef } from "vue";
3
+ export * from "coaction";
4
4
 
5
+ //#region \0rolldown/runtime.js
6
+ //#endregion
7
+ //#region packages/coaction-vue/src/index.d.ts
5
8
  type SelectorOptions = {
6
- autoSelector?: boolean;
7
- };
8
- type AutoSelector<T> = {
9
- [K in keyof T]: T[K] extends (...args: any[]) => any ? T[K] : T[K] extends readonly any[] ? ComputedRef<T[K]> : T[K] extends object ? AutoSelector<T[K]> : ComputedRef<T[K]>;
9
+ autoSelector?: boolean;
10
10
  };
11
+ type LeafObject = Date | RegExp | Error | Promise<unknown> | ReadonlyMap<unknown, unknown> | ReadonlySet<unknown> | WeakMap<object, unknown> | WeakSet<object> | ArrayBuffer | DataView;
12
+ type AutoSelectorValue<T> = T extends ((...args: any[]) => any) ? T : T extends readonly any[] ? ComputedRef<T> : T extends LeafObject ? ComputedRef<T> : T extends object ? AutoSelector<T> : ComputedRef<T>;
13
+ type AutoSelector<T> = { [K in keyof T]: AutoSelectorValue<T[K]> };
11
14
  type StoreReturn<T extends object> = Store<T> & {
12
- <P>(selector: (state: T) => P): ComputedRef<P>;
13
- (options: {
14
- autoSelector: true;
15
- }): AutoSelector<T>;
16
- (options?: SelectorOptions): T;
15
+ <P>(selector: (state: T) => P): ComputedRef<P>;
16
+ (options: {
17
+ autoSelector: true;
18
+ }): AutoSelector<T>;
19
+ (options?: SelectorOptions): T;
17
20
  };
18
21
  type StoreWithAsyncFunction<T extends object, D extends true | false = false> = Store<Asyncify<T, D>> & {
19
- <P>(selector: (state: Asyncify<T, D>) => P): ComputedRef<P>;
20
- (options: {
21
- autoSelector: true;
22
- }): AutoSelector<Asyncify<T, D>>;
23
- (options?: SelectorOptions): Asyncify<T, D>;
22
+ <P>(selector: (state: Asyncify<T, D>) => P): ComputedRef<P>;
23
+ (options: {
24
+ autoSelector: true;
25
+ }): AutoSelector<Asyncify<T, D>>;
26
+ (options?: SelectorOptions): Asyncify<T, D>;
27
+ };
28
+ type CreateState = ISlices | Record<PropertyKey, Slice<any>>;
29
+ type SingleStoreOptions<T extends CreateState> = StoreOptions<T> & {
30
+ sliceMode: 'single';
31
+ };
32
+ type SingleClientStoreOptions<T extends CreateState> = ClientStoreOptions<T> & {
33
+ sliceMode: 'single';
24
34
  };
25
- type CreateState = ISlices | Record<string, Slice<any>>;
26
35
  type Creator = {
27
- <T extends Record<string, Slice<any>>>(createState: T, options?: StoreOptions<T>): StoreReturn<SliceState<T>>;
28
- <T extends ISlices>(createState: Slice<T>, options?: StoreOptions<T>): StoreReturn<T>;
29
- <T extends Record<string, Slice<any>>>(createState: T, options?: ClientStoreOptions<T>): StoreWithAsyncFunction<SliceState<T>, true>;
30
- <T extends ISlices>(createState: Slice<T>, options?: ClientStoreOptions<T>): StoreWithAsyncFunction<T>;
36
+ <T extends ISlices>(createState: T, options: SingleStoreOptions<T>): StoreReturn<T>;
37
+ <T extends Record<PropertyKey, Slice<any>>>(createState: T, options?: StoreOptions<T>): StoreReturn<SliceState<T>>;
38
+ <T extends ISlices>(createState: Slice<T> | T, options?: StoreOptions<T>): StoreReturn<T>;
39
+ <T extends ISlices>(createState: T, options: SingleClientStoreOptions<T>): StoreWithAsyncFunction<T>;
40
+ <T extends Record<PropertyKey, Slice<any>>>(createState: T, options?: ClientStoreOptions<T>): StoreWithAsyncFunction<SliceState<T>, true>;
41
+ <T extends ISlices>(createState: Slice<T> | T, options?: ClientStoreOptions<T>): StoreWithAsyncFunction<T>;
31
42
  };
32
43
  declare const create: Creator;
33
-
34
- export { type CreateState, type Creator, type StoreReturn, type StoreWithAsyncFunction, create };
44
+ declare namespace index_d_exports {
45
+ export { CreateState, Creator, StoreReturn, StoreWithAsyncFunction, create };
46
+ }
47
+ //#endregion
48
+ export { CreateState, Creator, StoreReturn, StoreWithAsyncFunction, create };
package/dist/index.d.ts CHANGED
@@ -1,34 +1,48 @@
1
- import { ISlices, Slice, StoreOptions, Store, SliceState, ClientStoreOptions, Asyncify } from 'coaction';
2
- export * from 'coaction';
3
- import { ComputedRef } from 'vue';
1
+ import { Asyncify, ClientStoreOptions, ISlices, Slice, SliceState, Store, StoreOptions } from "coaction";
2
+ import { ComputedRef } from "vue";
3
+ export * from "coaction";
4
4
 
5
+ //#region \0rolldown/runtime.js
6
+ //#endregion
7
+ //#region packages/coaction-vue/src/index.d.ts
5
8
  type SelectorOptions = {
6
- autoSelector?: boolean;
7
- };
8
- type AutoSelector<T> = {
9
- [K in keyof T]: T[K] extends (...args: any[]) => any ? T[K] : T[K] extends readonly any[] ? ComputedRef<T[K]> : T[K] extends object ? AutoSelector<T[K]> : ComputedRef<T[K]>;
9
+ autoSelector?: boolean;
10
10
  };
11
+ type LeafObject = Date | RegExp | Error | Promise<unknown> | ReadonlyMap<unknown, unknown> | ReadonlySet<unknown> | WeakMap<object, unknown> | WeakSet<object> | ArrayBuffer | DataView;
12
+ type AutoSelectorValue<T> = T extends ((...args: any[]) => any) ? T : T extends readonly any[] ? ComputedRef<T> : T extends LeafObject ? ComputedRef<T> : T extends object ? AutoSelector<T> : ComputedRef<T>;
13
+ type AutoSelector<T> = { [K in keyof T]: AutoSelectorValue<T[K]> };
11
14
  type StoreReturn<T extends object> = Store<T> & {
12
- <P>(selector: (state: T) => P): ComputedRef<P>;
13
- (options: {
14
- autoSelector: true;
15
- }): AutoSelector<T>;
16
- (options?: SelectorOptions): T;
15
+ <P>(selector: (state: T) => P): ComputedRef<P>;
16
+ (options: {
17
+ autoSelector: true;
18
+ }): AutoSelector<T>;
19
+ (options?: SelectorOptions): T;
17
20
  };
18
21
  type StoreWithAsyncFunction<T extends object, D extends true | false = false> = Store<Asyncify<T, D>> & {
19
- <P>(selector: (state: Asyncify<T, D>) => P): ComputedRef<P>;
20
- (options: {
21
- autoSelector: true;
22
- }): AutoSelector<Asyncify<T, D>>;
23
- (options?: SelectorOptions): Asyncify<T, D>;
22
+ <P>(selector: (state: Asyncify<T, D>) => P): ComputedRef<P>;
23
+ (options: {
24
+ autoSelector: true;
25
+ }): AutoSelector<Asyncify<T, D>>;
26
+ (options?: SelectorOptions): Asyncify<T, D>;
27
+ };
28
+ type CreateState = ISlices | Record<PropertyKey, Slice<any>>;
29
+ type SingleStoreOptions<T extends CreateState> = StoreOptions<T> & {
30
+ sliceMode: 'single';
31
+ };
32
+ type SingleClientStoreOptions<T extends CreateState> = ClientStoreOptions<T> & {
33
+ sliceMode: 'single';
24
34
  };
25
- type CreateState = ISlices | Record<string, Slice<any>>;
26
35
  type Creator = {
27
- <T extends Record<string, Slice<any>>>(createState: T, options?: StoreOptions<T>): StoreReturn<SliceState<T>>;
28
- <T extends ISlices>(createState: Slice<T>, options?: StoreOptions<T>): StoreReturn<T>;
29
- <T extends Record<string, Slice<any>>>(createState: T, options?: ClientStoreOptions<T>): StoreWithAsyncFunction<SliceState<T>, true>;
30
- <T extends ISlices>(createState: Slice<T>, options?: ClientStoreOptions<T>): StoreWithAsyncFunction<T>;
36
+ <T extends ISlices>(createState: T, options: SingleStoreOptions<T>): StoreReturn<T>;
37
+ <T extends Record<PropertyKey, Slice<any>>>(createState: T, options?: StoreOptions<T>): StoreReturn<SliceState<T>>;
38
+ <T extends ISlices>(createState: Slice<T> | T, options?: StoreOptions<T>): StoreReturn<T>;
39
+ <T extends ISlices>(createState: T, options: SingleClientStoreOptions<T>): StoreWithAsyncFunction<T>;
40
+ <T extends Record<PropertyKey, Slice<any>>>(createState: T, options?: ClientStoreOptions<T>): StoreWithAsyncFunction<SliceState<T>, true>;
41
+ <T extends ISlices>(createState: Slice<T> | T, options?: ClientStoreOptions<T>): StoreWithAsyncFunction<T>;
31
42
  };
32
43
  declare const create: Creator;
33
-
34
- export { type CreateState, type Creator, type StoreReturn, type StoreWithAsyncFunction, create };
44
+ declare namespace index_d_exports {
45
+ export { CreateState, Creator, StoreReturn, StoreWithAsyncFunction, create };
46
+ }
47
+ //#endregion
48
+ export { CreateState, Creator, StoreReturn, StoreWithAsyncFunction, create };
package/dist/index.js CHANGED
@@ -1,143 +1,133 @@
1
- "use strict";
2
- var __defProp = Object.defineProperty;
3
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
4
- var __getOwnPropNames = Object.getOwnPropertyNames;
5
- var __hasOwnProp = Object.prototype.hasOwnProperty;
6
- var __export = (target, all) => {
7
- for (var name in all)
8
- __defProp(target, name, { get: all[name], enumerable: true });
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ //#endregion
3
+ let coaction = require("coaction");
4
+ let vue = require("vue");
5
+ //#region packages/coaction-vue/src/index.ts
6
+ const getOwnEnumerableKeys = (value) => Reflect.ownKeys(value).filter((key) => Object.prototype.propertyIsEnumerable.call(value, key));
7
+ const isPlainObject = (value) => {
8
+ const prototype = Object.getPrototypeOf(value);
9
+ return prototype === Object.prototype || prototype === null;
9
10
  };
10
- var __copyProps = (to, from, except, desc) => {
11
- if (from && typeof from === "object" || typeof from === "function") {
12
- for (let key of __getOwnPropNames(from))
13
- if (!__hasOwnProp.call(to, key) && key !== except)
14
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
15
- }
16
- return to;
17
- };
18
- var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
19
- var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
20
-
21
- // index.ts
22
- var index_exports = {};
23
- __export(index_exports, {
24
- create: () => create
25
- });
26
- module.exports = __toCommonJS(index_exports);
27
-
28
- // src/index.ts
29
- var src_exports = {};
30
- __export(src_exports, {
31
- create: () => create
32
- });
33
- var import_coaction = require("coaction");
34
- var import_vue = require("vue");
35
- __reExport(src_exports, require("coaction"));
36
- var createStateProxy = (store, version) => new Proxy({}, {
37
- get(_, key) {
38
- void version.value;
39
- const state = store.getState();
40
- const value = state[key];
41
- if (typeof value === "function") {
42
- return value.bind(store.getState());
43
- }
44
- return value;
45
- },
46
- has(_, key) {
47
- void version.value;
48
- return key in store.getState();
49
- },
50
- ownKeys() {
51
- void version.value;
52
- return Reflect.ownKeys(store.getState());
53
- },
54
- getOwnPropertyDescriptor(_, key) {
55
- void version.value;
56
- const descriptor = Object.getOwnPropertyDescriptor(store.getState(), key);
57
- if (!descriptor) {
58
- return void 0;
59
- }
60
- return {
61
- ...descriptor,
62
- configurable: true
63
- };
64
- }
11
+ const directMutationErrorMessage = "Direct state mutation is not allowed in immutable Coaction stores. Wrap mutations in set(() => { ... }).";
12
+ const createStateProxy = (store, version) => new Proxy({}, {
13
+ get(_, key) {
14
+ version.value;
15
+ return store.getState()[key];
16
+ },
17
+ has(_, key) {
18
+ version.value;
19
+ return key in store.getState();
20
+ },
21
+ ownKeys() {
22
+ version.value;
23
+ return Reflect.ownKeys(store.getState());
24
+ },
25
+ getOwnPropertyDescriptor(_, key) {
26
+ version.value;
27
+ const descriptor = Object.getOwnPropertyDescriptor(store.getState(), key);
28
+ if (!descriptor) return;
29
+ return {
30
+ ...descriptor,
31
+ configurable: true
32
+ };
33
+ },
34
+ set(_, key, value) {
35
+ const state = store.getState();
36
+ state[key] = value;
37
+ return true;
38
+ },
39
+ deleteProperty(_, key) {
40
+ const state = store.getState();
41
+ if (!(key in state)) throw new TypeError(`Unknown state key '${String(key)}' cannot be deleted.`);
42
+ delete state[key];
43
+ return true;
44
+ },
45
+ defineProperty() {
46
+ throw new Error(directMutationErrorMessage);
47
+ },
48
+ setPrototypeOf() {
49
+ throw new Error(directMutationErrorMessage);
50
+ }
65
51
  });
66
- var createAutoSelector = (store, version) => {
67
- const state = store.getState();
68
- if (!store.isSliceStore) {
69
- const autoSelector2 = {};
70
- const descriptors = Object.getOwnPropertyDescriptors(state);
71
- for (const key of Object.keys(descriptors)) {
72
- const descriptor = descriptors[key];
73
- if (typeof descriptor.value === "function") {
74
- autoSelector2[key] = descriptor.value.bind(state);
75
- } else {
76
- autoSelector2[key] = (0, import_vue.computed)(() => {
77
- void version.value;
78
- return store.getState()[key];
79
- });
80
- }
81
- }
82
- return autoSelector2;
83
- }
84
- const autoSelector = {};
85
- for (const sliceKey of Object.keys(state)) {
86
- const slice = state[sliceKey];
87
- if (typeof slice !== "object" || slice === null) {
88
- continue;
89
- }
90
- const sliceAutoSelector = {};
91
- const descriptors = Object.getOwnPropertyDescriptors(slice);
92
- for (const key of Object.keys(descriptors)) {
93
- const descriptor = descriptors[key];
94
- if (typeof descriptor.value === "function") {
95
- sliceAutoSelector[key] = descriptor.value.bind(slice);
96
- } else {
97
- sliceAutoSelector[key] = (0, import_vue.computed)(() => {
98
- void version.value;
99
- return store.getState()[sliceKey][key];
100
- });
101
- }
102
- }
103
- autoSelector[sliceKey] = sliceAutoSelector;
104
- }
105
- return autoSelector;
52
+ const createAutoSelector = (store, version) => {
53
+ const getPathValue = (path) => {
54
+ let current = store.getState();
55
+ for (const key of path) {
56
+ if (typeof current !== "object" && typeof current !== "function" || current === null) return;
57
+ current = current[key];
58
+ }
59
+ return current;
60
+ };
61
+ const createAction = (path) => ((...args) => {
62
+ const fn = getPathValue(path);
63
+ if (typeof fn !== "function") return;
64
+ const receiverPath = path.slice(0, -1);
65
+ const receiver = receiverPath.length ? getPathValue(receiverPath) : store.getState();
66
+ return fn.apply(receiver, args);
67
+ });
68
+ const createNode = (path, value, ancestors = []) => {
69
+ if (typeof value === "function") return createAction(path);
70
+ if (typeof value !== "object" || value === null || Array.isArray(value) || !isPlainObject(value)) return (0, vue.computed)(() => {
71
+ version.value;
72
+ return getPathValue(path);
73
+ });
74
+ if (ancestors.includes(value)) return (0, vue.computed)(() => {
75
+ version.value;
76
+ return getPathValue(path);
77
+ });
78
+ const node = {};
79
+ const nextAncestors = [...ancestors, value];
80
+ for (const key of getOwnEnumerableKeys(value)) node[key] = createNode([...path, key], value[key], nextAncestors);
81
+ return node;
82
+ };
83
+ const state = store.getState();
84
+ const autoSelector = {};
85
+ if (!store.isSliceStore) {
86
+ for (const key of getOwnEnumerableKeys(state)) autoSelector[key] = createNode([key], state[key]);
87
+ return autoSelector;
88
+ }
89
+ for (const sliceKey of getOwnEnumerableKeys(state)) {
90
+ const slice = state[sliceKey];
91
+ if (typeof slice !== "object" || slice === null) continue;
92
+ autoSelector[sliceKey] = createNode([sliceKey], slice);
93
+ }
94
+ return autoSelector;
106
95
  };
107
- var create = (createState, options) => {
108
- const store = (0, import_coaction.create)(createState, options);
109
- const version = (0, import_vue.ref)(0);
110
- const unsubscribe = store.subscribe(() => {
111
- version.value += 1;
112
- });
113
- const baseDestroy = store.destroy;
114
- store.destroy = () => {
115
- unsubscribe();
116
- baseDestroy();
117
- };
118
- const stateProxy = createStateProxy(store, version);
119
- let autoSelector;
120
- const useStore = (0, import_coaction.wrapStore)(store, (selector) => {
121
- if (typeof selector === "function") {
122
- return (0, import_vue.computed)(() => {
123
- void version.value;
124
- return selector(store.getState());
125
- });
126
- }
127
- if (selector?.autoSelector) {
128
- if (!autoSelector) {
129
- autoSelector = createAutoSelector(store, version);
130
- }
131
- return autoSelector;
132
- }
133
- return stateProxy;
134
- });
135
- return useStore;
96
+ const create = (createState, options) => {
97
+ const store = (0, coaction.create)(createState, options);
98
+ const version = (0, vue.ref)(0);
99
+ const unsubscribe = store.subscribe(() => {
100
+ version.value += 1;
101
+ });
102
+ const baseDestroy = store.destroy;
103
+ let destroyed = false;
104
+ store.destroy = () => {
105
+ if (destroyed) return;
106
+ destroyed = true;
107
+ unsubscribe();
108
+ baseDestroy();
109
+ };
110
+ const stateProxy = createStateProxy(store, version);
111
+ let autoSelector;
112
+ return (0, coaction.wrapStore)(store, (selector) => {
113
+ if (typeof selector === "function") return (0, vue.computed)(() => {
114
+ version.value;
115
+ return selector(store.getState());
116
+ });
117
+ if (selector?.autoSelector) {
118
+ if (!autoSelector) autoSelector = createAutoSelector(store, version);
119
+ return autoSelector;
120
+ }
121
+ return stateProxy;
122
+ });
136
123
  };
137
-
138
- // index.ts
139
- __reExport(index_exports, src_exports, module.exports);
140
- // Annotate the CommonJS export names for ESM import in node:
141
- 0 && (module.exports = {
142
- create
124
+ //#endregion
125
+ exports.create = create;
126
+ Object.keys(coaction).forEach(function(k) {
127
+ if (k !== "default" && !Object.prototype.hasOwnProperty.call(exports, k)) Object.defineProperty(exports, k, {
128
+ enumerable: true,
129
+ get: function() {
130
+ return coaction[k];
131
+ }
132
+ });
143
133
  });
package/dist/index.mjs CHANGED
@@ -1,140 +1,125 @@
1
- var __defProp = Object.defineProperty;
2
- var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
3
- var __getOwnPropNames = Object.getOwnPropertyNames;
4
- var __hasOwnProp = Object.prototype.hasOwnProperty;
5
- var __export = (target, all) => {
6
- for (var name in all)
7
- __defProp(target, name, { get: all[name], enumerable: true });
8
- };
9
- var __copyProps = (to, from, except, desc) => {
10
- if (from && typeof from === "object" || typeof from === "function") {
11
- for (let key of __getOwnPropNames(from))
12
- if (!__hasOwnProp.call(to, key) && key !== except)
13
- __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
14
- }
15
- return to;
16
- };
17
- var __reExport = (target, mod, secondTarget) => (__copyProps(target, mod, "default"), secondTarget && __copyProps(secondTarget, mod, "default"));
18
-
19
- // index.ts
20
- var index_exports = {};
21
- __export(index_exports, {
22
- create: () => create
23
- });
24
-
25
- // src/index.ts
26
- var src_exports = {};
27
- __export(src_exports, {
28
- create: () => create
29
- });
30
- __reExport(src_exports, coaction_star);
31
- import { create as createVanilla, wrapStore } from "coaction";
1
+ import { create as create$1, wrapStore } from "coaction";
32
2
  import { computed, ref } from "vue";
33
- import * as coaction_star from "coaction";
34
- var createStateProxy = (store, version) => new Proxy({}, {
35
- get(_, key) {
36
- void version.value;
37
- const state = store.getState();
38
- const value = state[key];
39
- if (typeof value === "function") {
40
- return value.bind(store.getState());
41
- }
42
- return value;
43
- },
44
- has(_, key) {
45
- void version.value;
46
- return key in store.getState();
47
- },
48
- ownKeys() {
49
- void version.value;
50
- return Reflect.ownKeys(store.getState());
51
- },
52
- getOwnPropertyDescriptor(_, key) {
53
- void version.value;
54
- const descriptor = Object.getOwnPropertyDescriptor(store.getState(), key);
55
- if (!descriptor) {
56
- return void 0;
57
- }
58
- return {
59
- ...descriptor,
60
- configurable: true
61
- };
62
- }
63
- });
64
- var createAutoSelector = (store, version) => {
65
- const state = store.getState();
66
- if (!store.isSliceStore) {
67
- const autoSelector2 = {};
68
- const descriptors = Object.getOwnPropertyDescriptors(state);
69
- for (const key of Object.keys(descriptors)) {
70
- const descriptor = descriptors[key];
71
- if (typeof descriptor.value === "function") {
72
- autoSelector2[key] = descriptor.value.bind(state);
73
- } else {
74
- autoSelector2[key] = computed(() => {
75
- void version.value;
76
- return store.getState()[key];
77
- });
78
- }
79
- }
80
- return autoSelector2;
81
- }
82
- const autoSelector = {};
83
- for (const sliceKey of Object.keys(state)) {
84
- const slice = state[sliceKey];
85
- if (typeof slice !== "object" || slice === null) {
86
- continue;
87
- }
88
- const sliceAutoSelector = {};
89
- const descriptors = Object.getOwnPropertyDescriptors(slice);
90
- for (const key of Object.keys(descriptors)) {
91
- const descriptor = descriptors[key];
92
- if (typeof descriptor.value === "function") {
93
- sliceAutoSelector[key] = descriptor.value.bind(slice);
94
- } else {
95
- sliceAutoSelector[key] = computed(() => {
96
- void version.value;
97
- return store.getState()[sliceKey][key];
98
- });
99
- }
100
- }
101
- autoSelector[sliceKey] = sliceAutoSelector;
102
- }
103
- return autoSelector;
3
+ export * from "coaction";
4
+ //#endregion
5
+ //#region packages/coaction-vue/src/index.ts
6
+ const getOwnEnumerableKeys = (value) => Reflect.ownKeys(value).filter((key) => Object.prototype.propertyIsEnumerable.call(value, key));
7
+ const isPlainObject = (value) => {
8
+ const prototype = Object.getPrototypeOf(value);
9
+ return prototype === Object.prototype || prototype === null;
104
10
  };
105
- var create = (createState, options) => {
106
- const store = createVanilla(createState, options);
107
- const version = ref(0);
108
- const unsubscribe = store.subscribe(() => {
109
- version.value += 1;
110
- });
111
- const baseDestroy = store.destroy;
112
- store.destroy = () => {
113
- unsubscribe();
114
- baseDestroy();
115
- };
116
- const stateProxy = createStateProxy(store, version);
117
- let autoSelector;
118
- const useStore = wrapStore(store, (selector) => {
119
- if (typeof selector === "function") {
120
- return computed(() => {
121
- void version.value;
122
- return selector(store.getState());
123
- });
124
- }
125
- if (selector?.autoSelector) {
126
- if (!autoSelector) {
127
- autoSelector = createAutoSelector(store, version);
128
- }
129
- return autoSelector;
130
- }
131
- return stateProxy;
132
- });
133
- return useStore;
11
+ const directMutationErrorMessage = "Direct state mutation is not allowed in immutable Coaction stores. Wrap mutations in set(() => { ... }).";
12
+ const createStateProxy = (store, version) => new Proxy({}, {
13
+ get(_, key) {
14
+ version.value;
15
+ return store.getState()[key];
16
+ },
17
+ has(_, key) {
18
+ version.value;
19
+ return key in store.getState();
20
+ },
21
+ ownKeys() {
22
+ version.value;
23
+ return Reflect.ownKeys(store.getState());
24
+ },
25
+ getOwnPropertyDescriptor(_, key) {
26
+ version.value;
27
+ const descriptor = Object.getOwnPropertyDescriptor(store.getState(), key);
28
+ if (!descriptor) return;
29
+ return {
30
+ ...descriptor,
31
+ configurable: true
32
+ };
33
+ },
34
+ set(_, key, value) {
35
+ const state = store.getState();
36
+ state[key] = value;
37
+ return true;
38
+ },
39
+ deleteProperty(_, key) {
40
+ const state = store.getState();
41
+ if (!(key in state)) throw new TypeError(`Unknown state key '${String(key)}' cannot be deleted.`);
42
+ delete state[key];
43
+ return true;
44
+ },
45
+ defineProperty() {
46
+ throw new Error(directMutationErrorMessage);
47
+ },
48
+ setPrototypeOf() {
49
+ throw new Error(directMutationErrorMessage);
50
+ }
51
+ });
52
+ const createAutoSelector = (store, version) => {
53
+ const getPathValue = (path) => {
54
+ let current = store.getState();
55
+ for (const key of path) {
56
+ if (typeof current !== "object" && typeof current !== "function" || current === null) return;
57
+ current = current[key];
58
+ }
59
+ return current;
60
+ };
61
+ const createAction = (path) => ((...args) => {
62
+ const fn = getPathValue(path);
63
+ if (typeof fn !== "function") return;
64
+ const receiverPath = path.slice(0, -1);
65
+ const receiver = receiverPath.length ? getPathValue(receiverPath) : store.getState();
66
+ return fn.apply(receiver, args);
67
+ });
68
+ const createNode = (path, value, ancestors = []) => {
69
+ if (typeof value === "function") return createAction(path);
70
+ if (typeof value !== "object" || value === null || Array.isArray(value) || !isPlainObject(value)) return computed(() => {
71
+ version.value;
72
+ return getPathValue(path);
73
+ });
74
+ if (ancestors.includes(value)) return computed(() => {
75
+ version.value;
76
+ return getPathValue(path);
77
+ });
78
+ const node = {};
79
+ const nextAncestors = [...ancestors, value];
80
+ for (const key of getOwnEnumerableKeys(value)) node[key] = createNode([...path, key], value[key], nextAncestors);
81
+ return node;
82
+ };
83
+ const state = store.getState();
84
+ const autoSelector = {};
85
+ if (!store.isSliceStore) {
86
+ for (const key of getOwnEnumerableKeys(state)) autoSelector[key] = createNode([key], state[key]);
87
+ return autoSelector;
88
+ }
89
+ for (const sliceKey of getOwnEnumerableKeys(state)) {
90
+ const slice = state[sliceKey];
91
+ if (typeof slice !== "object" || slice === null) continue;
92
+ autoSelector[sliceKey] = createNode([sliceKey], slice);
93
+ }
94
+ return autoSelector;
134
95
  };
135
-
136
- // index.ts
137
- __reExport(index_exports, src_exports);
138
- export {
139
- create
96
+ const create = (createState, options) => {
97
+ const store = create$1(createState, options);
98
+ const version = ref(0);
99
+ const unsubscribe = store.subscribe(() => {
100
+ version.value += 1;
101
+ });
102
+ const baseDestroy = store.destroy;
103
+ let destroyed = false;
104
+ store.destroy = () => {
105
+ if (destroyed) return;
106
+ destroyed = true;
107
+ unsubscribe();
108
+ baseDestroy();
109
+ };
110
+ const stateProxy = createStateProxy(store, version);
111
+ let autoSelector;
112
+ return wrapStore(store, (selector) => {
113
+ if (typeof selector === "function") return computed(() => {
114
+ version.value;
115
+ return selector(store.getState());
116
+ });
117
+ if (selector?.autoSelector) {
118
+ if (!autoSelector) autoSelector = createAutoSelector(store, version);
119
+ return autoSelector;
120
+ }
121
+ return stateProxy;
122
+ });
140
123
  };
124
+ //#endregion
125
+ export { create };
package/package.json CHANGED
@@ -1,66 +1,66 @@
1
1
  {
2
2
  "name": "@coaction/vue",
3
- "version": "1.5.0",
3
+ "version": "2.1.0",
4
4
  "description": "A Coaction integration tool for Vue",
5
5
  "keywords": [
6
6
  "coaction",
7
- "vue",
7
+ "data-transport",
8
8
  "multithreading",
9
9
  "mutative",
10
- "data-transport"
10
+ "vue"
11
11
  ],
12
- "authors": [
13
- "Michael Lin <unadlib@gmail.com> (https://github.com/unadlib)"
14
- ],
15
- "homepage": "https://github.com/unadlib/coaction/tree/main/packages/coaction-vue#readme",
12
+ "homepage": "https://github.com/coactionjs/coaction/tree/main/packages/coaction-vue#readme",
13
+ "bugs": {
14
+ "url": "https://github.com/coactionjs/coaction/issues"
15
+ },
16
16
  "license": "MIT",
17
+ "author": "unadlib",
18
+ "repository": {
19
+ "type": "git",
20
+ "url": "https://github.com/coactionjs/coaction.git",
21
+ "directory": "packages/coaction-vue"
22
+ },
23
+ "files": [
24
+ "dist"
25
+ ],
26
+ "sideEffects": false,
17
27
  "main": "dist/index.js",
18
28
  "module": "dist/index.mjs",
29
+ "types": "dist/index.d.ts",
19
30
  "exports": {
20
31
  ".": {
21
- "types": "./dist/index.d.ts",
22
- "import": "./dist/index.mjs",
23
- "require": "./dist/index.js",
32
+ "import": {
33
+ "types": "./dist/index.d.mts",
34
+ "default": "./dist/index.mjs"
35
+ },
36
+ "require": {
37
+ "types": "./dist/index.d.ts",
38
+ "default": "./dist/index.js"
39
+ },
24
40
  "default": "./dist/index.mjs"
25
41
  },
26
42
  "./package.json": "./package.json"
27
43
  },
28
- "types": "dist/index.d.ts",
29
- "sideEffects": false,
30
- "files": [
31
- "dist"
32
- ],
33
- "repository": {
34
- "type": "git",
35
- "url": "https://github.com/unadlib/coaction.git",
36
- "directory": "packages/coaction-vue"
37
- },
38
- "bugs": {
39
- "url": "https://github.com/unadlib/coaction/issues"
40
- },
41
- "peerDependencies": {
42
- "coaction": "^1.5.0",
43
- "vue": "^3.0.0"
44
- },
45
- "peerDependenciesMeta": {
46
- "coaction": {
47
- "optional": true
48
- }
44
+ "publishConfig": {
45
+ "access": "public",
46
+ "provenance": true
49
47
  },
50
48
  "devDependencies": {
51
49
  "@testing-library/vue": "^8.1.0",
52
50
  "vue": "^3.5.30",
53
- "coaction": "1.5.0"
51
+ "coaction": "2.1.0"
54
52
  },
55
- "publishConfig": {
56
- "access": "public",
57
- "provenance": true
53
+ "peerDependencies": {
54
+ "coaction": ">=2.1.0 <3",
55
+ "vue": "^3.0.0"
58
56
  },
59
- "author": "unadlib",
57
+ "authors": [
58
+ "Michael Lin <unadlib@gmail.com> (https://github.com/unadlib)"
59
+ ],
60
60
  "scripts": {
61
61
  "clean": "rm -rf dist",
62
62
  "test": "vitest run test",
63
- "build": "tsup index.ts --format cjs,esm --dts --clean --out-dir dist",
64
- "dev": "tsup index.ts --format cjs,esm --dts --watch --out-dir dist"
63
+ "build": "node ../../scripts/build-package.mjs",
64
+ "dev": "node ../../scripts/build-package.mjs --watch"
65
65
  }
66
66
  }