diff --git a/.gitignore b/.gitignore index c8e1d686..804427dc 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ build/ +mat3ra-wode-0.0.0.tgz node_modules/ .eslintcache .nyc_output/ diff --git a/dist/js/Subworkflow.d.ts b/dist/js/Subworkflow.d.ts index 56cfcea6..3c145062 100644 --- a/dist/js/Subworkflow.d.ts +++ b/dist/js/Subworkflow.d.ts @@ -44,9 +44,9 @@ declare class Subworkflow extends InMemoryEntity implements SubworkflowSchema { static get defaultConfig(): { _id: any; name: string; - application: import("@mat3ra/esse/dist/js/types").ApplicationSchema | undefined; + application: import("@mat3ra/esse/dist/js/types").ApplicationSchema; model: { - functional: string; + functional: "pbe"; method: { readonly type: "pseudopotential"; readonly subtype: "us"; @@ -461,7 +461,7 @@ declare class Subworkflow extends InMemoryEntity implements SubworkflowSchema { contextProviderName: "vasp-neb"; }; extraData: { - materialHash: string; + materialHash?: string; }; isEdited: boolean; } | { @@ -483,7 +483,7 @@ declare class Subworkflow extends InMemoryEntity implements SubworkflowSchema { preferGridMetric?: boolean; }; extraData: { - materialHash: string; + materialHash?: string; }; isEdited: boolean; } | { @@ -496,7 +496,7 @@ declare class Subworkflow extends InMemoryEntity implements SubworkflowSchema { steps: number; }[]]; extraData: { - materialHash: string; + materialHash?: string; }; isEdited: boolean; } | { @@ -522,7 +522,7 @@ declare class Subworkflow extends InMemoryEntity implements SubworkflowSchema { hubbardUValue?: number; }[]; extraData: { - materialHash: string; + materialHash?: string; }; isEdited: boolean; } | { @@ -575,7 +575,7 @@ declare class Subworkflow extends InMemoryEntity implements SubworkflowSchema { targetFermiEnergy?: number; }; extraData: { - materialHash: string; + materialHash?: string; }; isEdited: boolean; } | { @@ -615,7 +615,7 @@ declare class Subworkflow extends InMemoryEntity implements SubworkflowSchema { totalMagnetization: number; }; extraData: { - materialHash: string; + materialHash?: string; }; isEdited: boolean; } | { @@ -650,7 +650,7 @@ declare class Subworkflow extends InMemoryEntity implements SubworkflowSchema { }; }; extraData: { - materialHash: string; + materialHash?: string; }; isEdited: boolean; })[]; @@ -697,6 +697,43 @@ declare class Subworkflow extends InMemoryEntity implements SubworkflowSchema { }[]; operand: string; value: string | boolean | number; + } | { + _id?: string; + slug?: string; + systemName?: string; + schemaVersion?: string; + name: string; + isDefault?: boolean; + preProcessors: { + name: string; + [k: string]: unknown; + }[]; + postProcessors: { + name: string; + [k: string]: unknown; + }[]; + monitors: { + name: string; + [k: string]: unknown; + }[]; + results: { + name: string; + [k: string]: unknown; + }[]; + tags?: string[]; + status?: "idle" | "active" | "warning" | "error" | "finished"; + statusTrack?: { + trackedAt: number; + status: string; + repetition?: number; + }[]; + isDraft?: boolean; + type: "error"; + head?: boolean; + flowchartId: string; + next?: string; + enableRender?: boolean; + reason: string; } | undefined; findUnitKeyById(id: string): string; private findUnitWithTag; diff --git a/dist/js/Subworkflow.js b/dist/js/Subworkflow.js index f5f1d916..6d2f7d39 100644 --- a/dist/js/Subworkflow.js +++ b/dist/js/Subworkflow.js @@ -35,11 +35,14 @@ class Subworkflow extends entity_1.InMemoryEntity { } static get defaultConfig() { const defaultName = "New Subworkflow"; + const application = new standata_1.ApplicationRegistry().getDefaultApplication(); + if (!application) { + throw new Error("No default application found"); + } return { _id: utils_1.Utils.uuid.getUUID(), name: defaultName, - application: new standata_1.ApplicationRegistry().getDefaultApplication(), - // TODO: confirm if `functional` is required field. If not, update ESSE schema + application, // `Model.defaultConfig` from @mat3ra/mode may omit `functional`; ESSE subworkflow schema requires it once schemas are registered. model: { ...mode_1.Model.defaultConfig, functional: "pbe" }, properties: [], diff --git a/dist/js/Workflow.d.ts b/dist/js/Workflow.d.ts index ff65a51c..e46dd88e 100644 --- a/dist/js/Workflow.d.ts +++ b/dist/js/Workflow.d.ts @@ -4,7 +4,7 @@ import { type HasDescription } from "@mat3ra/code/dist/js/entity/mixins/HasDescr import { type HashedEntity } from "@mat3ra/code/dist/js/entity/mixins/HashedEntityMixin"; import { Taggable } from "@mat3ra/code/dist/js/entity/mixins/TaggableMixin"; import type { AnyObject } from "@mat3ra/esse/dist/js/esse/types"; -import type { ApplicationSchema, WorkflowSchema } from "@mat3ra/esse/dist/js/types"; +import type { ApplicationSchema } from "@mat3ra/esse/dist/js/types"; import { ComputedEntityMixin } from "@mat3ra/ide/dist/js/compute"; import type { Material } from "@mat3ra/made"; import type { MetaPropertyHolder } from "@mat3ra/prode"; @@ -17,6 +17,7 @@ import { type WorkflowSchemaMixin } from "./generated/WorkflowSchemaMixin"; import Subworkflow from "./Subworkflow"; import { MapUnit } from "./units"; import { type AnyWorkflowUnit } from "./units/factory"; +import type { WorkflowSchema } from "./workflows/types"; interface Workflow extends Defaultable, NamedInMemoryEntity, WorkflowSchemaMixin, Taggable, HashedEntity, ComputedEntityMixin, HasDescription { compute: WorkflowSchema["compute"]; } diff --git a/dist/js/context/mixins/MaterialContextMixin.d.ts b/dist/js/context/mixins/MaterialContextMixin.d.ts index d22f2b79..6f72d98a 100644 --- a/dist/js/context/mixins/MaterialContextMixin.d.ts +++ b/dist/js/context/mixins/MaterialContextMixin.d.ts @@ -7,7 +7,7 @@ export type MaterialContextMixin = { readonly isMaterialUpdated: boolean; material: OrderedMaterial; extraData?: { - materialHash: string; + materialHash?: string; }; initMaterialContextMixin(externalContext: MaterialExternalContext): void; updateMaterialHash(): void; diff --git a/dist/js/enums.d.ts b/dist/js/enums.d.ts index da08eaf7..0fd809b2 100644 --- a/dist/js/enums.d.ts +++ b/dist/js/enums.d.ts @@ -9,6 +9,7 @@ export declare const UNIT_TYPES: { readonly subworkflow: "subworkflow"; readonly io: "io"; readonly assertion: "assertion"; + readonly error: "error"; }; export declare enum UnitType { convergence = "convergence", @@ -20,7 +21,8 @@ export declare enum UnitType { condition = "condition", subworkflow = "subworkflow", io = "io", - assertion = "assertion" + assertion = "assertion", + error = "error" } export declare enum UnitTag { hasConvergenceParam = "hasConvergenceParam", diff --git a/dist/js/enums.js b/dist/js/enums.js index 180edf9a..61ebebad 100644 --- a/dist/js/enums.js +++ b/dist/js/enums.js @@ -14,6 +14,7 @@ exports.UNIT_TYPES = { subworkflow: "subworkflow", io: "io", assertion: "assertion", + error: "error", }; var UnitType; (function (UnitType) { @@ -27,6 +28,7 @@ var UnitType; UnitType["subworkflow"] = "subworkflow"; UnitType["io"] = "io"; UnitType["assertion"] = "assertion"; + UnitType["error"] = "error"; })(UnitType || (exports.UnitType = UnitType = {})); var UnitTag; (function (UnitTag) { diff --git a/dist/js/generated/ErrorUnitSchemaMixin.d.ts b/dist/js/generated/ErrorUnitSchemaMixin.d.ts new file mode 100644 index 00000000..fe9644c4 --- /dev/null +++ b/dist/js/generated/ErrorUnitSchemaMixin.d.ts @@ -0,0 +1,5 @@ +import type { InMemoryEntity } from "@mat3ra/code/dist/js/entity"; +import type { ErrorUnitMixinSchema } from "@mat3ra/esse/dist/js/types"; +export type ErrorUnitSchemaMixin = ErrorUnitMixinSchema; +export type ErrorUnitInMemoryEntity = InMemoryEntity & ErrorUnitSchemaMixin; +export declare function errorUnitSchemaMixin(item: InMemoryEntity): asserts item is T & ErrorUnitSchemaMixin; diff --git a/dist/js/generated/ErrorUnitSchemaMixin.js b/dist/js/generated/ErrorUnitSchemaMixin.js new file mode 100644 index 00000000..befe9ec7 --- /dev/null +++ b/dist/js/generated/ErrorUnitSchemaMixin.js @@ -0,0 +1,21 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.errorUnitSchemaMixin = errorUnitSchemaMixin; +function errorUnitSchemaMixin(item) { + // @ts-expect-error + const properties = { + get type() { + return this.prop("type"); + }, + set type(value) { + this.setProp("type", value); + }, + get reason() { + return this.requiredProp("reason"); + }, + set reason(value) { + this.setProp("reason", value); + }, + }; + Object.defineProperties(item, Object.getOwnPropertyDescriptors(properties)); +} diff --git a/dist/js/index.d.ts b/dist/js/index.d.ts index 10b9b327..fc7e06c8 100644 --- a/dist/js/index.d.ts +++ b/dist/js/index.d.ts @@ -2,7 +2,7 @@ import PointsPathFormDataProvider from "./context/providers/PointsPath/PointsPat import { globalSettings } from "./context/providers/settings"; import { TAB_NAVIGATION_CONFIG, UNIT_NAME_INVALID_CHARS, WORKFLOW_STATUSES } from "./enums"; import Subworkflow from "./Subworkflow"; -import { AssertionUnit, AssignmentUnit, BaseUnit, ConditionUnit, ExecutionUnit, IOUnit, MapUnit, ReduceUnit, SubworkflowUnit } from "./units"; +import { AssertionUnit, AssignmentUnit, BaseUnit, ConditionUnit, ErrorUnit, ExecutionUnit, IOUnit, MapUnit, ReduceUnit, SubworkflowUnit } from "./units"; import { UnitFactory } from "./units/factory"; import { defaultMapConfig } from "./units/MapUnit"; import * as utils from "./utils"; @@ -10,4 +10,5 @@ import Workflow from "./Workflow"; export type { OrderedMaterial } from "./context/mixins/MaterialContextMixin"; export type { MaterialsSet } from "./context/mixins/MaterialsSetContextMixin"; export type { AnySubworkflowUnit, DefaultSubworkflowUnitType } from "./units/factory"; -export { Subworkflow, Workflow, UnitFactory, TAB_NAVIGATION_CONFIG, UNIT_NAME_INVALID_CHARS, WORKFLOW_STATUSES, BaseUnit, ExecutionUnit, AssertionUnit, AssignmentUnit, ConditionUnit, IOUnit, MapUnit, ReduceUnit, SubworkflowUnit, defaultMapConfig, PointsPathFormDataProvider, globalSettings, utils, }; +export { repairWorkflow } from "./utils/repair"; +export { Subworkflow, Workflow, UnitFactory, TAB_NAVIGATION_CONFIG, UNIT_NAME_INVALID_CHARS, WORKFLOW_STATUSES, BaseUnit, ExecutionUnit, AssertionUnit, AssignmentUnit, ConditionUnit, ErrorUnit, IOUnit, MapUnit, ReduceUnit, SubworkflowUnit, defaultMapConfig, PointsPathFormDataProvider, globalSettings, utils, }; diff --git a/dist/js/index.js b/dist/js/index.js index d88df78b..01f16dfd 100644 --- a/dist/js/index.js +++ b/dist/js/index.js @@ -36,7 +36,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.utils = exports.globalSettings = exports.PointsPathFormDataProvider = exports.defaultMapConfig = exports.SubworkflowUnit = exports.ReduceUnit = exports.MapUnit = exports.IOUnit = exports.ConditionUnit = exports.AssignmentUnit = exports.AssertionUnit = exports.ExecutionUnit = exports.BaseUnit = exports.WORKFLOW_STATUSES = exports.UNIT_NAME_INVALID_CHARS = exports.TAB_NAVIGATION_CONFIG = exports.UnitFactory = exports.Workflow = exports.Subworkflow = void 0; +exports.utils = exports.globalSettings = exports.PointsPathFormDataProvider = exports.defaultMapConfig = exports.SubworkflowUnit = exports.ReduceUnit = exports.MapUnit = exports.IOUnit = exports.ErrorUnit = exports.ConditionUnit = exports.AssignmentUnit = exports.AssertionUnit = exports.ExecutionUnit = exports.BaseUnit = exports.WORKFLOW_STATUSES = exports.UNIT_NAME_INVALID_CHARS = exports.TAB_NAVIGATION_CONFIG = exports.UnitFactory = exports.Workflow = exports.Subworkflow = exports.repairWorkflow = void 0; const PointsPathFormDataProvider_1 = __importDefault(require("./context/providers/PointsPath/PointsPathFormDataProvider")); exports.PointsPathFormDataProvider = PointsPathFormDataProvider_1.default; const settings_1 = require("./context/providers/settings"); @@ -52,6 +52,7 @@ Object.defineProperty(exports, "AssertionUnit", { enumerable: true, get: functio Object.defineProperty(exports, "AssignmentUnit", { enumerable: true, get: function () { return units_1.AssignmentUnit; } }); Object.defineProperty(exports, "BaseUnit", { enumerable: true, get: function () { return units_1.BaseUnit; } }); Object.defineProperty(exports, "ConditionUnit", { enumerable: true, get: function () { return units_1.ConditionUnit; } }); +Object.defineProperty(exports, "ErrorUnit", { enumerable: true, get: function () { return units_1.ErrorUnit; } }); Object.defineProperty(exports, "ExecutionUnit", { enumerable: true, get: function () { return units_1.ExecutionUnit; } }); Object.defineProperty(exports, "IOUnit", { enumerable: true, get: function () { return units_1.IOUnit; } }); Object.defineProperty(exports, "MapUnit", { enumerable: true, get: function () { return units_1.MapUnit; } }); @@ -65,3 +66,5 @@ const utils = __importStar(require("./utils")); exports.utils = utils; const Workflow_1 = __importDefault(require("./Workflow")); exports.Workflow = Workflow_1.default; +var repair_1 = require("./utils/repair"); +Object.defineProperty(exports, "repairWorkflow", { enumerable: true, get: function () { return repair_1.repairWorkflow; } }); diff --git a/dist/js/repair/createErrorUnitData.d.ts b/dist/js/repair/createErrorUnitData.d.ts new file mode 100644 index 00000000..64ac2f7a --- /dev/null +++ b/dist/js/repair/createErrorUnitData.d.ts @@ -0,0 +1,3 @@ +import type { ErrorUnitSchema } from "@mat3ra/esse/dist/js/types"; +import type { AnySubworkflowUnitSchema } from "../units/factory"; +export declare function createErrorUnitData(unitData: AnySubworkflowUnitSchema | Record, reason: string): ErrorUnitSchema; diff --git a/dist/js/repair/createErrorUnitData.js b/dist/js/repair/createErrorUnitData.js new file mode 100644 index 00000000..43f71bfe --- /dev/null +++ b/dist/js/repair/createErrorUnitData.js @@ -0,0 +1,25 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.createErrorUnitData = createErrorUnitData; +const utils_1 = require("@mat3ra/utils"); +const enums_1 = require("../enums"); +function createErrorUnitData(unitData, reason) { + const original = structuredClone(unitData); + return { + results: [], + preProcessors: [], + postProcessors: [], + monitors: [], + name: typeof original.name === "string" ? original.name : enums_1.UnitType.error, + type: enums_1.UnitType.error, + status: enums_1.UnitStatus.error, + flowchartId: typeof original.flowchartId === "string" ? original.flowchartId : utils_1.Utils.uuid.getUUID(), + originalUnit: original, + reason, + ...(typeof original._id === "string" ? { _id: original._id } : {}), + ...(typeof original.next === "string" ? { next: original.next } : {}), + ...(original.head === true ? { head: true } : {}), + ...(Array.isArray(original.statusTrack) ? { statusTrack: original.statusTrack } : {}), + ...(Array.isArray(original.tags) ? { tags: original.tags } : {}), + }; +} diff --git a/dist/js/repair/formatRepairReason.d.ts b/dist/js/repair/formatRepairReason.d.ts new file mode 100644 index 00000000..c0164fcf --- /dev/null +++ b/dist/js/repair/formatRepairReason.d.ts @@ -0,0 +1 @@ +export declare function formatRepairReason(error: unknown): string; diff --git a/dist/js/repair/formatRepairReason.js b/dist/js/repair/formatRepairReason.js new file mode 100644 index 00000000..1e840e65 --- /dev/null +++ b/dist/js/repair/formatRepairReason.js @@ -0,0 +1,22 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.formatRepairReason = formatRepairReason; +function formatRepairReason(error) { + var _a; + if (error && typeof error === "object") { + const entityError = error; + if (((_a = entityError.details) === null || _a === void 0 ? void 0 : _a.error) !== undefined) { + return JSON.stringify(entityError.details.error); + } + if (typeof entityError.message === "string" && entityError.message.length > 0) { + return entityError.message; + } + if (typeof entityError.code === "string" && entityError.code.length > 0) { + return entityError.code; + } + } + if (error instanceof Error) { + return error.message; + } + return String(error); +} diff --git a/dist/js/repair/types.d.ts b/dist/js/repair/types.d.ts new file mode 100644 index 00000000..3706b67f --- /dev/null +++ b/dist/js/repair/types.d.ts @@ -0,0 +1,16 @@ +import type { SubworkflowSchema, WorkflowSchema } from "@mat3ra/esse/dist/js/types"; +export type SubworkflowUnitRepairRecord = { + subworkflowId: string; + flowchartId: string; + reason: string; +}; +export type SubworkflowRepairResult = { + document: SubworkflowSchema; + changed: boolean; + repairs: SubworkflowUnitRepairRecord[]; +}; +export type WorkflowRepairResult = { + document: WorkflowSchema; + changed: boolean; + repairs: SubworkflowUnitRepairRecord[]; +}; diff --git a/dist/js/repair/types.js b/dist/js/repair/types.js new file mode 100644 index 00000000..c8ad2e54 --- /dev/null +++ b/dist/js/repair/types.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/dist/js/units/ErrorUnit.d.ts b/dist/js/units/ErrorUnit.d.ts new file mode 100644 index 00000000..e56278af --- /dev/null +++ b/dist/js/units/ErrorUnit.d.ts @@ -0,0 +1,16 @@ +import type { Constructor } from "@mat3ra/code/dist/js/utils/types"; +import type { AnyObject } from "@mat3ra/esse/dist/js/esse/types"; +import type { ErrorUnitSchema } from "@mat3ra/esse/dist/js/types"; +import { type ErrorUnitSchemaMixin } from "../generated/ErrorUnitSchemaMixin"; +import BaseUnit from "./BaseUnit"; +type Schema = ErrorUnitSchema; +type Base = typeof BaseUnit & Constructor; +export type ErrorUnitConfig = Partial; +declare const ErrorUnit_base: Base; +declare class ErrorUnit extends ErrorUnit_base implements Schema { + toJSON: () => Schema & AnyObject; + _json: Schema & AnyObject; + static get jsonSchema(): import("json-schema").JSONSchema7 | undefined; + constructor(config: ErrorUnitConfig); +} +export default ErrorUnit; diff --git a/dist/js/units/ErrorUnit.js b/dist/js/units/ErrorUnit.js new file mode 100644 index 00000000..0ec1078e --- /dev/null +++ b/dist/js/units/ErrorUnit.js @@ -0,0 +1,31 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +const JSONSchemasInterface_1 = __importDefault(require("@mat3ra/esse/dist/js/esse/JSONSchemasInterface")); +const enums_1 = require("../enums"); +const ErrorUnitSchemaMixin_1 = require("../generated/ErrorUnitSchemaMixin"); +const BaseUnit_1 = __importDefault(require("./BaseUnit")); +class ErrorUnit extends BaseUnit_1.default { + static get jsonSchema() { + return JSONSchemasInterface_1.default.getSchemaById("workflow/unit/error"); + } + constructor(config) { + var _a; + const schema = { + name: enums_1.UnitType.error, + results: [], + preProcessors: [], + postProcessors: [], + monitors: [], + reason: "", + ...config, + type: enums_1.UnitType.error, + status: (_a = config.status) !== null && _a !== void 0 ? _a : enums_1.UnitStatus.error, + }; + super(schema); + } +} +(0, ErrorUnitSchemaMixin_1.errorUnitSchemaMixin)(ErrorUnit.prototype); +exports.default = ErrorUnit; diff --git a/dist/js/units/factory.d.ts b/dist/js/units/factory.d.ts index 087d647a..3d2fb51c 100644 --- a/dist/js/units/factory.d.ts +++ b/dist/js/units/factory.d.ts @@ -1,21 +1,23 @@ -import type { AssertionUnitSchema, AssignmentUnitSchema, ConditionUnitSchema, DataIOUnitSchema, ExecutionUnitSchema, MapUnitSchema, ReduceUnitSchema, SubworkflowUnitSchema, WorkflowUnitSchema } from "@mat3ra/esse/dist/js/types"; +import type { ApplicationSchema, AssertionUnitSchema, AssignmentUnitSchema, ConditionUnitSchema, DataIOUnitSchema, ErrorUnitSchema, ExecutionUnitSchema, MapUnitSchema, ReduceUnitSchema, SubworkflowUnitSchema, WorkflowUnitSchema } from "@mat3ra/esse/dist/js/types"; import AssertionUnit, { type AssertionUnitConfig } from "./AssertionUnit"; import AssignmentUnit, { type AssignmentUnitConfig } from "./AssignmentUnit"; import ConditionUnit, { type ConditionUnitConfig } from "./ConditionUnit"; +import ErrorUnit, { type ErrorUnitConfig } from "./ErrorUnit"; import ExecutionUnit, { type ExecutionUnitConfig } from "./ExecutionUnit"; import IOUnit, { type IOUnitConfig } from "./IOUnit"; import MapUnit from "./MapUnit"; import ReduceUnit from "./ReduceUnit"; import SubworkflowUnit from "./SubworkflowUnit"; -export type AnyWorkflowUnit = MapUnit | SubworkflowUnit | ReduceUnit; -export type AnyWorkflowUnitSchema = MapUnitSchema | SubworkflowUnitSchema | ReduceUnitSchema; -export type AnySubworkflowUnit = ExecutionUnit | AssignmentUnit | ConditionUnit | IOUnit | AssertionUnit; -export type AnySubworkflowUnitSchema = ExecutionUnitSchema | AssertionUnitSchema | AssignmentUnitSchema | ConditionUnitSchema | DataIOUnitSchema; +export type AnyWorkflowUnit = MapUnit | SubworkflowUnit | ReduceUnit | ErrorUnit; +export type AnyWorkflowUnitSchema = MapUnitSchema | SubworkflowUnitSchema | ReduceUnitSchema | ErrorUnitSchema; +export type AnySubworkflowUnit = ExecutionUnit | AssignmentUnit | ConditionUnit | IOUnit | AssertionUnit | ErrorUnit; +export type AnySubworkflowUnitSchema = ExecutionUnitSchema | AssertionUnitSchema | AssignmentUnitSchema | ConditionUnitSchema | DataIOUnitSchema | ErrorUnitSchema; type ExcutionConfig = ExecutionUnitConfig & Pick; type AssignmentConfig = AssignmentUnitConfig & Pick; type ConditionConfig = ConditionUnitConfig & Pick; type IOConfig = IOUnitConfig & Pick; type AssertionConfig = AssertionUnitConfig & Pick; +type ErrorConfig = ErrorUnitConfig & Pick; /** Subworkflow unit kinds supported by {@link UnitFactory.createDefaultSubworkflowUnit}. */ export type DefaultSubworkflowUnitType = "execution" | "assignment" | "condition" | "io" | "assertion"; export declare class UnitFactory { @@ -23,9 +25,12 @@ export declare class UnitFactory { * Create a new subworkflow unit with fresh `flowchartId` and constructor defaults. * For execution units, pass the subworkflow (or parent) `application` JSON. */ - static createDefaultSubworkflowUnit(type: "execution", application: ExecutionUnitSchema["application"]): AnySubworkflowUnit; - static createDefaultSubworkflowUnit(type: "assignment" | "condition" | "io" | "assertion"): AnySubworkflowUnit; + static createDefaultSubworkflowUnit(type: "execution", application: ApplicationSchema): ExecutionUnit; + static createDefaultSubworkflowUnit(type: "assignment"): AssignmentUnit; + static createDefaultSubworkflowUnit(type: "condition"): ConditionUnit; + static createDefaultSubworkflowUnit(type: "io"): IOUnit; + static createDefaultSubworkflowUnit(type: "assertion"): AssertionUnit; static createInWorkflow(config: WorkflowUnitSchema): AnyWorkflowUnit; - static createInSubworkflow(config: ExcutionConfig | AssignmentConfig | ConditionConfig | IOConfig | AssertionConfig): AnySubworkflowUnit; + static createInSubworkflow(config: ExcutionConfig | AssignmentConfig | ConditionConfig | IOConfig | AssertionConfig | ErrorConfig): AnySubworkflowUnit; } export {}; diff --git a/dist/js/units/factory.js b/dist/js/units/factory.js index d0eb2e7f..1c8b390a 100644 --- a/dist/js/units/factory.js +++ b/dist/js/units/factory.js @@ -8,6 +8,7 @@ const enums_1 = require("../enums"); const AssertionUnit_1 = __importDefault(require("./AssertionUnit")); const AssignmentUnit_1 = __importDefault(require("./AssignmentUnit")); const ConditionUnit_1 = __importDefault(require("./ConditionUnit")); +const ErrorUnit_1 = __importDefault(require("./ErrorUnit")); const ExecutionUnit_1 = __importDefault(require("./ExecutionUnit")); const IOUnit_1 = __importDefault(require("./IOUnit")); const MapUnit_1 = __importDefault(require("./MapUnit")); @@ -47,6 +48,8 @@ class UnitFactory { return new SubworkflowUnit_1.default(config); case enums_1.UnitType.reduce: return new ReduceUnit_1.default(config); + case enums_1.UnitType.error: + return new ErrorUnit_1.default(config); default: throw new Error(`Unknown unit type: ${config.type}`); } @@ -63,6 +66,8 @@ class UnitFactory { return new IOUnit_1.default(config); case enums_1.UnitType.assertion: return new AssertionUnit_1.default(config); + case enums_1.UnitType.error: + return new ErrorUnit_1.default(config); default: throw new Error(`Unknown unit type: ${config.type}`); } diff --git a/dist/js/units/index.d.ts b/dist/js/units/index.d.ts index a7f25dcf..ad503f80 100644 --- a/dist/js/units/index.d.ts +++ b/dist/js/units/index.d.ts @@ -2,6 +2,7 @@ import AssertionUnit from "./AssertionUnit"; import AssignmentUnit from "./AssignmentUnit"; import BaseUnit from "./BaseUnit"; import ConditionUnit from "./ConditionUnit"; +import ErrorUnit from "./ErrorUnit"; import ExecutionUnit from "./ExecutionUnit"; import { UnitFactory } from "./factory"; import IOUnit from "./IOUnit"; @@ -10,5 +11,5 @@ import ReduceUnit from "./ReduceUnit"; import SubworkflowUnit from "./SubworkflowUnit"; export type { ReduceUnitConfig } from "./ReduceUnit"; export type { SubworkflowUnitConfig } from "./SubworkflowUnit"; -export { BaseUnit, AssertionUnit, AssignmentUnit, ConditionUnit, ExecutionUnit, IOUnit, MapUnit, ReduceUnit, SubworkflowUnit, UnitFactory, }; +export { BaseUnit, AssertionUnit, AssignmentUnit, ConditionUnit, ErrorUnit, ExecutionUnit, IOUnit, MapUnit, ReduceUnit, SubworkflowUnit, UnitFactory, }; export type { DefaultSubworkflowUnitType } from "./factory"; diff --git a/dist/js/units/index.js b/dist/js/units/index.js index cc4989c7..a578db43 100644 --- a/dist/js/units/index.js +++ b/dist/js/units/index.js @@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.UnitFactory = exports.SubworkflowUnit = exports.ReduceUnit = exports.MapUnit = exports.IOUnit = exports.ExecutionUnit = exports.ConditionUnit = exports.AssignmentUnit = exports.AssertionUnit = exports.BaseUnit = void 0; +exports.UnitFactory = exports.SubworkflowUnit = exports.ReduceUnit = exports.MapUnit = exports.IOUnit = exports.ExecutionUnit = exports.ErrorUnit = exports.ConditionUnit = exports.AssignmentUnit = exports.AssertionUnit = exports.BaseUnit = void 0; const AssertionUnit_1 = __importDefault(require("./AssertionUnit")); exports.AssertionUnit = AssertionUnit_1.default; const AssignmentUnit_1 = __importDefault(require("./AssignmentUnit")); @@ -12,6 +12,8 @@ const BaseUnit_1 = __importDefault(require("./BaseUnit")); exports.BaseUnit = BaseUnit_1.default; const ConditionUnit_1 = __importDefault(require("./ConditionUnit")); exports.ConditionUnit = ConditionUnit_1.default; +const ErrorUnit_1 = __importDefault(require("./ErrorUnit")); +exports.ErrorUnit = ErrorUnit_1.default; const ExecutionUnit_1 = __importDefault(require("./ExecutionUnit")); exports.ExecutionUnit = ExecutionUnit_1.default; const factory_1 = require("./factory"); diff --git a/dist/js/utils/index.d.ts b/dist/js/utils/index.d.ts index 78b2db57..085fe872 100644 --- a/dist/js/utils/index.d.ts +++ b/dist/js/utils/index.d.ts @@ -1,3 +1,4 @@ export * as units from "./units"; export * as workflow from "./workflow"; export * as baseUnits from "./baseUnits"; +export * as repair from "./repair"; diff --git a/dist/js/utils/index.js b/dist/js/utils/index.js index ec81de5d..c3494781 100644 --- a/dist/js/utils/index.js +++ b/dist/js/utils/index.js @@ -33,7 +33,8 @@ var __importStar = (this && this.__importStar) || (function () { }; })(); Object.defineProperty(exports, "__esModule", { value: true }); -exports.baseUnits = exports.workflow = exports.units = void 0; +exports.repair = exports.baseUnits = exports.workflow = exports.units = void 0; exports.units = __importStar(require("./units")); exports.workflow = __importStar(require("./workflow")); exports.baseUnits = __importStar(require("./baseUnits")); +exports.repair = __importStar(require("./repair")); diff --git a/dist/js/utils/repair.d.ts b/dist/js/utils/repair.d.ts new file mode 100644 index 00000000..e9c4864e --- /dev/null +++ b/dist/js/utils/repair.d.ts @@ -0,0 +1,2 @@ +import type { WorkflowSchema } from "../workflows/types"; +export declare function repairWorkflow(workflowData: T): T; diff --git a/dist/js/utils/repair.js b/dist/js/utils/repair.js new file mode 100644 index 00000000..07efc5ae --- /dev/null +++ b/dist/js/utils/repair.js @@ -0,0 +1,140 @@ +"use strict"; +var __importDefault = (this && this.__importDefault) || function (mod) { + return (mod && mod.__esModule) ? mod : { "default": mod }; +}; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.repairWorkflow = repairWorkflow; +const in_memory_1 = require("@mat3ra/code/dist/js/entity/in_memory"); +const utils_1 = require("@mat3ra/utils"); +const enums_1 = require("../enums"); +const Subworkflow_1 = __importDefault(require("../Subworkflow")); +const ConditionUnit_1 = __importDefault(require("../units/ConditionUnit")); +const ExecutionUnit_1 = __importDefault(require("../units/ExecutionUnit")); +function toErrorUnitSchema(unitData, error) { + var _a, _b, _c, _d; + let reasonPayload; + if (error instanceof in_memory_1.EntityError && error.details) { + reasonPayload = { + error: error.details.error, + json: unitData, + }; + } + else if (error instanceof Error) { + reasonPayload = { + error: { message: error.message, name: error.name }, + json: unitData, + }; + } + else { + reasonPayload = { + error, + json: unitData, + }; + } + return { + results: [], + preProcessors: [], + postProcessors: [], + monitors: [], + name: (_a = unitData.name) !== null && _a !== void 0 ? _a : enums_1.UnitType.error, + type: enums_1.UnitType.error, + status: enums_1.UnitStatus.error, + flowchartId: (_b = unitData.flowchartId) !== null && _b !== void 0 ? _b : utils_1.Utils.uuid.getUUID(), + reason: JSON.stringify(reasonPayload), + next: (_c = unitData.next) !== null && _c !== void 0 ? _c : "", + head: (_d = unitData.head) !== null && _d !== void 0 ? _d : false, + }; +} +function repairExecutionUnit(unitData) { + try { + return new ExecutionUnit_1.default(unitData).toJSON(); + } + catch (error) { + return toErrorUnitSchema(unitData, error); + } +} +function repairConditionUnit(unitData) { + try { + return new ConditionUnit_1.default(unitData).toJSON(); + } + catch (error) { + return toErrorUnitSchema(unitData, error); + } +} +function getSubworkflowValidationError(subworkflow) { + // Two checks, same order as the old isValid() path (construct + validate), but split so we + // keep AJV errors when hydration would fail first: + // 1. validateData — JSON Schema on raw persisted subworkflow (no Application/ModelFactory/units). + // Surfaces structured AJV errors (e.g. missing model) before the constructor runs. + // 2. new Subworkflow().validate() — hydration (app, model, units) then schema on the instance. + // Catches schema-valid JSON that still cannot be built (unknown model, bad units, etc.). + try { + Subworkflow_1.default.validateData({ ...subworkflow }); + new Subworkflow_1.default(subworkflow).validate(); + return null; + } + catch (error) { + if (error instanceof in_memory_1.EntityError || error instanceof Error) { + return error; + } + return new Error(String(error)); + } +} +function repairSubworkflow(subworkflowData) { + const units = subworkflowData.units.map((unit) => { + if (unit.type === enums_1.UnitType.execution) { + return repairExecutionUnit(unit); + } + if (unit.type === enums_1.UnitType.condition) { + return repairConditionUnit(unit); + } + return unit; + }); + return { ...subworkflowData, units }; +} +function repairWorkflow(workflowData) { + const subworkflows = workflowData.subworkflows.map((subworkflow) => { + return repairSubworkflow(subworkflow); + }); + const invalidSubworkflows = subworkflows + .map((subworkflow) => { + const error = getSubworkflowValidationError(subworkflow); + return error ? { subworkflow, error } : null; + }) + .filter((entry) => entry !== null); + const units = workflowData.units.map((unit) => { + const invalidEntry = invalidSubworkflows.find(({ subworkflow }) => subworkflow._id === unit._id); + if (invalidEntry) { + const { subworkflow, error } = invalidEntry; + const errorUnit = toErrorUnitSchema(unit, error); + const reasonPayload = { + ...JSON.parse(errorUnit.reason), + json: { unit, subworkflow }, + }; + return { + ...errorUnit, + _id: unit._id, + name: unit.name || errorUnit.name, + flowchartId: unit.flowchartId, + reason: JSON.stringify(reasonPayload), + preProcessors: unit.preProcessors || [], + postProcessors: unit.postProcessors || [], + monitors: unit.monitors || [], + results: unit.results || [], + }; + } + return unit; + }); + const validSubworkflows = subworkflows.filter((subworkflow) => { + return !invalidSubworkflows.some(({ subworkflow: invalid }) => invalid._id === subworkflow._id); + }); + const workflows = workflowData.workflows.map((nested) => { + return repairWorkflow(nested); + }); + return { + ...workflowData, + subworkflows: validSubworkflows, + workflows, + units, + }; +} diff --git a/dist/js/workflows/default.d.ts b/dist/js/workflows/default.d.ts index 4beac8a8..b48f7c3d 100644 --- a/dist/js/workflows/default.d.ts +++ b/dist/js/workflows/default.d.ts @@ -1,3 +1,3 @@ -import type { WorkflowSchema } from "@mat3ra/esse/dist/js/types"; +import type { WorkflowSchema } from "./types"; declare const defaultWorkflowConfig: WorkflowSchema; export default defaultWorkflowConfig; diff --git a/dist/js/workflows/types.d.ts b/dist/js/workflows/types.d.ts new file mode 100644 index 00000000..ae3b4b97 --- /dev/null +++ b/dist/js/workflows/types.d.ts @@ -0,0 +1,4 @@ +import type { WorkflowSchema as EsseWorkflowSchema } from "@mat3ra/esse/dist/js/types"; +export type WorkflowSchema = EsseWorkflowSchema & { + workflows: WorkflowSchema[]; +}; diff --git a/dist/js/workflows/types.js b/dist/js/workflows/types.js new file mode 100644 index 00000000..c8ad2e54 --- /dev/null +++ b/dist/js/workflows/types.js @@ -0,0 +1,2 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); diff --git a/mat3ra-wode-0.0.0.tgz b/mat3ra-wode-0.0.0.tgz deleted file mode 100644 index 18642195..00000000 Binary files a/mat3ra-wode-0.0.0.tgz and /dev/null differ diff --git a/package-lock.json b/package-lock.json index faff7158..8e289c43 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,7 @@ "@exabyte-io/eslint-config": "2025.5.13-0", "@mat3ra/ade": "2026.5.28-0", "@mat3ra/code": "2026.5.27-0", - "@mat3ra/esse": "2026.5.28-0", + "@mat3ra/esse": "2026.6.16-0", "@mat3ra/ide": "2026.5.28-0", "@mat3ra/made": "2026.5.28-0", "@mat3ra/mode": "2026.5.29-1", @@ -28,6 +28,8 @@ "@mat3ra/tsconfig": "^2024.6.3-0", "@mat3ra/utils": "2025.9.20-0", "@types/nunjucks": "^3.2.6", + "@typescript-eslint/eslint-plugin": "^5.62.0", + "@typescript-eslint/parser": "^5.62.0", "chai": "^4.3.4", "eslint": "^7.32.0", "eslint-config-airbnb": "^19.0.2", @@ -56,7 +58,7 @@ "peerDependencies": { "@mat3ra/ade": "*", "@mat3ra/code": "*", - "@mat3ra/esse": "*", + "@mat3ra/esse": "file:../esse/mat3ra-esse-0.0.0.tgz", "@mat3ra/ide": "*", "@mat3ra/made": "*", "@mat3ra/mode": "*", @@ -78,6 +80,8 @@ }, "node_modules/@apidevtools/json-schema-ref-parser": { "version": "11.9.3", + "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.9.3.tgz", + "integrity": "sha512-60vepv88RwcJtSHrD6MjIL6Ta3SOYbgfnkHb+ppAVK+o9mXprRtulx7VlRl3lN3bbvysAfCS7WMVfhUYemB0IQ==", "dev": true, "license": "MIT", "dependencies": { @@ -120,12 +124,12 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.0.tgz", - "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.29.7.tgz", + "integrity": "sha512-Aup7aUOfpbAUg2ROOJN6Iw5f9DMBlzu0mIkm/malLQFN/YQgO48wCj0Kxa3sEHJvPVFg7siR+qRInwXd2qhQKw==", "license": "MIT", "dependencies": { - "@babel/helper-validator-identifier": "^7.28.5", + "@babel/helper-validator-identifier": "^7.29.7", "js-tokens": "^4.0.0", "picocolors": "^1.1.1" }, @@ -134,9 +138,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.29.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.3.tgz", - "integrity": "sha512-LIVqM46zQWZhj17qA8wb4nW/ixr2y1Nw+r1etiAWgRM6U1IqP+LNhL1yg440jYZR72jCWcWbLWzIosH+uP1fqg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.29.7.tgz", + "integrity": "sha512-locTkQyKvwIEgBzVrn8693ebc97F2U8ZHjbXwDXJ5Fn2TCpNwTlKcaKLkdHop5c/icOFE7qt7Q9JC5hnKNa6Gg==", "license": "MIT", "engines": { "node": ">=6.9.0" @@ -187,13 +191,13 @@ } }, "node_modules/@babel/generator": { - "version": "7.29.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.1.tgz", - "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.29.7.tgz", + "integrity": "sha512-DkXD5OJQaAQIdZ1bt3UZdEnHAn9Imd3IVBdX03UFe+ony9Ojw5pzr9YVKGDY1jt+Gcn/FnGkNf8r+Vj5NOJWtQ==", "license": "MIT", "dependencies": { - "@babel/parser": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/gen-mapping": "^0.3.12", "@jridgewell/trace-mapping": "^0.3.28", "jsesc": "^3.0.2" @@ -203,23 +207,25 @@ } }, "node_modules/@babel/helper-annotate-as-pure": { - "version": "7.27.3", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.29.7.tgz", + "integrity": "sha512-OoK6239jHPuSQOoS0kfTVKn0b/rVTk0seKq4Gd2UMLtmOVLjDC0ki3e+c90Trqv2gMfvJFqkiljrr568+qddiw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.3" + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.28.6.tgz", - "integrity": "sha512-JYtls3hqi15fcx5GaSNL7SCTJ2MNmjrkHXg4FSpOA/grxK8KwyZ5bubHsCq8FXCkua6xhuaaBit+3b7+VZRfcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.29.7.tgz", + "integrity": "sha512-wem6WaBj4NaVYVdNhLPPVacES6ZJ+KBBfSkTMD3YZxbP3rm3Di85tJU5ljaUNhaOynt+Aj0xruhYuzQBt8n71g==", "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", + "@babel/compat-data": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", "semver": "^6.3.1" @@ -229,17 +235,17 @@ } }, "node_modules/@babel/helper-create-class-features-plugin": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.28.6.tgz", - "integrity": "sha512-dTOdvsjnG3xNT9Y0AUg1wAl38y+4Rl4sf9caSQZOXdNqVn+H+HbbJ4IyyHaIqNR6SW9oJpA/RuRjsjCw2IdIow==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.29.7.tgz", + "integrity": "sha512-IY3ZD9Tmooqr3TUhc3DUWxiuo8xx1DWLhd5M7hQ+ZWJamqM2BbalrBJb2MisSLoYorOj75U03qULCxQTY9r3hg==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/traverse": "^7.28.6", + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/traverse": "^7.29.7", "semver": "^6.3.1" }, "engines": { @@ -250,10 +256,12 @@ } }, "node_modules/@babel/helper-create-regexp-features-plugin": { - "version": "7.28.5", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.29.7.tgz", + "integrity": "sha512-907Uymvqgg1dwUA+7IGwFAOSYzQOuzPXKNJ1yxzwPffzkYFg2q2eHi1fIOs6sXkG9NbIUMunnUlkYsfRFNvomg==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", + "@babel/helper-annotate-as-pure": "^7.29.7", "regexpu-core": "^6.3.1", "semver": "^6.3.1" }, @@ -290,45 +298,49 @@ } }, "node_modules/@babel/helper-globals": { - "version": "7.28.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.29.7.tgz", + "integrity": "sha512-3nQVUAtvkKH9zahfWgw96Jc/uFOmjACE1kQz82E2lqWmHBgjzbNlsC22nuQTfahmWeQtTq5nQ/4Nnd2A1wj4zA==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-member-expression-to-functions": { - "version": "7.28.5", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.29.7.tgz", + "integrity": "sha512-j+7JYmk1JYDtACIGj0QJqqWZjoUpMoEikQGADMaHgCMCSDqd2+P32rfcibUNrGOMWrlzK1WJBdxrB3JJQZwWtg==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.5", - "@babel/types": "^7.28.5" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-imports": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", - "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.29.7.tgz", + "integrity": "sha512-ejHwrQQYcm9xnTivShn2IDOlIzInN34AXskvq9QicvCtEzq1Vzclu/tKF8Jq1Cg8JG2GL6/EmjgsCT7lXepE3g==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.6.tgz", - "integrity": "sha512-67oXFAYr2cDLDVGLXTEABjdBJZ6drElUSI7WKp70NrpyISso3plG9SAGEF6y7zbha/wOzUByWWTJvEDVNIUGcA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.29.7.tgz", + "integrity": "sha512-UPUVSyXbOh627KiCIGQSgwWzGeBKLkaJ9PJEdrngIwMSzxLR4jS4+f1f1jb7VzBbg8nFLaYotvVPFCTqdrmTAg==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.28.6" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -338,31 +350,35 @@ } }, "node_modules/@babel/helper-optimise-call-expression": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.29.7.tgz", + "integrity": "sha512-+kmGVjcT9RGYzoDwdwEqEvGgKe3BYq+O1iGzjFubaNgZHwYHP6lsF2Yghf4kEuv9BV7tYDZ913aBW9am6YKong==", "license": "MIT", "dependencies": { - "@babel/types": "^7.27.1" + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.28.6.tgz", - "integrity": "sha512-S9gzZ/bz83GRysI7gAD4wPT/AI3uCnY+9xn+Mx/KPs2JwHJIz1W8PZkg2cqyt3RNOBM8ejcXhV6y8Og7ly/Dug==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.29.7.tgz", + "integrity": "sha512-G7sHYigPY17oO5SYWnfD/0MTBwVR781S/JI643e/JhUYgVgWE/61SoW3NH9KWUKyKq5LVh3npif99Wkt6j86Jw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-remap-async-to-generator": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.29.7.tgz", + "integrity": "sha512-16AMiW26DbXWBbr3B8wNozKM0ydMLB892vaOaJW/fPJdnT8vJk5sdkQcU/isqUxyCE0cEoa8wZOcbgDuC4b6Og==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-wrap-function": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-wrap-function": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -372,14 +388,14 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.28.6.tgz", - "integrity": "sha512-mq8e+laIk94/yFec3DxSjCRD2Z0TAjhVbEJY3UQrlwVo15Lmt7C2wAUbK4bjnTs4APkwsYLTahXRraQXhb1WCg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.29.7.tgz", + "integrity": "sha512-atfGXWSeCiF4DnKZIfmJfQRkSw9b9gNNXR1kqKjbhG4pGYCOnkp8OcTB8E3NXjBu8NpheSnOeNKz8KT7UNFTmQ==", "license": "MIT", "dependencies": { - "@babel/helper-member-expression-to-functions": "^7.28.5", - "@babel/helper-optimise-call-expression": "^7.27.1", - "@babel/traverse": "^7.28.6" + "@babel/helper-member-expression-to-functions": "^7.29.7", + "@babel/helper-optimise-call-expression": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -389,57 +405,67 @@ } }, "node_modules/@babel/helper-skip-transparent-expression-wrappers": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-skip-transparent-expression-wrappers/-/helper-skip-transparent-expression-wrappers-7.29.7.tgz", + "integrity": "sha512-brcMGQaVzIeUb+6/bs1Av0f8YuNNjKY2JyvfRCsFuFsdKccEQ5Ges2y74D74NZ1Rz8lKJ9ksJkfqwQFJ/iNEyQ==", "license": "MIT", "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.29.7.tgz", + "integrity": "sha512-Pb5ijPrZ89GDH8223L4UP8i6QApWxs04RbPQJTeWDV0/keR2E36MeKnyr6LYmUUvqRRI+Iv87SuF1W6ErINzYw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-identifier": { - "version": "7.28.5", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.29.7.tgz", + "integrity": "sha512-qehxGkRj55h/ff8EMaJ+cYhyaKlHIxqYDn682wQD7RNp9UujOQsHog2uS0r2vzr4pW+sXf90NeeayjcNaX3fFg==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.29.7.tgz", + "integrity": "sha512-N9ZErrD+yW5geCDtBqnOoxmR8+tNKiGuxKlDpuJxfsqpa2dFcexaziGAE/qoHLiDDreVNMupxGmSoNlyvsA3gw==", "license": "MIT", "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-wrap-function": { - "version": "7.28.3", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.29.7.tgz", + "integrity": "sha512-iES0Skag9ERIF68aXadpO6dbXa03mNWK3sEqJaMnLNs/eC3l0lkImdfoy6Y09/SfkpawdAB4RjQ7PVA7TcVGdw==", "license": "MIT", "dependencies": { - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2" + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helpers": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.2.tgz", - "integrity": "sha512-HoGuUs4sCZNezVEKdVcwqmZN8GoHirLUcLaYVNBK2J0DadGtdcqgr3BCbvH8+XUo4NGjNl3VOtSjEKNzqfFgKw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.29.7.tgz", + "integrity": "sha512-1k2lAGRMfHTcwuNYcCNUmaUffmQv8KWMfh2iJUUeRlwlwH4FdNG7mfPI10NPfLHJFThE4Tyr4mv7kTNZOiPuBg==", "license": "MIT", "dependencies": { - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0" + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -516,12 +542,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", - "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.7.tgz", + "integrity": "sha512-hnORnjP/1P/zFEndoeX+n+t1RwWRJiJpM/jO7FW32Kn9r5+sJB2JWOdYo4L6k78j15eCwY3Gm/7364B1EMwtNg==", "license": "MIT", "dependencies": { - "@babel/types": "^7.29.0" + "@babel/types": "^7.29.7" }, "bin": { "parser": "bin/babel-parser.js" @@ -531,14 +557,14 @@ } }, "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { - "version": "7.28.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.28.5.tgz", - "integrity": "sha512-87GDMS3tsmMSi/3bWOte1UblL+YUTFMV8SZPZ2eSEL17s74Cw/l63rR6NmGVKMYW2GYi85nE+/d6Hw5N0bEk2Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-firefox-class-in-computed-class-key/-/plugin-bugfix-firefox-class-in-computed-class-key-7.29.7.tgz", + "integrity": "sha512-j8SrR0zLZrRsC09DlszEx8FpMiwukKffYXMK0d5LmOglO7vGG6sz/BR/20yHqWH+Lnn31JTt2PE3hIWNgM2J6w==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -548,13 +574,13 @@ } }, "node_modules/@babel/plugin-bugfix-safari-class-field-initializer-scope": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.27.1.tgz", - "integrity": "sha512-qNeq3bCKnGgLkEXUuFry6dPlGfCdQNZbn7yUAPCInwAJHMU7THJfrBSozkcWq5sNM6RcF3S8XyQL2A52KNR9IA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-class-field-initializer-scope/-/plugin-bugfix-safari-class-field-initializer-scope-7.29.7.tgz", + "integrity": "sha512-r8j8escF+U2FUHo0KOhPUdMzUO+jp9fInva6+ACVAF3Y97Ev+5iNZwiqTghmzNeWwDkOPlYuTcfb1vDaoZKmAQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -564,10 +590,29 @@ } }, "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.29.7.tgz", + "integrity": "sha512-GE1TFSiuFeGsCxmYXZl8HwoPrVlwe4rHPFE8weieGKZqnDORK+Ar3vgWMgW+AOxQ6/2TgLSKx9p6W7O4rC6qgQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": { + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-safari-rest-destructuring-rhs-array/-/plugin-bugfix-safari-rest-destructuring-rhs-array-7.29.7.tgz", + "integrity": "sha512-oBNVCvnO5tND+xSopWvV8WNGfpTfgP4Zr/YXXSj8zfmcPktp5Ku/aZlsIowgSD4fjmgHn6sGmB9APVsU5zOdhA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -577,12 +622,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.29.7.tgz", + "integrity": "sha512-QQt9qKHZ2sg/kivaLr7lnQr8HVrQDdBNSfCsTjiDxRuX/K5ORyKq+Bu8Xr0cDE3Dfkv0cw28Ve0EKyKMvulkOw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1", - "@babel/plugin-transform-optional-chaining": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -592,14 +639,14 @@ } }, "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.28.6.tgz", - "integrity": "sha512-a0aBScVTlNaiUe35UtfxAN7A/tehvvG4/ByO6+46VPKTRSlfnAFsgKy0FUh+qAkQrDTmhDkT+IBOKlOoMUxQ0g==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.29.7.tgz", + "integrity": "sha512-pn6QacGLgvCcwc+syUhKE/qSjV2D1IHDB84RNxWYSt1mW3K/SCtjinZ2p0cETJxAWBjPy3K/1lHwG5BjjPxNlw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/traverse": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -881,13 +928,13 @@ } }, "node_modules/@babel/plugin-syntax-import-assertions": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.28.6.tgz", - "integrity": "sha512-pSJUpFHdx9z5nqTSirOCMtYVP2wFgoWhP0p3g8ONK/4IHhLIBd0B9NYqAvIUAhq+OkhO4VM1tENCt0cjlsNShw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-assertions/-/plugin-syntax-import-assertions-7.29.7.tgz", + "integrity": "sha512-/An1OCBN93thpBAGyfsK2pcf0jvju1SAtKkL2Ny++B5Sy6sqgzXDQH1cZxWbF96Wuk+bn41MDA9bLd4VVAw6rw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -897,13 +944,13 @@ } }, "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.28.6.tgz", - "integrity": "sha512-jiLC0ma9XkQT3TKJ9uYvlakm66Pamywo+qwL+oL8HJOvc6TWdZXVfhqJr8CCzbSGUAbDOzlGHJC1U+vRfLQDvw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.29.7.tgz", + "integrity": "sha512-zGYcYfq/WmZ4V+kBIXQon9dSSc8ircGZqw9ZaNhhGj9nZkeBu1jHLBDQqYYi5WA9uawvA2sIMbry2nCFhf5Djg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -923,11 +970,13 @@ } }, "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.29.7.tgz", + "integrity": "sha512-TSu8+mHCoEaaCDEZ0I3+6mvTBYR4PCxQwf2z9/r5Tbztv6NaLR3B9thGTTxX2WGuGHJqRiAbKPeGTJ5XWXVg6A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1054,10 +1103,12 @@ } }, "node_modules/@babel/plugin-transform-arrow-functions": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.29.7.tgz", + "integrity": "sha512-N7zArUXWzAMzm+/N0uPBeVB3Fam5lMxtUwMmDK5f/IBBS7a7p1qeUoxd/6CckXoxUdgsntq1Dh8xNW06maZbDQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1067,15 +1118,15 @@ } }, "node_modules/@babel/plugin-transform-async-generator-functions": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.0.tgz", - "integrity": "sha512-va0VdWro4zlBr2JsXC+ofCPB2iG12wPtVGTWFx2WLDOM3nYQZZIGP82qku2eW/JR83sD+k2k+CsNtyEbUqhU6w==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.29.7.tgz", + "integrity": "sha512-d98gXZkgswvkyohMBABkhm3GeXhYj8psWfwQ2C7gtfrKGTykQa/iOIi+JJhwMjPlZ6Vm2XN+DCf3Es1EoG4ZLA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-remap-async-to-generator": "^7.27.1", - "@babel/traverse": "^7.29.0" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1085,14 +1136,14 @@ } }, "node_modules/@babel/plugin-transform-async-to-generator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.28.6.tgz", - "integrity": "sha512-ilTRcmbuXjsMmcZ3HASTe4caH5Tpo93PkTxF9oG2VZsSWsahydmcEHhix9Ik122RcTnZnUzPbmux4wh1swfv7g==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.29.7.tgz", + "integrity": "sha512-pcUb2SS+RMo9TWVBwKGI5ShtoG7R+zBsFmCKDa6fe8c+hPr3XJlZgoE5j6i8W7gDjhyvy+85vmYexanvXh3d1w==", "license": "MIT", "dependencies": { - "@babel/helper-module-imports": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-remap-async-to-generator": "^7.27.1" + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-remap-async-to-generator": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1102,10 +1153,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.29.7.tgz", + "integrity": "sha512-cUSmjh72N+rN4PrkFlN1dJwNCwjVp5d38/CQrEsFggkD10UiFlBFgdH3tv5dNsLuHY+3S8db2xCHjhZcv5WgvA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1115,12 +1168,12 @@ } }, "node_modules/@babel/plugin-transform-block-scoping": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.6.tgz", - "integrity": "sha512-tt/7wOtBmwHPNMPu7ax4pdPz6shjFrmHDghvNC+FG9Qvj7D6mJcoRQIF5dy4njmxR941l6rgtvfSB2zX3VlUIw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.29.7.tgz", + "integrity": "sha512-ONyr4+AZhKh8yKWInVxU9AXA9EbsyeLcL6V0dJy6M2/62vuvpGm29zzuymbTpdc451GEpDIdAyPLP3r+P61yKQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1130,14 +1183,14 @@ } }, "node_modules/@babel/plugin-transform-class-properties": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.28.6.tgz", - "integrity": "sha512-dY2wS3I2G7D697VHndN91TJr8/AAfXQNt5ynCTI/MpxMsSzHp+52uNivYT5wCPax3whc47DR8Ba7cmlQMg24bw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-properties/-/plugin-transform-class-properties-7.29.7.tgz", + "integrity": "sha512-GtcpjFvanPfzNQi3eTitsCqtRRmmqzpy/A+yhTR1HaZo1Ly3EA8ZXxlPyHdR8/IuRMYc3E4wdGBewB2QKQjAaA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1147,14 +1200,14 @@ } }, "node_modules/@babel/plugin-transform-class-static-block": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.28.6.tgz", - "integrity": "sha512-rfQ++ghVwTWTqQ7w8qyDxL1XGihjBss4CmTgGRCTAC9RIbhVpyp4fOeZtta0Lbf+dTNIVJer6ych2ibHwkZqsQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-class-static-block/-/plugin-transform-class-static-block-7.29.7.tgz", + "integrity": "sha512-kibJgmEdX2iMwsHY2tSZNDgj8PwIlCQz7FK9KuGKO8zsuoUwSEhoNnNVp/emKWrbY4HeO6kkXfdMqRKKKXBm2A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1164,17 +1217,17 @@ } }, "node_modules/@babel/plugin-transform-classes": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.6.tgz", - "integrity": "sha512-EF5KONAqC5zAqT783iMGuM2ZtmEBy+mJMOKl2BCvPZ2lVrwvXnB6o+OBWCS+CoeCCpVRF2sA2RBKUxvT8tQT5Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.29.7.tgz", + "integrity": "sha512-qV0OGGBVacduzQHE649JyCneOFI/maT+YKsO+K4Yi3xv2wTPNjM/W2o2gdzMwEAZz7fXNTHAe0NcSg30bIN69g==", "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-globals": "^7.28.0", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-replace-supers": "^7.28.6", - "@babel/traverse": "^7.28.6" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1184,13 +1237,13 @@ } }, "node_modules/@babel/plugin-transform-computed-properties": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.28.6.tgz", - "integrity": "sha512-bcc3k0ijhHbc2lEfpFHgx7eYw9KNXqOerKWfzbxEHUGKnS3sz9C4CNL9OiFN1297bDNfUiSO7DaLzbvHQQQ1BQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.29.7.tgz", + "integrity": "sha512-RK7/IyU5phpuCdBAuig5VkzG/EnbDaui5SQGdU9BFrHdV+mV4cUjLMQ9lJDjLNtWHsqtiefpGZUXQP2BiTYMsA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/template": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/template": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1200,11 +1253,13 @@ } }, "node_modules/@babel/plugin-transform-destructuring": { - "version": "7.28.5", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.29.7.tgz", + "integrity": "sha512-iPX8aD6H9zV5s7ZsqTdNocPN/MGQ5sSMnElKrktxjJRMnB2jN/1p2+R7GkfD6CAYoVFqy5A4XnSIUeGgJzIWpg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.28.5" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1214,13 +1269,13 @@ } }, "node_modules/@babel/plugin-transform-dotall-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.28.6.tgz", - "integrity": "sha512-SljjowuNKB7q5Oayv4FoPzeB74g3QgLt8IVJw9ADvWy3QnUb/01aw8I4AVv8wYnPvQz2GDDZ/g3GhcNyDBI4Bg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.29.7.tgz", + "integrity": "sha512-3qc18hsD2RdZiyJNDNc7HQpv6xbncwh8FYtxNFFzclSyh/trPD9KkVR9BDECUjDLvb7yJVF15GfYUuC+LMkkiQ==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1230,10 +1285,12 @@ } }, "node_modules/@babel/plugin-transform-duplicate-keys": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.29.7.tgz", + "integrity": "sha512-6IvRRriEMqnBwD6chtxdLpMYCHWEzN+oL5cyQtjykya19UgzbmKhxmhZgKC/LHxS2nYr9Q/qYPZ5Lr6jOL9+yQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1243,14 +1300,14 @@ } }, "node_modules/@babel/plugin-transform-duplicate-named-capturing-groups-regex": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.0.tgz", - "integrity": "sha512-zBPcW2lFGxdiD8PUnPwJjag2J9otbcLQzvbiOzDxpYXyCuYX9agOwMPGn1prVH0a4qzhCKu24rlH4c1f7yA8rw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-named-capturing-groups-regex/-/plugin-transform-duplicate-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-2wiIyo2BjtgU7HufSeDnL9L2O7zr8jmhFKuSr65VpRkUiRKRNpb0mdlk56+XPPKoIrfHqzbMuglDvZun0RISsA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1260,13 +1317,13 @@ } }, "node_modules/@babel/plugin-transform-dynamic-import": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.27.1.tgz", - "integrity": "sha512-MHzkWQcEmjzzVW9j2q8LGjwGWpG2mjwaaB0BNQwst3FIjqsg8Ct/mIZlvSPJvfi9y2AC8mi/ktxbFVL9pZ1I4A==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dynamic-import/-/plugin-transform-dynamic-import-7.29.7.tgz", + "integrity": "sha512-giOlEm/EFjfjr+te9NsdjkUo2v4f8rS/SXPumRVHAtbNcyNlvtREkU1dZzaIDclNpnaVhlCqRdFKhJBjBikzLg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1276,14 +1333,14 @@ } }, "node_modules/@babel/plugin-transform-explicit-resource-management": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.28.6.tgz", - "integrity": "sha512-Iao5Konzx2b6g7EPqTy40UZbcdXE126tTxVFr/nAIj+WItNxjKSYTEw3RC+A2/ZetmdJsgueL1KhaMCQHkLPIg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-explicit-resource-management/-/plugin-transform-explicit-resource-management-7.29.7.tgz", + "integrity": "sha512-Rstj7coNz8sE+7Ju7ihpHLI564lsK5pUpNNlvptCIC/16E/S5hbl6n3kESPKdNRmqEWlpn5xpS5Q2dvXBsySLw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1293,12 +1350,12 @@ } }, "node_modules/@babel/plugin-transform-exponentiation-operator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.28.6.tgz", - "integrity": "sha512-WitabqiGjV/vJ0aPOLSFfNY1u9U3R7W36B03r5I2KoNix+a3sOhJ3pKFB3R5It9/UiK78NiO0KE9P21cMhlPkw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.29.7.tgz", + "integrity": "sha512-zFpMOTLZBdW5LfObqcSbL6kefg4R4eLdmvS0wbN9M6D5Mym/sKm9toOoWyVOa+xDjvCnuWcHls2YonXwHvH3CQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1308,13 +1365,13 @@ } }, "node_modules/@babel/plugin-transform-export-namespace-from": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.27.1.tgz", - "integrity": "sha512-tQvHWSZ3/jH2xuq/vZDy0jNn+ZdXJeM8gHvX4lnJmsc3+50yPlWdZXIc5ay+umX+2/tJIqHqiEqcJvxlmIvRvQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-export-namespace-from/-/plugin-transform-export-namespace-from-7.29.7.tgz", + "integrity": "sha512-24B2nOy2TeJSMheqwPD4DDQOV/elLSIlKxjZt4i05H5AgdPdWR3n18HnNrcJ+j76WJd9gbwb9jPjNYUy6RautA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1324,11 +1381,13 @@ } }, "node_modules/@babel/plugin-transform-for-of": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.29.7.tgz", + "integrity": "sha512-zeSIHh0+E1Um1WJRXCFlHQYu2ieJNdivLLjlBEp+dIBu3S51n+SZZmIXjxnItw6pz56Cn+KvK68BIBVsxq2JiQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1338,12 +1397,14 @@ } }, "node_modules/@babel/plugin-transform-function-name": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.29.7.tgz", + "integrity": "sha512-otRWaHXE6fbAGkePvaj/kvs3HsqXfPhlnzwSOlnFgbqCPMd975dW+4wZ00WFBt+/YlBGcJwNrARQTOJOb4ZrIg==", "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/traverse": "^7.27.1" + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1353,13 +1414,13 @@ } }, "node_modules/@babel/plugin-transform-json-strings": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.28.6.tgz", - "integrity": "sha512-Nr+hEN+0geQkzhbdgQVPoqr47lZbm+5fCUmO70722xJZd0Mvb59+33QLImGj6F+DkK3xgDi1YVysP8whD6FQAw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-json-strings/-/plugin-transform-json-strings-7.29.7.tgz", + "integrity": "sha512-RRnE2+eon1rJAq8MnoF1b5kTpY1vU88twHcvcKMrsqP/jxIRqDVs9iJB5fqPuqyeFAW0wJo4MlUIPpQCq/aRsg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1369,10 +1430,12 @@ } }, "node_modules/@babel/plugin-transform-literals": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.29.7.tgz", + "integrity": "sha512-DZ/oLP21ZuWx1vKqnoNv6/tvEK48AQOBRai40CX9dTjGluvT/YZCyY3rryDtyUqCEoyNroy5KKPwX2iQCiRvyw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1382,13 +1445,13 @@ } }, "node_modules/@babel/plugin-transform-logical-assignment-operators": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.28.6.tgz", - "integrity": "sha512-+anKKair6gpi8VsM/95kmomGNMD0eLz1NQ8+Pfw5sAwWH9fGYXT50E55ZpV0pHUHWf6IUTWPM+f/7AAff+wr9A==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-logical-assignment-operators/-/plugin-transform-logical-assignment-operators-7.29.7.tgz", + "integrity": "sha512-A0H91hh6W8MFRkp5TqJmMr39jzGD1A1E1Ysiv2O06Sfbhkapm+XyIzxWCEh5kqwOZ1/8QZ0dY3SeQ7XBqfJd5Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1398,10 +1461,12 @@ } }, "node_modules/@babel/plugin-transform-member-expression-literals": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.29.7.tgz", + "integrity": "sha512-hl1kwFZCCiDyfH25Xmco9jTrkPgnS9pmOzSG7W5I4SaGbLeqKv417hcU2RKmaxoPEgsoJh7ZPOrnPGq99bHoUg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1411,11 +1476,13 @@ } }, "node_modules/@babel/plugin-transform-modules-amd": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.29.7.tgz", + "integrity": "sha512-fxtQoH3m5ywUSIfaH0FGCzWu4McsYon5bD3K4XnskC7f+OyQMj7rsOMi4NvvmJ83WwBAg4UCe+ov4VZlqEvyew==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1425,13 +1492,13 @@ } }, "node_modules/@babel/plugin-transform-modules-commonjs": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.28.6.tgz", - "integrity": "sha512-jppVbf8IV9iWWwWTQIxJMAJCWBuuKx71475wHwYytrRGQ2CWiDvYlADQno3tcYpS/T2UUWFQp3nVtYfK/YBQrA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.29.7.tgz", + "integrity": "sha512-j0vCldybPC5b5dwCQOJ21uKtHzt7hxLygJTg9eF1ScfaikEDNfzn94XoW5Fi+seBR0nCyL23xaBFFkq7dTM8XQ==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1441,15 +1508,15 @@ } }, "node_modules/@babel/plugin-transform-modules-systemjs": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.0.tgz", - "integrity": "sha512-PrujnVFbOdUpw4UHiVwKvKRLMMic8+eC0CuNlxjsyZUiBjhFdPsewdXCkveh2KqBA9/waD0W1b4hXSOBQJezpQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.29.7.tgz", + "integrity": "sha512-TM2ZcQLoG2/y4HODiStCo10DibYhWhGWAwVv+EQKmG/7GFl0N+AAmUiXOMKM+aiJ9XBJ9AHVZBvTzMnJ2sM3cQ==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-validator-identifier": "^7.28.5", - "@babel/traverse": "^7.29.0" + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1459,11 +1526,13 @@ } }, "node_modules/@babel/plugin-transform-modules-umd": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.29.7.tgz", + "integrity": "sha512-B4UkaTK3QpgCwJnrxKfMPKdo92CN7OKXAlpAAnM3UPu0Q0lCCk57ylA9AJbRy2v8dDKOPAAWcoR6CMyeoHwRCA==", "license": "MIT", "dependencies": { - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1473,13 +1542,13 @@ } }, "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.0.tgz", - "integrity": "sha512-1CZQA5KNAD6ZYQLPw7oi5ewtDNxH/2vuCh+6SmvgDfhumForvs8a1o9n0UrEoBD8HU4djO2yWngTQlXl1NDVEQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.29.7.tgz", + "integrity": "sha512-vuFoLwr4qnv2xbZ16SQd6uPcH5FNrLHhk/Jzo++0XJFcaDsr4gjJVg6j398oMHiC+83k/GiBzviwF5KBJkPUtQ==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1489,10 +1558,12 @@ } }, "node_modules/@babel/plugin-transform-new-target": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.29.7.tgz", + "integrity": "sha512-fEo41GmsOUhOBlw8ioo6zvjX5Xc2Lqkzlyfqbpsk3eB6TReV18uhxZ0esfEokVbY2+PVJAQHNKxER6lGrzNd3A==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1502,13 +1573,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.28.6.tgz", - "integrity": "sha512-3wKbRgmzYbw24mDJXT7N+ADXw8BC/imU9yo9c9X9NKaLF1fW+e5H1U5QjMUBe4Qo4Ox/o++IyUkl1sVCLgevKg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.29.7.tgz", + "integrity": "sha512-idmp1dFaekP9GbcMvG24Kvw2BfhFZjHnNJCkV4WuIY4PskJzwI3f1N5OdgYke38T7rftO6ERulFRn2cFeZwRkg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1518,13 +1589,13 @@ } }, "node_modules/@babel/plugin-transform-numeric-separator": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.28.6.tgz", - "integrity": "sha512-SJR8hPynj8outz+SlStQSwvziMN4+Bq99it4tMIf5/Caq+3iOc0JtKyse8puvyXkk3eFRIA5ID/XfunGgO5i6w==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-numeric-separator/-/plugin-transform-numeric-separator-7.29.7.tgz", + "integrity": "sha512-zR7fv/z14OjgHl4AgRtkDBvBMhIzCxqV/qN/2BCRC7LjFwvuzjYe7gDWxC4Wl/SNsLM6SE1IWvRPYMgSJaUvNw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1534,17 +1605,17 @@ } }, "node_modules/@babel/plugin-transform-object-rest-spread": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.6.tgz", - "integrity": "sha512-5rh+JR4JBC4pGkXLAcYdLHZjXudVxWMXbB6u6+E9lRL5TrGVbHt1TjxGbZ8CkmYw9zjkB7jutzOROArsqtncEA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.29.7.tgz", + "integrity": "sha512-Ld98jn4c0smUywL57m7SgsHq3OpThOa6LqZJif3G6jYOovPleoFhVrBJ1WegRApSFB2wu4+RelAj9AC9G08Z4A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/traverse": "^7.28.6" + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/traverse": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1554,11 +1625,13 @@ } }, "node_modules/@babel/plugin-transform-object-super": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.29.7.tgz", + "integrity": "sha512-Ea/diGcw0twB5IlZPO5sgET6fJsLJqPABqTuFWIR+iMPGPZJkATEIWx0wa+aEQ5UY1CBQyP/gkAiLEqn1vBiQA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-replace-supers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-replace-supers": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1568,13 +1641,13 @@ } }, "node_modules/@babel/plugin-transform-optional-catch-binding": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.28.6.tgz", - "integrity": "sha512-R8ja/Pyrv0OGAvAXQhSTmWyPJPml+0TMqXlO5w+AsMEiwb2fg3WkOvob7UxFSL3OIttFSGSRFKQsOhJ/X6HQdQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-catch-binding/-/plugin-transform-optional-catch-binding-7.29.7.tgz", + "integrity": "sha512-sLsyndxK2VwX6yNUOakMb7Sh553ZTe/vVM1XJ+9Z5aW1ytsc8xOIwmyk05NNjN60vkc5/KqoTH6hB4V41LJhng==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1584,13 +1657,13 @@ } }, "node_modules/@babel/plugin-transform-optional-chaining": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.28.6.tgz", - "integrity": "sha512-A4zobikRGJTsX9uqVFdafzGkqD30t26ck2LmOzAuLL8b2x6k3TIqRiT2xVvA9fNmFeTX484VpsdgmKNA0bS23w==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-optional-chaining/-/plugin-transform-optional-chaining-7.29.7.tgz", + "integrity": "sha512-6GM1dhvK3gNODkXcEcMCOLEDCLSoZ/sBbro2Ax8HURyasQ4NshagQixkRFdh5niI6E4gmA/jYI/4aT7rRos3ZQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1600,10 +1673,12 @@ } }, "node_modules/@babel/plugin-transform-parameters": { - "version": "7.27.7", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.29.7.tgz", + "integrity": "sha512-ZDOBqV/qLYJI0YElr8DcENEyARsFQeESqWXH6gZlghYXuPPjvweuDhP4VyEi4BlUBlLRFZVjxoZDMjxhLW766g==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1613,14 +1688,14 @@ } }, "node_modules/@babel/plugin-transform-private-methods": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.28.6.tgz", - "integrity": "sha512-piiuapX9CRv7+0st8lmuUlRSmX6mBcVeNQ1b4AYzJxfCMuBfB0vBXDiGSmm03pKJw1v6cZ8KSeM+oUnM6yAExg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-methods/-/plugin-transform-private-methods-7.29.7.tgz", + "integrity": "sha512-/6Rz4DK1ETDEM/bWHsPHcaEe7ZaT1EqSXjtSP/L0DijOYuaUhiRiOKcwpZ8P7zR4xXEHc2ITdiCgBm9Tpyv9ug==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1630,15 +1705,15 @@ } }, "node_modules/@babel/plugin-transform-private-property-in-object": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.28.6.tgz", - "integrity": "sha512-b97jvNSOb5+ehyQmBpmhOCiUC5oVK4PMnpRvO7+ymFBoqYjeDHIU9jnrNUuwHOiL9RpGDoKBpSViarV+BU+eVA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-private-property-in-object/-/plugin-transform-private-property-in-object-7.29.7.tgz", + "integrity": "sha512-+BNo06dnrzdNNqCm1X6YUaVv0DKk8Q+JYcoZfOkLhYWNCXzlwTSRq8zGWayT1csjcpNXV9CQTBRRbmTLZac5cA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.3", - "@babel/helper-create-class-features-plugin": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-create-class-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1648,10 +1723,12 @@ } }, "node_modules/@babel/plugin-transform-property-literals": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.29.7.tgz", + "integrity": "sha512-bOMRLQuI0A5ZqHq3OWJ89/rXpJ/NJrbVhXiP4zwPGMs6kpcVsuTUNjwoE30K0Qm3mf48a/TnRYYD6vPNqcg6jA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1661,11 +1738,13 @@ } }, "node_modules/@babel/plugin-transform-react-display-name": { - "version": "7.28.0", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-display-name/-/plugin-transform-react-display-name-7.29.7.tgz", + "integrity": "sha512-+1wdDMGNb4UPeY3Q4L5yLiYe6TXPXubs4NjrgRFw13hPRLJfEMw2Q5OXkee6/IfdqePIeW4Jjwe3aBh7SdKz4Q==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1675,15 +1754,17 @@ } }, "node_modules/@babel/plugin-transform-react-jsx": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.29.7.tgz", + "integrity": "sha512-WsZulLVBUHXVj2cUcPVx6UE21TpalB6bHbSFErKT0Ib++ax24jjXe73FqlWvdylFOjiuPHYi6VCcgRad1ItN+A==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/types": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-module-imports": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/plugin-syntax-jsx": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1693,11 +1774,13 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-development": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-development/-/plugin-transform-react-jsx-development-7.29.7.tgz", + "integrity": "sha512-Xfy3UVMF04+ypnFbkhvfqtmvwfe92qwQdbGZVonhE+6v35GzlofmOnA1szaZqzb9xYWr0nl1e5EMmzi0DNON1g==", "dev": true, "license": "MIT", "dependencies": { - "@babel/plugin-transform-react-jsx": "^7.27.1" + "@babel/plugin-transform-react-jsx": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1707,12 +1790,14 @@ } }, "node_modules/@babel/plugin-transform-react-pure-annotations": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-pure-annotations/-/plugin-transform-react-pure-annotations-7.29.7.tgz", + "integrity": "sha512-H5E+HBgDpr6Q5t+Aj11tL7XkIui1jhbIoArVQnqjgXo5/3YxkN7ZEBcWF4RQlB0T4rrxJQbXS6kiFV6B7XTqUA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-annotate-as-pure": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-annotate-as-pure": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1722,12 +1807,12 @@ } }, "node_modules/@babel/plugin-transform-regenerator": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.0.tgz", - "integrity": "sha512-FijqlqMA7DmRdg/aINBSs04y8XNTYw/lr1gJ2WsmBnnaNw1iS43EPkJW+zK7z65auG3AWRFXWj+NcTQwYptUog==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.29.7.tgz", + "integrity": "sha512-rNNFV0DBAJp988xW2DOntfDoYn1eR8GGF5AT5vYc+rjyfaQkM242c9tZUHHPe7KYaiJizXPWhQTzzdbXySyhBw==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1737,14 +1822,14 @@ } }, "node_modules/@babel/plugin-transform-regexp-modifiers": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.28.6.tgz", - "integrity": "sha512-QGWAepm9qxpaIs7UM9FvUSnCGlb8Ua1RhyM4/veAxLwt3gMat/LSGrZixyuj4I6+Kn9iwvqCyPTtbdxanYoWYg==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regexp-modifiers/-/plugin-transform-regexp-modifiers-7.29.7.tgz", + "integrity": "sha512-mB5Fs0VWrJ42ZCmc8114v60qetdaUVNkj9PmSZRmanCZM3S9hm0CFRLjRmYIsuXav14l2jvZ+4T8iiCGnhj3nQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1754,10 +1839,12 @@ } }, "node_modules/@babel/plugin-transform-reserved-words": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.29.7.tgz", + "integrity": "sha512-5+YhdpVgmfSmwZyLMftfaiffLRMHjzIRHFHHLdibcSyJm2pasMrKHrO3Ptrt2DRshjvpgjEJJ1zVW14WPq/6QA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1767,10 +1854,12 @@ } }, "node_modules/@babel/plugin-transform-shorthand-properties": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.29.7.tgz", + "integrity": "sha512-I+WYbGBAiCn7nA6xBrlgPH+MB7HWb4u8pv5S0Pv7OtwNvIFvCCb24YlttKEeUFVurfBCEaOTnuhlqsb7f0Z5Dg==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1780,13 +1869,13 @@ } }, "node_modules/@babel/plugin-transform-spread": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.28.6.tgz", - "integrity": "sha512-9U4QObUC0FtJl05AsUcodau/RWDytrU6uKgkxu09mLR9HLDAtUMoPuuskm5huQsoktmsYpI+bGmq+iapDcriKA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.29.7.tgz", + "integrity": "sha512-/u5K1QWada7tbYNqTjMh96718g9NTwh9tfPJMsSmVsQwGT447FskV+KcfeXkXq2GWki4EM/MuTdmBec+hOuVTQ==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-skip-transparent-expression-wrappers": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1796,10 +1885,12 @@ } }, "node_modules/@babel/plugin-transform-sticky-regex": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.29.7.tgz", + "integrity": "sha512-BCHzNYJGe9l7EpwwDBN/ztlL2NYFFq8hp9ddjtUEM9f2O7S7kKV/lL6Fwo7IF7NSkYhPK2vO+86nIGltA90MsA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1809,10 +1900,12 @@ } }, "node_modules/@babel/plugin-transform-template-literals": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.29.7.tgz", + "integrity": "sha512-NCSEJ4sLFU2gqAub45HYh4fus2yQ36rr6ei6vpU7NdoJqCpxvEG8E6eJpscGyXP3VHD2Ny+fSXr04k1hoUrFqA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1822,10 +1915,12 @@ } }, "node_modules/@babel/plugin-transform-typeof-symbol": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.29.7.tgz", + "integrity": "sha512-223mNGoTkBiTEWFoK+Q6Go3tueMRclO8vxxxxquNCYuNI4jWOofFKJRRDu6SDrB8Sgo1UEGW9T4GAQ8ZyRso1A==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1853,10 +1948,12 @@ } }, "node_modules/@babel/plugin-transform-unicode-escapes": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.29.7.tgz", + "integrity": "sha512-jCfXxSjf94lf4E0hKE0AByxF6F3/pVFqRdUUNkDJhsY0m1ZKjnN6ZYyMeHNpzflxb/0q5b7t3p+BE+SLF1WOtA==", "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1866,14 +1963,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-property-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.28.6.tgz", - "integrity": "sha512-4Wlbdl/sIZjzi/8St0evF0gEZrgOswVO6aOzqxh1kDZOl9WmLrHq2HtGhnOJZmHZYKP8WZ1MDLCt5DAWwRo57A==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-property-regex/-/plugin-transform-unicode-property-regex-7.29.7.tgz", + "integrity": "sha512-OgZ+zoAJgZLUCunsTRQ5LAjOywDv5zzZ2/hQ5aMw1pGXyY2rtE8/chXYUmu3AlVHKpm10KEdG9aMwbI/K76ZGw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1883,11 +1980,13 @@ } }, "node_modules/@babel/plugin-transform-unicode-regex": { - "version": "7.27.1", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.29.7.tgz", + "integrity": "sha512-7D/x/23/d/3VqZ0QA+LGbZMlGwZjztBygSWWWsfTPoQ1oQ6Q1P6Mr3d0kk42XabyUVw+fha3LqdRsFqeKqvCyA==", "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.27.1", - "@babel/helper-plugin-utils": "^7.27.1" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -1897,14 +1996,14 @@ } }, "node_modules/@babel/plugin-transform-unicode-sets-regex": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.28.6.tgz", - "integrity": "sha512-/wHc/paTUmsDYN7SZkpWxogTOBNnlx7nBQYfy6JJlCT7G3mVhltk3e++N7zV0XfgGsrqBxd4rJQt9H16I21Y1Q==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-sets-regex/-/plugin-transform-unicode-sets-regex-7.29.7.tgz", + "integrity": "sha512-BLOhLht9DOJwIxlmp91wHvkXv1lguuHS3/FwUO8HL1H0u8s4hR1gASVFyilu9iGtcTRYqjTZmlsFFeQletntEg==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-create-regexp-features-plugin": "^7.28.5", - "@babel/helper-plugin-utils": "^7.28.6" + "@babel/helper-create-regexp-features-plugin": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -2091,31 +2190,31 @@ } }, "node_modules/@babel/template": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.28.6.tgz", - "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.29.7.tgz", + "integrity": "sha512-puq+Gf35oI24FeN11LkoUQFqv9uwNeWpxXZi/Ji3rRIoKAzKnxRaZ+Gkj0vKS9ZCiTESfng1N9LyOyXvo+m+Gg==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.28.6", - "@babel/parser": "^7.28.6", - "@babel/types": "^7.28.6" + "@babel/code-frame": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/types": "^7.29.7" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/traverse": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.0.tgz", - "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.29.7.tgz", + "integrity": "sha512-EhlfNQtZ+NK22w5BM61ciuiq1m58ed33Wr1Xan//ZRTy6hgjnwyCffRYwzsGXdASJSUJ1guZILsErh1eQcl+zw==", "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-globals": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/types": "^7.29.7", "debug": "^4.3.1" }, "engines": { @@ -2123,13 +2222,13 @@ } }, "node_modules/@babel/types": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", - "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.7.tgz", + "integrity": "sha512-4zBIxpPzowiZpusoFkyGVwakdRJUyuH5PxQ/PrqghfdFWWasvnCdPfQXHrenDai+gyLARulZjZowCOj6fjT4pA==", "license": "MIT", "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.28.5" + "@babel/helper-string-parser": "^7.29.7", + "@babel/helper-validator-identifier": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -2190,7 +2289,6 @@ "integrity": "sha512-phrYmNiYppR7znFEdqgfWHXR6NCkZEK7hwWDHZUjit/2/U0r6XvkDl0SYnoM51Hq7FhCGdLDT6zxCCOY1hexsQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "eslint-visitor-keys": "^3.4.3" }, @@ -2210,7 +2308,6 @@ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -2224,7 +2321,6 @@ "integrity": "sha512-EriSTlt5OC9/7SXkRSCAhfSxxoSUgBm33OH+IkwbdpgoqsSsUg7y3uh+IICI/Qg4BBWr3U2i39RpmycbxMq4ew==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -2495,6 +2591,8 @@ }, "node_modules/@jridgewell/remapping": { "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/remapping/-/remapping-2.3.5.tgz", + "integrity": "sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2523,6 +2621,8 @@ }, "node_modules/@jsdevtools/ono": { "version": "7.1.3", + "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", + "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", "dev": true, "license": "MIT" }, @@ -2584,9 +2684,9 @@ } }, "node_modules/@mat3ra/esse": { - "version": "2026.5.28-0", - "resolved": "https://registry.npmjs.org/@mat3ra/esse/-/esse-2026.5.28-0.tgz", - "integrity": "sha512-J9nL113XnnOT7sWIWe1hUU4+GXrLrxruH6d8X94nsCTe0MN8n+3ABwL7MVJJ/HrvjgurrehoM/xvKxHC6vMurQ==", + "version": "2026.6.16-0", + "resolved": "https://registry.npmjs.org/@mat3ra/esse/-/esse-2026.6.16-0.tgz", + "integrity": "sha512-SZYwIzWX0G2RaX9uC1bH1531qCi2I2MMNdfKINhG7kweDuZ5Z4jnRBvQopstBfK8QjTSRuxeT4R6iiiT3e+ACg==", "dev": true, "license": "Apache-2.0", "dependencies": { @@ -2618,9 +2718,9 @@ } }, "node_modules/@mat3ra/esse/node_modules/@babel/cli": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.28.6.tgz", - "integrity": "sha512-6EUNcuBbNkj08Oj4gAZ+BUU8yLCgKzgVX4gaTh09Ya2C8ICM4P+G30g4m3akRxSYAp3A/gnWchrNst7px4/nUQ==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/cli/-/cli-7.29.7.tgz", + "integrity": "sha512-/75HwRbAYPqXv/Ax1h7Fg3IZfXgdU98jnA8H93/m/QBaPV3Hp5ICoLqzGYye1yHBCgpmXvtqgSUN8oOKX5tojQ==", "dev": true, "license": "MIT", "dependencies": { @@ -2648,21 +2748,21 @@ } }, "node_modules/@mat3ra/esse/node_modules/@babel/core": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.0.tgz", - "integrity": "sha512-CGOfOJqWjg2qW/Mb6zNsDm+u5vFQ8DxXfbM09z69p5Z6+mE1ikP2jUXw+j42Pf1XTYED2Rni5f95npYeuwMDQA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.29.7.tgz", + "integrity": "sha512-RgHBCvtjbOK2gXSNBNIkNoEc9qoVEtau3hj8gEqKQuL3HZAibKarWFEI3Lfm6EYKkLalOh8eSrj9b+ch9H/VBA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/code-frame": "^7.29.0", - "@babel/generator": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-module-transforms": "^7.28.6", - "@babel/helpers": "^7.28.6", - "@babel/parser": "^7.29.0", - "@babel/template": "^7.28.6", - "@babel/traverse": "^7.29.0", - "@babel/types": "^7.29.0", + "@babel/code-frame": "^7.29.7", + "@babel/generator": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-module-transforms": "^7.29.7", + "@babel/helpers": "^7.29.7", + "@babel/parser": "^7.29.7", + "@babel/template": "^7.29.7", + "@babel/traverse": "^7.29.7", + "@babel/types": "^7.29.7", "@jridgewell/remapping": "^2.3.5", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -2679,9 +2779,9 @@ } }, "node_modules/@mat3ra/esse/node_modules/@babel/eslint-parser": { - "version": "7.28.6", - "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.28.6.tgz", - "integrity": "sha512-QGmsKi2PBO/MHSQk+AAgA9R6OHQr+VqnniFE0eMWZcVcfBZoA2dKn2hUsl3Csg/Plt9opRUWdY7//VXsrIlEiA==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.29.7.tgz", + "integrity": "sha512-zxt+UJTOMKvUt3yOg+D58MLuz334pHp93qifMFcjIIO+9hN6t+ufw2gi7vDPMpxvfnHRR+3VVXvIjineCcgyXw==", "dev": true, "license": "MIT", "dependencies": { @@ -2716,6 +2816,9 @@ }, "node_modules/@mat3ra/esse/node_modules/@babel/plugin-proposal-class-properties": { "version": "7.18.6", + "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.18.6.tgz", + "integrity": "sha512-cumfXOF0+nzZrrN8Rf0t7M+tF6sZc7vhQwYQck9q1/5w2OExlD+b4v4RpMJFaV1Z7WcDRgO6FqvxqxGlwo+RHQ==", + "deprecated": "This proposal has been merged to the ECMAScript standard and thus this plugin is no longer maintained. Please use @babel/plugin-transform-class-properties instead.", "dev": true, "license": "MIT", "dependencies": { @@ -2743,76 +2846,77 @@ } }, "node_modules/@mat3ra/esse/node_modules/@babel/preset-env": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.2.tgz", - "integrity": "sha512-DYD23veRYGvBFhcTY1iUvJnDNpuqNd/BzBwCvzOTKUnJjKg5kpUBh3/u9585Agdkgj+QuygG7jLfOPWMa2KVNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.29.0", - "@babel/helper-compilation-targets": "^7.28.6", - "@babel/helper-plugin-utils": "^7.28.6", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.28.5", - "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.27.1", - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.27.1", - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.27.1", - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.28.6", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.29.7.tgz", + "integrity": "sha512-GYzX36n1nsciIb0uyH0GHwxwtNwPQIcpxSeiVLDtG/B7jB5xXgchnmL1f/jCX5o+pwnaDBtO60ONSJhEBJfxYA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.29.7", + "@babel/helper-compilation-targets": "^7.29.7", + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.29.7", + "@babel/plugin-bugfix-safari-class-field-initializer-scope": "^7.29.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.29.7", + "@babel/plugin-bugfix-safari-rest-destructuring-rhs-array": "^7.29.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.29.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.29.7", "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", - "@babel/plugin-syntax-import-assertions": "^7.28.6", - "@babel/plugin-syntax-import-attributes": "^7.28.6", + "@babel/plugin-syntax-import-assertions": "^7.29.7", + "@babel/plugin-syntax-import-attributes": "^7.29.7", "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", - "@babel/plugin-transform-arrow-functions": "^7.27.1", - "@babel/plugin-transform-async-generator-functions": "^7.29.0", - "@babel/plugin-transform-async-to-generator": "^7.28.6", - "@babel/plugin-transform-block-scoped-functions": "^7.27.1", - "@babel/plugin-transform-block-scoping": "^7.28.6", - "@babel/plugin-transform-class-properties": "^7.28.6", - "@babel/plugin-transform-class-static-block": "^7.28.6", - "@babel/plugin-transform-classes": "^7.28.6", - "@babel/plugin-transform-computed-properties": "^7.28.6", - "@babel/plugin-transform-destructuring": "^7.28.5", - "@babel/plugin-transform-dotall-regex": "^7.28.6", - "@babel/plugin-transform-duplicate-keys": "^7.27.1", - "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.0", - "@babel/plugin-transform-dynamic-import": "^7.27.1", - "@babel/plugin-transform-explicit-resource-management": "^7.28.6", - "@babel/plugin-transform-exponentiation-operator": "^7.28.6", - "@babel/plugin-transform-export-namespace-from": "^7.27.1", - "@babel/plugin-transform-for-of": "^7.27.1", - "@babel/plugin-transform-function-name": "^7.27.1", - "@babel/plugin-transform-json-strings": "^7.28.6", - "@babel/plugin-transform-literals": "^7.27.1", - "@babel/plugin-transform-logical-assignment-operators": "^7.28.6", - "@babel/plugin-transform-member-expression-literals": "^7.27.1", - "@babel/plugin-transform-modules-amd": "^7.27.1", - "@babel/plugin-transform-modules-commonjs": "^7.28.6", - "@babel/plugin-transform-modules-systemjs": "^7.29.0", - "@babel/plugin-transform-modules-umd": "^7.27.1", - "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.0", - "@babel/plugin-transform-new-target": "^7.27.1", - "@babel/plugin-transform-nullish-coalescing-operator": "^7.28.6", - "@babel/plugin-transform-numeric-separator": "^7.28.6", - "@babel/plugin-transform-object-rest-spread": "^7.28.6", - "@babel/plugin-transform-object-super": "^7.27.1", - "@babel/plugin-transform-optional-catch-binding": "^7.28.6", - "@babel/plugin-transform-optional-chaining": "^7.28.6", - "@babel/plugin-transform-parameters": "^7.27.7", - "@babel/plugin-transform-private-methods": "^7.28.6", - "@babel/plugin-transform-private-property-in-object": "^7.28.6", - "@babel/plugin-transform-property-literals": "^7.27.1", - "@babel/plugin-transform-regenerator": "^7.29.0", - "@babel/plugin-transform-regexp-modifiers": "^7.28.6", - "@babel/plugin-transform-reserved-words": "^7.27.1", - "@babel/plugin-transform-shorthand-properties": "^7.27.1", - "@babel/plugin-transform-spread": "^7.28.6", - "@babel/plugin-transform-sticky-regex": "^7.27.1", - "@babel/plugin-transform-template-literals": "^7.27.1", - "@babel/plugin-transform-typeof-symbol": "^7.27.1", - "@babel/plugin-transform-unicode-escapes": "^7.27.1", - "@babel/plugin-transform-unicode-property-regex": "^7.28.6", - "@babel/plugin-transform-unicode-regex": "^7.27.1", - "@babel/plugin-transform-unicode-sets-regex": "^7.28.6", + "@babel/plugin-transform-arrow-functions": "^7.29.7", + "@babel/plugin-transform-async-generator-functions": "^7.29.7", + "@babel/plugin-transform-async-to-generator": "^7.29.7", + "@babel/plugin-transform-block-scoped-functions": "^7.29.7", + "@babel/plugin-transform-block-scoping": "^7.29.7", + "@babel/plugin-transform-class-properties": "^7.29.7", + "@babel/plugin-transform-class-static-block": "^7.29.7", + "@babel/plugin-transform-classes": "^7.29.7", + "@babel/plugin-transform-computed-properties": "^7.29.7", + "@babel/plugin-transform-destructuring": "^7.29.7", + "@babel/plugin-transform-dotall-regex": "^7.29.7", + "@babel/plugin-transform-duplicate-keys": "^7.29.7", + "@babel/plugin-transform-duplicate-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-dynamic-import": "^7.29.7", + "@babel/plugin-transform-explicit-resource-management": "^7.29.7", + "@babel/plugin-transform-exponentiation-operator": "^7.29.7", + "@babel/plugin-transform-export-namespace-from": "^7.29.7", + "@babel/plugin-transform-for-of": "^7.29.7", + "@babel/plugin-transform-function-name": "^7.29.7", + "@babel/plugin-transform-json-strings": "^7.29.7", + "@babel/plugin-transform-literals": "^7.29.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.29.7", + "@babel/plugin-transform-member-expression-literals": "^7.29.7", + "@babel/plugin-transform-modules-amd": "^7.29.7", + "@babel/plugin-transform-modules-commonjs": "^7.29.7", + "@babel/plugin-transform-modules-systemjs": "^7.29.7", + "@babel/plugin-transform-modules-umd": "^7.29.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.29.7", + "@babel/plugin-transform-new-target": "^7.29.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.29.7", + "@babel/plugin-transform-numeric-separator": "^7.29.7", + "@babel/plugin-transform-object-rest-spread": "^7.29.7", + "@babel/plugin-transform-object-super": "^7.29.7", + "@babel/plugin-transform-optional-catch-binding": "^7.29.7", + "@babel/plugin-transform-optional-chaining": "^7.29.7", + "@babel/plugin-transform-parameters": "^7.29.7", + "@babel/plugin-transform-private-methods": "^7.29.7", + "@babel/plugin-transform-private-property-in-object": "^7.29.7", + "@babel/plugin-transform-property-literals": "^7.29.7", + "@babel/plugin-transform-regenerator": "^7.29.7", + "@babel/plugin-transform-regexp-modifiers": "^7.29.7", + "@babel/plugin-transform-reserved-words": "^7.29.7", + "@babel/plugin-transform-shorthand-properties": "^7.29.7", + "@babel/plugin-transform-spread": "^7.29.7", + "@babel/plugin-transform-sticky-regex": "^7.29.7", + "@babel/plugin-transform-template-literals": "^7.29.7", + "@babel/plugin-transform-typeof-symbol": "^7.29.7", + "@babel/plugin-transform-unicode-escapes": "^7.29.7", + "@babel/plugin-transform-unicode-property-regex": "^7.29.7", + "@babel/plugin-transform-unicode-regex": "^7.29.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.29.7", "@babel/preset-modules": "0.1.6-no-external-plugins", "babel-plugin-polyfill-corejs2": "^0.4.15", "babel-plugin-polyfill-corejs3": "^0.14.0", @@ -2843,16 +2947,18 @@ } }, "node_modules/@mat3ra/esse/node_modules/@babel/preset-react": { - "version": "7.28.5", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/preset-react/-/preset-react-7.29.7.tgz", + "integrity": "sha512-C+PV1TFUPTmBQGoPBL8j2QmLpZ117YTCwxIZeJOM96GbYMFSc7/pOXU5lVykwnZxyTqQxRsvoRk6f2FktZgGHA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1", - "@babel/helper-validator-option": "^7.27.1", - "@babel/plugin-transform-react-display-name": "^7.28.0", - "@babel/plugin-transform-react-jsx": "^7.27.1", - "@babel/plugin-transform-react-jsx-development": "^7.27.1", - "@babel/plugin-transform-react-pure-annotations": "^7.27.1" + "@babel/helper-plugin-utils": "^7.29.7", + "@babel/helper-validator-option": "^7.29.7", + "@babel/plugin-transform-react-display-name": "^7.29.7", + "@babel/plugin-transform-react-jsx": "^7.29.7", + "@babel/plugin-transform-react-jsx-development": "^7.29.7", + "@babel/plugin-transform-react-pure-annotations": "^7.29.7" }, "engines": { "node": ">=6.9.0" @@ -2862,9 +2968,9 @@ } }, "node_modules/@mat3ra/esse/node_modules/@babel/runtime-corejs3": { - "version": "7.29.2", - "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.2.tgz", - "integrity": "sha512-Lc94FOD5+0aXhdb0Tdg3RUtqT6yWbI/BbFWvlaSJ3gAb9Ks+99nHRDKADVqC37er4eCB0fHyWT+y+K3QOvJKbw==", + "version": "7.29.7", + "resolved": "https://registry.npmjs.org/@babel/runtime-corejs3/-/runtime-corejs3-7.29.7.tgz", + "integrity": "sha512-ppj9ouYku+RX0ljtgZd+KMO5mkM2bCqg8H2PYAFWnLsHEIKIdRojqbJ2i3eVHrisuxy7nOFCmngTDdWtUCdXUQ==", "dev": true, "license": "MIT", "dependencies": { @@ -3292,9 +3398,9 @@ } }, "node_modules/@mat3ra/esse/node_modules/@mat3ra/utils/node_modules/semver": { - "version": "7.7.4", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.4.tgz", - "integrity": "sha512-vFKC2IEtQnVhpT78h1Yp8wzwrf8CM+MzKMHGJZfBtzhZNycRFnXsHk6E5TxIkkMsgNS7mdX3AGB7x2QM2di4lA==", + "version": "7.8.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.2.tgz", + "integrity": "sha512-c8jsqUZm3omBOI66G90z1Dyw5z622G8oLG+omfsHBJf3CWQTlOcwOjvOG6wtiNfW6anKm/eA39LMwMtMez2TiQ==", "dev": true, "license": "ISC", "bin": { @@ -3372,6 +3478,8 @@ }, "node_modules/@mat3ra/esse/node_modules/convert-source-map": { "version": "2.0.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true, "license": "MIT" }, @@ -3390,10 +3498,20 @@ } }, "node_modules/@mat3ra/esse/node_modules/js-yaml": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.1.tgz", - "integrity": "sha512-qQKT4zQxXl8lLwBtHMWwaTcGfFOZviOJet3Oy/xmGk2gZH677CJM9EvtfdSkgWcATZhj/55JZ0rmy3myCT5lsA==", + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.2.0.tgz", + "integrity": "sha512-ePWsvanv0DWuDRsW8dnt+R4jQ31SCRCQ7hhNcPXZPsoBZiemuZNYGf7adZdqX2D86j6rvKp3RpCxVTSb8WQlOw==", "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/puzrin" + }, + { + "type": "github", + "url": "https://github.com/sponsors/nodeca" + } + ], "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -4066,7 +4184,6 @@ "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -4081,7 +4198,6 @@ "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 8" } @@ -4092,7 +4208,6 @@ "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -4167,6 +4282,8 @@ }, "node_modules/@types/js-yaml": { "version": "4.0.9", + "resolved": "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz", + "integrity": "sha512-k4MGaQl5TGo/iipqb2UDG2UwjXziSWkh0uysQelTlJpX1qGlpUZYm8PnO4DxG1qBomtJUdYJ6qR6xdIah10JLg==", "dev": true, "license": "MIT" }, @@ -4176,6 +4293,8 @@ }, "node_modules/@types/json-schema-merge-allof": { "version": "0.6.5", + "resolved": "https://registry.npmjs.org/@types/json-schema-merge-allof/-/json-schema-merge-allof-0.6.5.tgz", + "integrity": "sha512-5mS11ZUTyFNUVEMpK3uKoPb6BWL/nLgW/ln2VOiI8OOxKEYC4Gl9O3WjS5P49yqVTfkcbCAPKw3T1O4erUah5g==", "dev": true, "license": "MIT", "dependencies": { @@ -4238,8 +4357,7 @@ "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.7.1.tgz", "integrity": "sha512-FmgJfu+MOcQ370SD0ev7EI8TlCAfKYU+B4m5T3yXc1CiRN94g/SZPtsCkk506aUDtlMnFZvasDwHHUcZUEaYuA==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@types/sprintf-js": { "version": "1.1.4", @@ -4267,7 +4385,6 @@ "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.62.0", @@ -4298,12 +4415,11 @@ } }, "node_modules/@typescript-eslint/eslint-plugin/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", "dev": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -4317,7 +4433,6 @@ "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -4346,7 +4461,6 @@ "integrity": "sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0" @@ -4365,7 +4479,6 @@ "integrity": "sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/typescript-estree": "5.62.0", "@typescript-eslint/utils": "5.62.0", @@ -4394,7 +4507,6 @@ "integrity": "sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4409,7 +4521,6 @@ "integrity": "sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==", "dev": true, "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@typescript-eslint/types": "5.62.0", "@typescript-eslint/visitor-keys": "5.62.0", @@ -4433,12 +4544,11 @@ } }, "node_modules/@typescript-eslint/typescript-estree/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", "dev": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -4452,7 +4562,6 @@ "integrity": "sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@types/json-schema": "^7.0.9", @@ -4475,12 +4584,11 @@ } }, "node_modules/@typescript-eslint/utils/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", "dev": true, "license": "ISC", - "peer": true, "bin": { "semver": "bin/semver.js" }, @@ -4494,7 +4602,6 @@ "integrity": "sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@typescript-eslint/types": "5.62.0", "eslint-visitor-keys": "^3.3.0" @@ -4513,7 +4620,6 @@ "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -4599,6 +4705,8 @@ }, "node_modules/ajv-formats": { "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-2.1.1.tgz", + "integrity": "sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==", "dev": true, "license": "MIT", "dependencies": { @@ -4776,7 +4884,6 @@ "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -5155,6 +5262,8 @@ }, "node_modules/charenc": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -5267,6 +5376,8 @@ }, "node_modules/clone": { "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", "dev": true, "license": "MIT", "engines": { @@ -5395,6 +5506,8 @@ }, "node_modules/compute-gcd": { "version": "1.2.1", + "resolved": "https://registry.npmjs.org/compute-gcd/-/compute-gcd-1.2.1.tgz", + "integrity": "sha512-TwMbxBNz0l71+8Sc4czv13h4kEqnchV9igQZBi6QUaz09dnz13juGnnaWWJTRsP3brxOoxeB4SA2WELLw1hCtg==", "dev": true, "dependencies": { "validate.io-array": "^1.0.3", @@ -5404,6 +5517,8 @@ }, "node_modules/compute-lcm": { "version": "1.1.2", + "resolved": "https://registry.npmjs.org/compute-lcm/-/compute-lcm-1.1.2.tgz", + "integrity": "sha512-OFNPdQAXnQhDSKioX8/XYT6sdUlXwpeMjfd6ApxMJfyZ4GxmLR1xvMERctlYhlHwIiz6CSpBc2+qYKjHGZw4TQ==", "dev": true, "dependencies": { "compute-gcd": "^1.2.1", @@ -5469,6 +5584,8 @@ }, "node_modules/crypt": { "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", "dev": true, "license": "BSD-3-Clause", "engines": { @@ -5486,6 +5603,8 @@ }, "node_modules/dag-map": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/dag-map/-/dag-map-1.0.2.tgz", + "integrity": "sha512-+LSAiGFwQ9dRnRdOeaj7g47ZFJcOUPukAP8J3A3fuZ1g9Y44BG+P1sgApjLXTQPOzC4+7S9Wr8kXsfpINM4jpw==", "dev": true, "license": "MIT" }, @@ -5663,7 +5782,6 @@ "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "path-type": "^4.0.0" }, @@ -5956,9 +6074,9 @@ } }, "node_modules/eslint-compat-utils/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", "dev": true, "license": "ISC", "peer": true, @@ -6219,9 +6337,9 @@ } }, "node_modules/eslint-plugin-jsonc/node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "dev": true, "license": "MIT", "peer": true, @@ -6610,7 +6728,6 @@ "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -6650,7 +6767,6 @@ "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", "dev": true, "license": "ISC", - "peer": true, "dependencies": { "reusify": "^1.0.4" } @@ -7000,7 +7116,6 @@ "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -7022,7 +7137,6 @@ "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -7048,8 +7162,7 @@ "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/growl": { "version": "1.10.5", @@ -7209,7 +7322,6 @@ "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 4" } @@ -7344,6 +7456,8 @@ }, "node_modules/is-buffer": { "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true, "license": "MIT" }, @@ -7464,6 +7578,8 @@ }, "node_modules/is-invalid-path": { "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-invalid-path/-/is-invalid-path-0.1.0.tgz", + "integrity": "sha512-aZMG0T3F34mTg4eTdszcGXx54oiZ4NtHSft3hWNJMGJXUUqdIj3cOZuHcU0nCWWcY3jd7yRe/3AEm3vSNTpBGQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7475,6 +7591,8 @@ }, "node_modules/is-invalid-path/node_modules/is-extglob": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha512-7Q+VbVafe6x2T+Tu6NcOf6sRklazEPmBoB3IWk3WdGZM2iGUwU/Oe3Wtq5lSEkDTTlpp8yx+5t4pzO/i9Ty1ww==", "dev": true, "license": "MIT", "engines": { @@ -7483,6 +7601,8 @@ }, "node_modules/is-invalid-path/node_modules/is-glob": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha512-a1dBeB19NXsf/E0+FHqkagizel/LQw2DjSQpvQrj3zT+jYPpaUCryPnrQajXKFLCMuf4I6FhRpaGtw4lPrG6Eg==", "dev": true, "license": "MIT", "dependencies": { @@ -7671,6 +7791,8 @@ }, "node_modules/is-valid-path": { "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-valid-path/-/is-valid-path-0.1.1.tgz", + "integrity": "sha512-+kwPrVDu9Ms03L90Qaml+79+6DZHqHyRoANI6IsZJ/g8frhnfchDOBCa0RbQ6/kdHt5CS5OeIEyrYznNuVN+8A==", "dev": true, "license": "MIT", "dependencies": { @@ -7924,6 +8046,8 @@ }, "node_modules/json-schema-compare": { "version": "0.2.2", + "resolved": "https://registry.npmjs.org/json-schema-compare/-/json-schema-compare-0.2.2.tgz", + "integrity": "sha512-c4WYmDKyJXhs7WWvAWm3uIYnfyWFoIp+JEoX34rctVvEkMYCPGhXtvmFFXiffBbxfZsvQ0RNnV5H7GvDF5HCqQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7932,6 +8056,8 @@ }, "node_modules/json-schema-deref-sync": { "version": "0.14.0", + "resolved": "https://registry.npmjs.org/json-schema-deref-sync/-/json-schema-deref-sync-0.14.0.tgz", + "integrity": "sha512-yGR1xmhdiD6R0MSrwWcFxQzAj5b3i5Gb/mt5tvQKgFMMeNe0KZYNEN/jWr7G+xn39Azqgcvk4ZKMs8dQl8e4wA==", "dev": true, "license": "MIT", "dependencies": { @@ -7950,6 +8076,8 @@ }, "node_modules/json-schema-merge-allof": { "version": "0.8.1", + "resolved": "https://registry.npmjs.org/json-schema-merge-allof/-/json-schema-merge-allof-0.8.1.tgz", + "integrity": "sha512-CTUKmIlPJbsWfzRRnOXz+0MjIqvnleIXwFTzz+t9T86HnYX/Rozria6ZVGLktAU9e+NygNljveP+yxqtQp/Q4w==", "dev": true, "license": "MIT", "dependencies": { @@ -7963,6 +8091,8 @@ }, "node_modules/json-schema-to-typescript": { "version": "15.0.4", + "resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-15.0.4.tgz", + "integrity": "sha512-Su9oK8DR4xCmDsLlyvadkXzX6+GGXJpbhwoLtOGArAG61dvbW4YQmSEno2y66ahpIdmLMg6YUf/QHLgiwvkrHQ==", "dev": true, "license": "MIT", "dependencies": { @@ -7984,7 +8114,9 @@ } }, "node_modules/json-schema-to-typescript/node_modules/prettier": { - "version": "3.6.2", + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.8.3.tgz", + "integrity": "sha512-7igPTM53cGHMW8xWuVTydi2KO233VFiTNyF5hLJqpilHfmn8C8gPf+PS7dUT64YcXFbiMGZxS9pCSxL/Dxm/Jw==", "dev": true, "license": "MIT", "bin": { @@ -8036,9 +8168,9 @@ } }, "node_modules/jsonc-eslint-parser/node_modules/acorn": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", - "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.17.0.tgz", + "integrity": "sha512-xRQbDb9BnwDafYNn6Vwl839DYVjqXYb1XVGtWAZ1kcDc6iwAL4hg3B1dZlRiuENFeO2H53gFG3in621AdERVAg==", "dev": true, "license": "MIT", "peer": true, @@ -8083,9 +8215,9 @@ } }, "node_modules/jsonc-eslint-parser/node_modules/semver": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.1.tgz", - "integrity": "sha512-rkVq3IXh+4FDGch+KwzX3aV9W3kO54GyEgpvBzSyctDA6Xtd7RJQV1xmXbeQp5v7+VzLOfVqiutSE6GICgPFvg==", + "version": "7.8.4", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.8.4.tgz", + "integrity": "sha512-rUCObTnP32Q08R2uuIrt7r9PlEonuTmtuXYcW6s5kjdlj3xbnwe+21yXptAUYcMAABLkYYTtnmzb3w3EDZfueA==", "dev": true, "license": "ISC", "peer": true, @@ -8498,6 +8630,8 @@ }, "node_modules/md5": { "version": "2.2.1", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.2.1.tgz", + "integrity": "sha512-PlGG4z5mBANDGCKsYQe0CaUYHdZYZt8ZPZLmEt+Urf0W4GlpTX4HescwHU+dc9+Z/G/vZKYZYFrwgm9VxK6QOQ==", "dev": true, "license": "BSD-3-Clause", "dependencies": { @@ -8508,6 +8642,8 @@ }, "node_modules/memory-cache": { "version": "0.2.0", + "resolved": "https://registry.npmjs.org/memory-cache/-/memory-cache-0.2.0.tgz", + "integrity": "sha512-OcjA+jzjOYzKmKS6IQVALHLVz+rNTMPoJvCztFaZxwG14wtAW7VRZjwTQu06vKCYOxh4jVnik7ya0SXTB0W+xA==", "dev": true, "license": "BSD-2-Clause" }, @@ -8522,7 +8658,6 @@ "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">= 8" } @@ -8756,8 +8891,7 @@ "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", "dev": true, - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/node-preload": { "version": "0.2.1", @@ -9327,7 +9461,6 @@ "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "node": ">=8" } @@ -9542,8 +9675,7 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/randombytes": { "version": "2.1.0", @@ -9765,7 +9897,6 @@ "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", "dev": true, "license": "MIT", - "peer": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -9809,7 +9940,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "queue-microtask": "^1.2.2" } @@ -10464,12 +10594,14 @@ "license": "MIT" }, "node_modules/tinyglobby": { - "version": "0.2.15", + "version": "0.2.17", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.17.tgz", + "integrity": "sha512-wXR/dYpcqKmfWpEdZjiKJOwCNFndD0DMnrW/cYjVGttEkBfVgcLFHoNrlj47mjOVic9yyNu65alsgF4NQyTa2g==", "dev": true, "license": "MIT", "dependencies": { "fdir": "^6.5.0", - "picomatch": "^4.0.3" + "picomatch": "^4.0.4" }, "engines": { "node": ">=12.0.0" @@ -10480,6 +10612,8 @@ }, "node_modules/tinyglobby/node_modules/fdir": { "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", "dev": true, "license": "MIT", "engines": { @@ -10495,7 +10629,9 @@ } }, "node_modules/tinyglobby/node_modules/picomatch": { - "version": "4.0.3", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "engines": { @@ -10518,6 +10654,8 @@ }, "node_modules/traverse": { "version": "0.6.11", + "resolved": "https://registry.npmjs.org/traverse/-/traverse-0.6.11.tgz", + "integrity": "sha512-vxXDZg8/+p3gblxB6BhhG5yWVn1kGRlaL8O78UDXc3wRnPizB5g83dcvWV1jpDMIPnjZjOFuxlMmE82XJ4407w==", "dev": true, "license": "MIT", "dependencies": { @@ -10634,7 +10772,6 @@ "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "tslib": "^1.8.1" }, @@ -10650,8 +10787,7 @@ "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", "dev": true, - "license": "0BSD", - "peer": true + "license": "0BSD" }, "node_modules/type-check": { "version": "0.4.0", @@ -10768,6 +10904,8 @@ }, "node_modules/typedarray.prototype.slice": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/typedarray.prototype.slice/-/typedarray.prototype.slice-1.0.5.tgz", + "integrity": "sha512-q7QNVDGTdl702bVFiI5eY4l/HkgCM6at9KhcFbgUAzezHFbOVy4+0O/lCjsABEQwbZPravVfBIiBVGo89yzHFg==", "dev": true, "license": "MIT", "dependencies": { @@ -10929,19 +11067,27 @@ }, "node_modules/valid-url": { "version": "1.0.9", + "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", + "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==", "dev": true }, "node_modules/validate.io-array": { "version": "1.0.6", + "resolved": "https://registry.npmjs.org/validate.io-array/-/validate.io-array-1.0.6.tgz", + "integrity": "sha512-DeOy7CnPEziggrOO5CZhVKJw6S3Yi7e9e65R1Nl/RTN1vTQKnzjfvks0/8kQ40FP/dsjRAOd4hxmJ7uLa6vxkg==", "dev": true, "license": "MIT" }, "node_modules/validate.io-function": { "version": "1.0.2", + "resolved": "https://registry.npmjs.org/validate.io-function/-/validate.io-function-1.0.2.tgz", + "integrity": "sha512-LlFybRJEriSuBnUhQyG5bwglhh50EpTL2ul23MPIuR1odjO7XaMLFV8vHGwp7AZciFxtYOeiSCT5st+XSPONiQ==", "dev": true }, "node_modules/validate.io-integer": { "version": "1.0.5", + "resolved": "https://registry.npmjs.org/validate.io-integer/-/validate.io-integer-1.0.5.tgz", + "integrity": "sha512-22izsYSLojN/P6bppBqhgUDjCkr5RY2jd+N2a3DCAUey8ydvrZ/OkGvFPR7qfOpwR2LC5p4Ngzxz36g5Vgr/hQ==", "dev": true, "dependencies": { "validate.io-number": "^1.0.3" @@ -10949,6 +11095,8 @@ }, "node_modules/validate.io-integer-array": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/validate.io-integer-array/-/validate.io-integer-array-1.0.0.tgz", + "integrity": "sha512-mTrMk/1ytQHtCY0oNO3dztafHYyGU88KL+jRxWuzfOmQb+4qqnWmI+gykvGp8usKZOM0H7keJHEbRaFiYA0VrA==", "dev": true, "dependencies": { "validate.io-array": "^1.0.3", @@ -10957,6 +11105,8 @@ }, "node_modules/validate.io-number": { "version": "1.0.3", + "resolved": "https://registry.npmjs.org/validate.io-number/-/validate.io-number-1.0.3.tgz", + "integrity": "sha512-kRAyotcbNaSYoDnXvb4MHg/0a1egJdLwS6oJ38TJY7aw9n93Fl/3blIXdyYvPOp55CNxywooG/3BcrwNrBpcSg==", "dev": true }, "node_modules/which": { diff --git a/package.json b/package.json index d1802c1f..f8674fb0 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@exabyte-io/eslint-config": "2025.5.13-0", "@mat3ra/ade": "2026.5.28-0", "@mat3ra/code": "2026.5.27-0", - "@mat3ra/esse": "2026.5.28-0", + "@mat3ra/esse": "2026.6.16-0", "@mat3ra/ide": "2026.5.28-0", "@mat3ra/made": "2026.5.28-0", "@mat3ra/mode": "2026.5.29-1", @@ -50,6 +50,8 @@ "@mat3ra/standata": "2026.5.28-0", "@mat3ra/tsconfig": "^2024.6.3-0", "@mat3ra/utils": "2025.9.20-0", + "@typescript-eslint/eslint-plugin": "^5.62.0", + "@typescript-eslint/parser": "^5.62.0", "@types/nunjucks": "^3.2.6", "chai": "^4.3.4", "eslint": "^7.32.0", @@ -76,7 +78,7 @@ "peerDependencies": { "@mat3ra/ade": "*", "@mat3ra/code": "*", - "@mat3ra/esse": "*", + "@mat3ra/esse": "file:../esse/mat3ra-esse-0.0.0.tgz", "@mat3ra/ide": "*", "@mat3ra/made": "*", "@mat3ra/mode": "*", diff --git a/scripts/generate-mixins.ts b/scripts/generate-mixins.ts index 9e80395e..d8fec630 100644 --- a/scripts/generate-mixins.ts +++ b/scripts/generate-mixins.ts @@ -28,6 +28,7 @@ const OUTPUT_PATHS = { "workflow/unit/mixins/map": "src/js/generated/MapUnitSchemaMixin.ts", "workflow/unit/mixins/reduce": "src/js/generated/ReduceUnitSchemaMixin.ts", "workflow/unit/mixins/subworkflow": "src/js/generated/SubworkflowUnitSchemaMixin.ts", + "workflow/unit/mixins/error": "src/js/generated/ErrorUnitSchemaMixin.ts", "workflow/unit/input/-inputItem": "src/js/generated/ExecutionUnitInputSchemaMixin.ts", "workflow/subworkflow/mixin": "src/js/generated/SubworkflowSchemaMixin.ts", "workflow/base": "src/js/generated/WorkflowSchemaMixin.ts", diff --git a/src/js/Subworkflow.ts b/src/js/Subworkflow.ts index 8183dd8e..e6d25b4a 100644 --- a/src/js/Subworkflow.ts +++ b/src/js/Subworkflow.ts @@ -100,13 +100,18 @@ class Subworkflow extends InMemoryEntity implements SubworkflowSchema { static get defaultConfig() { const defaultName = "New Subworkflow"; + const application = new ApplicationRegistry().getDefaultApplication(); + + if (!application) { + throw new Error("No default application found"); + } + return { _id: Utils.uuid.getUUID(), name: defaultName, - application: new ApplicationRegistry().getDefaultApplication(), - // TODO: confirm if `functional` is required field. If not, update ESSE schema + application, // `Model.defaultConfig` from @mat3ra/mode may omit `functional`; ESSE subworkflow schema requires it once schemas are registered. - model: { ...Model.defaultConfig, functional: "pbe" }, + model: { ...Model.defaultConfig, functional: "pbe" as const }, properties: [], units: [], }; diff --git a/src/js/Workflow.ts b/src/js/Workflow.ts index 7fa67694..bdeeb10c 100644 --- a/src/js/Workflow.ts +++ b/src/js/Workflow.ts @@ -15,11 +15,7 @@ import { namedEntityMixin } from "@mat3ra/code/dist/js/entity/mixins/NamedEntity import { Taggable, taggableMixin } from "@mat3ra/code/dist/js/entity/mixins/TaggableMixin"; import JSONSchemasInterface from "@mat3ra/esse/dist/js/esse/JSONSchemasInterface"; import type { AnyObject } from "@mat3ra/esse/dist/js/esse/types"; -import type { - ApplicationSchema, - SubworkflowSchema, - WorkflowSchema, -} from "@mat3ra/esse/dist/js/types"; +import type { ApplicationSchema, SubworkflowSchema } from "@mat3ra/esse/dist/js/types"; import { ComputedEntityMixin, computedEntityMixin } from "@mat3ra/ide/dist/js/compute"; import type { Material } from "@mat3ra/made"; import type { MetaPropertyHolder } from "@mat3ra/prode"; @@ -45,6 +41,7 @@ import { getUsedModels, } from "./utils/workflow"; import defaultWorkflowConfig from "./workflows/default"; +import type { WorkflowSchema } from "./workflows/types"; interface Workflow extends Defaultable, diff --git a/src/js/context/mixins/MaterialContextMixin.ts b/src/js/context/mixins/MaterialContextMixin.ts index 6346e1db..5f12a994 100644 --- a/src/js/context/mixins/MaterialContextMixin.ts +++ b/src/js/context/mixins/MaterialContextMixin.ts @@ -9,7 +9,7 @@ export type MaterialContextMixin = { readonly isMaterialCreatedDefault: boolean; readonly isMaterialUpdated: boolean; material: OrderedMaterial; - extraData?: { materialHash: string }; + extraData?: { materialHash?: string }; initMaterialContextMixin(externalContext: MaterialExternalContext): void; updateMaterialHash(): void; }; diff --git a/src/js/enums.ts b/src/js/enums.ts index ee819d61..7129d27e 100644 --- a/src/js/enums.ts +++ b/src/js/enums.ts @@ -11,6 +11,7 @@ export const UNIT_TYPES = { subworkflow: "subworkflow", io: "io", assertion: "assertion", + error: "error", } as const; export enum UnitType { @@ -24,6 +25,7 @@ export enum UnitType { subworkflow = "subworkflow", io = "io", assertion = "assertion", + error = "error", } export enum UnitTag { diff --git a/src/js/generated/ErrorUnitSchemaMixin.ts b/src/js/generated/ErrorUnitSchemaMixin.ts new file mode 100644 index 00000000..dd89d7b6 --- /dev/null +++ b/src/js/generated/ErrorUnitSchemaMixin.ts @@ -0,0 +1,28 @@ +import type { InMemoryEntity } from "@mat3ra/code/dist/js/entity"; +import type { ErrorUnitMixinSchema } from "@mat3ra/esse/dist/js/types"; + +export type ErrorUnitSchemaMixin = ErrorUnitMixinSchema; + +export type ErrorUnitInMemoryEntity = InMemoryEntity & ErrorUnitSchemaMixin; + +export function errorUnitSchemaMixin( + item: InMemoryEntity, +): asserts item is T & ErrorUnitSchemaMixin { + // @ts-expect-error + const properties: InMemoryEntity & ErrorUnitSchemaMixin = { + get type() { + return this.prop("type"); + }, + set type(value: ErrorUnitMixinSchema["type"]) { + this.setProp("type", value); + }, + get reason() { + return this.requiredProp("reason"); + }, + set reason(value: ErrorUnitMixinSchema["reason"]) { + this.setProp("reason", value); + }, + }; + + Object.defineProperties(item, Object.getOwnPropertyDescriptors(properties)); +} diff --git a/src/js/index.ts b/src/js/index.ts index 83d9fcd1..6af70f36 100644 --- a/src/js/index.ts +++ b/src/js/index.ts @@ -7,6 +7,7 @@ import { AssignmentUnit, BaseUnit, ConditionUnit, + ErrorUnit, ExecutionUnit, IOUnit, MapUnit, @@ -21,6 +22,7 @@ import Workflow from "./Workflow"; export type { OrderedMaterial } from "./context/mixins/MaterialContextMixin"; export type { MaterialsSet } from "./context/mixins/MaterialsSetContextMixin"; export type { AnySubworkflowUnit, DefaultSubworkflowUnitType } from "./units/factory"; +export { repairWorkflow } from "./utils/repair"; export { Subworkflow, Workflow, @@ -33,6 +35,7 @@ export { AssertionUnit, AssignmentUnit, ConditionUnit, + ErrorUnit, IOUnit, MapUnit, ReduceUnit, diff --git a/src/js/units/ErrorUnit.ts b/src/js/units/ErrorUnit.ts new file mode 100644 index 00000000..4e43263e --- /dev/null +++ b/src/js/units/ErrorUnit.ts @@ -0,0 +1,42 @@ +import type { Constructor } from "@mat3ra/code/dist/js/utils/types"; +import JSONSchemasInterface from "@mat3ra/esse/dist/js/esse/JSONSchemasInterface"; +import type { AnyObject } from "@mat3ra/esse/dist/js/esse/types"; +import type { ErrorUnitSchema } from "@mat3ra/esse/dist/js/types"; + +import { UnitStatus, UnitType } from "../enums"; +import { type ErrorUnitSchemaMixin, errorUnitSchemaMixin } from "../generated/ErrorUnitSchemaMixin"; +import BaseUnit from "./BaseUnit"; + +type Schema = ErrorUnitSchema; +type Base = typeof BaseUnit & Constructor; + +export type ErrorUnitConfig = Partial; + +class ErrorUnit extends (BaseUnit as Base) implements Schema { + declare toJSON: () => Schema & AnyObject; + + declare _json: Schema & AnyObject; + + static get jsonSchema() { + return JSONSchemasInterface.getSchemaById("workflow/unit/error"); + } + + constructor(config: ErrorUnitConfig) { + const schema = { + name: UnitType.error, + results: [], + preProcessors: [], + postProcessors: [], + monitors: [], + reason: "", + ...config, + type: UnitType.error as Schema["type"], + status: config.status ?? UnitStatus.error, + }; + super(schema); + } +} + +errorUnitSchemaMixin(ErrorUnit.prototype); + +export default ErrorUnit; diff --git a/src/js/units/factory.ts b/src/js/units/factory.ts index aa227a3d..1ee9f938 100644 --- a/src/js/units/factory.ts +++ b/src/js/units/factory.ts @@ -1,8 +1,10 @@ import type { + ApplicationSchema, AssertionUnitSchema, AssignmentUnitSchema, ConditionUnitSchema, DataIOUnitSchema, + ErrorUnitSchema, ExecutionUnitSchema, MapUnitSchema, ReduceUnitSchema, @@ -14,35 +16,43 @@ import { UnitType } from "../enums"; import AssertionUnit, { type AssertionUnitConfig } from "./AssertionUnit"; import AssignmentUnit, { type AssignmentUnitConfig } from "./AssignmentUnit"; import ConditionUnit, { type ConditionUnitConfig } from "./ConditionUnit"; +import ErrorUnit, { type ErrorUnitConfig } from "./ErrorUnit"; import ExecutionUnit, { type ExecutionUnitConfig } from "./ExecutionUnit"; import IOUnit, { type IOUnitConfig } from "./IOUnit"; import MapUnit from "./MapUnit"; import ReduceUnit from "./ReduceUnit"; import SubworkflowUnit from "./SubworkflowUnit"; -export type AnyWorkflowUnit = MapUnit | SubworkflowUnit | ReduceUnit; +export type AnyWorkflowUnit = MapUnit | SubworkflowUnit | ReduceUnit | ErrorUnit; -export type AnyWorkflowUnitSchema = MapUnitSchema | SubworkflowUnitSchema | ReduceUnitSchema; +export type AnyWorkflowUnitSchema = + | MapUnitSchema + | SubworkflowUnitSchema + | ReduceUnitSchema + | ErrorUnitSchema; export type AnySubworkflowUnit = | ExecutionUnit | AssignmentUnit | ConditionUnit | IOUnit - | AssertionUnit; + | AssertionUnit + | ErrorUnit; export type AnySubworkflowUnitSchema = | ExecutionUnitSchema | AssertionUnitSchema | AssignmentUnitSchema | ConditionUnitSchema - | DataIOUnitSchema; + | DataIOUnitSchema + | ErrorUnitSchema; type ExcutionConfig = ExecutionUnitConfig & Pick; type AssignmentConfig = AssignmentUnitConfig & Pick; type ConditionConfig = ConditionUnitConfig & Pick; type IOConfig = IOUnitConfig & Pick; type AssertionConfig = AssertionUnitConfig & Pick; +type ErrorConfig = ErrorUnitConfig & Pick; /** Subworkflow unit kinds supported by {@link UnitFactory.createDefaultSubworkflowUnit}. */ export type DefaultSubworkflowUnitType = @@ -59,16 +69,20 @@ export class UnitFactory { */ static createDefaultSubworkflowUnit( type: "execution", - application: ExecutionUnitSchema["application"], - ): AnySubworkflowUnit; + application: ApplicationSchema, + ): ExecutionUnit; - static createDefaultSubworkflowUnit( - type: "assignment" | "condition" | "io" | "assertion", - ): AnySubworkflowUnit; + static createDefaultSubworkflowUnit(type: "assignment"): AssignmentUnit; + + static createDefaultSubworkflowUnit(type: "condition"): ConditionUnit; + + static createDefaultSubworkflowUnit(type: "io"): IOUnit; + + static createDefaultSubworkflowUnit(type: "assertion"): AssertionUnit; static createDefaultSubworkflowUnit( type: DefaultSubworkflowUnitType, - application?: ExecutionUnitSchema["application"], + application?: ApplicationSchema, ): AnySubworkflowUnit { if (type === "execution") { if (application === undefined) { @@ -105,13 +119,21 @@ export class UnitFactory { return new SubworkflowUnit(config); case UnitType.reduce: return new ReduceUnit(config); + case UnitType.error: + return new ErrorUnit(config); default: throw new Error(`Unknown unit type: ${config.type}`); } } static createInSubworkflow( - config: ExcutionConfig | AssignmentConfig | ConditionConfig | IOConfig | AssertionConfig, + config: + | ExcutionConfig + | AssignmentConfig + | ConditionConfig + | IOConfig + | AssertionConfig + | ErrorConfig, ): AnySubworkflowUnit { switch (config.type) { case UnitType.execution: @@ -124,6 +146,8 @@ export class UnitFactory { return new IOUnit(config); case UnitType.assertion: return new AssertionUnit(config); + case UnitType.error: + return new ErrorUnit(config); default: throw new Error(`Unknown unit type: ${config.type}`); } diff --git a/src/js/units/index.ts b/src/js/units/index.ts index 58b8bb4b..cd9d0f63 100644 --- a/src/js/units/index.ts +++ b/src/js/units/index.ts @@ -2,6 +2,7 @@ import AssertionUnit from "./AssertionUnit"; import AssignmentUnit from "./AssignmentUnit"; import BaseUnit from "./BaseUnit"; import ConditionUnit from "./ConditionUnit"; +import ErrorUnit from "./ErrorUnit"; import ExecutionUnit from "./ExecutionUnit"; import { UnitFactory } from "./factory"; import IOUnit from "./IOUnit"; @@ -16,6 +17,7 @@ export { AssertionUnit, AssignmentUnit, ConditionUnit, + ErrorUnit, ExecutionUnit, IOUnit, MapUnit, diff --git a/src/js/utils/index.ts b/src/js/utils/index.ts index 78b2db57..085fe872 100644 --- a/src/js/utils/index.ts +++ b/src/js/utils/index.ts @@ -1,3 +1,4 @@ export * as units from "./units"; export * as workflow from "./workflow"; export * as baseUnits from "./baseUnits"; +export * as repair from "./repair"; diff --git a/src/js/utils/repair.ts b/src/js/utils/repair.ts new file mode 100644 index 00000000..47f3355a --- /dev/null +++ b/src/js/utils/repair.ts @@ -0,0 +1,171 @@ +import { EntityError } from "@mat3ra/code/dist/js/entity/in_memory"; +import type { + ConditionUnitSchema, + ErrorUnitSchema, + ExecutionUnitSchema, + SubworkflowSchema, + WorkflowBaseUnitSchema, +} from "@mat3ra/esse/dist/js/types"; +import { Utils } from "@mat3ra/utils"; + +import { UnitStatus, UnitType } from "../enums"; +import Subworkflow from "../Subworkflow"; +import ConditionUnit from "../units/ConditionUnit"; +import ExecutionUnit from "../units/ExecutionUnit"; +import type { AnyWorkflowUnitSchema } from "../units/factory"; +import type { WorkflowSchema } from "../workflows/types"; + +function toErrorUnitSchema( + unitData: Partial, + error: unknown, +): ErrorUnitSchema { + let reasonPayload: { error: unknown; json: object }; + + if (error instanceof EntityError && error.details) { + reasonPayload = { + error: error.details.error, + json: unitData as object, + }; + } else if (error instanceof Error) { + reasonPayload = { + error: { message: error.message, name: error.name }, + json: unitData as object, + }; + } else { + reasonPayload = { + error, + json: unitData as object, + }; + } + + return { + results: [], + preProcessors: [], + postProcessors: [], + monitors: [], + name: unitData.name ?? UnitType.error, + type: UnitType.error, + status: UnitStatus.error, + flowchartId: unitData.flowchartId ?? Utils.uuid.getUUID(), + reason: JSON.stringify(reasonPayload), + next: unitData.next ?? "", + head: unitData.head ?? false, + }; +} + +function repairExecutionUnit( + unitData: Partial, +): ExecutionUnitSchema | ErrorUnitSchema { + try { + return new ExecutionUnit(unitData as ExecutionUnitSchema).toJSON(); + } catch (error: unknown) { + return toErrorUnitSchema(unitData as Partial, error); + } +} + +function repairConditionUnit( + unitData: Partial, +): ConditionUnitSchema | ErrorUnitSchema { + try { + return new ConditionUnit(unitData as ConditionUnitSchema).toJSON(); + } catch (error: unknown) { + return toErrorUnitSchema(unitData as Partial, error); + } +} + +function getSubworkflowValidationError(subworkflow: SubworkflowSchema): EntityError | Error | null { + // Two checks, same order as the old isValid() path (construct + validate), but split so we + // keep AJV errors when hydration would fail first: + // 1. validateData — JSON Schema on raw persisted subworkflow (no Application/ModelFactory/units). + // Surfaces structured AJV errors (e.g. missing model) before the constructor runs. + // 2. new Subworkflow().validate() — hydration (app, model, units) then schema on the instance. + // Catches schema-valid JSON that still cannot be built (unknown model, bad units, etc.). + try { + Subworkflow.validateData({ ...subworkflow }); + new Subworkflow(subworkflow).validate(); + return null; + } catch (error: unknown) { + if (error instanceof EntityError || error instanceof Error) { + return error; + } + return new Error(String(error)); + } +} + +function repairSubworkflow(subworkflowData: SubworkflowSchema): SubworkflowSchema { + const units = subworkflowData.units.map((unit) => { + if (unit.type === UnitType.execution) { + return repairExecutionUnit(unit); + } + + if (unit.type === UnitType.condition) { + return repairConditionUnit(unit); + } + + return unit; + }); + + return { ...subworkflowData, units }; +} + +export function repairWorkflow(workflowData: T): T { + const subworkflows = workflowData.subworkflows.map((subworkflow) => { + return repairSubworkflow(subworkflow); + }); + + const invalidSubworkflows = subworkflows + .map((subworkflow) => { + const error = getSubworkflowValidationError(subworkflow); + return error ? { subworkflow, error } : null; + }) + .filter( + (entry): entry is { subworkflow: SubworkflowSchema; error: EntityError | Error } => + entry !== null, + ); + + const units = workflowData.units.map((unit): AnyWorkflowUnitSchema => { + const invalidEntry = invalidSubworkflows.find( + ({ subworkflow }) => subworkflow._id === unit._id, + ); + + if (invalidEntry) { + const { subworkflow, error } = invalidEntry; + const errorUnit = toErrorUnitSchema(unit, error); + const reasonPayload = { + ...JSON.parse(errorUnit.reason), + json: { unit, subworkflow }, + }; + + return { + ...errorUnit, + _id: unit._id, + name: unit.name || errorUnit.name, + flowchartId: unit.flowchartId, + reason: JSON.stringify(reasonPayload), + preProcessors: unit.preProcessors || [], + postProcessors: unit.postProcessors || [], + monitors: unit.monitors || [], + results: unit.results || [], + }; + } + + return unit; + }); + + const validSubworkflows = subworkflows.filter((subworkflow) => { + return !invalidSubworkflows.some( + ({ subworkflow: invalid }) => invalid._id === subworkflow._id, + ); + }); + + const workflows = workflowData.workflows.map((nested) => { + return repairWorkflow(nested as WorkflowSchema); + }); + + return { + ...workflowData, + subworkflows: validSubworkflows, + workflows, + units, + }; +} diff --git a/src/js/workflows/default.ts b/src/js/workflows/default.ts index 8336a497..7b739599 100644 --- a/src/js/workflows/default.ts +++ b/src/js/workflows/default.ts @@ -1,4 +1,4 @@ -import type { WorkflowSchema } from "@mat3ra/esse/dist/js/types"; +import type { WorkflowSchema } from "./types"; const defaultWorkflowConfig: WorkflowSchema = { name: "New Workflow", diff --git a/src/js/workflows/types.ts b/src/js/workflows/types.ts new file mode 100644 index 00000000..17a17bc9 --- /dev/null +++ b/src/js/workflows/types.ts @@ -0,0 +1,5 @@ +import type { WorkflowSchema as EsseWorkflowSchema } from "@mat3ra/esse/dist/js/types"; + +export type WorkflowSchema = EsseWorkflowSchema & { + workflows: WorkflowSchema[]; +}; diff --git a/tests/js/Workflow.test.ts b/tests/js/Workflow.test.ts index df6775f7..bf10ac47 100644 --- a/tests/js/Workflow.test.ts +++ b/tests/js/Workflow.test.ts @@ -8,7 +8,11 @@ import { } from "@mat3ra/code/dist/js/entity/set/ordered/OrderedInMemoryEntityInSetMixin"; import JSONSchemasInterface from "@mat3ra/esse/dist/js/esse/JSONSchemasInterface"; import esseSchemas from "@mat3ra/esse/dist/js/schemas.json"; -import type { WorkflowSchema } from "@mat3ra/esse/dist/js/types"; +import type { + ConditionUnitSchema, + ErrorUnitSchema, + ExecutionUnitSchema, +} from "@mat3ra/esse/dist/js/types"; import { Material } from "@mat3ra/made"; import { ApplicationRegistry, WorkflowStandata } from "@mat3ra/standata"; import StandataDriver from "@mat3ra/standata/dist/js/StandataDriver"; @@ -16,10 +20,26 @@ import { expect } from "chai"; import type { JSONSchema7 } from "json-schema"; import type { WorkflowRenderContext } from "src/js/Workflow"; -import { Subworkflow, Workflow } from "../../src/js"; +import { Subworkflow, UnitFactory, Workflow } from "../../src/js"; import { UnitType } from "../../src/js/enums"; +import { repairWorkflow } from "../../src/js/utils/repair"; +import type { WorkflowSchema } from "../../src/js/workflows/types"; import workflowHashes from "../fixtures/workflow_hashes.json"; +function invalidExecutionUnit(flowchartId: string) { + return { + type: UnitType.execution, + name: "exec", + flowchartId, + results: [], + preProcessors: [], + postProcessors: [], + monitors: [], + input: [], + context: [], + }; +} + interface OrderedMaterial extends OrderedInMemoryEntityInSet, InMemoryEntityInSet {} class OrderedMaterial extends Material implements OrderedInMemoryEntityInSet { @@ -280,8 +300,10 @@ describe("Workflow", () => { fixtureFile, ) as unknown as WorkflowSchema[]; const workflow = workflows.find((w) => w.name === bandGapWorkflowName); - expect(workflow).to.exist; - const wf = new Workflow(workflow as WorkflowSchema); + if (!workflow) { + throw new Error(`Workflow ${bandGapWorkflowName} not found`); + } + const wf = new Workflow(workflow); const expectedHash = workflowHashes.espresso[fixtureFile].hash; if (!expectedHash) { // eslint-disable-next-line no-console @@ -292,4 +314,234 @@ describe("Workflow", () => { }); }); }); + + describe("repair", () => { + let defaultApplication: ExecutionUnitSchema["application"]; + + before(() => { + JSONSchemasInterface.setSchemas(esseSchemas as JSONSchema7[]); + }); + + beforeEach(() => { + ApplicationRegistry.setDriver(new StandataDriver()); + const app = new ApplicationRegistry().getDefaultApplication(); + if (!app) { + throw new Error( + "ApplicationRegistry.getDefaultApplication() returned no application", + ); + } + defaultApplication = app; + }); + + it("converts invalid execution unit to error inside subworkflow", () => { + const workflowConfig = structuredClone(Workflow.defaultConfig); + const invalid = invalidExecutionUnit("fc-exec"); + workflowConfig.subworkflows[0].units = [invalid as never]; + + const result = repairWorkflow(workflowConfig); + + expect(result.subworkflows[0].units[0].type).to.equal(UnitType.error); + const subworkflowErrorReason = JSON.parse( + (result.subworkflows[0].units[0] as ErrorUnitSchema).reason, + ); + expect(subworkflowErrorReason.json).to.deep.equal(invalid); + }); + + it("leaves valid execution unit unchanged inside subworkflow", () => { + const workflowConfig = structuredClone(Workflow.defaultConfig); + const unit = UnitFactory.createDefaultSubworkflowUnit( + "execution", + defaultApplication, + ).toJSON(); + workflowConfig.subworkflows[0].units = [unit]; + + const result = repairWorkflow(workflowConfig); + + expect(result.subworkflows[0].units[0]).to.deep.equal(unit); + }); + + it("repairs legacy condition unit missing then and else via repairWorkflow", () => { + const workflowConfig = structuredClone(Workflow.defaultConfig); + const legacyCondition = { + name: "condition", + type: UnitType.condition, + input: [], + results: [], + preProcessors: [], + postProcessors: [], + statement: "true", + maxOccurrences: 100, + application: defaultApplication, + flowchartId: "e71f01a98db152d645e787b8", + monitors: [], + head: false, + next: "03b383bf35936d1d54d015ad", + }; + + workflowConfig.subworkflows[0].units = [legacyCondition as never]; + + const result = repairWorkflow(workflowConfig); + const condition = result.subworkflows[0].units[0] as ConditionUnitSchema; + + expect(condition.type).to.equal(UnitType.condition); + expect(condition.then).to.equal(""); + expect(condition.else).to.equal(""); + expect(() => new Workflow(result).validate()).to.not.throw(); + }); + + it("repairs only invalid execution units inside subworkflow", () => { + const workflowConfig = structuredClone(Workflow.defaultConfig); + const validUnit = UnitFactory.createDefaultSubworkflowUnit("assignment").toJSON(); + const invalidExecution = invalidExecutionUnit("fc-bad"); + workflowConfig.subworkflows[0].units = [validUnit, invalidExecution as never]; + + const result = repairWorkflow(workflowConfig); + + expect(result.subworkflows[0].units[0]).to.deep.equal(validUnit); + expect(result.subworkflows[0].units[1].type).to.equal(UnitType.error); + }); + + it("repairs invalid execution units in subworkflows and nested workflows", () => { + const workflowConfig = structuredClone(Workflow.defaultConfig); + const invalidExecution = invalidExecutionUnit("fc-nested"); + + workflowConfig.subworkflows[0].units = [invalidExecution as never]; + + const nestedSubworkflow = structuredClone(workflowConfig.subworkflows[0]); + nestedSubworkflow._id = "nested-subworkflow-id"; + nestedSubworkflow.units = [invalidExecution as never]; + + workflowConfig.workflows = [ + { + ...structuredClone(workflowConfig), + _id: "nested-workflow-id", + subworkflows: [nestedSubworkflow], + workflows: [], + }, + ]; + + const result = repairWorkflow(workflowConfig); + + expect(result.subworkflows[0].units[0].type).to.equal(UnitType.error); + expect(result.workflows[0].subworkflows[0].units[0].type).to.equal(UnitType.error); + }); + + it("allows hydration after repair for converted execution units", () => { + const workflowConfig = structuredClone(Workflow.defaultConfig); + workflowConfig.subworkflows[0].units = [invalidExecutionUnit("fc-hydrate") as never]; + + const document = repairWorkflow(workflowConfig); + + expect(() => new Workflow(document)).to.not.throw(); + }); + + it("repairs legacy subworkflow missing model without throwing", () => { + const legacyShellWorkflow = { + name: "Bash test", + subworkflows: [ + { + name: "bash subworkflow", + application: { + name: "shell", + version: "4.2.46", + build: "Default", + isDefault: true, + summary: "Shell Script", + shortName: "sh", + }, + units: [ + { + type: UnitType.execution, + name: "test workflow", + head: true, + application: { + name: "shell", + version: "4.2.46", + build: "Default", + isDefault: true, + shortName: "sh", + summary: "Shell Script", + }, + results: [], + monitors: [{ name: "standard_output" }], + preProcessors: [], + postProcessors: [], + input: [], + context: [], + }, + ], + isDraft: false, + properties: [], + }, + ], + units: [ + { + name: "bash subworkflow", + type: UnitType.subworkflow, + head: true, + monitors: [], + results: [], + preProcessors: [], + postProcessors: [], + }, + ], + workflows: [], + properties: [], + } as unknown as WorkflowSchema; + + const result = repairWorkflow(legacyShellWorkflow); + + expect(result.subworkflows).to.have.lengthOf(0); + expect(result.units[0].type).to.equal(UnitType.error); + const legacyErrorReason = JSON.parse((result.units[0] as ErrorUnitSchema).reason); + expect(legacyErrorReason.error).to.be.an("array").that.is.not.empty; + expect(() => new Workflow(result)).to.not.throw(); + }); + + it("does not store JSON schema in error unit reason", () => { + const workflowConfig = structuredClone(Workflow.defaultConfig); + const invalid = invalidExecutionUnit("fc-1"); + workflowConfig.subworkflows[0].units = [invalid as never]; + + const result = repairWorkflow(workflowConfig); + const errorUnit = result.subworkflows[0].units[0] as ErrorUnitSchema; + const reason = JSON.parse(errorUnit.reason); + + expect(reason).to.have.property("error"); + expect(reason).to.have.property("json"); + expect(reason).to.not.have.property("schema"); + }); + + it("converts invalid subworkflow unit to error and drops subworkflow", () => { + const workflowConfig = structuredClone(Workflow.defaultConfig); + const originalUnit = workflowConfig.units[0]; + const subworkflowId = workflowConfig.subworkflows[0]._id; + + workflowConfig.subworkflows[0] = { + ...workflowConfig.subworkflows[0], + model: { + ...workflowConfig.subworkflows[0].model, + type: "not-a-valid-model-type" as never, + }, + }; + + const result = repairWorkflow(workflowConfig); + + expect(result.subworkflows).to.have.lengthOf(0); + expect(result.units).to.have.lengthOf(1); + expect(result.units[0].type).to.equal(UnitType.error); + expect(result.units[0]._id).to.equal(subworkflowId); + + const errorUnit = result.units[0] as ErrorUnitSchema; + const validationReason = JSON.parse(errorUnit.reason); + expect(validationReason.error).to.be.an("array").that.is.not.empty; + expect(validationReason.error.some((e: { instancePath?: string }) => e.instancePath)).to + .be.true; + expect(validationReason.json).to.deep.equal({ + unit: originalUnit, + subworkflow: workflowConfig.subworkflows[0], + }); + expect(() => new Workflow(result)).to.not.throw(); + }); + }); }); diff --git a/tests/js/executionUnit.contextProviders.test.ts b/tests/js/executionUnit.contextProviders.test.ts index 652278ed..48e09b58 100644 --- a/tests/js/executionUnit.contextProviders.test.ts +++ b/tests/js/executionUnit.contextProviders.test.ts @@ -8,13 +8,13 @@ import { } from "@mat3ra/code/dist/js/entity/set/ordered/OrderedInMemoryEntityInSetMixin"; import JSONSchemasInterface from "@mat3ra/esse/dist/js/esse/JSONSchemasInterface"; import esseSchemas from "@mat3ra/esse/dist/js/schemas.json"; -import type { WorkflowSchema } from "@mat3ra/esse/dist/js/types"; import { Material } from "@mat3ra/made"; import { ApplicationRegistry, WorkflowStandata } from "@mat3ra/standata"; import StandataDriver from "@mat3ra/standata/dist/js/StandataDriver"; import { expect } from "chai"; import type { JSONSchema7 } from "json-schema"; import type { WorkflowRenderContext } from "src/js/Workflow"; +import type { WorkflowSchema } from "src/js/workflows/types"; import { ExecutionUnit, Workflow } from "../../src/js"; import KGridFormDataManager from "../../src/js/context/providers/PointsGrid/KGridFormDataManager"; @@ -41,7 +41,7 @@ describe("ExecutionUnit contextProvidersInstances + render()", () => { }); it("persists in-memory provider edits when render() runs again (Important settings path)", () => { - const standataWorkflows = new WorkflowStandata().getAll(); + const standataWorkflows = new WorkflowStandata().getAll() as unknown as WorkflowSchema[]; expect(standataWorkflows.length).to.be.above(0); const material = OrderedMaterial.createDefault(); @@ -59,7 +59,7 @@ describe("ExecutionUnit contextProvidersInstances + render()", () => { // eslint-disable-next-line no-restricted-syntax for (const standataJson of standataWorkflows) { - const w = new Workflow(standataJson as unknown as WorkflowSchema); + const w = new Workflow(standataJson); w.render(context); // eslint-disable-next-line no-restricted-syntax for (const sub of w.subworkflowInstances) { @@ -81,6 +81,10 @@ describe("ExecutionUnit contextProvidersInstances + render()", () => { if (executionUnit) break; } + if (!workflow) { + throw new Error("Workflow not found"); + } + expect( workflow, "expected a standata workflow with boundaryConditions on an execution unit", @@ -91,13 +95,17 @@ describe("ExecutionUnit contextProvidersInstances + render()", () => { const provider = unit.contextProvidersInstances.find((p) => { return p.name === "boundaryConditions"; }); + + if (!provider) { + throw new Error("Provider not found"); + } // eslint-disable-next-line no-unused-expressions expect(provider).to.be.ok; const distinctiveElectricField = 9.87654321; - const priorData = provider!.getData(); - provider!.setIsEdited(true); - provider!.setData({ + const priorData = provider.getData(); + provider.setIsEdited(true); + provider.setData({ ...priorData, electricField: distinctiveElectricField, }); @@ -106,7 +114,7 @@ describe("ExecutionUnit contextProvidersInstances + render()", () => { // Same workflow + same unit instances as the designer: persist then `onContextChanged` → `workflow.render()`. // Without `savePersistentContext()` before this, the next render rebuilds providers from stale // `this.context` and this assertion fails. - workflow!.render(context); + workflow.render(context); const persisted = unit.context.find((c) => c.name === "boundaryConditions"); expect(persisted?.data).to.include({ electricField: distinctiveElectricField }); diff --git a/tests/js/kpath.vaspBands.test.ts b/tests/js/kpath.vaspBands.test.ts index dafcf9e2..3c4675ae 100644 --- a/tests/js/kpath.vaspBands.test.ts +++ b/tests/js/kpath.vaspBands.test.ts @@ -8,13 +8,13 @@ import { } from "@mat3ra/code/dist/js/entity/set/ordered/OrderedInMemoryEntityInSetMixin"; import JSONSchemasInterface from "@mat3ra/esse/dist/js/esse/JSONSchemasInterface"; import esseSchemas from "@mat3ra/esse/dist/js/schemas.json"; -import type { WorkflowSchema } from "@mat3ra/esse/dist/js/types"; import { Material } from "@mat3ra/made"; import { ApplicationRegistry, WorkflowStandata } from "@mat3ra/standata"; import StandataDriver from "@mat3ra/standata/dist/js/StandataDriver"; import { expect } from "chai"; import type { JSONSchema7 } from "json-schema"; import type { WorkflowRenderContext } from "src/js/Workflow"; +import type { WorkflowSchema } from "src/js/workflows/types"; import { ExecutionUnit, Subworkflow, Workflow } from "../../src/js"; import { assertNotNull } from "./assertNotNull"; @@ -49,13 +49,13 @@ function findVaspBandsUnit(workflow: Workflow): ExecutionUnit | undefined { } function findBandStructureVaspJson(): WorkflowSchema { + const standataWorkflows = new WorkflowStandata().getAll() as unknown as WorkflowSchema[]; // eslint-disable-next-line no-restricted-syntax - for (const workflow of new WorkflowStandata().getAll()) { + for (const workflow of standataWorkflows) { if (workflow.name === "Band Structure") { - const candidate = workflow as unknown as WorkflowSchema; - const probe = new Workflow(candidate); + const probe = new Workflow(workflow); if (findVaspBandsUnit(probe)) { - return candidate; + return workflow; } } } diff --git a/tests/js/subworkflow.standata.integration.test.ts b/tests/js/subworkflow.standata.integration.test.ts index 81e5a1c9..3cd8a540 100644 --- a/tests/js/subworkflow.standata.integration.test.ts +++ b/tests/js/subworkflow.standata.integration.test.ts @@ -8,7 +8,6 @@ import { } from "@mat3ra/code/dist/js/entity/set/ordered/OrderedInMemoryEntityInSetMixin"; import JSONSchemasInterface from "@mat3ra/esse/dist/js/esse/JSONSchemasInterface"; import esseSchemas from "@mat3ra/esse/dist/js/schemas.json"; -import type { WorkflowSchema } from "@mat3ra/esse/dist/js/types"; import { Material } from "@mat3ra/made"; import { ApplicationRegistry, WorkflowStandata } from "@mat3ra/standata"; import StandataDriver from "@mat3ra/standata/dist/js/StandataDriver"; @@ -19,6 +18,7 @@ import { Workflow } from "../../src/js"; import { UnitType } from "../../src/js/enums"; import { AssignmentUnit, ConditionUnit } from "../../src/js/units"; import type { WorkflowRenderContext } from "../../src/js/Workflow"; +import type { WorkflowSchema } from "../../src/js/workflows/types"; interface OrderedMaterial extends OrderedInMemoryEntityInSet, InMemoryEntityInSet {} @@ -40,11 +40,11 @@ describe("Subworkflow", () => { }); it("addConvergence on first subworkflow then workflow.render for every standata workflow (when applicable)", () => { - const standataWorkflows = new WorkflowStandata().getAll(); + const standataWorkflows = new WorkflowStandata().getAll() as unknown as WorkflowSchema[]; expect(standataWorkflows.length).to.be.above(0); const workflows = standataWorkflows.map((standataJson) => { - return new Workflow(structuredClone(standataJson) as unknown as WorkflowSchema); + return new Workflow(structuredClone(standataJson)); }); const material = OrderedMaterial.createDefault();