summaryrefslogtreecommitdiff
path: root/node_modules/swup/src/modules/Cache.ts
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/swup/src/modules/Cache.ts')
-rwxr-xr-xnode_modules/swup/src/modules/Cache.ts87
1 files changed, 87 insertions, 0 deletions
diff --git a/node_modules/swup/src/modules/Cache.ts b/node_modules/swup/src/modules/Cache.ts
new file mode 100755
index 00000000..913e10a9
--- /dev/null
+++ b/node_modules/swup/src/modules/Cache.ts
@@ -0,0 +1,87 @@
+import type Swup from '../Swup.js';
+import { Location } from '../helpers.js';
+import { type PageData } from './fetchPage.js';
+
+export interface CacheData extends PageData {}
+
+/**
+ * In-memory page cache.
+ */
+export class Cache {
+ /** Swup instance this cache belongs to */
+ protected swup: Swup;
+
+ /** Cached pages, indexed by URL */
+ protected pages: Map<string, CacheData> = new Map();
+
+ constructor(swup: Swup) {
+ this.swup = swup;
+ }
+
+ /** Number of cached pages in memory. */
+ get size(): number {
+ return this.pages.size;
+ }
+
+ /** All cached pages. */
+ get all() {
+ const copy = new Map();
+ this.pages.forEach((page, key) => {
+ copy.set(key, { ...page });
+ });
+ return copy;
+ }
+
+ /** Check if the given URL has been cached. */
+ has(url: string): boolean {
+ return this.pages.has(this.resolve(url));
+ }
+
+ /** Return a shallow copy of the cached page object if available. */
+ get(url: string): CacheData | undefined {
+ const result = this.pages.get(this.resolve(url));
+ if (!result) return result;
+ return { ...result };
+ }
+
+ /** Create a cache record for the specified URL. */
+ set(url: string, page: CacheData) {
+ url = this.resolve(url);
+ page = { ...page, url };
+ this.pages.set(url, page);
+ this.swup.hooks.callSync('cache:set', undefined, { page });
+ }
+
+ /** Update a cache record, overwriting or adding custom data. */
+ update(url: string, payload: object) {
+ url = this.resolve(url);
+ const page = { ...this.get(url), ...payload, url } as CacheData;
+ this.pages.set(url, page);
+ }
+
+ /** Delete a cache record. */
+ delete(url: string): void {
+ this.pages.delete(this.resolve(url));
+ }
+
+ /** Empty the cache. */
+ clear(): void {
+ this.pages.clear();
+ this.swup.hooks.callSync('cache:clear', undefined, undefined);
+ }
+
+ /** Remove all cache entries that return true for a given predicate function. */
+ prune(predicate: (url: string, page: CacheData) => boolean): void {
+ this.pages.forEach((page, url) => {
+ if (predicate(url, page)) {
+ this.delete(url);
+ }
+ });
+ }
+
+ /** Resolve URLs by making them local and letting swup resolve them. */
+ protected resolve(urlToResolve: string): string {
+ const { url } = Location.fromUrl(urlToResolve);
+ return this.swup.resolveUrl(url);
+ }
+}