@gooddata/sdk-backend-base 11.49.0-alpha.0 → 11.49.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/esm/cachingBackend/index.d.ts +59 -0
- package/esm/cachingBackend/index.d.ts.map +1 -1
- package/esm/cachingBackend/index.js +391 -22
- package/esm/decoratedBackend/analyticalWorkspace.d.ts.map +1 -1
- package/esm/decoratedBackend/analyticalWorkspace.js +4 -0
- package/esm/decoratedBackend/datasets.d.ts +16 -0
- package/esm/decoratedBackend/datasets.d.ts.map +1 -0
- package/esm/decoratedBackend/datasets.js +28 -0
- package/esm/decoratedBackend/types.d.ts +6 -1
- package/esm/decoratedBackend/types.d.ts.map +1 -1
- package/esm/index.d.ts +1 -1
- package/esm/index.d.ts.map +1 -1
- package/esm/sdk-backend-base.d.ts +66 -0
- package/package.json +7 -7
|
@@ -29,6 +29,10 @@ export type CacheControl = {
|
|
|
29
29
|
* Resets all workspace facts caches.
|
|
30
30
|
*/
|
|
31
31
|
resetFacts: () => void;
|
|
32
|
+
/**
|
|
33
|
+
* Resets all workspace dataset caches.
|
|
34
|
+
*/
|
|
35
|
+
resetDatasets: () => void;
|
|
32
36
|
/**
|
|
33
37
|
* Resets all workspace settings caches.
|
|
34
38
|
*/
|
|
@@ -285,6 +289,33 @@ export type CachingConfiguration = {
|
|
|
285
289
|
* tweak the `maxMeasuresWorkspaces` value.
|
|
286
290
|
*/
|
|
287
291
|
maxMeasuresPerWorkspace?: number;
|
|
292
|
+
/**
|
|
293
|
+
* Maximum number of workspaces for which to cache selected {@link @gooddata/sdk-backend-spi#IWorkspaceDatasetsService} calls.
|
|
294
|
+
* The workspace identifier is used as cache key.
|
|
295
|
+
* For each workspace, there will be a cache entry holding `maxDatasetsPerWorkspace` entries for dataset metadata reads.
|
|
296
|
+
*
|
|
297
|
+
* When limit is reached, cache entries will be evicted using LRU policy.
|
|
298
|
+
*
|
|
299
|
+
* When no maximum number is specified, the cache will be unbounded and no evictions will happen. Unbounded
|
|
300
|
+
* cache may be OK in applications where number of workspaces is small - the cache will be limited
|
|
301
|
+
* naturally and will not grow uncontrollably.
|
|
302
|
+
*
|
|
303
|
+
* When non-positive number is specified, then no caching will be done.
|
|
304
|
+
*/
|
|
305
|
+
maxDatasetWorkspaces?: number;
|
|
306
|
+
/**
|
|
307
|
+
* Maximum number of datasets to cache per workspace.
|
|
308
|
+
*
|
|
309
|
+
* When limit is reached, cache entries will be evicted using LRU policy.
|
|
310
|
+
*
|
|
311
|
+
* When no maximum number is specified, the cache will be unbounded and no evictions will happen. Unbounded
|
|
312
|
+
* dataset cache may be OK in applications where number of datasets is small and/or they are requested
|
|
313
|
+
* infrequently - the cache will be limited naturally and will not grow uncontrollably.
|
|
314
|
+
*
|
|
315
|
+
* Setting non-positive number here is invalid. If you want to turn off dataset caching,
|
|
316
|
+
* tweak the `maxDatasetWorkspaces` value.
|
|
317
|
+
*/
|
|
318
|
+
maxDatasetsPerWorkspace?: number;
|
|
288
319
|
/**
|
|
289
320
|
* Maximum number of organizations for which to cache organization-level export templates.
|
|
290
321
|
* Organization export templates are organization-level, so typically a single entry suffices.
|
|
@@ -330,6 +361,34 @@ export type CachingConfiguration = {
|
|
|
330
361
|
* tweak the `maxAttributeWorkspaces` value.
|
|
331
362
|
*/
|
|
332
363
|
maxAttributesPerWorkspace?: number;
|
|
364
|
+
/**
|
|
365
|
+
* Maximum number of common attribute results to cache per workspace.
|
|
366
|
+
*
|
|
367
|
+
* This bounds the cache used by `getCommonAttributes` and `getCommonAttributesBatch`, keyed by the
|
|
368
|
+
* (order-independent) set of input attribute references.
|
|
369
|
+
*
|
|
370
|
+
* When limit is reached, cache entries will be evicted using LRU policy.
|
|
371
|
+
*
|
|
372
|
+
* When no maximum number is specified, the cache will be unbounded and no evictions will happen.
|
|
373
|
+
*
|
|
374
|
+
* Setting non-positive number here is invalid. If you want to turn off common attribute caching,
|
|
375
|
+
* tweak the `maxAttributeWorkspaces` value.
|
|
376
|
+
*/
|
|
377
|
+
maxCommonAttributesPerWorkspace?: number;
|
|
378
|
+
/**
|
|
379
|
+
* Maximum number of connected attribute results to cache per workspace.
|
|
380
|
+
*
|
|
381
|
+
* This bounds the cache used by `getConnectedAttributesByDisplayForm`, keyed by the display form
|
|
382
|
+
* reference identifier/uri.
|
|
383
|
+
*
|
|
384
|
+
* When limit is reached, cache entries will be evicted using LRU policy.
|
|
385
|
+
*
|
|
386
|
+
* When no maximum number is specified, the cache will be unbounded and no evictions will happen.
|
|
387
|
+
*
|
|
388
|
+
* Setting non-positive number here is invalid. If you want to turn off connected attribute caching,
|
|
389
|
+
* tweak the `maxAttributeWorkspaces` value.
|
|
390
|
+
*/
|
|
391
|
+
maxConnectedAttributesPerWorkspace?: number;
|
|
333
392
|
/**
|
|
334
393
|
* Maximum number of attribute element results to cache per workspace.
|
|
335
394
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cachingBackend/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAGH,KAAK,kBAAkB,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/cachingBackend/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,6 +9,7 @@ import { areObjRefsEqual, geoFeatureId, idRef, isIdentifierRef, isUriRef, objRef
|
|
|
9
9
|
import { DecoratedWorkspaceAttributesService } from "../decoratedBackend/attributes.js";
|
|
10
10
|
import { DecoratedAutomationsQuery, DecoratedWorkspaceAutomationsService, } from "../decoratedBackend/automations.js";
|
|
11
11
|
import { DecoratedWorkspaceCatalogFactory } from "../decoratedBackend/catalog.js";
|
|
12
|
+
import { DecoratedWorkspaceDatasetsService } from "../decoratedBackend/datasets.js";
|
|
12
13
|
import { DecoratedElementsQuery, DecoratedElementsQueryFactory } from "../decoratedBackend/elements.js";
|
|
13
14
|
import { DecoratedDataView, DecoratedExecutionFactory, DecoratedExecutionResult, DecoratedPreparedExecution, } from "../decoratedBackend/execution.js";
|
|
14
15
|
import { DecoratedWorkspaceFactsService } from "../decoratedBackend/facts.js";
|
|
@@ -673,6 +674,23 @@ function elementsCacheKey(ref, settings) {
|
|
|
673
674
|
const fingerprint = stringify(settings) || "undefined";
|
|
674
675
|
return new SparkMD5().append(objRefToString(ref)).append(fingerprint).end();
|
|
675
676
|
}
|
|
677
|
+
/**
|
|
678
|
+
* Returns the identifier- and uri-based cache keys for the given ref. A ref yields at most one of the two.
|
|
679
|
+
*/
|
|
680
|
+
function refCacheKeys(ref) {
|
|
681
|
+
return {
|
|
682
|
+
idCacheKey: isIdentifierRef(ref) ? ref.identifier : undefined,
|
|
683
|
+
uriCacheKey: isUriRef(ref) ? ref.uri : undefined,
|
|
684
|
+
};
|
|
685
|
+
}
|
|
686
|
+
/**
|
|
687
|
+
* Builds a stable cache key for a set of refs. The order of refs does not matter (the refs are sorted),
|
|
688
|
+
* so callers requesting the same set in a different order share the same cache entry.
|
|
689
|
+
*/
|
|
690
|
+
function refSetCacheKey(refs) {
|
|
691
|
+
const serialized = refs.map(objRefToString).sort();
|
|
692
|
+
return new SparkMD5().append(stringify(serialized) || "undefined").end();
|
|
693
|
+
}
|
|
676
694
|
function getOrCreateAttributeCache(ctx, workspace) {
|
|
677
695
|
const cache = ctx.caches.workspaceAttributes;
|
|
678
696
|
let cacheEntry = cache.get(workspace);
|
|
@@ -687,6 +705,18 @@ function getOrCreateAttributeCache(ctx, workspace) {
|
|
|
687
705
|
attributesByDisplayForms: new LRUCache({
|
|
688
706
|
max: ctx.config.maxAttributesPerWorkspace,
|
|
689
707
|
}),
|
|
708
|
+
attributes: new LRUCache({
|
|
709
|
+
max: ctx.config.maxAttributesPerWorkspace,
|
|
710
|
+
}),
|
|
711
|
+
commonAttributes: new LRUCache({
|
|
712
|
+
max: (ctx.config.maxCommonAttributesPerWorkspace ?? ctx.config.maxAttributesPerWorkspace),
|
|
713
|
+
}),
|
|
714
|
+
commonAttributesBatch: new LRUCache({
|
|
715
|
+
max: (ctx.config.maxCommonAttributesPerWorkspace ?? ctx.config.maxAttributesPerWorkspace),
|
|
716
|
+
}),
|
|
717
|
+
connectedAttributes: new LRUCache({
|
|
718
|
+
max: (ctx.config.maxConnectedAttributesPerWorkspace ?? ctx.config.maxAttributesPerWorkspace),
|
|
719
|
+
}),
|
|
690
720
|
attributeElementResults: cachingEnabled(ctx.config.maxAttributeElementResultsPerWorkspace)
|
|
691
721
|
? new LRUCache({
|
|
692
722
|
max: ctx.config.maxAttributeElementResultsPerWorkspace,
|
|
@@ -793,43 +823,88 @@ class WithAttributesCaching extends DecoratedWorkspaceAttributesService {
|
|
|
793
823
|
};
|
|
794
824
|
getAttributeDisplayForms = async (refs) => {
|
|
795
825
|
const cache = getOrCreateAttributeCache(this.ctx, this.workspace).displayForms;
|
|
796
|
-
//
|
|
797
|
-
// then
|
|
826
|
+
// Grab a reference to the cache results as soon as possible in case they would get evicted while
|
|
827
|
+
// loading the ones missing from the cache - then we might not be able to call cache.get again and
|
|
828
|
+
// be guaranteed to get the data.
|
|
798
829
|
const refsWithCacheResults = refs.map((ref) => {
|
|
799
|
-
const idCacheKey =
|
|
800
|
-
const uriCacheKey = isUriRef(ref) ? ref.uri : undefined;
|
|
830
|
+
const { idCacheKey, uriCacheKey } = refCacheKeys(ref);
|
|
801
831
|
const cacheHit = firstDefined([idCacheKey, uriCacheKey].map((key) => key && cache.get(key)));
|
|
802
832
|
return {
|
|
803
833
|
ref,
|
|
834
|
+
idCacheKey,
|
|
835
|
+
uriCacheKey,
|
|
804
836
|
cacheHit: cacheHit,
|
|
805
837
|
};
|
|
806
838
|
});
|
|
807
839
|
const [withCacheHits, withoutCacheHits] = partition(refsWithCacheResults, ({ cacheHit }) => !!cacheHit);
|
|
808
840
|
const refsToLoad = withoutCacheHits.map((item) => item.ref);
|
|
809
|
-
|
|
810
|
-
|
|
841
|
+
// Use a single shared load promise so that concurrent callers asking for the same uncached refs
|
|
842
|
+
// collapse onto one underlying request. Per-ref promises are derived from it and registered into
|
|
843
|
+
// the cache synchronously - before any await - so a concurrent caller sees the in-flight promise.
|
|
844
|
+
const loadPromise = refsToLoad.length
|
|
845
|
+
? Promise.resolve(this.decorated.getAttributeDisplayForms(refsToLoad))
|
|
846
|
+
: Promise.resolve([]);
|
|
847
|
+
withoutCacheHits.forEach((item) => {
|
|
848
|
+
const perRefPromise = loadPromise
|
|
849
|
+
.then((loaded) => {
|
|
850
|
+
const match = loaded.find((df) => refMatchesMdObject(item.ref, df, "displayForm"));
|
|
851
|
+
if (!match) {
|
|
852
|
+
// The server omitted this ref; evict so a later call can retry it and so a
|
|
853
|
+
// resolved-undefined is never cached.
|
|
854
|
+
if (item.idCacheKey) {
|
|
855
|
+
cache.delete(item.idCacheKey);
|
|
856
|
+
}
|
|
857
|
+
if (item.uriCacheKey) {
|
|
858
|
+
cache.delete(item.uriCacheKey);
|
|
859
|
+
}
|
|
860
|
+
}
|
|
861
|
+
return match;
|
|
862
|
+
})
|
|
863
|
+
.catch((e) => {
|
|
864
|
+
if (item.idCacheKey) {
|
|
865
|
+
cache.delete(item.idCacheKey);
|
|
866
|
+
}
|
|
867
|
+
if (item.uriCacheKey) {
|
|
868
|
+
cache.delete(item.uriCacheKey);
|
|
869
|
+
}
|
|
870
|
+
throw e;
|
|
871
|
+
});
|
|
872
|
+
// Prevent an unhandled rejection if nobody else awaits this per-ref promise (the primary caller
|
|
873
|
+
// below awaits `loadPromise` directly). Concurrent callers awaiting the cached promise still see
|
|
874
|
+
// the rejection through their own reference.
|
|
875
|
+
perRefPromise.catch(() => undefined);
|
|
876
|
+
// Reuse the per-ref promise as this call's own cache hit so the assembled result awaits it, and
|
|
877
|
+
// register it so later callers share it. Cast is safe: an omitted ref resolves to undefined but
|
|
878
|
+
// is compacted out of the result below (and never survives in the cache).
|
|
879
|
+
item.cacheHit = perRefPromise;
|
|
880
|
+
if (item.idCacheKey) {
|
|
881
|
+
cache.set(item.idCacheKey, item.cacheHit);
|
|
882
|
+
}
|
|
883
|
+
if (item.uriCacheKey) {
|
|
884
|
+
cache.set(item.uriCacheKey, item.cacheHit);
|
|
885
|
+
}
|
|
886
|
+
});
|
|
887
|
+
const [loadedFromServer, alreadyInCache] = await Promise.all([
|
|
888
|
+
loadPromise,
|
|
811
889
|
Promise.all(withCacheHits.map((item) => item.cacheHit)),
|
|
812
|
-
// load items not in cache using the bulk operation
|
|
813
|
-
this.decorated.getAttributeDisplayForms(refsToLoad),
|
|
814
890
|
]);
|
|
815
|
-
// save newly loaded to cache for future reference
|
|
816
|
-
loadedFromServer.forEach((loaded) => {
|
|
817
|
-
const promisifiedResult = Promise.resolve(loaded);
|
|
818
|
-
// save the cache item for both types of refs
|
|
819
|
-
cache.set(loaded.id, promisifiedResult);
|
|
820
|
-
cache.set(loaded.uri, promisifiedResult);
|
|
821
|
-
});
|
|
822
891
|
const loadedRefs = loadedFromServer.map((item) => item.ref);
|
|
823
892
|
const outputRefs = this.ctx.capabilities.allowsInconsistentRelations
|
|
824
893
|
? skipMissingReferences(refs, refsToLoad, loadedRefs)
|
|
825
894
|
: refs;
|
|
826
|
-
//
|
|
827
|
-
|
|
828
|
-
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
895
|
+
// Reconstruct the original ordering. Derive the output from what actually resolved (compact) rather
|
|
896
|
+
// than from refsToLoad, so a concurrent caller sharing the in-flight promise of a ref the server
|
|
897
|
+
// omitted does not trip the invariant below.
|
|
898
|
+
const candidates = compact([...loadedFromServer, ...alreadyInCache]);
|
|
899
|
+
return outputRefs
|
|
900
|
+
.map((ref) => candidates.find((item) => refMatchesMdObject(ref, item, "displayForm")))
|
|
901
|
+
.filter((match) => {
|
|
902
|
+
// When the backend guarantees consistent relations, every requested ref must resolve.
|
|
903
|
+
if (!match) {
|
|
904
|
+
invariant(this.ctx.capabilities.allowsInconsistentRelations);
|
|
905
|
+
return false;
|
|
906
|
+
}
|
|
907
|
+
return true;
|
|
833
908
|
});
|
|
834
909
|
};
|
|
835
910
|
getAttributeByDisplayForm = async (ref) => {
|
|
@@ -856,6 +931,168 @@ class WithAttributesCaching extends DecoratedWorkspaceAttributesService {
|
|
|
856
931
|
}
|
|
857
932
|
return cacheItem;
|
|
858
933
|
};
|
|
934
|
+
getAttribute = (ref, opts = {}) => {
|
|
935
|
+
const cache = getOrCreateAttributeCache(this.ctx, this.workspace).attributes;
|
|
936
|
+
// The `include` option changes the shape of the returned object, so it must be part of the key.
|
|
937
|
+
// With the default (empty) options the key is just the identifier/uri, which lets `getAttribute`
|
|
938
|
+
// share cached entries with the bulk `getAttributes` method.
|
|
939
|
+
const suffix = opts.include?.length ? `:${opts.include.join(",")}` : "";
|
|
940
|
+
const { idCacheKey, uriCacheKey } = refCacheKeys(ref);
|
|
941
|
+
const idKey = idCacheKey && `${idCacheKey}${suffix}`;
|
|
942
|
+
const uriKey = uriCacheKey && `${uriCacheKey}${suffix}`;
|
|
943
|
+
let cacheItem = firstDefined([idKey, uriKey].map((key) => key && cache.get(key)));
|
|
944
|
+
if (!cacheItem) {
|
|
945
|
+
cacheItem = super.getAttribute(ref, opts).catch((e) => {
|
|
946
|
+
if (idKey) {
|
|
947
|
+
cache.delete(idKey);
|
|
948
|
+
}
|
|
949
|
+
if (uriKey) {
|
|
950
|
+
cache.delete(uriKey);
|
|
951
|
+
}
|
|
952
|
+
throw e;
|
|
953
|
+
});
|
|
954
|
+
if (idKey) {
|
|
955
|
+
cache.set(idKey, cacheItem);
|
|
956
|
+
}
|
|
957
|
+
if (uriKey) {
|
|
958
|
+
cache.set(uriKey, cacheItem);
|
|
959
|
+
}
|
|
960
|
+
}
|
|
961
|
+
// The shared `attributes` cache can momentarily hold an in-flight bulk entry that resolves to
|
|
962
|
+
// `undefined` for a ref the server omitted. Guard against it so the scalar contract (an attribute
|
|
963
|
+
// or a rejection) is preserved; such a gap is never written back to the cache.
|
|
964
|
+
return cacheItem.then((value) => value ?? this.decorated.getAttribute(ref, opts));
|
|
965
|
+
};
|
|
966
|
+
getAttributes = async (refs) => {
|
|
967
|
+
const cache = getOrCreateAttributeCache(this.ctx, this.workspace).attributes;
|
|
968
|
+
// Grab a reference to the cache results as soon as possible in case they would get evicted while
|
|
969
|
+
// loading the ones missing from the cache.
|
|
970
|
+
const refsWithCacheResults = refs.map((ref) => {
|
|
971
|
+
const { idCacheKey, uriCacheKey } = refCacheKeys(ref);
|
|
972
|
+
const cacheHit = firstDefined([idCacheKey, uriCacheKey].map((key) => key && cache.get(key)));
|
|
973
|
+
return {
|
|
974
|
+
ref,
|
|
975
|
+
idCacheKey,
|
|
976
|
+
uriCacheKey,
|
|
977
|
+
cacheHit: cacheHit,
|
|
978
|
+
};
|
|
979
|
+
});
|
|
980
|
+
const [withCacheHits, withoutCacheHits] = partition(refsWithCacheResults, ({ cacheHit }) => !!cacheHit);
|
|
981
|
+
const refsToLoad = withoutCacheHits.map((item) => item.ref);
|
|
982
|
+
// Use a single shared load promise so that concurrent callers asking for the same uncached refs
|
|
983
|
+
// collapse onto one underlying request. Per-ref promises are derived from it and registered into
|
|
984
|
+
// the cache synchronously - before any await - so a concurrent caller sees the in-flight promise.
|
|
985
|
+
const loadPromise = refsToLoad.length > 0
|
|
986
|
+
? Promise.resolve(this.decorated.getAttributes(refsToLoad))
|
|
987
|
+
: Promise.resolve([]);
|
|
988
|
+
withoutCacheHits.forEach((item) => {
|
|
989
|
+
const perRefPromise = loadPromise
|
|
990
|
+
.then((loaded) => {
|
|
991
|
+
const match = loaded.find((attribute) => refMatchesMdObject(item.ref, attribute, "attribute"));
|
|
992
|
+
if (!match) {
|
|
993
|
+
// The server omitted this ref; evict so a later call can retry it.
|
|
994
|
+
if (item.idCacheKey) {
|
|
995
|
+
cache.delete(item.idCacheKey);
|
|
996
|
+
}
|
|
997
|
+
if (item.uriCacheKey) {
|
|
998
|
+
cache.delete(item.uriCacheKey);
|
|
999
|
+
}
|
|
1000
|
+
}
|
|
1001
|
+
return match;
|
|
1002
|
+
})
|
|
1003
|
+
.catch((e) => {
|
|
1004
|
+
if (item.idCacheKey) {
|
|
1005
|
+
cache.delete(item.idCacheKey);
|
|
1006
|
+
}
|
|
1007
|
+
if (item.uriCacheKey) {
|
|
1008
|
+
cache.delete(item.uriCacheKey);
|
|
1009
|
+
}
|
|
1010
|
+
throw e;
|
|
1011
|
+
});
|
|
1012
|
+
// Prevent an unhandled rejection if nobody else awaits this per-ref promise (the primary caller
|
|
1013
|
+
// below awaits `loadPromise` directly). Concurrent callers awaiting the cached promise still see
|
|
1014
|
+
// the rejection through their own reference.
|
|
1015
|
+
perRefPromise.catch(() => undefined);
|
|
1016
|
+
item.cacheHit = perRefPromise;
|
|
1017
|
+
if (item.idCacheKey) {
|
|
1018
|
+
cache.set(item.idCacheKey, perRefPromise);
|
|
1019
|
+
}
|
|
1020
|
+
if (item.uriCacheKey) {
|
|
1021
|
+
cache.set(item.uriCacheKey, perRefPromise);
|
|
1022
|
+
}
|
|
1023
|
+
});
|
|
1024
|
+
const [loadedFromServer, alreadyInCache] = await Promise.all([
|
|
1025
|
+
loadPromise,
|
|
1026
|
+
Promise.all(withCacheHits.map((item) => item.cacheHit)),
|
|
1027
|
+
]);
|
|
1028
|
+
const loadedRefs = loadedFromServer.map((item) => item.ref);
|
|
1029
|
+
const outputRefs = this.ctx.capabilities.allowsInconsistentRelations
|
|
1030
|
+
? skipMissingReferences(refs, refsToLoad, loadedRefs)
|
|
1031
|
+
: refs;
|
|
1032
|
+
// reconstruct the original ordering
|
|
1033
|
+
const candidates = compact([...loadedFromServer, ...alreadyInCache]);
|
|
1034
|
+
return outputRefs
|
|
1035
|
+
.map((ref) => candidates.find((item) => refMatchesMdObject(ref, item, "attribute")))
|
|
1036
|
+
.filter((match) => {
|
|
1037
|
+
// When the backend guarantees consistent relations, every requested ref must resolve.
|
|
1038
|
+
if (!match) {
|
|
1039
|
+
invariant(this.ctx.capabilities.allowsInconsistentRelations);
|
|
1040
|
+
return false;
|
|
1041
|
+
}
|
|
1042
|
+
return true;
|
|
1043
|
+
});
|
|
1044
|
+
};
|
|
1045
|
+
getCommonAttributes = (attributeRefs) => {
|
|
1046
|
+
const cache = getOrCreateAttributeCache(this.ctx, this.workspace).commonAttributes;
|
|
1047
|
+
const cacheKey = refSetCacheKey(attributeRefs);
|
|
1048
|
+
let result = cache.get(cacheKey);
|
|
1049
|
+
if (!result) {
|
|
1050
|
+
result = super.getCommonAttributes(attributeRefs).catch((e) => {
|
|
1051
|
+
cache.delete(cacheKey);
|
|
1052
|
+
throw e;
|
|
1053
|
+
});
|
|
1054
|
+
cache.set(cacheKey, result);
|
|
1055
|
+
}
|
|
1056
|
+
return result;
|
|
1057
|
+
};
|
|
1058
|
+
getCommonAttributesBatch = (attributesRefsBatch) => {
|
|
1059
|
+
const cache = getOrCreateAttributeCache(this.ctx, this.workspace).commonAttributesBatch;
|
|
1060
|
+
const cacheKey = new SparkMD5()
|
|
1061
|
+
.append(stringify(attributesRefsBatch.map(refSetCacheKey)) || "undefined")
|
|
1062
|
+
.end();
|
|
1063
|
+
let result = cache.get(cacheKey);
|
|
1064
|
+
if (!result) {
|
|
1065
|
+
result = super.getCommonAttributesBatch(attributesRefsBatch).catch((e) => {
|
|
1066
|
+
cache.delete(cacheKey);
|
|
1067
|
+
throw e;
|
|
1068
|
+
});
|
|
1069
|
+
cache.set(cacheKey, result);
|
|
1070
|
+
}
|
|
1071
|
+
return result;
|
|
1072
|
+
};
|
|
1073
|
+
getConnectedAttributesByDisplayForm = (ref) => {
|
|
1074
|
+
const cache = getOrCreateAttributeCache(this.ctx, this.workspace).connectedAttributes;
|
|
1075
|
+
const { idCacheKey, uriCacheKey } = refCacheKeys(ref);
|
|
1076
|
+
let cacheItem = firstDefined([idCacheKey, uriCacheKey].map((key) => key && cache.get(key)));
|
|
1077
|
+
if (!cacheItem) {
|
|
1078
|
+
cacheItem = super.getConnectedAttributesByDisplayForm(ref).catch((e) => {
|
|
1079
|
+
if (idCacheKey) {
|
|
1080
|
+
cache.delete(idCacheKey);
|
|
1081
|
+
}
|
|
1082
|
+
if (uriCacheKey) {
|
|
1083
|
+
cache.delete(uriCacheKey);
|
|
1084
|
+
}
|
|
1085
|
+
throw e;
|
|
1086
|
+
});
|
|
1087
|
+
if (idCacheKey) {
|
|
1088
|
+
cache.set(idCacheKey, cacheItem);
|
|
1089
|
+
}
|
|
1090
|
+
if (uriCacheKey) {
|
|
1091
|
+
cache.set(uriCacheKey, cacheItem);
|
|
1092
|
+
}
|
|
1093
|
+
}
|
|
1094
|
+
return cacheItem;
|
|
1095
|
+
};
|
|
859
1096
|
getAttributeDatasetMeta = async (ref) => {
|
|
860
1097
|
const cache = getOrCreateAttributeCache(this.ctx, this.workspace).dataSetsMeta;
|
|
861
1098
|
const idCacheKey = isIdentifierRef(ref) ? ref.identifier : undefined;
|
|
@@ -1423,6 +1660,124 @@ function cachedMeasures(ctx) {
|
|
|
1423
1660
|
return (original, workspace) => new WithMeasuresCaching(original, ctx, workspace);
|
|
1424
1661
|
}
|
|
1425
1662
|
//
|
|
1663
|
+
// Datasets caching
|
|
1664
|
+
//
|
|
1665
|
+
function getOrCreateDatasetsCache(ctx, workspace) {
|
|
1666
|
+
const cache = ctx.caches.workspaceDatasets;
|
|
1667
|
+
let cacheEntry = cache.get(workspace);
|
|
1668
|
+
if (!cacheEntry) {
|
|
1669
|
+
cacheEntry = {
|
|
1670
|
+
datasets: new LRUCache({
|
|
1671
|
+
max: ctx.config.maxDatasetsPerWorkspace,
|
|
1672
|
+
}),
|
|
1673
|
+
};
|
|
1674
|
+
cache.set(workspace, cacheEntry);
|
|
1675
|
+
}
|
|
1676
|
+
return cacheEntry;
|
|
1677
|
+
}
|
|
1678
|
+
class WithDatasetsCaching extends DecoratedWorkspaceDatasetsService {
|
|
1679
|
+
ctx;
|
|
1680
|
+
workspace;
|
|
1681
|
+
constructor(decorated, ctx, workspace) {
|
|
1682
|
+
super(decorated);
|
|
1683
|
+
this.ctx = ctx;
|
|
1684
|
+
this.workspace = workspace;
|
|
1685
|
+
}
|
|
1686
|
+
// Pattern 1: scalar read keyed by ref identifier/uri (mirrors getAttributeByDisplayForm).
|
|
1687
|
+
getDataset = (ref) => {
|
|
1688
|
+
const cache = getOrCreateDatasetsCache(this.ctx, this.workspace).datasets;
|
|
1689
|
+
const idCacheKey = isIdentifierRef(ref) ? ref.identifier : undefined;
|
|
1690
|
+
const uriCacheKey = isUriRef(ref) ? ref.uri : undefined;
|
|
1691
|
+
let cacheItem = firstDefined([idCacheKey, uriCacheKey].map((key) => key && cache.get(key)));
|
|
1692
|
+
if (!cacheItem) {
|
|
1693
|
+
cacheItem = super.getDataset(ref).catch((e) => {
|
|
1694
|
+
if (idCacheKey) {
|
|
1695
|
+
cache.delete(idCacheKey);
|
|
1696
|
+
}
|
|
1697
|
+
if (uriCacheKey) {
|
|
1698
|
+
cache.delete(uriCacheKey);
|
|
1699
|
+
}
|
|
1700
|
+
throw e;
|
|
1701
|
+
});
|
|
1702
|
+
if (idCacheKey) {
|
|
1703
|
+
cache.set(idCacheKey, cacheItem);
|
|
1704
|
+
}
|
|
1705
|
+
if (uriCacheKey) {
|
|
1706
|
+
cache.set(uriCacheKey, cacheItem);
|
|
1707
|
+
}
|
|
1708
|
+
}
|
|
1709
|
+
return cacheItem;
|
|
1710
|
+
};
|
|
1711
|
+
// Pattern 2 (the pilot): bulk read that de-duplicates in-flight requests. A single underlying
|
|
1712
|
+
// load promise is issued for the missing refs and the per-ref promises derived from it are
|
|
1713
|
+
// registered in the cache synchronously, before awaiting, so concurrent callers share them.
|
|
1714
|
+
getDataSets = async (refs) => {
|
|
1715
|
+
const cache = getOrCreateDatasetsCache(this.ctx, this.workspace).datasets;
|
|
1716
|
+
// Grab references to the cache results as soon as possible in case they would get evicted
|
|
1717
|
+
// while loading the ones missing from the cache.
|
|
1718
|
+
const entries = refs.map((ref) => {
|
|
1719
|
+
const idCacheKey = isIdentifierRef(ref) ? ref.identifier : undefined;
|
|
1720
|
+
const uriCacheKey = isUriRef(ref) ? ref.uri : undefined;
|
|
1721
|
+
const cacheHit = firstDefined([idCacheKey, uriCacheKey].map((key) => key && cache.get(key)));
|
|
1722
|
+
return {
|
|
1723
|
+
ref,
|
|
1724
|
+
idCacheKey,
|
|
1725
|
+
uriCacheKey,
|
|
1726
|
+
promise: cacheHit,
|
|
1727
|
+
};
|
|
1728
|
+
});
|
|
1729
|
+
const missing = entries.filter((entry) => !entry.promise);
|
|
1730
|
+
if (missing.length > 0) {
|
|
1731
|
+
// Single underlying request shared by every missing ref.
|
|
1732
|
+
const loadPromise = this.decorated.getDataSets(missing.map((entry) => entry.ref));
|
|
1733
|
+
// Attach a no-op handler so the shared promise never produces an unhandled rejection;
|
|
1734
|
+
// the per-ref promises below carry the real error handling.
|
|
1735
|
+
loadPromise.catch(() => undefined);
|
|
1736
|
+
missing.forEach((entry) => {
|
|
1737
|
+
const perRefPromise = loadPromise.then((loaded) => {
|
|
1738
|
+
const match = loaded.find((dataSet) => refMatchesMdObject(entry.ref, dataSet, "dataSet"));
|
|
1739
|
+
// The backend may omit refs it could not resolve (inconsistent relations).
|
|
1740
|
+
// Evict the omitted ref so it is not cached and gets reloaded next time.
|
|
1741
|
+
if (!match) {
|
|
1742
|
+
if (entry.idCacheKey) {
|
|
1743
|
+
cache.delete(entry.idCacheKey);
|
|
1744
|
+
}
|
|
1745
|
+
if (entry.uriCacheKey) {
|
|
1746
|
+
cache.delete(entry.uriCacheKey);
|
|
1747
|
+
}
|
|
1748
|
+
}
|
|
1749
|
+
return match;
|
|
1750
|
+
});
|
|
1751
|
+
// Evict on error so a rejected promise is never left cached.
|
|
1752
|
+
const guarded = perRefPromise.catch((e) => {
|
|
1753
|
+
if (entry.idCacheKey) {
|
|
1754
|
+
cache.delete(entry.idCacheKey);
|
|
1755
|
+
}
|
|
1756
|
+
if (entry.uriCacheKey) {
|
|
1757
|
+
cache.delete(entry.uriCacheKey);
|
|
1758
|
+
}
|
|
1759
|
+
throw e;
|
|
1760
|
+
});
|
|
1761
|
+
if (entry.idCacheKey) {
|
|
1762
|
+
cache.set(entry.idCacheKey, guarded);
|
|
1763
|
+
}
|
|
1764
|
+
if (entry.uriCacheKey) {
|
|
1765
|
+
cache.set(entry.uriCacheKey, guarded);
|
|
1766
|
+
}
|
|
1767
|
+
entry.promise = guarded;
|
|
1768
|
+
});
|
|
1769
|
+
}
|
|
1770
|
+
// Derive the output from what actually resolved, preserving the input ordering and
|
|
1771
|
+
// dropping refs that the backend omitted. Omitted refs resolve to `undefined` (see the
|
|
1772
|
+
// `match` lookup above), so genuine backend rejections still propagate and are not masked.
|
|
1773
|
+
const resolved = await Promise.all(entries.map((entry) => entry.promise));
|
|
1774
|
+
return resolved.filter((dataSet) => dataSet !== undefined);
|
|
1775
|
+
};
|
|
1776
|
+
}
|
|
1777
|
+
function cachedDatasets(ctx) {
|
|
1778
|
+
return (original, workspace) => new WithDatasetsCaching(original, ctx, workspace);
|
|
1779
|
+
}
|
|
1780
|
+
//
|
|
1426
1781
|
// ORGANIZATION EXPORT TEMPLATES CACHING
|
|
1427
1782
|
//
|
|
1428
1783
|
class WithOrganizationExportTemplatesCaching extends DecoratedOrganizationExportTemplatesService {
|
|
@@ -1664,6 +2019,9 @@ function cacheControl(ctx) {
|
|
|
1664
2019
|
resetFacts: () => {
|
|
1665
2020
|
ctx.caches.workspaceFacts?.clear();
|
|
1666
2021
|
},
|
|
2022
|
+
resetDatasets: () => {
|
|
2023
|
+
ctx.caches.workspaceDatasets?.clear();
|
|
2024
|
+
},
|
|
1667
2025
|
resetWorkspaceSettings: () => {
|
|
1668
2026
|
ctx.caches.workspaceSettings?.clear();
|
|
1669
2027
|
},
|
|
@@ -1689,6 +2047,7 @@ function cacheControl(ctx) {
|
|
|
1689
2047
|
control.resetSecuritySettings();
|
|
1690
2048
|
control.resetAttributes();
|
|
1691
2049
|
control.resetFacts();
|
|
2050
|
+
control.resetDatasets();
|
|
1692
2051
|
control.resetWorkspaceSettings();
|
|
1693
2052
|
control.resetGeoStyles();
|
|
1694
2053
|
control.resetExportTemplates();
|
|
@@ -1721,6 +2080,8 @@ export const RecommendedCachingConfiguration = {
|
|
|
1721
2080
|
maxAttributeWorkspaces: 1,
|
|
1722
2081
|
maxAttributeDisplayFormsPerWorkspace: 500,
|
|
1723
2082
|
maxAttributesPerWorkspace: 500,
|
|
2083
|
+
maxCommonAttributesPerWorkspace: 500,
|
|
2084
|
+
maxConnectedAttributesPerWorkspace: 500,
|
|
1724
2085
|
maxAttributeElementResultsPerWorkspace: 100,
|
|
1725
2086
|
maxWorkspaceSettings: 1,
|
|
1726
2087
|
maxAutomationsWorkspaces: 1,
|
|
@@ -1729,6 +2090,8 @@ export const RecommendedCachingConfiguration = {
|
|
|
1729
2090
|
maxFactsPerWorkspace: 500,
|
|
1730
2091
|
maxMeasuresWorkspaces: 1,
|
|
1731
2092
|
maxMeasuresPerWorkspace: 100,
|
|
2093
|
+
maxDatasetWorkspaces: 1,
|
|
2094
|
+
maxDatasetsPerWorkspace: 500,
|
|
1732
2095
|
maxExportTemplatesOrgs: 1,
|
|
1733
2096
|
maxExportTemplatesWorkspaces: 1,
|
|
1734
2097
|
cacheGeoStyles: true,
|
|
@@ -1758,6 +2121,7 @@ export function withCaching(realBackend, config) {
|
|
|
1758
2121
|
const insightsCaching = cachingEnabled(config.maxInsightsPerWorkspace);
|
|
1759
2122
|
const factsCaching = cachingEnabled(config.maxFactsWorkspaces);
|
|
1760
2123
|
const measuresCaching = cachingEnabled(config.maxMeasuresWorkspaces);
|
|
2124
|
+
const datasetsCaching = cachingEnabled(config.maxDatasetWorkspaces);
|
|
1761
2125
|
// Backward compatibility: `maxExportTemplatesWorkspaces` used to be the (deprecated) alias that
|
|
1762
2126
|
// sized the org export-templates cache. It now primarily drives workspace caching, but callers
|
|
1763
2127
|
// that only set the old name must keep getting org caching until the alias is removed.
|
|
@@ -1792,6 +2156,9 @@ export function withCaching(realBackend, config) {
|
|
|
1792
2156
|
workspaceMeasures: measuresCaching
|
|
1793
2157
|
? new LRUCache({ max: config.maxMeasuresWorkspaces })
|
|
1794
2158
|
: undefined,
|
|
2159
|
+
workspaceDatasets: datasetsCaching
|
|
2160
|
+
? new LRUCache({ max: config.maxDatasetWorkspaces })
|
|
2161
|
+
: undefined,
|
|
1795
2162
|
organizationExportTemplates: exportTemplatesCaching
|
|
1796
2163
|
? new LRUCache({ max: orgExportTemplatesMax })
|
|
1797
2164
|
: undefined,
|
|
@@ -1816,6 +2183,7 @@ export function withCaching(realBackend, config) {
|
|
|
1816
2183
|
const insights = insightsCaching ? cachedInsights(ctx) : (v) => v;
|
|
1817
2184
|
const facts = factsCaching ? cachedFacts(ctx) : (v) => v;
|
|
1818
2185
|
const measures = measuresCaching ? cachedMeasures(ctx) : (v) => v;
|
|
2186
|
+
const datasets = datasetsCaching ? cachedDatasets(ctx) : (v) => v;
|
|
1819
2187
|
const organizationExportTemplates = exportTemplatesCaching
|
|
1820
2188
|
? cachedOrganizationExportTemplates(ctx)
|
|
1821
2189
|
: undefined;
|
|
@@ -1837,6 +2205,7 @@ export function withCaching(realBackend, config) {
|
|
|
1837
2205
|
insights,
|
|
1838
2206
|
facts,
|
|
1839
2207
|
measures,
|
|
2208
|
+
datasets,
|
|
1840
2209
|
organizationExportTemplates,
|
|
1841
2210
|
workspaceExportTemplates,
|
|
1842
2211
|
geo,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"analyticalWorkspace.d.ts","sourceRoot":"","sources":["../../src/decoratedBackend/analyticalWorkspace.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,8BAA8B,EACnC,KAAK,uBAAuB,EAC5B,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EAChC,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,kCAAkC,EACvC,KAAK,gCAAgC,EACrC,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,kCAAkC,EACvC,KAAK,6BAA6B,EAClC,KAAK,yBAAyB,EAC9B,KAAK,kCAAkC,EACvC,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EAC5B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,qBAAa,4BAA6B,YAAW,oBAAoB;IAC9D,SAAS,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAE/C,YAAY,SAAS,EAAE,oBAAoB,EAAE,SAAS,EAAE,kBAAkB,EAIzE;IAEM,aAAa,CAAC,qBAAqB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAEnF;IAEM,gBAAgB,CAAC,UAAU,EAAE,0BAA0B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAE7F;IAEM,kBAAkB,IAAI,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAErE;IAEM,UAAU,IAAI,2BAA2B,CAQ/C;IAEM,SAAS,IAAI,iBAAiB,CAQpC;IAEM,OAAO,IAAI,wBAAwB,CAQzC;IAEM,iBAAiB,IAAI,kCAAkC,CAE7D;IAEM,QAAQ,IAAI,yBAAyB,CAQ3C;IAEM,UAAU,IAAI,2BAA2B,CAE/C;IAEM,KAAK,IAAI,sBAAsB,CAQrC;IAEM,QAAQ,IAAI,yBAAyB,CAQ3C;IAEM,UAAU,IAAI,2BAA2B,CAQ/C;IAEM,QAAQ,IAAI,yBAAyB,CAQ3C;IAEM,OAAO,IAAI,wBAAwB,CAEzC;IAEM,QAAQ,IAAI,yBAAyB,
|
|
1
|
+
{"version":3,"file":"analyticalWorkspace.d.ts","sourceRoot":"","sources":["../../src/decoratedBackend/analyticalWorkspace.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,oBAAoB,EACzB,KAAK,4BAA4B,EACjC,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,iBAAiB,EACtB,KAAK,aAAa,EAClB,KAAK,kBAAkB,EACvB,KAAK,8BAA8B,EACnC,KAAK,uBAAuB,EAC5B,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EAChC,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EACzB,KAAK,0BAA0B,EAC/B,KAAK,kCAAkC,EACvC,KAAK,gCAAgC,EACrC,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,kCAAkC,EACvC,KAAK,6BAA6B,EAClC,KAAK,yBAAyB,EAC9B,KAAK,kCAAkC,EACvC,KAAK,2BAA2B,EAChC,KAAK,4BAA4B,EACjC,KAAK,yBAAyB,EAC9B,KAAK,wBAAwB,EAC7B,KAAK,yBAAyB,EAC9B,KAAK,oBAAoB,EAC5B,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,KAAK,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAErD,qBAAa,4BAA6B,YAAW,oBAAoB;IAC9D,SAAS,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,SAAS,CAAuB;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAqB;IAE/C,YAAY,SAAS,EAAE,oBAAoB,EAAE,SAAS,EAAE,kBAAkB,EAIzE;IAEM,aAAa,CAAC,qBAAqB,CAAC,EAAE,OAAO,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAEnF;IAEM,gBAAgB,CAAC,UAAU,EAAE,0BAA0B,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAE7F;IAEM,kBAAkB,IAAI,OAAO,CAAC,oBAAoB,GAAG,SAAS,CAAC,CAErE;IAEM,UAAU,IAAI,2BAA2B,CAQ/C;IAEM,SAAS,IAAI,iBAAiB,CAQpC;IAEM,OAAO,IAAI,wBAAwB,CAQzC;IAEM,iBAAiB,IAAI,kCAAkC,CAE7D;IAEM,QAAQ,IAAI,yBAAyB,CAQ3C;IAEM,UAAU,IAAI,2BAA2B,CAE/C;IAEM,KAAK,IAAI,sBAAsB,CAQrC;IAEM,QAAQ,IAAI,yBAAyB,CAQ3C;IAEM,UAAU,IAAI,2BAA2B,CAQ/C;IAEM,QAAQ,IAAI,yBAAyB,CAQ3C;IAEM,OAAO,IAAI,wBAAwB,CAEzC;IAEM,QAAQ,IAAI,yBAAyB,CAQ3C;IAEM,WAAW,IAAI,4BAA4B,CAEjD;IAEM,KAAK,IAAI,oBAAoB,CAEnC;IAEM,iBAAiB,IAAI,uBAAuB,CAElD;IAEM,UAAU,IAAI,yBAAyB,CAE7C;IAEM,aAAa,IAAI,8BAA8B,CAErD;IAEM,iBAAiB,IAAI,kCAAkC,CAE7D;IAEM,oBAAoB,IAAI,4BAA4B,CAE1D;IAEM,MAAM,IAAI,uBAAuB,CAEvC;IAEM,iBAAiB,IAAI,kCAAkC,CAE7D;IAEM,WAAW,IAAI,mBAAmB,CAExC;IAEM,YAAY,IAAI,6BAA6B,CAEnD;IAEM,WAAW,IAAI,2BAA2B,CAQhD;IAEM,KAAK,IAAI,aAAa,CAE5B;IAEM,UAAU,IAAI,kBAAkB,CAEtC;IAEM,eAAe,IAAI,gCAAgC,CAQzD;CACJ"}
|
|
@@ -83,6 +83,10 @@ export class AnalyticalWorkspaceDecorator {
|
|
|
83
83
|
return this.decorated.styling();
|
|
84
84
|
}
|
|
85
85
|
datasets() {
|
|
86
|
+
const { datasets } = this.factories;
|
|
87
|
+
if (datasets) {
|
|
88
|
+
return datasets(this.decorated.datasets(), this.workspace);
|
|
89
|
+
}
|
|
86
90
|
return this.decorated.datasets();
|
|
87
91
|
}
|
|
88
92
|
permissions() {
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { type IDatasetsQuery, type IWorkspaceDatasetsService } from "@gooddata/sdk-backend-spi";
|
|
2
|
+
import { type IDataSetMetadataObject, type IDataset, type IMetadataObject, type IMetadataObjectBase, type IMetadataObjectIdentity, type ObjRef } from "@gooddata/sdk-model";
|
|
3
|
+
/**
|
|
4
|
+
* @alpha
|
|
5
|
+
*/
|
|
6
|
+
export declare abstract class DecoratedWorkspaceDatasetsService implements IWorkspaceDatasetsService {
|
|
7
|
+
protected readonly decorated: IWorkspaceDatasetsService;
|
|
8
|
+
protected constructor(decorated: IWorkspaceDatasetsService);
|
|
9
|
+
getDatasets(): Promise<IDataset[]>;
|
|
10
|
+
getAllDatasetsMeta(): Promise<IMetadataObject[]>;
|
|
11
|
+
getDataSets(refs: ObjRef[]): Promise<IDataSetMetadataObject[]>;
|
|
12
|
+
getDataset(ref: ObjRef): Promise<IDataSetMetadataObject>;
|
|
13
|
+
updateDatasetMeta(dataSet: Partial<IMetadataObjectBase> & IMetadataObjectIdentity): Promise<IDataSetMetadataObject>;
|
|
14
|
+
getDatasetsQuery(): IDatasetsQuery;
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=datasets.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"datasets.d.ts","sourceRoot":"","sources":["../../src/decoratedBackend/datasets.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAChG,OAAO,EACH,KAAK,sBAAsB,EAC3B,KAAK,QAAQ,EACb,KAAK,eAAe,EACpB,KAAK,mBAAmB,EACxB,KAAK,uBAAuB,EAC5B,KAAK,MAAM,EACd,MAAM,qBAAqB,CAAC;AAE7B;;GAEG;AACH,8BAAsB,iCAAkC,YAAW,yBAAyB;IAClE,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,yBAAyB;IAA7E,SAAS,aAAgC,SAAS,EAAE,yBAAyB,EAAI;IAE1E,WAAW,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC,CAExC;IAEM,kBAAkB,IAAI,OAAO,CAAC,eAAe,EAAE,CAAC,CAEtD;IAEM,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,sBAAsB,EAAE,CAAC,CAEpE;IAEM,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAE9D;IAEM,iBAAiB,CACpB,OAAO,EAAE,OAAO,CAAC,mBAAmB,CAAC,GAAG,uBAAuB,GAChE,OAAO,CAAC,sBAAsB,CAAC,CAEjC;IAEM,gBAAgB,IAAI,cAAc,CAExC;CACJ"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
// (C) 2025-2026 GoodData Corporation
|
|
2
|
+
/**
|
|
3
|
+
* @alpha
|
|
4
|
+
*/
|
|
5
|
+
export class DecoratedWorkspaceDatasetsService {
|
|
6
|
+
decorated;
|
|
7
|
+
constructor(decorated) {
|
|
8
|
+
this.decorated = decorated;
|
|
9
|
+
}
|
|
10
|
+
getDatasets() {
|
|
11
|
+
return this.decorated.getDatasets();
|
|
12
|
+
}
|
|
13
|
+
getAllDatasetsMeta() {
|
|
14
|
+
return this.decorated.getAllDatasetsMeta();
|
|
15
|
+
}
|
|
16
|
+
getDataSets(refs) {
|
|
17
|
+
return this.decorated.getDataSets(refs);
|
|
18
|
+
}
|
|
19
|
+
getDataset(ref) {
|
|
20
|
+
return this.decorated.getDataset(ref);
|
|
21
|
+
}
|
|
22
|
+
updateDatasetMeta(dataSet) {
|
|
23
|
+
return this.decorated.updateDatasetMeta(dataSet);
|
|
24
|
+
}
|
|
25
|
+
getDatasetsQuery() {
|
|
26
|
+
return this.decorated.getDatasetsQuery();
|
|
27
|
+
}
|
|
28
|
+
}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { type IExecutionFactory, type IGeoService, type IOrganizationExportTemplatesService, type ISecuritySettingsService, type IWorkspaceAttributesService, type IWorkspaceAutomationService, type IWorkspaceCatalogFactory, type IWorkspaceDashboardsService, type IWorkspaceExportTemplatesService, type IWorkspaceFactsService, type IWorkspaceInsightsService, type IWorkspaceMeasuresService, type IWorkspaceSettingsService } from "@gooddata/sdk-backend-spi";
|
|
1
|
+
import { type IExecutionFactory, type IGeoService, type IOrganizationExportTemplatesService, type ISecuritySettingsService, type IWorkspaceAttributesService, type IWorkspaceAutomationService, type IWorkspaceCatalogFactory, type IWorkspaceDashboardsService, type IWorkspaceDatasetsService, type IWorkspaceExportTemplatesService, type IWorkspaceFactsService, type IWorkspaceInsightsService, type IWorkspaceMeasuresService, type IWorkspaceSettingsService } from "@gooddata/sdk-backend-spi";
|
|
2
2
|
/**
|
|
3
3
|
* @alpha
|
|
4
4
|
*/
|
|
@@ -27,6 +27,10 @@ export type AutomationsDecoratorFactory = (automations: IWorkspaceAutomationServ
|
|
|
27
27
|
* @alpha
|
|
28
28
|
*/
|
|
29
29
|
export type MeasuresDecoratorFactory = (measures: IWorkspaceMeasuresService, workspace: string) => IWorkspaceMeasuresService;
|
|
30
|
+
/**
|
|
31
|
+
* @alpha
|
|
32
|
+
*/
|
|
33
|
+
export type DatasetsDecoratorFactory = (datasets: IWorkspaceDatasetsService, workspace: string) => IWorkspaceDatasetsService;
|
|
30
34
|
/**
|
|
31
35
|
* @alpha
|
|
32
36
|
*/
|
|
@@ -67,6 +71,7 @@ export type DecoratorFactories = {
|
|
|
67
71
|
automations?: AutomationsDecoratorFactory;
|
|
68
72
|
insights?: InsightsDecoratorFactory;
|
|
69
73
|
measures?: MeasuresDecoratorFactory;
|
|
74
|
+
datasets?: DatasetsDecoratorFactory;
|
|
70
75
|
dashboards?: DashboardsDecoratorFactory;
|
|
71
76
|
facts?: FactsDecoratorFactory;
|
|
72
77
|
geo?: GeoDecoratorFactory;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/decoratedBackend/types.ts"],"names":[],"mappings":"AAEA,OAAO,EACH,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,mCAAmC,EACxC,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EAChC,KAAK,2BAA2B,EAChC,KAAK,wBAAwB,EAC7B,KAAK,2BAA2B,EAChC,KAAK,gCAAgC,EACrC,KAAK,sBAAsB,EAC3B,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EAC9B,KAAK,yBAAyB,EACjC,MAAM,2BAA2B,CAAC;AAEnC;;GAEG;AACH,MAAM,MAAM,yBAAyB,GAAG,CAAC,gBAAgB,EAAE,iBAAiB,KAAK,iBAAiB,CAAC;AAEnG;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,OAAO,EAAE,wBAAwB,KAAK,wBAAwB,CAAC;AAEtG;;GAEG;AACH,MAAM,MAAM,gCAAgC,GAAG,CAC3C,gBAAgB,EAAE,wBAAwB,KACzC,wBAAwB,CAAC;AAE9B;;GAEG;AACH,MAAM,MAAM,iCAAiC,GAAG,CAC5C,QAAQ,EAAE,yBAAyB,EACnC,SAAS,EAAE,MAAM,KAChB,yBAAyB,CAAC;AAE/B;;GAEG;AACH,MAAM,MAAM,0BAA0B,GAAG,CACrC,UAAU,EAAE,2BAA2B,EACvC,SAAS,EAAE,MAAM,KAChB,2BAA2B,CAAC;AAEjC;;GAEG;AACH,MAAM,MAAM,2BAA2B,GAAG,CACtC,WAAW,EAAE,2BAA2B,EACxC,SAAS,EAAE,MAAM,KAChB,2BAA2B,CAAC;AAEjC;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG,CACnC,QAAQ,EAAE,yBAAyB,EACnC,SAAS,EAAE,MAAM,KAChB,yBAAyB,CAAC;AAE/B;;GAEG;AACH,MAAM,MAAM,0BAA0B,GAAG,CACrC,UAAU,EAAE,2BAA2B,EACvC,SAAS,EAAE,MAAM,KAChB,2BAA2B,CAAC;AAEjC;;GAEG;AACH,MAAM,MAAM,wBAAwB,GAAG,CACnC,QAAQ,EAAE,yBAAyB,EACnC,SAAS,EAAE,MAAM,KAChB,yBAAyB,CAAC;AAE/B;;GAEG;AACH,MAAM,MAAM,qBAAqB,GAAG,CAChC,KAAK,EAAE,sBAAsB,EAC7B,SAAS,EAAE,MAAM,KAChB,sBAAsB,CAAC;AAE5B;;GAEG;AACH,MAAM,MAAM,mBAAmB,GAAG,CAAC,GAAG,EAAE,WAAW,KAAK,WAAW,CAAC;AAEpE;;GAEG;AACH,MAAM,MAAM,2CAA2C,GAAG,CACtD,eAAe,EAAE,mCAAmC,EACpD,cAAc,EAAE,MAAM,KACrB,mCAAmC,CAAC;AAEzC;;GAEG;AACH,MAAM,MAAM,wCAAwC,GAAG,CACnD,eAAe,EAAE,gCAAgC,EACjD,SAAS,EAAE,MAAM,KAChB,gCAAgC,CAAC;AAEtC;;;;;;GAMG;AACH,MAAM,MAAM,kBAAkB,GAAG;IAC7B,SAAS,CAAC,EAAE,yBAAyB,CAAC;IACtC,OAAO,CAAC,EAAE,uBAAuB,CAAC;IAClC,gBAAgB,CAAC,EAAE,gCAAgC,CAAC;IACpD,iBAAiB,CAAC,EAAE,iCAAiC,CAAC;IACtD,UAAU,CAAC,EAAE,0BAA0B,CAAC;IACxC,WAAW,CAAC,EAAE,2BAA2B,CAAC;IAC1C,QAAQ,CAAC,EAAE,wBAAwB,CAAC;IACpC,QAAQ,CAAC,EAAE,wBAAwB,CAAC;IACpC,UAAU,CAAC,EAAE,0BAA0B,CAAC;IACxC,KAAK,CAAC,EAAE,qBAAqB,CAAC;IAC9B,GAAG,CAAC,EAAE,mBAAmB,CAAC;IAC1B,2BAA2B,CAAC,EAAE,2CAA2C,CAAC;IAC1E,wBAAwB,CAAC,EAAE,wCAAwC,CAAC;CACvE,CAAC"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/decoratedBackend/types.ts"],"names":[],"mappings":"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"}
|
package/esm/index.d.ts
CHANGED
|
@@ -12,7 +12,7 @@ export { type DummyBackendConfig, dummyBackend, dummyBackendEmptyData, dummyData
|
|
|
12
12
|
export { DummySemanticSearchQueryBuilder } from "./dummyBackend/DummySemanticSearch.js";
|
|
13
13
|
export { DummyGenAIChatThread, DummyChatConversations } from "./dummyBackend/DummyGenAIChatThread.js";
|
|
14
14
|
export { decoratedBackend } from "./decoratedBackend/index.js";
|
|
15
|
-
export type { DecoratorFactories, CatalogDecoratorFactory, ExecutionDecoratorFactory, SecuritySettingsDecoratorFactory, WorkspaceSettingsDecoratorFactory, AutomationsDecoratorFactory, AttributesDecoratorFactory, InsightsDecoratorFactory, MeasuresDecoratorFactory, DashboardsDecoratorFactory, FactsDecoratorFactory, GeoDecoratorFactory, OrganizationExportTemplatesDecoratorFactory, WorkspaceExportTemplatesDecoratorFactory, } from "./decoratedBackend/types.js";
|
|
15
|
+
export type { DecoratorFactories, CatalogDecoratorFactory, ExecutionDecoratorFactory, SecuritySettingsDecoratorFactory, WorkspaceSettingsDecoratorFactory, AutomationsDecoratorFactory, AttributesDecoratorFactory, InsightsDecoratorFactory, MeasuresDecoratorFactory, DatasetsDecoratorFactory, DashboardsDecoratorFactory, FactsDecoratorFactory, GeoDecoratorFactory, OrganizationExportTemplatesDecoratorFactory, WorkspaceExportTemplatesDecoratorFactory, } from "./decoratedBackend/types.js";
|
|
16
16
|
export { type PreparedExecutionWrapper, DecoratedExecutionFactory, DecoratedPreparedExecution, DecoratedExecutionResult, } from "./decoratedBackend/execution.js";
|
|
17
17
|
export { DecoratedWorkspaceDashboardsService } from "./decoratedBackend/dashboards.js";
|
|
18
18
|
export { DecoratedWorkspaceInsightsService } from "./decoratedBackend/insights.js";
|
package/esm/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -167,6 +167,7 @@ import { IWorkspaceCatalogAvailableItemsFactory } from '@gooddata/sdk-backend-sp
|
|
|
167
167
|
import { IWorkspaceCatalogFactory } from '@gooddata/sdk-backend-spi';
|
|
168
168
|
import { IWorkspaceCatalogFactoryOptions } from '@gooddata/sdk-backend-spi';
|
|
169
169
|
import { IWorkspaceDashboardsService } from '@gooddata/sdk-backend-spi';
|
|
170
|
+
import { IWorkspaceDatasetsService } from '@gooddata/sdk-backend-spi';
|
|
170
171
|
import { IWorkspaceExportTemplatesService } from '@gooddata/sdk-backend-spi';
|
|
171
172
|
import { IWorkspaceFactsService } from '@gooddata/sdk-backend-spi';
|
|
172
173
|
import { IWorkspaceInsightsService } from '@gooddata/sdk-backend-spi';
|
|
@@ -461,6 +462,10 @@ export declare type CacheControl = {
|
|
|
461
462
|
* Resets all workspace facts caches.
|
|
462
463
|
*/
|
|
463
464
|
resetFacts: () => void;
|
|
465
|
+
/**
|
|
466
|
+
* Resets all workspace dataset caches.
|
|
467
|
+
*/
|
|
468
|
+
resetDatasets: () => void;
|
|
464
469
|
/**
|
|
465
470
|
* Resets all workspace settings caches.
|
|
466
471
|
*/
|
|
@@ -718,6 +723,33 @@ export declare type CachingConfiguration = {
|
|
|
718
723
|
* tweak the `maxMeasuresWorkspaces` value.
|
|
719
724
|
*/
|
|
720
725
|
maxMeasuresPerWorkspace?: number;
|
|
726
|
+
/**
|
|
727
|
+
* Maximum number of workspaces for which to cache selected {@link @gooddata/sdk-backend-spi#IWorkspaceDatasetsService} calls.
|
|
728
|
+
* The workspace identifier is used as cache key.
|
|
729
|
+
* For each workspace, there will be a cache entry holding `maxDatasetsPerWorkspace` entries for dataset metadata reads.
|
|
730
|
+
*
|
|
731
|
+
* When limit is reached, cache entries will be evicted using LRU policy.
|
|
732
|
+
*
|
|
733
|
+
* When no maximum number is specified, the cache will be unbounded and no evictions will happen. Unbounded
|
|
734
|
+
* cache may be OK in applications where number of workspaces is small - the cache will be limited
|
|
735
|
+
* naturally and will not grow uncontrollably.
|
|
736
|
+
*
|
|
737
|
+
* When non-positive number is specified, then no caching will be done.
|
|
738
|
+
*/
|
|
739
|
+
maxDatasetWorkspaces?: number;
|
|
740
|
+
/**
|
|
741
|
+
* Maximum number of datasets to cache per workspace.
|
|
742
|
+
*
|
|
743
|
+
* When limit is reached, cache entries will be evicted using LRU policy.
|
|
744
|
+
*
|
|
745
|
+
* When no maximum number is specified, the cache will be unbounded and no evictions will happen. Unbounded
|
|
746
|
+
* dataset cache may be OK in applications where number of datasets is small and/or they are requested
|
|
747
|
+
* infrequently - the cache will be limited naturally and will not grow uncontrollably.
|
|
748
|
+
*
|
|
749
|
+
* Setting non-positive number here is invalid. If you want to turn off dataset caching,
|
|
750
|
+
* tweak the `maxDatasetWorkspaces` value.
|
|
751
|
+
*/
|
|
752
|
+
maxDatasetsPerWorkspace?: number;
|
|
721
753
|
/**
|
|
722
754
|
* Maximum number of organizations for which to cache organization-level export templates.
|
|
723
755
|
* Organization export templates are organization-level, so typically a single entry suffices.
|
|
@@ -763,6 +795,34 @@ export declare type CachingConfiguration = {
|
|
|
763
795
|
* tweak the `maxAttributeWorkspaces` value.
|
|
764
796
|
*/
|
|
765
797
|
maxAttributesPerWorkspace?: number;
|
|
798
|
+
/**
|
|
799
|
+
* Maximum number of common attribute results to cache per workspace.
|
|
800
|
+
*
|
|
801
|
+
* This bounds the cache used by `getCommonAttributes` and `getCommonAttributesBatch`, keyed by the
|
|
802
|
+
* (order-independent) set of input attribute references.
|
|
803
|
+
*
|
|
804
|
+
* When limit is reached, cache entries will be evicted using LRU policy.
|
|
805
|
+
*
|
|
806
|
+
* When no maximum number is specified, the cache will be unbounded and no evictions will happen.
|
|
807
|
+
*
|
|
808
|
+
* Setting non-positive number here is invalid. If you want to turn off common attribute caching,
|
|
809
|
+
* tweak the `maxAttributeWorkspaces` value.
|
|
810
|
+
*/
|
|
811
|
+
maxCommonAttributesPerWorkspace?: number;
|
|
812
|
+
/**
|
|
813
|
+
* Maximum number of connected attribute results to cache per workspace.
|
|
814
|
+
*
|
|
815
|
+
* This bounds the cache used by `getConnectedAttributesByDisplayForm`, keyed by the display form
|
|
816
|
+
* reference identifier/uri.
|
|
817
|
+
*
|
|
818
|
+
* When limit is reached, cache entries will be evicted using LRU policy.
|
|
819
|
+
*
|
|
820
|
+
* When no maximum number is specified, the cache will be unbounded and no evictions will happen.
|
|
821
|
+
*
|
|
822
|
+
* Setting non-positive number here is invalid. If you want to turn off connected attribute caching,
|
|
823
|
+
* tweak the `maxAttributeWorkspaces` value.
|
|
824
|
+
*/
|
|
825
|
+
maxConnectedAttributesPerWorkspace?: number;
|
|
766
826
|
/**
|
|
767
827
|
* Maximum number of attribute element results to cache per workspace.
|
|
768
828
|
*
|
|
@@ -1065,6 +1125,11 @@ export declare type DataProviderContext = CustomCallContext & {
|
|
|
1065
1125
|
export declare class DataSetMetadataObjectBuilder<T extends IDataSetMetadataObject = IDataSetMetadataObject> extends MetadataObjectBuilder<T> {
|
|
1066
1126
|
}
|
|
1067
1127
|
|
|
1128
|
+
/**
|
|
1129
|
+
* @alpha
|
|
1130
|
+
*/
|
|
1131
|
+
export declare type DatasetsDecoratorFactory = (datasets: IWorkspaceDatasetsService, workspace: string) => IWorkspaceDatasetsService;
|
|
1132
|
+
|
|
1068
1133
|
/**
|
|
1069
1134
|
* Decorated backend is a wrapper of any other backend implementations that can be used to enrich
|
|
1070
1135
|
* functionality of the services that the wrapped backend normally provides.
|
|
@@ -1408,6 +1473,7 @@ export declare type DecoratorFactories = {
|
|
|
1408
1473
|
automations?: AutomationsDecoratorFactory;
|
|
1409
1474
|
insights?: InsightsDecoratorFactory;
|
|
1410
1475
|
measures?: MeasuresDecoratorFactory;
|
|
1476
|
+
datasets?: DatasetsDecoratorFactory;
|
|
1411
1477
|
dashboards?: DashboardsDecoratorFactory;
|
|
1412
1478
|
facts?: FactsDecoratorFactory;
|
|
1413
1479
|
geo?: GeoDecoratorFactory;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gooddata/sdk-backend-base",
|
|
3
|
-
"version": "11.49.0
|
|
3
|
+
"version": "11.49.0",
|
|
4
4
|
"description": "GoodData.UI SDK - Base for backend implementations",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "GoodData",
|
|
@@ -29,9 +29,9 @@
|
|
|
29
29
|
"ts-invariant": "0.10.3",
|
|
30
30
|
"tslib": "2.8.1",
|
|
31
31
|
"uuid": "11.1.1",
|
|
32
|
-
"@gooddata/sdk-backend-spi": "11.49.0
|
|
33
|
-
"@gooddata/sdk-model": "11.49.0
|
|
34
|
-
"@gooddata/util": "11.49.0
|
|
32
|
+
"@gooddata/sdk-backend-spi": "11.49.0",
|
|
33
|
+
"@gooddata/sdk-model": "11.49.0",
|
|
34
|
+
"@gooddata/util": "11.49.0"
|
|
35
35
|
},
|
|
36
36
|
"devDependencies": {
|
|
37
37
|
"@microsoft/api-documenter": "^7.17.0",
|
|
@@ -56,9 +56,9 @@
|
|
|
56
56
|
"oxlint-tsgolint": "0.15.0",
|
|
57
57
|
"typescript": "5.9.3",
|
|
58
58
|
"vitest": "4.1.8",
|
|
59
|
-
"@gooddata/eslint-config": "11.49.0
|
|
60
|
-
"@gooddata/oxlint-config": "11.49.0
|
|
61
|
-
"@gooddata/reference-workspace": "11.49.0
|
|
59
|
+
"@gooddata/eslint-config": "11.49.0",
|
|
60
|
+
"@gooddata/oxlint-config": "11.49.0",
|
|
61
|
+
"@gooddata/reference-workspace": "11.49.0"
|
|
62
62
|
},
|
|
63
63
|
"scripts": {
|
|
64
64
|
"_phase:build": "npm run build",
|