From 102413326aa636d4ddaf9208abfc226b2296e955 Mon Sep 17 00:00:00 2001 From: jasquat Date: Mon, 23 Jan 2023 16:45:07 -0500 Subject: [PATCH 01/16] added locking system for process instances so hopefully background jobs will not take instances currently being run by the user w/ burnettk --- .flake8 | 7 ++- spiffworkflow-backend/.flake8 | 7 ++- .../bin/save_to_secrets_from_file | 33 ++++++++++ .../{22212a7d6505_.py => 49aae41d7992_.py} | 8 ++- .../spiffworkflow_backend/config/__init__.py | 3 + .../spiffworkflow_backend/config/default.py | 4 ++ .../models/process_instance.py | 3 + .../routes/process_instances_controller.py | 3 + .../routes/tasks_controller.py | 2 + .../services/process_instance_processor.py | 60 ++++++++++++++++++- .../services/process_instance_service.py | 14 +++++ .../unit/test_process_instance_processor.py | 47 +++++++++++++++ .../src/routes/JsonSchemaFormBuilder.tsx | 2 +- 13 files changed, 184 insertions(+), 9 deletions(-) create mode 100644 spiffworkflow-backend/bin/save_to_secrets_from_file rename spiffworkflow-backend/migrations/versions/{22212a7d6505_.py => 49aae41d7992_.py} (98%) diff --git a/.flake8 b/.flake8 index 59328331..97353aae 100644 --- a/.flake8 +++ b/.flake8 @@ -8,11 +8,14 @@ rst-roles = class,const,func,meth,mod,ref rst-directives = deprecated per-file-ignores = + # More specific globs seem to overwrite the more generic ones so we have + # to split them out by directory + # asserts are ok in tests - spiffworkflow-backend/tests/*:S101 + spiffworkflow-backend/tests/*:S101,D102,D103,D101 # prefer naming functions descriptively rather than forcing comments - spiffworkflow-backend/*:D102,D103 + spiffworkflow-backend/src/*:D102,D103,D101 spiffworkflow-backend/bin/keycloak_test_server.py:B950,D spiffworkflow-backend/conftest.py:S105 diff --git a/spiffworkflow-backend/.flake8 b/spiffworkflow-backend/.flake8 index 9c3596e8..b42cf528 100644 --- a/spiffworkflow-backend/.flake8 +++ b/spiffworkflow-backend/.flake8 @@ -8,11 +8,14 @@ rst-roles = class,const,func,meth,mod,ref rst-directives = deprecated per-file-ignores = + # More specific globs seem to overwrite the more generic ones so we have + # to split them out by directory + # asserts are ok in tests - tests/*:S101 + tests/*:S101,D102,D103 # prefer naming functions descriptively rather than forcing comments - *:D102 + src/*:D102,D103 bin/keycloak_test_server.py:B950,D conftest.py:S105 diff --git a/spiffworkflow-backend/bin/save_to_secrets_from_file b/spiffworkflow-backend/bin/save_to_secrets_from_file new file mode 100644 index 00000000..39f71602 --- /dev/null +++ b/spiffworkflow-backend/bin/save_to_secrets_from_file @@ -0,0 +1,33 @@ +"""Get the bpmn process json for a given process instance id and store it in /tmp.""" +import os +import sys + +from spiffworkflow_backend import create_app +from spiffworkflow_backend.models.process_instance import ProcessInstanceModel +from spiffworkflow_backend.models.user import UserModel +from spiffworkflow_backend.services.secret_service import SecretService + + +def main(env_file: str): + """Main.""" + os.environ["SPIFFWORKFLOW_BACKEND_ENV"] = "development" + if os.environ.get("BPMN_SPEC_ABSOLUTE_DIR") is None: + os.environ["BPMN_SPEC_ABSOLUTE_DIR"] = "hey" + flask_env_key = "FLASK_SESSION_SECRET_KEY" + os.environ[flask_env_key] = "whatevs" + app = create_app() + with app.app_context(): + contents = None + with open(env_file, 'r') as f: + contents = f.readlines() + for line in contents: + key, value_raw = line.split('=') + value = value_raw.replace('"', '') + SecretService().add_secret(key, value, UserModel.query.first().id) + + + +if len(sys.argv) < 2: + raise Exception("env file must be specified") + +main(sys.argv[1]) diff --git a/spiffworkflow-backend/migrations/versions/22212a7d6505_.py b/spiffworkflow-backend/migrations/versions/49aae41d7992_.py similarity index 98% rename from spiffworkflow-backend/migrations/versions/22212a7d6505_.py rename to spiffworkflow-backend/migrations/versions/49aae41d7992_.py index f662f583..52b352a2 100644 --- a/spiffworkflow-backend/migrations/versions/22212a7d6505_.py +++ b/spiffworkflow-backend/migrations/versions/49aae41d7992_.py @@ -1,8 +1,8 @@ """empty message -Revision ID: 22212a7d6505 +Revision ID: 49aae41d7992 Revises: -Create Date: 2023-01-23 10:59:17.365694 +Create Date: 2023-01-23 14:23:17.989042 """ from alembic import op @@ -10,7 +10,7 @@ import sqlalchemy as sa # revision identifiers, used by Alembic. -revision = '22212a7d6505' +revision = '49aae41d7992' down_revision = None branch_labels = None depends_on = None @@ -129,6 +129,8 @@ def upgrade(): sa.Column('bpmn_version_control_type', sa.String(length=50), nullable=True), sa.Column('bpmn_version_control_identifier', sa.String(length=255), nullable=True), sa.Column('spiff_step', sa.Integer(), nullable=True), + sa.Column('locked_by', sa.String(length=80), nullable=True), + sa.Column('locked_at_in_seconds', sa.Integer(), nullable=True), sa.ForeignKeyConstraint(['process_initiator_id'], ['user.id'], ), sa.PrimaryKeyConstraint('id') ) diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/config/__init__.py b/spiffworkflow-backend/src/spiffworkflow_backend/config/__init__.py index 759ac339..f9f19571 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/config/__init__.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/config/__init__.py @@ -1,6 +1,7 @@ """__init__.py.""" import os import threading +import uuid from flask.app import Flask from werkzeug.utils import ImportStringError @@ -96,6 +97,8 @@ def setup_config(app: Flask) -> None: if app.config["BPMN_SPEC_ABSOLUTE_DIR"] is None: raise ConfigurationError("BPMN_SPEC_ABSOLUTE_DIR config must be set") + app.config["PROCESS_UUID"] = uuid.uuid4() + setup_database_uri(app) setup_logger(app) diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/config/default.py b/spiffworkflow-backend/src/spiffworkflow_backend/config/default.py index db0baeba..252b2b89 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/config/default.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/config/default.py @@ -82,3 +82,7 @@ SYSTEM_NOTIFICATION_PROCESS_MODEL_MESSAGE_ID = environ.get( "SYSTEM_NOTIFICATION_PROCESS_MODEL_MESSAGE_ID", default="Message_SystemMessageNotification", ) + +ALLOW_CONFISCATING_LOCK_AFTER_SECONDS = int( + environ.get("ALLOW_CONFISCATING_LOCK_AFTER_SECONDS", default="600") +) diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance.py index 75a58004..9e075600 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance.py @@ -88,6 +88,9 @@ class ProcessInstanceModel(SpiffworkflowBaseDBModel): bpmn_version_control_identifier: str = db.Column(db.String(255)) spiff_step: int = db.Column(db.Integer) + locked_by: str | None = db.Column(db.String(80)) + locked_at_in_seconds: int | None = db.Column(db.Integer) + @property def serialized(self) -> dict[str, Any]: """Return object data in serializeable format.""" diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py b/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py index 065150aa..1271f929 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py @@ -102,6 +102,7 @@ def process_instance_run( ) processor = ProcessInstanceProcessor(process_instance) + processor.lock_process_instance("Web") if do_engine_steps: try: @@ -118,6 +119,8 @@ def process_instance_run( status_code=400, task=task, ) from e + finally: + processor.unlock_process_instance("Web") if not current_app.config["RUN_BACKGROUND_SCHEDULER"]: MessageService.process_message_instances() diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/tasks_controller.py b/spiffworkflow-backend/src/spiffworkflow_backend/routes/tasks_controller.py index 3126674e..c206e4da 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/tasks_controller.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/routes/tasks_controller.py @@ -371,6 +371,7 @@ def task_submit( ) ) + processor.lock_process_instance("Web") ProcessInstanceService.complete_form_task( processor=processor, spiff_task=spiff_task, @@ -378,6 +379,7 @@ def task_submit( user=g.user, human_task=human_task, ) + processor.unlock_process_instance("Web") # If we need to update all tasks, then get the next ready task and if it a multi-instance with the same # task spec, complete that form as well. diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py index 8ca1e36f..0889c06e 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py @@ -69,6 +69,7 @@ from SpiffWorkflow.spiff.serializer.task_spec_converters import UserTaskConverte from SpiffWorkflow.task import Task as SpiffTask # type: ignore from SpiffWorkflow.task import TaskState from SpiffWorkflow.util.deep_merge import DeepMerge # type: ignore +from sqlalchemy import text from spiffworkflow_backend.exceptions.api_error import ApiError from spiffworkflow_backend.models.db import db @@ -141,6 +142,14 @@ class MissingProcessInfoError(Exception): """MissingProcessInfoError.""" +class ProcessInstanceIsAlreadyLockedError(Exception): + pass + + +class ProcessInstanceLockedBySomethingElseError(Exception): + pass + + class CustomBpmnScriptEngine(PythonScriptEngine): # type: ignore """This is a custom script processor that can be easily injected into Spiff Workflow. @@ -761,6 +770,10 @@ class ProcessInstanceProcessor: complete_states = [TaskState.CANCELLED, TaskState.COMPLETED] user_tasks = list(self.get_all_user_tasks()) self.process_instance_model.status = self.get_status().value + current_app.logger.debug( + f"the_status: {self.process_instance_model.status} for instance" + f" {self.process_instance_model.id}" + ) self.process_instance_model.total_tasks = len(user_tasks) self.process_instance_model.completed_tasks = sum( 1 for t in user_tasks if t.state in complete_states @@ -1142,7 +1155,52 @@ class ProcessInstanceProcessor: def get_status(self) -> ProcessInstanceStatus: """Get_status.""" - return self.status_of(self.bpmn_process_instance) + the_status = self.status_of(self.bpmn_process_instance) + # current_app.logger.debug(f"the_status: {the_status} for instance {self.process_instance_model.id}") + return the_status + + def lock_process_instance(self, lock_prefix: str) -> None: + locked_by = f"{lock_prefix}_{current_app.config['PROCESS_UUID']}" + current_time_in_seconds = round(time.time()) + lock_expiry_in_seconds = ( + current_time_in_seconds + - current_app.config["ALLOW_CONFISCATING_LOCK_AFTER_SECONDS"] + ) + + query_text = text( + "UPDATE process_instance SET locked_at_in_seconds =" + " :current_time_in_seconds, locked_by = :locked_by where id = :id AND" + " (locked_by IS NULL OR locked_at_in_seconds < :lock_expiry_in_seconds);" + ).execution_options(autocommit=True) + result = db.engine.execute( + query_text, + id=self.process_instance_model.id, + current_time_in_seconds=current_time_in_seconds, + locked_by=locked_by, + lock_expiry_in_seconds=lock_expiry_in_seconds, + ) + # it seems like autocommit is working above (we see the statement in debug logs) but sqlalchemy doesn't + # seem to update properly so tell it to commit as well. + # if we omit this line then querying the record from a unit test doesn't ever show the record as locked. + db.session.commit() + if result.rowcount < 1: + raise ProcessInstanceIsAlreadyLockedError( + f"Cannot lock process instance {self.process_instance_model.id}." + "It has already been locked." + ) + + def unlock_process_instance(self, lock_prefix: str) -> None: + locked_by = f"{lock_prefix}_{current_app.config['PROCESS_UUID']}" + if self.process_instance_model.locked_by != locked_by: + raise ProcessInstanceLockedBySomethingElseError( + f"Cannot unlock process instance {self.process_instance_model.id}." + f"It locked by {self.process_instance_model.locked_by}" + ) + + self.process_instance_model.locked_by = None + self.process_instance_model.locked_at_in_seconds = None + db.session.add(self.process_instance_model) + db.session.commit() # messages have one correlation key (possibly wrong) # correlation keys may have many correlation properties diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_service.py index cf86def9..d3cb30a9 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_service.py @@ -20,6 +20,9 @@ from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.services.authorization_service import AuthorizationService from spiffworkflow_backend.services.git_service import GitCommandError from spiffworkflow_backend.services.git_service import GitService +from spiffworkflow_backend.services.process_instance_processor import ( + ProcessInstanceIsAlreadyLockedError, +) from spiffworkflow_backend.services.process_instance_processor import ( ProcessInstanceProcessor, ) @@ -74,12 +77,18 @@ class ProcessInstanceService: .all() ) for process_instance in records: + locked = False + processor = None try: current_app.logger.info( f"Processing process_instance {process_instance.id}" ) processor = ProcessInstanceProcessor(process_instance) + processor.lock_process_instance("Web") + locked = True processor.do_engine_steps(save=True) + except ProcessInstanceIsAlreadyLockedError: + continue except Exception as e: db.session.rollback() # in case the above left the database with a bad transaction process_instance.status = ProcessInstanceStatus.error.value @@ -91,6 +100,9 @@ class ProcessInstanceService: + f"({process_instance.process_model_identifier}). {str(e)}" ) current_app.logger.error(error_message) + finally: + if locked and processor: + processor.unlock_process_instance("Web") @staticmethod def processor_to_process_instance_api( @@ -220,6 +232,8 @@ class ProcessInstanceService: spiff_task.update_data(dot_dct) # ProcessInstanceService.post_process_form(spiff_task) # some properties may update the data store. processor.complete_task(spiff_task, human_task, user=user) + + # maybe move this out once we have the interstitial page since this is here just so we can get the next human task processor.do_engine_steps(save=True) @staticmethod diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_processor.py b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_processor.py index b4a650dc..690d6ca5 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_processor.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_processor.py @@ -7,12 +7,19 @@ from tests.spiffworkflow_backend.helpers.base_test import BaseTest from tests.spiffworkflow_backend.helpers.test_data import load_test_spec from spiffworkflow_backend.models.group import GroupModel +from spiffworkflow_backend.models.process_instance import ProcessInstanceModel from spiffworkflow_backend.models.process_instance import ProcessInstanceStatus from spiffworkflow_backend.models.user import UserModel from spiffworkflow_backend.services.authorization_service import AuthorizationService from spiffworkflow_backend.services.authorization_service import ( UserDoesNotHaveAccessToTaskError, ) +from spiffworkflow_backend.services.process_instance_processor import ( + ProcessInstanceIsAlreadyLockedError, +) +from spiffworkflow_backend.services.process_instance_processor import ( + ProcessInstanceLockedBySomethingElseError, +) from spiffworkflow_backend.services.process_instance_processor import ( ProcessInstanceProcessor, ) @@ -293,3 +300,43 @@ class TestProcessInstanceProcessor(BaseTest): assert len(process_instance.active_human_tasks) == 1 assert initial_human_task_id == process_instance.active_human_tasks[0].id + + def test_it_can_lock_and_unlock_a_process_instance( + self, + app: Flask, + client: FlaskClient, + with_db_and_bpmn_file_cleanup: None, + ) -> None: + initiator_user = self.find_or_create_user("initiator_user") + process_model = load_test_spec( + process_model_id="test_group/model_with_lanes", + bpmn_file_name="lanes_with_owner_dict.bpmn", + process_model_source_directory="model_with_lanes", + ) + process_instance = self.create_process_instance_from_process_model( + process_model=process_model, user=initiator_user + ) + processor = ProcessInstanceProcessor(process_instance) + assert process_instance.locked_by is None + assert process_instance.locked_at_in_seconds is None + processor.lock_process_instance("TEST") + + process_instance = ProcessInstanceModel.query.filter_by( + id=process_instance.id + ).first() + assert process_instance.locked_by is not None + assert process_instance.locked_at_in_seconds is not None + + with pytest.raises(ProcessInstanceIsAlreadyLockedError): + processor.lock_process_instance("TEST") + + with pytest.raises(ProcessInstanceLockedBySomethingElseError): + processor.unlock_process_instance("TEST2") + + processor.unlock_process_instance("TEST") + + process_instance = ProcessInstanceModel.query.filter_by( + id=process_instance.id + ).first() + assert process_instance.locked_by is None + assert process_instance.locked_at_in_seconds is None diff --git a/spiffworkflow-frontend/src/routes/JsonSchemaFormBuilder.tsx b/spiffworkflow-frontend/src/routes/JsonSchemaFormBuilder.tsx index ba0866d5..b58cf1a3 100644 --- a/spiffworkflow-frontend/src/routes/JsonSchemaFormBuilder.tsx +++ b/spiffworkflow-frontend/src/routes/JsonSchemaFormBuilder.tsx @@ -12,7 +12,7 @@ import { } from '@carbon/react'; import validator from '@rjsf/validator-ajv8'; import { FormField, JsonSchemaForm } from '../interfaces'; -import Form from '../themes/carbon'; +import { Form } from '../themes/carbon'; import { modifyProcessIdentifierForPathParam, slugifyString, From ce094401ee709da5aceee86e5cf3c7b2e0320c92 Mon Sep 17 00:00:00 2001 From: jasquat Date: Mon, 23 Jan 2023 16:54:11 -0500 Subject: [PATCH 02/16] use default keycloak realm for ci w/ burnettk --- .github/workflows/frontend_tests.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/frontend_tests.yml b/.github/workflows/frontend_tests.yml index e02b319d..f4ec6360 100644 --- a/.github/workflows/frontend_tests.yml +++ b/.github/workflows/frontend_tests.yml @@ -67,7 +67,7 @@ jobs: path: sample-process-models - name: start_keycloak working-directory: ./spiffworkflow-backend - run: ./keycloak/bin/start_keycloak 5 + run: ./keycloak/bin/start_keycloak - name: start_backend working-directory: ./spiffworkflow-backend run: ./bin/build_and_run_with_docker_compose From 2d57c3d45f7836e5100505773d5c4b69c416b189 Mon Sep 17 00:00:00 2001 From: jasquat Date: Mon, 23 Jan 2023 17:18:47 -0500 Subject: [PATCH 03/16] strip off newlines and spaces when importing secrets and pinning spiffworkflow to working version until we can debug issues with new one w/ burnettk --- spiffworkflow-backend/bin/save_to_secrets_from_file | 2 +- spiffworkflow-backend/poetry.lock | 10 +++++----- spiffworkflow-backend/pyproject.toml | 3 ++- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/spiffworkflow-backend/bin/save_to_secrets_from_file b/spiffworkflow-backend/bin/save_to_secrets_from_file index 39f71602..ab7ef173 100644 --- a/spiffworkflow-backend/bin/save_to_secrets_from_file +++ b/spiffworkflow-backend/bin/save_to_secrets_from_file @@ -22,7 +22,7 @@ def main(env_file: str): contents = f.readlines() for line in contents: key, value_raw = line.split('=') - value = value_raw.replace('"', '') + value = value_raw.replace('"', '').rstrip() SecretService().add_secret(key, value, UserModel.query.first().id) diff --git a/spiffworkflow-backend/poetry.lock b/spiffworkflow-backend/poetry.lock index 50504333..9c5a9739 100644 --- a/spiffworkflow-backend/poetry.lock +++ b/spiffworkflow-backend/poetry.lock @@ -1786,7 +1786,7 @@ lxml = "*" [package.source] type = "git" url = "https://github.com/sartography/SpiffWorkflow" -reference = "main" +reference = "450ef3bcd639b6bc1c115fbe35bf3f93946cb0c7" resolved_reference = "450ef3bcd639b6bc1c115fbe35bf3f93946cb0c7" [[package]] @@ -2158,7 +2158,7 @@ testing = ["flake8 (<5)", "func-timeout", "jaraco.functools", "jaraco.itertools" [metadata] lock-version = "1.1" python-versions = ">=3.9,<3.12" -content-hash = "8592e94ba80b7d0338a9c003ca4d0e189b5f470d97391438ddc1fc9050febedb" +content-hash = "ba797b1ccf2dd8dc50d62ff06f6667f28e241b0a26611192d53abfc75b29a415" [metadata.files] alabaster = [ @@ -2499,7 +2499,6 @@ greenlet = [ {file = "greenlet-2.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5b0ff9878333823226d270417f24f4d06f235cb3e54d1103b71ea537a6a86ce"}, {file = "greenlet-2.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:be9e0fb2ada7e5124f5282d6381903183ecc73ea019568d6d63d33f25b2a9000"}, {file = "greenlet-2.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b493db84d124805865adc587532ebad30efa68f79ad68f11b336e0a51ec86c2"}, - {file = "greenlet-2.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0459d94f73265744fee4c2d5ec44c6f34aa8a31017e6e9de770f7bcf29710be9"}, {file = "greenlet-2.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a20d33124935d27b80e6fdacbd34205732660e0a1d35d8b10b3328179a2b51a1"}, {file = "greenlet-2.0.1-cp37-cp37m-win32.whl", hash = "sha256:ea688d11707d30e212e0110a1aac7f7f3f542a259235d396f88be68b649e47d1"}, {file = "greenlet-2.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:afe07421c969e259e9403c3bb658968702bc3b78ec0b6fde3ae1e73440529c23"}, @@ -2508,7 +2507,6 @@ greenlet = [ {file = "greenlet-2.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:659f167f419a4609bc0516fb18ea69ed39dbb25594934bd2dd4d0401660e8a1e"}, {file = "greenlet-2.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:356e4519d4dfa766d50ecc498544b44c0249b6de66426041d7f8b751de4d6b48"}, {file = "greenlet-2.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:811e1d37d60b47cb8126e0a929b58c046251f28117cb16fcd371eed61f66b764"}, - {file = "greenlet-2.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d38ffd0e81ba8ef347d2be0772e899c289b59ff150ebbbbe05dc61b1246eb4e0"}, {file = "greenlet-2.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:0109af1138afbfb8ae647e31a2b1ab030f58b21dd8528c27beaeb0093b7938a9"}, {file = "greenlet-2.0.1-cp38-cp38-win32.whl", hash = "sha256:88c8d517e78acdf7df8a2134a3c4b964415b575d2840a2746ddb1cc6175f8608"}, {file = "greenlet-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:d6ee1aa7ab36475035eb48c01efae87d37936a8173fc4d7b10bb02c2d75dd8f6"}, @@ -2517,7 +2515,6 @@ greenlet = [ {file = "greenlet-2.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:505138d4fa69462447a562a7c2ef723c6025ba12ac04478bc1ce2fcc279a2db5"}, {file = "greenlet-2.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cce1e90dd302f45716a7715517c6aa0468af0bf38e814ad4eab58e88fc09f7f7"}, {file = "greenlet-2.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e9744c657d896c7b580455e739899e492a4a452e2dd4d2b3e459f6b244a638d"}, - {file = "greenlet-2.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:662e8f7cad915ba75d8017b3e601afc01ef20deeeabf281bd00369de196d7726"}, {file = "greenlet-2.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:41b825d65f31e394b523c84db84f9383a2f7eefc13d987f308f4663794d2687e"}, {file = "greenlet-2.0.1-cp39-cp39-win32.whl", hash = "sha256:db38f80540083ea33bdab614a9d28bcec4b54daa5aff1668d7827a9fc769ae0a"}, {file = "greenlet-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:b23d2a46d53210b498e5b701a1913697671988f4bf8e10f935433f6e7c332fb6"}, @@ -2815,7 +2812,10 @@ orjson = [ {file = "orjson-3.8.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:b68a42a31f8429728183c21fb440c21de1b62e5378d0d73f280e2d894ef8942e"}, {file = "orjson-3.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ff13410ddbdda5d4197a4a4c09969cb78c722a67550f0a63c02c07aadc624833"}, {file = "orjson-3.8.0-cp310-none-win_amd64.whl", hash = "sha256:2d81e6e56bbea44be0222fb53f7b255b4e7426290516771592738ca01dbd053b"}, + {file = "orjson-3.8.0-cp311-cp311-macosx_10_7_x86_64.whl", hash = "sha256:200eae21c33f1f8b02a11f5d88d76950cd6fd986d88f1afe497a8ae2627c49aa"}, + {file = "orjson-3.8.0-cp311-cp311-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:9529990f3eab54b976d327360aa1ff244a4b12cb5e4c5b3712fcdd96e8fe56d4"}, {file = "orjson-3.8.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:e2defd9527651ad39ec20ae03c812adf47ef7662bdd6bc07dabb10888d70dc62"}, + {file = "orjson-3.8.0-cp311-none-win_amd64.whl", hash = "sha256:b21c7af0ff6228ca7105f54f0800636eb49201133e15ddb80ac20c1ce973ef07"}, {file = "orjson-3.8.0-cp37-cp37m-macosx_10_7_x86_64.whl", hash = "sha256:9e6ac22cec72d5b39035b566e4b86c74b84866f12b5b0b6541506a080fb67d6d"}, {file = "orjson-3.8.0-cp37-cp37m-macosx_10_9_x86_64.macosx_11_0_arm64.macosx_10_9_universal2.whl", hash = "sha256:e2f4a5542f50e3d336a18cb224fc757245ca66b1fd0b70b5dd4471b8ff5f2b0e"}, {file = "orjson-3.8.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1418feeb8b698b9224b1f024555895169d481604d5d884498c1838d7412794c"}, diff --git a/spiffworkflow-backend/pyproject.toml b/spiffworkflow-backend/pyproject.toml index fff605b0..c1b885c6 100644 --- a/spiffworkflow-backend/pyproject.toml +++ b/spiffworkflow-backend/pyproject.toml @@ -28,7 +28,8 @@ flask-migrate = "*" flask-restful = "*" werkzeug = "*" # temporarily switch off main to fix CI because poetry export doesn't capture the revision if it's not here (it ignores the lock) -SpiffWorkflow = {git = "https://github.com/sartography/SpiffWorkflow", rev = "main"} +# SpiffWorkflow = {git = "https://github.com/sartography/SpiffWorkflow", rev = "main"} +SpiffWorkflow = {git = "https://github.com/sartography/SpiffWorkflow", rev = "450ef3bcd639b6bc1c115fbe35bf3f93946cb0c7"} # SpiffWorkflow = {develop = true, path = "../SpiffWorkflow" } sentry-sdk = "^1.10" sphinx-autoapi = "^2.0" From 5ed1b2e2da89caae1afd110eca7a96a2825c6901 Mon Sep 17 00:00:00 2001 From: burnettk Date: Mon, 23 Jan 2023 17:48:06 -0500 Subject: [PATCH 04/16] document future enhancement --- .../services/process_instance_processor.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py index 0889c06e..3bc7bffe 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py @@ -1159,6 +1159,8 @@ class ProcessInstanceProcessor: # current_app.logger.debug(f"the_status: {the_status} for instance {self.process_instance_model.id}") return the_status + # inspiration from https://github.com/collectiveidea/delayed_job_active_record/blob/master/lib/delayed/backend/active_record.rb + # could consider borrowing their "cleanup all my locks when the app quits" idea as well and implement via https://docs.python.org/3/library/atexit.html def lock_process_instance(self, lock_prefix: str) -> None: locked_by = f"{lock_prefix}_{current_app.config['PROCESS_UUID']}" current_time_in_seconds = round(time.time()) From 637170363778bf10301901612cb08aa2f6fef40e Mon Sep 17 00:00:00 2001 From: jasquat Date: Tue, 24 Jan 2023 10:23:47 -0500 Subject: [PATCH 05/16] ensure order of permissions in tests --- .../services/process_instance_processor.py | 3 ++- .../spiffworkflow_backend/scripts/test_get_all_permissions.py | 4 +++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py index 3bc7bffe..ec9fa5b1 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py @@ -1160,7 +1160,8 @@ class ProcessInstanceProcessor: return the_status # inspiration from https://github.com/collectiveidea/delayed_job_active_record/blob/master/lib/delayed/backend/active_record.rb - # could consider borrowing their "cleanup all my locks when the app quits" idea as well and implement via https://docs.python.org/3/library/atexit.html + # could consider borrowing their "cleanup all my locks when the app quits" idea as well and + # implement via https://docs.python.org/3/library/atexit.html def lock_process_instance(self, lock_prefix: str) -> None: locked_by = f"{lock_prefix}_{current_app.config['PROCESS_UUID']}" current_time_in_seconds = round(time.time()) diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/scripts/test_get_all_permissions.py b/spiffworkflow-backend/tests/spiffworkflow_backend/scripts/test_get_all_permissions.py index cbf62516..667a6f73 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/scripts/test_get_all_permissions.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/scripts/test_get_all_permissions.py @@ -57,4 +57,6 @@ class TestGetAllPermissions(BaseTest): ] permissions = GetAllPermissions().run(script_attributes_context) - assert permissions == expected_permissions + sorted_permissions = sorted(permissions, key=lambda x: x['uri'] or '') + sorted_expected_permissions = sorted(expected_permissions, key=lambda x: x['uri'] or '') + assert sorted_permissions == sorted_expected_permissions From 4e0ddc7ea572f81f7565fed6ba90717a26735131 Mon Sep 17 00:00:00 2001 From: jasquat Date: Tue, 24 Jan 2023 11:03:55 -0500 Subject: [PATCH 06/16] removed uniqueness constraint from human task so we can loopback to a previous task with a gateway w/ burnettk --- .../{49aae41d7992_.py => 2ec4222f0012_.py} | 9 ++- .../models/human_task.py | 3 - .../services/process_instance_processor.py | 2 +- .../loopback_to_manual_task/loopback.bpmn | 65 +++++++++++++++++++ .../scripts/test_get_all_permissions.py | 8 ++- .../unit/test_process_instance_processor.py | 39 ++++++++++- 6 files changed, 114 insertions(+), 12 deletions(-) rename spiffworkflow-backend/migrations/versions/{49aae41d7992_.py => 2ec4222f0012_.py} (98%) create mode 100644 spiffworkflow-backend/tests/data/loopback_to_manual_task/loopback.bpmn diff --git a/spiffworkflow-backend/migrations/versions/49aae41d7992_.py b/spiffworkflow-backend/migrations/versions/2ec4222f0012_.py similarity index 98% rename from spiffworkflow-backend/migrations/versions/49aae41d7992_.py rename to spiffworkflow-backend/migrations/versions/2ec4222f0012_.py index 52b352a2..0cd0195a 100644 --- a/spiffworkflow-backend/migrations/versions/49aae41d7992_.py +++ b/spiffworkflow-backend/migrations/versions/2ec4222f0012_.py @@ -1,8 +1,8 @@ """empty message -Revision ID: 49aae41d7992 +Revision ID: 2ec4222f0012 Revises: -Create Date: 2023-01-23 14:23:17.989042 +Create Date: 2023-01-24 10:31:26.693063 """ from alembic import op @@ -10,7 +10,7 @@ import sqlalchemy as sa # revision identifiers, used by Alembic. -revision = '49aae41d7992' +revision = '2ec4222f0012' down_revision = None branch_labels = None depends_on = None @@ -206,8 +206,7 @@ def upgrade(): sa.ForeignKeyConstraint(['completed_by_user_id'], ['user.id'], ), sa.ForeignKeyConstraint(['lane_assignment_id'], ['group.id'], ), sa.ForeignKeyConstraint(['process_instance_id'], ['process_instance.id'], ), - sa.PrimaryKeyConstraint('id'), - sa.UniqueConstraint('task_id', 'process_instance_id', name='human_task_unique') + sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_human_task_completed'), 'human_task', ['completed'], unique=False) op.create_table('message_correlation', diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/human_task.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/human_task.py index 7e5117a0..3317f773 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/human_task.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/human_task.py @@ -26,9 +26,6 @@ class HumanTaskModel(SpiffworkflowBaseDBModel): """HumanTaskModel.""" __tablename__ = "human_task" - __table_args__ = ( - db.UniqueConstraint("task_id", "process_instance_id", name="human_task_unique"), - ) id: int = db.Column(db.Integer, primary_key=True) process_instance_id: int = db.Column( diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py index ec9fa5b1..a46d964b 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/process_instance_processor.py @@ -790,7 +790,7 @@ class ProcessInstanceProcessor: db.session.commit() human_tasks = HumanTaskModel.query.filter_by( - process_instance_id=self.process_instance_model.id + process_instance_id=self.process_instance_model.id, completed=False ).all() ready_or_waiting_tasks = self.get_all_ready_or_waiting_tasks() process_model_display_name = "" diff --git a/spiffworkflow-backend/tests/data/loopback_to_manual_task/loopback.bpmn b/spiffworkflow-backend/tests/data/loopback_to_manual_task/loopback.bpmn new file mode 100644 index 00000000..5ee87215 --- /dev/null +++ b/spiffworkflow-backend/tests/data/loopback_to_manual_task/loopback.bpmn @@ -0,0 +1,65 @@ + + + + + Flow_1w7l0lj + + + + Flow_1ouak9p + flow_default + flow_x_equals_one + + + + flow_default + + + + + HEY + x = 1 + + Flow_1w7l0lj + flow_x_equals_one + Flow_1ouak9p + + + x == 1 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/scripts/test_get_all_permissions.py b/spiffworkflow-backend/tests/spiffworkflow_backend/scripts/test_get_all_permissions.py index 667a6f73..b31c7228 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/scripts/test_get_all_permissions.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/scripts/test_get_all_permissions.py @@ -1,4 +1,6 @@ """Test_get_localtime.""" +from operator import itemgetter + from flask.app import Flask from flask.testing import FlaskClient from tests.spiffworkflow_backend.helpers.base_test import BaseTest @@ -57,6 +59,8 @@ class TestGetAllPermissions(BaseTest): ] permissions = GetAllPermissions().run(script_attributes_context) - sorted_permissions = sorted(permissions, key=lambda x: x['uri'] or '') - sorted_expected_permissions = sorted(expected_permissions, key=lambda x: x['uri'] or '') + sorted_permissions = sorted(permissions, key=itemgetter("uri")) + sorted_expected_permissions = sorted( + expected_permissions, key=itemgetter("uri") + ) assert sorted_permissions == sorted_expected_permissions diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_processor.py b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_processor.py index 690d6ca5..b46ba1e1 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_processor.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_process_instance_processor.py @@ -177,7 +177,6 @@ class TestProcessInstanceProcessor(BaseTest): ) processor = ProcessInstanceProcessor(process_instance) processor.do_engine_steps(save=True) - processor.save() assert len(process_instance.active_human_tasks) == 1 human_task = process_instance.active_human_tasks[0] @@ -340,3 +339,41 @@ class TestProcessInstanceProcessor(BaseTest): ).first() assert process_instance.locked_by is None assert process_instance.locked_at_in_seconds is None + + def test_it_can_loopback_to_previous_bpmn_task_with_gateway( + self, + app: Flask, + client: FlaskClient, + with_db_and_bpmn_file_cleanup: None, + ) -> None: + initiator_user = self.find_or_create_user("initiator_user") + process_model = load_test_spec( + process_model_id="test_group/loopback_to_manual_task", + bpmn_file_name="loopback.bpmn", + process_model_source_directory="loopback_to_manual_task", + ) + process_instance = self.create_process_instance_from_process_model( + process_model=process_model, user=initiator_user + ) + processor = ProcessInstanceProcessor(process_instance) + processor.do_engine_steps(save=True) + + assert len(process_instance.active_human_tasks) == 1 + assert len(process_instance.human_tasks) == 1 + human_task_one = process_instance.active_human_tasks[0] + + spiff_task = processor.__class__.get_task_by_bpmn_identifier( + human_task_one.task_name, processor.bpmn_process_instance + ) + ProcessInstanceService.complete_form_task( + processor, spiff_task, {}, initiator_user, human_task_one + ) + + assert len(process_instance.active_human_tasks) == 1 + assert len(process_instance.human_tasks) == 2 + human_task_two = process_instance.active_human_tasks[0] + + # this is just asserting the way the functionality currently works in spiff. + # we would actually expect this to change one day if we stop reusing the same guid + # when we re-do a task. + assert human_task_two.task_id == human_task_one.task_id From c2a4d8480b6fec3882b687a3f0313d1a7eae4fb4 Mon Sep 17 00:00:00 2001 From: jasquat Date: Tue, 24 Jan 2023 11:35:30 -0500 Subject: [PATCH 07/16] add process model file name validation for new files w/ burnettk --- spiffworkflow-frontend/src/index.css | 4 ++ .../src/routes/ProcessModelEditDiagram.tsx | 48 ++++++++++++++----- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/spiffworkflow-frontend/src/index.css b/spiffworkflow-frontend/src/index.css index 5b79d9fa..a8ac90cd 100644 --- a/spiffworkflow-frontend/src/index.css +++ b/spiffworkflow-frontend/src/index.css @@ -173,6 +173,10 @@ h1.with-icons { margin-top: 1.3em; } +.with-top-margin-for-label-next-to-text-input { + margin-top: 2.3em; +} + .with-tiny-top-margin { margin-top: 4px; } diff --git a/spiffworkflow-frontend/src/routes/ProcessModelEditDiagram.tsx b/spiffworkflow-frontend/src/routes/ProcessModelEditDiagram.tsx index af38d8bc..dfe3a3a5 100644 --- a/spiffworkflow-frontend/src/routes/ProcessModelEditDiagram.tsx +++ b/spiffworkflow-frontend/src/routes/ProcessModelEditDiagram.tsx @@ -14,6 +14,9 @@ import { Tab, TabPanels, TabPanel, + TextInput, + Grid, + Column, // @ts-ignore } from '@carbon/react'; import Row from 'react-bootstrap/Row'; @@ -60,6 +63,8 @@ export default function ProcessModelEditDiagram() { const [processes, setProcesses] = useState([]); const [displaySaveFileMessage, setDisplaySaveFileMessage] = useState(false); + const [processModelFileInvalidText, setProcessModelFileInvalidText] = + useState(''); const handleShowMarkdownEditor = () => setShowMarkdownEditor(true); @@ -160,6 +165,7 @@ export default function ProcessModelEditDiagram() { const handleFileNameCancel = () => { setShowFileNameEditor(false); setNewFileName(''); + setProcessModelFileInvalidText(''); }; const navigateToProcessModelFile = (_result: any) => { @@ -251,6 +257,11 @@ export default function ProcessModelEditDiagram() { const handleFileNameSave = (event: any) => { event.preventDefault(); + if (!newFileName) { + setProcessModelFileInvalidText('Process Model file name is required.'); + return; + } + setProcessModelFileInvalidText(''); setShowFileNameEditor(false); saveDiagram(bpmnXmlForDiagramRendering); }; @@ -267,17 +278,32 @@ export default function ProcessModelEditDiagram() { onRequestSubmit={handleFileNameSave} onRequestClose={handleFileNameCancel} > - - - setNewFileName(e.target.value)} - autoFocus - /> - {fileExtension} - + + + setNewFileName(e.target.value)} + invalidText={processModelFileInvalidText} + invalid={!!processModelFileInvalidText} + size="sm" + autoFocus + /> + + + {fileExtension} + + ); }; From be1d306a2f31deff09ebab37d21316b8c4f07a1b Mon Sep 17 00:00:00 2001 From: jasquat Date: Tue, 24 Jan 2023 14:35:27 -0500 Subject: [PATCH 08/16] show metadata on instance show page but for some reason it reorders elements w/ burnettk --- .../models/process_instance.py | 9 ++ .../routes/process_instances_controller.py | 3 +- spiffworkflow-frontend/src/interfaces.ts | 7 + .../src/routes/ProcessInstanceShow.tsx | 137 +++++++++++++++++- 4 files changed, 148 insertions(+), 8 deletions(-) diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance.py index 9e075600..3e9f54eb 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance.py @@ -75,6 +75,10 @@ class ProcessInstanceModel(SpiffworkflowBaseDBModel): ) # type: ignore message_instances = relationship("MessageInstanceModel", cascade="delete") # type: ignore message_correlations = relationship("MessageCorrelationModel", cascade="delete") # type: ignore + process_metadata = relationship( + "ProcessInstanceMetadataModel", + cascade="delete", + ) # type: ignore bpmn_json: str | None = deferred(db.Column(db.JSON)) # type: ignore start_in_seconds: int | None = db.Column(db.Integer) @@ -111,6 +115,11 @@ class ProcessInstanceModel(SpiffworkflowBaseDBModel): "process_initiator_username": self.process_initiator.username, } + def serialized_with_metadata(self) -> dict[str, Any]: + process_instance_attributes = self.serialized + process_instance_attributes["process_metadata"] = self.process_metadata + return process_instance_attributes + @property def serialized_flat(self) -> dict: """Return object in serializeable format with data merged together with top-level attributes. diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py b/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py index 1271f929..f4601a0a 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py @@ -682,7 +682,8 @@ def _get_process_instance( ) process_instance.bpmn_xml_file_contents = bpmn_xml_file_contents - return make_response(jsonify(process_instance), 200) + process_instance_as_dict = process_instance.serialized_with_metadata() + return make_response(jsonify(process_instance_as_dict), 200) def _find_process_instance_for_me_or_raise( diff --git a/spiffworkflow-frontend/src/interfaces.ts b/spiffworkflow-frontend/src/interfaces.ts index f2d2d0a6..990d3bbd 100644 --- a/spiffworkflow-frontend/src/interfaces.ts +++ b/spiffworkflow-frontend/src/interfaces.ts @@ -66,6 +66,12 @@ export interface ProcessFile { file_contents?: string; } +export interface ProcessInstanceMetadata { + id: number; + key: string; + value: string; +} + export interface ProcessInstance { id: number; process_model_identifier: string; @@ -80,6 +86,7 @@ export interface ProcessInstance { updated_at_in_seconds: number; bpmn_version_control_identifier: string; bpmn_version_control_type: string; + process_metadata?: ProcessInstanceMetadata[]; } export interface MessageCorrelationProperties { diff --git a/spiffworkflow-frontend/src/routes/ProcessInstanceShow.tsx b/spiffworkflow-frontend/src/routes/ProcessInstanceShow.tsx index 279322a6..9b6f1492 100644 --- a/spiffworkflow-frontend/src/routes/ProcessInstanceShow.tsx +++ b/spiffworkflow-frontend/src/routes/ProcessInstanceShow.tsx @@ -1,4 +1,9 @@ -import { useContext, useEffect, useState } from 'react'; +import React, { + ReactComponentElement, + useContext, + useEffect, + useState, +} from 'react'; import Editor from '@monaco-editor/react'; import { useParams, @@ -44,6 +49,7 @@ import { PermissionsToCheck, ProcessData, ProcessInstance, + ProcessInstanceMetadata, ProcessInstanceTask, } from '../interfaces'; import { usePermissionFetcher } from '../hooks/PermissionService'; @@ -161,6 +167,11 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { variant, ]); + // useEffect(() => { + // setTimeout(() => setDisplayDetails(!displayDetails), 1 * 2000); + // // setTimeout(() => setDisplayDetails(false), 1 * 6000); + // }, [displayDetails]); + const deleteProcessInstance = () => { HttpService.makeCallToBackend({ path: targetUris.processInstanceActionPath, @@ -284,6 +295,38 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { }); }; + const processMetadataDisplayArea = () => { + if ( + !processInstance || + (processInstance.process_metadata && + processInstance.process_metadata.length < 1) + ) { + return null; + } + const metadataComponents: any[] = []; + (processInstance.process_metadata || []).forEach( + (processInstanceMetadata: ProcessInstanceMetadata) => { + metadataComponents.push( + + + {processInstanceMetadata.key} + + + {processInstanceMetadata.value} + + + ); + } + ); + return ( + <> +
+ {metadataComponents} + + ); + // return metadataComponents; + }; + const detailedViewElement = () => { if (!processInstance) { return null; @@ -331,6 +374,15 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { {processInstance.bpmn_version_control_type}) + + + Process model revision:{' '} + + + {processInstance.bpmn_version_control_identifier} ( + {processInstance.bpmn_version_control_type}) + + ); } @@ -348,6 +400,68 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { ); }; + let deets: any = null; + if (processInstance) { + if (displayDetails) { + deets = ( + <> + + + + + + Updated At:{' '} + + + {convertSecondsToFormattedDateTime( + processInstance.updated_at_in_seconds + )} + + + + + Created At:{' '} + + + {convertSecondsToFormattedDateTime( + processInstance.created_at_in_seconds + )} + + + + + Process model revision:{' '} + + + {processInstance.bpmn_version_control_identifier} ( + {processInstance.bpmn_version_control_type}) + + + + ); + } else { + deets = ( + + + + ); + } + } + const getInfoTag = () => { if (!processInstance) { return null; @@ -382,8 +496,11 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { statusIcon = ; } + const details = detailedViewElement(); + return ( <> + {/* Started By:{' '} @@ -403,6 +520,7 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { {currentEndDateTag} + */} Status:{' '} @@ -413,8 +531,11 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { - {detailedViewElement()} + {/* detailedViewElement() */} + {deets} + {/*
+ */} @@ -1002,6 +1123,7 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { [`Process Instance Id: ${processInstance.id}`], ]} /> + {/*

Process Instance Id: {processInstance.id} @@ -1030,12 +1152,8 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { /> + */} {getInfoTag()} -
- {taskUpdateDisplayArea()} - {processDataDisplayArea()} - {stepsElement()} -
+ {/*
*/} + {/* {stepsElement()} */} + {/*
*/} + {taskUpdateDisplayArea()} + {processDataDisplayArea()}
); From d86c083dfec335d228d08d31ec4e3600bb74b427 Mon Sep 17 00:00:00 2001 From: jasquat Date: Tue, 24 Jan 2023 15:15:48 -0500 Subject: [PATCH 09/16] do not allow deleting primary bpmn file and do not allow instantiating models without a primary bpmn file w/ burnettk --- .flake8 | 7 +++- spiffworkflow-backend/.flake8 | 7 +++- .../routes/process_instances_controller.py | 12 +++++++ .../routes/process_models_controller.py | 11 ++++++ .../integration/test_process_api.py | 34 +++++++++++++++++-- .../src/components/ProcessInstanceRun.tsx | 2 ++ 6 files changed, 69 insertions(+), 4 deletions(-) diff --git a/.flake8 b/.flake8 index 97353aae..25482610 100644 --- a/.flake8 +++ b/.flake8 @@ -10,6 +10,11 @@ rst-directives = deprecated per-file-ignores = # More specific globs seem to overwrite the more generic ones so we have # to split them out by directory + # So if you have a rule like: + # tests/*: D102,D103 + # and a rule like: + # tests/test_hey.py: D102 + # THEN, test_hey.py will NOT be excluding D103 # asserts are ok in tests spiffworkflow-backend/tests/*:S101,D102,D103,D101 @@ -37,4 +42,4 @@ per-file-ignores = # TODO: fix the S issues: # S607 Starting a process with a partial executable path # S605 Starting a process with a shell: Seems safe, but may be changed in the future, consider rewriting without shell - spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_process_api.py:S607,S101,D103,S605 + spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_process_api.py:S607,S101,S605,D102,D103,D101 diff --git a/spiffworkflow-backend/.flake8 b/spiffworkflow-backend/.flake8 index b42cf528..66efd2c7 100644 --- a/spiffworkflow-backend/.flake8 +++ b/spiffworkflow-backend/.flake8 @@ -10,6 +10,11 @@ rst-directives = deprecated per-file-ignores = # More specific globs seem to overwrite the more generic ones so we have # to split them out by directory + # So if you have a rule like: + # tests/*: D102,D103 + # and a rule like: + # tests/test_hey.py: D102 + # THEN, test_hey.py will NOT be excluding D103 # asserts are ok in tests tests/*:S101,D102,D103 @@ -34,4 +39,4 @@ per-file-ignores = # and ignore long comment line src/spiffworkflow_backend/services/logging_service.py:N802,B950 - tests/spiffworkflow_backend/integration/test_process_api.py:S607,S101,D103,S605 + tests/spiffworkflow_backend/integration/test_process_api.py:S607,S101,S605,D102,D103,D101 diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py b/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py index 1271f929..679c2fa7 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py @@ -72,6 +72,18 @@ def process_instance_create( process_model_identifier = _un_modify_modified_process_model_id( modified_process_model_identifier ) + + process_model = _get_process_model(process_model_identifier) + if process_model.primary_file_name is None: + raise ApiError( + error_code="process_model_missing_primary_bpmn_file", + message=( + f"Process Model '{process_model_identifier}' does not have a primary" + " bpmn file. One must be set in order to instantiate this model." + ), + status_code=400, + ) + process_instance = ( ProcessInstanceService.create_process_instance_from_process_model_identifier( process_model_identifier, g.user diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_models_controller.py b/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_models_controller.py index 694c01ef..19f064c9 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_models_controller.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_models_controller.py @@ -277,6 +277,17 @@ def process_model_file_delete( """Process_model_file_delete.""" process_model_identifier = modified_process_model_identifier.replace(":", "/") process_model = _get_process_model(process_model_identifier) + if process_model.primary_file_name == file_name: + raise ApiError( + error_code="process_model_file_cannot_be_deleted", + message=( + f"'{file_name}' is the primary bpmn file for" + f" '{process_model_identifier}' and cannot be deleted. Please set" + " another file as the primary before attempting to delete this one." + ), + status_code=400, + ) + try: SpecFileService.delete_file(process_model, file_name) except FileNotFoundError as exception: diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_process_api.py b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_process_api.py index ebc26ac6..7213e31c 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_process_api.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/integration/test_process_api.py @@ -922,6 +922,28 @@ class TestProcessApi(BaseTest): assert response.json is not None assert response.json["error_code"] == "process_model_file_cannot_be_found" + def test_process_model_file_delete_when_primary_file( + self, + app: Flask, + client: FlaskClient, + with_db_and_bpmn_file_cleanup: None, + with_super_admin_user: UserModel, + ) -> None: + process_model_identifier = self.create_group_and_model_with_bpmn( + client, with_super_admin_user + ) + modified_process_model_identifier = process_model_identifier.replace("/", ":") + + response = client.delete( + f"/v1.0/process-models/{modified_process_model_identifier}/files/random_fact.bpmn", + follow_redirects=True, + headers=self.logged_in_headers(with_super_admin_user), + ) + + assert response.status_code == 400 + assert response.json is not None + assert response.json["error_code"] == "process_model_file_cannot_be_deleted" + def test_process_model_file_delete( self, app: Flask, @@ -935,8 +957,16 @@ class TestProcessApi(BaseTest): ) modified_process_model_identifier = process_model_identifier.replace("/", ":") + self.create_spec_file( + client, + process_model_id=process_model_identifier, + file_name="second_file.json", + file_data=b"

HEY

", + user=with_super_admin_user, + ) + response = client.delete( - f"/v1.0/process-models/{modified_process_model_identifier}/files/random_fact.bpmn", + f"/v1.0/process-models/{modified_process_model_identifier}/files/second_file.json", follow_redirects=True, headers=self.logged_in_headers(with_super_admin_user), ) @@ -946,7 +976,7 @@ class TestProcessApi(BaseTest): assert response.json["ok"] response = client.get( - f"/v1.0/process-models/{modified_process_model_identifier}/files/random_fact.svg", + f"/v1.0/process-models/{modified_process_model_identifier}/files/second_file.json", headers=self.logged_in_headers(with_super_admin_user), ) assert response.status_code == 404 diff --git a/spiffworkflow-frontend/src/components/ProcessInstanceRun.tsx b/spiffworkflow-frontend/src/components/ProcessInstanceRun.tsx index b956abcc..f7aafed7 100644 --- a/spiffworkflow-frontend/src/components/ProcessInstanceRun.tsx +++ b/spiffworkflow-frontend/src/components/ProcessInstanceRun.tsx @@ -116,9 +116,11 @@ export default function ProcessInstanceRun({ }; const processInstanceCreateAndRun = () => { + setErrorObject(null); HttpService.makeCallToBackend({ path: processInstanceCreatePath, successCallback: processModelRun, + failureCallback: setErrorObject, httpMethod: 'POST', }); }; From f156605b0a14cb7129caab0065ee311654cbcf21 Mon Sep 17 00:00:00 2001 From: jasquat Date: Tue, 24 Jan 2023 16:38:05 -0500 Subject: [PATCH 10/16] put process instance show page to match main w/ burnettk --- .../src/routes/ProcessInstanceShow.tsx | 137 +----------------- 1 file changed, 7 insertions(+), 130 deletions(-) diff --git a/spiffworkflow-frontend/src/routes/ProcessInstanceShow.tsx b/spiffworkflow-frontend/src/routes/ProcessInstanceShow.tsx index 9b6f1492..279322a6 100644 --- a/spiffworkflow-frontend/src/routes/ProcessInstanceShow.tsx +++ b/spiffworkflow-frontend/src/routes/ProcessInstanceShow.tsx @@ -1,9 +1,4 @@ -import React, { - ReactComponentElement, - useContext, - useEffect, - useState, -} from 'react'; +import { useContext, useEffect, useState } from 'react'; import Editor from '@monaco-editor/react'; import { useParams, @@ -49,7 +44,6 @@ import { PermissionsToCheck, ProcessData, ProcessInstance, - ProcessInstanceMetadata, ProcessInstanceTask, } from '../interfaces'; import { usePermissionFetcher } from '../hooks/PermissionService'; @@ -167,11 +161,6 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { variant, ]); - // useEffect(() => { - // setTimeout(() => setDisplayDetails(!displayDetails), 1 * 2000); - // // setTimeout(() => setDisplayDetails(false), 1 * 6000); - // }, [displayDetails]); - const deleteProcessInstance = () => { HttpService.makeCallToBackend({ path: targetUris.processInstanceActionPath, @@ -295,38 +284,6 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { }); }; - const processMetadataDisplayArea = () => { - if ( - !processInstance || - (processInstance.process_metadata && - processInstance.process_metadata.length < 1) - ) { - return null; - } - const metadataComponents: any[] = []; - (processInstance.process_metadata || []).forEach( - (processInstanceMetadata: ProcessInstanceMetadata) => { - metadataComponents.push( - - - {processInstanceMetadata.key} - - - {processInstanceMetadata.value} - - - ); - } - ); - return ( - <> -
- {metadataComponents} - - ); - // return metadataComponents; - }; - const detailedViewElement = () => { if (!processInstance) { return null; @@ -374,15 +331,6 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { {processInstance.bpmn_version_control_type}) - - - Process model revision:{' '} - - - {processInstance.bpmn_version_control_identifier} ( - {processInstance.bpmn_version_control_type}) - - ); } @@ -400,68 +348,6 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { ); }; - let deets: any = null; - if (processInstance) { - if (displayDetails) { - deets = ( - <> - - - - - - Updated At:{' '} - - - {convertSecondsToFormattedDateTime( - processInstance.updated_at_in_seconds - )} - - - - - Created At:{' '} - - - {convertSecondsToFormattedDateTime( - processInstance.created_at_in_seconds - )} - - - - - Process model revision:{' '} - - - {processInstance.bpmn_version_control_identifier} ( - {processInstance.bpmn_version_control_type}) - - - - ); - } else { - deets = ( - - - - ); - } - } - const getInfoTag = () => { if (!processInstance) { return null; @@ -496,11 +382,8 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { statusIcon = ; } - const details = detailedViewElement(); - return ( <> - {/* Started By:{' '} @@ -520,7 +403,6 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { {currentEndDateTag} - */} Status:{' '} @@ -531,11 +413,8 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { - {/* detailedViewElement() */} - {deets} - {/* + {detailedViewElement()}
- */} @@ -1123,7 +1002,6 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { [`Process Instance Id: ${processInstance.id}`], ]} /> - {/*

Process Instance Id: {processInstance.id} @@ -1152,8 +1030,12 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { /> - */} {getInfoTag()} +
+ {taskUpdateDisplayArea()} + {processDataDisplayArea()} + {stepsElement()} +
- {/*
*/} - {/* {stepsElement()} */} - {/*
*/} - {taskUpdateDisplayArea()} - {processDataDisplayArea()}
); From 1fbd3edde9ff67829e4f5accc296396d6dc49755 Mon Sep 17 00:00:00 2001 From: jasquat Date: Tue, 24 Jan 2023 16:53:23 -0500 Subject: [PATCH 11/16] use a modal for metadata instead w/ burnettk --- .../src/routes/ProcessInstanceShow.tsx | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/spiffworkflow-frontend/src/routes/ProcessInstanceShow.tsx b/spiffworkflow-frontend/src/routes/ProcessInstanceShow.tsx index 279322a6..41168bdf 100644 --- a/spiffworkflow-frontend/src/routes/ProcessInstanceShow.tsx +++ b/spiffworkflow-frontend/src/routes/ProcessInstanceShow.tsx @@ -44,6 +44,7 @@ import { PermissionsToCheck, ProcessData, ProcessInstance, + ProcessInstanceMetadata, ProcessInstanceTask, } from '../interfaces'; import { usePermissionFetcher } from '../hooks/PermissionService'; @@ -74,6 +75,8 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { const [eventTextEditorEnabled, setEventTextEditorEnabled] = useState(false); const [displayDetails, setDisplayDetails] = useState(false); + const [showProcessInstanceMetadata, setShowProcessInstanceMetadata] = + useState(false); const setErrorObject = (useContext as any)(ErrorContext)[1]; @@ -446,6 +449,19 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { Messages + {processInstance.process_metadata && + processInstance.process_metadata.length > 0 ? ( + + ) : null} @@ -903,6 +919,41 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { ); }; + const processInstanceMetadataArea = () => { + if ( + !processInstance || + (processInstance.process_metadata && + processInstance.process_metadata.length < 1) + ) { + return null; + } + const metadataComponents: any[] = []; + (processInstance.process_metadata || []).forEach( + (processInstanceMetadata: ProcessInstanceMetadata) => { + metadataComponents.push( + + + {processInstanceMetadata.key} + + + {processInstanceMetadata.value} + + + ); + } + ); + return ( + setShowProcessInstanceMetadata(false)} + > + {metadataComponents} + + ); + }; + const taskUpdateDisplayArea = () => { const taskToUse: any = { ...taskToDisplay, data: taskDataToDisplay }; const candidateEvents: any = getEvents(taskToUse); @@ -1034,6 +1085,7 @@ export default function ProcessInstanceShow({ variant }: OwnProps) {
{taskUpdateDisplayArea()} {processDataDisplayArea()} + {processInstanceMetadataArea()} {stepsElement()}
Date: Tue, 24 Jan 2023 21:20:19 +0100 Subject: [PATCH 12/16] ci: use ENV variables for all ports MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also add a comment warning about hardcoded backend port. Signed-off-by: Jakub Sokołowski --- docker-compose.yml | 104 +++++++++++++++++++++++---------------------- 1 file changed, 54 insertions(+), 50 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index b505499b..a0d5bd2e 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,23 +1,16 @@ version: "3.8" services: - spiffworkflow-db: - container_name: spiffworkflow-db - image: mysql:8.0.29 - platform: linux/amd64 - cap_add: - - SYS_NICE - restart: "no" + spiffworkflow-frontend: + container_name: spiffworkflow-frontend + image: ghcr.io/sartography/spiffworkflow-frontend:latest + depends_on: + spiffworkflow-backend: + condition: service_healthy environment: - - MYSQL_DATABASE=spiffworkflow_backend_development - - MYSQL_ROOT_PASSWORD=my-secret-pw - - MYSQL_TCP_PORT=8003 + APPLICATION_ROOT: "/" + PORT0: "${SPIFF_FRONTEND_PORT:-8001}" ports: - - "8003" - healthcheck: - test: mysql --user=root --password=my-secret-pw -e 'select 1' spiffworkflow_backend_development - interval: 10s - timeout: 5s - retries: 10 + - "${SPIFF_FRONTEND_PORT:-8001}:${SPIFF_FRONTEND_PORT:-8001}/tcp" spiffworkflow-backend: container_name: spiffworkflow-backend @@ -26,58 +19,69 @@ services: spiffworkflow-db: condition: service_healthy environment: - - APPLICATION_ROOT=/ - - SPIFFWORKFLOW_BACKEND_ENV=development - - FLASK_DEBUG=0 - - FLASK_SESSION_SECRET_KEY=super_secret_key - - OPEN_ID_SERVER_URL=http://localhost:8000/openid - - SPIFFWORKFLOW_FRONTEND_URL=http://localhost:8001 - - SPIFFWORKFLOW_BACKEND_URL=http://localhost:8000 - - SPIFFWORKFLOW_BACKEND_PORT=8000 - - SPIFFWORKFLOW_BACKEND_UPGRADE_DB=true - - SPIFFWORKFLOW_BACKEND_DATABASE_URI=mysql+mysqlconnector://root:my-secret-pw@spiffworkflow-db:8003/spiffworkflow_backend_development - - BPMN_SPEC_ABSOLUTE_DIR=/app/process_models - - SPIFFWORKFLOW_BACKEND_LOAD_FIXTURE_DATA=false - - SPIFFWORKFLOW_BACKEND_PERMISSIONS_FILE_NAME=example.yml - - RUN_BACKGROUND_SCHEDULER=true - - OPEN_ID_CLIENT_ID=spiffworkflow-backend - - OPEN_ID_CLIENT_SECRET_KEY=my_open_id_secret_key + APPLICATION_ROOT: "/" + SPIFFWORKFLOW_BACKEND_ENV: "development" + FLASK_DEBUG: "0" + FLASK_SESSION_SECRET_KEY: "${FLASK_SESSION_SECRET_KEY:-super_secret_key}" + OPEN_ID_SERVER_URL: "http://localhost:${SPIFF_BACKEND_PORT:-8000}/openid" + SPIFFWORKFLOW_FRONTEND_URL: "http://localhost:${SPIFF_FRONTEND_PORT:-8001}" + # WARNING: Frontend is a static site which assumes frontend port - 1 on localhost. + SPIFFWORKFLOW_BACKEND_URL: "http://localhost:${SPIFF_BACKEND_PORT:-8000}" + SPIFFWORKFLOW_BACKEND_PORT: "${SPIFF_BACKEND_PORT:-8000}" + SPIFFWORKFLOW_BACKEND_UPGRADE_DB: "true" + SPIFFWORKFLOW_BACKEND_DATABASE_URI: "mysql+mysqlconnector://root:${SPIFF_MYSQL_PASS:-my-secret-pw}@spiffworkflow-db:${SPIFF_MYSQL_PORT:-8003}/spiffworkflow_backend_development" + BPMN_SPEC_ABSOLUTE_DIR: "/app/process_models" + SPIFFWORKFLOW_BACKEND_LOAD_FIXTURE_DATA: "false" + SPIFFWORKFLOW_BACKEND_PERMISSIONS_FILE_NAME: "example.yml" + RUN_BACKGROUND_SCHEDULER: "true" + OPEN_ID_CLIENT_ID: "spiffworkflow-backend" + OPEN_ID_CLIENT_SECRET_KEY: "my_open_id_secret_key" ports: - - "8000:8000" + - "${SPIFF_BACKEND_PORT:-8000}:${SPIFF_BACKEND_PORT:-8000}/tcp" volumes: - ./process_models:/app/process_models - ./log:/app/log healthcheck: - test: curl localhost:8000/v1.0/status --fail + test: "curl localhost:${SPIFF_BACKEND_PORT:-8000}/v1.0/status --fail" interval: 10s timeout: 5s retries: 20 - spiffworkflow-frontend: - container_name: spiffworkflow-frontend - image: ghcr.io/sartography/spiffworkflow-frontend - environment: - - APPLICATION_ROOT=/ - - PORT0=8001 - ports: - - "8001:8001" - spiffworkflow-connector: container_name: spiffworkflow-connector - image: ghcr.io/sartography/connector-proxy-demo + image: ghcr.io/sartography/connector-proxy-demo:latest environment: - - FLASK_ENV=${FLASK_ENV:-development} - - FLASK_DEBUG=0 - - FLASK_SESSION_SECRET_KEY=${FLASK_SESSION_SECRET_KEY:-super_secret_key} - - CONNECTOR_PROXY_PORT=8004 + FLASK_ENV: "${FLASK_ENV:-development}" + FLASK_DEBUG: "0" + FLASK_SESSION_SECRET_KEY: "${FLASK_SESSION_SECRET_KEY:-super_secret_key}" + CONNECTOR_PROXY_PORT: "${SPIFF_CONNECTOR_PORT:-8004}" ports: - - "8004:8004" + - "${SPIFF_CONNECTOR_PORT:-8004}:${SPIFF_CONNECTOR_PORT:-8004}/tcp" healthcheck: - test: curl localhost:8004/liveness --fail + test: "curl localhost:${SPIFF_CONNECTOR_PORT:-8004}/liveness --fail" interval: 10s timeout: 5s retries: 20 + spiffworkflow-db: + container_name: spiffworkflow-db + image: mysql:8.0.29 + platform: linux/amd64 + cap_add: + - SYS_NICE + restart: "no" + environment: + MYSQL_DATABASE: "spiffworkflow_backend_development" + MYSQL_ROOT_PASSWORD: "${SPIFF_MYSQL_PASS:-my-secret-pw}" + MYSQL_TCP_PORT: "${SPIFF_MYSQL_PORT:-8003}" + ports: + - "${SPIFF_MYSQL_PORT:-8003}:${SPIFF_MYSQL_PORT:-8003}/tcp" + healthcheck: + test: "mysql --user=root --password=${SPIFF_MYSQL_PASS:-my-secret-pw} -e 'select 1' spiffworkflow_backend_development" + interval: 10s + timeout: 5s + retries: 10 + volumes: spiffworkflow_backend: From 5b88f88d319ddb01616e92714d0e2e4a7410e799 Mon Sep 17 00:00:00 2001 From: jasquat Date: Wed, 25 Jan 2023 10:39:17 -0500 Subject: [PATCH 13/16] added the process model identifier for the diagram if it is not the top level w/ burnettk --- .../models/process_instance.py | 7 ++++++- .../routes/process_instances_controller.py | 3 +++ spiffworkflow-frontend/src/interfaces.ts | 1 + .../src/routes/ProcessInstanceShow.tsx | 18 ++++++++++++++++++ 4 files changed, 28 insertions(+), 1 deletion(-) diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance.py b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance.py index 3e9f54eb..95930958 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/models/process_instance.py @@ -87,7 +87,6 @@ class ProcessInstanceModel(SpiffworkflowBaseDBModel): created_at_in_seconds: int = db.Column(db.Integer) status: str = db.Column(db.String(50)) - bpmn_xml_file_contents: str | None = None bpmn_version_control_type: str = db.Column(db.String(50)) bpmn_version_control_identifier: str = db.Column(db.String(255)) spiff_step: int = db.Column(db.Integer) @@ -95,6 +94,9 @@ class ProcessInstanceModel(SpiffworkflowBaseDBModel): locked_by: str | None = db.Column(db.String(80)) locked_at_in_seconds: int | None = db.Column(db.Integer) + bpmn_xml_file_contents: str | None = None + process_model_with_diagram_identifier: str | None = None + @property def serialized(self) -> dict[str, Any]: """Return object data in serializeable format.""" @@ -118,6 +120,9 @@ class ProcessInstanceModel(SpiffworkflowBaseDBModel): def serialized_with_metadata(self) -> dict[str, Any]: process_instance_attributes = self.serialized process_instance_attributes["process_metadata"] = self.process_metadata + process_instance_attributes["process_model_with_diagram_identifier"] = ( + self.process_model_with_diagram_identifier + ) return process_instance_attributes @property diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py b/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py index 27ccc8ab..a2e68bf3 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_instances_controller.py @@ -673,6 +673,9 @@ def _get_process_instance( spec_reference.process_model_id ) name_of_file_with_diagram = spec_reference.file_name + process_instance.process_model_with_diagram_identifier = ( + process_model_with_diagram.id + ) else: process_model_with_diagram = _get_process_model(process_model_identifier) if process_model_with_diagram.primary_file_name: diff --git a/spiffworkflow-frontend/src/interfaces.ts b/spiffworkflow-frontend/src/interfaces.ts index 990d3bbd..e76b3815 100644 --- a/spiffworkflow-frontend/src/interfaces.ts +++ b/spiffworkflow-frontend/src/interfaces.ts @@ -87,6 +87,7 @@ export interface ProcessInstance { bpmn_version_control_identifier: string; bpmn_version_control_type: string; process_metadata?: ProcessInstanceMetadata[]; + process_model_with_diagram_identifier?: string; } export interface MessageCorrelationProperties { diff --git a/spiffworkflow-frontend/src/routes/ProcessInstanceShow.tsx b/spiffworkflow-frontend/src/routes/ProcessInstanceShow.tsx index 41168bdf..edf33426 100644 --- a/spiffworkflow-frontend/src/routes/ProcessInstanceShow.tsx +++ b/spiffworkflow-frontend/src/routes/ProcessInstanceShow.tsx @@ -35,6 +35,7 @@ import HttpService from '../services/HttpService'; import ReactDiagramEditor from '../components/ReactDiagramEditor'; import { convertSecondsToFormattedDateTime, + modifyProcessIdentifierForPathParam, unModifyProcessIdentifierForPathParam, } from '../helpers'; import ButtonWithConfirmation from '../components/ButtonWithConfirmation'; @@ -395,6 +396,23 @@ export default function ProcessInstanceShow({ variant }: OwnProps) { {processInstance.process_initiator_username} + {processInstance.process_model_with_diagram_identifier ? ( + + + Current Diagram:{' '} + + + + {processInstance.process_model_with_diagram_identifier} + + + + ) : null} Started:{' '} From def02a5f568a1d54154700830fdd1f5636d682e6 Mon Sep 17 00:00:00 2001 From: burnettk Date: Wed, 25 Jan 2023 11:30:19 -0500 Subject: [PATCH 14/16] delete legacy flask-rendered html pages from initial prototype, since backend is now API-only --- .../src/spiffworkflow_backend/__init__.py | 2 - .../routes/admin_blueprint/__init__.py | 1 - .../routes/admin_blueprint/admin_blueprint.py | 187 - .../routes/admin_blueprint/static/app.js | 26 - .../admin_blueprint/static/package-lock.json | 3172 ----------------- .../admin_blueprint/static/package.json | 18 - .../routes/admin_blueprint/static/style.css | 2 - .../admin_blueprint/templates/layout.html | 23 - .../templates/process_group_list.html | 18 - .../templates/process_group_show.html | 25 - .../templates/process_model_edit.html | 167 - .../templates/process_model_show.html | 159 - 12 files changed, 3800 deletions(-) delete mode 100644 spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/__init__.py delete mode 100644 spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/admin_blueprint.py delete mode 100644 spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/static/app.js delete mode 100644 spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/static/package-lock.json delete mode 100644 spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/static/package.json delete mode 100644 spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/static/style.css delete mode 100644 spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/templates/layout.html delete mode 100644 spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/templates/process_group_list.html delete mode 100644 spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/templates/process_group_show.html delete mode 100644 spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/templates/process_model_edit.html delete mode 100644 spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/templates/process_model_show.html diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/__init__.py b/spiffworkflow-backend/src/spiffworkflow_backend/__init__.py index 0c5f1232..46f82581 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/__init__.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/__init__.py @@ -19,7 +19,6 @@ from spiffworkflow_backend.exceptions.api_error import api_error_blueprint from spiffworkflow_backend.helpers.api_version import V1_API_PATH_PREFIX from spiffworkflow_backend.models.db import db from spiffworkflow_backend.models.db import migrate -from spiffworkflow_backend.routes.admin_blueprint.admin_blueprint import admin_blueprint from spiffworkflow_backend.routes.openid_blueprint.openid_blueprint import ( openid_blueprint, ) @@ -106,7 +105,6 @@ def create_app() -> flask.app.Flask: app.register_blueprint(user_blueprint) app.register_blueprint(api_error_blueprint) - app.register_blueprint(admin_blueprint, url_prefix="/admin") app.register_blueprint(openid_blueprint, url_prefix="/openid") # preflight options requests will be allowed if they meet the requirements of the url regex. diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/__init__.py b/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/__init__.py deleted file mode 100644 index f520b09d..00000000 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/__init__.py +++ /dev/null @@ -1 +0,0 @@ -"""__init__.""" diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/admin_blueprint.py b/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/admin_blueprint.py deleted file mode 100644 index 5cb0ae89..00000000 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/admin_blueprint.py +++ /dev/null @@ -1,187 +0,0 @@ -"""APIs for dealing with process groups, process models, and process instances.""" -from typing import Union - -from flask import Blueprint -from flask import flash -from flask import redirect -from flask import render_template -from flask import request -from flask import url_for -from werkzeug.wrappers import Response - -from spiffworkflow_backend.services.process_instance_processor import ( - ProcessInstanceProcessor, -) -from spiffworkflow_backend.services.process_instance_service import ( - ProcessInstanceService, -) -from spiffworkflow_backend.services.process_model_service import ProcessModelService -from spiffworkflow_backend.services.spec_file_service import SpecFileService -from spiffworkflow_backend.services.user_service import UserService - -admin_blueprint = Blueprint( - "admin", __name__, template_folder="templates", static_folder="static" -) - -ALLOWED_BPMN_EXTENSIONS = {"bpmn", "dmn"} - - -@admin_blueprint.route("/process-groups", methods=["GET"]) -def process_group_list() -> str: - """Process_group_list.""" - process_groups = ProcessModelService.get_process_groups() - return render_template("process_group_list.html", process_groups=process_groups) - - -@admin_blueprint.route("/process-groups/", methods=["GET"]) -def process_group_show(process_group_id: str) -> str: - """Show_process_group.""" - process_group = ProcessModelService.get_process_group(process_group_id) - return render_template("process_group_show.html", process_group=process_group) - - -@admin_blueprint.route("/process-models/", methods=["GET"]) -def process_model_show(process_model_id: str) -> Union[str, Response]: - """Show_process_model.""" - process_model = ProcessModelService.get_process_model(process_model_id) - files = SpecFileService.get_files(process_model, extension_filter="bpmn") - current_file_name = process_model.primary_file_name - if current_file_name is None: - flash("No primary_file_name", "error") - return redirect(url_for("admin.process_group_list")) - bpmn_xml = SpecFileService.get_data(process_model, current_file_name) - return render_template( - "process_model_show.html", - process_model=process_model, - bpmn_xml=bpmn_xml, - files=files, - current_file_name=current_file_name, - ) - - -@admin_blueprint.route( - "/process-models//", methods=["GET"] -) -def process_model_show_file(process_model_id: str, file_name: str) -> str: - """Process_model_show_file.""" - process_model = ProcessModelService.get_process_model(process_model_id) - bpmn_xml = SpecFileService.get_data(process_model, file_name) - files = SpecFileService.get_files(process_model, extension_filter="bpmn") - return render_template( - "process_model_show.html", - process_model=process_model, - bpmn_xml=bpmn_xml, - files=files, - current_file_name=file_name, - ) - - -@admin_blueprint.route( - "/process-models//upload-file", methods=["POST"] -) -def process_model_upload_file(process_model_id: str) -> Response: - """Process_model_upload_file.""" - process_model = ProcessModelService.get_process_model(process_model_id) - - if "file" not in request.files: - flash("No file part", "error") - request_file = request.files["file"] - # If the user does not select a file, the browser submits an - # empty file without a filename. - if request_file.filename == "" or request_file.filename is None: - flash("No selected file", "error") - else: - if request_file and _allowed_file(request_file.filename): - if request_file.filename is not None: - SpecFileService.add_file( - process_model, request_file.filename, request_file.stream.read() - ) - ProcessModelService.save_process_model(process_model) - - return redirect( - url_for("admin.process_model_show", process_model_id=process_model.id) - ) - - -@admin_blueprint.route( - "/process_models//edit/", methods=["GET"] -) -def process_model_edit(process_model_id: str, file_name: str) -> str: - """Edit_bpmn.""" - process_model = ProcessModelService.get_process_model(process_model_id) - bpmn_xml = SpecFileService.get_data(process_model, file_name) - - return render_template( - "process_model_edit.html", - bpmn_xml=bpmn_xml.decode("utf-8"), - process_model=process_model, - file_name=file_name, - ) - - -@admin_blueprint.route( - "/process-models//save/", methods=["POST"] -) -def process_model_save(process_model_id: str, file_name: str) -> Union[str, Response]: - """Process_model_save.""" - process_model = ProcessModelService.get_process_model(process_model_id) - SpecFileService.update_file(process_model, file_name, request.get_data()) - if process_model.primary_file_name is None: - flash("No primary_file_name", "error") - return redirect(url_for("admin.process_group_list")) - bpmn_xml = SpecFileService.get_data(process_model, process_model.primary_file_name) - return render_template( - "process_model_edit.html", - bpmn_xml=bpmn_xml.decode("utf-8"), - process_model=process_model, - file_name=file_name, - ) - - -@admin_blueprint.route("/process-models//run", methods=["GET"]) -def process_model_run(process_model_id: str) -> Union[str, Response]: - """Process_model_run.""" - user = UserService.create_user("Mr. Test", "internal", "Mr. Test") - process_instance = ( - ProcessInstanceService.create_process_instance_from_process_model_identifier( - process_model_id, user - ) - ) - processor = ProcessInstanceProcessor(process_instance) - processor.do_engine_steps() - result = processor.get_data() - - process_model = ProcessModelService.get_process_model(process_model_id) - files = SpecFileService.get_files(process_model, extension_filter="bpmn") - current_file_name = process_model.primary_file_name - if current_file_name is None: - flash("No primary_file_name", "error") - return redirect(url_for("admin.process_group_list")) - bpmn_xml = SpecFileService.get_data(process_model, current_file_name) - - return render_template( - "process_model_show.html", - process_model=process_model, - bpmn_xml=bpmn_xml, - result=result, - files=files, - current_file_name=current_file_name, - ) - - -# def _find_or_create_user(username: str = "test_user1") -> Any: -# """Find_or_create_user.""" -# user = UserModel.query.filter_by(username=username).first() -# if user is None: -# user = UserModel(username=username) -# db.session.add(user) -# db.session.commit() -# return user - - -def _allowed_file(filename: str) -> bool: - """_allowed_file.""" - return ( - "." in filename - and filename.rsplit(".", 1)[1].lower() in ALLOWED_BPMN_EXTENSIONS - ) diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/static/app.js b/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/static/app.js deleted file mode 100644 index 5fb392dc..00000000 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/static/app.js +++ /dev/null @@ -1,26 +0,0 @@ -import BpmnViewer from "bpmn-js"; - -var viewer = new BpmnViewer({ - container: "#canvas", -}); - -viewer - .importXML(pizzaDiagram) - .then(function (result) { - const { warnings } = result; - - console.log("success !", warnings); - - viewer.get("canvas").zoom("fit-viewport"); - }) - .catch(function (err) { - const { warnings, message } = err; - - console.log("something went wrong:", warnings, message); - }); - -export function sayHello() { - console.log("hello"); -} - -window.foo = "bar"; diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/static/package-lock.json b/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/static/package-lock.json deleted file mode 100644 index b7367928..00000000 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/static/package-lock.json +++ /dev/null @@ -1,3172 +0,0 @@ -{ - "name": "spiffworkflow-backend", - "version": "0.0.0", - "lockfileVersion": 2, - "requires": true, - "packages": { - "": { - "name": "spiffworkflow-backend", - "version": "0.0.0", - "license": "ISC", - "dependencies": { - "bpmn-js": "^9.1.0", - "bpmn-js-properties-panel": "^1.1.1" - }, - "devDependencies": { - "webpack-cli": "^4.9.2" - } - }, - "node_modules/@bpmn-io/element-templates-validator": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@bpmn-io/element-templates-validator/-/element-templates-validator-0.8.1.tgz", - "integrity": "sha512-cJMVYXxQAkntBZ2Brr76AI8D8xXWNS9GI8YM0h5kjkTihfYC+7FfN744RM1RVx8zJqTzOMf8nkS37t95Re4wvA==", - "dependencies": { - "@camunda/element-templates-json-schema": "^0.9.1", - "@camunda/zeebe-element-templates-json-schema": "^0.4.1", - "json-source-map": "^0.6.1", - "min-dash": "^3.8.1" - } - }, - "node_modules/@bpmn-io/extract-process-variables": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@bpmn-io/extract-process-variables/-/extract-process-variables-0.4.5.tgz", - "integrity": "sha512-LtHx5b9xqS8avRLrq/uTlKhWzMeV3bWQKIdDic2bdo5n9roitX13GRb01u2S0hSsKDWEhXQtydFYN2b6G7bqfw==", - "dependencies": { - "min-dash": "^3.8.1" - } - }, - "node_modules/@bpmn-io/properties-panel": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/@bpmn-io/properties-panel/-/properties-panel-0.13.2.tgz", - "integrity": "sha512-S0FUjXApQ8V1tW3TkrmuxXkfiMv6WPdeKkc7DD9tzKTHHnT634GY4pafKPPknxYsLGthUiJghqWbuQahqQjz+g==", - "peer": true, - "dependencies": { - "classnames": "^2.3.1", - "diagram-js": "^8.1.2", - "min-dash": "^3.7.0", - "min-dom": "^3.1.3" - } - }, - "node_modules/@camunda/element-templates-json-schema": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@camunda/element-templates-json-schema/-/element-templates-json-schema-0.9.1.tgz", - "integrity": "sha512-hqAOdwf0EdEDughDAfsOWtQQaKx/7m3srVbrUfVZy2Nh2mUc3hyBbkODO4tkMjTKv6I4bw36cyMchzjIEaz4CA==" - }, - "node_modules/@camunda/zeebe-element-templates-json-schema": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@camunda/zeebe-element-templates-json-schema/-/zeebe-element-templates-json-schema-0.4.1.tgz", - "integrity": "sha512-FAe7auxm+IJiRB0W68VOjBxih6aOJB/0K3nvjO0TtRdyS+a2X1DIDBDtsQO6g+pJDtW6oij0kC1LiBUvm6FmLw==" - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", - "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", - "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", - "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", - "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", - "dev": true, - "peer": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", - "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@philippfromme/moddle-helpers": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@philippfromme/moddle-helpers/-/moddle-helpers-0.4.1.tgz", - "integrity": "sha512-6ST9WdafFGh/vxeQP4pwFkcGcqIQJ0mtQSrXwoetTLigCXCcP4UXdXxjcIEwWKoXuexXV/2CgFS0CPENSVcwdg==", - "dependencies": { - "min-dash": "^3.8.1" - } - }, - "node_modules/@types/eslint": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.2.tgz", - "integrity": "sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA==", - "dev": true, - "peer": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", - "dev": true, - "peer": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true, - "peer": true - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true, - "peer": true - }, - "node_modules/@types/node": { - "version": "17.0.38", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.38.tgz", - "integrity": "sha512-5jY9RhV7c0Z4Jy09G+NIDTsCZ5G0L5n+Z+p+Y7t5VJHM30bgwzSjVtlcBxqAj+6L/swIlvtOSzr8rBk/aNyV2g==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "peer": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "peer": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true, - "peer": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "peer": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", - "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", - "dev": true, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", - "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", - "dev": true, - "dependencies": { - "envinfo": "^7.7.3" - }, - "peerDependencies": { - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", - "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", - "dev": true, - "peerDependencies": { - "webpack-cli": "4.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "peer": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "peer": true - }, - "node_modules/acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true, - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "peer": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "peer": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peer": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/array-move": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/array-move/-/array-move-3.0.1.tgz", - "integrity": "sha512-H3Of6NIn2nNU1gsVDqDnYKY/LCdWvCMMOWifNGhKcVQgiZ6nOek39aESOvro6zmueP07exSl93YLvkN4fZOkSg==", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/bpmn-js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bpmn-js/-/bpmn-js-9.1.0.tgz", - "integrity": "sha512-LFrNVt15hCvTJ7RrdshJeNYyLPAJQKC8sBCXvnFoLuwfuBwNbxkDtaripzrkgCj7X5wyduh+ogZ4KaE5xwsTbA==", - "dependencies": { - "bpmn-moddle": "^7.1.2", - "css.escape": "^1.5.1", - "diagram-js": "^8.3.0", - "diagram-js-direct-editing": "^1.6.3", - "ids": "^1.0.0", - "inherits": "^2.0.4", - "min-dash": "^3.5.2", - "min-dom": "^3.2.0", - "object-refs": "^0.3.0", - "tiny-svg": "^2.2.2" - } - }, - "node_modules/bpmn-js-properties-panel": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bpmn-js-properties-panel/-/bpmn-js-properties-panel-1.1.1.tgz", - "integrity": "sha512-FIxg3yIeKtYzDFLqI9GzhYBYDh12WtyvHFOSl4bSlDUQJIs31Xe7yobECEZNQ+00XtmtKUK96ikHUti5YydgDQ==", - "dependencies": { - "@bpmn-io/element-templates-validator": "^0.8.1", - "@bpmn-io/extract-process-variables": "^0.4.5", - "@philippfromme/moddle-helpers": "^0.4.1", - "array-move": "^3.0.1", - "classnames": "^2.3.1", - "ids": "^1.0.0", - "min-dash": "^3.8.1", - "min-dom": "^3.1.3", - "preact-markup": "^2.1.1", - "semver-compare": "^1.0.0" - }, - "peerDependencies": { - "@bpmn-io/properties-panel": "0.13.x", - "bpmn-js": "8.x || 9.x", - "camunda-bpmn-js-behaviors": "0.1.x", - "diagram-js": "7.x || 8.x" - } - }, - "node_modules/bpmn-moddle": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/bpmn-moddle/-/bpmn-moddle-7.1.2.tgz", - "integrity": "sha512-Sax4LokRCTqlg26njjULN3ZGtCmwH5gZVUZTRF0jwJk+YpMQhSfSoUECxjNv8OROoLxu8Z+MjdOHIxgvJf7KwA==", - "dependencies": { - "min-dash": "^3.5.2", - "moddle": "^5.0.2", - "moddle-xml": "^9.0.5" - } - }, - "node_modules/browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "peer": true, - "dependencies": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "peer": true - }, - "node_modules/camunda-bpmn-js-behaviors": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/camunda-bpmn-js-behaviors/-/camunda-bpmn-js-behaviors-0.1.0.tgz", - "integrity": "sha512-YJs4kAkRhZ1GyE4VVPTJlZ/GjuDHnSGvzuLTa87HIfpEonVMHsmRrQL0Gr/bkSVcQaA4s6XB0XKV6rz32LHNUA==", - "peer": true, - "dependencies": { - "ids": "^1.0.0", - "min-dash": "^3.7.0" - }, - "peerDependencies": { - "bpmn-js": "9.x", - "camunda-bpmn-moddle": "6.x", - "zeebe-bpmn-moddle": "0.12.x" - } - }, - "node_modules/camunda-bpmn-moddle": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/camunda-bpmn-moddle/-/camunda-bpmn-moddle-6.1.2.tgz", - "integrity": "sha512-DfhOTeq8oN01cB5sLE6Rq34/9xGD15/Y14pEM+YBIjgvV6Rclh+BgIa/2aRMm8An4Kc/itm2tECYiDr8p/FyTQ==", - "peer": true, - "dependencies": { - "min-dash": "^3.8.1" - }, - "peerDependencies": { - "bpmn-js": "^6.x || ^7.x || ^8.x || ^9.x", - "diagram-js": "^5.x || ^6.x || ^7.x || ^8.x" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001344", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001344.tgz", - "integrity": "sha512-0ZFjnlCaXNOAYcV7i+TtdKBp0L/3XEU2MF/x6Du1lrh+SRX4IfzIVL4HNJg5pB2PmFb8rszIGyOvsZnqqRoc2g==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ], - "peer": true - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", - "dev": true - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "peer": true - }, - "node_modules/component-event": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/component-event/-/component-event-0.1.4.tgz", - "integrity": "sha512-GMwOG8MnUHP1l8DZx1ztFO0SJTFnIzZnBDkXAj8RM2ntV2A6ALlDxgbMY1Fvxlg6WPQ+5IM/a6vg4PEYbjg/Rw==" - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" - }, - "node_modules/diagram-js": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/diagram-js/-/diagram-js-8.5.0.tgz", - "integrity": "sha512-UHA/Zfs7kG22M9wXAifAyPb2OZ4lG4lFi0CZ0GC6/lXmOsSHwHVZ1s/h9UqaIXnzIKW8SnZoP3Rwqel1ZhZLzg==", - "dependencies": { - "css.escape": "^1.5.1", - "didi": "^8.0.0", - "hammerjs": "^2.0.1", - "inherits-browser": "0.0.1", - "min-dash": "^3.5.2", - "min-dom": "^3.2.0", - "object-refs": "^0.3.0", - "path-intersection": "^2.2.1", - "tiny-svg": "^2.2.2" - } - }, - "node_modules/diagram-js-direct-editing": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/diagram-js-direct-editing/-/diagram-js-direct-editing-1.7.0.tgz", - "integrity": "sha512-ZfTLF4hdWr7NSoruwxGvVmu7aVaUjWRXjwgK5dx58LbXAsNjBS3Ap7zjVuGxjWUpCZ/MMwyZ00lpTHPH2P7BFQ==", - "dependencies": { - "min-dash": "^3.5.2", - "min-dom": "^3.1.3" - }, - "peerDependencies": { - "diagram-js": "^0.x || ^1.x || ^2.x || ^3.x || ^4.x || ^5.x || ^6.x || ^7.x || ^8.x" - } - }, - "node_modules/didi": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/didi/-/didi-8.0.0.tgz", - "integrity": "sha512-PwqTBaYzzfJSyxvpXPcTWF6nDdCKx2mFAU5eup1ZSb5wbaAS9a/HiKdtcAUdie/VMLHoFI50jkYZcA+bhUOugw==" - }, - "node_modules/domify": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/domify/-/domify-1.4.1.tgz", - "integrity": "sha512-x18nuiDHMCZGXr4KJSRMf/TWYtiaRo6RX8KN9fEbW54mvbQ6pieUuerC2ahBg+kEp1wycFj8MPUI0WkIOw5E9w==" - }, - "node_modules/electron-to-chromium": { - "version": "1.4.143", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.143.tgz", - "integrity": "sha512-2hIgvu0+pDfXIqmVmV5X6iwMjQ2KxDsWKwM+oI1fABEOy/Dqmll0QJRmIQ3rm+XaoUa/qKrmy5h7LSTFQ6Ldzg==", - "dev": true, - "peer": true - }, - "node_modules/enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", - "dev": true, - "peer": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true, - "peer": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "peer": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "peer": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "peer": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "peer": true - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "peer": true - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", - "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", - "dev": true - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "peer": true - }, - "node_modules/graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true, - "peer": true - }, - "node_modules/hammerjs": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", - "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/ids": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ids/-/ids-1.0.0.tgz", - "integrity": "sha512-Zvtq1xUto4LttpstyOlFum8lKx+i1OmRfg+6A9drFS9iSZsDPMHG4Sof/qwNR4kCU7jBeWFPrY2ocHxiz7cCRw==" - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "node_modules/inherits-browser": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/inherits-browser/-/inherits-browser-0.0.1.tgz", - "integrity": "sha512-kaDA3DkCdCpvrKIo/1T/3yVn+qpFUHLjYtSHmTYewb+QfjfaQy6FGQ7LwBu7st0tG9UvYad/XAlqQmdIh6CICw==" - }, - "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "peer": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "peer": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "peer": true - }, - "node_modules/json-source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/json-source-map/-/json-source-map-0.6.1.tgz", - "integrity": "sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg==" - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/matches-selector": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/matches-selector/-/matches-selector-1.2.0.tgz", - "integrity": "sha512-c4vLwYWyl+Ji+U43eU/G5FwxWd4ZH0ePUsFs5y0uwD9HUEFBXUQ1zUUan+78IpRD+y4pUfG0nAzNM292K7ItvA==" - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "peer": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "peer": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/min-dash": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/min-dash/-/min-dash-3.8.1.tgz", - "integrity": "sha512-evumdlmIlg9mbRVPbC4F5FuRhNmcMS5pvuBUbqb1G9v09Ro0ImPEgz5n3khir83lFok1inKqVDjnKEg3GpDxQg==" - }, - "node_modules/min-dom": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/min-dom/-/min-dom-3.2.1.tgz", - "integrity": "sha512-v6YCmnDzxk4rRJntWTUiwggLupPw/8ZSRqUq0PDaBwVZEO/wYzCH4SKVBV+KkEvf3u0XaWHly5JEosPtqRATZA==", - "dependencies": { - "component-event": "^0.1.4", - "domify": "^1.3.1", - "indexof": "0.0.1", - "matches-selector": "^1.2.0", - "min-dash": "^3.8.1" - } - }, - "node_modules/moddle": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/moddle/-/moddle-5.0.3.tgz", - "integrity": "sha512-EjnQkSaZClHMsM3H/guBy9h7AmHUICH0Pf8H1VnnYGUXy2hkZQU4gqEAyHywJzMRAhYX87pXjH2NtyigF7evkA==", - "dependencies": { - "min-dash": "^3.0.0" - } - }, - "node_modules/moddle-xml": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/moddle-xml/-/moddle-xml-9.0.5.tgz", - "integrity": "sha512-1t9N35ZMQZTYZmRDoh1mBVd0XwLB34BkBywNJ0+YlLLYxaDBjFR/I+fqwsY746ayYPBz6yNRg8JpLyFgNF+eHg==", - "dependencies": { - "min-dash": "^3.5.2", - "moddle": "^5.0.2", - "saxen": "^8.1.2" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "peer": true - }, - "node_modules/node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", - "dev": true, - "peer": true - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-refs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/object-refs/-/object-refs-0.3.0.tgz", - "integrity": "sha512-eP0ywuoWOaDoiake/6kTJlPJhs+k0qNm4nYRzXLNHj6vh+5M3i9R1epJTdxIPGlhWc4fNRQ7a6XJNCX+/L4FOQ==" - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-intersection": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-intersection/-/path-intersection-2.2.1.tgz", - "integrity": "sha512-9u8xvMcSfuOiStv9bPdnRJQhGQXLKurew94n4GPQCdH1nj9QKC9ObbNoIpiRq8skiOBxKkt277PgOoFgAt3/rA==" - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true, - "peer": true - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/preact": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.7.3.tgz", - "integrity": "sha512-giqJXP8VbtA1tyGa3f1n9wiN7PrHtONrDyE3T+ifjr/tTkg+2N4d/6sjC9WyJKv8wM7rOYDveqy5ZoFmYlwo4w==", - "peer": true, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/preact" - } - }, - "node_modules/preact-markup": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/preact-markup/-/preact-markup-2.1.1.tgz", - "integrity": "sha512-8JL2p36mzK8XkspOyhBxUSPjYwMxDM0L5BWBZWxsZMVW8WsGQrYQDgVuDKkRspt2hwrle+Cxr/053hpc9BJwfw==", - "peerDependencies": { - "preact": ">=10" - } - }, - "node_modules/punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "peer": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "dependencies": { - "resolve": "^1.9.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "peer": true - }, - "node_modules/saxen": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/saxen/-/saxen-8.1.2.tgz", - "integrity": "sha512-xUOiiFbc3Ow7p8KMxwsGICPx46ZQvy3+qfNVhrkwfz3Vvq45eGt98Ft5IQaA1R/7Tb5B5MKh9fUR9x3c3nDTxw==" - }, - "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "peer": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" - }, - "node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "peer": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "peer": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "peer": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.0.tgz", - "integrity": "sha512-JC6qfIEkPBd9j1SMO3Pfn+A6w2kQV54tv+ABQLgZr7dA3k/DL/OBoYSWxzVpZev3J+bUHXfr55L8Mox7AaNo6g==", - "dev": true, - "peer": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", - "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", - "dev": true, - "peer": true, - "dependencies": { - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/tiny-svg": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/tiny-svg/-/tiny-svg-2.2.3.tgz", - "integrity": "sha512-u5KGg889pD1W2c9GlLrTnAGzIkAO00/VXZGyzeiGHw+b9er8McLO0SnhxPQQDwDqFO0MrJ825AEsRUoTiDZFuQ==" - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "peer": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", - "dev": true, - "peer": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack": { - "version": "5.72.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", - "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", - "dev": true, - "peer": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.3", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", - "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.1.1", - "@webpack-cli/info": "^1.4.1", - "@webpack-cli/serve": "^1.6.1", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "execa": "^5.0.0", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "@webpack-cli/migrate": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "peer": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "node_modules/zeebe-bpmn-moddle": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/zeebe-bpmn-moddle/-/zeebe-bpmn-moddle-0.12.1.tgz", - "integrity": "sha512-rnUoK+A/gzinOGUlmJKeXmnjorgEm4yf7qgeaowXGZOFtFqtM2lvJ7XYTJNsKClaNfFG245JtKHH3G/caJxE6g==", - "peer": true - } - }, - "dependencies": { - "@bpmn-io/element-templates-validator": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@bpmn-io/element-templates-validator/-/element-templates-validator-0.8.1.tgz", - "integrity": "sha512-cJMVYXxQAkntBZ2Brr76AI8D8xXWNS9GI8YM0h5kjkTihfYC+7FfN744RM1RVx8zJqTzOMf8nkS37t95Re4wvA==", - "requires": { - "@camunda/element-templates-json-schema": "^0.9.1", - "@camunda/zeebe-element-templates-json-schema": "^0.4.1", - "json-source-map": "^0.6.1", - "min-dash": "^3.8.1" - } - }, - "@bpmn-io/extract-process-variables": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/@bpmn-io/extract-process-variables/-/extract-process-variables-0.4.5.tgz", - "integrity": "sha512-LtHx5b9xqS8avRLrq/uTlKhWzMeV3bWQKIdDic2bdo5n9roitX13GRb01u2S0hSsKDWEhXQtydFYN2b6G7bqfw==", - "requires": { - "min-dash": "^3.8.1" - } - }, - "@bpmn-io/properties-panel": { - "version": "0.13.2", - "resolved": "https://registry.npmjs.org/@bpmn-io/properties-panel/-/properties-panel-0.13.2.tgz", - "integrity": "sha512-S0FUjXApQ8V1tW3TkrmuxXkfiMv6WPdeKkc7DD9tzKTHHnT634GY4pafKPPknxYsLGthUiJghqWbuQahqQjz+g==", - "peer": true, - "requires": { - "classnames": "^2.3.1", - "diagram-js": "^8.1.2", - "min-dash": "^3.7.0", - "min-dom": "^3.1.3" - } - }, - "@camunda/element-templates-json-schema": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/@camunda/element-templates-json-schema/-/element-templates-json-schema-0.9.1.tgz", - "integrity": "sha512-hqAOdwf0EdEDughDAfsOWtQQaKx/7m3srVbrUfVZy2Nh2mUc3hyBbkODO4tkMjTKv6I4bw36cyMchzjIEaz4CA==" - }, - "@camunda/zeebe-element-templates-json-schema": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@camunda/zeebe-element-templates-json-schema/-/zeebe-element-templates-json-schema-0.4.1.tgz", - "integrity": "sha512-FAe7auxm+IJiRB0W68VOjBxih6aOJB/0K3nvjO0TtRdyS+a2X1DIDBDtsQO6g+pJDtW6oij0kC1LiBUvm6FmLw==" - }, - "@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true - }, - "@jridgewell/gen-mapping": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.1.tgz", - "integrity": "sha512-GcHwniMlA2z+WFPWuY8lp3fsza0I8xPFMWL5+n8LYyP6PSvPrXf4+n8stDHZY2DM0zy9sVkRDy1jDI4XGzYVqg==", - "dev": true, - "peer": true, - "requires": { - "@jridgewell/set-array": "^1.0.0", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/resolve-uri": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.0.7.tgz", - "integrity": "sha512-8cXDaBBHOr2pQ7j77Y6Vp5VDT2sIqWyWQ56TjEq4ih/a4iST3dItRe8Q9fp0rrIl9DoKhWQtUQz/YpOxLkXbNA==", - "dev": true, - "peer": true - }, - "@jridgewell/set-array": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.1.tgz", - "integrity": "sha512-Ct5MqZkLGEXTVmQYbGtx9SVqD2fqwvdubdps5D3djjAkgkKwT918VNOz65pEHFaYTeWcukmJmH5SwsA9Tn2ObQ==", - "dev": true, - "peer": true - }, - "@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "peer": true, - "requires": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.13", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.13.tgz", - "integrity": "sha512-GryiOJmNcWbovBxTfZSF71V/mXbgcV3MewDe3kIMCLyIh5e7SKAeUZs+rMnJ8jkMolZ/4/VsdBmMrw3l+VdZ3w==", - "dev": true, - "peer": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.13.tgz", - "integrity": "sha512-o1xbKhp9qnIAoHJSWd6KlCZfqslL4valSF81H8ImioOAxluWYWOpWkpyktY2vnt4tbrX9XYaxovq6cgowaJp2w==", - "dev": true, - "peer": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@philippfromme/moddle-helpers": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/@philippfromme/moddle-helpers/-/moddle-helpers-0.4.1.tgz", - "integrity": "sha512-6ST9WdafFGh/vxeQP4pwFkcGcqIQJ0mtQSrXwoetTLigCXCcP4UXdXxjcIEwWKoXuexXV/2CgFS0CPENSVcwdg==", - "requires": { - "min-dash": "^3.8.1" - } - }, - "@types/eslint": { - "version": "8.4.2", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.4.2.tgz", - "integrity": "sha512-Z1nseZON+GEnFjJc04sv4NSALGjhFwy6K0HXt7qsn5ArfAKtb63dXNJHf+1YW6IpOIYRBGUbu3GwJdj8DGnCjA==", - "dev": true, - "peer": true, - "requires": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "@types/eslint-scope": { - "version": "3.7.3", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.3.tgz", - "integrity": "sha512-PB3ldyrcnAicT35TWPs5IcwKD8S333HMaa2VVv4+wdvebJkjWuW/xESoB8IwRcog8HYVYamb1g/R31Qv5Bx03g==", - "dev": true, - "peer": true, - "requires": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true, - "peer": true - }, - "@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true, - "peer": true - }, - "@types/node": { - "version": "17.0.38", - "resolved": "https://registry.npmjs.org/@types/node/-/node-17.0.38.tgz", - "integrity": "sha512-5jY9RhV7c0Z4Jy09G+NIDTsCZ5G0L5n+Z+p+Y7t5VJHM30bgwzSjVtlcBxqAj+6L/swIlvtOSzr8rBk/aNyV2g==", - "dev": true, - "peer": true - }, - "@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "peer": true, - "requires": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true, - "peer": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true, - "peer": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true, - "peer": true - }, - "@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "peer": true, - "requires": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true, - "peer": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "peer": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "peer": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true, - "peer": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "peer": true, - "requires": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "@webpack-cli/configtest": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.1.1.tgz", - "integrity": "sha512-1FBc1f9G4P/AxMqIgfZgeOTuRnwZMten8E7zap5zgpPInnCrP8D4Q81+4CWIch8i/Nf7nXjP0v6CjjbHOrXhKg==", - "dev": true, - "requires": {} - }, - "@webpack-cli/info": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.4.1.tgz", - "integrity": "sha512-PKVGmazEq3oAo46Q63tpMr4HipI3OPfP7LiNOEJg963RMgT0rqheag28NCML0o3GIzA3DmxP1ZIAv9oTX1CUIA==", - "dev": true, - "requires": { - "envinfo": "^7.7.3" - } - }, - "@webpack-cli/serve": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.6.1.tgz", - "integrity": "sha512-gNGTiTrjEVQ0OcVnzsRSqTxaBSr+dmTfm+qJsCDluky8uhdLWep7Gcr62QsAKHTMxjCS/8nEITsmFAhfIx+QSw==", - "dev": true, - "requires": {} - }, - "@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true, - "peer": true - }, - "@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true, - "peer": true - }, - "acorn": { - "version": "8.7.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.7.1.tgz", - "integrity": "sha512-Xx54uLJQZ19lKygFXOWsscKUbsBZW0CPykPhVQdhIeIwrbPmJzqeASDInc8nKBnp/JT6igTs82qPXz069H8I/A==", - "dev": true, - "peer": true - }, - "acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "peer": true, - "requires": {} - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "peer": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peer": true, - "requires": {} - }, - "array-move": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/array-move/-/array-move-3.0.1.tgz", - "integrity": "sha512-H3Of6NIn2nNU1gsVDqDnYKY/LCdWvCMMOWifNGhKcVQgiZ6nOek39aESOvro6zmueP07exSl93YLvkN4fZOkSg==" - }, - "bpmn-js": { - "version": "9.1.0", - "resolved": "https://registry.npmjs.org/bpmn-js/-/bpmn-js-9.1.0.tgz", - "integrity": "sha512-LFrNVt15hCvTJ7RrdshJeNYyLPAJQKC8sBCXvnFoLuwfuBwNbxkDtaripzrkgCj7X5wyduh+ogZ4KaE5xwsTbA==", - "requires": { - "bpmn-moddle": "^7.1.2", - "css.escape": "^1.5.1", - "diagram-js": "^8.3.0", - "diagram-js-direct-editing": "^1.6.3", - "ids": "^1.0.0", - "inherits": "^2.0.4", - "min-dash": "^3.5.2", - "min-dom": "^3.2.0", - "object-refs": "^0.3.0", - "tiny-svg": "^2.2.2" - } - }, - "bpmn-js-properties-panel": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/bpmn-js-properties-panel/-/bpmn-js-properties-panel-1.1.1.tgz", - "integrity": "sha512-FIxg3yIeKtYzDFLqI9GzhYBYDh12WtyvHFOSl4bSlDUQJIs31Xe7yobECEZNQ+00XtmtKUK96ikHUti5YydgDQ==", - "requires": { - "@bpmn-io/element-templates-validator": "^0.8.1", - "@bpmn-io/extract-process-variables": "^0.4.5", - "@philippfromme/moddle-helpers": "^0.4.1", - "array-move": "^3.0.1", - "classnames": "^2.3.1", - "ids": "^1.0.0", - "min-dash": "^3.8.1", - "min-dom": "^3.1.3", - "preact-markup": "^2.1.1", - "semver-compare": "^1.0.0" - } - }, - "bpmn-moddle": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/bpmn-moddle/-/bpmn-moddle-7.1.2.tgz", - "integrity": "sha512-Sax4LokRCTqlg26njjULN3ZGtCmwH5gZVUZTRF0jwJk+YpMQhSfSoUECxjNv8OROoLxu8Z+MjdOHIxgvJf7KwA==", - "requires": { - "min-dash": "^3.5.2", - "moddle": "^5.0.2", - "moddle-xml": "^9.0.5" - } - }, - "browserslist": { - "version": "4.20.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz", - "integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==", - "dev": true, - "peer": true, - "requires": { - "caniuse-lite": "^1.0.30001332", - "electron-to-chromium": "^1.4.118", - "escalade": "^3.1.1", - "node-releases": "^2.0.3", - "picocolors": "^1.0.0" - } - }, - "buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true, - "peer": true - }, - "camunda-bpmn-js-behaviors": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/camunda-bpmn-js-behaviors/-/camunda-bpmn-js-behaviors-0.1.0.tgz", - "integrity": "sha512-YJs4kAkRhZ1GyE4VVPTJlZ/GjuDHnSGvzuLTa87HIfpEonVMHsmRrQL0Gr/bkSVcQaA4s6XB0XKV6rz32LHNUA==", - "peer": true, - "requires": { - "ids": "^1.0.0", - "min-dash": "^3.7.0" - } - }, - "camunda-bpmn-moddle": { - "version": "6.1.2", - "resolved": "https://registry.npmjs.org/camunda-bpmn-moddle/-/camunda-bpmn-moddle-6.1.2.tgz", - "integrity": "sha512-DfhOTeq8oN01cB5sLE6Rq34/9xGD15/Y14pEM+YBIjgvV6Rclh+BgIa/2aRMm8An4Kc/itm2tECYiDr8p/FyTQ==", - "peer": true, - "requires": { - "min-dash": "^3.8.1" - } - }, - "caniuse-lite": { - "version": "1.0.30001344", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001344.tgz", - "integrity": "sha512-0ZFjnlCaXNOAYcV7i+TtdKBp0L/3XEU2MF/x6Du1lrh+SRX4IfzIVL4HNJg5pB2PmFb8rszIGyOvsZnqqRoc2g==", - "dev": true, - "peer": true - }, - "chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "peer": true - }, - "classnames": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.1.tgz", - "integrity": "sha512-OlQdbZ7gLfGarSqxesMesDa5uz7KFbID8Kpq/SxIoNGDqY8lSYs0D+hhtBXhcdB3rcbXArFr7vlHheLk1voeNA==" - }, - "clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "requires": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - } - }, - "colorette": { - "version": "2.0.16", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.16.tgz", - "integrity": "sha512-hUewv7oMjCp+wkBv5Rm0v87eJhq4woh5rSR+42YSQJKecCqgIqNkZ6lAlQms/BwHPJA5NKMRlpxPRv0n8HQW6g==", - "dev": true - }, - "commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true, - "peer": true - }, - "component-event": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/component-event/-/component-event-0.1.4.tgz", - "integrity": "sha512-GMwOG8MnUHP1l8DZx1ztFO0SJTFnIzZnBDkXAj8RM2ntV2A6ALlDxgbMY1Fvxlg6WPQ+5IM/a6vg4PEYbjg/Rw==" - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, - "css.escape": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/css.escape/-/css.escape-1.5.1.tgz", - "integrity": "sha1-QuJ9T6BK4y+TGktNQZH6nN3ul8s=" - }, - "diagram-js": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/diagram-js/-/diagram-js-8.5.0.tgz", - "integrity": "sha512-UHA/Zfs7kG22M9wXAifAyPb2OZ4lG4lFi0CZ0GC6/lXmOsSHwHVZ1s/h9UqaIXnzIKW8SnZoP3Rwqel1ZhZLzg==", - "requires": { - "css.escape": "^1.5.1", - "didi": "^8.0.0", - "hammerjs": "^2.0.1", - "inherits-browser": "0.0.1", - "min-dash": "^3.5.2", - "min-dom": "^3.2.0", - "object-refs": "^0.3.0", - "path-intersection": "^2.2.1", - "tiny-svg": "^2.2.2" - } - }, - "diagram-js-direct-editing": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/diagram-js-direct-editing/-/diagram-js-direct-editing-1.7.0.tgz", - "integrity": "sha512-ZfTLF4hdWr7NSoruwxGvVmu7aVaUjWRXjwgK5dx58LbXAsNjBS3Ap7zjVuGxjWUpCZ/MMwyZ00lpTHPH2P7BFQ==", - "requires": { - "min-dash": "^3.5.2", - "min-dom": "^3.1.3" - } - }, - "didi": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/didi/-/didi-8.0.0.tgz", - "integrity": "sha512-PwqTBaYzzfJSyxvpXPcTWF6nDdCKx2mFAU5eup1ZSb5wbaAS9a/HiKdtcAUdie/VMLHoFI50jkYZcA+bhUOugw==" - }, - "domify": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/domify/-/domify-1.4.1.tgz", - "integrity": "sha512-x18nuiDHMCZGXr4KJSRMf/TWYtiaRo6RX8KN9fEbW54mvbQ6pieUuerC2ahBg+kEp1wycFj8MPUI0WkIOw5E9w==" - }, - "electron-to-chromium": { - "version": "1.4.143", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.143.tgz", - "integrity": "sha512-2hIgvu0+pDfXIqmVmV5X6iwMjQ2KxDsWKwM+oI1fABEOy/Dqmll0QJRmIQ3rm+XaoUa/qKrmy5h7LSTFQ6Ldzg==", - "dev": true, - "peer": true - }, - "enhanced-resolve": { - "version": "5.9.3", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.9.3.tgz", - "integrity": "sha512-Bq9VSor+kjvW3f9/MiiR4eE3XYgOl7/rS8lnSxbRbF3kS0B2r+Y9w5krBWxZgDxASVZbdYrn5wT4j/Wb0J9qow==", - "dev": true, - "peer": true, - "requires": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - } - }, - "envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true - }, - "es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true, - "peer": true - }, - "escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "peer": true - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "peer": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "peer": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "peer": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "peer": true - }, - "events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "peer": true - }, - "execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "requires": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "peer": true - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "peer": true - }, - "fastest-levenshtein": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz", - "integrity": "sha512-On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==", - "dev": true - }, - "find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "requires": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - } - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true - }, - "glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true, - "peer": true - }, - "graceful-fs": { - "version": "4.2.10", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.10.tgz", - "integrity": "sha512-9ByhssR2fPVsNZj478qUUbKfmL0+t5BDVyjShtyZZLiK7ZDAArFFfopyOTj0M05wE2tJPisA4iTnnXl2YoPvOA==", - "dev": true, - "peer": true - }, - "hammerjs": { - "version": "2.0.8", - "resolved": "https://registry.npmjs.org/hammerjs/-/hammerjs-2.0.8.tgz", - "integrity": "sha1-BO93hiz/K7edMPdpIJWTAiK/YPE=" - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "peer": true - }, - "human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true - }, - "ids": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/ids/-/ids-1.0.0.tgz", - "integrity": "sha512-Zvtq1xUto4LttpstyOlFum8lKx+i1OmRfg+6A9drFS9iSZsDPMHG4Sof/qwNR4kCU7jBeWFPrY2ocHxiz7cCRw==" - }, - "import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "requires": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - } - }, - "indexof": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", - "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "inherits-browser": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/inherits-browser/-/inherits-browser-0.0.1.tgz", - "integrity": "sha512-kaDA3DkCdCpvrKIo/1T/3yVn+qpFUHLjYtSHmTYewb+QfjfaQy6FGQ7LwBu7st0tG9UvYad/XAlqQmdIh6CICw==" - }, - "interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true - }, - "is-core-module": { - "version": "2.9.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz", - "integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, - "is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "requires": { - "isobject": "^3.0.1" - } - }, - "is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true - }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true - }, - "jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "peer": true, - "requires": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - } - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "peer": true - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "peer": true - }, - "json-source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/json-source-map/-/json-source-map-0.6.1.tgz", - "integrity": "sha512-1QoztHPsMQqhDq0hlXY5ZqcEdUzxQEIxgFkKl4WUp2pgShObl+9ovi4kRh2TfvAfxAoHOJ9vIMEqk3k4iex7tg==" - }, - "kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true - }, - "loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "peer": true - }, - "locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "requires": { - "p-locate": "^4.1.0" - } - }, - "matches-selector": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/matches-selector/-/matches-selector-1.2.0.tgz", - "integrity": "sha512-c4vLwYWyl+Ji+U43eU/G5FwxWd4ZH0ePUsFs5y0uwD9HUEFBXUQ1zUUan+78IpRD+y4pUfG0nAzNM292K7ItvA==" - }, - "merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "peer": true - }, - "mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "peer": true, - "requires": { - "mime-db": "1.52.0" - } - }, - "mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true - }, - "min-dash": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/min-dash/-/min-dash-3.8.1.tgz", - "integrity": "sha512-evumdlmIlg9mbRVPbC4F5FuRhNmcMS5pvuBUbqb1G9v09Ro0ImPEgz5n3khir83lFok1inKqVDjnKEg3GpDxQg==" - }, - "min-dom": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/min-dom/-/min-dom-3.2.1.tgz", - "integrity": "sha512-v6YCmnDzxk4rRJntWTUiwggLupPw/8ZSRqUq0PDaBwVZEO/wYzCH4SKVBV+KkEvf3u0XaWHly5JEosPtqRATZA==", - "requires": { - "component-event": "^0.1.4", - "domify": "^1.3.1", - "indexof": "0.0.1", - "matches-selector": "^1.2.0", - "min-dash": "^3.8.1" - } - }, - "moddle": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/moddle/-/moddle-5.0.3.tgz", - "integrity": "sha512-EjnQkSaZClHMsM3H/guBy9h7AmHUICH0Pf8H1VnnYGUXy2hkZQU4gqEAyHywJzMRAhYX87pXjH2NtyigF7evkA==", - "requires": { - "min-dash": "^3.0.0" - } - }, - "moddle-xml": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/moddle-xml/-/moddle-xml-9.0.5.tgz", - "integrity": "sha512-1t9N35ZMQZTYZmRDoh1mBVd0XwLB34BkBywNJ0+YlLLYxaDBjFR/I+fqwsY746ayYPBz6yNRg8JpLyFgNF+eHg==", - "requires": { - "min-dash": "^3.5.2", - "moddle": "^5.0.2", - "saxen": "^8.1.2" - } - }, - "neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "peer": true - }, - "node-releases": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.5.tgz", - "integrity": "sha512-U9h1NLROZTq9uE1SNffn6WuPDg8icmi3ns4rEl/oTfIle4iLjTliCzgTsbaIFMq/Xn078/lfY/BL0GWZ+psK4Q==", - "dev": true, - "peer": true - }, - "npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "requires": { - "path-key": "^3.0.0" - } - }, - "object-refs": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/object-refs/-/object-refs-0.3.0.tgz", - "integrity": "sha512-eP0ywuoWOaDoiake/6kTJlPJhs+k0qNm4nYRzXLNHj6vh+5M3i9R1epJTdxIPGlhWc4fNRQ7a6XJNCX+/L4FOQ==" - }, - "onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "requires": { - "mimic-fn": "^2.1.0" - } - }, - "p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "requires": { - "p-try": "^2.0.0" - } - }, - "p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "requires": { - "p-limit": "^2.2.0" - } - }, - "p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true - }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-intersection": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/path-intersection/-/path-intersection-2.2.1.tgz", - "integrity": "sha512-9u8xvMcSfuOiStv9bPdnRJQhGQXLKurew94n4GPQCdH1nj9QKC9ObbNoIpiRq8skiOBxKkt277PgOoFgAt3/rA==" - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true, - "peer": true - }, - "pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "requires": { - "find-up": "^4.0.0" - } - }, - "preact": { - "version": "10.7.3", - "resolved": "https://registry.npmjs.org/preact/-/preact-10.7.3.tgz", - "integrity": "sha512-giqJXP8VbtA1tyGa3f1n9wiN7PrHtONrDyE3T+ifjr/tTkg+2N4d/6sjC9WyJKv8wM7rOYDveqy5ZoFmYlwo4w==", - "peer": true - }, - "preact-markup": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/preact-markup/-/preact-markup-2.1.1.tgz", - "integrity": "sha512-8JL2p36mzK8XkspOyhBxUSPjYwMxDM0L5BWBZWxsZMVW8WsGQrYQDgVuDKkRspt2hwrle+Cxr/053hpc9BJwfw==", - "requires": {} - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true, - "peer": true - }, - "randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "peer": true, - "requires": { - "safe-buffer": "^5.1.0" - } - }, - "rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "requires": { - "resolve": "^1.9.0" - } - }, - "resolve": { - "version": "1.22.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.0.tgz", - "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", - "dev": true, - "requires": { - "is-core-module": "^2.8.1", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - } - }, - "resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "requires": { - "resolve-from": "^5.0.0" - } - }, - "resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true - }, - "safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "peer": true - }, - "saxen": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/saxen/-/saxen-8.1.2.tgz", - "integrity": "sha512-xUOiiFbc3Ow7p8KMxwsGICPx46ZQvy3+qfNVhrkwfz3Vvq45eGt98Ft5IQaA1R/7Tb5B5MKh9fUR9x3c3nDTxw==" - }, - "schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "peer": true, - "requires": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - } - }, - "semver-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/semver-compare/-/semver-compare-1.0.0.tgz", - "integrity": "sha1-De4hahyUGrN+nvsXiPavxf9VN/w=" - }, - "serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "peer": true, - "requires": { - "randombytes": "^2.1.0" - } - }, - "shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "requires": { - "kind-of": "^6.0.2" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true - }, - "signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true - }, - "source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "peer": true - }, - "source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "peer": true, - "requires": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true - }, - "supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "peer": true, - "requires": { - "has-flag": "^4.0.0" - } - }, - "supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true - }, - "tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "peer": true - }, - "terser": { - "version": "5.14.0", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.14.0.tgz", - "integrity": "sha512-JC6qfIEkPBd9j1SMO3Pfn+A6w2kQV54tv+ABQLgZr7dA3k/DL/OBoYSWxzVpZev3J+bUHXfr55L8Mox7AaNo6g==", - "dev": true, - "peer": true, - "requires": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - } - }, - "terser-webpack-plugin": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.1.tgz", - "integrity": "sha512-GvlZdT6wPQKbDNW/GDQzZFg/j4vKU96yl2q6mcUkzKOgW4gwf1Z8cZToUCrz31XHlPWH8MVb1r2tFtdDtTGJ7g==", - "dev": true, - "peer": true, - "requires": { - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.0", - "source-map": "^0.6.1", - "terser": "^5.7.2" - } - }, - "tiny-svg": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/tiny-svg/-/tiny-svg-2.2.3.tgz", - "integrity": "sha512-u5KGg889pD1W2c9GlLrTnAGzIkAO00/VXZGyzeiGHw+b9er8McLO0SnhxPQQDwDqFO0MrJ825AEsRUoTiDZFuQ==" - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "peer": true, - "requires": { - "punycode": "^2.1.0" - } - }, - "watchpack": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.3.1.tgz", - "integrity": "sha512-x0t0JuydIo8qCNctdDrn1OzH/qDzk2+rdCOC3YzumZ42fiMqmQ7T3xQurykYMhYfHaPHTp4ZxAx2NfUo1K6QaA==", - "dev": true, - "peer": true, - "requires": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - } - }, - "webpack": { - "version": "5.72.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.72.1.tgz", - "integrity": "sha512-dXG5zXCLspQR4krZVR6QgajnZOjW2K/djHvdcRaDQvsjV9z9vaW6+ja5dZOYbqBBjF6kGXka/2ZyxNdc+8Jung==", - "dev": true, - "peer": true, - "requires": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.4.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.9.3", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.3.1", - "webpack-sources": "^3.2.3" - } - }, - "webpack-cli": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.9.2.tgz", - "integrity": "sha512-m3/AACnBBzK/kMTcxWHcZFPrw/eQuY4Df1TxvIWfWM2x7mRqBQCqKEd96oCUa9jkapLBaFfRce33eGDb4Pr7YQ==", - "dev": true, - "requires": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.1.1", - "@webpack-cli/info": "^1.4.1", - "@webpack-cli/serve": "^1.6.1", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "execa": "^5.0.0", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "dependencies": { - "commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true - } - } - }, - "webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "requires": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - } - }, - "webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "peer": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, - "wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "zeebe-bpmn-moddle": { - "version": "0.12.1", - "resolved": "https://registry.npmjs.org/zeebe-bpmn-moddle/-/zeebe-bpmn-moddle-0.12.1.tgz", - "integrity": "sha512-rnUoK+A/gzinOGUlmJKeXmnjorgEm4yf7qgeaowXGZOFtFqtM2lvJ7XYTJNsKClaNfFG245JtKHH3G/caJxE6g==", - "peer": true - } - } -} diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/static/package.json b/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/static/package.json deleted file mode 100644 index bee0dcf5..00000000 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/static/package.json +++ /dev/null @@ -1,18 +0,0 @@ -{ - "name": "spiffworkflow-backend", - "version": "0.0.0", - "description": "Serve up Spiff Workflows to the World!", - "main": "index.js", - "scripts": { - "test": "echo \"Error: no test specified\" && exit 1" - }, - "author": "", - "license": "ISC", - "dependencies": { - "bpmn-js": "^9.1.0", - "bpmn-js-properties-panel": "^1.1.1" - }, - "devDependencies": { - "webpack-cli": "^4.9.2" - } -} diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/static/style.css b/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/static/style.css deleted file mode 100644 index b534fcd5..00000000 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/static/style.css +++ /dev/null @@ -1,2 +0,0 @@ -.example { -} diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/templates/layout.html b/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/templates/layout.html deleted file mode 100644 index d1521fdd..00000000 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/templates/layout.html +++ /dev/null @@ -1,23 +0,0 @@ - - - - {% block head %} - - {% block title %}{% endblock %} - {% endblock %} - - -

{{ self.title() }}

- {% with messages = get_flashed_messages(with_categories=true) %} {% if - messages %} -
    - {% for category, message in messages %} -
  • {{ message }}
  • - {% endfor %} -
- {% endif %} {% endwith %} {% block content %}{% endblock %} - - diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/templates/process_group_list.html b/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/templates/process_group_list.html deleted file mode 100644 index f6eb8f58..00000000 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/templates/process_group_list.html +++ /dev/null @@ -1,18 +0,0 @@ -{% extends "layout.html" %} {% block title %}Process Groups{% endblock %} {% -block content %} - - - {# here we iterate over every item in our list#} {% for process_group in - process_groups %} - - - - {% endfor %} - -
- {{ process_group.display_name }} -
-{% endblock %} diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/templates/process_group_show.html b/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/templates/process_group_show.html deleted file mode 100644 index 2a41abe9..00000000 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/templates/process_group_show.html +++ /dev/null @@ -1,25 +0,0 @@ -{% extends "layout.html" %} -{% block title %}Process Group: {{ process_group.id }}{% endblock %} -{% block content %} - - - - {# here we iterate over every item in our list#} - {% for process_model in process_group.process_models %} - - - - {% endfor %} - -
- {{ process_model.display_name }} -
-{% endblock %} diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/templates/process_model_edit.html b/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/templates/process_model_edit.html deleted file mode 100644 index 8dca623a..00000000 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/templates/process_model_edit.html +++ /dev/null @@ -1,167 +0,0 @@ -{% extends "layout.html" %} {% block title %} - Process Model Edit: {{ process_model.id }} -{% endblock %} - -{% block head %} - - - - - - - - - - - - - - - - - - - -{% endblock %} - -{% block content %} -
{{ result }}
- - - -
-
- - - - -{% endblock %} diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/templates/process_model_show.html b/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/templates/process_model_show.html deleted file mode 100644 index 5eedf1de..00000000 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/admin_blueprint/templates/process_model_show.html +++ /dev/null @@ -1,159 +0,0 @@ -{% extends "layout.html" %} {% block title %}Process Model: {{ process_model.id -}}{% endblock %} {% block head %} {{ super() }} - - - - - - - - - - - - - - - - - - -{% endblock %} {% block content %} -
{{ result }}
- - - - -{% if files %} -

BPMN Files

-
    - {% for file in files %} -
  • - {{ file.name }} - {% if file.name == current_file_name %} (current) {% endif %} -
  • - {% endfor %} -
-{% endif %} - -
- - -
- -
- - - - -{% endblock %} From 7bf8618267a0ae4c79556dfceb789a0702e70a15 Mon Sep 17 00:00:00 2001 From: jasquat Date: Wed, 25 Jan 2023 14:36:01 -0500 Subject: [PATCH 15/16] when changing the primary file name also change the primary process when updating a process model from the api w/ burnettk --- spiffworkflow-backend/bpmn_json_67.json | 1 + spiffworkflow-backend/bpmn_json_67_2.json | 316 +++++++++ spiffworkflow-backend/bpmn_json_68.json | 1 + spiffworkflow-backend/bpmn_json_68_2.json | 621 ++++++++++++++++++ .../routes/process_models_controller.py | 23 + 5 files changed, 962 insertions(+) create mode 100644 spiffworkflow-backend/bpmn_json_67.json create mode 100644 spiffworkflow-backend/bpmn_json_67_2.json create mode 100644 spiffworkflow-backend/bpmn_json_68.json create mode 100644 spiffworkflow-backend/bpmn_json_68_2.json diff --git a/spiffworkflow-backend/bpmn_json_67.json b/spiffworkflow-backend/bpmn_json_67.json new file mode 100644 index 00000000..699d0af7 --- /dev/null +++ b/spiffworkflow-backend/bpmn_json_67.json @@ -0,0 +1 @@ +{"data": {"validate_only": false, "my_var_now": 2, "current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}, "last_task": "b6e341d6-4bc5-4ec0-a93e-9d2154bcf58f", "success": true, "tasks": {"8156eb2b-8edb-425b-a775-2bd37fd891af": {"id": "8156eb2b-8edb-425b-a775-2bd37fd891af", "parent": null, "children": ["d070c7f3-be9e-4f6e-b81a-7647ee6b7582"], "last_state_change": 1674674629.05859, "state": 32, "task_spec": "Root", "triggered": false, "workflow_name": "process_to_call", "internal_data": {}, "data": {}}, "d070c7f3-be9e-4f6e-b81a-7647ee6b7582": {"id": "d070c7f3-be9e-4f6e-b81a-7647ee6b7582", "parent": "8156eb2b-8edb-425b-a775-2bd37fd891af", "children": ["3e542841-075e-4e18-906e-4ac68168fda7"], "last_state_change": 1674674629.094655, "state": 32, "task_spec": "Start", "triggered": false, "workflow_name": "process_to_call", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}}}, "3e542841-075e-4e18-906e-4ac68168fda7": {"id": "3e542841-075e-4e18-906e-4ac68168fda7", "parent": "d070c7f3-be9e-4f6e-b81a-7647ee6b7582", "children": ["1685edde-09eb-4363-88b7-9b12f37ea1ef"], "last_state_change": 1674674629.1414993, "state": 32, "task_spec": "StartEvent_1", "triggered": false, "workflow_name": "process_to_call", "internal_data": {"event_fired": true}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}}}, "1685edde-09eb-4363-88b7-9b12f37ea1ef": {"id": "1685edde-09eb-4363-88b7-9b12f37ea1ef", "parent": "3e542841-075e-4e18-906e-4ac68168fda7", "children": ["380f4e01-bb6c-42e0-9ed8-e7a14f1bd756"], "last_state_change": 1674674629.1694856, "state": 32, "task_spec": "super_awesome_script", "triggered": false, "workflow_name": "process_to_call", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}, "380f4e01-bb6c-42e0-9ed8-e7a14f1bd756": {"id": "380f4e01-bb6c-42e0-9ed8-e7a14f1bd756", "parent": "1685edde-09eb-4363-88b7-9b12f37ea1ef", "children": ["f4846e08-8e5f-47db-87f0-41daacbd3e5b"], "last_state_change": 1674674629.2164488, "state": 32, "task_spec": "Event_08g7f08", "triggered": false, "workflow_name": "process_to_call", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}, "f4846e08-8e5f-47db-87f0-41daacbd3e5b": {"id": "f4846e08-8e5f-47db-87f0-41daacbd3e5b", "parent": "380f4e01-bb6c-42e0-9ed8-e7a14f1bd756", "children": ["b6e341d6-4bc5-4ec0-a93e-9d2154bcf58f"], "last_state_change": 1674674629.2567987, "state": 32, "task_spec": "process_to_call.EndJoin", "triggered": false, "workflow_name": "process_to_call", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}, "b6e341d6-4bc5-4ec0-a93e-9d2154bcf58f": {"id": "b6e341d6-4bc5-4ec0-a93e-9d2154bcf58f", "parent": "f4846e08-8e5f-47db-87f0-41daacbd3e5b", "children": [], "last_state_change": 1674674629.28801, "state": 32, "task_spec": "End", "triggered": false, "workflow_name": "process_to_call", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}}, "root": "8156eb2b-8edb-425b-a775-2bd37fd891af", "spec": {"name": "process_to_call", "description": "Process to call", "file": "callable_process.bpmn", "task_specs": {"Start": {"id": "process_to_call_1", "name": "Start", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": [], "outputs": ["StartEvent_1"], "typename": "StartTask"}, "process_to_call.EndJoin": {"id": "process_to_call_2", "name": "process_to_call.EndJoin", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": ["Event_08g7f08"], "outputs": ["End"], "typename": "_EndJoin"}, "End": {"id": "process_to_call_3", "name": "End", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": ["process_to_call.EndJoin"], "outputs": [], "typename": "Simple"}, "StartEvent_1": {"id": "process_to_call_4", "name": "StartEvent_1", "description": null, "manual": false, "internal": false, "lookahead": 2, "inputs": ["Start"], "outputs": ["super_awesome_script"], "lane": null, "documentation": null, "loopTask": false, "position": {"x": 179.0, "y": 159.0}, "data_input_associations": [], "data_output_associations": [], "event_definition": {"internal": false, "external": false, "typename": "NoneEventDefinition"}, "typename": "StartEvent", "extensions": {}}, "super_awesome_script": {"id": "process_to_call_5", "name": "super_awesome_script", "description": "Super Awesome Script", "manual": false, "internal": false, "lookahead": 2, "inputs": ["StartEvent_1"], "outputs": ["Event_08g7f08"], "lane": null, "documentation": null, "loopTask": false, "position": {"x": 380.0, "y": 137.0}, "data_input_associations": [], "data_output_associations": [{"name": "my_var_now", "description": "my_var_now", "typename": "BpmnDataSpecification"}], "prescript": null, "postscript": null, "script": "a = 1\nmy_var_now = 2", "typename": "ScriptTask", "extensions": {}}, "Event_08g7f08": {"id": "process_to_call_6", "name": "Event_08g7f08", "description": null, "manual": false, "internal": false, "lookahead": 2, "inputs": ["super_awesome_script"], "outputs": ["process_to_call.EndJoin"], "lane": null, "documentation": null, "loopTask": false, "position": {"x": 522.0, "y": 159.0}, "data_input_associations": [], "data_output_associations": [], "event_definition": {"internal": false, "external": false, "typename": "NoneEventDefinition"}, "typename": "EndEvent", "extensions": {}}, "Root": {"id": "process_to_call_7", "name": "Root", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": [], "outputs": [], "typename": "Simple"}}, "data_inputs": [], "data_outputs": [], "data_objects": {"my_var_now": {"name": "my_var_now", "description": "my_var_now", "typename": "BpmnDataSpecification"}}, "correlation_keys": {}, "typename": "BpmnProcessSpec"}, "subprocess_specs": {}, "subprocesses": {}, "bpmn_messages": [], "serializer_version": "1.0-spiffworkflow-backend"} \ No newline at end of file diff --git a/spiffworkflow-backend/bpmn_json_67_2.json b/spiffworkflow-backend/bpmn_json_67_2.json new file mode 100644 index 00000000..322a3408 --- /dev/null +++ b/spiffworkflow-backend/bpmn_json_67_2.json @@ -0,0 +1,316 @@ +{ + "data": { + "validate_only": false, + "my_var_now": 2, + "current_user": { + "username": "jason@sartography.com", + "id": "1" + }, + "a": 1 + }, + "last_task": "b6e341d6-4bc5-4ec0-a93e-9d2154bcf58f", + "success": true, + "tasks": { + "8156eb2b-8edb-425b-a775-2bd37fd891af": { + "id": "8156eb2b-8edb-425b-a775-2bd37fd891af", + "parent": null, + "children": [ + "d070c7f3-be9e-4f6e-b81a-7647ee6b7582" + ], + "last_state_change": 1674674629.05859, + "state": 32, + "task_spec": "Root", + "triggered": false, + "workflow_name": "process_to_call", + "internal_data": {}, + "data": {} + }, + "d070c7f3-be9e-4f6e-b81a-7647ee6b7582": { + "id": "d070c7f3-be9e-4f6e-b81a-7647ee6b7582", + "parent": "8156eb2b-8edb-425b-a775-2bd37fd891af", + "children": [ + "3e542841-075e-4e18-906e-4ac68168fda7" + ], + "last_state_change": 1674674629.094655, + "state": 32, + "task_spec": "Start", + "triggered": false, + "workflow_name": "process_to_call", + "internal_data": {}, + "data": { + "current_user": { + "username": "jason@sartography.com", + "id": "1" + } + } + }, + "3e542841-075e-4e18-906e-4ac68168fda7": { + "id": "3e542841-075e-4e18-906e-4ac68168fda7", + "parent": "d070c7f3-be9e-4f6e-b81a-7647ee6b7582", + "children": [ + "1685edde-09eb-4363-88b7-9b12f37ea1ef" + ], + "last_state_change": 1674674629.1414993, + "state": 32, + "task_spec": "StartEvent_1", + "triggered": false, + "workflow_name": "process_to_call", + "internal_data": { + "event_fired": true + }, + "data": { + "current_user": { + "username": "jason@sartography.com", + "id": "1" + } + } + }, + "1685edde-09eb-4363-88b7-9b12f37ea1ef": { + "id": "1685edde-09eb-4363-88b7-9b12f37ea1ef", + "parent": "3e542841-075e-4e18-906e-4ac68168fda7", + "children": [ + "380f4e01-bb6c-42e0-9ed8-e7a14f1bd756" + ], + "last_state_change": 1674674629.1694856, + "state": 32, + "task_spec": "super_awesome_script", + "triggered": false, + "workflow_name": "process_to_call", + "internal_data": {}, + "data": { + "current_user": { + "username": "jason@sartography.com", + "id": "1" + }, + "a": 1 + } + }, + "380f4e01-bb6c-42e0-9ed8-e7a14f1bd756": { + "id": "380f4e01-bb6c-42e0-9ed8-e7a14f1bd756", + "parent": "1685edde-09eb-4363-88b7-9b12f37ea1ef", + "children": [ + "f4846e08-8e5f-47db-87f0-41daacbd3e5b" + ], + "last_state_change": 1674674629.2164488, + "state": 32, + "task_spec": "Event_08g7f08", + "triggered": false, + "workflow_name": "process_to_call", + "internal_data": {}, + "data": { + "current_user": { + "username": "jason@sartography.com", + "id": "1" + }, + "a": 1 + } + }, + "f4846e08-8e5f-47db-87f0-41daacbd3e5b": { + "id": "f4846e08-8e5f-47db-87f0-41daacbd3e5b", + "parent": "380f4e01-bb6c-42e0-9ed8-e7a14f1bd756", + "children": [ + "b6e341d6-4bc5-4ec0-a93e-9d2154bcf58f" + ], + "last_state_change": 1674674629.2567987, + "state": 32, + "task_spec": "process_to_call.EndJoin", + "triggered": false, + "workflow_name": "process_to_call", + "internal_data": {}, + "data": { + "current_user": { + "username": "jason@sartography.com", + "id": "1" + }, + "a": 1 + } + }, + "b6e341d6-4bc5-4ec0-a93e-9d2154bcf58f": { + "id": "b6e341d6-4bc5-4ec0-a93e-9d2154bcf58f", + "parent": "f4846e08-8e5f-47db-87f0-41daacbd3e5b", + "children": [], + "last_state_change": 1674674629.28801, + "state": 32, + "task_spec": "End", + "triggered": false, + "workflow_name": "process_to_call", + "internal_data": {}, + "data": { + "current_user": { + "username": "jason@sartography.com", + "id": "1" + }, + "a": 1 + } + } + }, + "root": "8156eb2b-8edb-425b-a775-2bd37fd891af", + "spec": { + "name": "process_to_call", + "description": "Process to call", + "file": "callable_process.bpmn", + "task_specs": { + "Start": { + "id": "process_to_call_1", + "name": "Start", + "description": "", + "manual": false, + "internal": false, + "lookahead": 2, + "inputs": [], + "outputs": [ + "StartEvent_1" + ], + "typename": "StartTask" + }, + "process_to_call.EndJoin": { + "id": "process_to_call_2", + "name": "process_to_call.EndJoin", + "description": "", + "manual": false, + "internal": false, + "lookahead": 2, + "inputs": [ + "Event_08g7f08" + ], + "outputs": [ + "End" + ], + "typename": "_EndJoin" + }, + "End": { + "id": "process_to_call_3", + "name": "End", + "description": "", + "manual": false, + "internal": false, + "lookahead": 2, + "inputs": [ + "process_to_call.EndJoin" + ], + "outputs": [], + "typename": "Simple" + }, + "StartEvent_1": { + "id": "process_to_call_4", + "name": "StartEvent_1", + "description": null, + "manual": false, + "internal": false, + "lookahead": 2, + "inputs": [ + "Start" + ], + "outputs": [ + "super_awesome_script" + ], + "lane": null, + "documentation": null, + "loopTask": false, + "position": { + "x": 179, + "y": 159 + }, + "data_input_associations": [], + "data_output_associations": [], + "event_definition": { + "internal": false, + "external": false, + "typename": "NoneEventDefinition" + }, + "typename": "StartEvent", + "extensions": {} + }, + "super_awesome_script": { + "id": "process_to_call_5", + "name": "super_awesome_script", + "description": "Super Awesome Script", + "manual": false, + "internal": false, + "lookahead": 2, + "inputs": [ + "StartEvent_1" + ], + "outputs": [ + "Event_08g7f08" + ], + "lane": null, + "documentation": null, + "loopTask": false, + "position": { + "x": 380, + "y": 137 + }, + "data_input_associations": [], + "data_output_associations": [ + { + "name": "my_var_now", + "description": "my_var_now", + "typename": "BpmnDataSpecification" + } + ], + "prescript": null, + "postscript": null, + "script": "a = 1\nmy_var_now = 2", + "typename": "ScriptTask", + "extensions": {} + }, + "Event_08g7f08": { + "id": "process_to_call_6", + "name": "Event_08g7f08", + "description": null, + "manual": false, + "internal": false, + "lookahead": 2, + "inputs": [ + "super_awesome_script" + ], + "outputs": [ + "process_to_call.EndJoin" + ], + "lane": null, + "documentation": null, + "loopTask": false, + "position": { + "x": 522, + "y": 159 + }, + "data_input_associations": [], + "data_output_associations": [], + "event_definition": { + "internal": false, + "external": false, + "typename": "NoneEventDefinition" + }, + "typename": "EndEvent", + "extensions": {} + }, + "Root": { + "id": "process_to_call_7", + "name": "Root", + "description": "", + "manual": false, + "internal": false, + "lookahead": 2, + "inputs": [], + "outputs": [], + "typename": "Simple" + } + }, + "data_inputs": [], + "data_outputs": [], + "data_objects": { + "my_var_now": { + "name": "my_var_now", + "description": "my_var_now", + "typename": "BpmnDataSpecification" + } + }, + "correlation_keys": {}, + "typename": "BpmnProcessSpec" + }, + "subprocess_specs": {}, + "subprocesses": {}, + "bpmn_messages": [], + "serializer_version": "1.0-spiffworkflow-backend" +} diff --git a/spiffworkflow-backend/bpmn_json_68.json b/spiffworkflow-backend/bpmn_json_68.json new file mode 100644 index 00000000..011478be --- /dev/null +++ b/spiffworkflow-backend/bpmn_json_68.json @@ -0,0 +1 @@ +{"data": {"validate_only": false, "current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}, "last_task": "9655e709-3600-43d0-a08d-bb52892333e9", "success": true, "tasks": {"a9495420-a98f-4574-86eb-57875fabd465": {"id": "a9495420-a98f-4574-86eb-57875fabd465", "parent": null, "children": ["6f4e2241-9268-40fb-8636-a6b5d511ade4"], "last_state_change": 1674674684.1271565, "state": 32, "task_spec": "Root", "triggered": false, "workflow_name": "Process_rmvgdyk", "internal_data": {}, "data": {}}, "6f4e2241-9268-40fb-8636-a6b5d511ade4": {"id": "6f4e2241-9268-40fb-8636-a6b5d511ade4", "parent": "a9495420-a98f-4574-86eb-57875fabd465", "children": ["4536669f-7896-46e0-9587-0243e0bf03fa"], "last_state_change": 1674674684.1695502, "state": 32, "task_spec": "Start", "triggered": false, "workflow_name": "Process_rmvgdyk", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}}}, "4536669f-7896-46e0-9587-0243e0bf03fa": {"id": "4536669f-7896-46e0-9587-0243e0bf03fa", "parent": "6f4e2241-9268-40fb-8636-a6b5d511ade4", "children": ["75ff9e01-4570-4ad5-bf87-537c15d67cd6"], "last_state_change": 1674674684.1987424, "state": 32, "task_spec": "StartEvent_1", "triggered": false, "workflow_name": "Process_rmvgdyk", "internal_data": {"event_fired": true}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}}}, "75ff9e01-4570-4ad5-bf87-537c15d67cd6": {"id": "75ff9e01-4570-4ad5-bf87-537c15d67cd6", "parent": "4536669f-7896-46e0-9587-0243e0bf03fa", "children": ["f0646cac-f127-491f-9d8d-7a88044af404"], "last_state_change": 1674674684.5499449, "state": 32, "task_spec": "call_one", "triggered": false, "workflow_name": "Process_rmvgdyk", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}, "f0646cac-f127-491f-9d8d-7a88044af404": {"id": "f0646cac-f127-491f-9d8d-7a88044af404", "parent": "75ff9e01-4570-4ad5-bf87-537c15d67cd6", "children": ["f25607a0-a3dd-4b08-876f-973cc5569b6a"], "last_state_change": 1674674684.5961928, "state": 32, "task_spec": "Event_0pq4nje", "triggered": false, "workflow_name": "Process_rmvgdyk", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}, "f25607a0-a3dd-4b08-876f-973cc5569b6a": {"id": "f25607a0-a3dd-4b08-876f-973cc5569b6a", "parent": "f0646cac-f127-491f-9d8d-7a88044af404", "children": ["9655e709-3600-43d0-a08d-bb52892333e9"], "last_state_change": 1674674684.6496456, "state": 32, "task_spec": "Process_rmvgdyk.EndJoin", "triggered": false, "workflow_name": "Process_rmvgdyk", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}, "9655e709-3600-43d0-a08d-bb52892333e9": {"id": "9655e709-3600-43d0-a08d-bb52892333e9", "parent": "f25607a0-a3dd-4b08-876f-973cc5569b6a", "children": [], "last_state_change": 1674674684.6751294, "state": 32, "task_spec": "End", "triggered": false, "workflow_name": "Process_rmvgdyk", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}}, "root": "a9495420-a98f-4574-86eb-57875fabd465", "spec": {"name": "Process_rmvgdyk", "description": "Process_rmvgdyk", "file": "start.bpmn", "task_specs": {"Start": {"id": "Process_rmvgdyk_1", "name": "Start", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": [], "outputs": ["StartEvent_1"], "typename": "StartTask"}, "Process_rmvgdyk.EndJoin": {"id": "Process_rmvgdyk_2", "name": "Process_rmvgdyk.EndJoin", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": ["Event_0pq4nje"], "outputs": ["End"], "typename": "_EndJoin"}, "End": {"id": "Process_rmvgdyk_3", "name": "End", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": ["Process_rmvgdyk.EndJoin"], "outputs": [], "typename": "Simple"}, "StartEvent_1": {"id": "Process_rmvgdyk_4", "name": "StartEvent_1", "description": null, "manual": false, "internal": false, "lookahead": 2, "inputs": ["Start"], "outputs": ["call_one"], "lane": null, "documentation": null, "loopTask": false, "position": {"x": 179.0, "y": 159.0}, "data_input_associations": [], "data_output_associations": [], "event_definition": {"internal": false, "external": false, "typename": "NoneEventDefinition"}, "typename": "StartEvent", "extensions": {}}, "call_one": {"id": "Process_rmvgdyk_5", "name": "call_one", "description": "Call One", "manual": false, "internal": false, "lookahead": 2, "inputs": ["StartEvent_1"], "outputs": ["Event_0pq4nje"], "lane": null, "documentation": null, "loopTask": false, "position": {"x": 270.0, "y": 137.0}, "data_input_associations": [], "data_output_associations": [], "prescript": "a = 1", "postscript": null, "spec": "process_to_call", "typename": "CallActivity", "extensions": {"preScript": "a = 1"}}, "Event_0pq4nje": {"id": "Process_rmvgdyk_6", "name": "Event_0pq4nje", "description": null, "manual": false, "internal": false, "lookahead": 2, "inputs": ["call_one"], "outputs": ["Process_rmvgdyk.EndJoin"], "lane": null, "documentation": null, "loopTask": false, "position": {"x": 912.0, "y": 159.0}, "data_input_associations": [], "data_output_associations": [], "event_definition": {"internal": false, "external": false, "typename": "NoneEventDefinition"}, "typename": "EndEvent", "extensions": {}}, "Root": {"id": "Process_rmvgdyk_7", "name": "Root", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": [], "outputs": [], "typename": "Simple"}}, "data_inputs": [], "data_outputs": [], "data_objects": {}, "correlation_keys": {}, "typename": "BpmnProcessSpec"}, "subprocess_specs": {"process_to_call": {"name": "process_to_call", "description": "Process to call", "file": "/home/jason/projects/github/sartography/sample-process-models/misc/category_number_one/call-activity/callable_process.bpmn", "task_specs": {"Start": {"id": "process_to_call_1", "name": "Start", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": [], "outputs": ["StartEvent_1"], "typename": "StartTask"}, "process_to_call.EndJoin": {"id": "process_to_call_2", "name": "process_to_call.EndJoin", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": ["Event_08g7f08"], "outputs": ["End"], "typename": "_EndJoin"}, "End": {"id": "process_to_call_3", "name": "End", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": ["process_to_call.EndJoin"], "outputs": [], "typename": "Simple"}, "StartEvent_1": {"id": "process_to_call_4", "name": "StartEvent_1", "description": null, "manual": false, "internal": false, "lookahead": 2, "inputs": ["Start"], "outputs": ["super_awesome_script"], "lane": null, "documentation": null, "loopTask": false, "position": {"x": 179.0, "y": 159.0}, "data_input_associations": [], "data_output_associations": [], "event_definition": {"internal": false, "external": false, "typename": "NoneEventDefinition"}, "typename": "StartEvent", "extensions": {}}, "super_awesome_script": {"id": "process_to_call_5", "name": "super_awesome_script", "description": "Super Awesome Script", "manual": false, "internal": false, "lookahead": 2, "inputs": ["StartEvent_1"], "outputs": ["Event_08g7f08"], "lane": null, "documentation": null, "loopTask": false, "position": {"x": 380.0, "y": 137.0}, "data_input_associations": [], "data_output_associations": [{"name": "my_var_now", "description": "my_var_now", "typename": "BpmnDataSpecification"}], "prescript": null, "postscript": null, "script": "a = 1\nmy_var_now = 2", "typename": "ScriptTask", "extensions": {}}, "Event_08g7f08": {"id": "process_to_call_6", "name": "Event_08g7f08", "description": null, "manual": false, "internal": false, "lookahead": 2, "inputs": ["super_awesome_script"], "outputs": ["process_to_call.EndJoin"], "lane": null, "documentation": null, "loopTask": false, "position": {"x": 522.0, "y": 159.0}, "data_input_associations": [], "data_output_associations": [], "event_definition": {"internal": false, "external": false, "typename": "NoneEventDefinition"}, "typename": "EndEvent", "extensions": {}}, "Root": {"id": "process_to_call_7", "name": "Root", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": [], "outputs": [], "typename": "Simple"}}, "data_inputs": [], "data_outputs": [], "data_objects": {"my_var_now": {"name": "my_var_now", "description": "my_var_now", "typename": "BpmnDataSpecification"}}, "correlation_keys": {}, "typename": "BpmnProcessSpec"}}, "subprocesses": {"75ff9e01-4570-4ad5-bf87-537c15d67cd6": {"data": {"validate_only": false, "my_var_now": 2, "current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}, "last_task": "188eb6c3-d7c5-4900-b690-9cbb92ef2b19", "success": true, "tasks": {"a296c968-f6cb-42f2-a4b1-1268aca41c5d": {"id": "a296c968-f6cb-42f2-a4b1-1268aca41c5d", "parent": null, "children": ["8b4a92af-104b-4e78-9008-b690fbe7f560"], "last_state_change": 1674674684.2170289, "state": 32, "task_spec": "Root", "triggered": false, "workflow_name": "call_one", "internal_data": {}, "data": {}}, "8b4a92af-104b-4e78-9008-b690fbe7f560": {"id": "8b4a92af-104b-4e78-9008-b690fbe7f560", "parent": "a296c968-f6cb-42f2-a4b1-1268aca41c5d", "children": ["7ec77604-d1b9-4be3-a9aa-2eef295be9d2"], "last_state_change": 1674674684.2541206, "state": 32, "task_spec": "Start", "triggered": false, "workflow_name": "call_one", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}, "7ec77604-d1b9-4be3-a9aa-2eef295be9d2": {"id": "7ec77604-d1b9-4be3-a9aa-2eef295be9d2", "parent": "8b4a92af-104b-4e78-9008-b690fbe7f560", "children": ["305310bd-9425-46af-ba78-90f3dae283e3"], "last_state_change": 1674674684.2768772, "state": 32, "task_spec": "StartEvent_1", "triggered": false, "workflow_name": "call_one", "internal_data": {"event_fired": true}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}, "305310bd-9425-46af-ba78-90f3dae283e3": {"id": "305310bd-9425-46af-ba78-90f3dae283e3", "parent": "7ec77604-d1b9-4be3-a9aa-2eef295be9d2", "children": ["cb25e1f8-c570-4af3-b8eb-be57746cd765"], "last_state_change": 1674674684.322075, "state": 32, "task_spec": "super_awesome_script", "triggered": false, "workflow_name": "call_one", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}, "cb25e1f8-c570-4af3-b8eb-be57746cd765": {"id": "cb25e1f8-c570-4af3-b8eb-be57746cd765", "parent": "305310bd-9425-46af-ba78-90f3dae283e3", "children": ["bbfc1793-787b-417b-8089-9bb194ae4034"], "last_state_change": 1674674684.3872745, "state": 32, "task_spec": "Event_08g7f08", "triggered": false, "workflow_name": "call_one", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}, "bbfc1793-787b-417b-8089-9bb194ae4034": {"id": "bbfc1793-787b-417b-8089-9bb194ae4034", "parent": "cb25e1f8-c570-4af3-b8eb-be57746cd765", "children": ["188eb6c3-d7c5-4900-b690-9cbb92ef2b19"], "last_state_change": 1674674684.4518044, "state": 32, "task_spec": "process_to_call.EndJoin", "triggered": false, "workflow_name": "call_one", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}, "188eb6c3-d7c5-4900-b690-9cbb92ef2b19": {"id": "188eb6c3-d7c5-4900-b690-9cbb92ef2b19", "parent": "bbfc1793-787b-417b-8089-9bb194ae4034", "children": [], "last_state_change": 1674674684.500384, "state": 32, "task_spec": "End", "triggered": false, "workflow_name": "call_one", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}}, "root": "a296c968-f6cb-42f2-a4b1-1268aca41c5d"}}, "bpmn_messages": [], "serializer_version": "1.0-spiffworkflow-backend"} \ No newline at end of file diff --git a/spiffworkflow-backend/bpmn_json_68_2.json b/spiffworkflow-backend/bpmn_json_68_2.json new file mode 100644 index 00000000..984cf7d5 --- /dev/null +++ b/spiffworkflow-backend/bpmn_json_68_2.json @@ -0,0 +1,621 @@ +{ + "data": { + "validate_only": false, + "current_user": { + "username": "jason@sartography.com", + "id": "1" + }, + "a": 1 + }, + "last_task": "9655e709-3600-43d0-a08d-bb52892333e9", + "success": true, + "tasks": { + "a9495420-a98f-4574-86eb-57875fabd465": { + "id": "a9495420-a98f-4574-86eb-57875fabd465", + "parent": null, + "children": [ + "6f4e2241-9268-40fb-8636-a6b5d511ade4" + ], + "last_state_change": 1674674684.1271565, + "state": 32, + "task_spec": "Root", + "triggered": false, + "workflow_name": "Process_rmvgdyk", + "internal_data": {}, + "data": {} + }, + "6f4e2241-9268-40fb-8636-a6b5d511ade4": { + "id": "6f4e2241-9268-40fb-8636-a6b5d511ade4", + "parent": "a9495420-a98f-4574-86eb-57875fabd465", + "children": [ + "4536669f-7896-46e0-9587-0243e0bf03fa" + ], + "last_state_change": 1674674684.1695502, + "state": 32, + "task_spec": "Start", + "triggered": false, + "workflow_name": "Process_rmvgdyk", + "internal_data": {}, + "data": { + "current_user": { + "username": "jason@sartography.com", + "id": "1" + } + } + }, + "4536669f-7896-46e0-9587-0243e0bf03fa": { + "id": "4536669f-7896-46e0-9587-0243e0bf03fa", + "parent": "6f4e2241-9268-40fb-8636-a6b5d511ade4", + "children": [ + "75ff9e01-4570-4ad5-bf87-537c15d67cd6" + ], + "last_state_change": 1674674684.1987424, + "state": 32, + "task_spec": "StartEvent_1", + "triggered": false, + "workflow_name": "Process_rmvgdyk", + "internal_data": { + "event_fired": true + }, + "data": { + "current_user": { + "username": "jason@sartography.com", + "id": "1" + } + } + }, + "75ff9e01-4570-4ad5-bf87-537c15d67cd6": { + "id": "75ff9e01-4570-4ad5-bf87-537c15d67cd6", + "parent": "4536669f-7896-46e0-9587-0243e0bf03fa", + "children": [ + "f0646cac-f127-491f-9d8d-7a88044af404" + ], + "last_state_change": 1674674684.5499449, + "state": 32, + "task_spec": "call_one", + "triggered": false, + "workflow_name": "Process_rmvgdyk", + "internal_data": {}, + "data": { + "current_user": { + "username": "jason@sartography.com", + "id": "1" + }, + "a": 1 + } + }, + "f0646cac-f127-491f-9d8d-7a88044af404": { + "id": "f0646cac-f127-491f-9d8d-7a88044af404", + "parent": "75ff9e01-4570-4ad5-bf87-537c15d67cd6", + "children": [ + "f25607a0-a3dd-4b08-876f-973cc5569b6a" + ], + "last_state_change": 1674674684.5961928, + "state": 32, + "task_spec": "Event_0pq4nje", + "triggered": false, + "workflow_name": "Process_rmvgdyk", + "internal_data": {}, + "data": { + "current_user": { + "username": "jason@sartography.com", + "id": "1" + }, + "a": 1 + } + }, + "f25607a0-a3dd-4b08-876f-973cc5569b6a": { + "id": "f25607a0-a3dd-4b08-876f-973cc5569b6a", + "parent": "f0646cac-f127-491f-9d8d-7a88044af404", + "children": [ + "9655e709-3600-43d0-a08d-bb52892333e9" + ], + "last_state_change": 1674674684.6496456, + "state": 32, + "task_spec": "Process_rmvgdyk.EndJoin", + "triggered": false, + "workflow_name": "Process_rmvgdyk", + "internal_data": {}, + "data": { + "current_user": { + "username": "jason@sartography.com", + "id": "1" + }, + "a": 1 + } + }, + "9655e709-3600-43d0-a08d-bb52892333e9": { + "id": "9655e709-3600-43d0-a08d-bb52892333e9", + "parent": "f25607a0-a3dd-4b08-876f-973cc5569b6a", + "children": [], + "last_state_change": 1674674684.6751294, + "state": 32, + "task_spec": "End", + "triggered": false, + "workflow_name": "Process_rmvgdyk", + "internal_data": {}, + "data": { + "current_user": { + "username": "jason@sartography.com", + "id": "1" + }, + "a": 1 + } + } + }, + "root": "a9495420-a98f-4574-86eb-57875fabd465", + "spec": { + "name": "Process_rmvgdyk", + "description": "Process_rmvgdyk", + "file": "start.bpmn", + "task_specs": { + "Start": { + "id": "Process_rmvgdyk_1", + "name": "Start", + "description": "", + "manual": false, + "internal": false, + "lookahead": 2, + "inputs": [], + "outputs": [ + "StartEvent_1" + ], + "typename": "StartTask" + }, + "Process_rmvgdyk.EndJoin": { + "id": "Process_rmvgdyk_2", + "name": "Process_rmvgdyk.EndJoin", + "description": "", + "manual": false, + "internal": false, + "lookahead": 2, + "inputs": [ + "Event_0pq4nje" + ], + "outputs": [ + "End" + ], + "typename": "_EndJoin" + }, + "End": { + "id": "Process_rmvgdyk_3", + "name": "End", + "description": "", + "manual": false, + "internal": false, + "lookahead": 2, + "inputs": [ + "Process_rmvgdyk.EndJoin" + ], + "outputs": [], + "typename": "Simple" + }, + "StartEvent_1": { + "id": "Process_rmvgdyk_4", + "name": "StartEvent_1", + "description": null, + "manual": false, + "internal": false, + "lookahead": 2, + "inputs": [ + "Start" + ], + "outputs": [ + "call_one" + ], + "lane": null, + "documentation": null, + "loopTask": false, + "position": { + "x": 179, + "y": 159 + }, + "data_input_associations": [], + "data_output_associations": [], + "event_definition": { + "internal": false, + "external": false, + "typename": "NoneEventDefinition" + }, + "typename": "StartEvent", + "extensions": {} + }, + "call_one": { + "id": "Process_rmvgdyk_5", + "name": "call_one", + "description": "Call One", + "manual": false, + "internal": false, + "lookahead": 2, + "inputs": [ + "StartEvent_1" + ], + "outputs": [ + "Event_0pq4nje" + ], + "lane": null, + "documentation": null, + "loopTask": false, + "position": { + "x": 270, + "y": 137 + }, + "data_input_associations": [], + "data_output_associations": [], + "prescript": "a = 1", + "postscript": null, + "spec": "process_to_call", + "typename": "CallActivity", + "extensions": { + "preScript": "a = 1" + } + }, + "Event_0pq4nje": { + "id": "Process_rmvgdyk_6", + "name": "Event_0pq4nje", + "description": null, + "manual": false, + "internal": false, + "lookahead": 2, + "inputs": [ + "call_one" + ], + "outputs": [ + "Process_rmvgdyk.EndJoin" + ], + "lane": null, + "documentation": null, + "loopTask": false, + "position": { + "x": 912, + "y": 159 + }, + "data_input_associations": [], + "data_output_associations": [], + "event_definition": { + "internal": false, + "external": false, + "typename": "NoneEventDefinition" + }, + "typename": "EndEvent", + "extensions": {} + }, + "Root": { + "id": "Process_rmvgdyk_7", + "name": "Root", + "description": "", + "manual": false, + "internal": false, + "lookahead": 2, + "inputs": [], + "outputs": [], + "typename": "Simple" + } + }, + "data_inputs": [], + "data_outputs": [], + "data_objects": {}, + "correlation_keys": {}, + "typename": "BpmnProcessSpec" + }, + "subprocess_specs": { + "process_to_call": { + "name": "process_to_call", + "description": "Process to call", + "file": "/home/jason/projects/github/sartography/sample-process-models/misc/category_number_one/call-activity/callable_process.bpmn", + "task_specs": { + "Start": { + "id": "process_to_call_1", + "name": "Start", + "description": "", + "manual": false, + "internal": false, + "lookahead": 2, + "inputs": [], + "outputs": [ + "StartEvent_1" + ], + "typename": "StartTask" + }, + "process_to_call.EndJoin": { + "id": "process_to_call_2", + "name": "process_to_call.EndJoin", + "description": "", + "manual": false, + "internal": false, + "lookahead": 2, + "inputs": [ + "Event_08g7f08" + ], + "outputs": [ + "End" + ], + "typename": "_EndJoin" + }, + "End": { + "id": "process_to_call_3", + "name": "End", + "description": "", + "manual": false, + "internal": false, + "lookahead": 2, + "inputs": [ + "process_to_call.EndJoin" + ], + "outputs": [], + "typename": "Simple" + }, + "StartEvent_1": { + "id": "process_to_call_4", + "name": "StartEvent_1", + "description": null, + "manual": false, + "internal": false, + "lookahead": 2, + "inputs": [ + "Start" + ], + "outputs": [ + "super_awesome_script" + ], + "lane": null, + "documentation": null, + "loopTask": false, + "position": { + "x": 179, + "y": 159 + }, + "data_input_associations": [], + "data_output_associations": [], + "event_definition": { + "internal": false, + "external": false, + "typename": "NoneEventDefinition" + }, + "typename": "StartEvent", + "extensions": {} + }, + "super_awesome_script": { + "id": "process_to_call_5", + "name": "super_awesome_script", + "description": "Super Awesome Script", + "manual": false, + "internal": false, + "lookahead": 2, + "inputs": [ + "StartEvent_1" + ], + "outputs": [ + "Event_08g7f08" + ], + "lane": null, + "documentation": null, + "loopTask": false, + "position": { + "x": 380, + "y": 137 + }, + "data_input_associations": [], + "data_output_associations": [ + { + "name": "my_var_now", + "description": "my_var_now", + "typename": "BpmnDataSpecification" + } + ], + "prescript": null, + "postscript": null, + "script": "a = 1\nmy_var_now = 2", + "typename": "ScriptTask", + "extensions": {} + }, + "Event_08g7f08": { + "id": "process_to_call_6", + "name": "Event_08g7f08", + "description": null, + "manual": false, + "internal": false, + "lookahead": 2, + "inputs": [ + "super_awesome_script" + ], + "outputs": [ + "process_to_call.EndJoin" + ], + "lane": null, + "documentation": null, + "loopTask": false, + "position": { + "x": 522, + "y": 159 + }, + "data_input_associations": [], + "data_output_associations": [], + "event_definition": { + "internal": false, + "external": false, + "typename": "NoneEventDefinition" + }, + "typename": "EndEvent", + "extensions": {} + }, + "Root": { + "id": "process_to_call_7", + "name": "Root", + "description": "", + "manual": false, + "internal": false, + "lookahead": 2, + "inputs": [], + "outputs": [], + "typename": "Simple" + } + }, + "data_inputs": [], + "data_outputs": [], + "data_objects": { + "my_var_now": { + "name": "my_var_now", + "description": "my_var_now", + "typename": "BpmnDataSpecification" + } + }, + "correlation_keys": {}, + "typename": "BpmnProcessSpec" + } + }, + "subprocesses": { + "75ff9e01-4570-4ad5-bf87-537c15d67cd6": { + "data": { + "validate_only": false, + "my_var_now": 2, + "current_user": { + "username": "jason@sartography.com", + "id": "1" + }, + "a": 1 + }, + "last_task": "188eb6c3-d7c5-4900-b690-9cbb92ef2b19", + "success": true, + "tasks": { + "a296c968-f6cb-42f2-a4b1-1268aca41c5d": { + "id": "a296c968-f6cb-42f2-a4b1-1268aca41c5d", + "parent": null, + "children": [ + "8b4a92af-104b-4e78-9008-b690fbe7f560" + ], + "last_state_change": 1674674684.2170289, + "state": 32, + "task_spec": "Root", + "triggered": false, + "workflow_name": "call_one", + "internal_data": {}, + "data": {} + }, + "8b4a92af-104b-4e78-9008-b690fbe7f560": { + "id": "8b4a92af-104b-4e78-9008-b690fbe7f560", + "parent": "a296c968-f6cb-42f2-a4b1-1268aca41c5d", + "children": [ + "7ec77604-d1b9-4be3-a9aa-2eef295be9d2" + ], + "last_state_change": 1674674684.2541206, + "state": 32, + "task_spec": "Start", + "triggered": false, + "workflow_name": "call_one", + "internal_data": {}, + "data": { + "current_user": { + "username": "jason@sartography.com", + "id": "1" + }, + "a": 1 + } + }, + "7ec77604-d1b9-4be3-a9aa-2eef295be9d2": { + "id": "7ec77604-d1b9-4be3-a9aa-2eef295be9d2", + "parent": "8b4a92af-104b-4e78-9008-b690fbe7f560", + "children": [ + "305310bd-9425-46af-ba78-90f3dae283e3" + ], + "last_state_change": 1674674684.2768772, + "state": 32, + "task_spec": "StartEvent_1", + "triggered": false, + "workflow_name": "call_one", + "internal_data": { + "event_fired": true + }, + "data": { + "current_user": { + "username": "jason@sartography.com", + "id": "1" + }, + "a": 1 + } + }, + "305310bd-9425-46af-ba78-90f3dae283e3": { + "id": "305310bd-9425-46af-ba78-90f3dae283e3", + "parent": "7ec77604-d1b9-4be3-a9aa-2eef295be9d2", + "children": [ + "cb25e1f8-c570-4af3-b8eb-be57746cd765" + ], + "last_state_change": 1674674684.322075, + "state": 32, + "task_spec": "super_awesome_script", + "triggered": false, + "workflow_name": "call_one", + "internal_data": {}, + "data": { + "current_user": { + "username": "jason@sartography.com", + "id": "1" + }, + "a": 1 + } + }, + "cb25e1f8-c570-4af3-b8eb-be57746cd765": { + "id": "cb25e1f8-c570-4af3-b8eb-be57746cd765", + "parent": "305310bd-9425-46af-ba78-90f3dae283e3", + "children": [ + "bbfc1793-787b-417b-8089-9bb194ae4034" + ], + "last_state_change": 1674674684.3872745, + "state": 32, + "task_spec": "Event_08g7f08", + "triggered": false, + "workflow_name": "call_one", + "internal_data": {}, + "data": { + "current_user": { + "username": "jason@sartography.com", + "id": "1" + }, + "a": 1 + } + }, + "bbfc1793-787b-417b-8089-9bb194ae4034": { + "id": "bbfc1793-787b-417b-8089-9bb194ae4034", + "parent": "cb25e1f8-c570-4af3-b8eb-be57746cd765", + "children": [ + "188eb6c3-d7c5-4900-b690-9cbb92ef2b19" + ], + "last_state_change": 1674674684.4518044, + "state": 32, + "task_spec": "process_to_call.EndJoin", + "triggered": false, + "workflow_name": "call_one", + "internal_data": {}, + "data": { + "current_user": { + "username": "jason@sartography.com", + "id": "1" + }, + "a": 1 + } + }, + "188eb6c3-d7c5-4900-b690-9cbb92ef2b19": { + "id": "188eb6c3-d7c5-4900-b690-9cbb92ef2b19", + "parent": "bbfc1793-787b-417b-8089-9bb194ae4034", + "children": [], + "last_state_change": 1674674684.500384, + "state": 32, + "task_spec": "End", + "triggered": false, + "workflow_name": "call_one", + "internal_data": {}, + "data": { + "current_user": { + "username": "jason@sartography.com", + "id": "1" + }, + "a": 1 + } + } + }, + "root": "a296c968-f6cb-42f2-a4b1-1268aca41c5d" + } + }, + "bpmn_messages": [], + "serializer_version": "1.0-spiffworkflow-backend" +} diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_models_controller.py b/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_models_controller.py index 19f064c9..8717fa25 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_models_controller.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/routes/process_models_controller.py @@ -149,7 +149,30 @@ def process_model_update( } process_model = _get_process_model(process_model_identifier) + + # FIXME: the logic to update the the process id would be better if it could go into the + # process model save method but this causes circular imports with SpecFileService. + # All we really need this for is to get the process id from a bpmn file so maybe that could + # all be moved to FileSystemService. + update_primary_bpmn_file = False + if ( + "primary_file_name" in body_filtered + and "primary_process_id" not in body_filtered + ): + if process_model.primary_file_name != body_filtered["primary_file_name"]: + update_primary_bpmn_file = True + ProcessModelService.update_process_model(process_model, body_filtered) + + # update the file to ensure we get the correct process id if the primary file changed. + if update_primary_bpmn_file and process_model.primary_file_name: + primary_file_contents = SpecFileService.get_data( + process_model, process_model.primary_file_name + ) + SpecFileService.update_file( + process_model, process_model.primary_file_name, primary_file_contents + ) + _commit_and_push_to_git( f"User: {g.user.username} updated process model {process_model_identifier}" ) From ada389b5721d72eeb97d999466ed88d34fa80f29 Mon Sep 17 00:00:00 2001 From: jasquat Date: Wed, 25 Jan 2023 15:12:48 -0500 Subject: [PATCH 16/16] allow removing users from groups when refreshing permissions w/ burnettk --- spiffworkflow-backend/bpmn_json_67.json | 1 - spiffworkflow-backend/bpmn_json_67_2.json | 316 --------- spiffworkflow-backend/bpmn_json_68.json | 1 - spiffworkflow-backend/bpmn_json_68_2.json | 621 ------------------ .../services/authorization_service.py | 28 + .../unit/test_authorization_service.py | 47 +- 6 files changed, 72 insertions(+), 942 deletions(-) delete mode 100644 spiffworkflow-backend/bpmn_json_67.json delete mode 100644 spiffworkflow-backend/bpmn_json_67_2.json delete mode 100644 spiffworkflow-backend/bpmn_json_68.json delete mode 100644 spiffworkflow-backend/bpmn_json_68_2.json diff --git a/spiffworkflow-backend/bpmn_json_67.json b/spiffworkflow-backend/bpmn_json_67.json deleted file mode 100644 index 699d0af7..00000000 --- a/spiffworkflow-backend/bpmn_json_67.json +++ /dev/null @@ -1 +0,0 @@ -{"data": {"validate_only": false, "my_var_now": 2, "current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}, "last_task": "b6e341d6-4bc5-4ec0-a93e-9d2154bcf58f", "success": true, "tasks": {"8156eb2b-8edb-425b-a775-2bd37fd891af": {"id": "8156eb2b-8edb-425b-a775-2bd37fd891af", "parent": null, "children": ["d070c7f3-be9e-4f6e-b81a-7647ee6b7582"], "last_state_change": 1674674629.05859, "state": 32, "task_spec": "Root", "triggered": false, "workflow_name": "process_to_call", "internal_data": {}, "data": {}}, "d070c7f3-be9e-4f6e-b81a-7647ee6b7582": {"id": "d070c7f3-be9e-4f6e-b81a-7647ee6b7582", "parent": "8156eb2b-8edb-425b-a775-2bd37fd891af", "children": ["3e542841-075e-4e18-906e-4ac68168fda7"], "last_state_change": 1674674629.094655, "state": 32, "task_spec": "Start", "triggered": false, "workflow_name": "process_to_call", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}}}, "3e542841-075e-4e18-906e-4ac68168fda7": {"id": "3e542841-075e-4e18-906e-4ac68168fda7", "parent": "d070c7f3-be9e-4f6e-b81a-7647ee6b7582", "children": ["1685edde-09eb-4363-88b7-9b12f37ea1ef"], "last_state_change": 1674674629.1414993, "state": 32, "task_spec": "StartEvent_1", "triggered": false, "workflow_name": "process_to_call", "internal_data": {"event_fired": true}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}}}, "1685edde-09eb-4363-88b7-9b12f37ea1ef": {"id": "1685edde-09eb-4363-88b7-9b12f37ea1ef", "parent": "3e542841-075e-4e18-906e-4ac68168fda7", "children": ["380f4e01-bb6c-42e0-9ed8-e7a14f1bd756"], "last_state_change": 1674674629.1694856, "state": 32, "task_spec": "super_awesome_script", "triggered": false, "workflow_name": "process_to_call", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}, "380f4e01-bb6c-42e0-9ed8-e7a14f1bd756": {"id": "380f4e01-bb6c-42e0-9ed8-e7a14f1bd756", "parent": "1685edde-09eb-4363-88b7-9b12f37ea1ef", "children": ["f4846e08-8e5f-47db-87f0-41daacbd3e5b"], "last_state_change": 1674674629.2164488, "state": 32, "task_spec": "Event_08g7f08", "triggered": false, "workflow_name": "process_to_call", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}, "f4846e08-8e5f-47db-87f0-41daacbd3e5b": {"id": "f4846e08-8e5f-47db-87f0-41daacbd3e5b", "parent": "380f4e01-bb6c-42e0-9ed8-e7a14f1bd756", "children": ["b6e341d6-4bc5-4ec0-a93e-9d2154bcf58f"], "last_state_change": 1674674629.2567987, "state": 32, "task_spec": "process_to_call.EndJoin", "triggered": false, "workflow_name": "process_to_call", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}, "b6e341d6-4bc5-4ec0-a93e-9d2154bcf58f": {"id": "b6e341d6-4bc5-4ec0-a93e-9d2154bcf58f", "parent": "f4846e08-8e5f-47db-87f0-41daacbd3e5b", "children": [], "last_state_change": 1674674629.28801, "state": 32, "task_spec": "End", "triggered": false, "workflow_name": "process_to_call", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}}, "root": "8156eb2b-8edb-425b-a775-2bd37fd891af", "spec": {"name": "process_to_call", "description": "Process to call", "file": "callable_process.bpmn", "task_specs": {"Start": {"id": "process_to_call_1", "name": "Start", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": [], "outputs": ["StartEvent_1"], "typename": "StartTask"}, "process_to_call.EndJoin": {"id": "process_to_call_2", "name": "process_to_call.EndJoin", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": ["Event_08g7f08"], "outputs": ["End"], "typename": "_EndJoin"}, "End": {"id": "process_to_call_3", "name": "End", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": ["process_to_call.EndJoin"], "outputs": [], "typename": "Simple"}, "StartEvent_1": {"id": "process_to_call_4", "name": "StartEvent_1", "description": null, "manual": false, "internal": false, "lookahead": 2, "inputs": ["Start"], "outputs": ["super_awesome_script"], "lane": null, "documentation": null, "loopTask": false, "position": {"x": 179.0, "y": 159.0}, "data_input_associations": [], "data_output_associations": [], "event_definition": {"internal": false, "external": false, "typename": "NoneEventDefinition"}, "typename": "StartEvent", "extensions": {}}, "super_awesome_script": {"id": "process_to_call_5", "name": "super_awesome_script", "description": "Super Awesome Script", "manual": false, "internal": false, "lookahead": 2, "inputs": ["StartEvent_1"], "outputs": ["Event_08g7f08"], "lane": null, "documentation": null, "loopTask": false, "position": {"x": 380.0, "y": 137.0}, "data_input_associations": [], "data_output_associations": [{"name": "my_var_now", "description": "my_var_now", "typename": "BpmnDataSpecification"}], "prescript": null, "postscript": null, "script": "a = 1\nmy_var_now = 2", "typename": "ScriptTask", "extensions": {}}, "Event_08g7f08": {"id": "process_to_call_6", "name": "Event_08g7f08", "description": null, "manual": false, "internal": false, "lookahead": 2, "inputs": ["super_awesome_script"], "outputs": ["process_to_call.EndJoin"], "lane": null, "documentation": null, "loopTask": false, "position": {"x": 522.0, "y": 159.0}, "data_input_associations": [], "data_output_associations": [], "event_definition": {"internal": false, "external": false, "typename": "NoneEventDefinition"}, "typename": "EndEvent", "extensions": {}}, "Root": {"id": "process_to_call_7", "name": "Root", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": [], "outputs": [], "typename": "Simple"}}, "data_inputs": [], "data_outputs": [], "data_objects": {"my_var_now": {"name": "my_var_now", "description": "my_var_now", "typename": "BpmnDataSpecification"}}, "correlation_keys": {}, "typename": "BpmnProcessSpec"}, "subprocess_specs": {}, "subprocesses": {}, "bpmn_messages": [], "serializer_version": "1.0-spiffworkflow-backend"} \ No newline at end of file diff --git a/spiffworkflow-backend/bpmn_json_67_2.json b/spiffworkflow-backend/bpmn_json_67_2.json deleted file mode 100644 index 322a3408..00000000 --- a/spiffworkflow-backend/bpmn_json_67_2.json +++ /dev/null @@ -1,316 +0,0 @@ -{ - "data": { - "validate_only": false, - "my_var_now": 2, - "current_user": { - "username": "jason@sartography.com", - "id": "1" - }, - "a": 1 - }, - "last_task": "b6e341d6-4bc5-4ec0-a93e-9d2154bcf58f", - "success": true, - "tasks": { - "8156eb2b-8edb-425b-a775-2bd37fd891af": { - "id": "8156eb2b-8edb-425b-a775-2bd37fd891af", - "parent": null, - "children": [ - "d070c7f3-be9e-4f6e-b81a-7647ee6b7582" - ], - "last_state_change": 1674674629.05859, - "state": 32, - "task_spec": "Root", - "triggered": false, - "workflow_name": "process_to_call", - "internal_data": {}, - "data": {} - }, - "d070c7f3-be9e-4f6e-b81a-7647ee6b7582": { - "id": "d070c7f3-be9e-4f6e-b81a-7647ee6b7582", - "parent": "8156eb2b-8edb-425b-a775-2bd37fd891af", - "children": [ - "3e542841-075e-4e18-906e-4ac68168fda7" - ], - "last_state_change": 1674674629.094655, - "state": 32, - "task_spec": "Start", - "triggered": false, - "workflow_name": "process_to_call", - "internal_data": {}, - "data": { - "current_user": { - "username": "jason@sartography.com", - "id": "1" - } - } - }, - "3e542841-075e-4e18-906e-4ac68168fda7": { - "id": "3e542841-075e-4e18-906e-4ac68168fda7", - "parent": "d070c7f3-be9e-4f6e-b81a-7647ee6b7582", - "children": [ - "1685edde-09eb-4363-88b7-9b12f37ea1ef" - ], - "last_state_change": 1674674629.1414993, - "state": 32, - "task_spec": "StartEvent_1", - "triggered": false, - "workflow_name": "process_to_call", - "internal_data": { - "event_fired": true - }, - "data": { - "current_user": { - "username": "jason@sartography.com", - "id": "1" - } - } - }, - "1685edde-09eb-4363-88b7-9b12f37ea1ef": { - "id": "1685edde-09eb-4363-88b7-9b12f37ea1ef", - "parent": "3e542841-075e-4e18-906e-4ac68168fda7", - "children": [ - "380f4e01-bb6c-42e0-9ed8-e7a14f1bd756" - ], - "last_state_change": 1674674629.1694856, - "state": 32, - "task_spec": "super_awesome_script", - "triggered": false, - "workflow_name": "process_to_call", - "internal_data": {}, - "data": { - "current_user": { - "username": "jason@sartography.com", - "id": "1" - }, - "a": 1 - } - }, - "380f4e01-bb6c-42e0-9ed8-e7a14f1bd756": { - "id": "380f4e01-bb6c-42e0-9ed8-e7a14f1bd756", - "parent": "1685edde-09eb-4363-88b7-9b12f37ea1ef", - "children": [ - "f4846e08-8e5f-47db-87f0-41daacbd3e5b" - ], - "last_state_change": 1674674629.2164488, - "state": 32, - "task_spec": "Event_08g7f08", - "triggered": false, - "workflow_name": "process_to_call", - "internal_data": {}, - "data": { - "current_user": { - "username": "jason@sartography.com", - "id": "1" - }, - "a": 1 - } - }, - "f4846e08-8e5f-47db-87f0-41daacbd3e5b": { - "id": "f4846e08-8e5f-47db-87f0-41daacbd3e5b", - "parent": "380f4e01-bb6c-42e0-9ed8-e7a14f1bd756", - "children": [ - "b6e341d6-4bc5-4ec0-a93e-9d2154bcf58f" - ], - "last_state_change": 1674674629.2567987, - "state": 32, - "task_spec": "process_to_call.EndJoin", - "triggered": false, - "workflow_name": "process_to_call", - "internal_data": {}, - "data": { - "current_user": { - "username": "jason@sartography.com", - "id": "1" - }, - "a": 1 - } - }, - "b6e341d6-4bc5-4ec0-a93e-9d2154bcf58f": { - "id": "b6e341d6-4bc5-4ec0-a93e-9d2154bcf58f", - "parent": "f4846e08-8e5f-47db-87f0-41daacbd3e5b", - "children": [], - "last_state_change": 1674674629.28801, - "state": 32, - "task_spec": "End", - "triggered": false, - "workflow_name": "process_to_call", - "internal_data": {}, - "data": { - "current_user": { - "username": "jason@sartography.com", - "id": "1" - }, - "a": 1 - } - } - }, - "root": "8156eb2b-8edb-425b-a775-2bd37fd891af", - "spec": { - "name": "process_to_call", - "description": "Process to call", - "file": "callable_process.bpmn", - "task_specs": { - "Start": { - "id": "process_to_call_1", - "name": "Start", - "description": "", - "manual": false, - "internal": false, - "lookahead": 2, - "inputs": [], - "outputs": [ - "StartEvent_1" - ], - "typename": "StartTask" - }, - "process_to_call.EndJoin": { - "id": "process_to_call_2", - "name": "process_to_call.EndJoin", - "description": "", - "manual": false, - "internal": false, - "lookahead": 2, - "inputs": [ - "Event_08g7f08" - ], - "outputs": [ - "End" - ], - "typename": "_EndJoin" - }, - "End": { - "id": "process_to_call_3", - "name": "End", - "description": "", - "manual": false, - "internal": false, - "lookahead": 2, - "inputs": [ - "process_to_call.EndJoin" - ], - "outputs": [], - "typename": "Simple" - }, - "StartEvent_1": { - "id": "process_to_call_4", - "name": "StartEvent_1", - "description": null, - "manual": false, - "internal": false, - "lookahead": 2, - "inputs": [ - "Start" - ], - "outputs": [ - "super_awesome_script" - ], - "lane": null, - "documentation": null, - "loopTask": false, - "position": { - "x": 179, - "y": 159 - }, - "data_input_associations": [], - "data_output_associations": [], - "event_definition": { - "internal": false, - "external": false, - "typename": "NoneEventDefinition" - }, - "typename": "StartEvent", - "extensions": {} - }, - "super_awesome_script": { - "id": "process_to_call_5", - "name": "super_awesome_script", - "description": "Super Awesome Script", - "manual": false, - "internal": false, - "lookahead": 2, - "inputs": [ - "StartEvent_1" - ], - "outputs": [ - "Event_08g7f08" - ], - "lane": null, - "documentation": null, - "loopTask": false, - "position": { - "x": 380, - "y": 137 - }, - "data_input_associations": [], - "data_output_associations": [ - { - "name": "my_var_now", - "description": "my_var_now", - "typename": "BpmnDataSpecification" - } - ], - "prescript": null, - "postscript": null, - "script": "a = 1\nmy_var_now = 2", - "typename": "ScriptTask", - "extensions": {} - }, - "Event_08g7f08": { - "id": "process_to_call_6", - "name": "Event_08g7f08", - "description": null, - "manual": false, - "internal": false, - "lookahead": 2, - "inputs": [ - "super_awesome_script" - ], - "outputs": [ - "process_to_call.EndJoin" - ], - "lane": null, - "documentation": null, - "loopTask": false, - "position": { - "x": 522, - "y": 159 - }, - "data_input_associations": [], - "data_output_associations": [], - "event_definition": { - "internal": false, - "external": false, - "typename": "NoneEventDefinition" - }, - "typename": "EndEvent", - "extensions": {} - }, - "Root": { - "id": "process_to_call_7", - "name": "Root", - "description": "", - "manual": false, - "internal": false, - "lookahead": 2, - "inputs": [], - "outputs": [], - "typename": "Simple" - } - }, - "data_inputs": [], - "data_outputs": [], - "data_objects": { - "my_var_now": { - "name": "my_var_now", - "description": "my_var_now", - "typename": "BpmnDataSpecification" - } - }, - "correlation_keys": {}, - "typename": "BpmnProcessSpec" - }, - "subprocess_specs": {}, - "subprocesses": {}, - "bpmn_messages": [], - "serializer_version": "1.0-spiffworkflow-backend" -} diff --git a/spiffworkflow-backend/bpmn_json_68.json b/spiffworkflow-backend/bpmn_json_68.json deleted file mode 100644 index 011478be..00000000 --- a/spiffworkflow-backend/bpmn_json_68.json +++ /dev/null @@ -1 +0,0 @@ -{"data": {"validate_only": false, "current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}, "last_task": "9655e709-3600-43d0-a08d-bb52892333e9", "success": true, "tasks": {"a9495420-a98f-4574-86eb-57875fabd465": {"id": "a9495420-a98f-4574-86eb-57875fabd465", "parent": null, "children": ["6f4e2241-9268-40fb-8636-a6b5d511ade4"], "last_state_change": 1674674684.1271565, "state": 32, "task_spec": "Root", "triggered": false, "workflow_name": "Process_rmvgdyk", "internal_data": {}, "data": {}}, "6f4e2241-9268-40fb-8636-a6b5d511ade4": {"id": "6f4e2241-9268-40fb-8636-a6b5d511ade4", "parent": "a9495420-a98f-4574-86eb-57875fabd465", "children": ["4536669f-7896-46e0-9587-0243e0bf03fa"], "last_state_change": 1674674684.1695502, "state": 32, "task_spec": "Start", "triggered": false, "workflow_name": "Process_rmvgdyk", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}}}, "4536669f-7896-46e0-9587-0243e0bf03fa": {"id": "4536669f-7896-46e0-9587-0243e0bf03fa", "parent": "6f4e2241-9268-40fb-8636-a6b5d511ade4", "children": ["75ff9e01-4570-4ad5-bf87-537c15d67cd6"], "last_state_change": 1674674684.1987424, "state": 32, "task_spec": "StartEvent_1", "triggered": false, "workflow_name": "Process_rmvgdyk", "internal_data": {"event_fired": true}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}}}, "75ff9e01-4570-4ad5-bf87-537c15d67cd6": {"id": "75ff9e01-4570-4ad5-bf87-537c15d67cd6", "parent": "4536669f-7896-46e0-9587-0243e0bf03fa", "children": ["f0646cac-f127-491f-9d8d-7a88044af404"], "last_state_change": 1674674684.5499449, "state": 32, "task_spec": "call_one", "triggered": false, "workflow_name": "Process_rmvgdyk", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}, "f0646cac-f127-491f-9d8d-7a88044af404": {"id": "f0646cac-f127-491f-9d8d-7a88044af404", "parent": "75ff9e01-4570-4ad5-bf87-537c15d67cd6", "children": ["f25607a0-a3dd-4b08-876f-973cc5569b6a"], "last_state_change": 1674674684.5961928, "state": 32, "task_spec": "Event_0pq4nje", "triggered": false, "workflow_name": "Process_rmvgdyk", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}, "f25607a0-a3dd-4b08-876f-973cc5569b6a": {"id": "f25607a0-a3dd-4b08-876f-973cc5569b6a", "parent": "f0646cac-f127-491f-9d8d-7a88044af404", "children": ["9655e709-3600-43d0-a08d-bb52892333e9"], "last_state_change": 1674674684.6496456, "state": 32, "task_spec": "Process_rmvgdyk.EndJoin", "triggered": false, "workflow_name": "Process_rmvgdyk", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}, "9655e709-3600-43d0-a08d-bb52892333e9": {"id": "9655e709-3600-43d0-a08d-bb52892333e9", "parent": "f25607a0-a3dd-4b08-876f-973cc5569b6a", "children": [], "last_state_change": 1674674684.6751294, "state": 32, "task_spec": "End", "triggered": false, "workflow_name": "Process_rmvgdyk", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}}, "root": "a9495420-a98f-4574-86eb-57875fabd465", "spec": {"name": "Process_rmvgdyk", "description": "Process_rmvgdyk", "file": "start.bpmn", "task_specs": {"Start": {"id": "Process_rmvgdyk_1", "name": "Start", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": [], "outputs": ["StartEvent_1"], "typename": "StartTask"}, "Process_rmvgdyk.EndJoin": {"id": "Process_rmvgdyk_2", "name": "Process_rmvgdyk.EndJoin", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": ["Event_0pq4nje"], "outputs": ["End"], "typename": "_EndJoin"}, "End": {"id": "Process_rmvgdyk_3", "name": "End", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": ["Process_rmvgdyk.EndJoin"], "outputs": [], "typename": "Simple"}, "StartEvent_1": {"id": "Process_rmvgdyk_4", "name": "StartEvent_1", "description": null, "manual": false, "internal": false, "lookahead": 2, "inputs": ["Start"], "outputs": ["call_one"], "lane": null, "documentation": null, "loopTask": false, "position": {"x": 179.0, "y": 159.0}, "data_input_associations": [], "data_output_associations": [], "event_definition": {"internal": false, "external": false, "typename": "NoneEventDefinition"}, "typename": "StartEvent", "extensions": {}}, "call_one": {"id": "Process_rmvgdyk_5", "name": "call_one", "description": "Call One", "manual": false, "internal": false, "lookahead": 2, "inputs": ["StartEvent_1"], "outputs": ["Event_0pq4nje"], "lane": null, "documentation": null, "loopTask": false, "position": {"x": 270.0, "y": 137.0}, "data_input_associations": [], "data_output_associations": [], "prescript": "a = 1", "postscript": null, "spec": "process_to_call", "typename": "CallActivity", "extensions": {"preScript": "a = 1"}}, "Event_0pq4nje": {"id": "Process_rmvgdyk_6", "name": "Event_0pq4nje", "description": null, "manual": false, "internal": false, "lookahead": 2, "inputs": ["call_one"], "outputs": ["Process_rmvgdyk.EndJoin"], "lane": null, "documentation": null, "loopTask": false, "position": {"x": 912.0, "y": 159.0}, "data_input_associations": [], "data_output_associations": [], "event_definition": {"internal": false, "external": false, "typename": "NoneEventDefinition"}, "typename": "EndEvent", "extensions": {}}, "Root": {"id": "Process_rmvgdyk_7", "name": "Root", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": [], "outputs": [], "typename": "Simple"}}, "data_inputs": [], "data_outputs": [], "data_objects": {}, "correlation_keys": {}, "typename": "BpmnProcessSpec"}, "subprocess_specs": {"process_to_call": {"name": "process_to_call", "description": "Process to call", "file": "/home/jason/projects/github/sartography/sample-process-models/misc/category_number_one/call-activity/callable_process.bpmn", "task_specs": {"Start": {"id": "process_to_call_1", "name": "Start", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": [], "outputs": ["StartEvent_1"], "typename": "StartTask"}, "process_to_call.EndJoin": {"id": "process_to_call_2", "name": "process_to_call.EndJoin", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": ["Event_08g7f08"], "outputs": ["End"], "typename": "_EndJoin"}, "End": {"id": "process_to_call_3", "name": "End", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": ["process_to_call.EndJoin"], "outputs": [], "typename": "Simple"}, "StartEvent_1": {"id": "process_to_call_4", "name": "StartEvent_1", "description": null, "manual": false, "internal": false, "lookahead": 2, "inputs": ["Start"], "outputs": ["super_awesome_script"], "lane": null, "documentation": null, "loopTask": false, "position": {"x": 179.0, "y": 159.0}, "data_input_associations": [], "data_output_associations": [], "event_definition": {"internal": false, "external": false, "typename": "NoneEventDefinition"}, "typename": "StartEvent", "extensions": {}}, "super_awesome_script": {"id": "process_to_call_5", "name": "super_awesome_script", "description": "Super Awesome Script", "manual": false, "internal": false, "lookahead": 2, "inputs": ["StartEvent_1"], "outputs": ["Event_08g7f08"], "lane": null, "documentation": null, "loopTask": false, "position": {"x": 380.0, "y": 137.0}, "data_input_associations": [], "data_output_associations": [{"name": "my_var_now", "description": "my_var_now", "typename": "BpmnDataSpecification"}], "prescript": null, "postscript": null, "script": "a = 1\nmy_var_now = 2", "typename": "ScriptTask", "extensions": {}}, "Event_08g7f08": {"id": "process_to_call_6", "name": "Event_08g7f08", "description": null, "manual": false, "internal": false, "lookahead": 2, "inputs": ["super_awesome_script"], "outputs": ["process_to_call.EndJoin"], "lane": null, "documentation": null, "loopTask": false, "position": {"x": 522.0, "y": 159.0}, "data_input_associations": [], "data_output_associations": [], "event_definition": {"internal": false, "external": false, "typename": "NoneEventDefinition"}, "typename": "EndEvent", "extensions": {}}, "Root": {"id": "process_to_call_7", "name": "Root", "description": "", "manual": false, "internal": false, "lookahead": 2, "inputs": [], "outputs": [], "typename": "Simple"}}, "data_inputs": [], "data_outputs": [], "data_objects": {"my_var_now": {"name": "my_var_now", "description": "my_var_now", "typename": "BpmnDataSpecification"}}, "correlation_keys": {}, "typename": "BpmnProcessSpec"}}, "subprocesses": {"75ff9e01-4570-4ad5-bf87-537c15d67cd6": {"data": {"validate_only": false, "my_var_now": 2, "current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}, "last_task": "188eb6c3-d7c5-4900-b690-9cbb92ef2b19", "success": true, "tasks": {"a296c968-f6cb-42f2-a4b1-1268aca41c5d": {"id": "a296c968-f6cb-42f2-a4b1-1268aca41c5d", "parent": null, "children": ["8b4a92af-104b-4e78-9008-b690fbe7f560"], "last_state_change": 1674674684.2170289, "state": 32, "task_spec": "Root", "triggered": false, "workflow_name": "call_one", "internal_data": {}, "data": {}}, "8b4a92af-104b-4e78-9008-b690fbe7f560": {"id": "8b4a92af-104b-4e78-9008-b690fbe7f560", "parent": "a296c968-f6cb-42f2-a4b1-1268aca41c5d", "children": ["7ec77604-d1b9-4be3-a9aa-2eef295be9d2"], "last_state_change": 1674674684.2541206, "state": 32, "task_spec": "Start", "triggered": false, "workflow_name": "call_one", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}, "7ec77604-d1b9-4be3-a9aa-2eef295be9d2": {"id": "7ec77604-d1b9-4be3-a9aa-2eef295be9d2", "parent": "8b4a92af-104b-4e78-9008-b690fbe7f560", "children": ["305310bd-9425-46af-ba78-90f3dae283e3"], "last_state_change": 1674674684.2768772, "state": 32, "task_spec": "StartEvent_1", "triggered": false, "workflow_name": "call_one", "internal_data": {"event_fired": true}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}, "305310bd-9425-46af-ba78-90f3dae283e3": {"id": "305310bd-9425-46af-ba78-90f3dae283e3", "parent": "7ec77604-d1b9-4be3-a9aa-2eef295be9d2", "children": ["cb25e1f8-c570-4af3-b8eb-be57746cd765"], "last_state_change": 1674674684.322075, "state": 32, "task_spec": "super_awesome_script", "triggered": false, "workflow_name": "call_one", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}, "cb25e1f8-c570-4af3-b8eb-be57746cd765": {"id": "cb25e1f8-c570-4af3-b8eb-be57746cd765", "parent": "305310bd-9425-46af-ba78-90f3dae283e3", "children": ["bbfc1793-787b-417b-8089-9bb194ae4034"], "last_state_change": 1674674684.3872745, "state": 32, "task_spec": "Event_08g7f08", "triggered": false, "workflow_name": "call_one", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}, "bbfc1793-787b-417b-8089-9bb194ae4034": {"id": "bbfc1793-787b-417b-8089-9bb194ae4034", "parent": "cb25e1f8-c570-4af3-b8eb-be57746cd765", "children": ["188eb6c3-d7c5-4900-b690-9cbb92ef2b19"], "last_state_change": 1674674684.4518044, "state": 32, "task_spec": "process_to_call.EndJoin", "triggered": false, "workflow_name": "call_one", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}, "188eb6c3-d7c5-4900-b690-9cbb92ef2b19": {"id": "188eb6c3-d7c5-4900-b690-9cbb92ef2b19", "parent": "bbfc1793-787b-417b-8089-9bb194ae4034", "children": [], "last_state_change": 1674674684.500384, "state": 32, "task_spec": "End", "triggered": false, "workflow_name": "call_one", "internal_data": {}, "data": {"current_user": {"username": "jason@sartography.com", "id": "1"}, "a": 1}}}, "root": "a296c968-f6cb-42f2-a4b1-1268aca41c5d"}}, "bpmn_messages": [], "serializer_version": "1.0-spiffworkflow-backend"} \ No newline at end of file diff --git a/spiffworkflow-backend/bpmn_json_68_2.json b/spiffworkflow-backend/bpmn_json_68_2.json deleted file mode 100644 index 984cf7d5..00000000 --- a/spiffworkflow-backend/bpmn_json_68_2.json +++ /dev/null @@ -1,621 +0,0 @@ -{ - "data": { - "validate_only": false, - "current_user": { - "username": "jason@sartography.com", - "id": "1" - }, - "a": 1 - }, - "last_task": "9655e709-3600-43d0-a08d-bb52892333e9", - "success": true, - "tasks": { - "a9495420-a98f-4574-86eb-57875fabd465": { - "id": "a9495420-a98f-4574-86eb-57875fabd465", - "parent": null, - "children": [ - "6f4e2241-9268-40fb-8636-a6b5d511ade4" - ], - "last_state_change": 1674674684.1271565, - "state": 32, - "task_spec": "Root", - "triggered": false, - "workflow_name": "Process_rmvgdyk", - "internal_data": {}, - "data": {} - }, - "6f4e2241-9268-40fb-8636-a6b5d511ade4": { - "id": "6f4e2241-9268-40fb-8636-a6b5d511ade4", - "parent": "a9495420-a98f-4574-86eb-57875fabd465", - "children": [ - "4536669f-7896-46e0-9587-0243e0bf03fa" - ], - "last_state_change": 1674674684.1695502, - "state": 32, - "task_spec": "Start", - "triggered": false, - "workflow_name": "Process_rmvgdyk", - "internal_data": {}, - "data": { - "current_user": { - "username": "jason@sartography.com", - "id": "1" - } - } - }, - "4536669f-7896-46e0-9587-0243e0bf03fa": { - "id": "4536669f-7896-46e0-9587-0243e0bf03fa", - "parent": "6f4e2241-9268-40fb-8636-a6b5d511ade4", - "children": [ - "75ff9e01-4570-4ad5-bf87-537c15d67cd6" - ], - "last_state_change": 1674674684.1987424, - "state": 32, - "task_spec": "StartEvent_1", - "triggered": false, - "workflow_name": "Process_rmvgdyk", - "internal_data": { - "event_fired": true - }, - "data": { - "current_user": { - "username": "jason@sartography.com", - "id": "1" - } - } - }, - "75ff9e01-4570-4ad5-bf87-537c15d67cd6": { - "id": "75ff9e01-4570-4ad5-bf87-537c15d67cd6", - "parent": "4536669f-7896-46e0-9587-0243e0bf03fa", - "children": [ - "f0646cac-f127-491f-9d8d-7a88044af404" - ], - "last_state_change": 1674674684.5499449, - "state": 32, - "task_spec": "call_one", - "triggered": false, - "workflow_name": "Process_rmvgdyk", - "internal_data": {}, - "data": { - "current_user": { - "username": "jason@sartography.com", - "id": "1" - }, - "a": 1 - } - }, - "f0646cac-f127-491f-9d8d-7a88044af404": { - "id": "f0646cac-f127-491f-9d8d-7a88044af404", - "parent": "75ff9e01-4570-4ad5-bf87-537c15d67cd6", - "children": [ - "f25607a0-a3dd-4b08-876f-973cc5569b6a" - ], - "last_state_change": 1674674684.5961928, - "state": 32, - "task_spec": "Event_0pq4nje", - "triggered": false, - "workflow_name": "Process_rmvgdyk", - "internal_data": {}, - "data": { - "current_user": { - "username": "jason@sartography.com", - "id": "1" - }, - "a": 1 - } - }, - "f25607a0-a3dd-4b08-876f-973cc5569b6a": { - "id": "f25607a0-a3dd-4b08-876f-973cc5569b6a", - "parent": "f0646cac-f127-491f-9d8d-7a88044af404", - "children": [ - "9655e709-3600-43d0-a08d-bb52892333e9" - ], - "last_state_change": 1674674684.6496456, - "state": 32, - "task_spec": "Process_rmvgdyk.EndJoin", - "triggered": false, - "workflow_name": "Process_rmvgdyk", - "internal_data": {}, - "data": { - "current_user": { - "username": "jason@sartography.com", - "id": "1" - }, - "a": 1 - } - }, - "9655e709-3600-43d0-a08d-bb52892333e9": { - "id": "9655e709-3600-43d0-a08d-bb52892333e9", - "parent": "f25607a0-a3dd-4b08-876f-973cc5569b6a", - "children": [], - "last_state_change": 1674674684.6751294, - "state": 32, - "task_spec": "End", - "triggered": false, - "workflow_name": "Process_rmvgdyk", - "internal_data": {}, - "data": { - "current_user": { - "username": "jason@sartography.com", - "id": "1" - }, - "a": 1 - } - } - }, - "root": "a9495420-a98f-4574-86eb-57875fabd465", - "spec": { - "name": "Process_rmvgdyk", - "description": "Process_rmvgdyk", - "file": "start.bpmn", - "task_specs": { - "Start": { - "id": "Process_rmvgdyk_1", - "name": "Start", - "description": "", - "manual": false, - "internal": false, - "lookahead": 2, - "inputs": [], - "outputs": [ - "StartEvent_1" - ], - "typename": "StartTask" - }, - "Process_rmvgdyk.EndJoin": { - "id": "Process_rmvgdyk_2", - "name": "Process_rmvgdyk.EndJoin", - "description": "", - "manual": false, - "internal": false, - "lookahead": 2, - "inputs": [ - "Event_0pq4nje" - ], - "outputs": [ - "End" - ], - "typename": "_EndJoin" - }, - "End": { - "id": "Process_rmvgdyk_3", - "name": "End", - "description": "", - "manual": false, - "internal": false, - "lookahead": 2, - "inputs": [ - "Process_rmvgdyk.EndJoin" - ], - "outputs": [], - "typename": "Simple" - }, - "StartEvent_1": { - "id": "Process_rmvgdyk_4", - "name": "StartEvent_1", - "description": null, - "manual": false, - "internal": false, - "lookahead": 2, - "inputs": [ - "Start" - ], - "outputs": [ - "call_one" - ], - "lane": null, - "documentation": null, - "loopTask": false, - "position": { - "x": 179, - "y": 159 - }, - "data_input_associations": [], - "data_output_associations": [], - "event_definition": { - "internal": false, - "external": false, - "typename": "NoneEventDefinition" - }, - "typename": "StartEvent", - "extensions": {} - }, - "call_one": { - "id": "Process_rmvgdyk_5", - "name": "call_one", - "description": "Call One", - "manual": false, - "internal": false, - "lookahead": 2, - "inputs": [ - "StartEvent_1" - ], - "outputs": [ - "Event_0pq4nje" - ], - "lane": null, - "documentation": null, - "loopTask": false, - "position": { - "x": 270, - "y": 137 - }, - "data_input_associations": [], - "data_output_associations": [], - "prescript": "a = 1", - "postscript": null, - "spec": "process_to_call", - "typename": "CallActivity", - "extensions": { - "preScript": "a = 1" - } - }, - "Event_0pq4nje": { - "id": "Process_rmvgdyk_6", - "name": "Event_0pq4nje", - "description": null, - "manual": false, - "internal": false, - "lookahead": 2, - "inputs": [ - "call_one" - ], - "outputs": [ - "Process_rmvgdyk.EndJoin" - ], - "lane": null, - "documentation": null, - "loopTask": false, - "position": { - "x": 912, - "y": 159 - }, - "data_input_associations": [], - "data_output_associations": [], - "event_definition": { - "internal": false, - "external": false, - "typename": "NoneEventDefinition" - }, - "typename": "EndEvent", - "extensions": {} - }, - "Root": { - "id": "Process_rmvgdyk_7", - "name": "Root", - "description": "", - "manual": false, - "internal": false, - "lookahead": 2, - "inputs": [], - "outputs": [], - "typename": "Simple" - } - }, - "data_inputs": [], - "data_outputs": [], - "data_objects": {}, - "correlation_keys": {}, - "typename": "BpmnProcessSpec" - }, - "subprocess_specs": { - "process_to_call": { - "name": "process_to_call", - "description": "Process to call", - "file": "/home/jason/projects/github/sartography/sample-process-models/misc/category_number_one/call-activity/callable_process.bpmn", - "task_specs": { - "Start": { - "id": "process_to_call_1", - "name": "Start", - "description": "", - "manual": false, - "internal": false, - "lookahead": 2, - "inputs": [], - "outputs": [ - "StartEvent_1" - ], - "typename": "StartTask" - }, - "process_to_call.EndJoin": { - "id": "process_to_call_2", - "name": "process_to_call.EndJoin", - "description": "", - "manual": false, - "internal": false, - "lookahead": 2, - "inputs": [ - "Event_08g7f08" - ], - "outputs": [ - "End" - ], - "typename": "_EndJoin" - }, - "End": { - "id": "process_to_call_3", - "name": "End", - "description": "", - "manual": false, - "internal": false, - "lookahead": 2, - "inputs": [ - "process_to_call.EndJoin" - ], - "outputs": [], - "typename": "Simple" - }, - "StartEvent_1": { - "id": "process_to_call_4", - "name": "StartEvent_1", - "description": null, - "manual": false, - "internal": false, - "lookahead": 2, - "inputs": [ - "Start" - ], - "outputs": [ - "super_awesome_script" - ], - "lane": null, - "documentation": null, - "loopTask": false, - "position": { - "x": 179, - "y": 159 - }, - "data_input_associations": [], - "data_output_associations": [], - "event_definition": { - "internal": false, - "external": false, - "typename": "NoneEventDefinition" - }, - "typename": "StartEvent", - "extensions": {} - }, - "super_awesome_script": { - "id": "process_to_call_5", - "name": "super_awesome_script", - "description": "Super Awesome Script", - "manual": false, - "internal": false, - "lookahead": 2, - "inputs": [ - "StartEvent_1" - ], - "outputs": [ - "Event_08g7f08" - ], - "lane": null, - "documentation": null, - "loopTask": false, - "position": { - "x": 380, - "y": 137 - }, - "data_input_associations": [], - "data_output_associations": [ - { - "name": "my_var_now", - "description": "my_var_now", - "typename": "BpmnDataSpecification" - } - ], - "prescript": null, - "postscript": null, - "script": "a = 1\nmy_var_now = 2", - "typename": "ScriptTask", - "extensions": {} - }, - "Event_08g7f08": { - "id": "process_to_call_6", - "name": "Event_08g7f08", - "description": null, - "manual": false, - "internal": false, - "lookahead": 2, - "inputs": [ - "super_awesome_script" - ], - "outputs": [ - "process_to_call.EndJoin" - ], - "lane": null, - "documentation": null, - "loopTask": false, - "position": { - "x": 522, - "y": 159 - }, - "data_input_associations": [], - "data_output_associations": [], - "event_definition": { - "internal": false, - "external": false, - "typename": "NoneEventDefinition" - }, - "typename": "EndEvent", - "extensions": {} - }, - "Root": { - "id": "process_to_call_7", - "name": "Root", - "description": "", - "manual": false, - "internal": false, - "lookahead": 2, - "inputs": [], - "outputs": [], - "typename": "Simple" - } - }, - "data_inputs": [], - "data_outputs": [], - "data_objects": { - "my_var_now": { - "name": "my_var_now", - "description": "my_var_now", - "typename": "BpmnDataSpecification" - } - }, - "correlation_keys": {}, - "typename": "BpmnProcessSpec" - } - }, - "subprocesses": { - "75ff9e01-4570-4ad5-bf87-537c15d67cd6": { - "data": { - "validate_only": false, - "my_var_now": 2, - "current_user": { - "username": "jason@sartography.com", - "id": "1" - }, - "a": 1 - }, - "last_task": "188eb6c3-d7c5-4900-b690-9cbb92ef2b19", - "success": true, - "tasks": { - "a296c968-f6cb-42f2-a4b1-1268aca41c5d": { - "id": "a296c968-f6cb-42f2-a4b1-1268aca41c5d", - "parent": null, - "children": [ - "8b4a92af-104b-4e78-9008-b690fbe7f560" - ], - "last_state_change": 1674674684.2170289, - "state": 32, - "task_spec": "Root", - "triggered": false, - "workflow_name": "call_one", - "internal_data": {}, - "data": {} - }, - "8b4a92af-104b-4e78-9008-b690fbe7f560": { - "id": "8b4a92af-104b-4e78-9008-b690fbe7f560", - "parent": "a296c968-f6cb-42f2-a4b1-1268aca41c5d", - "children": [ - "7ec77604-d1b9-4be3-a9aa-2eef295be9d2" - ], - "last_state_change": 1674674684.2541206, - "state": 32, - "task_spec": "Start", - "triggered": false, - "workflow_name": "call_one", - "internal_data": {}, - "data": { - "current_user": { - "username": "jason@sartography.com", - "id": "1" - }, - "a": 1 - } - }, - "7ec77604-d1b9-4be3-a9aa-2eef295be9d2": { - "id": "7ec77604-d1b9-4be3-a9aa-2eef295be9d2", - "parent": "8b4a92af-104b-4e78-9008-b690fbe7f560", - "children": [ - "305310bd-9425-46af-ba78-90f3dae283e3" - ], - "last_state_change": 1674674684.2768772, - "state": 32, - "task_spec": "StartEvent_1", - "triggered": false, - "workflow_name": "call_one", - "internal_data": { - "event_fired": true - }, - "data": { - "current_user": { - "username": "jason@sartography.com", - "id": "1" - }, - "a": 1 - } - }, - "305310bd-9425-46af-ba78-90f3dae283e3": { - "id": "305310bd-9425-46af-ba78-90f3dae283e3", - "parent": "7ec77604-d1b9-4be3-a9aa-2eef295be9d2", - "children": [ - "cb25e1f8-c570-4af3-b8eb-be57746cd765" - ], - "last_state_change": 1674674684.322075, - "state": 32, - "task_spec": "super_awesome_script", - "triggered": false, - "workflow_name": "call_one", - "internal_data": {}, - "data": { - "current_user": { - "username": "jason@sartography.com", - "id": "1" - }, - "a": 1 - } - }, - "cb25e1f8-c570-4af3-b8eb-be57746cd765": { - "id": "cb25e1f8-c570-4af3-b8eb-be57746cd765", - "parent": "305310bd-9425-46af-ba78-90f3dae283e3", - "children": [ - "bbfc1793-787b-417b-8089-9bb194ae4034" - ], - "last_state_change": 1674674684.3872745, - "state": 32, - "task_spec": "Event_08g7f08", - "triggered": false, - "workflow_name": "call_one", - "internal_data": {}, - "data": { - "current_user": { - "username": "jason@sartography.com", - "id": "1" - }, - "a": 1 - } - }, - "bbfc1793-787b-417b-8089-9bb194ae4034": { - "id": "bbfc1793-787b-417b-8089-9bb194ae4034", - "parent": "cb25e1f8-c570-4af3-b8eb-be57746cd765", - "children": [ - "188eb6c3-d7c5-4900-b690-9cbb92ef2b19" - ], - "last_state_change": 1674674684.4518044, - "state": 32, - "task_spec": "process_to_call.EndJoin", - "triggered": false, - "workflow_name": "call_one", - "internal_data": {}, - "data": { - "current_user": { - "username": "jason@sartography.com", - "id": "1" - }, - "a": 1 - } - }, - "188eb6c3-d7c5-4900-b690-9cbb92ef2b19": { - "id": "188eb6c3-d7c5-4900-b690-9cbb92ef2b19", - "parent": "bbfc1793-787b-417b-8089-9bb194ae4034", - "children": [], - "last_state_change": 1674674684.500384, - "state": 32, - "task_spec": "End", - "triggered": false, - "workflow_name": "call_one", - "internal_data": {}, - "data": { - "current_user": { - "username": "jason@sartography.com", - "id": "1" - }, - "a": 1 - } - } - }, - "root": "a296c968-f6cb-42f2-a4b1-1268aca41c5d" - } - }, - "bpmn_messages": [], - "serializer_version": "1.0-spiffworkflow-backend" -} diff --git a/spiffworkflow-backend/src/spiffworkflow_backend/services/authorization_service.py b/spiffworkflow-backend/src/spiffworkflow_backend/services/authorization_service.py index 4b17f5ad..793a3f9b 100644 --- a/spiffworkflow-backend/src/spiffworkflow_backend/services/authorization_service.py +++ b/spiffworkflow-backend/src/spiffworkflow_backend/services/authorization_service.py @@ -77,11 +77,17 @@ PATH_SEGMENTS_FOR_PERMISSION_ALL = [ ] +class UserToGroupDict(TypedDict): + username: str + group_identifier: str + + class DesiredPermissionDict(TypedDict): """DesiredPermissionDict.""" group_identifiers: Set[str] permission_assignments: list[PermissionAssignmentModel] + user_to_group_identifiers: list[UserToGroupDict] class AuthorizationService: @@ -212,6 +218,7 @@ class AuthorizationService: default_group = None unique_user_group_identifiers: Set[str] = set() + user_to_group_identifiers: list[UserToGroupDict] = [] if "default_group" in permission_configs: default_group_identifier = permission_configs["default_group"] default_group = GroupService.find_or_create_group(default_group_identifier) @@ -231,6 +238,11 @@ class AuthorizationService: ) ) continue + user_to_group_dict: UserToGroupDict = { + "username": user.username, + "group_identifier": group_identifier, + } + user_to_group_identifiers.append(user_to_group_dict) cls.associate_user_with_group(user, group) permission_assignments = [] @@ -275,6 +287,7 @@ class AuthorizationService: return { "group_identifiers": unique_user_group_identifiers, "permission_assignments": permission_assignments, + "user_to_group_identifiers": user_to_group_identifiers, } @classmethod @@ -735,13 +748,20 @@ class AuthorizationService: def refresh_permissions(cls, group_info: list[dict[str, Any]]) -> None: """Adds new permission assignments and deletes old ones.""" initial_permission_assignments = PermissionAssignmentModel.query.all() + initial_user_to_group_assignments = UserGroupAssignmentModel.query.all() result = cls.import_permissions_from_yaml_file() desired_permission_assignments = result["permission_assignments"] desired_group_identifiers = result["group_identifiers"] + desired_user_to_group_identifiers = result["user_to_group_identifiers"] for group in group_info: group_identifier = group["name"] for username in group["users"]: + user_to_group_dict: UserToGroupDict = { + "username": username, + "group_identifier": group_identifier, + } + desired_user_to_group_identifiers.append(user_to_group_dict) GroupService.add_user_to_group_or_add_to_waiting( username, group_identifier ) @@ -761,6 +781,14 @@ class AuthorizationService: if ipa not in desired_permission_assignments: db.session.delete(ipa) + for iutga in initial_user_to_group_assignments: + current_user_dict: UserToGroupDict = { + "username": iutga.user.username, + "group_identifier": iutga.group.identifier, + } + if current_user_dict not in desired_user_to_group_identifiers: + db.session.delete(iutga) + groups_to_delete = GroupModel.query.filter( GroupModel.identifier.not_in(desired_group_identifiers) ).all() diff --git a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_authorization_service.py b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_authorization_service.py index 9e7af5d0..2736693e 100644 --- a/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_authorization_service.py +++ b/spiffworkflow-backend/tests/spiffworkflow_backend/unit/test_authorization_service.py @@ -381,18 +381,27 @@ class TestAuthorizationService(BaseTest): ) -> None: """Test_can_refresh_permissions.""" user = self.find_or_create_user(username="user_one") + user_two = self.find_or_create_user(username="user_two") admin_user = self.find_or_create_user(username="testadmin1") # this group is not mentioned so it will get deleted GroupService.find_or_create_group("group_two") assert GroupModel.query.filter_by(identifier="group_two").first() is not None + GroupService.find_or_create_group("group_three") + assert GroupModel.query.filter_by(identifier="group_three").first() is not None + group_info = [ { - "users": ["user_one"], + "users": ["user_one", "user_two"], "name": "group_one", "permissions": [{"actions": ["create", "read"], "uri": "PG:hey"}], - } + }, + { + "users": ["user_two"], + "name": "group_three", + "permissions": [{"actions": ["create", "read"], "uri": "PG:hey2"}], + }, ] AuthorizationService.refresh_permissions(group_info) assert GroupModel.query.filter_by(identifier="group_two").first() is None @@ -402,12 +411,32 @@ class TestAuthorizationService(BaseTest): self.assert_user_has_permission(user, "read", "/v1.0/process-groups/hey:yo") self.assert_user_has_permission(user, "create", "/v1.0/process-groups/hey:yo") + self.assert_user_has_permission(user_two, "read", "/v1.0/process-groups/hey") + self.assert_user_has_permission(user_two, "read", "/v1.0/process-groups/hey:yo") + self.assert_user_has_permission( + user_two, "create", "/v1.0/process-groups/hey:yo" + ) + assert GroupModel.query.filter_by(identifier="group_three").first() is not None + self.assert_user_has_permission(user_two, "read", "/v1.0/process-groups/hey2") + self.assert_user_has_permission( + user_two, "read", "/v1.0/process-groups/hey2:yo" + ) + self.assert_user_has_permission( + user_two, "create", "/v1.0/process-groups/hey2:yo" + ) + + # remove access to 'hey' from user_two group_info = [ { "users": ["user_one"], "name": "group_one", "permissions": [{"actions": ["read"], "uri": "PG:hey"}], - } + }, + { + "users": ["user_two"], + "name": "group_three", + "permissions": [{"actions": ["create", "read"], "uri": "PG:hey2"}], + }, ] AuthorizationService.refresh_permissions(group_info) assert GroupModel.query.filter_by(identifier="group_one").first() is not None @@ -417,3 +446,15 @@ class TestAuthorizationService(BaseTest): user, "create", "/v1.0/process-groups/hey:yo", expected_result=False ) self.assert_user_has_permission(admin_user, "create", "/anything-they-want") + + self.assert_user_has_permission( + user_two, "read", "/v1.0/process-groups/hey", expected_result=False + ) + assert GroupModel.query.filter_by(identifier="group_three").first() is not None + self.assert_user_has_permission(user_two, "read", "/v1.0/process-groups/hey2") + self.assert_user_has_permission( + user_two, "read", "/v1.0/process-groups/hey2:yo" + ) + self.assert_user_has_permission( + user_two, "create", "/v1.0/process-groups/hey2:yo" + )