@pnp/queryable 3.9.0 → 3.10.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/behaviors/caching-pessimistic.d.ts +3 -2
- package/behaviors/caching-pessimistic.d.ts.map +1 -1
- package/behaviors/caching-pessimistic.js +30 -169
- package/behaviors/caching-pessimistic.js.map +1 -1
- package/behaviors/caching.d.ts +22 -0
- package/behaviors/caching.d.ts.map +1 -1
- package/behaviors/caching.js +56 -15
- package/behaviors/caching.js.map +1 -1
- package/package.json +2 -2
- package/queryable.d.ts.map +1 -1
- package/queryable.js +5 -3
- package/queryable.js.map +1 -1
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { TimelinePipe } from "@pnp/core";
|
|
2
|
+
import { ICachingProps } from "./caching.js";
|
|
2
3
|
/**
|
|
3
4
|
* Pessimistic Caching Behavior
|
|
4
5
|
* Always returns the cached value if one exists but asynchronously executes the call and updates the cache.
|
|
@@ -8,5 +9,5 @@ import { Queryable } from "../queryable.js";
|
|
|
8
9
|
* @param keyFactory: a function that returns the key for the cache value, if not provided a default hash of the url will be used
|
|
9
10
|
* @param expireFunc: a function that returns a date of expiration for the cache value, if not provided the cache never expires but is always updated.
|
|
10
11
|
*/
|
|
11
|
-
export declare function CachingPessimisticRefresh(
|
|
12
|
+
export declare function CachingPessimisticRefresh(props?: ICachingProps): TimelinePipe;
|
|
12
13
|
//# sourceMappingURL=caching-pessimistic.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"caching-pessimistic.d.ts","sourceRoot":"","sources":["../../../../packages/queryable/behaviors/caching-pessimistic.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"caching-pessimistic.d.ts","sourceRoot":"","sources":["../../../../packages/queryable/behaviors/caching-pessimistic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAmC,YAAY,EAAE,MAAM,WAAW,CAAC;AAE1E,OAAO,EAAmB,aAAa,EAAE,MAAM,cAAc,CAAC;AAE9D;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,YAAY,CAqD7E"}
|
|
@@ -1,4 +1,6 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { noInherit, objectDefinedNotNull } from "@pnp/core";
|
|
2
|
+
import { Queryable } from "../queryable.js";
|
|
3
|
+
import { bindCachingCore } from "./caching.js";
|
|
2
4
|
/**
|
|
3
5
|
* Pessimistic Caching Behavior
|
|
4
6
|
* Always returns the cached value if one exists but asynchronously executes the call and updates the cache.
|
|
@@ -8,181 +10,40 @@ import { isFunc, getHashCode, PnPClientStorage, getGUID, extend } from "@pnp/cor
|
|
|
8
10
|
* @param keyFactory: a function that returns the key for the cache value, if not provided a default hash of the url will be used
|
|
9
11
|
* @param expireFunc: a function that returns a date of expiration for the cache value, if not provided the cache never expires but is always updated.
|
|
10
12
|
*/
|
|
11
|
-
export function CachingPessimisticRefresh(
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
store = (typeof localStorage === "undefined") ? new MemoryStorage() : localStorage;
|
|
18
|
-
}
|
|
19
|
-
if (!isFunc(keyFactory)) {
|
|
20
|
-
keyFactory = (url) => getHashCode(url.toLowerCase()).toString();
|
|
21
|
-
}
|
|
22
|
-
const putStorage = (key, o) => {
|
|
23
|
-
try {
|
|
24
|
-
if (isFunc(expireFunc)) {
|
|
25
|
-
const storage = new PnPClientStorage();
|
|
26
|
-
const s = type === "session" ? storage.session : storage.local;
|
|
27
|
-
s.put(key, o, expireFunc());
|
|
13
|
+
export function CachingPessimisticRefresh(props) {
|
|
14
|
+
return (instance) => {
|
|
15
|
+
const pre = async function (url, init, result) {
|
|
16
|
+
const [shouldCache, getCachedValue, setCachedValue] = bindCachingCore(url, init, props);
|
|
17
|
+
if (!shouldCache) {
|
|
18
|
+
return [url, init, result];
|
|
28
19
|
}
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const s = type === "session" ? storage.session : storage.local;
|
|
44
|
-
retVal = s.get(key);
|
|
20
|
+
const cached = getCachedValue();
|
|
21
|
+
if (objectDefinedNotNull(cached)) {
|
|
22
|
+
// set our result
|
|
23
|
+
result = cached;
|
|
24
|
+
setTimeout(async () => {
|
|
25
|
+
const q = new Queryable(this);
|
|
26
|
+
const a = q.on.pre.toArray();
|
|
27
|
+
q.on.pre.clear();
|
|
28
|
+
// filter out this pre handler from the original queryable as we don't want to re-run it
|
|
29
|
+
a.filter(v => v !== pre).map(v => q.on.pre(v));
|
|
30
|
+
// in this case the init should contain the correct "method"
|
|
31
|
+
const value = await q(init);
|
|
32
|
+
setCachedValue(value);
|
|
33
|
+
}, 0);
|
|
45
34
|
}
|
|
46
35
|
else {
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
catch (err) {
|
|
54
|
-
console.log(`CachingPessimistic(getStorage): ${err}.`);
|
|
55
|
-
}
|
|
56
|
-
return retVal;
|
|
57
|
-
};
|
|
58
|
-
let refreshCache = true;
|
|
59
|
-
return (instance) => {
|
|
60
|
-
instance.on.init(function () {
|
|
61
|
-
const newExecute = extend(this, {
|
|
62
|
-
async execute(userInit = { method: "GET", headers: {} }) {
|
|
63
|
-
setTimeout(async () => {
|
|
64
|
-
const requestId = getGUID();
|
|
65
|
-
const emitError = (e) => {
|
|
66
|
-
this.log(`[id:${requestId}] Emitting error: "${e.message || e}"`, 3);
|
|
67
|
-
this.emit.error(e);
|
|
68
|
-
this.log(`[id:${requestId}] Emitted error: "${e.message || e}"`, 3);
|
|
69
|
-
};
|
|
70
|
-
try {
|
|
71
|
-
let retVal = undefined;
|
|
72
|
-
const emitSend = async () => {
|
|
73
|
-
this.log(`[id:${requestId}] Emitting auth`, 0);
|
|
74
|
-
[requestUrl, init] = await this.emit.auth(requestUrl, init);
|
|
75
|
-
this.log(`[id:${requestId}] Emitted auth`, 0);
|
|
76
|
-
// we always resepect user supplied init over observer modified init
|
|
77
|
-
init = { ...init, ...userInit, headers: { ...init.headers, ...userInit.headers } };
|
|
78
|
-
this.log(`[id:${requestId}] Emitting send`, 0);
|
|
79
|
-
let response = await this.emit.send(requestUrl, init);
|
|
80
|
-
this.log(`[id:${requestId}] Emitted send`, 0);
|
|
81
|
-
this.log(`[id:${requestId}] Emitting parse`, 0);
|
|
82
|
-
[requestUrl, response, result] = await this.emit.parse(requestUrl, response, result);
|
|
83
|
-
this.log(`[id:${requestId}] Emitted parse`, 0);
|
|
84
|
-
this.log(`[id:${requestId}] Emitting post`, 0);
|
|
85
|
-
[requestUrl, result] = await this.emit.post(requestUrl, result);
|
|
86
|
-
this.log(`[id:${requestId}] Emitted post`, 0);
|
|
87
|
-
return result;
|
|
88
|
-
};
|
|
89
|
-
const emitData = () => {
|
|
90
|
-
this.log(`[id:${requestId}] Emitting data`, 0);
|
|
91
|
-
this.emit.data(retVal);
|
|
92
|
-
this.log(`[id:${requestId}] Emitted data`, 0);
|
|
93
|
-
};
|
|
94
|
-
this.log(`[id:${requestId}] Beginning request`, 1);
|
|
95
|
-
let [requestUrl, init, result] = await this.emit.pre(this.toRequestUrl(), {}, undefined);
|
|
96
|
-
this.log(`[id:${requestId}] Url: ${requestUrl}`, 1);
|
|
97
|
-
if (typeof result !== "undefined") {
|
|
98
|
-
retVal = result;
|
|
99
|
-
}
|
|
100
|
-
// Waiting is false by default, result is undefined by default, unless cached value is returned
|
|
101
|
-
if (retVal !== undefined) {
|
|
102
|
-
if (refreshCache) {
|
|
103
|
-
// Return value exists -> assume lazy cache update pipeline execution.
|
|
104
|
-
setTimeout(async () => {
|
|
105
|
-
try {
|
|
106
|
-
await emitSend();
|
|
107
|
-
}
|
|
108
|
-
catch (e) {
|
|
109
|
-
emitError(e);
|
|
110
|
-
}
|
|
111
|
-
}, 0);
|
|
112
|
-
}
|
|
113
|
-
this.log(`[id:${requestId}] Returning cached results and updating cache async`, 1);
|
|
114
|
-
emitData();
|
|
115
|
-
}
|
|
116
|
-
else {
|
|
117
|
-
retVal = await emitSend();
|
|
118
|
-
this.log(`[id:${requestId}] Returning results`, 1);
|
|
119
|
-
emitData();
|
|
120
|
-
}
|
|
121
|
-
}
|
|
122
|
-
catch (e) {
|
|
123
|
-
emitError(e);
|
|
124
|
-
}
|
|
125
|
-
finally {
|
|
126
|
-
this.log(`[id:${requestId}] Finished request`, 1);
|
|
127
|
-
}
|
|
128
|
-
}, 0);
|
|
129
|
-
return new Promise((resolve, reject) => {
|
|
130
|
-
this.on[this.InternalResolveEvent].replace(resolve);
|
|
131
|
-
this.on[this.InternalRejectEvent].replace(reject);
|
|
132
|
-
});
|
|
133
|
-
},
|
|
134
|
-
});
|
|
135
|
-
return newExecute;
|
|
136
|
-
});
|
|
137
|
-
instance.on.pre(async function (url, init, result) {
|
|
138
|
-
// Reset refreshCache
|
|
139
|
-
refreshCache = true;
|
|
140
|
-
// eslint-disable-next-line @typescript-eslint/no-non-null-assertion
|
|
141
|
-
const key = keyFactory(url.toString());
|
|
142
|
-
const cached = getStorage(key);
|
|
143
|
-
if (cached !== undefined) {
|
|
144
|
-
// Return value
|
|
145
|
-
result = cached.value;
|
|
146
|
-
if (cached.expiration !== undefined) {
|
|
147
|
-
if (new Date(cached.expiration) > new Date()) {
|
|
148
|
-
refreshCache = false;
|
|
149
|
-
}
|
|
150
|
-
}
|
|
151
|
-
}
|
|
152
|
-
// in these instances make sure we update cache after retrieving result
|
|
153
|
-
if (refreshCache) {
|
|
154
|
-
// if we don't have a cached result we need to get it after the request is sent and parsed
|
|
155
|
-
this.on.post(async function (url, result) {
|
|
156
|
-
putStorage(key, result);
|
|
36
|
+
// register the post handler to cache the value as there is not one already in the cache
|
|
37
|
+
// and we need to run this request as normal
|
|
38
|
+
this.on.post(noInherit(async function (url, result) {
|
|
39
|
+
setCachedValue(result);
|
|
157
40
|
return [url, result];
|
|
158
|
-
});
|
|
41
|
+
}));
|
|
159
42
|
}
|
|
160
43
|
return [url, init, result];
|
|
161
|
-
}
|
|
44
|
+
};
|
|
45
|
+
instance.on.pre(pre);
|
|
162
46
|
return instance;
|
|
163
47
|
};
|
|
164
48
|
}
|
|
165
|
-
class MemoryStorage {
|
|
166
|
-
constructor(_store = new Map()) {
|
|
167
|
-
this._store = _store;
|
|
168
|
-
}
|
|
169
|
-
get length() {
|
|
170
|
-
return this._store.size;
|
|
171
|
-
}
|
|
172
|
-
clear() {
|
|
173
|
-
this._store.clear();
|
|
174
|
-
}
|
|
175
|
-
getItem(key) {
|
|
176
|
-
return this._store.get(key);
|
|
177
|
-
}
|
|
178
|
-
key(index) {
|
|
179
|
-
return Array.from(this._store)[index][0];
|
|
180
|
-
}
|
|
181
|
-
removeItem(key) {
|
|
182
|
-
this._store.delete(key);
|
|
183
|
-
}
|
|
184
|
-
setItem(key, data) {
|
|
185
|
-
this._store.set(key, data);
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
49
|
//# sourceMappingURL=caching-pessimistic.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"caching-pessimistic.js","sourceRoot":"","sources":["../../../../packages/queryable/behaviors/caching-pessimistic.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"caching-pessimistic.js","sourceRoot":"","sources":["../../../../packages/queryable/behaviors/caching-pessimistic.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,oBAAoB,EAAgB,MAAM,WAAW,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAiB,MAAM,cAAc,CAAC;AAE9D;;;;;;;;GAQG;AACH,MAAM,UAAU,yBAAyB,CAAC,KAAqB;IAE3D,OAAO,CAAC,QAAmB,EAAE,EAAE;QAE3B,MAAM,GAAG,GAAG,KAAK,WAA4B,GAAW,EAAE,IAAiB,EAAE,MAAW;YAEpF,MAAM,CAAC,WAAW,EAAE,cAAc,EAAE,cAAc,CAAC,GAAG,eAAe,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;YAExF,IAAI,CAAC,WAAW,EAAE;gBACd,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;aAC9B;YAED,MAAM,MAAM,GAAG,cAAc,EAAE,CAAC;YAEhC,IAAI,oBAAoB,CAAC,MAAM,CAAC,EAAE;gBAE9B,iBAAiB;gBACjB,MAAM,GAAG,MAAM,CAAC;gBAEhB,UAAU,CAAC,KAAK,IAAI,EAAE;oBAElB,MAAM,CAAC,GAAG,IAAI,SAAS,CAAC,IAAI,CAAC,CAAC;oBAC9B,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,OAAO,EAAE,CAAC;oBAC7B,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;oBACjB,wFAAwF;oBACxF,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;oBAE/C,4DAA4D;oBAC5D,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC;oBAE5B,cAAc,CAAC,KAAK,CAAC,CAAC;gBAE1B,CAAC,EAAE,CAAC,CAAC,CAAC;aAET;iBAAM;gBAEH,wFAAwF;gBACxF,4CAA4C;gBAC5C,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,WAAW,GAAQ,EAAE,MAAW;oBAExD,cAAc,CAAC,MAAM,CAAC,CAAC;oBAEvB,OAAO,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;gBACzB,CAAC,CAAC,CAAC,CAAC;aACP;YAED,OAAO,CAAC,GAAG,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC;QAC/B,CAAC,CAAC;QAEF,QAAQ,CAAC,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAErB,OAAO,QAAQ,CAAC;IACpB,CAAC,CAAC;AACN,CAAC"}
|
package/behaviors/caching.d.ts
CHANGED
|
@@ -13,11 +13,33 @@ export interface ICachingProps {
|
|
|
13
13
|
* @returns TimelinePipe
|
|
14
14
|
*/
|
|
15
15
|
export declare function CacheAlways(): (instance: Queryable) => Queryable<any>;
|
|
16
|
+
/**
|
|
17
|
+
* Behavior that blocks caching for the request regardless of "method"
|
|
18
|
+
*
|
|
19
|
+
* Note: If both Caching and CacheAlways are present AND CacheNever is present the request will not be cached
|
|
20
|
+
* as we give priority to the CacheNever case
|
|
21
|
+
*
|
|
22
|
+
* @returns TimelinePipe
|
|
23
|
+
*/
|
|
24
|
+
export declare function CacheNever(): (instance: Queryable) => Queryable<any>;
|
|
16
25
|
/**
|
|
17
26
|
* Behavior that allows you to specify a cache key for a request
|
|
18
27
|
*
|
|
19
28
|
* @param key The key to use for caching
|
|
20
29
|
*/
|
|
21
30
|
export declare function CacheKey(key: string): (instance: Queryable) => Queryable<any>;
|
|
31
|
+
/**
|
|
32
|
+
* Adds caching to the requests based on the supplied props
|
|
33
|
+
*
|
|
34
|
+
* @param props Optional props that configure how caching will work
|
|
35
|
+
* @returns TimelinePipe used to configure requests
|
|
36
|
+
*/
|
|
22
37
|
export declare function Caching(props?: ICachingProps): TimelinePipe<Queryable>;
|
|
38
|
+
/**
|
|
39
|
+
* Based on the supplied properties, creates bound logic encapsulating common caching configuration
|
|
40
|
+
* sharable across implementations to more easily provide consistent behavior across behaviors
|
|
41
|
+
*
|
|
42
|
+
* @param props Any caching props used to initialize the core functions
|
|
43
|
+
*/
|
|
44
|
+
export declare function bindCachingCore(url: string, init: RequestInit, props?: Partial<ICachingProps>): [boolean, () => any, (any: any) => void];
|
|
23
45
|
//# sourceMappingURL=caching.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"caching.d.ts","sourceRoot":"","sources":["../../../../packages/queryable/behaviors/caching.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAA0C,YAAY,
|
|
1
|
+
{"version":3,"file":"caching.d.ts","sourceRoot":"","sources":["../../../../packages/queryable/behaviors/caching.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AAC5C,OAAO,EAA0C,YAAY,EAAa,MAAM,WAAW,CAAC;AAE5F,oBAAY,eAAe,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,MAAM,CAAC;AACtD,oBAAY,eAAe,GAAG,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,CAAC;AAEpD,MAAM,WAAW,aAAa;IAC1B,KAAK,CAAC,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,UAAU,CAAC,EAAE,eAAe,CAAC;IAC7B,UAAU,CAAC,EAAE,eAAe,CAAC;CAChC;AAED;;;;GAIG;AACH,wBAAgB,WAAW,eAEL,SAAS,oBAW9B;AAGD;;;;;;;GAOG;AACH,wBAAgB,UAAU,eAEJ,SAAS,oBAW9B;AAED;;;;IAII;AACJ,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,cAEd,SAAS,oBAW9B;AAED;;;;;GAKG;AACH,wBAAgB,OAAO,CAAC,KAAK,CAAC,EAAE,aAAa,GAAG,YAAY,CAAC,SAAS,CAAC,CAmCtE;AAID;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,OAAO,CAAC,aAAa,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,EAAE,CAAC,GAAG,KAAA,KAAK,IAAI,CAAC,CAqBnI"}
|
package/behaviors/caching.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { getHashCode, PnPClientStorage, dateAdd } from "@pnp/core";
|
|
1
|
+
import { getHashCode, PnPClientStorage, dateAdd, noInherit } from "@pnp/core";
|
|
2
2
|
/**
|
|
3
3
|
* Behavior that forces caching for the request regardless of "method"
|
|
4
4
|
*
|
|
@@ -13,6 +13,23 @@ export function CacheAlways() {
|
|
|
13
13
|
return instance;
|
|
14
14
|
};
|
|
15
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Behavior that blocks caching for the request regardless of "method"
|
|
18
|
+
*
|
|
19
|
+
* Note: If both Caching and CacheAlways are present AND CacheNever is present the request will not be cached
|
|
20
|
+
* as we give priority to the CacheNever case
|
|
21
|
+
*
|
|
22
|
+
* @returns TimelinePipe
|
|
23
|
+
*/
|
|
24
|
+
export function CacheNever() {
|
|
25
|
+
return (instance) => {
|
|
26
|
+
instance.on.pre.prepend(async function (url, init, result) {
|
|
27
|
+
init.headers = { ...init.headers, "X-PnP-CacheNever": "1" };
|
|
28
|
+
return [url, init, result];
|
|
29
|
+
});
|
|
30
|
+
return instance;
|
|
31
|
+
};
|
|
32
|
+
}
|
|
16
33
|
/**
|
|
17
34
|
* Behavior that allows you to specify a cache key for a request
|
|
18
35
|
*
|
|
@@ -27,28 +44,26 @@ export function CacheKey(key) {
|
|
|
27
44
|
return instance;
|
|
28
45
|
};
|
|
29
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* Adds caching to the requests based on the supplied props
|
|
49
|
+
*
|
|
50
|
+
* @param props Optional props that configure how caching will work
|
|
51
|
+
* @returns TimelinePipe used to configure requests
|
|
52
|
+
*/
|
|
30
53
|
export function Caching(props) {
|
|
31
|
-
const storage = new PnPClientStorage();
|
|
32
|
-
const { store, keyFactory, expireFunc } = {
|
|
33
|
-
store: "local",
|
|
34
|
-
keyFactory: (url) => getHashCode(url.toLowerCase()).toString(),
|
|
35
|
-
expireFunc: () => dateAdd(new Date(), "minute", 5),
|
|
36
|
-
...props,
|
|
37
|
-
};
|
|
38
|
-
const s = store === "session" ? storage.session : storage.local;
|
|
39
54
|
return (instance) => {
|
|
40
55
|
instance.on.pre(async function (url, init, result) {
|
|
56
|
+
const [shouldCache, getCachedValue, setCachedValue] = bindCachingCore(url, init, props);
|
|
41
57
|
// only cache get requested data or where the CacheAlways header is present (allows caching of POST requests)
|
|
42
|
-
if (
|
|
43
|
-
const
|
|
44
|
-
const cached = s.get(key);
|
|
58
|
+
if (shouldCache) {
|
|
59
|
+
const cached = getCachedValue();
|
|
45
60
|
// we need to ensure that result stays "undefined" unless we mean to set null as the result
|
|
46
61
|
if (cached === null) {
|
|
47
62
|
// if we don't have a cached result we need to get it after the request is sent and parsed
|
|
48
|
-
this.on.post(async function (url, result) {
|
|
49
|
-
|
|
63
|
+
this.on.post(noInherit(async function (url, result) {
|
|
64
|
+
setCachedValue(result);
|
|
50
65
|
return [url, result];
|
|
51
|
-
});
|
|
66
|
+
}));
|
|
52
67
|
}
|
|
53
68
|
else {
|
|
54
69
|
result = cached;
|
|
@@ -59,4 +74,30 @@ export function Caching(props) {
|
|
|
59
74
|
return instance;
|
|
60
75
|
};
|
|
61
76
|
}
|
|
77
|
+
const storage = new PnPClientStorage();
|
|
78
|
+
/**
|
|
79
|
+
* Based on the supplied properties, creates bound logic encapsulating common caching configuration
|
|
80
|
+
* sharable across implementations to more easily provide consistent behavior across behaviors
|
|
81
|
+
*
|
|
82
|
+
* @param props Any caching props used to initialize the core functions
|
|
83
|
+
*/
|
|
84
|
+
export function bindCachingCore(url, init, props) {
|
|
85
|
+
var _a, _b;
|
|
86
|
+
const { store, keyFactory, expireFunc } = {
|
|
87
|
+
store: "local",
|
|
88
|
+
keyFactory: (url) => getHashCode(url.toLowerCase()).toString(),
|
|
89
|
+
expireFunc: () => dateAdd(new Date(), "minute", 5),
|
|
90
|
+
...props,
|
|
91
|
+
};
|
|
92
|
+
const s = store === "session" ? storage.session : storage.local;
|
|
93
|
+
const key = (init === null || init === void 0 ? void 0 : init.headers["X-PnP-CacheKey"]) ? init.headers["X-PnP-CacheKey"] : keyFactory(url);
|
|
94
|
+
return [
|
|
95
|
+
// calculated value indicating if we should cache this request
|
|
96
|
+
(/get/i.test(init.method) || ((_a = init === null || init === void 0 ? void 0 : init.headers["X-PnP-CacheAlways"]) !== null && _a !== void 0 ? _a : false)) && !((_b = init === null || init === void 0 ? void 0 : init.headers["X-PnP-CacheNever"]) !== null && _b !== void 0 ? _b : false),
|
|
97
|
+
// gets the cached value
|
|
98
|
+
() => s.get(key),
|
|
99
|
+
// sets the cached value
|
|
100
|
+
(value) => s.put(key, value, expireFunc(url)),
|
|
101
|
+
];
|
|
102
|
+
}
|
|
62
103
|
//# sourceMappingURL=caching.js.map
|
package/behaviors/caching.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"caching.js","sourceRoot":"","sources":["../../../../packages/queryable/behaviors/caching.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,OAAO,EAAgB,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"caching.js","sourceRoot":"","sources":["../../../../packages/queryable/behaviors/caching.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pnp/queryable",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.10.0",
|
|
4
4
|
"description": "pnp - provides shared odata functionality and base classes",
|
|
5
5
|
"main": "./index.js",
|
|
6
6
|
"typings": "./index",
|
|
7
7
|
"dependencies": {
|
|
8
8
|
"tslib": "2.4.0",
|
|
9
|
-
"@pnp/core": "3.
|
|
9
|
+
"@pnp/core": "3.10.0"
|
|
10
10
|
},
|
|
11
11
|
"funding": {
|
|
12
12
|
"type": "individual",
|
package/queryable.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryable.d.ts","sourceRoot":"","sources":["../../../packages/queryable/queryable.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,QAAQ,EAAgE,YAAY,
|
|
1
|
+
{"version":3,"file":"queryable.d.ts","sourceRoot":"","sources":["../../../packages/queryable/queryable.ts"],"names":[],"mappings":"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"}
|
package/queryable.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { __decorate } from "tslib";
|
|
2
|
-
import { combine, getGUID, Timeline, asyncReduce, reduce, broadcast, request, extendable, isArray, lifecycle } from "@pnp/core";
|
|
2
|
+
import { combine, getGUID, Timeline, asyncReduce, reduce, broadcast, request, extendable, isArray, lifecycle, stringIsNullOrEmpty } from "@pnp/core";
|
|
3
3
|
import { invokable } from "./invokable.js";
|
|
4
4
|
const DefaultMoments = {
|
|
5
5
|
construct: lifecycle(),
|
|
@@ -60,8 +60,10 @@ let Queryable = class Queryable extends Timeline {
|
|
|
60
60
|
*/
|
|
61
61
|
toRequestUrl() {
|
|
62
62
|
let url = this.toUrl();
|
|
63
|
-
const
|
|
64
|
-
|
|
63
|
+
const query = this.query.toString();
|
|
64
|
+
if (!stringIsNullOrEmpty(query)) {
|
|
65
|
+
url += `${url.indexOf("?") > -1 ? "&" : "?"}${query}`;
|
|
66
|
+
}
|
|
65
67
|
return url;
|
|
66
68
|
}
|
|
67
69
|
/**
|
package/queryable.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"queryable.js","sourceRoot":"","sources":["../../../packages/queryable/queryable.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAgB,SAAS,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"queryable.js","sourceRoot":"","sources":["../../../packages/queryable/queryable.ts"],"names":[],"mappings":"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"}
|