@authup/client-web-kit 1.0.0-beta.23 → 1.0.0-beta.24
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/components/permission/APermissionCheck.d.ts +1 -1
- package/dist/components/permission/APermissionCheck.d.ts.map +1 -1
- package/dist/composables/use-permission-check.d.ts +1 -1
- package/dist/composables/use-permission-check.d.ts.map +1 -1
- package/dist/core/permission-check/types.d.ts +1 -1
- package/dist/core/permission-check/types.d.ts.map +1 -1
- package/dist/core/resource/socket/module.d.ts.map +1 -1
- package/dist/core/resource/socket/type.d.ts +1 -2
- package/dist/core/resource/socket/type.d.ts.map +1 -1
- package/dist/core/store/create.d.ts +4 -4
- package/dist/core/store/create.d.ts.map +1 -1
- package/dist/index.cjs +18 -45
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +8 -35
- package/dist/index.mjs.map +1 -1
- package/package.json +18 -12
- package/dist/security/index.d.ts +0 -2
- package/dist/security/index.d.ts.map +0 -1
- package/dist/security/policy/index.d.ts +0 -3
- package/dist/security/policy/index.d.ts.map +0 -1
- package/dist/security/policy/module.d.ts +0 -5
- package/dist/security/policy/module.d.ts.map +0 -1
- package/dist/security/policy/variants/evaluator.d.ts +0 -11
- package/dist/security/policy/variants/evaluator.d.ts.map +0 -1
- package/dist/security/policy/variants/index.d.ts +0 -2
- package/dist/security/policy/variants/index.d.ts.map +0 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { PermissionCheckerCheckOptions, PolicyData } from '@authup/
|
|
1
|
+
import type { PermissionCheckerCheckOptions, PolicyData } from '@authup/access';
|
|
2
2
|
import type { PropType } from 'vue';
|
|
3
3
|
export declare const APermissionCheck: import("vue").DefineComponent<import("vue").ExtractPropTypes<{
|
|
4
4
|
name: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"APermissionCheck.d.ts","sourceRoot":"","sources":["../../../src/components/permission/APermissionCheck.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,6BAA6B,EAAE,UAAU,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"APermissionCheck.d.ts","sourceRoot":"","sources":["../../../src/components/permission/APermissionCheck.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,6BAA6B,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAEhF,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAIpC,eAAO,MAAM,gBAAgB;;cAGQ,QAAQ,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;;;;cAIpC,QAAQ,CAAC,UAAU,CAAC;;;cAGpB,QAAQ,CAAC,6BAA6B,CAAC;;;;;;;;cAP9B,QAAQ,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;;;;cAIpC,QAAQ,CAAC,UAAU,CAAC;;;cAGpB,QAAQ,CAAC,6BAA6B,CAAC;;iGAuBjE,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { PermissionCheckerCheckContext } from '@authup/
|
|
1
|
+
import type { PermissionCheckerCheckContext } from '@authup/access';
|
|
2
2
|
import type { Ref } from 'vue';
|
|
3
3
|
export declare function usePermissionCheck(ctx: PermissionCheckerCheckContext): Ref<boolean>;
|
|
4
4
|
//# sourceMappingURL=use-permission-check.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"use-permission-check.d.ts","sourceRoot":"","sources":["../../src/composables/use-permission-check.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"use-permission-check.d.ts","sourceRoot":"","sources":["../../src/composables/use-permission-check.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AAG/B,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,6BAA6B,GAAI,GAAG,CAAC,OAAO,CAAC,CAIpF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/permission-check/types.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/core/permission-check/types.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,gBAAgB,CAAC;AACpE,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,OAAO,CAAC;AACnC,OAAO,KAAK,EAAE,GAAG,EAAE,GAAG,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,UAAU,CAAC;AAEtC,MAAM,MAAM,wCAAwC,GAAG;IACnD,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,KAAK,CAAC,EAAE,KAAK,CAAC;IACd,GAAG,CAAC,EAAE,GAAG,CAAA;CACZ,CAAC;AAEF,MAAM,MAAM,2BAA2B,GAAG,CAAC,GAAG,EAAE,6BAA6B,KAAK,GAAG,CAAC,OAAO,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../src/core/resource/socket/module.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAER,aAAa,EAEhB,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"module.d.ts","sourceRoot":"","sources":["../../../../src/core/resource/socket/module.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAER,aAAa,EAEhB,MAAM,kBAAkB,CAAC;AAO1B,OAAO,KAAK,EAAE,qBAAqB,EAAE,kCAAkC,EAAE,MAAM,QAAQ,CAAC;AAkOxF,wBAAgB,2BAA2B,CACvC,CAAC,SAAS,MAAM,aAAa,EAE7B,GAAG,EAAE,kCAAkC,CAAC,CAAC,EAAE,aAAa,CAAC,CAAC,CAAC,CAAC,GAC5D,qBAAqB,CAExB"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import type { EventRecord } from '@authup/core-kit';
|
|
2
|
-
import type { EventFullName, EventNameSuffix } from '@authup/kit';
|
|
2
|
+
import type { EventFullName, EventNameSuffix, STCEventContext } from '@authup/core-realtime-kit';
|
|
3
3
|
import type { MaybeRef } from 'vue';
|
|
4
|
-
import type { STCEventContext } from '@authup/core-realtime-kit';
|
|
5
4
|
import type { EntityID } from '../record';
|
|
6
5
|
export type ResourceSocketManagerCreateContext<TYPE extends string, RECORD extends Record<string, any>> = {
|
|
7
6
|
type: TYPE;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../../../src/core/resource/socket/type.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"type.d.ts","sourceRoot":"","sources":["../../../../src/core/resource/socket/type.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpD,OAAO,KAAK,EAAE,aAAa,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjG,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAE1C,MAAM,MAAM,kCAAkC,CAC1C,IAAI,SAAS,MAAM,EACnB,MAAM,SAAS,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,IAClC;IACA,IAAI,EAAE,IAAI,CAAC;IACX,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,GAAG,SAAS,CAAC,CAAC;IACvC,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,QAAQ,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC;IAClD,MAAM,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,GAAG,SAAS,CAAC,CAAC;IAChD,SAAS,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC;IAChC,SAAS,CAAC,CAAC,MAAM,EAAE,OAAO,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC;IACzC,SAAS,CAAC,CAAC,MAAM,EAAE,MAAM,GAAG,GAAG,CAAC;IAChC,YAAY,CAAC,CAAC,KAAK,EAAE,eAAe,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,EAAE,OAAO,CAAC,EAAE,MAAM,GAAI,OAAO,CAAC;IAC7F,gBAAgB,CAAC,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAI,MAAM,CAAC;IACxD,uBAAuB,CAAC,IAAI,aAAa,CAAC,IAAI,EAAE,GAAG,eAAe,CAAC,SAAS,EAAE,CAAC,CAAC;IAChF,yBAAyB,CAAC,IAAI,aAAa,CAAC,IAAI,EAAE,GAAG,eAAe,CAAC,WAAW,EAAE,CAAC,CAAC;CACvF,CAAC;AAEF,MAAM,MAAM,qBAAqB,GAAG;IAChC,KAAK,IAAK,IAAI,CAAC;IACf,OAAO,IAAK,IAAI,CAAC;CACpB,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { PermissionChecker } from '@authup/
|
|
2
|
-
import type { OAuth2TokenGrantResponse } from '@authup/
|
|
1
|
+
import { PermissionChecker } from '@authup/access';
|
|
2
|
+
import type { OAuth2TokenGrantResponse } from '@authup/specs';
|
|
3
3
|
import type { Realm, User } from '@authup/core-kit';
|
|
4
4
|
import type { StoreCreateContext, StoreLoginContext } from './types';
|
|
5
5
|
type InputFn = (...args: any[]) => Promise<any>;
|
|
@@ -89,7 +89,7 @@ export declare function createStore(context: StoreCreateContext): {
|
|
|
89
89
|
updated_at: string;
|
|
90
90
|
};
|
|
91
91
|
user_id: User["id"] | null;
|
|
92
|
-
user: any;
|
|
92
|
+
user: /*elided*/ any;
|
|
93
93
|
};
|
|
94
94
|
realm_id: Realm["id"];
|
|
95
95
|
realm: {
|
|
@@ -149,7 +149,7 @@ export declare function createStore(context: StoreCreateContext): {
|
|
|
149
149
|
updated_at: string;
|
|
150
150
|
};
|
|
151
151
|
user_id: User["id"] | null;
|
|
152
|
-
user: any;
|
|
152
|
+
user: /*elided*/ any;
|
|
153
153
|
};
|
|
154
154
|
realm_id: Realm["id"];
|
|
155
155
|
realm: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/core/store/create.ts"],"names":[],"mappings":"AAOA,OAAO,EACH,iBAAiB,
|
|
1
|
+
{"version":3,"file":"create.d.ts","sourceRoot":"","sources":["../../../src/core/store/create.ts"],"names":[],"mappings":"AAOA,OAAO,EACH,iBAAiB,EAGpB,MAAM,gBAAgB,CAAC;AAKxB,OAAO,KAAK,EACR,wBAAwB,EAE3B,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EACR,KAAK,EACL,IAAI,EACP,MAAM,kBAAkB,CAAC;AAM1B,OAAO,KAAK,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,MAAM,SAAS,CAAC;AAErE,KAAK,OAAO,GAAG,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,OAAO,CAAC,GAAG,CAAC,CAAC;AAChD,KAAK,QAAQ,CAAC,CAAC,SAAS,OAAO,IAAI,CAAC,GAAG,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AA8B/F,KAAK,YAAY,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,GAAG,MAAM,CAAC,CAAC;AAE/C,wBAAgB,WAAW,CAAC,OAAO,EAAE,kBAAkB;;4BAMpB,OAAO;;iBAiRZ,iBAAiB;;;4BArCR,OAAO,CAAC,IAAI,CAAC;wCA1ClC,wBAAwB;;4BA3LP,MAAM,GAAG,IAAI;;sCAYH,IAAI,GAAG,MAAM,GAAG,MAAM,GAAG,IAAI;;6BAgBtC,MAAM,GAAG,IAAI;;;;;;;;;;;sBAiCpB,YAAY,GAAG,IAAI;;;;;;;;;;gCAUT,YAAY,GAAG,IAAI;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBA7B9B,IAAI,GAAG,IAAI;EA2RtC"}
|
package/dist/index.cjs
CHANGED
|
@@ -6,8 +6,10 @@ var coreKit = require('@authup/core-kit');
|
|
|
6
6
|
var vue = require('vue');
|
|
7
7
|
var coreHttpKit = require('@authup/core-http-kit');
|
|
8
8
|
var pinia = require('pinia');
|
|
9
|
-
var
|
|
9
|
+
var access = require('@authup/access');
|
|
10
|
+
var specs = require('@authup/specs');
|
|
10
11
|
var smob = require('smob');
|
|
12
|
+
var kit = require('@authup/kit');
|
|
11
13
|
var listControls = require('@vuecs/list-controls');
|
|
12
14
|
var coreRealtimeKit = require('@authup/core-realtime-kit');
|
|
13
15
|
var rapiq = require('rapiq');
|
|
@@ -65,35 +67,6 @@ function injectHTTPClient(app) {
|
|
|
65
67
|
* view the LICENSE file that was distributed with this source code.
|
|
66
68
|
*/ const STORE_ID = 'authup';
|
|
67
69
|
|
|
68
|
-
class PermissionBindingPolicyEvaluator {
|
|
69
|
-
async can(ctx) {
|
|
70
|
-
return ctx.spec.type === kit.BuiltInPolicyType.PERMISSION_BINDING;
|
|
71
|
-
}
|
|
72
|
-
async validateSpecification(ctx) {
|
|
73
|
-
return this.validator.run(ctx.spec);
|
|
74
|
-
}
|
|
75
|
-
async validateData(ctx) {
|
|
76
|
-
if (!smob.isObject(ctx.data.identity) && !smob.isObject(ctx.data.permission)) {
|
|
77
|
-
throw kit.PolicyError.evaluatorContextInvalid();
|
|
78
|
-
}
|
|
79
|
-
return ctx.data;
|
|
80
|
-
}
|
|
81
|
-
async evaluate(ctx) {
|
|
82
|
-
// todo: this must be changed when the permission-checker not only checks owned permissions.
|
|
83
|
-
return kit.maybeInvertPolicyOutcome(true, ctx.spec.invert);
|
|
84
|
-
}
|
|
85
|
-
constructor(){
|
|
86
|
-
this.validator = new kit.PermissionBindingPolicyValidator();
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
class PolicyEngine extends kit.PolicyEngine {
|
|
91
|
-
constructor(){
|
|
92
|
-
super();
|
|
93
|
-
this.registerEvaluator(kit.BuiltInPolicyType.PERMISSION_BINDING, new PermissionBindingPolicyEvaluator());
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
|
|
97
70
|
/*
|
|
98
71
|
* Copyright (c) 2024.
|
|
99
72
|
* Author Peter Placzek (tada5hi)
|
|
@@ -255,10 +228,10 @@ function createStore(context) {
|
|
|
255
228
|
context.dispatcher.emit(StoreDispatcherEventName.REALM_MANAGEMENT_UPDATED, input);
|
|
256
229
|
};
|
|
257
230
|
// --------------------------------------------------------------------
|
|
258
|
-
const permissionRepository = new
|
|
259
|
-
const permissionChecker = new
|
|
231
|
+
const permissionRepository = new access.PermissionMemoryProvider();
|
|
232
|
+
const permissionChecker = new access.PermissionChecker({
|
|
260
233
|
provider: permissionRepository,
|
|
261
|
-
policyEngine: new PolicyEngine()
|
|
234
|
+
policyEngine: new access.PolicyEngine()
|
|
262
235
|
});
|
|
263
236
|
// --------------------------------------------------------------------
|
|
264
237
|
const cleanup = async ()=>{
|
|
@@ -350,7 +323,7 @@ function createStore(context) {
|
|
|
350
323
|
// --------------------------------------------------------------------
|
|
351
324
|
const refreshSession = createPromiseShareWrapperFn(async ()=>{
|
|
352
325
|
if (!refreshToken.value) {
|
|
353
|
-
throw new
|
|
326
|
+
throw new specs.TokenError('The access token can not be renewed.');
|
|
354
327
|
}
|
|
355
328
|
try {
|
|
356
329
|
const response = await client.token.createWithRefreshToken({
|
|
@@ -394,7 +367,7 @@ function createStore(context) {
|
|
|
394
367
|
const loggedIn = vue.computed(()=>!!accessToken.value);
|
|
395
368
|
const login = async (ctx)=>{
|
|
396
369
|
context.dispatcher.emit(StoreDispatcherEventName.LOGGING_IN);
|
|
397
|
-
const response = await client.token.
|
|
370
|
+
const response = await client.token.createWithPassword({
|
|
398
371
|
username: ctx.name,
|
|
399
372
|
password: ctx.password,
|
|
400
373
|
...realmId.value ? {
|
|
@@ -1035,17 +1008,17 @@ function create$2(ctx) {
|
|
|
1035
1008
|
if (ctx.buildSubscribeEventName) {
|
|
1036
1009
|
event = ctx.buildSubscribeEventName();
|
|
1037
1010
|
} else {
|
|
1038
|
-
event =
|
|
1011
|
+
event = coreRealtimeKit.buildEventFullName(ctx.type, coreRealtimeKit.EventNameSuffix.SUBSCRIBE);
|
|
1039
1012
|
}
|
|
1040
1013
|
socket.emit(event, targetId.value);
|
|
1041
1014
|
if (ctx.onCreated) {
|
|
1042
|
-
socket.on(
|
|
1015
|
+
socket.on(coreRealtimeKit.buildEventFullName(ctx.type, coreKit.DomainEventName.CREATED), handleCreated);
|
|
1043
1016
|
}
|
|
1044
1017
|
if (ctx.onUpdated) {
|
|
1045
|
-
socket.on(
|
|
1018
|
+
socket.on(coreRealtimeKit.buildEventFullName(ctx.type, coreKit.DomainEventName.UPDATED), handleUpdated);
|
|
1046
1019
|
}
|
|
1047
1020
|
if (ctx.onDeleted) {
|
|
1048
|
-
socket.on(
|
|
1021
|
+
socket.on(coreRealtimeKit.buildEventFullName(ctx.type, coreKit.DomainEventName.DELETED), handleDeleted);
|
|
1049
1022
|
}
|
|
1050
1023
|
};
|
|
1051
1024
|
const unmount = async ()=>{
|
|
@@ -1058,17 +1031,17 @@ function create$2(ctx) {
|
|
|
1058
1031
|
if (ctx.buildUnsubscribeEventName) {
|
|
1059
1032
|
event = ctx.buildUnsubscribeEventName();
|
|
1060
1033
|
} else {
|
|
1061
|
-
event =
|
|
1034
|
+
event = coreRealtimeKit.buildEventFullName(ctx.type, coreRealtimeKit.EventNameSuffix.UNSUBSCRIBE);
|
|
1062
1035
|
}
|
|
1063
1036
|
socket.emit(event, targetId.value);
|
|
1064
1037
|
if (ctx.onCreated) {
|
|
1065
|
-
socket.off(
|
|
1038
|
+
socket.off(coreRealtimeKit.buildEventFullName(ctx.type, coreKit.DomainEventName.UPDATED), handleCreated);
|
|
1066
1039
|
}
|
|
1067
1040
|
if (ctx.onUpdated) {
|
|
1068
|
-
socket.off(
|
|
1041
|
+
socket.off(coreRealtimeKit.buildEventFullName(ctx.type, coreKit.DomainEventName.UPDATED), handleUpdated);
|
|
1069
1042
|
}
|
|
1070
1043
|
if (ctx.onDeleted) {
|
|
1071
|
-
socket.off(
|
|
1044
|
+
socket.off(coreRealtimeKit.buildEventFullName(ctx.type, coreKit.DomainEventName.DELETED), handleDeleted);
|
|
1072
1045
|
}
|
|
1073
1046
|
};
|
|
1074
1047
|
vue.onMounted(()=>mount());
|
|
@@ -1918,7 +1891,7 @@ function computedAsync(evaluationCallback, initialState, optionsOrRef) {
|
|
|
1918
1891
|
} else {
|
|
1919
1892
|
options = {};
|
|
1920
1893
|
}
|
|
1921
|
-
const { lazy = false, evaluating =
|
|
1894
|
+
const { lazy = false, evaluating = undefined, shallow = true, onError = noop } = options;
|
|
1922
1895
|
const started = vue.ref(!lazy);
|
|
1923
1896
|
const current = shallow ? vue.shallowRef(initialState) : vue.ref(initialState);
|
|
1924
1897
|
let counter = 0;
|
|
@@ -4464,7 +4437,7 @@ const AIdentityProviderOAuth2Discovery = vue.defineComponent({
|
|
|
4464
4437
|
}
|
|
4465
4438
|
try {
|
|
4466
4439
|
const response = await apiClient.get(form.url);
|
|
4467
|
-
if (
|
|
4440
|
+
if (specs.isOpenIDProviderMetadata(response.data)) {
|
|
4468
4441
|
setup.emit('lookup', response.data);
|
|
4469
4442
|
lookupValid.value = true;
|
|
4470
4443
|
}
|