diff --git a/lib/common/JSONImporter/Importer.ts b/lib/common/JSONImporter/Importer.ts index 275080e..b0054e6 100644 --- a/lib/common/JSONImporter/Importer.ts +++ b/lib/common/JSONImporter/Importer.ts @@ -1,23 +1,69 @@ import { Exporter } from './Exporter'; import { NodeSelections, NodeSelector } from './NodeSelectors'; -import { assert, partition, setNested } from './Utils'; +import { partition, NodeSearchUtils } from './Utils'; import { NodeChangeSet } from './NodeChangeSet'; import { OmittedProperties } from './OmittedProperties'; import { gmeDiff } from './SortedChanges'; -import diff from 'changeset'; import NodeState from './NodeState'; import { ChangeType } from 'changeset'; +import { + NodeStatePatch, + AttributesPatch, + AttributeMetaPatch, + PointersPatch, + GuidPatch, + MixinsPatch, + PointerMetaPatch, + SetsPatch, + MemberAttributesPatch, + MemberRegistryPatch, + RegistryPatch, + ChildrenPatch, + ChildrenMetaPatch, +} from './NodeStatePatch'; export class Importer { _nodeIDCounter: number = 1; core: GmeClasses.Core; rootNode: Core.Node; exporter: Exporter; + searchUtils: NodeSearchUtils; + patchers: { + [key in Exclude< + keyof NodeState, + 'id' | 'path' | 'alias' + >]: NodeStatePatch; + }; constructor(core: GmeClasses.Core, rootNode: Core.Node) { this.core = core; this.rootNode = rootNode; this.exporter = new Exporter(this.core, this.rootNode); + this.searchUtils = new NodeSearchUtils(this.core, this.rootNode); + this.patchers = { + attributes: new AttributesPatch(this.core, this.searchUtils), + attribute_meta: new AttributeMetaPatch(this.core, this.searchUtils), + pointers: new PointersPatch(this.core, this.searchUtils), + pointer_meta: new PointerMetaPatch(this.core, this.searchUtils), + guid: new GuidPatch(this.core, this.searchUtils), + mixins: new MixinsPatch(this.core, this.searchUtils), + sets: new SetsPatch(this.core, this.searchUtils), + member_attributes: new MemberAttributesPatch( + this.core, + this.searchUtils + ), + member_registry: new MemberRegistryPatch( + this.core, + this.searchUtils + ), + registry: new RegistryPatch(this.core, this.searchUtils), + children: new ChildrenPatch(this.core, this.searchUtils, this), + children_meta: new ChildrenMetaPatch(this.core, this.searchUtils), + }; + } + + getPatcher(key: keyof NodeState): NodeStatePatch | undefined { + return this.patchers[key]; } async toJSON( @@ -304,45 +350,6 @@ export class Importer { ); } - async findNode(parent, idString, resolvedSelectors = new NodeSelections()) { - if (idString === undefined) { - return; - } - assert( - typeof idString === 'string', - `Expected ID to be a string but found ${JSON.stringify(idString)}` - ); - - const parentId = this.core.getPath(parent); - const selector = new NodeSelector(idString); - const resolved = resolvedSelectors.get(parentId, selector); - if (resolved) { - return resolved; - } - - return await selector.findNode( - this.core, - this.rootNode, - parent, - resolvedSelectors.cache - ); - } - - async getNode(parent, idString, resolvedSelectors) { - const node = await this.findNode(parent, idString, resolvedSelectors); - if (!node) { - throw new Error( - `Could not resolve ${idString} to an existing node.` - ); - } - return node; - } - - async getNodeId(parent, id, resolvedSelectors) { - const node = await this.getNode(parent, id, resolvedSelectors); - return this.core.getPath(node); - } - async createNode(parent, state = {}, base) { if (!state.id) { state.id = `@internal:${this._nodeIDCounter++}`; @@ -379,7 +386,9 @@ export class Importer { created, new OmittedProperties(['children']) ); - const changes = gmeDiff(nodeState, state); + const changes = gmeDiff(nodeState, state).map((change) => + NodeChangeSet.fromChangeSet(parentPath, state.id, change) + ); await Promise.all( changes.map(async (change) => { await this._put(created, change, resolvedSelectors); @@ -398,23 +407,33 @@ export class Importer { return created; } - async _put(node, change) { + async _put(node, change, resolvedSelectors: NodeSelections) { const [type] = change.key; if (type !== 'path' && type !== 'id') { - if (!this._put[type]) { - throw new Error(`Unrecognized key ${type}`); + const patcher = this.getPatcher(type); + if (patcher) { + const result = await patcher.put( + node, + change, + resolvedSelectors + ); + return result.unwrap(); } - return await this._put[type].call(this, ...arguments); } } - async _delete(node, change) { + async _delete(node, change, resolvedSelectors: NodeSelections) { const [type] = change.key; if (change.key.length > 1 || type === 'children') { - if (!this._delete[type]) { - throw new Error(`Unrecognized key ${type}`); + const patcher = this.getPatcher(type); + if (patcher) { + const result = await patcher.delete( + node, + change, + resolvedSelectors + ); + return result.unwrap(); } - return await this._delete[type].call(this, ...arguments); } } @@ -423,434 +442,28 @@ export class Importer { await this.apply(node, state); return node; } -} - -Importer.prototype._put.children = async function ( - node, - change, - resolvedSelectors -) { - const created = await this.createStateSubTree( - change.parentPath, - change.value, - resolvedSelectors - ); - return created; -}; - -Importer.prototype._delete.children = async function ( - node /*change, resolvedSelectors*/ -) { - this.core.deleteNode(node); -}; - -Importer.prototype._put.guid = async function ( - node, - change, - resolvedSelectors -) { - const { value } = change; - this.core.setGuid(node, value); -}; - -Importer.prototype._put.mixins = async function ( - node, - change, - resolvedSelectors -) { - const [, index] = change.key; - const oldMixinPath = this.core.getMixinPaths(node)[index]; - if (oldMixinPath) { - this.core.delMixin(node, oldMixinPath); - } - const mixinId = change.value; - const mixinPath = await this.getNodeId(node, mixinId, resolvedSelectors); - const canSet = this.core.canSetAsMixin(node, mixinPath); - if (canSet.isOk) { - this.core.addMixin(node, mixinPath); - } else { - throw new Error( - `Cannot set ${mixinId} as mixin for ${this.core.getPath(node)}: ${ - canSet.reason - }` + async getNode( + parent: Core.Node, + idString: string, + resolvedSelectors: NodeSelections = new NodeSelections() + ): Promise { + return await this.searchUtils.getNode( + parent, + idString, + resolvedSelectors ); } -}; - -Importer.prototype._put.attributes = function (node, change) { - assert( - change.key.length === 2, - `Complex attributes not currently supported: ${change.key.join(', ')}` - ); - const [, /*type*/ name] = change.key; - this.core.setAttribute(node, name, change.value || ''); -}; - -Importer.prototype._delete.attributes = function (node, change) { - assert( - change.key.length === 2, - `Complex attributes not currently supported: ${change.key.join(', ')}` - ); - const [, /*type*/ name] = change.key; - this.core.delAttribute(node, name); -}; - -Importer.prototype._put.attribute_meta = function (node, change) { - const [, /*type*/ name] = change.key; - const keys = change.key.slice(2); - if (keys.length) { - const value = this.core.getAttributeMeta(node, name); - setNested(value, keys, change.value); - this.core.setAttributeMeta(node, name, value); - } else { - this.core.setAttributeMeta(node, name, change.value); - } -}; - -Importer.prototype._delete.attribute_meta = function (node, change) { - const isAttrDeletion = change.key.length === 2; - const [, /*type*/ name] = change.key; - if (isAttrDeletion) { - this.core.delAttributeMeta(node, name); - } else { - const meta = this.core.getAttributeMeta(node, name); - const metaChange = { type: 'del', key: change.key.slice(2) }; - const newMeta = diff.apply([metaChange], meta); - this.core.setAttributeMeta(node, name, newMeta); - } -}; - -Importer.prototype._put.pointers = async function ( - node, - change, - resolvedSelectors -) { - assert( - change.key.length === 2, - `Invalid key for pointer: ${change.key.slice(1).join(', ')}` - ); - const [, /*type*/ name] = change.key; - let target = null; - let targetPath = null; - if (change.value !== null) { - target = - change.value !== null - ? await this.getNode(node, change.value, resolvedSelectors) - : null; - targetPath = this.core.getPath(target); - } - const hasChanged = targetPath !== this.core.getPointerPath(node, name); - if (hasChanged) { - this.core.setPointer(node, name, target); - } -}; - -Importer.prototype._delete.pointers = function (node, change) { - assert( - change.key.length === 2, - `Invalid key for pointer: ${change.key.slice(1).join(', ')}` - ); - const [, /*type*/ name] = change.key; - this.core.delPointer(node, name); -}; - -Importer.prototype._put.pointer_meta = async function ( - node, - change, - resolvedSelectors -) { - const [, /*"pointer_meta"*/ name, idOrMinMax] = change.key; - const isNewPointer = change.key.length === 2; - - if (isNewPointer) { - const meta = change.value; - this.core.setPointerMetaLimits(node, name, meta.min, meta.max); - - const targets = Object.entries(change.value).filter((pair) => { - const [key /*value*/] = pair; - return !['min', 'max'].includes(key); - }); - for (let i = targets.length; i--; ) { - const [nodeId, meta] = targets[i]; - const target = await this.getNode(node, nodeId, resolvedSelectors); - this.core.setPointerMetaTarget( - node, - name, - target, - meta.min, - meta.max - ); - } - } else if (['min', 'max'].includes(idOrMinMax)) { - const meta = this.core.getPointerMeta(node, name); - meta[idOrMinMax] = change.value; - this.core.setPointerMetaLimits(node, name, meta.min, meta.max); - } else { - const meta = this.core.getPointerMeta(node, name); - const target = await this.getNode(node, idOrMinMax, resolvedSelectors); - const gmeId = await this.core.getPath(target); - const keys = change.key.slice(2); - keys[0] = gmeId; - setNested(meta, keys, change.value); - - const targetMeta = meta[gmeId]; - this.core.setPointerMetaTarget( - node, - name, - target, - targetMeta.min, - targetMeta.max - ); - } -}; - -Importer.prototype._delete.pointer_meta = async function ( - node, - change, - resolvedSelectors -) { - const [, /*type*/ name, targetId] = change.key; - const removePointer = targetId === undefined; - if (removePointer) { - this.core.delPointerMeta(node, name); - } else { - const gmeId = await this.getNodeId(node, targetId, resolvedSelectors); - this.core.delPointerMetaTarget(node, name, gmeId); - } -}; - -Importer.prototype._delete.mixins = async function ( - node, - change, - resolvedSelectors -) { - const [, index] = change.key; - const mixinPath = this.core.getMixinPaths(node)[index]; - this.core.delMixin(node, mixinPath); -}; - -Importer.prototype._put.children_meta = async function ( - node, - change, - resolvedSelectors -) { - const [, /*"children_meta"*/ idOrUndef] = change.key; - const isAddingContainment = !idOrUndef; - const isNewChildDefinition = typeof idOrUndef === 'string'; - if (isAddingContainment) { - const { min, max } = change.value; - this.core.setChildrenMetaLimits(node, min, max); - const childEntries = Object.entries(change.value).filter( - (pair) => !['min', 'max'].includes(pair[0]) - ); - for (let i = 0; i < childEntries.length; i++) { - const [nodeId, { min, max }] = childEntries[i]; - const childNode = await this.getNode( - node, - nodeId, - resolvedSelectors - ); - this.core.setChildMeta(node, childNode, min, max); - } - } else if (isNewChildDefinition) { - const nodeId = idOrUndef; - const { min, max } = change.value; - const childNode = await this.getNode(node, nodeId, resolvedSelectors); - this.core.setChildMeta(node, childNode, min, max); - } -}; - -Importer.prototype._delete.children_meta = async function ( - node, - change, - resolvedSelectors -) { - const [, /*"children_meta"*/ idOrMinMax] = change.key; - const isNodeId = !['min', 'max'].includes(idOrMinMax); - if (isNodeId) { - const gmeId = await this.getNodeId(node, idOrMinMax, resolvedSelectors); - this.core.delChildMeta(node, gmeId); - } -}; - -Importer.prototype._put.sets = async function ( - node, - change, - resolvedSelectors -) { - const [, /*type*/ name] = change.key; - const isNewSet = change.key.length === 2; - if (isNewSet) { - this.core.createSet(node, name); - const memberPaths = change.value; - - for (let i = 0; i < memberPaths.length; i++) { - const member = await this.getNode( - node, - memberPaths[i], - resolvedSelectors - ); - this.core.addMember(node, name, member); - } - } else { - const member = await this.getNode( - node, - change.value, + async findNode( + parent: Core.Node, + idString: string, + resolvedSelectors: NodeSelections = new NodeSelections() + ): Promise { + return await this.searchUtils.findNode( + parent, + idString, resolvedSelectors ); - this.core.addMember(node, name, member); - } -}; - -Importer.prototype._delete.sets = async function (node, change) { - const [, /*type*/ name, index] = change.key; - const removeSet = index === undefined; - if (removeSet) { - this.core.delSet(node, name); - } else { - const member = this.core.getMemberPaths(node, name)[index]; - this.core.delMember(node, name, member); } -}; - -Importer.prototype._put.member_attributes = async function ( - node, - change, - resolvedSelectors -) { - const [, /*type*/ set, nodeId, name] = change.key; - const isNewSet = nodeId === undefined; - const isNewMember = name === undefined; - if (isNewSet || isNewMember) { - const changesets = Object.entries(change.value).map((entry) => ({ - type: 'put', - key: change.key.concat([entry[0]]), - value: entry[1], - })); - - for (let i = changesets.length; i--; ) { - await this._put(node, changesets[i], resolvedSelectors); - } - } else { - const gmeId = await this.getNodeId(node, nodeId, resolvedSelectors); - this.core.setMemberAttribute(node, set, gmeId, name, change.value); - } -}; - -Importer.prototype._delete.member_attributes = async function ( - node, - change, - resolvedSelectors -) { - const [, /*type*/ set, nodeId, name] = change.key; - const gmeId = await this.getNodeId(node, nodeId, resolvedSelectors); - const deleteAllAttributes = name === undefined; - const isMember = this.core.getMemberPaths(node, set).includes(gmeId); - - if (isMember) { - const attributeNames = deleteAllAttributes - ? this.core.getMemberAttributeNames(node, set, gmeId) - : [name]; - - attributeNames.forEach((name) => { - this.core.delMemberAttribute(node, set, gmeId, name); - }); - } else { - if (!deleteAllAttributes) { - const member = await this.core.loadByPath(this.rootNode, gmeId); - const memberName = this.core.getAttribute(member, 'name'); - const memberDisplay = `${memberName} (${gmeId})`; - - throw new Error( - `Cannot delete partial member attributes for ${memberDisplay}` - ); - } - } -}; - -Importer.prototype._put.member_registry = async function ( - node, - change, - resolvedSelectors -) { - const [, /*type*/ set, nodeId, name] = change.key; - const isNewSet = nodeId === undefined; - const isNewMember = name === undefined; - if (isNewSet || isNewMember) { - const changesets = Object.entries(change.value).map((entry) => ({ - type: 'put', - key: change.key.concat([entry[0]]), - value: entry[1], - })); - - for (let i = changesets.length; i--; ) { - await this._put(node, changesets[i], resolvedSelectors); - } - } else { - const gmeId = await this.getNodeId(node, nodeId, resolvedSelectors); - const isNested = change.key.length > 4; - if (isNested) { - const value = this.core.getMemberRegistry(node, set, gmeId, name); - setNested(value, change.key.slice(4), change.value); - this.core.setMemberRegistry(node, set, gmeId, name, value); - } else { - this.core.setMemberRegistry(node, set, gmeId, name, change.value); - } - } -}; - -Importer.prototype._delete.member_registry = async function ( - node, - change, - resolvedSelectors -) { - const [, /*type*/ set, nodeId, name] = change.key; - const gmeId = await this.getNodeId(node, nodeId, resolvedSelectors); - const deleteAllRegistryValues = name === undefined; - const isMember = this.core.getMemberPaths(node, set).includes(gmeId); - - if (isMember) { - const attributeNames = deleteAllRegistryValues - ? this.core.getMemberRegistryNames(node, set, gmeId) - : [name]; - - attributeNames.forEach((name) => { - this.core.delMemberRegistry(node, set, gmeId, name); - }); - } else { - if (!deleteAllRegistryValues) { - const member = await this.core.loadByPath(this.rootNode, gmeId); - const memberName = this.core.getAttribute(member, 'name'); - const memberDisplay = `${memberName} (${gmeId})`; - - throw new Error( - `Cannot delete partial member registry values for ${memberDisplay}` - ); - } - } -}; - -Importer.prototype._put.registry = function (node, change) { - const [, /*type*/ name] = change.key; - const keys = change.key.slice(2); - if (keys.length) { - const value = this.core.getRegistry(node, name); - setNested(value, keys, change.value); - this.core.setRegistry(node, name, value); - } else { - this.core.setRegistry(node, name, change.value); - } -}; - -Importer.prototype._delete.registry = function (node, change) { - assert( - change.key.length === 2, - `Complex registry values not currently supported: ${change.key.join( - ', ' - )}` - ); - const [, /*type*/ name] = change.key; - this.core.delRegistry(node, name); -}; +} diff --git a/lib/common/JSONImporter/NodeChangeSet.ts b/lib/common/JSONImporter/NodeChangeSet.ts index 1158961..d9d4dcc 100644 --- a/lib/common/JSONImporter/NodeChangeSet.ts +++ b/lib/common/JSONImporter/NodeChangeSet.ts @@ -1,6 +1,7 @@ import { ChangeSet, ChangeType } from 'changeset'; export type NodeChangeSetType = ChangeType; + export class NodeChangeSet implements ChangeSet { parentPath: string; nodeId: string; diff --git a/lib/common/JSONImporter/NodeStatePatch.ts b/lib/common/JSONImporter/NodeStatePatch.ts new file mode 100644 index 0000000..54862cf --- /dev/null +++ b/lib/common/JSONImporter/NodeStatePatch.ts @@ -0,0 +1,744 @@ +import { NodeSelections } from './NodeSelectors'; +import { NodeChangeSet } from './NodeChangeSet'; +import { NodeSearchUtils, setNested } from './Utils'; +import { Ok, Err } from 'ts-monads'; +import { Result } from 'ts-monads/lib/Result'; +import diff, { ChangeSet, ChangeType } from 'changeset'; +import JSONImporter from '../JSONImporter'; +import NodeState from './NodeState'; + +type PatchResultType = Result; +type PatchResultPromise = Promise; +type PatchFunction = ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections +) => Promise; + +class PatchInfo { + nodeId: GmeCommon.Path; + nodeGuid: Core.GUID; + target: keyof NodeState; + appliedPatch: ChangeSet; + + constructor( + nodeId: GmeCommon.Path, + nodeGuid: Core.GUID, + target: keyof NodeState, + appliedPatch: ChangeSet + ) { + this.nodeGuid = nodeGuid; + this.nodeId = nodeId; + this.target = target; + this.appliedPatch = appliedPatch; + } + + static create( + core: GmeClasses.Core, + node: Core.Node, + nodeChangeSet: NodeChangeSet + ) { + const nodeGuid = core.getGuid(node); + const nodePath = core.getPath(node); + const [target] = nodeChangeSet.key as keyof NodeState; + + const { key, type, value } = nodeChangeSet; + + return new PatchInfo(nodePath, nodeGuid, target, { key, type, value }); + } +} + +export class PatchError extends Error { + constructor(msg: string) { + super(msg); + } +} + +export interface PatchOperation { + core: GmeClasses.Core; + put: ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ) => PatchResultPromise; + delete: ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ) => PatchResultPromise; +} + +export abstract class NodeStatePatch implements PatchOperation { + core: GmeClasses.Core; + nodeSearchUtils: NodeSearchUtils; + + constructor(core: GmeClasses.Core, nodeSearchUtils: NodeSearchUtils) { + this.core = core; + this.nodeSearchUtils = nodeSearchUtils; + } + + hasValidKeyLength(change) { + return change.key.length === 2; + } + + async put( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): PatchResultPromise { + return ( + await this._validChangePut(change).mapAsync( + async (validChange) => + await this._put(node, change, resolvedSelectors) + ) + ).map((res) => this.createPatchInfo(node, change)); + } + + async delete( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): PatchResultPromise { + return ( + await this._validChangeDelete(change).mapAsync( + async (validChange) => + await this._delete(node, change, resolvedSelectors) + ) + ).map((res) => this.createPatchInfo(node, change)); + } + + async createPatchInfo(node, change) { + const [target] = change.key; + if (target === 'children') { + const node = await this.core.loadByPath( + this.nodeSearchUtils.getRoot(), + change.parentPath + ); + return PatchInfo.create(this.core, node, change); + } + return PatchInfo.create(this.core, node, change); + } + + _validChangePut( + change: NodeChangeSet + ): Ok | Err { + return new Ok(change); // override this as needed in child classes + } + + _validChangeDelete( + change: NodeChangeSet + ): Ok | Err { + return new Ok(change); // override this as needed in child classes + } + + abstract _delete: PatchFunction; + abstract _put: PatchFunction; +} + +export class AttributesPatch extends NodeStatePatch { + _validChangePut( + change: NodeChangeSet + ): Ok | Err { + if (change.key.length === 2) { + return new Ok(change); + } + const msg = `Complex attributes not currently supported: ${change.key.join( + ', ' + )}`; + return new Err(new PatchError(msg)); + } + + _put = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + const [, /*type*/ name] = change.key; + this.core.setAttribute(node, name, change.value || ''); + }; + + _delete = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + const [, /*type*/ name] = change.key; + this.core.delAttribute(node, name); + }; +} + +export class AttributeMetaPatch extends NodeStatePatch { + _delete = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + const isAttrDeletion = change.key.length === 2; + const [, /*type*/ name] = change.key; + if (isAttrDeletion) { + this.core.delAttributeMeta(node, name); + } else { + const meta = this.core.getAttributeMeta(node, name); + const metaChange = { type: 'del', key: change.key.slice(2) }; + const newMeta = diff.apply([metaChange], meta); + this.core.setAttributeMeta(node, name, newMeta); + } + }; + + _put = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + const [, /*type*/ name] = change.key; + const keys = change.key.slice(2); + + if (keys.length) { + const value = this.core.getAttributeMeta(node, name); + setNested(value, keys, change.value); + this.core.setAttributeMeta(node, name, value); + } else { + this.core.setAttributeMeta(node, name, change.value); + } + }; +} + +export class PointersPatch extends NodeStatePatch { + _validChangePut( + change: NodeChangeSet + ): Ok | Err { + const errMsg = `Invalid key for pointer: ${change.key + .slice(1) + .join(', ')}`; + if (this.hasValidKeyLength(change)) { + return new Ok(change); + } else { + return new Err(new PatchError(errMsg)); + } + } + + _delete = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + const [, /*type*/ name] = change.key; + this.core.delPointer(node, name); + }; + + _put = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + const [, /*type*/ name] = change.key; + let target = null; + let targetPath = null; + if (change.value !== null) { + target = + change.value !== null + ? await this.nodeSearchUtils.getNode( + node, + change.value, + resolvedSelectors + ) + : null; + targetPath = this.core.getPath(target); + } + const hasChanged = targetPath !== this.core.getPointerPath(node, name); + if (hasChanged) { + this.core.setPointer(node, name, target); + } + }; +} + +export class GuidPatch extends NodeStatePatch { + _delete = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => {}; + + _put = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + const { value } = change; + await this.core.setGuid(node, value); + }; +} + +export class MixinsPatch extends NodeStatePatch { + _delete = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + const [, index] = change.key; + const mixinPath = this.core.getMixinPaths(node)[index]; + this.core.delMixin(node, mixinPath); + }; + + _put = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + const [, index] = change.key; + const oldMixinPath = this.core.getMixinPaths(node)[index]; + if (oldMixinPath) { + this.core.delMixin(node, oldMixinPath); + } + + const mixinId = change.value; + + const mixinPath = await this.nodeSearchUtils.getNodeId( + node, + mixinId, + resolvedSelectors + ); + const canSet = this.core.canSetAsMixin(node, mixinPath); + if (canSet.isOk) { + this.core.addMixin(node, mixinPath); + } else { + throw new PatchError( + `Cannot set ${mixinId} as mixin for ${this.core.getPath( + node + )}: ${canSet.reason}` + ); + } + }; +} + +export class PointerMetaPatch extends NodeStatePatch { + _put = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + const [, /*"pointer_meta"*/ name, idOrMinMax] = change.key; + const isNewPointer = change.key.length === 2; + + if (isNewPointer) { + const meta = change.value; + this.core.setPointerMetaLimits(node, name, meta.min, meta.max); + + const targets = Object.entries(change.value).filter((pair) => { + const [key /*value*/] = pair; + return !['min', 'max'].includes(key); + }); + + for (let i = targets.length; i--; ) { + const [nodeId, meta] = targets[i]; + const target = await this.nodeSearchUtils.getNode( + node, + nodeId, + resolvedSelectors + ); + this.core.setPointerMetaTarget( + node, + name, + target, + meta.min, + meta.max + ); + } + } else if (['min', 'max'].includes(idOrMinMax)) { + const meta = this.core.getPointerMeta(node, name); + meta[idOrMinMax] = change.value; + this.core.setPointerMetaLimits(node, name, meta.min, meta.max); + } else { + const meta = this.core.getPointerMeta(node, name); + const target = await this.nodeSearchUtils.getNode( + node, + idOrMinMax, + resolvedSelectors + ); + const gmeId = await this.core.getPath(target); + const keys = change.key.slice(2); + keys[0] = gmeId; + setNested(meta, keys, change.value); + + const targetMeta = meta[gmeId]; + this.core.setPointerMetaTarget( + node, + name, + target, + targetMeta.min, + targetMeta.max + ); + } + }; + + _delete = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + const [, /*type*/ name, targetId] = change.key; + const removePointer = targetId === undefined; + if (removePointer) { + this.core.delPointerMeta(node, name); + } else { + const gmeId = await this.nodeSearchUtils.getNodeId( + node, + targetId, + resolvedSelectors + ); + this.core.delPointerMetaTarget(node, name, gmeId); + } + }; +} + +export class ChildrenPatch extends NodeStatePatch { + importer: JSONImporter; + + constructor( + core: GmeClasses.Core, + nodeSearchUtils: NodeSearchUtils, + importer: JSONImporter + ) { + super(core, nodeSearchUtils); + this.importer = importer; + } + + _put = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + await this.importer.createStateSubTree( + change.parentPath, + change.value, + resolvedSelectors + ); + const parent = await this.core.loadByPath( + this.nodeSearchUtils.getRoot(), + change.parentPath + ); + }; + + _delete = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + this.core.deleteNode(node); + }; +} + +export class SetsPatch extends NodeStatePatch { + _put = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + const [, /*type*/ name] = change.key; + const isNewSet = change.key.length === 2; + if (isNewSet) { + this.core.createSet(node, name); + const memberPaths = change.value; + + for (let i = 0; i < memberPaths.length; i++) { + const member = await this.nodeSearchUtils.getNode( + node, + memberPaths[i], + resolvedSelectors + ); + this.core.addMember(node, name, member); + } + } else { + const member = await this.nodeSearchUtils.getNode( + node, + change.value, + resolvedSelectors + ); + this.core.addMember(node, name, member); + } + }; + + _delete = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + const [, /*type*/ name, index] = change.key; + const removeSet = index === undefined; + if (removeSet) { + this.core.delSet(node, name); + } else { + const member = this.core.getMemberPaths(node, name)[index]; + this.core.delMember(node, name, member); + } + }; +} + +export class MemberAttributesPatch extends NodeStatePatch { + async _deletionInfo(node, change, resolvedSelectors) { + const [, /*type*/ set, nodeId, name] = change.key; + const gmeId = await this.nodeSearchUtils.getNodeId( + node, + nodeId, + resolvedSelectors + ); + const deleteAllAttributes = name === undefined; + const isMember = this.core.getMemberPaths(node, set).includes(gmeId); + return { + isMember, + deleteAllAttributes, + gmeId, + set, + nodeId, + name, + }; + } + + _put = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + const [, /*type*/ set, nodeId, name] = change.key; + const isNewSet = nodeId === undefined; + const isNewMember = name === undefined; + if (isNewSet || isNewMember) { + const changesets = Object.entries(change.value).map((entry) => ({ + type: 'put', + key: change.key.concat([entry[0]]), + value: entry[1], + })); + + for (let i = changesets.length; i--; ) { + await this.put(node, changesets[i], resolvedSelectors); + } + } else { + const gmeId = await this.nodeSearchUtils.getNodeId( + node, + nodeId, + resolvedSelectors + ); + this.core.setMemberAttribute(node, set, gmeId, name, change.value); + } + }; + + _delete = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + const { isMember, deleteAllAttributes, gmeId, set, name } = + await this._deletionInfo(node, change, resolvedSelectors); + if (isMember) { + const attributeNames = deleteAllAttributes + ? this.core.getMemberAttributeNames(node, set, gmeId) + : [name]; + + attributeNames.forEach((name) => { + this.core.delMemberAttribute(node, set, gmeId, name); + }); + } else { + if (!deleteAllAttributes) { + const member = await this.core.loadByPath( + this.nodeSearchUtils.getRoot(), + gmeId + ); + const memberName = this.core.getAttribute(member, 'name'); + const memberDisplay = `${memberName} (${gmeId})`; + + throw new PatchError( + `Cannot delete partial member attributes for ${memberDisplay}` + ); + } + } + }; +} + +export class MemberRegistryPatch extends NodeStatePatch { + _put = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + const [, /*type*/ set, nodeId, name] = change.key; + const parent = this.core.getParent(node); + const parentPath = parent ? this.core.getPath(parent) : ''; + const isNewSet = nodeId === undefined; + const isNewMember = name === undefined; + if (isNewSet || isNewMember) { + const changesets = Object.entries(change.value).map((entry) => { + const changeSet: ChangeSet = { + type: ChangeType.PUT, + key: change.key.concat([entry[0]]), + value: entry[1], + }; + return NodeChangeSet.fromChangeSet( + parentPath, + nodeId, + changeSet + ); + }); + + for (let i = changesets.length; i--; ) { + await this.put(node, changesets[i], resolvedSelectors); + } + } else { + const gmeId = await this.nodeSearchUtils.getNodeId( + node, + nodeId, + resolvedSelectors + ); + const isNested = change.key.length > 4; + if (isNested) { + const value = this.core.getMemberRegistry( + node, + set, + gmeId, + name + ); + setNested(value, change.key.slice(4), change.value); + this.core.setMemberRegistry(node, set, gmeId, name, value); + } else { + this.core.setMemberRegistry( + node, + set, + gmeId, + name, + change.value + ); + } + } + }; + + _delete = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + const [, /*type*/ set, nodeId, name] = change.key; + const gmeId = await this.nodeSearchUtils.getNodeId( + node, + nodeId, + resolvedSelectors + ); + const deleteAllRegistryValues = name === undefined; + const isMember = this.core.getMemberPaths(node, set).includes(gmeId); + if (isMember) { + const attributeNames = deleteAllRegistryValues + ? this.core.getMemberRegistryNames(node, set, gmeId) + : [name]; + + attributeNames.forEach((name) => { + this.core.delMemberRegistry(node, set, gmeId, name); + }); + } else { + if (!deleteAllRegistryValues) { + const member = await this.core.loadByPath( + this.nodeSearchUtils.getRoot(), + gmeId + ); + const memberName = this.core.getAttribute(member, 'name'); + const memberDisplay = `${memberName} (${gmeId})`; + + throw new PatchError( + `Cannot delete partial member registry values for ${memberDisplay}` + ); + } + } + }; +} + +export class RegistryPatch extends NodeStatePatch { + _validChangeDelete( + change: NodeChangeSet + ): Ok | Err { + if (this.hasValidKeyLength(change)) { + return new Ok(change); + } else { + const errMsg = `Complex registry values not currently supported: ${change.key.join( + ', ' + )}`; + return new Err(new PatchError(errMsg)); + } + } + + _put = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + const [, /*type*/ name] = change.key; + const keys = change.key.slice(2); + if (keys.length) { + const value = this.core.getRegistry(node, name); + setNested(value, keys, change.value); + this.core.setRegistry(node, name, value); + } else { + this.core.setRegistry(node, name, change.value); + } + }; + + _delete = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + const [, /*type*/ name] = change.key; + this.core.delRegistry(node, name); + }; +} + +export class ChildrenMetaPatch extends NodeStatePatch { + _delete = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + const [, /*"children_meta"*/ idOrMinMax] = change.key; + const isNodeId = !['min', 'max'].includes(idOrMinMax); + if (isNodeId) { + const gmeId = await this.nodeSearchUtils.getNodeId( + node, + idOrMinMax, + resolvedSelectors + ); + this.core.delChildMeta(node, gmeId); + } + }; + + _put = async ( + node: Core.Node, + change: NodeChangeSet, + resolvedSelectors: NodeSelections + ): Promise => { + const [, /*"children_meta"*/ idOrUndef] = change.key; + const isAddingContainment = !idOrUndef; + const isNewChildDefinition = typeof idOrUndef === 'string'; + if (isAddingContainment) { + const { min, max } = change.value; + this.core.setChildrenMetaLimits(node, min, max); + const childEntries = Object.entries(change.value).filter( + (pair) => !['min', 'max'].includes(pair[0]) + ); + for (let i = 0; i < childEntries.length; i++) { + const [nodeId, { min, max }] = childEntries[i]; + const childNode = await this.nodeSearchUtils.getNode( + node, + nodeId, + resolvedSelectors + ); + this.core.setChildMeta(node, childNode, min, max); + this.core.setChildMeta(node, childNode, min, max); + } + } else if (isNewChildDefinition) { + const nodeId = idOrUndef; + const { min, max } = change.value; + const childNode = await this.nodeSearchUtils.getNode( + node, + nodeId, + resolvedSelectors + ); + this.core.setChildMeta(node, childNode, min, max); + } + }; +} diff --git a/lib/common/JSONImporter/Utils.ts b/lib/common/JSONImporter/Utils.ts index 2b8a7b9..23c28b5 100644 --- a/lib/common/JSONImporter/Utils.ts +++ b/lib/common/JSONImporter/Utils.ts @@ -1,6 +1,8 @@ import NodeState from './NodeState'; import diff from 'changeset'; + import { ChangeSet } from 'changeset'; +import { NodeSelections, NodeSelector } from './NodeSelectors'; export const Constants = { META_ASPECT_SET_NAME: 'MetaAspectSet', @@ -46,3 +48,64 @@ export function partition( }); return partitioned; } + +export class NodeSearchUtils { + core: GmeClasses.Core; + rootNode: Core.Node; + + constructor(core: GmeClasses.Core, rootNode: Core.Node) { + this.core = core; + this.rootNode = rootNode; + } + + getRoot(): Core.Node { + return this.rootNode; + } + + async getNodeId( + parent: Core.Node, + idString: string, + resolvedSelectors: NodeSelections + ): Promise { + const node = await this.getNode(parent, idString, resolvedSelectors); + return this.core.getPath(node); + } + + async getNode( + parent: Core.Node, + idString: string, + resolvedSelectors: NodeSelections + ): Promise { + const node = await this.findNode(parent, idString, resolvedSelectors); + if (!node) { + throw new Error( + `Could not resolve ${idString} to an existing node.` + ); + } + return node; + } + + async findNode(parent, idString, resolvedSelectors = new NodeSelections()) { + if (idString === undefined) { + return; + } + assert( + typeof idString === 'string', + `Expected ID to be a string but found ${JSON.stringify(idString)}` + ); + + const parentId = this.core.getPath(parent); + const selector = new NodeSelector(idString); + const resolved = resolvedSelectors.get(parentId, selector); + if (resolved) { + return resolved; + } + + return await selector.findNode( + this.core, + this.rootNode, + parent, + resolvedSelectors.cache as NodeSelections + ); + } +} diff --git a/package-lock.json b/package-lock.json index ae6273e..17f863e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -16,6 +16,8 @@ "commander": "^9.4.0", "mocha": "^5.2.0", "prettier": "^2.7.1", + "source-map-support": "^0.5.21", + "ts-monads": "github:umesh-timalsina/ts-monads", "typescript": "^4.8.3", "vite": "^3.1.4", "vite-plugin-dts": "^1.6.1", @@ -54,38 +56,6 @@ "to-fast-properties": "^2.0.0" } }, - "node_modules/@esbuild/android-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz", - "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz", - "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==", - "cpu": [ - "loong64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/@microsoft/api-extractor": { "version": "7.32.0", "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.32.0.tgz", @@ -1058,16 +1028,6 @@ "node": ">=0.10.0" } }, - "node_modules/bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "dependencies": { - "file-uri-to-path": "1.0.0" - } - }, "node_modules/bl": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", @@ -2898,118 +2858,6 @@ "esbuild-windows-arm64": "0.15.10" } }, - "node_modules/esbuild-android-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz", - "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-android-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz", - "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz", - "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-darwin-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz", - "integrity": "sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz", - "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-freebsd-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz", - "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz", - "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/esbuild-linux-64": { "version": "0.15.10", "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz", @@ -3026,198 +2874,6 @@ "node": ">=12" } }, - "node_modules/esbuild-linux-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz", - "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==", - "cpu": [ - "arm" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz", - "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-mips64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz", - "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==", - "cpu": [ - "mips64el" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-ppc64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz", - "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==", - "cpu": [ - "ppc64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-riscv64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz", - "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==", - "cpu": [ - "riscv64" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-linux-s390x": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz", - "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==", - "cpu": [ - "s390x" - ], - "dev": true, - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-netbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz", - "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-openbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz", - "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-sunos-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz", - "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz", - "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==", - "cpu": [ - "ia32" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz", - "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==", - "cpu": [ - "x64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, - "node_modules/esbuild-windows-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz", - "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==", - "cpu": [ - "arm64" - ], - "dev": true, - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=12" - } - }, "node_modules/escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -3683,13 +3339,6 @@ "pend": "~1.2.0" } }, - "node_modules/file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, "node_modules/filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", @@ -3858,25 +3507,6 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "node_modules/fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "deprecated": "fsevents 1 will break on node v14+ and could be using insecure binaries. Upgrade to fsevents 2.", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "dependencies": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - }, - "engines": { - "node": ">= 4.0" - } - }, "node_modules/function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -5661,13 +5291,6 @@ "node": ">= 0.10" } }, - "node_modules/nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "dev": true, - "optional": true - }, "node_modules/nanoid": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", @@ -7294,20 +6917,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/rollup/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -7806,6 +7415,25 @@ "urix": "^0.1.0" } }, + "node_modules/source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-url": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", @@ -8224,6 +7852,12 @@ "integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=", "dev": true }, + "node_modules/ts-monads": { + "version": "1.0.0", + "resolved": "git+ssh://git@github.com/umesh-timalsina/ts-monads.git#44aa1e16851638de65b4a4cc54e052c63186d19b", + "dev": true, + "license": "Apache-2.0" + }, "node_modules/ts-morph": { "version": "16.0.0", "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-16.0.0.tgz", @@ -8740,20 +8374,6 @@ "node": ">=8" } }, - "node_modules/vite/node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, "node_modules/vite/node_modules/postcss": { "version": "8.4.16", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", @@ -9279,20 +8899,6 @@ "to-fast-properties": "^2.0.0" } }, - "@esbuild/android-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.15.10.tgz", - "integrity": "sha512-FNONeQPy/ox+5NBkcSbYJxoXj9GWu8gVGJTVmUyoOCKQFDTrHVKgNSzChdNt0I8Aj/iKcsDf2r9BFwv+FSNUXg==", - "dev": true, - "optional": true - }, - "@esbuild/linux-loong64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.15.10.tgz", - "integrity": "sha512-w0Ou3Z83LOYEkwaui2M8VwIp+nLi/NA60lBLMvaJ+vXVMcsARYdEzLNE7RSm4+lSg4zq4d7fAVuzk7PNQ5JFgg==", - "dev": true, - "optional": true - }, "@microsoft/api-extractor": { "version": "7.32.0", "resolved": "https://registry.npmjs.org/@microsoft/api-extractor/-/api-extractor-7.32.0.tgz", @@ -10096,16 +9702,6 @@ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==", "dev": true }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "bl": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/bl/-/bl-1.2.3.tgz", @@ -11703,55 +11299,6 @@ "esbuild-windows-arm64": "0.15.10" } }, - "esbuild-android-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-64/-/esbuild-android-64-0.15.10.tgz", - "integrity": "sha512-UI7krF8OYO1N7JYTgLT9ML5j4+45ra3amLZKx7LO3lmLt1Ibn8t3aZbX5Pu4BjWiqDuJ3m/hsvhPhK/5Y/YpnA==", - "dev": true, - "optional": true - }, - "esbuild-android-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-android-arm64/-/esbuild-android-arm64-0.15.10.tgz", - "integrity": "sha512-EOt55D6xBk5O05AK8brXUbZmoFj4chM8u3riGflLa6ziEoVvNjRdD7Cnp82NHQGfSHgYR06XsPI8/sMuA/cUwg==", - "dev": true, - "optional": true - }, - "esbuild-darwin-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-64/-/esbuild-darwin-64-0.15.10.tgz", - "integrity": "sha512-hbDJugTicqIm+WKZgp208d7FcXcaK8j2c0l+fqSJ3d2AzQAfjEYDRM3Z2oMeqSJ9uFxyj/muSACLdix7oTstRA==", - "dev": true, - "optional": true - }, - "esbuild-darwin-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-darwin-arm64/-/esbuild-darwin-arm64-0.15.10.tgz", - "integrity": "sha512-M1t5+Kj4IgSbYmunf2BB6EKLkWUq+XlqaFRiGOk8bmBapu9bCDrxjf4kUnWn59Dka3I27EiuHBKd1rSO4osLFQ==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-64/-/esbuild-freebsd-64-0.15.10.tgz", - "integrity": "sha512-KMBFMa7C8oc97nqDdoZwtDBX7gfpolkk6Bcmj6YFMrtCMVgoU/x2DI1p74DmYl7CSS6Ppa3xgemrLrr5IjIn0w==", - "dev": true, - "optional": true - }, - "esbuild-freebsd-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-freebsd-arm64/-/esbuild-freebsd-arm64-0.15.10.tgz", - "integrity": "sha512-m2KNbuCX13yQqLlbSojFMHpewbn8wW5uDS6DxRpmaZKzyq8Dbsku6hHvh2U+BcLwWY4mpgXzFUoENEf7IcioGg==", - "dev": true, - "optional": true - }, - "esbuild-linux-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-32/-/esbuild-linux-32-0.15.10.tgz", - "integrity": "sha512-guXrwSYFAvNkuQ39FNeV4sNkNms1bLlA5vF1H0cazZBOLdLFIny6BhT+TUbK/hdByMQhtWQ5jI9VAmPKbVPu1w==", - "dev": true, - "optional": true - }, "esbuild-linux-64": { "version": "0.15.10", "resolved": "https://registry.npmjs.org/esbuild-linux-64/-/esbuild-linux-64-0.15.10.tgz", @@ -11759,90 +11306,6 @@ "dev": true, "optional": true }, - "esbuild-linux-arm": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm/-/esbuild-linux-arm-0.15.10.tgz", - "integrity": "sha512-6N8vThLL/Lysy9y4Ex8XoLQAlbZKUyExCWyayGi2KgTBelKpPgj6RZnUaKri0dHNPGgReJriKVU6+KDGQwn10A==", - "dev": true, - "optional": true - }, - "esbuild-linux-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-arm64/-/esbuild-linux-arm64-0.15.10.tgz", - "integrity": "sha512-GByBi4fgkvZFTHFDYNftu1DQ1GzR23jws0oWyCfhnI7eMOe+wgwWrc78dbNk709Ivdr/evefm2PJiUBMiusS1A==", - "dev": true, - "optional": true - }, - "esbuild-linux-mips64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-mips64le/-/esbuild-linux-mips64le-0.15.10.tgz", - "integrity": "sha512-BxP+LbaGVGIdQNJUNF7qpYjEGWb0YyHVSKqYKrn+pTwH/SiHUxFyJYSP3pqkku61olQiSBnSmWZ+YUpj78Tw7Q==", - "dev": true, - "optional": true - }, - "esbuild-linux-ppc64le": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-ppc64le/-/esbuild-linux-ppc64le-0.15.10.tgz", - "integrity": "sha512-LoSQCd6498PmninNgqd/BR7z3Bsk/mabImBWuQ4wQgmQEeanzWd5BQU2aNi9mBURCLgyheuZS6Xhrw5luw3OkQ==", - "dev": true, - "optional": true - }, - "esbuild-linux-riscv64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-riscv64/-/esbuild-linux-riscv64-0.15.10.tgz", - "integrity": "sha512-Lrl9Cr2YROvPV4wmZ1/g48httE8z/5SCiXIyebiB5N8VT7pX3t6meI7TQVHw/wQpqP/AF4SksDuFImPTM7Z32Q==", - "dev": true, - "optional": true - }, - "esbuild-linux-s390x": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-linux-s390x/-/esbuild-linux-s390x-0.15.10.tgz", - "integrity": "sha512-ReP+6q3eLVVP2lpRrvl5EodKX7EZ1bS1/z5j6hsluAlZP5aHhk6ghT6Cq3IANvvDdscMMCB4QEbI+AjtvoOFpA==", - "dev": true, - "optional": true - }, - "esbuild-netbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-netbsd-64/-/esbuild-netbsd-64-0.15.10.tgz", - "integrity": "sha512-iGDYtJCMCqldMskQ4eIV+QSS/CuT7xyy9i2/FjpKvxAuCzrESZXiA1L64YNj6/afuzfBe9i8m/uDkFHy257hTw==", - "dev": true, - "optional": true - }, - "esbuild-openbsd-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-openbsd-64/-/esbuild-openbsd-64-0.15.10.tgz", - "integrity": "sha512-ftMMIwHWrnrYnvuJQRJs/Smlcb28F9ICGde/P3FUTCgDDM0N7WA0o9uOR38f5Xe2/OhNCgkjNeb7QeaE3cyWkQ==", - "dev": true, - "optional": true - }, - "esbuild-sunos-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-sunos-64/-/esbuild-sunos-64-0.15.10.tgz", - "integrity": "sha512-mf7hBL9Uo2gcy2r3rUFMjVpTaGpFJJE5QTDDqUFf1632FxteYANffDZmKbqX0PfeQ2XjUDE604IcE7OJeoHiyg==", - "dev": true, - "optional": true - }, - "esbuild-windows-32": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-32/-/esbuild-windows-32-0.15.10.tgz", - "integrity": "sha512-ttFVo+Cg8b5+qHmZHbEc8Vl17kCleHhLzgT8X04y8zudEApo0PxPg9Mz8Z2cKH1bCYlve1XL8LkyXGFjtUYeGg==", - "dev": true, - "optional": true - }, - "esbuild-windows-64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-64/-/esbuild-windows-64-0.15.10.tgz", - "integrity": "sha512-2H0gdsyHi5x+8lbng3hLbxDWR7mKHWh5BXZGKVG830KUmXOOWFE2YKJ4tHRkejRduOGDrBvHBriYsGtmTv3ntA==", - "dev": true, - "optional": true - }, - "esbuild-windows-arm64": { - "version": "0.15.10", - "resolved": "https://registry.npmjs.org/esbuild-windows-arm64/-/esbuild-windows-arm64-0.15.10.tgz", - "integrity": "sha512-S+th4F+F8VLsHLR0zrUcG+Et4hx0RKgK1eyHc08kztmLOES8BWwMiaGdoW9hiXuzznXQ0I/Fg904MNbr11Nktw==", - "dev": true, - "optional": true - }, "escape-html": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", @@ -12235,13 +11698,6 @@ "pend": "~1.2.0" } }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", @@ -12375,17 +11831,6 @@ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, - "fsevents": { - "version": "1.2.13", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.13.tgz", - "integrity": "sha512-oWb1Z6mkHIskLzEJ/XWX0srkpkTQ7vaopMQkyaEIoq0fmtFVxOthb8cCxeT+p3ynTdkk/RZwbgG4brR5BeWECw==", - "dev": true, - "optional": true, - "requires": { - "bindings": "^1.5.0", - "nan": "^2.12.1" - } - }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", @@ -13881,13 +13326,6 @@ "safe-buffer": "5.1.2" } }, - "nan": { - "version": "2.14.2", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.2.tgz", - "integrity": "sha512-M2ufzIiINKCuDfBSAUr1vWQ+vuVcA9kqx8JJUsbQi6yf1uGRyb7HfpdfUr5qLXf3B/t8dPvcjhKMmlfnP47EzQ==", - "dev": true, - "optional": true - }, "nanoid": { "version": "3.3.4", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.4.tgz", @@ -15191,15 +14629,6 @@ "dev": true, "requires": { "fsevents": "~2.3.2" - }, - "dependencies": { - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - } } }, "run-parallel": { @@ -15623,6 +15052,24 @@ "urix": "^0.1.0" } }, + "source-map-support": { + "version": "0.5.21", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", + "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "dev": true, + "requires": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + }, + "dependencies": { + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + } + } + }, "source-map-url": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.1.tgz", @@ -15978,6 +15425,11 @@ "integrity": "sha1-zCAOqyYT9BZtJ/+a/HylbUnfbrQ=", "dev": true }, + "ts-monads": { + "version": "git+ssh://git@github.com/umesh-timalsina/ts-monads.git#44aa1e16851638de65b4a4cc54e052c63186d19b", + "dev": true, + "from": "ts-monads@github:umesh-timalsina/ts-monads" + }, "ts-morph": { "version": "16.0.0", "resolved": "https://registry.npmjs.org/ts-morph/-/ts-morph-16.0.0.tgz", @@ -16293,13 +15745,6 @@ "rollup": "~2.78.0" }, "dependencies": { - "fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "optional": true - }, "postcss": { "version": "8.4.16", "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.16.tgz", diff --git a/package.json b/package.json index 3736c3e..da4d5db 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,7 @@ "name": "webgme-json-importer", "scripts": { "start": "node app.js", - "test": "node ./node_modules/mocha/bin/mocha --recursive test", + "test": "node ./node_modules/mocha/bin/mocha --require source-map-support/register --recursive test", "build": "npm run build:lib", "build:lib": "vite build", "typecheck": "tsc --noEmit", @@ -29,6 +29,8 @@ "commander": "^9.4.0", "mocha": "^5.2.0", "prettier": "^2.7.1", + "source-map-support": "^0.5.21", + "ts-monads": "github:umesh-timalsina/ts-monads", "typescript": "^4.8.3", "vite": "^3.1.4", "vite-plugin-dts": "^1.6.1",