@speckle/shared
Version:
Shared code between various Speckle JS packages
255 lines • 8.41 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.isModelFolderResource = exports.isObjectResource = exports.isModelResource = exports.isAllModelsResource = exports.parseResourceFromString = exports.ViewerModelFolderResource = exports.ViewerObjectResource = exports.ViewerVersionResource = exports.ViewerModelResource = exports.ViewerAllModelsResource = exports.ViewerResourceType = void 0;
exports.parseUrlParameters = parseUrlParameters;
exports.createGetParamFromResources = createGetParamFromResources;
exports.resourceBuilder = resourceBuilder;
const _lodash_1 = require("#lodash");
exports.ViewerResourceType = {
Model: 'Model',
Object: 'Object',
ModelFolder: 'ModelFolder',
AllModels: 'all-models'
};
class ViewerAllModelsResource {
type = exports.ViewerResourceType.AllModels;
toString() {
return 'all';
}
}
exports.ViewerAllModelsResource = ViewerAllModelsResource;
class ViewerModelResource {
type;
modelId;
versionId;
constructor(modelId, versionId) {
this.type = exports.ViewerResourceType.Model;
this.modelId = modelId.toLowerCase();
this.versionId = versionId?.toLowerCase();
}
toString() {
return (this.versionId ? `${this.modelId}@${this.versionId}` : this.modelId).toLowerCase();
}
}
exports.ViewerModelResource = ViewerModelResource;
class ViewerVersionResource extends ViewerModelResource {
versionId;
constructor(modelId, versionId) {
super(modelId, versionId);
this.versionId = versionId?.toLowerCase();
}
toJSON() {
return this.toString();
}
}
exports.ViewerVersionResource = ViewerVersionResource;
class ViewerObjectResource {
type;
objectId;
constructor(objectId) {
this.type = exports.ViewerResourceType.Object;
this.objectId = objectId.toLowerCase();
}
toString() {
return this.objectId.toLowerCase();
}
}
exports.ViewerObjectResource = ViewerObjectResource;
class ViewerModelFolderResource {
type;
folderName;
constructor(folderName) {
this.type = exports.ViewerResourceType.ModelFolder;
this.folderName = folderName;
}
toString() {
return '$' + this.folderName;
}
}
exports.ViewerModelFolderResource = ViewerModelFolderResource;
const parseResourceFromString = (resourceId) => {
if (resourceId === 'all') {
return new ViewerAllModelsResource();
}
else if (resourceId.includes('@')) {
const [modelId, versionId] = resourceId.split('@');
return new ViewerVersionResource(modelId, versionId);
}
else if (resourceId.startsWith('$')) {
return new ViewerModelFolderResource(resourceId.substring(1));
}
else if (resourceId.length === 32) {
return new ViewerObjectResource(resourceId);
}
else {
return new ViewerModelResource(resourceId);
}
};
exports.parseResourceFromString = parseResourceFromString;
function parseUrlParameters(resourceGetParam) {
if (!resourceGetParam?.length)
return [];
const parts = resourceGetParam
.split(',')
.filter((i) => i.trim().length)
.sort();
const resources = [];
for (const part of parts) {
const resource = (0, exports.parseResourceFromString)(part);
if (resource) {
resources.push(resource);
}
}
// Remove duplicates
return (0, _lodash_1.uniqBy)(resources, (r) => r.toString());
}
function createGetParamFromResources(resources) {
const resourceParts = (0, _lodash_1.uniq)(resources.map((r) => r.toString())).sort();
return resourceParts.join(',');
}
const isAllModelsResource = (r) => r.type === exports.ViewerResourceType.AllModels;
exports.isAllModelsResource = isAllModelsResource;
const isModelResource = (r) => r.type === exports.ViewerResourceType.Model;
exports.isModelResource = isModelResource;
const isObjectResource = (r) => r.type === exports.ViewerResourceType.Object;
exports.isObjectResource = isObjectResource;
const isModelFolderResource = (r) => r.type === exports.ViewerResourceType.ModelFolder;
exports.isModelFolderResource = isModelFolderResource;
const toViewerResourceArray = (res) => {
if (res instanceof ViewerResourceBuilder) {
return res.toResources();
}
const fixString = (r) => (0, _lodash_1.isString)(r) ? parseUrlParameters(r) : [r];
if (Array.isArray(res)) {
return res.flatMap(fixString);
}
else {
return fixString(res);
}
};
class ViewerResourceBuilder {
#resources = [];
#order() {
this.#resources = (0, _lodash_1.uniq)(this.#resources).sort();
}
addAllModels() {
this.#resources.push(new ViewerAllModelsResource());
this.#order();
return this;
}
addModel(modelId, versionId) {
this.#resources.push(new ViewerModelResource(modelId, versionId));
this.#order();
return this;
}
addModelFolder(folderName) {
this.#resources.push(new ViewerModelFolderResource(folderName));
this.#order();
return this;
}
addObject(objectId) {
this.#resources.push(new ViewerObjectResource(objectId));
this.#order();
return this;
}
/**
* @deprecated Use 'addResources' or 'addNew' instead
*/
addFromString(stringResources) {
const strings = Array.isArray(stringResources) ? stringResources : [stringResources];
for (const resourceIdString of strings) {
const resources = parseUrlParameters(resourceIdString.toLowerCase());
this.#resources.push(...resources);
}
this.#order();
return this;
}
addResources(res) {
this.#resources.push(...toViewerResourceArray(res));
this.#order();
return this;
}
/**
* Only add those resources that are not already in the builder.
*/
addNew(incoming, options) {
const { requireExactMatch = false } = options || {};
const resources = toViewerResourceArray(incoming);
const newResources = this.#resources.slice();
for (const resource of resources) {
// check if newResources has a resource w/ same modelId (check w/ isModelResource)
if ((0, exports.isModelResource)(resource) && !requireExactMatch) {
const existing = newResources.find((r) => (0, exports.isModelResource)(r) && r.modelId === resource.modelId);
if (!existing) {
newResources.push(resource);
}
}
else if (!newResources.some((r) => r.toString() === resource.toString())) {
newResources.push(resource);
}
}
this.#resources = newResources;
this.#order();
return this;
}
toString() {
return createGetParamFromResources(this.#resources);
}
toResources() {
return this.#resources.slice();
}
toResourceIds() {
return this.toResources().map((r) => r.toString());
}
clear() {
this.#resources = [];
return this;
}
clone() {
const clone = new ViewerResourceBuilder();
const resources = this.toString();
clone.addResources(resources);
return clone;
}
get length() {
return this.#resources.length;
}
/**
* Remove specified versionIds from any model resources
*/
clearVersions() {
this.#resources.forEach((r) => {
if (!(0, exports.isModelResource)(r))
return;
r.versionId = undefined;
});
return this;
}
isEqualTo(resource) {
const incomingBuilder = resourceBuilder().addResources(resource);
return this.toString() === incomingBuilder.toString();
}
forEach(callback) {
this.#resources.forEach(callback);
return this;
}
filter(callback) {
return this.#resources.filter(callback);
}
find(callback) {
return this.#resources.find(callback);
}
map(callback) {
return this.#resources.map(callback);
}
[Symbol.iterator]() {
return this.#resources[Symbol.iterator]();
}
}
/**
* Fluent API for easier resource building
*/
function resourceBuilder() {
return new ViewerResourceBuilder();
}
//# sourceMappingURL=route.js.map