Skip to content

Commit a06a1b8

Browse files
committed
Merge remote-tracking branch 'origin/master' into fix/ref-type
2 parents 0f958ad + b090c2c commit a06a1b8

33 files changed

+5391
-2719
lines changed

package.json

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -35,29 +35,29 @@
3535
},
3636
"homepage": "https://github.com/vuejs/composition-api#readme",
3737
"devDependencies": {
38-
"@types/jest": "^24.0.13",
39-
"@types/node": "^12.0.2",
40-
"cross-env": "^5.2.0",
41-
"husky": "^2.7.0",
42-
"jest": "^24.8.0",
43-
"lint-staged": "^8.2.1",
44-
"prettier": "^1.18.2",
45-
"rollup": "^1.12.0",
46-
"rollup-plugin-node-resolve": "^5.0.0",
47-
"rollup-plugin-replace": "^2.2.0",
48-
"rollup-plugin-terser": "^4.0.4",
49-
"rollup-plugin-typescript2": "^0.21.0",
50-
"ts-jest": "^24.0.2",
51-
"typescript": "^3.6.2",
52-
"vue": "^2.5.22",
53-
"vue-router": "^3.1.3",
54-
"vue-server-renderer": "^2.6.10"
38+
"@rollup/plugin-node-resolve": "8.0.0",
39+
"@rollup/plugin-replace": "^2.3.2",
40+
"@types/jest": "^25.2.3",
41+
"@types/node": "^14.0.6",
42+
"cross-env": "^7.0.2",
43+
"husky": "^4.2.5",
44+
"jest": "^26.0.1",
45+
"lint-staged": "^10.2.7",
46+
"prettier": "^2.0.5",
47+
"rollup": "^2.12.0",
48+
"rollup-plugin-terser": "^6.1.0",
49+
"rollup-plugin-typescript2": "^0.27.1",
50+
"ts-jest": "^26.1.0",
51+
"typescript": "^3.9.3",
52+
"vue": "^2.6.11",
53+
"vue-router": "^3.3.2",
54+
"vue-server-renderer": "^2.6.11"
5555
},
5656
"peerDependencies": {
5757
"vue": "^2.5.22"
5858
},
5959
"dependencies": {
60-
"tslib": "^1.9.3"
60+
"tslib": "^2.0.0"
6161
},
6262
"husky": {
6363
"hooks": {
@@ -76,6 +76,9 @@
7676
},
7777
"jest": {
7878
"verbose": true,
79+
"globals": {
80+
"__DEV__": true
81+
},
7982
"setupFiles": [
8083
"<rootDir>/test/setupTest.js"
8184
],

rollup.config.js

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
import * as path from 'path';
22
// import filesize from 'rollup-plugin-filesize';
33
import typescript from 'rollup-plugin-typescript2';
4-
import resolve from 'rollup-plugin-node-resolve';
4+
import resolve from '@rollup/plugin-node-resolve';
55
import { terser } from 'rollup-plugin-terser';
6-
import replace from 'rollup-plugin-replace';
6+
import replace from '@rollup/plugin-replace';
77

88
const builds = {
99
'cjs-dev': {
@@ -34,7 +34,7 @@ const builds = {
3434
};
3535

3636
function getAllBuilds() {
37-
return Object.keys(builds).map(key => genConfig(builds[key]));
37+
return Object.keys(builds).map((key) => genConfig(builds[key]));
3838
}
3939

4040
function genConfig({ outFile, format, mode }) {
@@ -56,7 +56,15 @@ function genConfig({ outFile, format, mode }) {
5656
typescript: require('typescript'),
5757
}),
5858
resolve(),
59-
replace({ 'process.env.NODE_ENV': JSON.stringify(isProd ? 'production' : 'development') }),
59+
replace({
60+
'process.env.NODE_ENV': JSON.stringify(isProd ? 'production' : 'development'),
61+
__DEV__:
62+
format === 'es'
63+
? // preserve to be handled by bundlers
64+
`(__DEV__)`
65+
: // hard coded dev/prod builds
66+
!isProd,
67+
}),
6068
isProd && terser(),
6169
].filter(Boolean),
6270
};

src/apis/computed.ts

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,14 +8,20 @@ interface Option<T> {
88
set: (value: T) => void;
99
}
1010

11+
export interface ComputedRef<T = any> extends WritableComputedRef<T> {
12+
readonly value: T;
13+
}
14+
15+
export interface WritableComputedRef<T> extends Ref<T> {}
16+
1117
// read-only
12-
export function computed<T>(getter: Option<T>['get']): Readonly<Ref<Readonly<T>>>;
18+
export function computed<T>(getter: Option<T>['get']): ComputedRef<T>;
1319
// writable
14-
export function computed<T>(options: Option<T>): Ref<Readonly<T>>;
20+
export function computed<T>(options: Option<T>): WritableComputedRef<T>;
1521
// implement
1622
export function computed<T>(
1723
options: Option<T>['get'] | Option<T>
18-
): Readonly<Ref<Readonly<T>>> | Ref<Readonly<T>> {
24+
): ComputedRef<T> | WritableComputedRef<T> {
1925
const vm = getCurrentVM();
2026
let get: Option<T>['get'], set: Option<T>['set'] | undefined;
2127
if (typeof options === 'function') {
@@ -37,7 +43,7 @@ export function computed<T>(
3743
return createRef<T>({
3844
get: () => (computedHost as any).$$state,
3945
set: (v: T) => {
40-
if (process.env.NODE_ENV !== 'production' && !set) {
46+
if (__DEV__ && !set) {
4147
warn('Computed property was assigned to but it has no setter.', vm!);
4248
return;
4349
}

src/apis/inject.ts

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import { ComponentInstance } from '../component';
2-
import { ensureCurrentVMInFn } from '../helper';
2+
import { currentVMInFn } from '../helper';
33
import { hasOwn, warn } from '../utils';
4+
import { getCurrentVM } from '../runtimeContext';
45

56
const NOT_FOUND = {};
67
export interface InjectionKey<T> extends Symbol {}
78

8-
function resolveInject(provideKey: InjectionKey<any>, vm: ComponentInstance): any {
9+
function resolveInject(provideKey: InjectionKey<any> | string, vm: ComponentInstance): any {
910
let source = vm;
1011
while (source) {
1112
// @ts-ignore
@@ -20,12 +21,14 @@ function resolveInject(provideKey: InjectionKey<any>, vm: ComponentInstance): an
2021
}
2122

2223
export function provide<T>(key: InjectionKey<T> | string, value: T): void {
23-
const vm: any = ensureCurrentVMInFn('provide');
24+
const vm: any = currentVMInFn('provide');
25+
if (!vm) return;
26+
2427
if (!vm._provided) {
2528
const provideCache = {};
2629
Object.defineProperty(vm, '_provided', {
2730
get: () => provideCache,
28-
set: v => Object.assign(provideCache, v),
31+
set: (v) => Object.assign(provideCache, v),
2932
});
3033
}
3134

@@ -34,19 +37,23 @@ export function provide<T>(key: InjectionKey<T> | string, value: T): void {
3437

3538
export function inject<T>(key: InjectionKey<T> | string): T | undefined;
3639
export function inject<T>(key: InjectionKey<T> | string, defaultValue: T): T;
37-
export function inject<T>(key: InjectionKey<T> | string, defaultValue?: T): T | undefined {
40+
export function inject(key: InjectionKey<any> | string, defaultValue?: unknown) {
3841
if (!key) {
3942
return defaultValue;
4043
}
4144

42-
const vm = ensureCurrentVMInFn('inject');
43-
const val = resolveInject(key as InjectionKey<T>, vm);
44-
if (val !== NOT_FOUND) {
45-
return val;
46-
} else {
47-
if (defaultValue === undefined && process.env.NODE_ENV !== 'production') {
48-
warn(`Injection "${String(key)}" not found`, vm);
45+
const vm = getCurrentVM();
46+
if (vm) {
47+
const val = resolveInject(key, vm);
48+
if (val !== NOT_FOUND) {
49+
return val;
50+
} else {
51+
if (defaultValue === undefined && process.env.NODE_ENV !== 'production') {
52+
warn(`Injection "${String(key)}" not found`, vm);
53+
}
54+
return defaultValue;
4955
}
50-
return defaultValue;
56+
} else {
57+
warn(`inject() can only be used inside setup() or functional components.`);
5158
}
5259
}

src/apis/lifecycle.ts

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,34 @@
11
import { VueConstructor } from 'vue';
22
import { ComponentInstance } from '../component';
3-
import { getCurrentVue } from '../runtimeContext';
4-
import { ensureCurrentVMInFn } from '../helper';
3+
import { getCurrentVue, setCurrentVM, getCurrentVM } from '../runtimeContext';
4+
import { currentVMInFn } from '../helper';
55

66
const genName = (name: string) => `on${name[0].toUpperCase() + name.slice(1)}`;
77
function createLifeCycle(lifeCyclehook: string) {
88
return (callback: Function) => {
9-
const vm = ensureCurrentVMInFn(genName(lifeCyclehook));
10-
injectHookOption(getCurrentVue(), vm, lifeCyclehook, callback);
9+
const vm = currentVMInFn(genName(lifeCyclehook));
10+
if (vm) {
11+
injectHookOption(getCurrentVue(), vm, lifeCyclehook, callback);
12+
}
1113
};
1214
}
1315

1416
function injectHookOption(Vue: VueConstructor, vm: ComponentInstance, hook: string, val: Function) {
1517
const options = vm.$options as any;
1618
const mergeFn = Vue.config.optionMergeStrategies[hook];
17-
options[hook] = mergeFn(options[hook], val);
19+
options[hook] = mergeFn(options[hook], wrapHookCall(vm, val));
20+
}
21+
22+
function wrapHookCall(vm: ComponentInstance, fn: Function) {
23+
return (...args: any) => {
24+
let preVm = getCurrentVM();
25+
setCurrentVM(vm);
26+
try {
27+
return fn(...args);
28+
} finally {
29+
setCurrentVM(preVm);
30+
}
31+
};
1832
}
1933

2034
// export const onCreated = createLifeCycle('created');

src/apis/state.ts

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,17 @@
1-
export { reactive, ref, Ref, isRef, toRefs, set } from '../reactivity';
1+
export {
2+
reactive,
3+
ref,
4+
Ref,
5+
isRef,
6+
toRefs,
7+
set,
8+
toRef,
9+
isReactive,
10+
UnwrapRef,
11+
markRaw,
12+
unref,
13+
shallowReactive,
14+
toRaw,
15+
shallowRef,
16+
triggerRef,
17+
} from '../reactivity';

0 commit comments

Comments
 (0)