@speckle/shared
Version:
Shared code between various Speckle JS packages
129 lines • 3.96 kB
JavaScript
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