vue-to-reactive 1.0.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 +51 -0
- package/banner.svg +52 -0
- package/dist/index.cjs +38 -0
- package/dist/index.d.cts +11 -0
- package/dist/index.d.mts +11 -0
- package/dist/index.d.ts +11 -0
- package/dist/index.mjs +36 -0
- package/logo.svg +34 -0
- package/package.json +61 -0
package/README.md
ADDED
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
<p align="center">
|
|
2
|
+
<img src="logo.svg" alt="vue-to-reactive" width="180" />
|
|
3
|
+
</p>
|
|
4
|
+
|
|
5
|
+
<h1 align="center">vue-to-reactive</h1>
|
|
6
|
+
|
|
7
|
+
<p align="center">A Vue 3 composition API utility that converts a ref into a reactive proxy object, enabling direct property access without .value while maintaining full reactivity.</p>
|
|
8
|
+
|
|
9
|
+
<p align="center">
|
|
10
|
+
<a href="https://www.npmjs.com/package/vue-to-reactive"><img src="https://img.shields.io/npm/v/vue-to-reactive.svg" alt="npm version" /></a>
|
|
11
|
+
<a href="https://www.npmjs.com/package/vue-to-reactive"><img src="https://img.shields.io/npm/dm/vue-to-reactive.svg" alt="npm downloads" /></a>
|
|
12
|
+
<a href="https://github.com/vuefrag/vue-to-reactive/blob/main/LICENSE"><img src="https://img.shields.io/npm/l/vue-to-reactive.svg" alt="license" /></a>
|
|
13
|
+
</p>
|
|
14
|
+
|
|
15
|
+
> Extracted from [VueUse](https://vueuse.org/) for standalone use.
|
|
16
|
+
|
|
17
|
+
## Installation
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npm install vue-to-reactive
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Usage
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
import { toReactive } from 'vue-to-reactive';
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
Converts ref to reactive. Also made possible to create a "swapable" reactive object.
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
import { toReactive } from 'vue-to-reactive'
|
|
33
|
+
import { ref } from 'vue'
|
|
34
|
+
|
|
35
|
+
const refState = ref({ foo: 'bar' })
|
|
36
|
+
|
|
37
|
+
console.log(refState.value.foo) // => 'bar'
|
|
38
|
+
|
|
39
|
+
const state = toReactive(refState) // <--
|
|
40
|
+
|
|
41
|
+
console.log(state.foo) // => 'bar'
|
|
42
|
+
|
|
43
|
+
refState.value = { bar: 'foo' }
|
|
44
|
+
|
|
45
|
+
console.log(state.foo) // => undefined
|
|
46
|
+
console.log(state.bar) // => 'foo'
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## License
|
|
50
|
+
|
|
51
|
+
MIT
|
package/banner.svg
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1280 640" width="1280" height="640">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="banner-bg" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
4
|
+
<stop offset="0%" style="stop-color:#35495e;stop-opacity:1" />
|
|
5
|
+
<stop offset="100%" style="stop-color:#1a252f;stop-opacity:1" />
|
|
6
|
+
</linearGradient>
|
|
7
|
+
</defs>
|
|
8
|
+
|
|
9
|
+
<!-- Background -->
|
|
10
|
+
<rect width="1280" height="640" fill="url(#banner-bg)"/>
|
|
11
|
+
|
|
12
|
+
<!-- Decorative elements -->
|
|
13
|
+
<circle cx="1200" cy="100" r="300" fill="#42b883" opacity="0.05"/>
|
|
14
|
+
<circle cx="80" cy="540" r="200" fill="#42b883" opacity="0.05"/>
|
|
15
|
+
|
|
16
|
+
<!-- Top accent bar -->
|
|
17
|
+
<rect x="0" y="0" width="1280" height="8" fill="#42b883"/>
|
|
18
|
+
|
|
19
|
+
<!-- VueFrag badge -->
|
|
20
|
+
<g transform="translate(80, 80)">
|
|
21
|
+
<rect width="140" height="50" rx="8" fill="#42b883"/>
|
|
22
|
+
<text x="70" y="33" text-anchor="middle" font-family="system-ui, -apple-system, sans-serif" font-size="22" font-weight="700" fill="white">VueFrag</text>
|
|
23
|
+
</g>
|
|
24
|
+
|
|
25
|
+
<!-- Package name -->
|
|
26
|
+
<text x="80" y="280" font-family="system-ui, -apple-system, sans-serif" font-size="72" font-weight="700" fill="white">vue-to-reactive</text>
|
|
27
|
+
|
|
28
|
+
<!-- Description -->
|
|
29
|
+
<text x="80" y="360" font-family="system-ui, -apple-system, sans-serif" font-size="32" fill="#94a3b8">Vue 3 utility converting ref to reactive proxy object</text>
|
|
30
|
+
|
|
31
|
+
<!-- Install command -->
|
|
32
|
+
<g transform="translate(80, 420)">
|
|
33
|
+
<rect width="500" height="60" rx="8" fill="#0f172a"/>
|
|
34
|
+
<text x="20" y="40" font-family="ui-monospace, monospace" font-size="24" fill="#94a3b8">npm install</text>
|
|
35
|
+
<text x="200" y="40" font-family="ui-monospace, monospace" font-size="24" fill="#42b883">vue-to-reactive</text>
|
|
36
|
+
</g>
|
|
37
|
+
|
|
38
|
+
<!-- Category badge -->
|
|
39
|
+
<g transform="translate(80, 520)">
|
|
40
|
+
<rect width="172" height="40" rx="20" fill="#42b883" opacity="0.2"/>
|
|
41
|
+
<text x="86" y="27" text-anchor="middle" font-family="system-ui, -apple-system, sans-serif" font-size="18" fill="#42b883">Reactivity</text>
|
|
42
|
+
</g>
|
|
43
|
+
|
|
44
|
+
<!-- Vue logo hint -->
|
|
45
|
+
<g transform="translate(1080, 480)">
|
|
46
|
+
<polygon points="100,20 140,100 60,100" fill="#42b883" opacity="0.3"/>
|
|
47
|
+
<polygon points="100,40 125,90 75,90" fill="#42b883" opacity="0.5"/>
|
|
48
|
+
</g>
|
|
49
|
+
|
|
50
|
+
<!-- Bottom text -->
|
|
51
|
+
<text x="1200" y="600" text-anchor="end" font-family="system-ui, -apple-system, sans-serif" font-size="18" fill="#64748b">Standalone VueUse function</text>
|
|
52
|
+
</svg>
|
package/dist/index.cjs
ADDED
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const vue = require('vue');
|
|
4
|
+
|
|
5
|
+
function toReactive(objectRef) {
|
|
6
|
+
if (!vue.isRef(objectRef))
|
|
7
|
+
return vue.reactive(objectRef);
|
|
8
|
+
const proxy = new Proxy({}, {
|
|
9
|
+
get(_, p, receiver) {
|
|
10
|
+
return vue.unref(Reflect.get(objectRef.value, p, receiver));
|
|
11
|
+
},
|
|
12
|
+
set(_, p, value) {
|
|
13
|
+
if (vue.isRef(objectRef.value[p]) && !vue.isRef(value))
|
|
14
|
+
objectRef.value[p].value = value;
|
|
15
|
+
else
|
|
16
|
+
objectRef.value[p] = value;
|
|
17
|
+
return true;
|
|
18
|
+
},
|
|
19
|
+
deleteProperty(_, p) {
|
|
20
|
+
return Reflect.deleteProperty(objectRef.value, p);
|
|
21
|
+
},
|
|
22
|
+
has(_, p) {
|
|
23
|
+
return Reflect.has(objectRef.value, p);
|
|
24
|
+
},
|
|
25
|
+
ownKeys() {
|
|
26
|
+
return Object.keys(objectRef.value);
|
|
27
|
+
},
|
|
28
|
+
getOwnPropertyDescriptor() {
|
|
29
|
+
return {
|
|
30
|
+
enumerable: true,
|
|
31
|
+
configurable: true
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
return vue.reactive(proxy);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
exports.toReactive = toReactive;
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { MaybeRef, UnwrapNestedRefs } from 'vue';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Converts ref to reactive.
|
|
5
|
+
*
|
|
6
|
+
* @see https://vueuse.org/toReactive
|
|
7
|
+
* @param objectRef A ref of object
|
|
8
|
+
*/
|
|
9
|
+
declare function toReactive<T extends object>(objectRef: MaybeRef<T>): UnwrapNestedRefs<T>;
|
|
10
|
+
|
|
11
|
+
export { toReactive };
|
package/dist/index.d.mts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { MaybeRef, UnwrapNestedRefs } from 'vue';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Converts ref to reactive.
|
|
5
|
+
*
|
|
6
|
+
* @see https://vueuse.org/toReactive
|
|
7
|
+
* @param objectRef A ref of object
|
|
8
|
+
*/
|
|
9
|
+
declare function toReactive<T extends object>(objectRef: MaybeRef<T>): UnwrapNestedRefs<T>;
|
|
10
|
+
|
|
11
|
+
export { toReactive };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { MaybeRef, UnwrapNestedRefs } from 'vue';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Converts ref to reactive.
|
|
5
|
+
*
|
|
6
|
+
* @see https://vueuse.org/toReactive
|
|
7
|
+
* @param objectRef A ref of object
|
|
8
|
+
*/
|
|
9
|
+
declare function toReactive<T extends object>(objectRef: MaybeRef<T>): UnwrapNestedRefs<T>;
|
|
10
|
+
|
|
11
|
+
export { toReactive };
|
package/dist/index.mjs
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { isRef, reactive, unref } from 'vue';
|
|
2
|
+
|
|
3
|
+
function toReactive(objectRef) {
|
|
4
|
+
if (!isRef(objectRef))
|
|
5
|
+
return reactive(objectRef);
|
|
6
|
+
const proxy = new Proxy({}, {
|
|
7
|
+
get(_, p, receiver) {
|
|
8
|
+
return unref(Reflect.get(objectRef.value, p, receiver));
|
|
9
|
+
},
|
|
10
|
+
set(_, p, value) {
|
|
11
|
+
if (isRef(objectRef.value[p]) && !isRef(value))
|
|
12
|
+
objectRef.value[p].value = value;
|
|
13
|
+
else
|
|
14
|
+
objectRef.value[p] = value;
|
|
15
|
+
return true;
|
|
16
|
+
},
|
|
17
|
+
deleteProperty(_, p) {
|
|
18
|
+
return Reflect.deleteProperty(objectRef.value, p);
|
|
19
|
+
},
|
|
20
|
+
has(_, p) {
|
|
21
|
+
return Reflect.has(objectRef.value, p);
|
|
22
|
+
},
|
|
23
|
+
ownKeys() {
|
|
24
|
+
return Object.keys(objectRef.value);
|
|
25
|
+
},
|
|
26
|
+
getOwnPropertyDescriptor() {
|
|
27
|
+
return {
|
|
28
|
+
enumerable: true,
|
|
29
|
+
configurable: true
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
return reactive(proxy);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
export { toReactive };
|
package/logo.svg
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 96 96" width="256" height="256">
|
|
2
|
+
<defs>
|
|
3
|
+
<linearGradient id="bg-grad" x1="0%" y1="0%" x2="100%" y2="100%">
|
|
4
|
+
<stop offset="0%" style="stop-color:#35495e;stop-opacity:1" />
|
|
5
|
+
<stop offset="100%" style="stop-color:#1a252f;stop-opacity:1" />
|
|
6
|
+
</linearGradient>
|
|
7
|
+
</defs>
|
|
8
|
+
|
|
9
|
+
<!-- Background -->
|
|
10
|
+
<rect width="96" height="96" rx="16" fill="url(#bg-grad)"/>
|
|
11
|
+
|
|
12
|
+
<!-- Decorative corner accent -->
|
|
13
|
+
<path d="M96 0v20c0-11.046-8.954-20-20-20H96z" fill="#42b883" opacity="0.12"/>
|
|
14
|
+
|
|
15
|
+
<!-- Vue badge -->
|
|
16
|
+
<g transform="translate(8, 8)">
|
|
17
|
+
<rect width="18" height="9" rx="2" fill="#42b883"/>
|
|
18
|
+
<text x="9" y="6.8" text-anchor="middle" font-family="system-ui, -apple-system, sans-serif" font-size="4.5" font-weight="700" fill="white">VUE</text>
|
|
19
|
+
</g>
|
|
20
|
+
|
|
21
|
+
<!-- Category icon -->
|
|
22
|
+
<g>
|
|
23
|
+
<circle cx="48" cy="28" r="12" fill="none" stroke="#42b883" stroke-width="3"/><circle cx="48" cy="28" r="5" fill="#42b883"/><path d="M36 28h-4M60 28h4M48 16v-4M48 40v4" stroke="#42b883" stroke-width="2" stroke-linecap="round"/>
|
|
24
|
+
</g>
|
|
25
|
+
|
|
26
|
+
<!-- Function name - textLength ensures it fits within bounds -->
|
|
27
|
+
<text x="48" y="57" text-anchor="middle" font-family="system-ui, -apple-system, sans-serif" font-size="10" font-weight="600" fill="white" textLength="66" lengthAdjust="spacingAndGlyphs">To Reactive</text>
|
|
28
|
+
|
|
29
|
+
<!-- Category label -->
|
|
30
|
+
<text x="48" y="72" text-anchor="middle" font-family="system-ui, -apple-system, sans-serif" font-size="7" fill="#42b883" opacity="0.85">Reactivity</text>
|
|
31
|
+
|
|
32
|
+
<!-- Bottom accent line -->
|
|
33
|
+
<rect x="28" y="82" width="40" height="2" rx="1" fill="#42b883" opacity="0.5"/>
|
|
34
|
+
</svg>
|
package/package.json
ADDED
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "vue-to-reactive",
|
|
3
|
+
"version": "1.0.0",
|
|
4
|
+
"description": "Vue 3 utility converting ref to reactive proxy object",
|
|
5
|
+
"main": "dist/index.cjs",
|
|
6
|
+
"module": "dist/index.mjs",
|
|
7
|
+
"types": "dist/index.d.ts",
|
|
8
|
+
"exports": {
|
|
9
|
+
".": {
|
|
10
|
+
"import": "./dist/index.mjs",
|
|
11
|
+
"require": "./dist/index.cjs",
|
|
12
|
+
"types": "./dist/index.d.ts"
|
|
13
|
+
}
|
|
14
|
+
},
|
|
15
|
+
"files": [
|
|
16
|
+
"dist",
|
|
17
|
+
"logo.svg",
|
|
18
|
+
"banner.svg"
|
|
19
|
+
],
|
|
20
|
+
"scripts": {
|
|
21
|
+
"build": "unbuild",
|
|
22
|
+
"prepublishOnly": "npm run build"
|
|
23
|
+
},
|
|
24
|
+
"keywords": [
|
|
25
|
+
"vue",
|
|
26
|
+
"vue3",
|
|
27
|
+
"vue-3",
|
|
28
|
+
"composable",
|
|
29
|
+
"composition-api",
|
|
30
|
+
"vueuse",
|
|
31
|
+
"reactive",
|
|
32
|
+
"reactivity",
|
|
33
|
+
"computed",
|
|
34
|
+
"ref",
|
|
35
|
+
"state",
|
|
36
|
+
"convert",
|
|
37
|
+
"unwrap",
|
|
38
|
+
"proxy",
|
|
39
|
+
"object",
|
|
40
|
+
"no-value",
|
|
41
|
+
"toReactive"
|
|
42
|
+
],
|
|
43
|
+
"author": "VueFrag",
|
|
44
|
+
"license": "MIT",
|
|
45
|
+
"repository": {
|
|
46
|
+
"type": "git",
|
|
47
|
+
"url": "git+https://github.com/vuefrag/vue-to-reactive.git"
|
|
48
|
+
},
|
|
49
|
+
"bugs": {
|
|
50
|
+
"url": "https://github.com/vuefrag/vue-to-reactive/issues"
|
|
51
|
+
},
|
|
52
|
+
"homepage": "https://github.com/vuefrag/vue-to-reactive#readme",
|
|
53
|
+
"peerDependencies": {
|
|
54
|
+
"vue": ">=3.0.0"
|
|
55
|
+
},
|
|
56
|
+
"devDependencies": {
|
|
57
|
+
"unbuild": "^2.0.0",
|
|
58
|
+
"typescript": "^5.0.0",
|
|
59
|
+
"vue": "^3.4.0"
|
|
60
|
+
}
|
|
61
|
+
}
|