Next.js website for Rocky Mountain Vending company featuring: - Product catalog with Stripe integration - Service areas and parts pages - Admin dashboard with Clerk authentication - SEO optimized pages with JSON-LD structured data Co-authored-by: Cursor <cursoragent@cursor.com>
95 lines
No EOL
2.9 KiB
Text
95 lines
No EOL
2.9 KiB
Text
"use strict";
|
|
/**
|
|
* @license
|
|
* Copyright 2022 Google Inc.
|
|
* SPDX-License-Identifier: Apache-2.0
|
|
*/
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.FrameTree = void 0;
|
|
const Deferred_js_1 = require("../util/Deferred.js");
|
|
/**
|
|
* Keeps track of the page frame tree and it's is managed by
|
|
* {@link FrameManager}. FrameTree uses frame IDs to reference frame and it
|
|
* means that referenced frames might not be in the tree anymore. Thus, the tree
|
|
* structure is eventually consistent.
|
|
* @internal
|
|
*/
|
|
class FrameTree {
|
|
#frames = new Map();
|
|
// frameID -> parentFrameID
|
|
#parentIds = new Map();
|
|
// frameID -> childFrameIDs
|
|
#childIds = new Map();
|
|
#mainFrame;
|
|
#isMainFrameStale = false;
|
|
#waitRequests = new Map();
|
|
getMainFrame() {
|
|
return this.#mainFrame;
|
|
}
|
|
getById(frameId) {
|
|
return this.#frames.get(frameId);
|
|
}
|
|
/**
|
|
* Returns a promise that is resolved once the frame with
|
|
* the given ID is added to the tree.
|
|
*/
|
|
waitForFrame(frameId) {
|
|
const frame = this.getById(frameId);
|
|
if (frame) {
|
|
return Promise.resolve(frame);
|
|
}
|
|
const deferred = Deferred_js_1.Deferred.create();
|
|
const callbacks = this.#waitRequests.get(frameId) || new Set();
|
|
callbacks.add(deferred);
|
|
return deferred.valueOrThrow();
|
|
}
|
|
frames() {
|
|
return Array.from(this.#frames.values());
|
|
}
|
|
addFrame(frame) {
|
|
this.#frames.set(frame._id, frame);
|
|
if (frame._parentId) {
|
|
this.#parentIds.set(frame._id, frame._parentId);
|
|
if (!this.#childIds.has(frame._parentId)) {
|
|
this.#childIds.set(frame._parentId, new Set());
|
|
}
|
|
this.#childIds.get(frame._parentId).add(frame._id);
|
|
}
|
|
else if (!this.#mainFrame || this.#isMainFrameStale) {
|
|
this.#mainFrame = frame;
|
|
this.#isMainFrameStale = false;
|
|
}
|
|
this.#waitRequests.get(frame._id)?.forEach(request => {
|
|
return request.resolve(frame);
|
|
});
|
|
}
|
|
removeFrame(frame) {
|
|
this.#frames.delete(frame._id);
|
|
this.#parentIds.delete(frame._id);
|
|
if (frame._parentId) {
|
|
this.#childIds.get(frame._parentId)?.delete(frame._id);
|
|
}
|
|
else {
|
|
this.#isMainFrameStale = true;
|
|
}
|
|
}
|
|
childFrames(frameId) {
|
|
const childIds = this.#childIds.get(frameId);
|
|
if (!childIds) {
|
|
return [];
|
|
}
|
|
return Array.from(childIds)
|
|
.map(id => {
|
|
return this.getById(id);
|
|
})
|
|
.filter((frame) => {
|
|
return frame !== undefined;
|
|
});
|
|
}
|
|
parentFrame(frameId) {
|
|
const parentId = this.#parentIds.get(frameId);
|
|
return parentId ? this.getById(parentId) : undefined;
|
|
}
|
|
}
|
|
exports.FrameTree = FrameTree;
|
|
//# sourceMappingURL=FrameTree.js.map |