UNPKG

@speckle/shared

Version:

Shared code between various Speckle JS packages

129 lines 3.96 kB
import { uniq, uniqBy } from '#lodash'; export var ViewerResourceType; (function (ViewerResourceType) { ViewerResourceType["Model"] = "Model"; ViewerResourceType["Object"] = "Object"; ViewerResourceType["ModelFolder"] = "ModelFolder"; ViewerResourceType["AllModels"] = "all-models"; })(ViewerResourceType || (ViewerResourceType = {})); export class ViewerAllModelsResource { type = ViewerResourceType.AllModels; toString() { return 'all'; } } export class ViewerModelResource { type; modelId; versionId; constructor(modelId, versionId) { this.type = ViewerResourceType.Model; this.modelId = modelId; this.versionId = versionId; } toString() { return (this.versionId ? `${this.modelId}@${this.versionId}` : this.modelId).toLowerCase(); } } export class ViewerVersionResource extends ViewerModelResource { versionId; constructor(modelId, versionId) { super(modelId, versionId); this.versionId = versionId; } toJSON() { return this.toString(); } } export class ViewerObjectResource { type; objectId; constructor(objectId) { this.type = ViewerResourceType.Object; this.objectId = objectId; } toString() { return this.objectId.toLowerCase(); } } export class ViewerModelFolderResource { type; folderName; constructor(folderName) { this.type = ViewerResourceType.ModelFolder; this.folderName = folderName; } toString() { return ('$' + this.folderName).toLowerCase(); } } export function parseUrlParameters(resourceGetParam) { if (!resourceGetParam?.length) return []; const parts = resourceGetParam.toLowerCase().split(',').sort(); const resources = []; for (const part of parts) { if (part === 'all') { resources.push(new ViewerAllModelsResource()); } else if (part.includes('@')) { const [modelId, versionId] = part.split('@'); resources.push(new ViewerModelResource(modelId, versionId)); } else if (part.startsWith('$')) { resources.push(new ViewerModelFolderResource(part.substring(1))); } else if (part.length === 32) { resources.push(new ViewerObjectResource(part)); } else { resources.push(new ViewerModelResource(part)); } } // Remove duplicates return uniqBy(resources, (r) => r.toString()); } export function createGetParamFromResources(resources) { const resourceParts = uniq(resources.map((r) => r.toString().toLowerCase())).sort(); return resourceParts.join(','); } export const isAllModelsResource = (r) => r.type === ViewerResourceType.AllModels; export const isModelResource = (r) => r.type === ViewerResourceType.Model; export const isObjectResource = (r) => r.type === ViewerResourceType.Object; export const isModelFolderResource = (r) => r.type === ViewerResourceType.ModelFolder; class ViewerResourceBuilder { #resources = []; addAllModels() { this.#resources.push(new ViewerAllModelsResource()); return this; } addModel(modelId, versionId) { this.#resources.push(new ViewerModelResource(modelId, versionId)); return this; } addModelFolder(folderName) { this.#resources.push(new ViewerModelFolderResource(folderName)); return this; } addObject(objectId) { this.#resources.push(new ViewerObjectResource(objectId)); return this; } toString() { return createGetParamFromResources(this.#resources); } toResources() { return this.#resources.slice(); } clear() { this.#resources = []; return this; } } /** * Fluent API for easier resource building */ export function resourceBuilder() { return new ViewerResourceBuilder(); } //# sourceMappingURL=route.js.map