diff --git a/.github/workflows/ci-client.yml b/.github/workflows/ci-client.yml index 110f7f2d0..9671e14c7 100644 --- a/.github/workflows/ci-client.yml +++ b/.github/workflows/ci-client.yml @@ -19,3 +19,22 @@ jobs: - run: npm ci - run: npm run test - run: npm run lint + + extension: + runs-on: ubuntu-latest + strategy: + matrix: + node-version: [14.x] + steps: + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 + with: + node-version: ${{ matrix.node-version }} + cache: npm + - run: npm ci + - name: install + working-directory: client/planning-extension + run: npm ci + - name: compile + working-directory: client/planning-extension + run: npm run compile diff --git a/README.md b/README.md index 0c12b9e8e..4940dfebf 100644 --- a/README.md +++ b/README.md @@ -204,6 +204,9 @@ Below sections include the config options that can be defined in settings.py. * PLANNING_JSON_ASSIGNED_INFO_EXTENDED * Defaults to `false` * If `true`, it will add to planning JSON output additional info for coverages like assigned desk name/email and assigned user name/email. +* ASSIGNMENT_MANUAL_REASSIGNMENT_ONLY + * Default: False (preserves the current behavior where automatic user assignment occurs) + * If true, Disables automatic user assignment for coverage, ensuring that assignments are updated only through explicit manual reassignment ### Authoring Config * PLANNING_CHECK_FOR_ASSIGNMENT_ON_PUBLISH diff --git a/client/apps/Planning/PlanningListSubNav.tsx b/client/apps/Planning/PlanningListSubNav.tsx index 479cf9252..e14ed57bb 100644 --- a/client/apps/Planning/PlanningListSubNav.tsx +++ b/client/apps/Planning/PlanningListSubNav.tsx @@ -183,7 +183,7 @@ class PlanningListSubNavComponent extends React.Component { return (
- + diff --git a/client/apps/Planning/PlanningSubNav.tsx b/client/apps/Planning/PlanningSubNav.tsx index 46a816ecc..ae609efd6 100644 --- a/client/apps/Planning/PlanningSubNav.tsx +++ b/client/apps/Planning/PlanningSubNav.tsx @@ -86,7 +86,7 @@ export class PlanningSubNavComponent extends React.PureComponent { {this.props.withArchiveItem !== true ? null : ( )} - + { privileges={this.props.privileges} /> - + + {!showDeskSelection ? ( diff --git a/client/components/Assignments/SubNavBar.tsx b/client/components/Assignments/SubNavBar.tsx index b97a43acd..e70103e59 100644 --- a/client/components/Assignments/SubNavBar.tsx +++ b/client/components/Assignments/SubNavBar.tsx @@ -44,7 +44,7 @@ export class SubNavBar extends React.PureComponent { const {gettext} = superdeskApi.localization; return ( - + {assignmentListSingleGroupView && ( { 'schema.required': {enabled: !(this.props.disableRequired || this.props.systemRequired)}, 'schema.read_only': {enabled: this.props.item.name === 'related_plannings'}, 'schema.planning_auto_publish': {enabled: this.props.item.name === 'related_plannings'}, + 'schema.cancel_plan_with_event': {enabled: this.props.item.name === 'related_plannings'}, 'schema.field_type': {enabled: fieldType != null}, 'schema.minlength': {enabled: !disableMinMax}, 'schema.maxlength': {enabled: !disableMinMax}, @@ -190,6 +191,7 @@ export class FieldEditor extends React.Component { 'schema.languages': {enabled: true, index: 12}, 'schema.default_language': {enabled: true, index: 13}, 'schema.planning_auto_publish': {enabled: true, index: 14}, + 'schema.cancel_plan_with_event': {enabled: true, index: 14}, 'schema.default_value': {enabled: true, index: 11}, }, { diff --git a/client/components/Coverages/CoverageIcons.tsx b/client/components/Coverages/CoverageIcons.tsx index 222465275..5b308b954 100644 --- a/client/components/Coverages/CoverageIcons.tsx +++ b/client/components/Coverages/CoverageIcons.tsx @@ -97,7 +97,6 @@ export class CoverageIcons extends React.PureComponent { return ( (
diff --git a/client/components/Events/EventItem.tsx b/client/components/Events/EventItem.tsx index 0d64a688c..98a27e545 100644 --- a/client/components/Events/EventItem.tsx +++ b/client/components/Events/EventItem.tsx @@ -118,7 +118,7 @@ class EventItemComponent extends React.Component { return (
- + { (toggle) => (
{ return (
- + { (toggle) => (
cal1.label.localeCompare(cal2.label))} > {dropdownLabel} diff --git a/client/components/fields/editor/CustomVocabularies.tsx b/client/components/fields/editor/CustomVocabularies.tsx index 927dae8b8..27eedb00a 100644 --- a/client/components/fields/editor/CustomVocabularies.tsx +++ b/client/components/fields/editor/CustomVocabularies.tsx @@ -86,7 +86,6 @@ class CustomVocabulariesComponent extends React.PureComponent { ); }} tabindex={0} - zIndex={1051} /> ); diff --git a/client/components/fields/editor/EventRelatedArticles/EventsRelatedArticlesModal.tsx b/client/components/fields/editor/EventRelatedArticles/EventsRelatedArticlesModal.tsx index 2f1fc86c7..08cff86e3 100644 --- a/client/components/fields/editor/EventRelatedArticles/EventsRelatedArticlesModal.tsx +++ b/client/components/fields/editor/EventRelatedArticles/EventsRelatedArticlesModal.tsx @@ -162,8 +162,6 @@ export class EventsRelatedArticlesModal extends React.Component > { value={values} onChange={this.onChangeMultiple} allowMultiple={true} - zIndex={1051} /> ); } diff --git a/client/components/fields/editor/base/treeSelect.tsx b/client/components/fields/editor/base/treeSelect.tsx index 70095b663..92390cbf3 100644 --- a/client/components/fields/editor/base/treeSelect.tsx +++ b/client/components/fields/editor/base/treeSelect.tsx @@ -88,7 +88,6 @@ export class EditorFieldTreeSelect extends React.PureComponent diff --git a/client/components/fields/resources/profiles.ts b/client/components/fields/resources/profiles.ts index 32aaa2397..6b12e1ee2 100644 --- a/client/components/fields/resources/profiles.ts +++ b/client/components/fields/resources/profiles.ts @@ -35,6 +35,17 @@ registerEditorField( true ); +registerEditorField( + 'schema.cancel_plan_with_event', + EditorFieldCheckbox, + () => ({ + label: superdeskApi.localization.gettext('Cancel planning items with Event'), + field: 'schema.cancel_plan_with_event', + }), + null, + true +); + registerEditorField( 'schema.planning_auto_publish', EditorFieldCheckbox, diff --git a/client/interfaces.ts b/client/interfaces.ts index 9e3394e0b..78e5b26cd 100644 --- a/client/interfaces.ts +++ b/client/interfaces.ts @@ -1069,6 +1069,7 @@ export interface IProfileSchemaTypeList extends IBaseProfileSchemaType<'list'> { mandatory_in_list?: {[key: string]: any}; vocabularies?: Array; planning_auto_publish?: boolean; + cancel_plan_with_event?: boolean; } export interface IProfileSchemaTypeInteger extends IBaseProfileSchemaType<'integer'> {} @@ -1171,6 +1172,7 @@ export interface IEventFormProfile { reference: IProfileEditorField; slugline: IProfileEditorField; subject: IProfileEditorField; + related_plannings: IProfileEditorField; }; name: 'event'; schema: { @@ -1194,6 +1196,7 @@ export interface IEventFormProfile { reference: IProfileSchemaTypeString; slugline: IProfileSchemaTypeString; subject: IProfileSchemaTypeList; + related_plannings: IProfileSchemaTypeList; }; } diff --git a/client/planning-extension/src/assignments-overview/hiddenAssignmentsList.tsx b/client/planning-extension/src/assignments-overview/hiddenAssignmentsList.tsx index 1b4bf6b86..66d68ed8a 100644 --- a/client/planning-extension/src/assignments-overview/hiddenAssignmentsList.tsx +++ b/client/planning-extension/src/assignments-overview/hiddenAssignmentsList.tsx @@ -49,7 +49,7 @@ export class AssignmentsCountTracker extends React.PureComponent<{}, {loading: t {menuId: 'MENU_ITEM_PLANNING_ASSIGNMENTS', badgeValue: itemsCount.toString()}, ); - return null; + return <>; } } diff --git a/client/styles/index.scss b/client/styles/index.scss index 3d03fffb7..f74f005d8 100644 --- a/client/styles/index.scss +++ b/client/styles/index.scss @@ -108,13 +108,6 @@ justify-content: flex-end; } -// Fix second subnav's z-index in Planning page -#sd-planning-react-container { - .subnav + .subnav { - z-index: 1002 !important; - } -} - // Fix react-bootstrap OverlayTrigger's Tooltip inside Modals .tooltip { z-index: 10000 !important; diff --git a/client/utils/planning.ts b/client/utils/planning.ts index 5bf2d21eb..d7d178ade 100644 --- a/client/utils/planning.ts +++ b/client/utils/planning.ts @@ -71,14 +71,18 @@ import {isItemAction, isMenuDivider} from '../helpers'; const isCoverageAssigned = (coverage) => !!get(coverage, 'assigned_to.desk'); +function isCancelPlanWithEventDisabled(): boolean { + return (planningApi.events.getEditorProfile().schema.related_plannings?.cancel_plan_with_event ?? true) === false; +} + function canPostPlanning( planning: IPlanningItem, - events_: Array | null, + events: Array | null, session: ISession, privileges: IPrivileges, locks: ILockedItems ): boolean { - const events = events_ ?? []; + const primaryEvents = pickRelatedEventsForPlanning(planning, events || [], 'logic'); return ( isExistingItem(planning) && @@ -86,14 +90,20 @@ function canPostPlanning( !!privileges[PRIVILEGES.PLANNING_MANAGEMENT] && !lockUtils.isLockRestricted(planning, session, locks) && getPostedState(planning) !== POST_STATE.USABLE && - events.every((event) => getItemWorkflowState(event) !== WORKFLOW_STATE.KILLED) && !isItemSpiked(planning) && - events.every((event) => !isItemSpiked(event)) && - (!isItemCancelled(planning) || getItemWorkflowState(planning) === WORKFLOW_STATE.KILLED) && - events.every((event) => !isItemCancelled(event)) && !isItemRescheduled(planning) && - events.every((event) => !isItemRescheduled(event)) && - !isNotForPublication(planning) + !isNotForPublication(planning) && + (!isItemCancelled(planning) || getItemWorkflowState(planning) === WORKFLOW_STATE.KILLED) && + ( + primaryEvents.length === 0 + || isCancelPlanWithEventDisabled() + || !primaryEvents.some((event) => ( + getItemWorkflowState(event) === WORKFLOW_STATE.KILLED + || isItemSpiked(event) + || isItemCancelled(event) + || isItemRescheduled(event) + )) + ) ); } @@ -114,22 +124,28 @@ function canUnpostPlanning( function canEditPlanning( planning: IPlanningItem, - events_: Array | null, + events: Array | null, session: ISession, privileges: IPrivileges, locks: ILockedItems ): boolean { - const events = events_ ?? []; + const primaryEvents = pickRelatedEventsForPlanning(planning, events || [], 'logic'); return ( !!privileges[PRIVILEGES.PLANNING_MANAGEMENT] && !lockUtils.isLockRestricted(planning, session, locks) && !isItemSpiked(planning) && - events.every((event) => !isItemSpiked(event)) && !(getPostedState(planning) === POST_STATE.USABLE && !privileges[PRIVILEGES.POST_PLANNING]) && !isItemRescheduled(planning) && (!isItemExpired(planning) || privileges[PRIVILEGES.EDIT_EXPIRED]) && - events.every((event) => getItemWorkflowState(event) !== WORKFLOW_STATE.KILLED) + ( + primaryEvents.length === 0 + || isCancelPlanWithEventDisabled() + || primaryEvents.some((event) => ( + getItemWorkflowState(event) === WORKFLOW_STATE.KILLED + || isItemSpiked(event) + )) + ) ); } @@ -139,13 +155,19 @@ function canModifyPlanning( privileges: IPrivileges, locks: ILockedItems ): boolean { + const primaryEvents = pickRelatedEventsForPlanning(planning, events || [], 'logic'); + return ( !!privileges[PRIVILEGES.PLANNING_MANAGEMENT] && !lockUtils.isItemLocked(planning, locks) && !isItemSpiked(planning) && - (events ?? []).every((event) => !isItemSpiked(event)) && !isItemCancelled(planning) && - !isItemRescheduled(planning) + !isItemRescheduled(planning) && + ( + primaryEvents.length === 0 + || isCancelPlanWithEventDisabled() + || !primaryEvents.some((event) => isItemSpiked(event)) + ) ); } @@ -217,14 +239,20 @@ function canUnspikePlanning( events: Array | null, privileges: IPrivileges ): boolean { + const primaryEvents = pickRelatedEventsForPlanning(plan, events || [], 'logic'); + return ( isItemSpiked(plan) && !!privileges[PRIVILEGES.UNSPIKE_PLANNING] && !!privileges[PRIVILEGES.PLANNING_MANAGEMENT] && - (events ?? []).every((event) => !isItemSpiked(event)) && ( !isItemExpired(plan) || !!privileges[PRIVILEGES.EDIT_EXPIRED] + ) && + ( + primaryEvents.length === 0 + || isCancelPlanWithEventDisabled() + || !primaryEvents.some((event) => isItemSpiked(event)) ) ); } @@ -236,11 +264,17 @@ function canDuplicatePlanning( privileges: IPrivileges, locks: ILockedItems ): boolean { + const primaryEvents = pickRelatedEventsForPlanning(plan, events || [], 'logic'); + return ( !isItemSpiked(plan) && !!privileges[PRIVILEGES.PLANNING_MANAGEMENT] && !lockUtils.isLockRestricted(plan, session, locks) && - (events ?? []).every((event) => !isItemSpiked(event)) + ( + primaryEvents.length === 0 + || isCancelPlanWithEventDisabled() + || !primaryEvents.some((event) => isItemSpiked(event)) + ) ); } @@ -251,16 +285,25 @@ function canCancelPlanning( privileges: IPrivileges, locks: ILockedItems ): boolean { + const primaryEvents = pickRelatedEventsForPlanning(planning, events || [], 'logic'); + return ( !!privileges[PRIVILEGES.PLANNING_MANAGEMENT] && !lockUtils.isLockRestricted(planning, session, locks) && getItemWorkflowState(planning) === WORKFLOW_STATE.SCHEDULED && - (events ?? []).every((event) => getItemWorkflowState(event) !== WORKFLOW_STATE.SPIKED) && !( getPostedState(planning) === POST_STATE.USABLE && !privileges[PRIVILEGES.POST_PLANNING] ) && - !isItemExpired(planning) + ( + !isItemExpired(planning) || + !!privileges[PRIVILEGES.EDIT_EXPIRED] + ) && + ( + primaryEvents.length === 0 + || isCancelPlanWithEventDisabled() + || !primaryEvents.some((event) => isItemSpiked(event)) + ) ); } @@ -271,17 +314,26 @@ function canCancelAllCoverage( privileges: IPrivileges, locks: ILockedItems ): boolean { + const primaryEvents = pickRelatedEventsForPlanning(planning, events || [], 'logic'); + return ( !!privileges[PRIVILEGES.PLANNING_MANAGEMENT] && !isItemSpiked(planning) && !lockUtils.isLockRestricted(planning, session, locks) && - (events ?? []).every((event) => getItemWorkflowState(event) !== WORKFLOW_STATE.SPIKED) && canCancelAllCoverageForPlanning(planning) && !( getPostedState(planning) === POST_STATE.USABLE && !privileges[PRIVILEGES.POST_PLANNING] ) && - !isItemExpired(planning) + ( + !isItemExpired(planning) || + !!privileges[PRIVILEGES.EDIT_EXPIRED] + ) && + ( + primaryEvents.length === 0 + || isCancelPlanWithEventDisabled() + || !primaryEvents.some((event) => isItemSpiked(event)) + ) ); } @@ -359,13 +411,22 @@ function canAddCoverages( session: ISession, locks: ILockedItems ): boolean { + const primaryEvents = pickRelatedEventsForPlanning(planning, events || [], 'logic'); + return ( !!privileges[PRIVILEGES.PLANNING_MANAGEMENT] && lockUtils.isItemLocked(planning, locks) && lockUtils.isItemLockedInThisSession(planning, session, locks) && - (events ?? []).every((event) => !isItemCancelled(event)) && (!isItemCancelled(planning) || isItemKilled(planning)) && !isItemRescheduled(planning) && - !isItemExpired(planning) + ( + !isItemExpired(planning) || + !!privileges[PRIVILEGES.EDIT_EXPIRED] + ) && + ( + primaryEvents.length === 0 + || isCancelPlanWithEventDisabled() + || !primaryEvents.some((event) => isItemCancelled(event)) + ) ); } diff --git a/e2e/cypress/support/planning/planningList.ts b/e2e/cypress/support/planning/planningList.ts index f8925afbc..c37ce7c27 100644 --- a/e2e/cypress/support/planning/planningList.ts +++ b/e2e/cypress/support/planning/planningList.ts @@ -136,8 +136,7 @@ export class PlanningList { .find('[data-test-id=interval-dropdown-toggle]') .click(); - cy.get('[data-test-id=planning-list-panel]') - .find('[data-test-id=interval-dropdown]') + cy.get('[data-test-id=dropdown-overlay]') .find('li') .contains(interval) .click(); diff --git a/package-lock.json b/package-lock.json index 0422d5bdb..97136ad12 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,84 +1,57 @@ { "name": "superdesk-planning", - "version": "2.8.0-dev", + "version": "2.8.2", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/code-frame": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", - "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.26.2.tgz", + "integrity": "sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==", "dev": true, "requires": { - "@babel/highlight": "^7.24.2", + "@babel/helper-validator-identifier": "^7.25.9", + "js-tokens": "^4.0.0", "picocolors": "^1.0.0" } }, "@babel/helper-string-parser": { - "version": "7.24.8", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.8.tgz", - "integrity": "sha512-pO9KhhRcuUyGnJWwyEgnRJTSIZHiT+vMD0kPeD+so0l7mxkMT19g3pjY9GTnHySck/hDzq+dtW/4VgnMkippsQ==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.25.9.tgz", + "integrity": "sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==", "dev": true }, "@babel/helper-validator-identifier": { - "version": "7.22.20", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", - "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", + "version": "7.25.9", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.25.9.tgz", + "integrity": "sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==", "dev": true }, - "@babel/highlight": { - "version": "7.24.2", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", - "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", - "dev": true, - "requires": { - "@babel/helper-validator-identifier": "^7.22.20", - "chalk": "^2.4.2", - "js-tokens": "^4.0.0", - "picocolors": "^1.0.0" - } - }, "@babel/parser": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.25.6.tgz", - "integrity": "sha512-trGdfBdbD0l1ZPmcJ83eNxB9rbEax4ALFTF7fN386TMYbeCQbyme5cOEXQhbGXKebwGaB/J52w1mrklMcbgy6Q==", + "version": "7.26.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.2.tgz", + "integrity": "sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==", "dev": true, "requires": { - "@babel/types": "^7.25.6" + "@babel/types": "^7.26.0" } }, "@babel/runtime": { - "version": "7.24.4", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", - "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.26.0.tgz", + "integrity": "sha512-FDSOghenHTiToteC/QRlv2q3DhPZ/oOXTBoirfWNx1Cx3TMVcGWQtMMmQcSvb/JjpNeGzx8Pq/b4fKEJuWm1sw==", "requires": { "regenerator-runtime": "^0.14.0" - }, - "dependencies": { - "regenerator-runtime": { - "version": "0.14.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" - } } }, "@babel/types": { - "version": "7.25.6", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.25.6.tgz", - "integrity": "sha512-/l42B1qxpG6RdfYf343Uw1vmDjeNhneUXtzhojE7pDgfpEypmRhI6j1kr17XCVv4Cgl9HdAiQY2x0GwKm7rWCw==", + "version": "7.26.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.0.tgz", + "integrity": "sha512-Z/yiTPj+lDVnF7lWeKCIJzaIkI0vYO87dMpZ4bg4TDrFe4XXLFWL1TbXU27gBP3QccxV9mZICCrnjnYlJjXHOA==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.24.8", - "@babel/helper-validator-identifier": "^7.24.7", - "to-fast-properties": "^2.0.0" - }, - "dependencies": { - "@babel/helper-validator-identifier": { - "version": "7.24.7", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", - "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", - "dev": true - } + "@babel/helper-string-parser": "^7.25.9", + "@babel/helper-validator-identifier": "^7.25.9" } }, "@colors/colors": { @@ -137,6 +110,14 @@ "dev": true, "requires": { "type-detect": "4.0.8" + }, + "dependencies": { + "type-detect": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", + "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "dev": true + } } }, "@sinonjs/formatio": { @@ -160,9 +141,9 @@ } }, "@sinonjs/text-encoding": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.2.tgz", - "integrity": "sha512-sXXKG+uL9IrKqViTtao2Ws6dy0znu9sOaP1di/jKGW1M6VssO8vlpXCQcpZ+jisQ1tTFAC5Jo/EOzFbggBagFQ==", + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/@sinonjs/text-encoding/-/text-encoding-0.7.3.tgz", + "integrity": "sha512-DE427ROAphMQzU4ENbliGYrBSYPXF+TtLg9S8vzeA+OF4ZKzoDdzfL8sxuMUGS/lgRhM6j1URSk9ghf7Xo1tyA==", "dev": true }, "@socket.io/component-emitter": { @@ -175,7 +156,6 @@ "version": "0.0.17", "resolved": "https://registry.npmjs.org/@superdesk/common/-/common-0.0.17.tgz", "integrity": "sha512-DeycOche2WLJkH4k2JdG8IR5Oi3K3MRTrxXtDqlxLvp/lU9eqbp0glHuthnTnUPEfaUo6bsye6wmGKC6M0DGEQ==", - "dev": true, "requires": { "date-fns": "2.7.0", "lodash": "4.17.19", @@ -184,23 +164,10 @@ "react-sortable-hoc": "^1.11.0" }, "dependencies": { - "date-fns": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.7.0.tgz", - "integrity": "sha512-wxYp2PGoUDN5ZEACc61aOtYFvSsJUylIvCjpjDOqM1UDaKIIuMJ9fAnMYFHV3TQaDpfTVxhwNK/GiCaHKuemTA==", - "dev": true - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", - "dev": true - }, "react-sortable-hoc": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/react-sortable-hoc/-/react-sortable-hoc-1.11.0.tgz", "integrity": "sha512-v1CDCvdfoR3zLGNp6qsBa4J1BWMEVH25+UKxF/RvQRh+mrB+emqtVHMgZ+WreUiKJoEaiwYoScaueIKhMVBHUg==", - "dev": true, "requires": { "@babel/runtime": "^7.2.0", "invariant": "^2.2.4", @@ -355,18 +322,18 @@ "dev": true }, "@types/node": { - "version": "20.12.7", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.7.tgz", - "integrity": "sha512-wq0cICSkRLVaf3UGLMGItu/PtdY7oaXaI/RVU+xliKVOtRna3PRY57ZDfztpDL0n11vfymMUnXv8QwYCO7L1wg==", + "version": "22.10.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-22.10.1.tgz", + "integrity": "sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==", "dev": true, "requires": { - "undici-types": "~5.26.4" + "undici-types": "~6.20.0" } }, "@types/prop-types": { - "version": "15.7.12", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", - "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "version": "15.7.13", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.13.tgz", + "integrity": "sha512-hCZTSvwbzWGvhqxp/RqVqwU999pBf2vp7hzIjiYOsl8wqOmUxkQ6ddw1cV3l8811+kdUFus/q4d1Y3E3SyEifA==", "dev": true }, "@types/react": { @@ -437,18 +404,18 @@ }, "dependencies": { "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.3" } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true } } @@ -485,28 +452,25 @@ }, "dependencies": { "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.3" } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } + "version": "7.6.3", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.3.tgz", + "integrity": "sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==", + "dev": true } } }, @@ -1082,9 +1046,9 @@ }, "dependencies": { "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", "dev": true } } @@ -1280,6 +1244,13 @@ "requires": { "core-js": "^2.4.0", "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } } }, "balanced-match": { @@ -1327,6 +1298,12 @@ "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==", "dev": true }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "dev": true + }, "batch": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/batch/-/batch-0.6.1.tgz", @@ -1359,16 +1336,6 @@ "integrity": "sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==", "dev": true }, - "bindings": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz", - "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==", - "dev": true, - "optional": true, - "requires": { - "file-uri-to-path": "1.0.0" - } - }, "block-stream": { "version": "0.0.9", "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", @@ -1563,16 +1530,6 @@ "safe-buffer": "^5.2.1" }, "dependencies": { - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1744,9 +1701,9 @@ } }, "caniuse-db": { - "version": "1.0.30001664", - "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001664.tgz", - "integrity": "sha512-73+YTKw0KMawAD9ziTbZmcTYDATAHZVBD+K23Bnj0rUuEEX75M9F3j/3x5Nwweqz4F+djgIIuD+gltXFM7kTCQ==", + "version": "1.0.30001685", + "resolved": "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30001685.tgz", + "integrity": "sha512-GEmYIzUxhOOWCWNAPzSG28u0vTYjWpxLwtjj9eelxB+RbRa3ChE/N/pz3jL4QPHIHhct4yr9Ml9JQjqaEpCZhg==", "dev": true }, "caseless": { @@ -1852,9 +1809,9 @@ }, "dependencies": { "tslib": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", - "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==", + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", + "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", "dev": true } } @@ -1930,15 +1887,29 @@ "dev": true }, "cipher-base": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz", - "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.6.tgz", + "integrity": "sha512-3Ek9H3X6pj5TgenXYtNWdaBon1tgYCaebd+XPg0keyjEbEfkD4KkmAxkQ/i1vYvxdcT5nscLBfq9VJRmCBcFSw==", "dev": true, "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" + "inherits": "^2.0.4", + "safe-buffer": "^5.2.1" + }, + "dependencies": { + "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 + } } }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, "clap": { "version": "1.2.3", "resolved": "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz", @@ -2228,24 +2199,30 @@ } }, "compression": { - "version": "1.7.4", - "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", - "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "version": "1.7.5", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.5.tgz", + "integrity": "sha512-bQJ0YRck5ak3LgtnpKkiabX5pNF7tMUh1BSy2ZBOTh0Dim0BUu6aPPwByIns6/A5Prh8PufSPerMDUklpzes2Q==", "dev": true, "requires": { - "accepts": "~1.3.5", - "bytes": "3.0.0", - "compressible": "~2.0.16", + "bytes": "3.1.2", + "compressible": "~2.0.18", "debug": "2.6.9", + "negotiator": "~0.6.4", "on-headers": "~1.0.2", - "safe-buffer": "5.1.2", + "safe-buffer": "5.2.1", "vary": "~1.1.2" }, "dependencies": { - "bytes": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", - "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "negotiator": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz", + "integrity": "sha512-myRT3DiWPHqho5PrJaIRyaMv2kgYf0mUVgBNOYMuCH5Ki1yEiQaf/ZJuQ62nvpc44wL5WDbTX7yGJi1Neevw8w==", + "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 } } @@ -2278,38 +2255,6 @@ "finalhandler": "1.1.2", "parseurl": "~1.3.3", "utils-merge": "1.0.1" - }, - "dependencies": { - "finalhandler": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", - "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", - "dev": true, - "requires": { - "debug": "2.6.9", - "encodeurl": "~1.0.2", - "escape-html": "~1.0.3", - "on-finished": "~2.3.0", - "parseurl": "~1.3.3", - "statuses": "~1.5.0", - "unpipe": "~1.0.0" - } - }, - "on-finished": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", - "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", - "dev": true, - "requires": { - "ee-first": "1.1.1" - } - }, - "statuses": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", - "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "dev": true - } } }, "connect-history-api-fallback": { @@ -2376,9 +2321,9 @@ "dev": true }, "cookie": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", + "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", "dev": true }, "cookie-signature": { @@ -2423,9 +2368,9 @@ }, "dependencies": { "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", "dev": true } } @@ -2458,9 +2403,9 @@ } }, "cross-spawn": { - "version": "6.0.5", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", - "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", + "version": "6.0.6", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.6.tgz", + "integrity": "sha512-VqCUuhcd1iB+dsv8gxPttb5iZh/D0iubSP21g36KXdEuf6I5JiioesUVjpCdHV9MZRUfVFlvwtIUyPfxo5trtw==", "dev": true, "requires": { "nice-try": "^1.0.4", @@ -2471,22 +2416,23 @@ } }, "crypto-browserify": { - "version": "3.12.0", - "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz", - "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==", + "version": "3.12.1", + "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.1.tgz", + "integrity": "sha512-r4ESw/IlusD17lgQi1O20Fa3qNnsckR126TdUuBgAu7GBYSIPvdNyONd3Zrxh0xCwA4+6w/TDArBPsMvhur+KQ==", "dev": true, "requires": { - "browserify-cipher": "^1.0.0", - "browserify-sign": "^4.0.0", - "create-ecdh": "^4.0.0", - "create-hash": "^1.1.0", - "create-hmac": "^1.1.0", - "diffie-hellman": "^5.0.0", - "inherits": "^2.0.1", - "pbkdf2": "^3.0.3", - "public-encrypt": "^4.0.0", - "randombytes": "^2.0.0", - "randomfill": "^1.0.3" + "browserify-cipher": "^1.0.1", + "browserify-sign": "^4.2.3", + "create-ecdh": "^4.0.4", + "create-hash": "^1.2.0", + "create-hmac": "^1.1.7", + "diffie-hellman": "^5.0.3", + "hash-base": "~3.0.4", + "inherits": "^2.0.4", + "pbkdf2": "^3.1.2", + "public-encrypt": "^4.0.3", + "randombytes": "^2.1.0", + "randomfill": "^1.0.4" } }, "cson": { @@ -2729,13 +2675,15 @@ } }, "date-fns": { - "version": "2.30.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", - "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", - "dev": true, - "requires": { - "@babel/runtime": "^7.21.0" - } + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.7.0.tgz", + "integrity": "sha512-wxYp2PGoUDN5ZEACc61aOtYFvSsJUylIvCjpjDOqM1UDaKIIuMJ9fAnMYFHV3TQaDpfTVxhwNK/GiCaHKuemTA==" + }, + "date-format": { + "version": "4.0.14", + "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", + "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", + "dev": true }, "dateformat": { "version": "1.0.12", @@ -2971,9 +2919,9 @@ }, "dependencies": { "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", "dev": true } } @@ -3209,15 +3157,15 @@ "dev": true }, "electron-to-chromium": { - "version": "1.5.29", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.29.tgz", - "integrity": "sha512-PF8n2AlIhCKXQ+gTpiJi0VhcHDb69kYX4MtCiivctc2QD3XuNZ/XIOlbGzt7WAjjEev0TtaH6Cu3arZExm5DOw==", + "version": "1.5.68", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.68.tgz", + "integrity": "sha512-FgMdJlma0OzUYlbrtZ4AeXjKxKPk6KT8WOP8BjcqxWtlg8qyJQjRzPJzUtUn5GBg1oQ26hFs7HOOHJMYiJRnvQ==", "dev": true }, "elliptic": { - "version": "6.5.7", - "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.7.tgz", - "integrity": "sha512-ESVCtTwiA+XhY3wyh24QqRGBoP3rEdDUl3EDUUo9tft074fi19IrdpH7hLCMMP3CIj7jb3W96rn8lt/BqIlt5Q==", + "version": "6.6.1", + "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.6.1.tgz", + "integrity": "sha512-RaddvvMatK2LJHqFJ+YA4WysVN5Ita9E35botqIYspQ4TkRAlCicdzKOjlyv/1Za5RyTNn7di//eEV0uTAfe3g==", "dev": true, "requires": { "bn.js": "^4.11.9", @@ -3230,9 +3178,9 @@ }, "dependencies": { "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", "dev": true } } @@ -3264,9 +3212,9 @@ } }, "engine.io": { - "version": "6.5.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", - "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "version": "6.6.2", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.2.tgz", + "integrity": "sha512-gmNvsYi9C8iErnZdVcJnvCpSKbWTt1E8+JZo8b+daLninywUWi5NQ5STSHZ9rFjFO7imNcvb8Pc5pe/wMR5xEw==", "dev": true, "requires": { "@types/cookie": "^0.4.1", @@ -3274,42 +3222,34 @@ "@types/node": ">=10.0.0", "accepts": "~1.3.4", "base64id": "2.0.0", - "cookie": "~0.4.1", + "cookie": "~0.7.2", "cors": "~2.8.5", "debug": "~4.3.1", "engine.io-parser": "~5.2.1", - "ws": "~8.11.0" + "ws": "~8.17.1" }, "dependencies": { - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true - }, "debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "requires": { - "ms": "2.1.2" - }, - "dependencies": { - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - } + "ms": "^2.1.3" } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true } } }, "engine.io-parser": { - "version": "5.2.2", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.2.tgz", - "integrity": "sha512-RcyUFKA93/CXH20l4SoVvzZfrSDMOTUS3bWVpTt2FuFP+XYrL8i8oonHP7WInRyVHXh0n/ORtoeiE1os+8qkSw==", + "version": "5.2.3", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", + "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", "dev": true }, "enhanced-resolve": { @@ -3324,10 +3264,21 @@ } }, "ent": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.0.tgz", - "integrity": "sha512-GHrMyVZQWvTIdDtpiEXdHZnFQKzeO09apj8Cbl4pKWy4i0Oprcq17usfDt5aO63swf0JOeMWjWQE/LzgSRuWpA==", - "dev": true + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ent/-/ent-2.2.1.tgz", + "integrity": "sha512-QHuXVeZx9d+tIQAz/XztU0ZwZf2Agg9CcXcgE1rurqvdBeDBrpSwjl8/6XUqMg7tw2Y7uAdKb2sRv+bSEFqQ5A==", + "dev": true, + "requires": { + "punycode": "^1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha512-jmYNElW7yvO7TV33CjSmvSiE2yco3bV2czu/OzDKdMNVZQWfxCblURLhf+47syQRBntjfLdd/H0egrzIG+oaFQ==", + "dev": true + } + } }, "entities": { "version": "2.2.0", @@ -3439,9 +3390,9 @@ } }, "es-abstract": { - "version": "1.23.3", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", - "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", + "version": "1.23.5", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.5.tgz", + "integrity": "sha512-vlmniQ0WNPwXqA0BnmwV3Ng7HxiGlh6r5U6JcTMNx8OilcAGqVJBHJcPjqOMaczU9fRuRK5Px2BdVyPRnKMMVQ==", "dev": true, "requires": { "array-buffer-byte-length": "^1.0.1", @@ -3459,7 +3410,7 @@ "function.prototype.name": "^1.1.6", "get-intrinsic": "^1.2.4", "get-symbol-description": "^1.0.2", - "globalthis": "^1.0.3", + "globalthis": "^1.0.4", "gopd": "^1.0.1", "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", @@ -3475,10 +3426,10 @@ "is-string": "^1.0.7", "is-typed-array": "^1.1.13", "is-weakref": "^1.0.2", - "object-inspect": "^1.13.1", + "object-inspect": "^1.13.3", "object-keys": "^1.1.1", "object.assign": "^4.1.5", - "regexp.prototype.flags": "^1.5.2", + "regexp.prototype.flags": "^1.5.3", "safe-array-concat": "^1.1.2", "safe-regex-test": "^1.0.3", "string.prototype.trim": "^1.2.9", @@ -3543,14 +3494,14 @@ } }, "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.3.0.tgz", + "integrity": "sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==", "dev": true, "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" + "is-callable": "^1.2.7", + "is-date-object": "^1.0.5", + "is-symbol": "^1.0.4" } }, "es5-ext": { @@ -3637,9 +3588,9 @@ } }, "escalade": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", - "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", + "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", "dev": true }, "escape-html": { @@ -3711,12 +3662,12 @@ }, "dependencies": { "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.3" } }, "eslint-visitor-keys": { @@ -3732,9 +3683,9 @@ "dev": true }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "semver": { @@ -3856,9 +3807,9 @@ "dev": true }, "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", + "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", "dev": true, "requires": { "estraverse": "^5.1.0" @@ -3924,9 +3875,9 @@ "dev": true }, "eventemitter3": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", - "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", "dev": true }, "events": { @@ -3979,22 +3930,6 @@ "shebang-command": "^1.2.0", "which": "^1.2.9" } - }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true } } }, @@ -4088,9 +4023,9 @@ } }, "express": { - "version": "4.21.0", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.0.tgz", - "integrity": "sha512-VqcNGcj/Id5ZT1LZ/cfihi3ttTn+NJmkli2eZADigjq29qTlWi/hAQ43t/VLPq8+UX06FCEx3ByOYet6ZFblng==", + "version": "4.21.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.21.1.tgz", + "integrity": "sha512-YSFlK1Ee0/GC8QaO91tHcDxJiE/X4FbpAyQWkxAvG6AXCuR65YzK8ua6D9hvi/TzUfZMpc+BwuM1IPw8fmQBiQ==", "dev": true, "requires": { "accepts": "~1.3.8", @@ -4098,7 +4033,7 @@ "body-parser": "1.20.3", "content-disposition": "0.5.4", "content-type": "~1.0.4", - "cookie": "0.6.0", + "cookie": "0.7.1", "cookie-signature": "1.0.6", "debug": "2.6.9", "depd": "2.0.0", @@ -4133,9 +4068,9 @@ "dev": true }, "cookie": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", - "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", + "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "dev": true }, "encodeurl": { @@ -4144,6 +4079,21 @@ "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "dev": true }, + "finalhandler": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", + "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "~2.0.0", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + } + }, "path-to-regexp": { "version": "0.1.10", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.10.tgz", @@ -4305,18 +4255,18 @@ }, "dependencies": { "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", "dev": true, "requires": { - "fill-range": "^7.0.1" + "fill-range": "^7.1.1" } }, "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", "dev": true, "requires": { "to-regex-range": "^5.0.1" @@ -4329,12 +4279,12 @@ "dev": true }, "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", "dev": true, "requires": { - "braces": "^3.0.2", + "braces": "^3.0.3", "picomatch": "^2.3.1" } }, @@ -4466,13 +4416,6 @@ "integrity": "sha512-0k45oWBokCqh2MOexeYKpyqmGKG+8mQ2Wd8iawx+uWd/weWJQAZ6SoPybagdCI4xFisag8iAR77WPm4h3pTfxA==", "dev": true }, - "file-uri-to-path": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", - "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==", - "dev": true, - "optional": true - }, "filename-regex": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", @@ -4501,24 +4444,33 @@ } }, "finalhandler": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", - "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", "dev": true, "requires": { "debug": "2.6.9", - "encodeurl": "~2.0.0", + "encodeurl": "~1.0.2", "escape-html": "~1.0.3", - "on-finished": "2.4.1", + "on-finished": "~2.3.0", "parseurl": "~1.3.3", - "statuses": "2.0.1", + "statuses": "~1.5.0", "unpipe": "~1.0.0" }, "dependencies": { - "encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", "dev": true } } @@ -5020,6 +4972,12 @@ "path-is-absolute": "^1.0.0" } }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", + "dev": true + }, "minimatch": { "version": "3.0.8", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.8.tgz", @@ -5032,12 +4990,12 @@ } }, "gopd": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.0.1.tgz", - "integrity": "sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.1.0.tgz", + "integrity": "sha512-FQoVQnqcdk4hVM4JN1eromaun4iuS34oStkdlLENLdpULsuQcTyXj8w7ayhuUfPwEYZ1ZOooOTT6fdA9Vmx/RA==", "dev": true, "requires": { - "get-intrinsic": "^1.1.3" + "get-intrinsic": "^1.2.4" } }, "graceful-fs": { @@ -5565,15 +5523,18 @@ } }, "has-proto": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.0.3.tgz", - "integrity": "sha512-SJ1amZAJUiZS+PhsVLf5tGydlaVB8EdFpaSO4gmiUKUOxk8qzn5AIy4ZeJUmh22znIdk/uMAUT2pl3FxzVUH+Q==", - "dev": true + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-proto/-/has-proto-1.1.0.tgz", + "integrity": "sha512-QLdzI9IIO1Jg7f9GT1gXpPpXArAn6cS31R1eEZqz08Gc+uQ8/XiqHWt17Fiw+2p6oTTIq5GXEpQkAlA88YRl/Q==", + "dev": true, + "requires": { + "call-bind": "^1.0.7" + } }, "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", "dev": true }, "has-tostringtag": { @@ -5621,27 +5582,15 @@ } }, "hash-base": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.1.0.tgz", - "integrity": "sha512-1nmYp/rhMDiE7AYkDw+lLwlAzz0AntGIe51F3RfFfEqyQ3feY2eI/NcwC6umIQVOASPMsWJLJScWKSSvzL9IVA==", + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.5.tgz", + "integrity": "sha512-vXm0l45VbcHEVlTCzs8M+s0VeYsB2lnlAaThoLKGXr3bE/VWDOelNUnycUPEhKEaXARL2TEFjBOyUiM6+55KBg==", "dev": true, "requires": { "inherits": "^2.0.4", - "readable-stream": "^3.6.0", - "safe-buffer": "^5.2.0" + "safe-buffer": "^5.2.1" }, "dependencies": { - "readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -5692,6 +5641,14 @@ "requires": { "eventemitter3": "3.1.0", "url-toolkit": "^2.1.6" + }, + "dependencies": { + "eventemitter3": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-3.1.0.tgz", + "integrity": "sha512-ivIvhpq/Y0uSjcHDcOIccjmYjGLcP09MFGE7ysAwkAvkXfpZlC985pH2/ui64DKazbTW/4kN3yqozUxlXzI6cA==", + "dev": true + } } }, "hmac-drbg": { @@ -5912,14 +5869,6 @@ "eventemitter3": "^4.0.0", "follow-redirects": "^1.0.0", "requires-port": "^1.0.0" - }, - "dependencies": { - "eventemitter3": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz", - "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==", - "dev": true - } } }, "http-proxy-middleware": { @@ -6120,9 +6069,9 @@ "dev": true }, "ignore": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", - "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", + "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", "dev": true }, "immutable": { @@ -6372,13 +6321,22 @@ "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", "dev": true }, + "is-async-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-async-function/-/is-async-function-2.0.0.tgz", + "integrity": "sha512-Y1JXKrfykRJGdlDwdKlLpLyMIiWqWvuSd17TvZk68PLAOGOoF4Xyav1z0Xhoi+gCYjZVeC5SI+hYFOfvXmGRCA==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-bigint": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.0.4.tgz", - "integrity": "sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-bigint/-/is-bigint-1.1.0.tgz", + "integrity": "sha512-n4ZT37wG78iz03xPRKJrHTdZbe3IicyucEtdRsV5yglwc3GyUfbAfpSeD0FJ41NbUNSt5wbhqfp1fS+BgnvDFQ==", "dev": true, "requires": { - "has-bigints": "^1.0.1" + "has-bigints": "^1.0.2" } }, "is-binary-path": { @@ -6391,13 +6349,13 @@ } }, "is-boolean-object": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.1.2.tgz", - "integrity": "sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-boolean-object/-/is-boolean-object-1.2.0.tgz", + "integrity": "sha512-kR5g0+dXf/+kXnqI+lu0URKYPKgICtHGGNCDSB10AaUFj3o/HkB3u7WfpRBJGFopxxY0oH3ux7ZsDjLtK7xqvw==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bind": "^1.0.7", + "has-tostringtag": "^1.0.2" } }, "is-buffer": { @@ -6421,12 +6379,12 @@ } }, "is-core-module": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", - "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.15.1.tgz", + "integrity": "sha512-z0vtXSwucUJtANQWldhbtbt7BnL0vxiFjIdDLAatwhDYty2bad6s+rijD6Ri4YuYJubLzIJLUidCh09e1djEVQ==", "dev": true, "requires": { - "hasown": "^2.0.0" + "hasown": "^2.0.2" } }, "is-data-descriptor": { @@ -6490,6 +6448,15 @@ "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", "dev": true }, + "is-finalizationregistry": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-finalizationregistry/-/is-finalizationregistry-1.1.0.tgz", + "integrity": "sha512-qfMdqbAQEwBw78ZyReKnlA8ezmPdb9BemzIIip/JkjaZUhitfXDkkr+3QTboW0JrSXT1QWyYShpvnNHGZ4c4yA==", + "dev": true, + "requires": { + "call-bind": "^1.0.7" + } + }, "is-finite": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.1.0.tgz", @@ -6502,6 +6469,15 @@ "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", "dev": true }, + "is-generator-function": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.0.10.tgz", + "integrity": "sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==", + "dev": true, + "requires": { + "has-tostringtag": "^1.0.0" + } + }, "is-glob": { "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", @@ -6520,6 +6496,12 @@ "lower-case": "^1.1.0" } }, + "is-map": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-map/-/is-map-2.0.3.tgz", + "integrity": "sha512-1Qed0/Hr2m+YqxnM09CjA2d/i6YZNfF6R2oRAOj36eUdS6qIV/huPJNSEpKbupewFs+ZsJlxsjjPbc0/afW6Lw==", + "dev": true + }, "is-negative-zero": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-negative-zero/-/is-negative-zero-2.0.3.tgz", @@ -6545,12 +6527,13 @@ } }, "is-number-object": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.0.7.tgz", - "integrity": "sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-number-object/-/is-number-object-1.1.0.tgz", + "integrity": "sha512-KVSZV0Dunv9DTPkhXwcZ3Q+tUc9TsaE1ZwX5J2WMvsSGS6Md8TFPun5uwh0yRdrNerI6vf/tbJxqSx4c1ZI1Lw==", "dev": true, "requires": { - "has-tostringtag": "^1.0.0" + "call-bind": "^1.0.7", + "has-tostringtag": "^1.0.2" } }, "is-path-cwd": { @@ -6604,13 +6587,15 @@ "dev": true }, "is-regex": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", - "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.0.tgz", + "integrity": "sha512-B6ohK4ZmoftlUe+uvenXSbPJFo6U37BH7oO1B3nQH8f/7h27N56s85MhUtbFJAziz5dcmuR3i8ovUl35zp8pFA==", "dev": true, "requires": { - "call-bind": "^1.0.2", - "has-tostringtag": "^1.0.0" + "call-bind": "^1.0.7", + "gopd": "^1.1.0", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" } }, "is-resolvable": { @@ -6619,6 +6604,12 @@ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", "dev": true }, + "is-set": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-set/-/is-set-2.0.3.tgz", + "integrity": "sha512-iPAjerrse27/ygGLxw+EBR9agv9Y6uLeYVJMu+QNCoouJ1/1ri0mGrcWpfCqFZuzzx3WjtwxG098X+n4OuRkPg==", + "dev": true + }, "is-shared-array-buffer": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/is-shared-array-buffer/-/is-shared-array-buffer-1.0.3.tgz", @@ -6635,12 +6626,13 @@ "dev": true }, "is-string": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.0.7.tgz", - "integrity": "sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-string/-/is-string-1.1.0.tgz", + "integrity": "sha512-PlfzajuF9vSo5wErv3MJAKD/nqf9ngAs1NFQYm16nUYFO2IzxJ2hcm+IOCg+EEopdykNNUhVq5cz35cAUxU8+g==", "dev": true, "requires": { - "has-tostringtag": "^1.0.0" + "call-bind": "^1.0.7", + "has-tostringtag": "^1.0.2" } }, "is-subset": { @@ -6659,12 +6651,14 @@ } }, "is-symbol": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.4.tgz", - "integrity": "sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.1.0.tgz", + "integrity": "sha512-qS8KkNNXUZ/I+nX6QT8ZS1/Yx0A444yhzdTKxCzKkNjQ9sHErBxJnJAgh+f5YhusYECEcjo4XcyH87hn6+ks0A==", "dev": true, "requires": { - "has-symbols": "^1.0.2" + "call-bind": "^1.0.7", + "has-symbols": "^1.0.3", + "safe-regex-test": "^1.0.3" } }, "is-typed-array": { @@ -6697,6 +6691,12 @@ "integrity": "sha512-rMYPYvCzsXywIsldgLaSoPlw5PfoB/ssr7hY4pLfcodrA5M/eArza1a9VmTiNIBNMjOGr1Ow9mTyU2o69U6U9Q==", "dev": true }, + "is-weakmap": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/is-weakmap/-/is-weakmap-2.0.2.tgz", + "integrity": "sha512-K5pXYOm9wqY1RgjpL3YTkF39tni1XajUIkawTLUo9EZEVUFga5gSQJF8nNS7ZwJQ02y+1YCNYcMh+HIf1ZqE+w==", + "dev": true + }, "is-weakref": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-weakref/-/is-weakref-1.0.2.tgz", @@ -6706,6 +6706,16 @@ "call-bind": "^1.0.2" } }, + "is-weakset": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/is-weakset/-/is-weakset-2.0.3.tgz", + "integrity": "sha512-LvIm3/KWzS9oRFHugab7d+M/GcBXuXX5xZkzPmN+NxihdQlZUQ4dWuSV1xR/sq6upL1TJEDrfBgRepHFdBtSNQ==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "get-intrinsic": "^1.2.4" + } + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -6937,9 +6947,9 @@ "dev": true }, "karma": { - "version": "6.4.3", - "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.3.tgz", - "integrity": "sha512-LuucC/RE92tJ8mlCwqEoRWXP38UMAqpnq98vktmS9SznSoUPPUJQbc91dHcxcunROvfQjdORVA/YFviH+Xci9Q==", + "version": "6.4.4", + "resolved": "https://registry.npmjs.org/karma/-/karma-6.4.4.tgz", + "integrity": "sha512-LrtUxbdvt1gOpo3gxG+VAJlJAEMhbWlM4YrFQgql98FwF7+K8K12LYO4hnDdUkNjeztYrOXEMqgTajSWgmtI/w==", "dev": true, "requires": { "@colors/colors": "1.5.0", @@ -6968,12 +6978,6 @@ "yargs": "^16.1.1" }, "dependencies": { - "base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "dev": true - }, "braces": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", @@ -6983,15 +6987,6 @@ "fill-range": "^7.1.1" } }, - "debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, "fill-range": { "version": "7.1.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", @@ -7007,10 +7002,10 @@ "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", "dev": true }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", "dev": true }, "rimraf": { @@ -7022,31 +7017,6 @@ "glob": "^7.1.3" } }, - "socket.io": { - "version": "4.7.5", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", - "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", - "dev": true, - "requires": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.3.2", - "engine.io": "~6.5.2", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - } - }, - "socket.io-adapter": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", - "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", - "dev": true, - "requires": { - "debug": "~4.3.4", - "ws": "~8.17.1" - } - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -7067,12 +7037,6 @@ "requires": { "is-number": "^7.0.0" } - }, - "ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "dev": true } } }, @@ -7326,10 +7290,9 @@ } }, "lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "dev": true + "version": "4.17.19", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", + "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==" }, "lodash.assignin": { "version": "4.2.0", @@ -7475,31 +7438,25 @@ "streamroller": "^3.1.5" }, "dependencies": { - "date-format": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", - "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", - "dev": true - }, "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.3" } }, "flatted": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.2.tgz", + "integrity": "sha512-AiwGJM8YcNOaobumgtng+6NHuOqC3A7MixFeDafM3X9cIUM+xUXoS5Vfgf+OihAYe20fxqNM9yPBXJzRtZ/4eA==", "dev": true }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true } } @@ -7556,12 +7513,13 @@ } }, "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", + "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", "dev": true, "requires": { - "yallist": "^4.0.0" + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" } }, "make-error": { @@ -7723,9 +7681,9 @@ }, "dependencies": { "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", "dev": true } } @@ -7835,9 +7793,9 @@ "integrity": "sha512-uEmtNhbDOrWPFS+hdjFCBfy9f2YoyzRpwcl+DqpC6taX21FzsTLQVbMV/W7PzNSX6x/bhC1zA3c2UQ5NzH6how==" }, "moment-timezone": { - "version": "0.5.45", - "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.45.tgz", - "integrity": "sha512-HIWmqA86KcmCAhnMAN0wuDOARV/525R2+lOLotuGFzn4HO+FH+/645z2wx0Dt3iDv6/p61SIvKnDstISainhLQ==", + "version": "0.5.46", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.46.tgz", + "integrity": "sha512-ZXm9b36esbe7OmdABqIWJuBBiLLwAjrN7CE+7sYdCCx82Nabt1wHDj8TVseS59QIlfFPbOoiBPm6ca9BioG4hw==", "requires": { "moment": "^2.29.4" } @@ -7899,9 +7857,9 @@ "dev": true }, "nan": { - "version": "2.20.0", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.20.0.tgz", - "integrity": "sha512-bk3gXBZDGILuuo/6sKtr0DQmSThYHLtNCdSdXk9YkxD/jK6X2vmCyyXBBxyqZ4XcnzTyYEAThfX3DCEnLf6igw==", + "version": "2.22.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.22.0.tgz", + "integrity": "sha512-nbajikzWTMwsW+eSsNm3QwlOs7het9gGJU5dDZzRTQGk03vyBOauxgI4VakDzE0PtsGTmXPsXTbbjVhRwR5mpw==", "dev": true }, "nanomatch": { @@ -8165,16 +8123,6 @@ "which": "^1.2.9" } }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -8189,12 +8137,6 @@ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", "dev": true - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true } } }, @@ -8375,9 +8317,9 @@ } }, "object-inspect": { - "version": "1.13.1", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.3.tgz", + "integrity": "sha512-kDCGIbxkDSXE3euJZZXzc6to7fCrKHNI/hSRQnRuQ+BWjFNzZwiFF8fj/6o2t2G9/jTj8PSIYTfCLelLZEeRpA==", "dev": true }, "object-is": { @@ -8670,16 +8612,6 @@ "safe-buffer": "^5.2.1" }, "dependencies": { - "hash-base": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz", - "integrity": "sha512-EeeoJKjTyt868liAlVmcv2ZsUfGHlE3Q+BICOXcZiwN3osr5Q/zFGYmTJpoIzuaSTAwndFy+GqhEwlU4L3j4Ow==", - "dev": true, - "requires": { - "inherits": "^2.0.1", - "safe-buffer": "^5.0.1" - } - }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -8856,9 +8788,9 @@ "dev": true }, "path-to-regexp": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz", - "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==", + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.9.0.tgz", + "integrity": "sha512-xIp7/apCFJuUHdDLWe8O1HIkb0kQrOMb/0u6FXQjemHn/ii5LrIzU6bdECnsiTF/GjZkMEKg1xdiZwNqDYlZ6g==", "dev": true, "requires": { "isarray": "0.0.1" @@ -8898,9 +8830,9 @@ "dev": true }, "picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", "dev": true }, "picomatch": { @@ -9589,14 +9521,25 @@ } }, "prop-types-exact": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.0.tgz", - "integrity": "sha512-K+Tk3Kd9V0odiXFP9fwDHUYRyvK3Nun3GVyPapSIs5OBkITAm15W0CPFD/YKTkMUAbc0b9CUwRQp2ybiBIq+eA==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/prop-types-exact/-/prop-types-exact-1.2.5.tgz", + "integrity": "sha512-wHDhA5TSSvU07gdzsdeT/FZg6zay94K4Y7swSK4YsRG3moWB0Qsp9g1Y5BBausP1HF8K4UeVe2Xt7ZFJByKp6A==", "dev": true, "requires": { - "has": "^1.0.3", - "object.assign": "^4.1.0", - "reflect.ownkeys": "^0.2.0" + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "hasown": "^2.0.2", + "isarray": "^2.0.5", + "object.assign": "^4.1.5", + "reflect.ownkeys": "^1.1.4" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } } }, "prop-types-extra": { @@ -9640,10 +9583,13 @@ "dev": true }, "psl": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", - "integrity": "sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==", - "dev": true + "version": "1.15.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.15.0.tgz", + "integrity": "sha512-JZd3gMVBAVQkSs6HdNZo9Sdo0LNcQeMNP3CozBJb3JYC/QUYZTnKxP+f8oWRX4rHP5EurWxqAHTSwUCjlNKa1w==", + "dev": true, + "requires": { + "punycode": "^2.3.1" + } }, "public-encrypt": { "version": "4.0.3", @@ -9660,9 +9606,9 @@ }, "dependencies": { "bn.js": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.0.tgz", - "integrity": "sha512-c98Bf3tPniI+scsdk237ku1Dc3ujXQTSgyiPUDEOe7tRkhrqridvh8klBv0HCEso1OLOYcHuCv/cS6DNxKH+ZA==", + "version": "4.12.1", + "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.12.1.tgz", + "integrity": "sha512-k8TVBiPkPJT9uHLdOKfFpqcfprwBFOAAXXozRubr7R7PfIuKvQlzcI4M0pALeqXN09vdaMbUdUj+pass+uULAg==", "dev": true } } @@ -9821,12 +9767,6 @@ "unpipe": "1.0.0" }, "dependencies": { - "bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "dev": true - }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", @@ -9842,7 +9782,6 @@ "version": "16.9.0", "resolved": "https://registry.npmjs.org/react/-/react-16.9.0.tgz", "integrity": "sha512-+7LQnFBwkiw+BobzOF6N//BdoNw0ouwmSJTEm9cglOOmsg/TMiFHZLe2sEoN5M7LgJTj9oHH0gxklfnQe66S1w==", - "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -9906,7 +9845,6 @@ "version": "16.9.0", "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-16.9.0.tgz", "integrity": "sha512-YFT2rxO9hM70ewk9jq0y6sQk8cL02xm4+IzYBz75CQGlClQQ1Bxq0nhHF6OtSbit+AIahujJgb/CPRibFkMNJQ==", - "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1", @@ -10233,16 +10171,38 @@ "integrity": "sha512-+P3TjtnP0k/FEjcBL5FZpoovtvrTNT/UXd4/sluaSyrURlSlhLSzEdfsTBW7WsKB6yPvgd7q/iZPICFjW4o57Q==", "dev": true }, + "reflect.getprototypeof": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/reflect.getprototypeof/-/reflect.getprototypeof-1.0.7.tgz", + "integrity": "sha512-bMvFGIUKlc/eSfXNX+aZ+EL95/EgZzuwA0OBPTbZZDEJw/0AkentjMuM1oiRfwHrshqk4RzdgiTg5CcDalXN5g==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.5", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "gopd": "^1.0.1", + "which-builtin-type": "^1.1.4" + } + }, "reflect.ownkeys": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-0.2.0.tgz", - "integrity": "sha512-qOLsBKHCpSOFKK1NUOCGC5VyeufB6lEsFe92AL2bhIJsacZS1qdoOZSbPk3MYKuT2cFlRDnulKXuuElIrMjGUg==", - "dev": true + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/reflect.ownkeys/-/reflect.ownkeys-1.1.4.tgz", + "integrity": "sha512-iUNmtLgzudssL+qnTUosCmnq3eczlrVd1wXrgx/GhiI/8FvwrTYWtCJ9PNvWIRX+4ftupj2WUfB5mu5s9t6LnA==", + "dev": true, + "requires": { + "call-bind": "^1.0.2", + "define-properties": "^1.2.0", + "es-abstract": "^1.22.1", + "es-set-tostringtag": "^2.0.1", + "globalthis": "^1.0.3" + } }, "regenerator-runtime": { - "version": "0.11.1", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", - "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "regex-cache": { "version": "0.4.4", @@ -10263,15 +10223,15 @@ } }, "regexp.prototype.flags": { - "version": "1.5.2", - "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.2.tgz", - "integrity": "sha512-NcDiDkTLuPR+++OCKB0nWafEmhg/Da8aUPLPMQbK+bxKKCm1/S5he+AqYa4PlMCVBalb4/yxIRub6qkEx5yJbw==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/regexp.prototype.flags/-/regexp.prototype.flags-1.5.3.tgz", + "integrity": "sha512-vqlC04+RQoFalODCbCumG2xIOvapzVMHwsyIGM/SIE8fRhFFsXeH8/QQ+s0T0kDAhKc4k30s73/0ydkHQz6HlQ==", "dev": true, "requires": { - "call-bind": "^1.0.6", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", "es-errors": "^1.3.0", - "set-function-name": "^2.0.1" + "set-function-name": "^2.0.2" } }, "regexpp": { @@ -10481,9 +10441,9 @@ "dev": true }, "rfdc": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.3.1.tgz", - "integrity": "sha512-r5a3l5HzYlIC68TpmYKlxWjmOP6wiPJ1vWv2HeLhNsRZMrCkxeqxiHlQ21oXmQ4F3SiryXBHhAD7JZqvOJjFmg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.4.1.tgz", + "integrity": "sha512-q1b3N5QkRUWUl7iyylaaj3kOpIT0N2i9MqIEQXP73GVsN9cw3fdx8X63cEmWhJGi2PPCF23Ijp7ktmd39rawIA==", "dev": true }, "right-align": { @@ -10740,6 +10700,16 @@ "y18n": "^3.2.1", "yargs-parser": "^5.0.1" } + }, + "yargs-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", + "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", + "dev": true, + "requires": { + "camelcase": "^3.0.0", + "object.assign": "^4.1.0" + } } } }, @@ -10774,7 +10744,6 @@ "version": "0.15.0", "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.15.0.tgz", "integrity": "sha512-xAefmSfN6jqAa7Kuq7LIJY0bwAPG3xlCj0HMEBQk1lxYiDKZscY2xJ5U/61ZTrYbmNQbXa+gc7czPkVo11tnCg==", - "dev": true, "requires": { "loose-envify": "^1.1.0", "object-assign": "^4.1.1" @@ -11263,6 +11232,65 @@ } } }, + "socket.io": { + "version": "4.8.1", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", + "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", + "dev": true, + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.6.0", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "dependencies": { + "debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, + "socket.io-adapter": { + "version": "2.5.5", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", + "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", + "dev": true, + "requires": { + "debug": "~4.3.4", + "ws": "~8.17.1" + }, + "dependencies": { + "debug": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", + "dev": true, + "requires": { + "ms": "^2.1.3" + } + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true + } + } + }, "socket.io-parser": { "version": "4.2.4", "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", @@ -11273,29 +11301,19 @@ "debug": "~4.3.1" }, "dependencies": { - "component-emitter": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", - "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==" - }, "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.3" } }, - "isarray": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz", - "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==" - }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true } } @@ -11558,25 +11576,19 @@ "fs-extra": "^8.1.0" }, "dependencies": { - "date-format": { - "version": "4.0.14", - "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", - "integrity": "sha512-39BOQLs9ZjKh0/patS9nrT8wc3ioX3/eA/zgbKNopnF2wCqJEoxywwwElATYvRsXdnOxA/OQeQoFZ3rFjVajhg==", - "dev": true - }, "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", + "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", "dev": true, "requires": { - "ms": "2.1.2" + "ms": "^2.1.3" } }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true } } @@ -11814,12 +11826,6 @@ "integrity": "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==", "dev": true }, - "circular-json": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", - "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", - "dev": true - }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", @@ -12033,16 +12039,6 @@ "integrity": "sha512-4JD/Ivzg7PoW8NzdrBSr3UFwC9mHgvI7Z6z3QGBsSHgKaRTUDmyZAAKJo2UbG1kUVfS9WS8bi36N49U1xw43DA==", "dev": true }, - "lru-cache": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz", - "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==", - "dev": true, - "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" - } - }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", @@ -12142,17 +12138,11 @@ "requires": { "mkdirp": "^0.5.1" } - }, - "yallist": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", - "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", - "dev": true } } }, "superdesk-core": { - "version": "github:superdesk/superdesk-client-core#be5cb155334b485016df9eb9dea78e8e9848dedf", + "version": "github:superdesk/superdesk-client-core#60d561e73f3f97b6249ffaac255fd35a3091fe8f", "from": "github:superdesk/superdesk-client-core#develop", "dev": true, "requires": { @@ -12250,7 +12240,7 @@ "sass-loader": "6.0.6", "shortid": "2.2.8", "style-loader": "0.20.2", - "superdesk-ui-framework": "^3.1.28", + "superdesk-ui-framework": "^4.0.0", "ts-loader": "3.5.0", "typescript": "4.9.5", "uuid": "8.3.1", @@ -12271,18 +12261,21 @@ "integrity": "sha512-DTt3GhOUDKhh4ONwIJW4lmhyotQmV2LjNlGK/J2hkwUcqcbKkCLAdJPtxQnxnlc7SR3f1CEXCyMmc7WLUsWbNA==", "dev": true }, + "date-fns": { + "version": "2.30.0", + "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.30.0.tgz", + "integrity": "sha512-fnULvOpxnC5/Vg3NCiWelDsLiUc9bRwAPs/+LfTLNvetFCtCTN+yQz15C/fs4AwX1R9K5GLtLfn8QW+dWisaAw==", + "dev": true, + "requires": { + "@babel/runtime": "^7.21.0" + } + }, "json5": { "version": "0.5.1", "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", "integrity": "sha512-4xrs1aW+6N5DalkqSVA8fxh458CXvR99WU8WLKmq4v8eWAL86Xo3BVqyd3SkA9wEVjCMqyvvRRkshAdOnBp5rw==", "dev": true }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", - "dev": true - }, "moment-timezone": { "version": "0.5.41", "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.41.tgz", @@ -12332,55 +12325,13 @@ "invariant": "^2.2.4", "prop-types": "^15.5.7" } - }, - "superdesk-ui-framework": { - "version": "3.1.29", - "resolved": "https://registry.npmjs.org/superdesk-ui-framework/-/superdesk-ui-framework-3.1.29.tgz", - "integrity": "sha512-Dowv3C7+0i3uzqTKwZONSdbvhrRkzesNw6laaJQ80IcuJT7/15VPNspcWK9+eYZQTn3nGJwJZpwdj1i37nLUtA==", - "dev": true, - "requires": { - "@popperjs/core": "^2.4.0", - "@superdesk/common": "0.0.28", - "@superdesk/primereact": "^5.0.2-12", - "@superdesk/react-resizable-panels": "0.0.39", - "chart.js": "^2.9.3", - "date-fns": "2.7.0", - "popper-max-size-modifier": "^0.2.0", - "popper.js": "1.14.4", - "primeicons": "2.0.0", - "react-beautiful-dnd": "^13.0.0", - "react-id-generator": "^3.0.0", - "react-scrollspy": "^3.4.3" - }, - "dependencies": { - "@superdesk/common": { - "version": "0.0.28", - "resolved": "https://registry.npmjs.org/@superdesk/common/-/common-0.0.28.tgz", - "integrity": "sha512-EhsYMm340r3FVrakH00lLvQbxVYYTzL61J5GXI3BI2xLN2dPI3N0AJEaMGqjbt0xUpUFxE3T08OtYvIC5koZvg==", - "dev": true, - "requires": { - "date-fns": "2.7.0", - "lodash": "4.17.19", - "primereact": "^6.0.2", - "react": "16.9.0", - "react-dom": "16.9.0", - "react-sortable-hoc": "^1.11.0" - } - }, - "date-fns": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.7.0.tgz", - "integrity": "sha512-wxYp2PGoUDN5ZEACc61aOtYFvSsJUylIvCjpjDOqM1UDaKIIuMJ9fAnMYFHV3TQaDpfTVxhwNK/GiCaHKuemTA==", - "dev": true - } - } } } }, "superdesk-ui-framework": { - "version": "3.1.29", - "resolved": "https://registry.npmjs.org/superdesk-ui-framework/-/superdesk-ui-framework-3.1.29.tgz", - "integrity": "sha512-Dowv3C7+0i3uzqTKwZONSdbvhrRkzesNw6laaJQ80IcuJT7/15VPNspcWK9+eYZQTn3nGJwJZpwdj1i37nLUtA==", + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/superdesk-ui-framework/-/superdesk-ui-framework-4.0.3.tgz", + "integrity": "sha512-LUNR1u3sK4Ayiq74hXZ5fqp7k9OK/MJogsEXJfeaJQyBWzRdbzwyYjljIXh7gJJExtDEBokLxU33IpjuXuITJA==", "dev": true, "requires": { "@popperjs/core": "^2.4.0", @@ -12411,18 +12362,6 @@ "react-sortable-hoc": "^1.11.0" } }, - "date-fns": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/date-fns/-/date-fns-2.7.0.tgz", - "integrity": "sha512-wxYp2PGoUDN5ZEACc61aOtYFvSsJUylIvCjpjDOqM1UDaKIIuMJ9fAnMYFHV3TQaDpfTVxhwNK/GiCaHKuemTA==", - "dev": true - }, - "lodash": { - "version": "4.17.19", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.19.tgz", - "integrity": "sha512-JNvd8XER9GQX0v2qJgsaN/mzFCNA5BRe/j8JN9d+tWyGLSodKQHKFicdwNYzWwI3wjRnaKPsGj1XkBjx/F96DQ==", - "dev": true - }, "react-sortable-hoc": { "version": "1.11.0", "resolved": "https://registry.npmjs.org/react-sortable-hoc/-/react-sortable-hoc-1.11.0.tgz", @@ -12616,12 +12555,6 @@ "integrity": "sha512-okFlQcoGTi4LQBG/PgSYblw9VOyptsz2KJZqc6qtgGdes8VktzUQkj4BI2blit072iS8VODNcMA+tvnS9dnuMA==", "dev": true }, - "to-fast-properties": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", - "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true - }, "to-object-path": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", @@ -12802,9 +12735,9 @@ } }, "type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.1.0.tgz", + "integrity": "sha512-Acylog8/luQ8L7il+geoSxhEkazvkslg7PSNKOX59mbB9cOveP5aq9h74Y7YU8yDpJwetzQQrfIwtf4Wp4LKcw==", "dev": true }, "type-fest": { @@ -12857,9 +12790,9 @@ } }, "typed-array-byte-offset": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.2.tgz", - "integrity": "sha512-Ous0vodHa56FviZucS2E63zkgtgrACj7omjwd/8lTEMEPFFyjfixMZ1ZXenpgCFBBt4EC1J2XsyVS2gkG0eTFA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/typed-array-byte-offset/-/typed-array-byte-offset-1.0.3.tgz", + "integrity": "sha512-GsvTyUHTriq6o/bHcTd0vM7OQ9JEdlvluu9YISaA7+KzDzPaIzEeDFNkTfhdE3MYcNhNi0vq/LlegYgIs5yPAw==", "dev": true, "requires": { "available-typed-arrays": "^1.0.7", @@ -12867,21 +12800,22 @@ "for-each": "^0.3.3", "gopd": "^1.0.1", "has-proto": "^1.0.3", - "is-typed-array": "^1.1.13" + "is-typed-array": "^1.1.13", + "reflect.getprototypeof": "^1.0.6" } }, "typed-array-length": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", - "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.7.tgz", + "integrity": "sha512-3KS2b+kL7fsuk/eJZ7EQdnEmQoaho/r6KUef7hxvltNA5DR8NAUM+8wJMbJyZ4G9/7i3v5zPBIMN5aybAh2/Jg==", "dev": true, "requires": { "call-bind": "^1.0.7", "for-each": "^0.3.3", "gopd": "^1.0.1", - "has-proto": "^1.0.3", "is-typed-array": "^1.1.13", - "possible-typed-array-names": "^1.0.0" + "possible-typed-array-names": "^1.0.0", + "reflect.getprototypeof": "^1.0.6" } }, "typedarray": { @@ -12914,9 +12848,9 @@ } }, "ua-parser-js": { - "version": "0.7.37", - "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.37.tgz", - "integrity": "sha512-xV8kqRKM+jhMvcHWUKthV9fNebIzrNy//2O9ZwWcfiBFR5f25XVZPLlEajk/sf3Ra15V92isyQqnIEXRDaZWEA==", + "version": "0.7.39", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.39.tgz", + "integrity": "sha512-IZ6acm6RhQHNibSt7+c09hhvsKy9WUr4DVbeq9U8o71qxyYtJpQeDxQnMrVqnIFMLcQjHO0I9wgfO2vIahht4w==", "dev": true }, "uglify-js": { @@ -13060,9 +12994,9 @@ "dev": true }, "undici-types": { - "version": "5.26.5", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "version": "6.20.0", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.20.0.tgz", + "integrity": "sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==", "dev": true }, "union-value": { @@ -13397,7 +13331,6 @@ "dev": true, "optional": true, "requires": { - "bindings": "^1.5.0", "nan": "^2.12.1" } }, @@ -13896,7 +13829,6 @@ "dev": true, "optional": true, "requires": { - "bindings": "^1.5.0", "nan": "^2.12.1" } }, @@ -14086,16 +14018,57 @@ } }, "which-boxed-primitive": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.1.0.tgz", + "integrity": "sha512-Ei7Miu/AXe2JJ4iNF5j/UphAgRoma4trE6PtisM09bPygb3egMH3YLW/befsWb1A1AxvNSFidOFTB18XtnIIng==", + "dev": true, + "requires": { + "is-bigint": "^1.1.0", + "is-boolean-object": "^1.2.0", + "is-number-object": "^1.1.0", + "is-string": "^1.1.0", + "is-symbol": "^1.1.0" + } + }, + "which-builtin-type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/which-builtin-type/-/which-builtin-type-1.2.0.tgz", + "integrity": "sha512-I+qLGQ/vucCby4tf5HsLmGueEla4ZhwTBSqaooS+Y0BuxN4Cp+okmGuV+8mXZ84KDI9BA+oklo+RzKg0ONdSUA==", + "dev": true, + "requires": { + "call-bind": "^1.0.7", + "function.prototype.name": "^1.1.6", + "has-tostringtag": "^1.0.2", + "is-async-function": "^2.0.0", + "is-date-object": "^1.0.5", + "is-finalizationregistry": "^1.1.0", + "is-generator-function": "^1.0.10", + "is-regex": "^1.1.4", + "is-weakref": "^1.0.2", + "isarray": "^2.0.5", + "which-boxed-primitive": "^1.0.2", + "which-collection": "^1.0.2", + "which-typed-array": "^1.1.15" + }, + "dependencies": { + "isarray": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", + "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", + "dev": true + } + } + }, + "which-collection": { "version": "1.0.2", - "resolved": "https://registry.npmjs.org/which-boxed-primitive/-/which-boxed-primitive-1.0.2.tgz", - "integrity": "sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==", + "resolved": "https://registry.npmjs.org/which-collection/-/which-collection-1.0.2.tgz", + "integrity": "sha512-K4jVyjnBdgvc86Y6BkaLZEN933SwYOuBFkdmBu9ZfkcAbdVbpITnDmjvZ/aQjRXQrv5EPkTnD1s39GiiqbngCw==", "dev": true, "requires": { - "is-bigint": "^1.0.1", - "is-boolean-object": "^1.1.0", - "is-number-object": "^1.0.4", - "is-string": "^1.0.5", - "is-symbol": "^1.0.3" + "is-map": "^2.0.3", + "is-set": "^2.0.3", + "is-weakmap": "^2.0.2", + "is-weakset": "^2.0.3" } }, "which-module": { @@ -14105,9 +14078,9 @@ "dev": true }, "which-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.15.tgz", - "integrity": "sha512-oV0jmFtUky6CXfkqehVvBP/LSWJ2sy4vWMioiENyJLePrBO/yKyV9OyJySfAKosh+RYkIl5zJCNZ8/4JncrpdA==", + "version": "1.1.16", + "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.16.tgz", + "integrity": "sha512-g+N+GAWiRj66DngFwHvISJd+ITsyphZvD1vChfVg6cEdnzy53GzB3oy0fUNlvhz7H7+MiqhYr26qxQShCpKTTQ==", "dev": true, "requires": { "available-typed-arrays": "^1.0.7", @@ -14206,9 +14179,9 @@ } }, "ws": { - "version": "8.11.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", - "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true }, "xml-char-classes": { @@ -14236,9 +14209,9 @@ "dev": true }, "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==", "dev": true }, "yargs": { @@ -14254,33 +14227,13 @@ "string-width": "^4.2.0", "y18n": "^5.0.5", "yargs-parser": "^20.2.2" - }, - "dependencies": { - "yargs-parser": { - "version": "20.2.9", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", - "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", - "dev": true - } } }, "yargs-parser": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-5.0.1.tgz", - "integrity": "sha512-wpav5XYiddjXxirPoCTUPbqM0PXvJ9hiBMvuJgInvo4/lAOTZzUprArw17q2O1P2+GHhbBr18/iQwjL5Z9BqfA==", - "dev": true, - "requires": { - "camelcase": "^3.0.0", - "object.assign": "^4.1.0" - }, - "dependencies": { - "camelcase": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-3.0.0.tgz", - "integrity": "sha512-4nhGqUkc4BqbBBB4Q6zLuD7lzzrHYrjKGeYaEji/3tFR5VdJu9v+LilhGIVe8wxEJPPOeWo7eg8dwY13TZ1BNg==", - "dev": true - } - } + "version": "20.2.9", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "dev": true }, "yn": { "version": "2.0.0", diff --git a/package.json b/package.json index 644d0fe1c..4b3712f95 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "superdesk-planning", - "version": "2.8.0-dev", + "version": "2.8.2", "license": "AGPL-3.0", "description": "", "repository": { @@ -19,6 +19,7 @@ }, "author": "Edouard Richard", "dependencies": { + "@superdesk/common": "0.0.17", "dompurify": "^1.0.11", "moment": "^2.30.1", "moment-timezone": "^0.5.45", @@ -68,7 +69,7 @@ "sinon": "^4.5.0", "superdesk-code-style": "1.5.0", "superdesk-core": "github:superdesk/superdesk-client-core#develop", - "superdesk-ui-framework": "^3.1.29", + "superdesk-ui-framework": "^4.0.3", "ts-node": "~7.0.1", "tslint": "5.11.0", "typescript-eslint-parser": "^18.0.0" diff --git a/server/features/assignments.feature b/server/features/assignments.feature index 67ad25d85..624576b57 100644 --- a/server/features/assignments.feature +++ b/server/features/assignments.feature @@ -2084,3 +2084,251 @@ Feature: Assignments ] } """ + + @auth + @vocabularies + Scenario: Reassignment to In-Progress but User Restricted by Manual Config instead of null + When we post to "/archive" + """ + [{ + "type": "text", + "headline": "test headline", + "slugline": "test slugline", + "task": { + "desk": "#desks._id#", + "stage": "#desks.incoming_stage#" + } + }] + """ + When we post to "/planning" + """ + [{ + "item_class": "item class value", + "slugline": "test slugline", + "planning_date": "2016-01-02" + }] + """ + Then we get OK response + When we patch "/planning/#planning._id#" + """ + { + "coverages": [{ + "planning": { + "ednote": "test coverage, I want 250 words", + "slugline": "test slugline" + }, + "assigned_to": { + "desk": "#desks._id#", + "user": "#CONTEXT_USER_ID#", + "assignor_user": "#CONTEXT_USER_ID#" + }, + "workflow_status": "active" + }] + } + """ + Then we get OK response + Then we store assignment id in "firstassignment" from coverage 0 + When we post to "assignments/link" + """ + [{ + "assignment_id": "#firstassignment#", + "item_id": "#archive._id#", + "reassign": true + }] + """ + Then we get OK response + When we get "/archive/#archive._id#" + When we get "/assignments/#firstassignment#" + Then we get OK response + Then we get existing resource + """ + { + "_id": "#firstassignment#", + "planning": { + "ednote": "test coverage, I want 250 words", + "slugline": "test slugline" + }, + "assigned_to": { + "desk": "#desks._id#", + "user": "#CONTEXT_USER_ID#", + "state": "in_progress", + "assignor_user": "#CONTEXT_USER_ID#" + } + } + """ + When we post to "/desks" with "FINANCE_DESK_ID" and success + """ + [{"name": "Finance", "desk_type": "production" }] + """ + And we set config assignment manual reassignment only to True + And we post to "/archive/#archive._id#/move" + """ + [{"task": {"desk": "#desks._id#", "stage": "#desks.incoming_stage#"}}] + """ + Then we get OK response + When we get "/assignments/#firstassignment#" + Then we get OK response + Then we get existing resource + """ + { + "_id": "#firstassignment#", + "planning": { + "ednote": "test coverage, I want 250 words", + "slugline": "test slugline" + }, + "assigned_to": { + "desk": "#desks._id#", + "user": "#CONTEXT_USER_ID#", + "state": "submitted", + "assignor_user": "#CONTEXT_USER_ID#" + } + } + """ + + @auth + @vocabularies + @notification + Scenario: Assignee can not changed as the author of content changes based on Manual config + Given empty "assignments_history" + When we post to "/archive" + """ + [{ + "type": "text", + "headline": "test headline", + "slugline": "test slugline", + "task": { + "desk": "#desks._id#", + "stage": "#desks.incoming_stage#" + } + }] + """ + When we post to "/planning" + """ + [{ + "item_class": "item class value", + "slugline": "test slugline", + "planning_date": "2016-01-02" + }] + """ + Then we get OK response + When we reset notifications + When we patch "/planning/#planning._id#" + """ + { + "coverages": [{ + "planning": { + "ednote": "test coverage, I want 250 words", + "slugline": "test slugline" + }, + "assigned_to": { + "desk": "#desks._id#", + "user": "#CONTEXT_USER_ID#" + }, + "workflow_status": "active" + }] + } + """ + Then we get OK response + Then we store coverage id in "firstcoverage" from coverage 0 + Then we store assignment id in "firstassignment" from coverage 0 + And we get notifications + """ + [{ + "event": "assignments:created", + "extra": { + "item": "#firstassignment#", + "coverage": "#firstcoverage#", + "planning": "#planning._id#", + "assignment_state": "assigned", + "assigned_user": "#CONTEXT_USER_ID#", + "assigned_desk": "#desks._id#", + "lock_user": null, + "user": "#CONTEXT_USER_ID#", + "original_assigned_desk": null, + "original_assigned_user": null + } + }] + """ + Then we store assignment id in "firstassignment" from coverage 0 + When we patch "/archive/#archive._id#" + """ + {"headline": "test headline 2"} + """ + Then we get OK response + When we reset notifications + When we post to "assignments/link" + """ + [{ + "assignment_id": "#firstassignment#", + "item_id": "#archive._id#", + "reassign": true + }] + """ + Then we get OK response + And we get notifications + """ + [{ + "event": "assignments:updated", + "extra": { + "item": "#firstassignment#", + "coverage": "#firstcoverage#", + "planning": "#planning._id#", + "assignment_state": "in_progress", + "assigned_user": "#CONTEXT_USER_ID#", + "assigned_desk": "#desks._id#", + "lock_user": null, + "user": "#CONTEXT_USER_ID#", + "original_assigned_desk": "#desks._id#", + "original_assigned_user": "#CONTEXT_USER_ID#" + } + }] + """ + When we get "/archive/#archive._id#" + Then we get existing resource + """ + { + "assignment_id": "#firstassignment#" + } + """ + When we get "/assignments/#firstassignment#" + Then we get OK response + Then we get existing resource + """ + { + "_id": "#firstassignment#", + "planning": { + "ednote": "test coverage, I want 250 words", + "slugline": "test slugline" + }, + "assigned_to": { + "desk": "#desks._id#", + "user": "#CONTEXT_USER_ID#", + "state": "in_progress" + } + } + """ + When we set config assignment manual reassignment only to True + Then we store "old_assignee_id" with value "#CONTEXT_USER_ID#" to context + When we switch user + When we patch "/archive/#archive._id#" + """ + {"slugline": "I'm changing the user"} + """ + Then we get OK response + When we get "/assignments/#firstassignment#" + Then we get OK response + Then we get existing resource + """ + { + "_id": "#firstassignment#", + "planning": { + "ednote": "test coverage, I want 250 words", + "slugline": "test slugline" + }, + "assigned_to": { + "desk": "#desks._id#", + "state": "in_progress", + "user": "#old_assignee_id#" + } + } + """ diff --git a/server/features/event_embedded_planning.feature b/server/features/event_embedded_planning.feature index 2f0285f1c..2e775d722 100644 --- a/server/features/event_embedded_planning.feature +++ b/server/features/event_embedded_planning.feature @@ -20,10 +20,7 @@ Feature: Event Embedded Planning "news_coverage_status": "ncostat:int", "scheduled": "2029-11-21T15:00:00.000Z" }] - }], - "subject": [ - {"name": "Test", "qcode": "test", "scheme": "test"} - ] + }] }] """ Then we get OK response @@ -63,10 +60,7 @@ Feature: Event Embedded Planning "g2_content_type": "text", "scheduled": "2029-11-21T15:00:00+0000" } - }], - "subject": [ - {"name": "Test", "qcode": "test", "scheme": "test"} - ] + }] }]} """ And we store "PLAN1" with first item @@ -452,3 +446,79 @@ Feature: Event Embedded Planning Then we store response in "PLAN1" When we create "planning" autosave from context item "PLAN1" Then we get OK response + + @auth + @vocabulary + Scenario: Copies configured custom_vocabularies only + Given "planning_types" + """ + [{ + "_id": "event", + "name": "event", + "editor": { + "subject": {"enabled": true}, + "custom_vocabularies": {"enabled": true} + }, + "schema": { + "custom_vocabularies": { + "required": false, + "type": "list", + "vocabularies": ["keywords", "source"] + } + } + }, { + "_id": "planing", + "name": "planning", + "editor": { + "subject": {"enabled": true}, + "custom_vocabularies": {"enabled": true} + }, + "schema": { + "custom_vocabularies": { + "required": false, + "type": "list", + "vocabularies": ["keywords", "destination"] + } + } + }] + """ + When we post to "/events" + """ + [{ + "guid": "event1", + "name": "name1", + "dates": { + "start": "2029-11-21T12:00:00+0000", + "end": "2029-11-21T14:00:00+0000", + "tz": "Australia/Sydney" + }, + "slugline": "slugline1", + "subject":[ + {"qcode": "17004000", "name": "Statistics"}, + {"qcode": "sports", "name": "Sports", "scheme": "keywords"}, + {"qcode": "sport_calendar", "name": "Sport Calendar", "scheme": "source"} + ], + "embedded_planning": [{ + "coverages": [{ + "g2_content_type": "text", + "language": "en", + "news_coverage_status": "ncostat:int", + "scheduled": "2029-11-21T15:00:00+0000", + "genre": "Article" + }] + }] + }] + """ + Then we get OK response + When we get "/events_planning_search?repo=planning&only_future=false&event_item=event1" + Then we get list with 1 items + """ + {"_items": [{ + "_id": "__any_value__", + "slugline": "slugline1", + "subject": [ + {"qcode": "17004000", "name": "Statistics"}, + {"qcode": "sports", "name": "Sports", "scheme": "keywords"} + ] + }]} + """ diff --git a/server/features/events_post.feature b/server/features/events_post.feature index 9ffc04702..5aa53b7ea 100644 --- a/server/features/events_post.feature +++ b/server/features/events_post.feature @@ -1260,6 +1260,112 @@ Feature: Events Post {"failed_planning_ids": [{"_id": "123", "error": ["Related planning : SLUGLINE is a required field"]}]} """ + @auth + @vocabulary + Scenario: Unposting an event will not unpost planning based on config + Given "planning_types" + """ + [{ + "_id": "event", + "name": "event", + "schema": { + "related_plannings": { + "planning_auto_publish": false, + "cancel_plan_with_event": false + } + } + }] + """ + When we post to "events" + """ + { + "name": "TestEvent", + "slugline": "TestEvent", + "dates": { + "start": "2029-11-21T12:00:00.000Z", + "end": "2029-11-21T14:00:00.000Z", + "tz": "Australia/Sydney" + } + } + """ + When we post to "/planning" + """ + { + "item_class": "item class value", + "headline": "test headline", + "slugline": "test slugline", + "planning_date": "2016-01-02", + "event_item": "#events._id#" + } + """ + Then we get OK response + When we post to "/events/post" + """ + { + "event": "#events._id#", + "etag": "#events._etag#", + "pubstatus": "usable" + } + """ + Then we get OK response + When we post to "/planning/post" + """ + { + "planning": "#planning._id#", + "etag": "#planning._etag#", + "pubstatus": "usable" + } + """ + Then we get OK response + When we post to "/events/post" + """ + { + "event": "#events._id#", + "etag": "#events._etag#", + "pubstatus": "cancelled" + } + """ + Then we get OK response + When we get "events/#events._id#" + Then we get existing resource + """ + { + "state": "killed", + "pubstatus": "cancelled" + } + """ + When we get "planning/#planning._id#" + Then we get existing resource + """ + { + "state": "scheduled", + "pubstatus": "usable" + } + """ + When we patch "/planning/#planning._id#" + """ + {"headline": "Updated headline"} + """ + Then we get OK response + When we post to "/planning/post" + """ + { + "planning": "#planning._id#", + "etag": "#planning._etag#", + "pubstatus": "cancelled" + } + """ + Then we get OK response + When we post to "/planning/post" + """ + { + "planning": "#planning._id#", + "etag": "#planning._etag#", + "pubstatus": "usable" + } + """ + Then we get OK response + @auth Scenario: Posting an Event will not post Planning item with secondary link Given config update diff --git a/server/features/recurring_event_and_planning.feature b/server/features/recurring_event_and_planning.feature index dd9f0cab7..6d3256e8d 100644 --- a/server/features/recurring_event_and_planning.feature +++ b/server/features/recurring_event_and_planning.feature @@ -5,8 +5,8 @@ Feature: Recurring Events & Planning [{ "name": "Daily Club", "dates": { - "start": "2024-11-21T12:00:00.000Z", - "end": "2024-11-21T14:00:00.000Z", + "start": "2050-11-21T12:00:00.000Z", + "end": "2050-11-21T14:00:00.000Z", "tz": "Australia/Sydney", "recurring_rule": { "frequency": "DAILY", @@ -28,17 +28,17 @@ Feature: Recurring Events & Planning "_id": "#EVENT1._id#", "recurrence_id": "#EVENT1.recurrence_id#", "name": "Daily Club", - "dates": {"start": "2024-11-21T12:00:00+0000", "end": "2024-11-21T14:00:00+0000"} + "dates": {"start": "2050-11-21T12:00:00+0000", "end": "2050-11-21T14:00:00+0000"} }, { "_id": "#EVENT2._id#", "recurrence_id": "#EVENT1.recurrence_id#", "name": "Daily Club", - "dates": {"start": "2024-11-22T12:00:00+0000", "end": "2024-11-22T14:00:00+0000"} + "dates": {"start": "2050-11-22T12:00:00+0000", "end": "2050-11-22T14:00:00+0000"} }, { "_id": "#EVENT3._id#", "recurrence_id": "#EVENT1.recurrence_id#", "name": "Daily Club", - "dates": {"start": "2024-11-23T12:00:00+0000", "end": "2024-11-23T14:00:00+0000"} + "dates": {"start": "2050-11-23T12:00:00+0000", "end": "2050-11-23T14:00:00+0000"} }]} """ @@ -49,7 +49,7 @@ Feature: Recurring Events & Planning [{ "headline": "test headline", "related_events": [{"_id": "#EVENT1._id#", "link_type": "primary", "recurrence_id": "#EVENT1.recurrence_id#"}], - "planning_date": "2024-11-21T12:00:00.000Z", + "planning_date": "2050-11-21T12:00:00.000Z", "coverages": [{ "workflow_status": "draft", "news_coverage_status": {"qcode": "ncostat:int"}, @@ -57,7 +57,7 @@ Feature: Recurring Events & Planning "headline": "test headline", "slugline": "test slugline", "g2_content_type": "text", - "scheduled": "2024-11-21T15:00:00.000Z" + "scheduled": "2050-11-21T15:00:00.000Z" } }, { "workflow_status": "draft", @@ -66,7 +66,7 @@ Feature: Recurring Events & Planning "headline": "test headline", "slugline": "test slugline", "g2_content_type": "picture", - "scheduled": "2024-11-21T16:00:00.000Z" + "scheduled": "2050-11-21T16:00:00.000Z" } }] }] @@ -79,12 +79,12 @@ Feature: Recurring Events & Planning "guid": "__any_value__", "type": "planning", "headline": "test headline", - "planning_date": "2024-11-21T12:00:00+0000", "related_events": [{"_id": "#EVENT1._id#", "link_type": "primary", "recurrence_id": "#EVENT1.recurrence_id#"}], + "planning_date": "2050-11-21T12:00:00+0000", "recurrence_id": "#EVENT1.recurrence_id#", "coverages": [ - {"planning": {"g2_content_type": "text", "scheduled": "2024-11-21T15:00:00+0000"}}, - {"planning": {"g2_content_type": "picture", "scheduled": "2024-11-21T16:00:00+0000"}} + {"planning": {"g2_content_type": "text", "scheduled": "2050-11-21T15:00:00+0000"}}, + {"planning": {"g2_content_type": "picture", "scheduled": "2050-11-21T16:00:00+0000"}} ] }]} """ @@ -96,7 +96,7 @@ Feature: Recurring Events & Planning [{ "headline": "test headline", "related_events": [{"_id": "#EVENT2._id#", "link_type": "primary", "recurrence_id": "#EVENT2.recurrence_id#"}], - "planning_date": "2024-11-22T12:00:00.000Z", + "planning_date": "2050-11-22T12:00:00.000Z", "update_method": "future", "coverages": [{ "workflow_status": "draft", @@ -105,7 +105,7 @@ Feature: Recurring Events & Planning "headline": "test headline", "slugline": "test slugline", "g2_content_type": "text", - "scheduled": "2024-11-22T15:00:00.000Z" + "scheduled": "2050-11-22T15:00:00.000Z" } }, { "workflow_status": "draft", @@ -114,7 +114,7 @@ Feature: Recurring Events & Planning "headline": "test headline", "slugline": "test slugline", "g2_content_type": "picture", - "scheduled": "2024-11-22T16:00:00.000Z" + "scheduled": "2050-11-22T16:00:00.000Z" } }] }] @@ -127,23 +127,23 @@ Feature: Recurring Events & Planning "guid": "__any_value__", "type": "planning", "headline": "test headline", - "planning_date": "2024-11-22T12:00:00+0000", "related_events": [{"_id": "#EVENT2._id#", "link_type": "primary", "recurrence_id": "#EVENT1.recurrence_id#"}], + "planning_date": "2050-11-22T12:00:00+0000", "recurrence_id": "#EVENT1.recurrence_id#", "coverages": [ - {"planning": {"g2_content_type": "text", "scheduled": "2024-11-22T15:00:00+0000"}}, - {"planning": {"g2_content_type": "picture", "scheduled": "2024-11-22T16:00:00+0000"}} + {"planning": {"g2_content_type": "text", "scheduled": "2050-11-22T15:00:00+0000"}}, + {"planning": {"g2_content_type": "picture", "scheduled": "2050-11-22T16:00:00+0000"}} ] }, { "guid": "__any_value__", "type": "planning", "headline": "test headline", - "planning_date": "2024-11-23T12:00:00+0000", "related_events": [{"_id": "#EVENT3._id#", "link_type": "primary", "recurrence_id": "#EVENT1.recurrence_id#"}], + "planning_date": "2050-11-23T12:00:00+0000", "recurrence_id": "#EVENT1.recurrence_id#", "coverages": [ - {"planning": {"g2_content_type": "text", "scheduled": "2024-11-23T15:00:00+0000"}}, - {"planning": {"g2_content_type": "picture", "scheduled": "2024-11-23T16:00:00+0000"}} + {"planning": {"g2_content_type": "text", "scheduled": "2050-11-23T15:00:00+0000"}}, + {"planning": {"g2_content_type": "picture", "scheduled": "2050-11-23T16:00:00+0000"}} ] }]} """ @@ -155,7 +155,7 @@ Feature: Recurring Events & Planning [{ "headline": "test headline", "related_events": [{"_id": "#EVENT1._id#", "link_type": "primary", "recurrence_id": "#EVENT1.recurrence_id#"}], - "planning_date": "2024-11-21T12:00:00.000Z", + "planning_date": "2050-11-21T12:00:00.000Z", "update_method": "all", "coverages": [{ "workflow_status": "draft", @@ -164,7 +164,7 @@ Feature: Recurring Events & Planning "headline": "test headline", "slugline": "test slugline", "g2_content_type": "text", - "scheduled": "2024-11-21T15:00:00.000Z" + "scheduled": "2050-11-21T15:00:00.000Z" } }, { "workflow_status": "draft", @@ -173,7 +173,7 @@ Feature: Recurring Events & Planning "headline": "test headline", "slugline": "test slugline", "g2_content_type": "picture", - "scheduled": "2024-11-21T16:00:00.000Z" + "scheduled": "2050-11-21T16:00:00.000Z" } }] }] @@ -186,33 +186,34 @@ Feature: Recurring Events & Planning "guid": "__any_value__", "type": "planning", "headline": "test headline", - "planning_date": "2024-11-21T12:00:00+0000", "related_events": [{"_id": "#EVENT1._id#", "link_type": "primary", "recurrence_id": "#EVENT1.recurrence_id#"}], + "planning_date": "2050-11-21T12:00:00+0000", "recurrence_id": "#EVENT1.recurrence_id#", "coverages": [ - {"planning": {"g2_content_type": "text", "scheduled": "2024-11-21T15:00:00+0000"}}, - {"planning": {"g2_content_type": "picture", "scheduled": "2024-11-21T16:00:00+0000"}} + {"planning": {"g2_content_type": "text", "scheduled": "2050-11-21T15:00:00+0000"}}, + {"planning": {"g2_content_type": "picture", "scheduled": "2050-11-21T16:00:00+0000"}} ] }, { "guid": "__any_value__", "type": "planning", "headline": "test headline", - "planning_date": "2024-11-22T12:00:00+0000", "related_events": [{"_id": "#EVENT2._id#", "link_type": "primary", "recurrence_id": "#EVENT1.recurrence_id#"}], + "planning_date": "2050-11-22T12:00:00+0000", + "recurrence_id": "#EVENT1.recurrence_id#", "coverages": [ - {"planning": {"g2_content_type": "text", "scheduled": "2024-11-22T15:00:00+0000"}}, - {"planning": {"g2_content_type": "picture", "scheduled": "2024-11-22T16:00:00+0000"}} + {"planning": {"g2_content_type": "text", "scheduled": "2050-11-22T15:00:00+0000"}}, + {"planning": {"g2_content_type": "picture", "scheduled": "2050-11-22T16:00:00+0000"}} ] }, { "guid": "__any_value__", "type": "planning", "headline": "test headline", - "planning_date": "2024-11-23T12:00:00+0000", "related_events": [{"_id": "#EVENT3._id#", "link_type": "primary", "recurrence_id": "#EVENT1.recurrence_id#"}], + "planning_date": "2050-11-23T12:00:00+0000", "recurrence_id": "#EVENT1.recurrence_id#", "coverages": [ - {"planning": {"g2_content_type": "text", "scheduled": "2024-11-23T15:00:00+0000"}}, - {"planning": {"g2_content_type": "picture", "scheduled": "2024-11-23T16:00:00+0000"}} + {"planning": {"g2_content_type": "text", "scheduled": "2050-11-23T15:00:00+0000"}}, + {"planning": {"g2_content_type": "picture", "scheduled": "2050-11-23T16:00:00+0000"}} ] }]} """ @@ -227,13 +228,13 @@ Feature: Recurring Events & Planning "coverages": [{ "g2_content_type": "text", "news_coverage_status": "ncostat:int", - "scheduled": "2024-11-22T15:00:00.000Z", + "scheduled": "2050-11-22T15:00:00.000Z", "slugline": "test slugline", "headline": "test headline" }, { "g2_content_type": "picture", "news_coverage_status": "ncostat:int", - "scheduled": "2024-11-22T16:00:00.000Z", + "scheduled": "2050-11-22T16:00:00.000Z", "slugline": "test slugline", "headline": "test headline" }] @@ -247,22 +248,22 @@ Feature: Recurring Events & Planning {"_items": [{ "guid": "__any_value__", "type": "planning", - "planning_date": "2024-11-22T12:00:00+0000", "related_events": [{"_id": "#EVENT2._id#", "link_type": "primary", "recurrence_id": "#EVENT1.recurrence_id#"}], + "planning_date": "2050-11-22T12:00:00+0000", "recurrence_id": "#EVENT1.recurrence_id#", "coverages": [ - {"planning": {"g2_content_type": "text", "scheduled": "2024-11-22T15:00:00+0000"}}, - {"planning": {"g2_content_type": "picture", "scheduled": "2024-11-22T16:00:00+0000"}} + {"planning": {"g2_content_type": "text", "scheduled": "2050-11-22T15:00:00+0000"}}, + {"planning": {"g2_content_type": "picture", "scheduled": "2050-11-22T16:00:00+0000"}} ] }, { "guid": "__any_value__", "type": "planning", - "planning_date": "2024-11-23T12:00:00+0000", "related_events": [{"_id": "#EVENT3._id#", "link_type": "primary", "recurrence_id": "#EVENT1.recurrence_id#"}], + "planning_date": "2050-11-23T12:00:00+0000", "recurrence_id": "#EVENT1.recurrence_id#", "coverages": [ - {"planning": {"g2_content_type": "text", "scheduled": "2024-11-23T15:00:00+0000"}}, - {"planning": {"g2_content_type": "picture", "scheduled": "2024-11-23T16:00:00+0000"}} + {"planning": {"g2_content_type": "text", "scheduled": "2050-11-23T15:00:00+0000"}}, + {"planning": {"g2_content_type": "picture", "scheduled": "2050-11-23T16:00:00+0000"}} ] }]} """ @@ -277,13 +278,13 @@ Feature: Recurring Events & Planning "coverages": [{ "g2_content_type": "text", "news_coverage_status": "ncostat:int", - "scheduled": "2024-11-22T15:00:00.000Z", + "scheduled": "2050-11-22T15:00:00.000Z", "slugline": "test slugline", "headline": "test headline" }, { "g2_content_type": "picture", "news_coverage_status": "ncostat:int", - "scheduled": "2024-11-22T16:00:00.000Z", + "scheduled": "2050-11-22T16:00:00.000Z", "slugline": "test slugline", "headline": "test headline" }] @@ -297,32 +298,32 @@ Feature: Recurring Events & Planning {"_items": [{ "guid": "__any_value__", "type": "planning", - "planning_date": "2024-11-21T12:00:00+0000", "related_events": [{"_id": "#EVENT1._id#", "link_type": "primary", "recurrence_id": "#EVENT1.recurrence_id#"}], + "planning_date": "2050-11-21T12:00:00+0000", "recurrence_id": "#EVENT1.recurrence_id#", "coverages": [ - {"planning": {"g2_content_type": "text", "scheduled": "2024-11-21T15:00:00+0000"}}, - {"planning": {"g2_content_type": "picture", "scheduled": "2024-11-21T16:00:00+0000"}} + {"planning": {"g2_content_type": "text", "scheduled": "2050-11-21T15:00:00+0000"}}, + {"planning": {"g2_content_type": "picture", "scheduled": "2050-11-21T16:00:00+0000"}} ] }, { "guid": "__any_value__", "type": "planning", - "planning_date": "2024-11-22T12:00:00+0000", "related_events": [{"_id": "#EVENT2._id#", "link_type": "primary", "recurrence_id": "#EVENT1.recurrence_id#"}], + "planning_date": "2050-11-22T12:00:00+0000", "recurrence_id": "#EVENT1.recurrence_id#", "coverages": [ - {"planning": {"g2_content_type": "text", "scheduled": "2024-11-22T15:00:00+0000"}}, - {"planning": {"g2_content_type": "picture", "scheduled": "2024-11-22T16:00:00+0000"}} + {"planning": {"g2_content_type": "text", "scheduled": "2050-11-22T15:00:00+0000"}}, + {"planning": {"g2_content_type": "picture", "scheduled": "2050-11-22T16:00:00+0000"}} ] }, { "guid": "__any_value__", "type": "planning", - "planning_date": "2024-11-23T12:00:00+0000", "related_events": [{"_id": "#EVENT3._id#", "link_type": "primary", "recurrence_id": "#EVENT1.recurrence_id#"}], + "planning_date": "2050-11-23T12:00:00+0000", "recurrence_id": "#EVENT1.recurrence_id#", "coverages": [ - {"planning": {"g2_content_type": "text", "scheduled": "2024-11-23T15:00:00+0000"}}, - {"planning": {"g2_content_type": "picture", "scheduled": "2024-11-23T16:00:00+0000"}} + {"planning": {"g2_content_type": "text", "scheduled": "2050-11-23T15:00:00+0000"}}, + {"planning": {"g2_content_type": "picture", "scheduled": "2050-11-23T16:00:00+0000"}} ] }]} """ diff --git a/server/features/steps/steps.py b/server/features/steps/steps.py index ee9ac5541..9b745dccf 100644 --- a/server/features/steps/steps.py +++ b/server/features/steps/steps.py @@ -399,6 +399,11 @@ def then_set_auto_workflow(context): context.app.config["PLANNING_AUTO_ASSIGN_TO_WORKFLOW"] = True +@when("we set config assignment manual reassignment only to True") +def then_set_assignment_manual_reassignment_only(context): + context.app.config["ASSIGNMENT_MANUAL_REASSIGNMENT_ONLY"] = True + + @when("we set PLANNING_USE_XMP_FOR_PIC_ASSIGNMENTS") def then_set_use_xmp_for_pic_assignments(context): ABS_PATH = os.path.abspath(os.path.join(os.path.dirname(__file__), "../")) diff --git a/server/planning/__init__.py b/server/planning/__init__.py index 58f960ad9..9a74211b3 100644 --- a/server/planning/__init__.py +++ b/server/planning/__init__.py @@ -78,7 +78,7 @@ from planning.planning_locks import init_app as init_planning_locks_app from planning.search.planning_autocomplete import init_app as init_planning_autocomplete_app -__version__ = "2.8.0-dev" +__version__ = "2.8.2" _SERVER_PATH = os.path.dirname(os.path.realpath(__file__)) diff --git a/server/planning/assignments/assignments.py b/server/planning/assignments/assignments.py index 1587f4796..ee990caad 100644 --- a/server/planning/assignments/assignments.py +++ b/server/planning/assignments/assignments.py @@ -67,6 +67,7 @@ update_assignment_on_link_unlink, get_notify_self_on_assignment, planning_auto_assign_to_workflow, + get_config_assignment_manual_reassignment_only, ) from planning.planning_notifications import PlanningNotifications @@ -880,10 +881,12 @@ def _get_empty_updates_for_assignment(self, assignment): def _set_user_for_assignment(self, assignment, assignee, assignor=None): updates = self._get_empty_updates_for_assignment(assignment) - updates["assigned_to"]["user"] = assignee - if assignor: - updates["assigned_to"]["assignor_user"] = assignor + if not get_config_assignment_manual_reassignment_only(): + updates["assigned_to"]["user"] = assignee + + if assignor: + updates["assigned_to"]["assignor_user"] = assignor return updates diff --git a/server/planning/assignments/assignments_history.py b/server/planning/assignments/assignments_history.py index 51198a9d5..2f184ccb5 100644 --- a/server/planning/assignments/assignments_history.py +++ b/server/planning/assignments/assignments_history.py @@ -108,30 +108,32 @@ def on_item_updated(self, updates, original, operation=None): self._save_history(item, diff, operation) return - # Split an update to two actions if needed - planning_history_service = get_resource_service("planning_history") - cov_diff = {"coverage_id": original.get("coverage_item"), "assigned_to": {}} - if "priority" in diff.keys(): - cov_diff["assigned_to"]["priority"] = diff.pop("priority") - self._save_history( - item, - {"priority": cov_diff["assigned_to"]["priority"]}, - ASSIGNMENT_HISTORY_ACTIONS.EDIT_PRIORITY, - ) - planning_history_service._save_history( - {"_id": original.get("planning_item")}, - cov_diff, - ASSIGNMENT_HISTORY_ACTIONS.EDIT_PRIORITY, - ) - - if "assigned_to" in diff.keys(): - cov_diff["assigned_to"] = diff["assigned_to"] - self._save_history(item, diff, ASSIGNMENT_HISTORY_ACTIONS.REASSIGNED) - planning_history_service._save_history( - {"_id": original.get("planning_item")}, - cov_diff, - ASSIGNMENT_HISTORY_ACTIONS.REASSIGNED, - ) + if diff: + # Split an update to two actions if needed + planning_history_service = get_resource_service("planning_history") + cov_diff = {"coverage_id": original.get("coverage_item"), "assigned_to": {}} + + if "priority" in diff.keys(): + cov_diff["assigned_to"]["priority"] = diff.pop("priority") + self._save_history( + item, + {"priority": cov_diff["assigned_to"]["priority"]}, + ASSIGNMENT_HISTORY_ACTIONS.EDIT_PRIORITY, + ) + planning_history_service._save_history( + {"_id": original.get("planning_item")}, + cov_diff, + ASSIGNMENT_HISTORY_ACTIONS.EDIT_PRIORITY, + ) + + if "assigned_to" in diff.keys(): + cov_diff["assigned_to"] = diff["assigned_to"] + self._save_history(item, diff, ASSIGNMENT_HISTORY_ACTIONS.REASSIGNED) + planning_history_service._save_history( + {"_id": original.get("planning_item")}, + cov_diff, + ASSIGNMENT_HISTORY_ACTIONS.REASSIGNED, + ) def on_item_deleted(self, doc): planning = {"_id": doc.get("planning_item")} diff --git a/server/planning/common.py b/server/planning/common.py index 717dcbdc0..d98e04793 100644 --- a/server/planning/common.py +++ b/server/planning/common.py @@ -271,6 +271,10 @@ def get_config_planning_duplicate_retain_assignee_details(current_app=None): return (current_app or app).config.get("PLANNING_DUPLICATE_RETAIN_ASSIGNEE_DETAILS", False) +def get_config_assignment_manual_reassignment_only(current_app=None): + return (current_app or app).config.get("ASSIGNMENT_MANUAL_REASSIGNMENT_ONLY", False) + + def get_coverage_status_from_cv(qcode: str): coverage_states = get_resource_service("vocabularies").find_one(req=None, _id="newscoveragestatus") diff --git a/server/planning/content_profiles/profiles/event.py b/server/planning/content_profiles/profiles/event.py index 0351040dc..afdfea843 100644 --- a/server/planning/content_profiles/profiles/event.py +++ b/server/planning/content_profiles/profiles/event.py @@ -47,6 +47,7 @@ class EventSchema(BaseSchema): related_plannings = schema.ListField() related_plannings.schema["read_only"] = False related_plannings.schema["planning_auto_publish"] = False + related_plannings.schema["cancel_plan_with_event"] = True registration_details = TextField(field_type="multi_line") invitation_details = TextField(field_type="multi_line") accreditation_info = TextField(field_type="single_line") diff --git a/server/planning/content_profiles/profiles/fields.py b/server/planning/content_profiles/profiles/fields.py index 9c8219022..737b24ebe 100644 --- a/server/planning/content_profiles/profiles/fields.py +++ b/server/planning/content_profiles/profiles/fields.py @@ -120,7 +120,6 @@ def __init__( "type": "string", "required": True, "nullable": True, - "allowed": [], }, "service": {"nullable": True}, "parent": {"nullable": True}, diff --git a/server/planning/content_profiles/utils.py b/server/planning/content_profiles/utils.py index eb1c0cd63..d740603d4 100644 --- a/server/planning/content_profiles/utils.py +++ b/server/planning/content_profiles/utils.py @@ -96,3 +96,10 @@ def is_post_planning_with_event_enabled() -> bool: return get_planning_schema("event")["schema"]["related_plannings"]["planning_auto_publish"] is True except (KeyError, TypeError): return False + + +def is_cancel_planning_with_event_enabled() -> bool: + try: + return get_planning_schema("event")["schema"]["related_plannings"]["cancel_plan_with_event"] is True + except (KeyError, TypeError): + return True diff --git a/server/planning/data_updates/00034_20240920-141321_planning_types.py b/server/planning/data_updates/00034_20240920-141321_planning_types.py new file mode 100644 index 000000000..3943447b7 --- /dev/null +++ b/server/planning/data_updates/00034_20240920-141321_planning_types.py @@ -0,0 +1,33 @@ +# -*- coding: utf-8; -*- +# This file is part of Superdesk. +# For the full copyright and license information, please see the +# AUTHORS and LICENSE files distributed with this source code, or +# at https://www.sourcefabric.org/superdesk/license +# +# Author : MarkLark86 +# Creation: 2024-09-20 14:13 + +from superdesk.commands.data_updates import BaseDataUpdate + + +class DataUpdate(BaseDataUpdate): + resource = "planning_types" + + def forwards(self, mongodb_collection, mongodb_database): + for resource_type in ["event", "planning"]: + original_profile = mongodb_collection.find_one({"name": resource_type}) + if not original_profile: + # No need to process this Profile if the defaults are currently used + continue + + try: + schema = original_profile["schema"] + schema["subject"]["schema"]["schema"]["scheme"].pop("allowed", None) + except (KeyError, TypeError): + # ``subject`` or ``allowed`` is not currently set, no need to fix it + continue + + mongodb_collection.update({"name": resource_type}, {"$set": {"schema": schema}}) + + def backwards(self, mongodb_collection, mongodb_database): + pass diff --git a/server/planning/events/events_post.py b/server/planning/events/events_post.py index 126887e46..5e8eda20f 100644 --- a/server/planning/events/events_post.py +++ b/server/planning/events/events_post.py @@ -29,7 +29,7 @@ get_version_item_for_post, ) from planning.utils import try_cast_object_id, get_related_planning_for_events -from planning.content_profiles.utils import is_post_planning_with_event_enabled +from planning.content_profiles.utils import is_post_planning_with_event_enabled, is_cancel_planning_with_event_enabled class EventsPostResource(EventsResource): @@ -247,8 +247,11 @@ def post_related_plannings(self, plannings, new_post_state): try: planning_post_service.post([doc], related_planning=True) except Exception as e: - failed_planning_ids.append({"_id": doc["planning"], "error": e.description}) + failed_planning_ids.append({"_id": doc["planning"], "error": getattr(e, "description", str(e))}) return failed_planning_ids + elif not is_cancel_planning_with_event_enabled(): + return + for planning in plannings: if not planning.get("pubstatus") and planning.get("state") in [ WORKFLOW_STATE.INGESTED, diff --git a/server/planning/events/events_schema.py b/server/planning/events/events_schema.py index 231757c3e..ef060fb01 100644 --- a/server/planning/events/events_schema.py +++ b/server/planning/events/events_schema.py @@ -199,13 +199,15 @@ "location": { "type": "list", "mapping": { + "type": "object", + "dynamic": False, "properties": { "qcode": not_analyzed, "name": {"type": "string"}, - "address": {"type": "object"}, + "address": {"type": "object", "dynamic": True}, "geo": {"type": "string"}, "location": {"type": "geo_point"}, - } + }, }, "nullable": True, }, diff --git a/server/planning/events/events_sync/common.py b/server/planning/events/events_sync/common.py index 95e6830df..924b6b9b8 100644 --- a/server/planning/events/events_sync/common.py +++ b/server/planning/events/events_sync/common.py @@ -11,6 +11,8 @@ from typing import List, Dict, Any from dataclasses import dataclass +from planning.content_profiles.utils import ContentProfileData + @dataclass class SyncItemData: @@ -34,3 +36,22 @@ class SyncData: class VocabsSyncData: coverage_states: Dict[str, Dict[str, str]] genres: Dict[str, Dict[str, str]] + + +def get_enabled_subjects(item: Dict[str, Any], profile: ContentProfileData) -> List[Dict[str, Any]]: + """Returns the list of subjects (including custom_vocabularies) if they're enabled in Planning profile + + :param item: The source item where the subjects are coming from + :param profile: The Planning ContentProfile to determine enabled fields & vocabularies + :return: A list containing the supported subjects and custom_vocabularies for Planning items + """ + + if not item.get("subject") or not {"subject", "custom_vocabularies"} & profile.enabled_fields: + return [] + + try: + cv_schemes = profile.profile["schema"]["custom_vocabularies"]["vocabularies"] or [] + except (KeyError, TypeError): + cv_schemes = [] + + return [subject for subject in item["subject"] if not subject.get("scheme") or subject.get("scheme") in cv_schemes] diff --git a/server/planning/events/events_sync/embedded_planning.py b/server/planning/events/events_sync/embedded_planning.py index 1434b98d6..4a4447e80 100644 --- a/server/planning/events/events_sync/embedded_planning.py +++ b/server/planning/events/events_sync/embedded_planning.py @@ -27,7 +27,7 @@ from planning.content_profiles.utils import AllContentProfileData from planning.utils import get_planning_event_link_method -from .common import VocabsSyncData +from .common import VocabsSyncData, get_enabled_subjects logger = logging.getLogger(__name__) @@ -58,8 +58,6 @@ def create_new_plannings_from_embedded_planning( if field in profiles.planning.enabled_fields ) - planning_fields.add("subject") - multilingual_enabled = profiles.events.is_multilingual and profiles.planning.is_multilingual translations: List[StringFieldTranslation] = [] if multilingual_enabled and "language" in planning_fields and len(event.get("translations") or []): @@ -120,6 +118,8 @@ def map_event_to_planning_translation(translation: StringFieldTranslation): # The Event item contains a value for this field (excluding ``None``), use that new_planning[field] = event.get(field) + new_planning["subject"] = get_enabled_subjects(event, profiles.planning) + if "description_text" in profiles.planning.enabled_fields and event.get("definition_short"): new_planning["description_text"] = event.get("definition_short") diff --git a/server/planning/events/events_sync/planning_sync.py b/server/planning/events/events_sync/planning_sync.py index 1324c02e0..edd9e03bb 100644 --- a/server/planning/events/events_sync/planning_sync.py +++ b/server/planning/events/events_sync/planning_sync.py @@ -13,7 +13,7 @@ from planning.types import StringFieldTranslation from planning.content_profiles.utils import AllContentProfileData -from .common import SyncData +from .common import SyncData, get_enabled_subjects def get_normalised_field_value(item, field): @@ -144,6 +144,9 @@ def sync_existing_planning_item( if field in coverage_sync_fields: _sync_coverage_field(sync_data, field, profiles) + if sync_data.planning.updates.get("subject"): + sync_data.planning.updates["subject"] = get_enabled_subjects(sync_data.planning.updates, profiles.planning) + if sync_data.update_translations: translations: List[StringFieldTranslation] = [] for field in sync_data.planning.updated_translations.keys(): diff --git a/server/planning/planning/planning_post.py b/server/planning/planning/planning_post.py index 6b9a6699f..c037accc0 100644 --- a/server/planning/planning/planning_post.py +++ b/server/planning/planning/planning_post.py @@ -35,6 +35,7 @@ get_version_item_for_post, get_contacts_from_item, ) +from planning.content_profiles.utils import is_cancel_planning_with_event_enabled logger = logging.getLogger(__name__) @@ -57,10 +58,11 @@ class PlanningPostService(BaseService): def create(self, docs, **kwargs): ids = [] assignments_to_delete = [] + cancel_plan_with_event_enabled = is_cancel_planning_with_event_enabled() for doc in docs: plan = get_resource_service("planning").find_one(req=None, _id=doc["planning"]) related_events = get_related_event_items_for_planning(plan, "primary") - self.validate_item(plan, related_events, doc["pubstatus"]) + self.validate_item(plan, related_events, doc["pubstatus"], cancel_plan_with_event_enabled) if not plan: abort(412) @@ -96,9 +98,11 @@ def validate_post_state(self, new_post_state): abort(409) @staticmethod - def validate_item(doc: Planning, related_events: List[Event], new_post_status: str): - if new_post_status == POST_STATE.USABLE and any( - 1 for e in related_events if e.get("pubstatus") == POST_STATE.CANCELLED + def validate_item(doc: Planning, related_events: List[Event], new_post_status: str, cancel_plan_with_event_enabled: bool): + if ( + cancel_plan_with_event_enabled + and new_post_status == POST_STATE.USABLE + and any(1 for e in related_events if e.get("pubstatus") == POST_STATE.CANCELLED) ): raise SuperdeskApiError(message="Can't post the planning item as event is already unposted/cancelled.") diff --git a/server/planning/types/content_profiles.py b/server/planning/types/content_profiles.py index 0ebadf274..bab63e0bf 100644 --- a/server/planning/types/content_profiles.py +++ b/server/planning/types/content_profiles.py @@ -8,13 +8,15 @@ # AUTHORS and LICENSE files distributed with this source code, or # at https://www.sourcefabric.org/superdesk/license -from typing import TypedDict, Dict +from typing import TypedDict, Dict, List class ContentFieldSchema(TypedDict, total=False): multilingual: bool field_type: str planning_auto_publish: bool # Only available in ``related_plannings`` field + cancel_plan_with_event: bool # Only available in ``related_plannings`` field + vocabularies: List[str] # Only available in ``custom_vocabularies`` field class ContentFieldEditor(TypedDict): diff --git a/server/planning/validate/planning_validate.py b/server/planning/validate/planning_validate.py index 2d8afdd6e..deef7e782 100644 --- a/server/planning/validate/planning_validate.py +++ b/server/planning/validate/planning_validate.py @@ -85,6 +85,12 @@ def _validate_planning_auto_publish(self, planning_auto_publish, field, value): """ pass + def _validate_cancel_plan_with_event(self, cancel_plan_with_event, field, value): + """ + {'type': 'boolean', 'nullable': True} + """ + pass + def _validate_default_language(self, default_language, field, value): """ {'type': string, 'nullable': True} @@ -103,6 +109,12 @@ def _validate_multilingual(self, multilingual, field, value): """ pass + def _validate_vocabularies(self, vocabularies, field, value): + """ + {'type': 'list', 'nullable': True} + """ + pass + class PlanningValidateResource(Resource): endpoint_name = "planning_validator" diff --git a/server/requirements.txt b/server/requirements.txt index 085a5941c..fbc7fd95a 100644 --- a/server/requirements.txt +++ b/server/requirements.txt @@ -16,6 +16,7 @@ httmock==1.4.0 responses pytest pytest-env +black~=23.0 -e . # Install in editable state so we get feature fixtures diff --git a/server/settings.py b/server/settings.py index 998c7bb26..2ed7dc46d 100644 --- a/server/settings.py +++ b/server/settings.py @@ -195,3 +195,5 @@ def env(variable, fallback_value=None): PLANNING_EVENT_LINK_METHOD: planning_types.PLANNING_EVENT_LINK_METHOD = "one_primary" PLANNING_DUPLICATE_RETAIN_ASSIGNEE_DETAILS = False + +ASSIGNMENT_MANUAL_REASSIGNMENT_ONLY = False diff --git a/setup.py b/setup.py index eb27bb628..af45d0b73 100644 --- a/setup.py +++ b/setup.py @@ -15,7 +15,7 @@ setup( name="superdesk-planning", - version="2.8.0-dev0", + version="2.8.2", description=DESCRIPTION, long_description=DESCRIPTION, package_dir={"": "server"},