Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 3 additions & 5 deletions dist/js/Subworkflow.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,11 @@ import { type ComputedEntityMixin } from "@mat3ra/ide/dist/js/compute";
import type { Material } from "@mat3ra/made";
import { Model, ModelFactory } from "@mat3ra/mode";
import type { MetaPropertyHolder } from "@mat3ra/prode";
import type { MaterialExternalContext } from "./context/mixins/MaterialContextMixin";
import type { MaterialsExternalContext } from "./context/mixins/MaterialsContextMixin";
import type { MaterialsSetExternalContext } from "./context/mixins/MaterialsSetContextMixin";
import type { JobExternalContext, WorkflowExternalContext } from "./context/providers/by_application/espresso/QEPWXInputDataManager";
import type { WorkflowExternalContext } from "./context/providers/by_application/espresso/QEPWXInputDataManager";
import { type SubworkflowSchemaMixin } from "./generated/SubworkflowSchemaMixin";
import { SubworkflowUnit } from "./units";
import type { AnySubworkflowUnit } from "./units/factory";
import type { WorkflowRenderContext } from "./Workflow";
type ConvergenceConfig = {
parameter: "N_k" | "N_k_nonuniform";
parameterInitial: number | [number, number, number];
Expand All @@ -28,7 +26,7 @@ type ConvergenceConfig = {
};
interface Subworkflow extends DefaultableInMemoryEntity, NamedInMemoryEntity, SubworkflowSchemaMixin, HashedEntity, Omit<ComputedEntityMixin, "compute"> {
}
type SubworkflowExternalContext = MaterialExternalContext & MaterialsExternalContext & MaterialsSetExternalContext & WorkflowExternalContext & JobExternalContext;
type SubworkflowExternalContext = WorkflowRenderContext & WorkflowExternalContext;
declare class Subworkflow extends InMemoryEntity implements SubworkflowSchema {
private ModelFactory;
private applicationInstance;
Expand Down
6 changes: 4 additions & 2 deletions dist/js/Workflow.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,10 @@ import type { WorkflowSchema } from "./workflows/types";
interface Workflow extends Defaultable, NamedInMemoryEntity, WorkflowSchemaMixin, Taggable, HashedEntity, ComputedEntityMixin, HasDescription {
compute: WorkflowSchema["compute"];
}
/** Context passed to Workflow.render() before `workflowHasRelaxation` is injected for subworkflows. */
export type WorkflowRenderContext = MaterialExternalContext & MaterialsExternalContext & MaterialsSetExternalContext & JobExternalContext;
/** Context passed to Workflow.render(); subworkflows also receive `workflowHasRelaxation`. */
export type WorkflowRenderContext = MaterialExternalContext & MaterialsExternalContext & MaterialsSetExternalContext & JobExternalContext & {
scopeGlobal?: Record<string, unknown>;
};
declare class Workflow extends InMemoryEntity implements WorkflowSchema {
createDefault: () => Workflow;
static readonly defaultConfig: WorkflowSchema;
Expand Down
4 changes: 4 additions & 0 deletions dist/js/context/providers/base/ContextProvider.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,10 @@ DataForRendering = S["data"]> {
getDataForRendering(): DataForRendering;
getContextItemData(): S;
getContextItemDataForRendering(): ContextItemForRendering<S, DataForRendering>;
/**
* Resolves Jinja placeholders in persisted context `data` from `scope.global`.
*/
renderContext(scopeGlobal: Record<string, unknown>): boolean;
/**
* Helper method to find a context item from a unit context array by name.
* Returns a partial schema object that can be safely passed to constructors.
Expand Down
27 changes: 27 additions & 0 deletions dist/js/context/providers/base/ContextProvider.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,18 @@
"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const standata_1 = require("@mat3ra/standata");
const utils_1 = require("@mat3ra/utils");
const nunjucks_1 = __importDefault(require("nunjucks"));
const nunjucksEnvironment = (0, standata_1.setupNunjucksEnvironment)(new nunjucks_1.default.Environment());
const parseNumericStrings = (_key, value) => {
if (typeof value === "string" && value.trim() !== "" && !Number.isNaN(Number(value))) {
return Number(value);
}
return value;
};
/**
* Context providers expose three data layers. Keep them separate.
*
Expand Down Expand Up @@ -75,6 +87,21 @@ class ContextProvider {
data: this.getDataForRendering(),
};
}
/**
* Resolves Jinja placeholders in persisted context `data` from `scope.global`.
*/
renderContext(scopeGlobal) {
const data = this.getData();
const dataJson = JSON.stringify(data);
const renderedJson = nunjucksEnvironment.renderString(dataJson, scopeGlobal);
const resolved = JSON.parse(renderedJson, parseNumericStrings);
if (JSON.stringify(data) === JSON.stringify(resolved)) {
return false;
}
this.setData(resolved);
this.setIsEdited(true);
return true;
}
/**
* Helper method to find a context item from a unit context array by name.
* Returns a partial schema object that can be safely passed to constructors.
Expand Down
5 changes: 4 additions & 1 deletion dist/js/context/providers/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -65,11 +65,14 @@ export type AssignmentContext = Record<AssignmentUnitSchema["operand"], Assignme
export type SubworkflowContext = {
subworkflowContext: AssignmentContext;
};
export type ScopeGlobalExternalContext = {
scopeGlobal?: Record<string, unknown>;
};
/**
* External context type used by ExecutionUnitInput when creating providers.
* This type is always expected to be present when providers are instantiated.
*/
export type ExternalContext = ApplicationExternalContext & WorkflowExternalContext & JobExternalContext & MaterialsExternalContext & MethodDataExternalContext & MaterialsSetExternalContext & MaterialExternalContext & JinjaExternalContext & SubworkflowContext;
export type ExternalContext = ApplicationExternalContext & WorkflowExternalContext & JobExternalContext & MaterialsExternalContext & MethodDataExternalContext & MaterialsSetExternalContext & MaterialExternalContext & JinjaExternalContext & SubworkflowContext & ScopeGlobalExternalContext;
/**
* Type for provider names as they appear in templates.
*/
Expand Down
3 changes: 2 additions & 1 deletion dist/js/units/ExecutionUnit.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,9 @@ declare class ExecutionUnit extends ExecutionUnit_base implements Schema {
render(externalContext: ExternalContext, convergence?: ConvergenceParameter): void;
private getContextProvidersInstances;
savePersistentContext(): void;
renderContext(scopeGlobal: Record<string, unknown>): void;
saveRenderingContext(externalContext: ExternalContext): void;
saveContext(externalContext: ExternalContext): void;
saveContext({ scopeGlobal, ...externalContext }: ExternalContext): void;
getHashObject(): {
application: {
_id?: string;
Expand Down
20 changes: 15 additions & 5 deletions dist/js/units/ExecutionUnit.js
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ class ExecutionUnit extends BaseUnit_1.default {
.flat()),
];
// TODO: kgrid should be abstracted and selected by user
const parameterToContextProviderMap = {
const parameterToProviderMap = {
N_k: "kgrid",
N_k_nonuniform: "kgrid",
};
Expand All @@ -139,8 +139,7 @@ class ExecutionUnit extends BaseUnit_1.default {
return (0, providers_1.createProvider)(name, this.context, externalContext);
})
.map((provider) => {
if (convergence &&
provider.name === parameterToContextProviderMap[convergence.name]) {
if (convergence && provider.name === parameterToProviderMap[convergence.name]) {
provider.applyConvergenceParameter(convergence);
}
return provider;
Expand All @@ -150,17 +149,28 @@ class ExecutionUnit extends BaseUnit_1.default {
const persistentItems = this.contextProvidersInstances.map((p) => p.getContextItemData());
this.context = persistentItems.filter((c) => c.isEdited);
}
renderContext(scopeGlobal) {
this.contextProvidersInstances.forEach((provider) => {
provider.renderContext(scopeGlobal);
});
}
saveRenderingContext(externalContext) {
// scopeGlobal resolves provider data only; do not pass it to input Jinja templates.
// eslint-disable-next-line @typescript-eslint/no-unused-vars -- omitted from Jinja context
const { scopeGlobal, ...renderingExternalContext } = externalContext;
const renderingItems = this.contextProvidersInstances.map((p) => p.getContextItemDataForRendering());
this.renderingContext = {
...Object.fromEntries(renderingItems.map((context) => [context.name, context.data])),
...externalContext,
...renderingExternalContext,
};
this.input = this.inputInstances.map((input) => {
return input.render(this.renderingContext).toJSON();
});
}
saveContext(externalContext) {
saveContext({ scopeGlobal, ...externalContext }) {
if (scopeGlobal) {
this.renderContext(scopeGlobal);
}
this.savePersistentContext();
this.saveRenderingContext(externalContext);
}
Expand Down
Loading
Loading