From c9746237410f78533a8d9fba0ea8b3c3580123f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Popovics=20Andr=C3=A1s?= Date: Mon, 8 Aug 2022 18:07:58 +0200 Subject: [PATCH] =?UTF-8?q?=F0=9F=9A=80=F0=9F=9A=80=F0=9F=9A=80=20Release?= =?UTF-8?q?=205.0.0-angular.13=20=F0=9F=9A=80=F0=9F=9A=80=F0=9F=9A=80=20(#?= =?UTF-8?q?7751)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Angular 13 migration author Denys Vuika 1645535464 +0000 committer Andras Popovics 1658854099 +0200 gpgsig -----BEGIN PGP SIGNATURE----- iHUEABYKAB0WIQQp4kkcEG/HRJq2bsSpIH4RXC/6cgUCYuAa0wAKCRCpIH4RXC/6 cpbgAQDdXzCpsWqAu2yGX+KHYg+pO1mY/ChSMVyqmEpJ92cf2QEAj+4v68ezwM7R eWYLTjZtLXNu0oHKejFZbDT2QgR6dQk= =PM8X -----END PGP SIGNATURE----- Angular 13 upgrade ng 11 material 11 remove node-sass flex layout upgrade angular 12 with theming workaround flex 12 upgrade nrwl libs update lock file update builder configs update lock file Angular 13 upgrade fix fix lint workaround to remove remove some unused dependencies fix flex import Signed-off-by: eromano renmove gropu and container as form field to review fix most of the content cycle deps Signed-off-by: eromano nx Signed-off-by: eromano all build not sure all work Signed-off-by: eromano fix demo shell Signed-off-by: eromano fix demo shell Signed-off-by: eromano [AAE-7662] attach file modal TabPage selector update - protractor (#7538) * tab selector update * trigger travis * exclude failing test [AAE-6345] New start process page APA (#7521) * [AAE-6345] New start process page APA * [AAE-6345] Added test * [AAE-6345] Update * CR * Revrite wrapper to component * Quick fix to e2e * Show errors as ng-content * Add Inplace word * Fix unit tests * Fix e2e [ADF-5470] [E2E Automation] Test cases failing on the newest Chrome b… (#7539) * [ADF-5470] [E2E Automation] Test cases failing on the newest Chrome browser 98 [AAE-7160] Setup Playwright in ADF - Storybook testing (#7537) * [AAE-7160] Setup Playwright in ADF - Storybook testing * New test cases for groups component. Reorganize the files * Add to package.json scripts - npm run playwright * Change amount of workers * Change workesr to 2 [AAE-7338] Changed endpoint for process task list (#7522) * [AAE-7338] Changed approach to use token injection * [AAE-7338] moved model files up * [AAE-7338] fixed imports * [AAE-7338] changed class to interface * [AAE-7338] fixed model imports * * Fixed failing unit tests due recent changes * [AAE-7338] fixed unit test Co-authored-by: sivakumar414ram [AAE-7765] Improved display mandatory form fields (#7531) * [MNT-22765] Improved display mandatory form fields * [MNT-22765] added unit tests * [MNT-22765] fixed test with error icon on rest fail * Trigger travis * [MNT-22765] removed underscore from var name * [AAE-7765] removed underscore from unit test * [AAE-7765] fixed css lint * [AAE-7765] fixed e2e error message css class * [AAE-7765] fixed storybook e2e additional unit tests for Viewer component (#7543) * additional unit tests for Viewer component * extra unit tests * fix unit test [ADF-5472] Missing placeholder for inplace input (#7541) [AAE-7801] Export TaskListCloudServiceInterface and BaseCloudService (#7546) [AAE-7376] Added process instance link in task details (#7544) * [AAE-7376] Added process instance link in task details * [AAE-7376] removed redirect logic from ADF * Trigger travis * [AAE-7376] added unit test Playwright travis.yml update (#7545) * Playwright travis.yml update * Travis: Trigger [AAE-7705] unexclude fixed test (#7547) * [AAE-7705] unexclude fixed test * trigger travis LOC-359 - Full fix - UI files localized in 16 languages for ADF 4.9 (#7551) Fail in case of error (#7550) Release 4.9.0 (#7552) * bump versions * generate reports * release notes * update release link Update .travis.yml (#7555) Fix new URL configuration (#7557) * Fix new URL configuration * Update check-ps-cloud-env.sh * Update check-ps-cloud-env.sh * Update .travis.yml * Update test.config.js [AAE-5880] Add Tasks Create, DueDate range testing methods in the testing page (#7549) * [AAE-5880] Add Tasks Create, DueDate range testing methods in the testing page * [AAE-5880] fixed process definition name dropdown select Co-authored-by: Tomasz [ci:force] Manually upgrade to latest js-api (#7560) [AAE-7818] e2e - Task involved users can access process instance details (#7554) * [AAE-7818] e2e - Task involved users can access process instance details * Trigger travis Bump eslint-plugin-import from 2.22.1 to 2.25.4 (#7527) Bumps [eslint-plugin-import](https://github.com/import-js/eslint-plugin-import) from 2.22.1 to 2.25.4. - [Release notes](https://github.com/import-js/eslint-plugin-import/releases) - [Changelog](https://github.com/import-js/eslint-plugin-import/blob/main/CHANGELOG.md) - [Commits](https://github.com/import-js/eslint-plugin-import/compare/v2.22.1...v2.25.4) --- updated-dependencies: - dependency-name: eslint-plugin-import dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump minimist from 1.2.5 to 1.2.6 (#7563) Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump minimist from 1.2.5 to 1.2.6 in /tools/doc (#7561) Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump minimist from 1.2.5 to 1.2.6 in /lib/cli (#7562) Bumps [minimist](https://github.com/substack/minimist) from 1.2.5 to 1.2.6. - [Release notes](https://github.com/substack/minimist/releases) - [Commits](https://github.com/substack/minimist/compare/1.2.5...1.2.6) --- updated-dependencies: - dependency-name: minimist dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Update header.component.md [AAE-7819] Change column order - enable drag and drop for datatable - [1/3] (#7567) * [AAE-7819] Enable drag and drop for datatable [1/3] * [AAE-7819] Change column order - load and save columns order preferences for PROCESSES - [2/3] (#7568) * [AAE-7819] Load and save column order preferences for processes * [AAE-7819] Load and save column order preferences for tasks [3/3] (#7569) * fix css * fix icon module import * Fix unit tests * Fix test * Fix e2e * Fix C279927 [AAE-8086] Propagate form events (#7572) * [AAE-8086] Propagate events * [AAE-8086] Add form rules manager to the form renderer * [AAE-8086] Extensibility improvements * [AAE-8086] Fix wrong import * [AAE-8087] Add form actions * [AAE-8086] Initialize form rules manager on form renderer component changes * [AAE-8087] Fix form actions * [AAE-8087] Fix unit tests for field visibility * trigger travis Provide preference services on for tasks/processes on component module level (#7579) [AAE-8086] Remove form rules events that kill performance (#7583) * [AAE-8086] Remove form rules events that kill performance * [AAE-8086] Handle form loaded event in form rules [AAE-7313] User can claim a task only if he is an candidate and relea… (#7558) * [AAE-7313] User can claim a task only if he is an candidate and release if he is assigned * [AAE-7313] unit test improvements * revert change on angular.json * [AAE-7313] removed focus from unit test describe * Trigger travis * Trigger travis * [AAE-7313] exclude C593997 e2e [AAE-8086] Add form field changed event (#7584) * [AAE-8086] Add form field changed event * [AAE-8086] Send field changed event only qhen value changes (not in visibility check) [AAE-8061] Add groups restriction to people widget (#7586) * [AAE-8061] add groups restriction to people widget * Trigger travis * [AAE-8061] fix lint * [AAE-8061] fix unit tests [AAE-7819] Fix for custom header (#7585) Update branch for JS-API PR#63 (#7581) * [ci:force][auto-commit] Update JS-API to 4.10.0-63 for branch: update-js-api originated from JS-API PR: 63 * [ci:force][auto-commit] Update JS-API to 4.10.0-64 for branch: update-js-api originated from JS-API PR: 64 * [ci:force][auto-commit] Update JS-API to 4.10.0-65 for branch: update-js-api originated from JS-API PR: 65 * [ci:force][auto-commit] Update JS-API to 4.10.0-66 for branch: update-js-api originated from JS-API PR: 66 * [ci:force][auto-commit] Update JS-API to 4.10.0-69 for branch: update-js-api originated from JS-API PR: 69 * [ci:force][auto-commit] Update JS-API to 4.10.0-70 for branch: update-js-api originated from JS-API PR: 70 * [ci:force][auto-commit] Update JS-API to 4.10.0-77 for branch: update-js-api originated from JS-API PR: 77 * generate package lock * fix eslint plugin versions Co-authored-by: Denys Vuika [ci:force][auto-commit] Update JS-API to 4.10.0-78 for branch: update-js-api originated from JS-API PR: 78 (#7589) Bump karma from 6.3.16 to 6.3.17 (#7576) Bumps [karma](https://github.com/karma-runner/karma) from 6.3.16 to 6.3.17. - [Release notes](https://github.com/karma-runner/karma/releases) - [Changelog](https://github.com/karma-runner/karma/blob/master/CHANGELOG.md) - [Commits](https://github.com/karma-runner/karma/compare/v6.3.16...v6.3.17) --- updated-dependencies: - dependency-name: karma dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Bump moment from 2.29.1 to 2.29.2 in /tools/doc (#7574) Bumps [moment](https://github.com/moment/moment) from 2.29.1 to 2.29.2. - [Release notes](https://github.com/moment/moment/releases) - [Changelog](https://github.com/moment/moment/blob/develop/CHANGELOG.md) - [Commits](https://github.com/moment/moment/compare/2.29.1...2.29.2) --- updated-dependencies: - dependency-name: moment dependency-type: direct:production ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> [AAE-8554] - Fix linked dropdown values are displayed but not submitted (#7590) * [AAE-8554] - Fix dropdown values are displayed but not submitted * Make eslint allow ternary [ADF-5480] Fix partially hidden icon on permissions (#7591) Fix reules event filtering when no form is provided (#7592) [AAE-8565] multiple use viewer in form (#7594) * multiple use viewer multiple use in the form of viewer needs multiple instance of ViewUtilService * Update viewer.component.spec.ts * Update viewer.component.spec.ts * Update viewer.component.spec.ts * Update viewer.component.spec.ts use all the filter fields to count the elements (#7595) [AAE-8061] Fix the group restriction for people widget (#7601) * FIx the restrinction * Fix unit test about restricted groups * Add a small sleep to make it green * Add sleep to other checks * Remove sleeps, improve assertions Co-authored-by: MichalFidor AAE-8476 Update sample app (#7603) Release 4.10.0 (#7602) * bump library versions * update package lock * generate reports * release notes for 4.10.0 Fix demo shell proxies (#7613) Added font awesome to icons model map (#7616) * Added font awesome to icons model map * update Update branch for JS-API PR#5 (#7615) * [ci:force][auto-commit] Update JS-API to 4.11.0-121 for branch: update-js-api originated from JS-API PR: 5 * [ci:force][auto-commit] Update JS-API to 4.11.0-122 for branch: update-js-api originated from JS-API PR: 122 [AAE-7817] Show hide columns on datatable (#7580) * [AAE-7817] Show hide columns for data-table * Update * update tests and uses material harness * added pipes test * update * update * added tests for datatable * update * Added documentation * Fix for drop column header * lint fix * fix lint Update branch for JS-API PR#9 (#7625) * [ci:force][auto-commit] Update JS-API to 4.11.0-124 for branch: update-js-api originated from JS-API PR: 9 * [ci:force][auto-commit] Update JS-API to 4.11.0-125 for branch: update-js-api originated from JS-API PR: 125 [AAE-8659] fix eslint configuration for rxjs (#7607) * fix eslint configuration for rxjs * update vs code settings * disable arror-functions warning [MNT-22924] Fix slow search results loading, limit number of pages (#7609) * [MNT-22924] Fix slow search results loading, limit number of pages * Add unit test * Changed some of the values Add eslint ban rule (#7611) [AAE-8648] Fix deprecated copy to clipboard api (#7610) [ci:force] Fix failing copy to clipboard test (#7631) Added missing top-level export for MainMenuDataTableTemplateDirective (#7633) [AAE-8639] Discovery OpenId - Load discovery and pass info to jsapi (#7632) * Load discovery and pass info to jsapi * fix the roles empty scenario tests * Make lint happier * Rename the initApi method * Add secret field Co-authored-by: arditdomi [AAE-8764] Enable left labels in text, number and dropdown cloud widget (#7628) Update branch for JS-API PR#126 (#7629) * [ci:force][auto-commit] Update JS-API to 4.11.0-126 for branch: update-js-api originated from JS-API PR: 126 * [ci:force][auto-commit] Update JS-API to 4.11.0-127 for branch: update-js-api originated from JS-API PR: 127 * [ci:force][auto-commit] Update JS-API to 4.11.0-131 for branch: update-js-api originated from JS-API PR: 131 * [ci:force][auto-commit] Update JS-API to 4.11.0-132 for branch: update-js-api originated from JS-API PR: 132 * [ci:force][auto-commit] Update JS-API to 4.11.0-133 for branch: update-js-api originated from JS-API PR: 133 [AAE-7077] Reset people content service cache on logout (#7637) * reset people content state on logout * unit test * use property accessor [AAE-7817] Add columns selector for processes and tasks tasks (#7612) * [AAE-7817] Add columns selector for processes and tasks tasks * cr * Update * fix unit tests * preserve order while sorting * add input toggle to show main actions * fix test [AAE-8713] feat: create api registry with factories support (#7634) Co-authored-by: Andras Popovics Co-authored-by: Michal Dobkiewicz Co-authored-by: Michał Dobkiewicz use default profile email as scope (#7639) [AAE-8856] Enable left label for form widgets in several widgets (#7640) test: remove flaky file upload e2e test (#7648) * test: remove flaky file upload e2e test Revert "[AAE-8713] feat: create api registry with factories support (… (#7647) * Revert "[AAE-8713] feat: create api registry with factories support (#7634)" This reverts commit 226a6548a1fbaecad9f340e0ac688ef334ab4049. fix small viewport attach file (#7650) [AAE-6242] upload a new version of a file attached in a form (#7651) * [AAE-6242] Create upload new version dialog to handle the upload of the new file version * [AAE-6242] Create version manager service to open version manager dialog * [AAE-6242] Export service and dialog * [AAE-6242] add adf-upload button to the show the upload new file button * [AAE-6242] open upload new version dialog * [AAE-6242] Removed console log * [AAE-8798] display update option name to newVersion * [AAE-8799] Emit version manager data when new file version is uploaded * [AAE-8799] When a new file version is uploaded open new version dialog and update current file version with the new file version * [AAE-8799] Rename UploadNewVersionDialogComponent to VersionManagerDialogComponent and UploadNewVersionDialogData to VersionManagerDialogData * [AAE-8799] Use default root folder id * [AAE-8799] Add #uploadSingleFile ViewChild in order get the input reference * [AAE-8799] Trigger adf-upload-button by clicking on the button in order to open the file chooser and upload a new file version * [AAE-8799] Version manager dialog emits file upload error * [AAE-8799] Format version manager dialog code * [AAE-8799] Reject upload and permission errors * [AAE-8799] Catch upload new version errors * [AAE-8799] Update allowable operation type * [AAE-8799] Rename VersionManagerDialogComponent into NewVersionUploaderDialogComponent and VersionManagerService into NewVersionUploaderService, create specific folder for new version uploader component and service * Restore previous UploadButtonComponent version * [AAE-8799] Use [adf-upload] directive to upload new file version * [AAE-8799] Add mock file for new version uploader unit tests * [AAE-8799] Override mat dialog configuration * [AAE-8799] Add unit test related to event emitted from Dialog * [AAE-8799] Create model to handle New Version Uploader data * [AAE-8799] Return data on dialog close * [AAE-8799] Add showVersionsOnly property to dialog to show only file version list * [AAE-8799] Add dialogAction to emit dialog actions * [AAE-8799] Return observable instead of promise * [AAE-8799] Update new file version type * [AAE-8799] Subscribe dialog because return an Observable * [AAE-8799] Add license header * [AAE-8799] Add i18n new version uploader translations * [AAE-8799] If data.title is not provided, add a default title * [AAE-8799] Change panelClass for manage versions visualizations, add dialog styles * [AAE-8799] Add upload new version dialog unit test * [AAE-8799] Add upload new version dialog unit test related to manage versions section * [AAE-8799] Add onUploadNewFileVersion unit tests * [AAE-8799] Test new dialog panelClass * [AAE-8799] Create a method to set dialog title, if title isn't provided from parent component, a default title is set * [AAE-8799] Add doc to new-version-uploader-dilog component and service * [AAE-8799] Add new-version-uploader.dialog.service documentation [AAE-8929] Get start event form static inputs (#7652) * [AAE-8929] Get start event form static inputs * [AAE-8929] Fix tests [AAE-8948] Fix placeholders styles for left labels (#7656) [AAE-8740 Add a confirmation message in ADW (#7660) * [AAE-8740 Add a confirmation message in ADW * update tests * use MatDialogHarness for tests * Cleaning tests Co-authored-by: Bartosz Sekula [AAE-7856] Show process variables in table (#7630) * [AAE-7856] Show variables in table * Exclude flaky tests * Revert "Exclude flaky tests" This reverts commit 6ac24cc14a90d7b494fbc4dcc72e073e83a46457. [AAE-7856] Show variables columns for tasks (#7659) * Exclude flaky tests * Revert "Exclude flaky tests" This reverts commit 6ac24cc14a90d7b494fbc4dcc72e073e83a46457. * [AAE-7856] Show variable columns in tasks * revert loadTask to reload method name * Temporary solution due to incompatible type used for dates Update process variable column type (#7664) [AAE-8748] - Auth guards call api when access is not in JWT (#7662) * [AAE-8748] - Auth guards call api when access is not in JWT * [ci:force] fix unit tests * Remove fdescribe * Add documentation and unit tests for the user access service * Rename mocks, make e2e independent * Fix login e2e * Move forbidden access e2e under cloud [AAE-8740] Fix default ConfirmDialogComponent title (#7665) [ADF-5272] fe files upload form width is increasing if we upload file name too long (#7666) * [ADF-5272] Add tooltip to show the entire filename * [ADF-5272] Set max-width to div that contains filename to show ellipsis [AAE-8155] Check if it is content admin only when content provider is available (#7667) [AAE-8155] Fix typo in providers (#7669) Update content-node-selector.component.scss (#7673) [ADF-5479] Disable clam/release button for standalone tasks on APA (#7670) * [ADF-5479] Disable clam/release button for standalone tasks on APA * [ADF-5479] remove focus on unit test describe * Trigger travis [AAE-8076] Add groupsRestriction input to docs (#7645) * [AAE-8076] revert storybook changes * Trigger travis [AAE-9094] - Fix app breaking when configured with BASIC auth (#7672) Update branch for JS-API PR#134 (#7638) * [ci:force][auto-commit] Update JS-API to 4.11.0-134 for branch: update-js-api originated from JS-API PR: 134 * [ci:force][auto-commit] Update JS-API to 4.11.0-136 for branch: update-js-api originated from JS-API PR: 136 * [ci:force][auto-commit] Update JS-API to 4.11.0-137 for branch: update-js-api originated from JS-API PR: 137 * [ci:force][auto-commit] Update JS-API to 4.11.0-138 for branch: update-js-api originated from JS-API PR: 138 * [ci:force][auto-commit] Update JS-API to 4.11.0-138 for branch: update-js-api originated from JS-API PR: 139 * [ci:force][auto-commit] Update JS-API to 4.11.0-140 for branch: update-js-api originated from JS-API PR: 140 * [ci:force][auto-commit] Update JS-API to 4.11.0-142 for branch: update-js-api originated from JS-API PR: 142 * [ci:force][auto-commit] Update JS-API to 4.11.0-144 for branch: update-js-api originated from JS-API PR: 144 * [ci:force][auto-commit] Update JS-API to 4.11.0-145 for branch: update-js-api originated from JS-API PR: 145 * [ci:force][auto-commit] Update JS-API to 4.11.0-146 for branch: update-js-api originated from JS-API PR: 146 * [ci:force][auto-commit] Update JS-API to 4.11.0-147 for branch: update-js-api originated from JS-API PR: 147 * [ci:force][auto-commit] Update JS-API to 4.11.0-148 for branch: update-js-api originated from JS-API PR: 148 * [ci:force][auto-commit] Update JS-API to 4.11.0-149 for branch: update-js-api originated from JS-API PR: 149 * [ci:force][auto-commit] Update JS-API to 4.11.0-150 for branch: update-js-api originated from JS-API PR: 150 * [ci:force][auto-commit] Update JS-API to 4.11.0-154 for branch: update-js-api originated from JS-API PR: 154 * [ci:force][auto-commit] Update JS-API to 4.11.0-154 for branch: update-js-api originated from JS-API PR: 157 * [ci:force][auto-commit] Update JS-API to 4.11.0-158 for branch: update-js-api originated from JS-API PR: 158 * [ci:force][auto-commit] Update JS-API to 4.11.0-159 for branch: update-js-api originated from JS-API PR: 159 * [ci:force][auto-commit] Update JS-API to 4.11.0-161 for branch: update-js-api originated from JS-API PR: 161 * [ci:force][auto-commit] Update JS-API to 4.11.0-162 for branch: update-js-api originated from JS-API PR: 162 * [ci:force][auto-commit] Update JS-API to 4.11.0-163 for branch: update-js-api originated from JS-API PR: 163 * [ci:force][auto-commit] Update JS-API to 4.11.0-164 for branch: update-js-api originated from JS-API PR: 164 * [ci:force][auto-commit] Update JS-API to 4.11.0-165 for branch: update-js-api originated from JS-API PR: 165 * [ci:force][auto-commit] Update JS-API to 4.11.0-166 for branch: update-js-api originated from JS-API PR: 166 * [ci:force][auto-commit] Update JS-API to 4.11.0-167 for branch: update-js-api originated from JS-API PR: 167 * [ci:force][auto-commit] Update JS-API to 4.11.0-169 for branch: update-js-api originated from JS-API PR: 169 Convert login fields validation e2e to unit (#7674) [ci:force][auto-commit] Update JS-API to 4.11.0 for branch: update-js-api originated from JS-API PR: 173 (#7675) [ADF-5494] Remove useless imports (#7678) * Remove useless imports * rollback constants * Remove useless variable [ACS-3108] Release 4.11.0 (#7677) * bump versions * generate reports * release notes Transform e2e into unit (#7671) [AAE-8713] feat: create api registry with factories support (#7649) Co-authored-by: Andras Popovics Co-authored-by: Michal Dobkiewicz Co-authored-by: Michał Dobkiewicz Fix the nx path to avoid installing it globally (#7681) * fix nx path * fix nx * fix nx * fix nx * fix nx * fix nx * fix nx [AAE-9293] Allow editing and restoring default process cloud filter (#7684) * [AAE-9293] Allow editing and restoring default process cloud filter * [AAE-9293] Fix e2e tests * [AAE-9293] Fix review comments [AAE-9135] Print simple form (#7683) Fetch the userInfo once loggedIn and expose the capability of admin (#7682) * Fetch the userInfo once loggedIn and expose the cabilibility of admin * Rollback method * Return same use if defined * Use the same pepleContent service for UserInfoCOmpnent * Remove useless import * Use interface * Use angular resolver instead of guard * Remove fdescribe * Fix linting * Regenerate doc * Improve doc * Fix optional * Fix the unit test * Fix comment * Fix lint * Fix unit * Add fetch user as part of the ssoGuard * Fix unit test after fetch * Add additional unit * Fix await [AAE-9337] Improve update project script (#7687) [ci:force][auto-commit] Update JS-API to 4.12.0-191 for branch: update-js-api originated from JS-API PR: 32 (#7676) APPS-1568 ACA should be extended to support visibility rules for Document List columns (#7685) * APPS-1568 Extended rules functionality for Document List columns [AAE-9298] FE ADF Date widget handle dynamic date values (#7689) * [AAE-9298] Add dynamic date fields to FormFieldModel * [AAE-9298] Change dynamic date range types from string to integer * [AAE-9298] If dynamicDateRangeSelection is true, it will evaluate minDateRangeValue and maxDateRangeValue to set min and max date if are set * [AAE-9298] Check if date range values are numbers [AAE-9314] Fix preselected user display in completed task (#7688) * [AAE-9314] Fix preselected user display in completed task * [AAE-9314] add unit tests * Trigger travis [AAE-9019] - People/Group cloud with HxP (#7658) * Cover the use cases by mocking them * Replace the mock with real stream and remove useless code * Provide new service to fetch groups * Fix group tests * Use the interface and token injection * [AAE-8870] add unit test and mock for new service * Improve roles condifion * initialize the stream as part of NgOnInit to be sure it relies on the correct FormControl instance(input) * Rollback tmp change for roles * [AAE-8641] people abstraction mock * [AAE-8641] revert angular.json changes * [AAE-8641] few conditions and code improvements * [AAE-8641] revert change input controls name * [AAE-8641] initialize the stream as part of ngOnInit * [AAE-8641] people abstraction improvements * [AAE-8870] cherry pick people abstraction * [AAE-8641] fix people-group e2es * fix lint * remove hardcoded identityHost * Use the identityhost api in case of cloud * Solve issue with returnType array string * Rebase and use GroupModel from cloud * Rebase and use GroupModel from cloud * Use the bpmHost instead of identityFor * Add identity ingress for user access service * Rename test * Fix linting issues * Fix playwright storybook e2e for people and group * Trigger travis * Fix people group e2e * improved formatting * Remove not needed travis var override * Remove unused import after rebase * Make roles in filter optional + remove comments Co-authored-by: Tomasz Co-authored-by: arditdomi [AAE-9365] - Auth guards should return true when no roles to check are passed (#7695) [AAE-9190] - ATTACH FILE: view file content directly by clicking (#7693) * [AAE-9190] ATTACH FILE: view file content directly by clicking * unit test added * fix * delete comment * fix CR * fix * fix identation * delete extra spaces * change import in unit test * fix * fix space lint [AAE-9112] Included a output event on change of language (#7697) [AAE-9382] SSOGuard - Call the acs user only in case of ECM (#7696) * Call the acs user only * Fix and add unit test [AAE-9370] Add manageruser to default apps (#7698) * Add manageruser to default apps * Try to ignore resource file to avoid affected [ci:force][auto-commit] Update JS-API to 4.12.0-197 for branch: update-js-api originated from JS-API PR: 197 (#7692) [AAE-9310] Add missing initial on task assignment dialog (#7694) * [AAE-9310] Add missing initial on task assignment dialog * [AAE-9310] rewrite full-name pipe * [AAE-9310] improved build username or email * Trigger travis * [AAE-9310] improve buildFromUsernameOrEmail [AAE-7865] Added process with displayable variables (#7703) [AAE-7865] Configuration of columns in Task and Process Lists in ADW e2e (#7701) * [AAE-7865] Configuration of columns in Task and Process Lists in ADW e2e test * Update * Cr * Added variable task data Angular 13 upgrade Signed-off-by: eromano make unit test start Signed-off-by: eromano some fix for unit test Signed-off-by: eromano full compilation mode Signed-off-by: eromano fix Signed-off-by: eromano core fix Signed-off-by: eromano fix cloud unit test Signed-off-by: eromano nx 13 Signed-off-by: eromano remove S3 Signed-off-by: eromano fix command Signed-off-by: eromano fix Signed-off-by: eromano fix Signed-off-by: eromano fix Signed-off-by: eromano fix lint Signed-off-by: eromano fix Signed-off-by: eromano rebase Signed-off-by: eromano fix Signed-off-by: eromano fix Signed-off-by: eromano Fix imports and storybook stories fix Signed-off-by: eromano revert modify package.json and uncommented code Signed-off-by: eromano fix lock Signed-off-by: eromano fic Signed-off-by: eromano Use proper file name fix Signed-off-by: eromano fix Signed-off-by: eromano fix Signed-off-by: eromano revert Signed-off-by: eromano fix travis before and after e2e Signed-off-by: eromano try Signed-off-by: eromano ls node Signed-off-by: eromano tentative n1 Signed-off-by: eromano before Signed-off-by: eromano release alpha version A13 Signed-off-by: eromano release alpha Signed-off-by: eromano fix Signed-off-by: eromano partial Signed-off-by: eromano refactor form rendering : remove tabs widget and container widget due dependency loop Signed-off-by: eromano lint Signed-off-by: eromano handle group Signed-off-by: eromano [AAE-7958] update - playwright and C260040 exclude fix build content Signed-off-by: eromano fix Signed-off-by: eromano fix Signed-off-by: eromano fix Signed-off-by: eromano fix render dynamic table Signed-off-by: eromano fix Signed-off-by: eromano fix unit Signed-off-by: eromano revert Signed-off-by: eromano fix increase use of the field cache check before if tab is visible improve performance tabs visibility Signed-off-by: eromano fix Signed-off-by: eromano fix Signed-off-by: eromano fix Signed-off-by: eromano fix style Signed-off-by: eromano fix module Signed-off-by: eromano fix Signed-off-by: eromano fix after rebase Signed-off-by: eromano fix after rebase Signed-off-by: eromano fix import Signed-off-by: eromano update lock Signed-off-by: eromano node 14 back Signed-off-by: eromano fix lock Signed-off-by: eromano cli build Signed-off-by: eromano fix Signed-off-by: eromano fix build testing and cli Signed-off-by: eromano version bump 5 Signed-off-by: eromano fix Signed-off-by: eromano fix build cli Signed-off-by: eromano fix cli Signed-off-by: eromano fix duplicate build and themes Signed-off-by: eromano fix storybook Signed-off-by: eromano fix unit test Signed-off-by: eromano update package json files to reflect esm reqs fix lib path remove type module for karma sake Get rid of moment-es6 package fix after rebase fix different version commander use same commander main pkg new release strategy for ng next Signed-off-by: eromano peer dep Signed-off-by: eromano fix test Signed-off-by: eromano fix shared enty point testing Signed-off-by: eromano fix moment import Signed-off-by: eromano fix moment in testing fix moment Signed-off-by: eromano Update mat-datetimepicker package version Update peerDeps version to match the ones in the root Fix invalid storybook configuration Revert the file due a wrong rebase (I suppose) aligning the file with latest develop Revowe flaky e2e that will be replaced by storybook Fix the autoscaling for page-fit * Syncing angular version to be patch perfect * Pre-release of 5.0.0-angular.13 Co-authored-by: Denys Vuika --- .gitignore | 3 + .storybook/tsconfig.json | 16 +- .storybook/webpack.config.js | 12 - .stylelintignore | 1 + .travis.yml | 225 +- .vscode/extensions.json | 2 - README.md | 1 - angular.json | 80 +- demo-shell/e2e/tsconfig.e2e.json | 6 +- demo-shell/package.json | 2 +- .../aspect-list-sample.component.ts | 6 +- .../app/components/files/files.component.ts | 6 +- .../task-list-demo.component.ts | 2 +- demo-shell/src/custom-style-dev.scss | 20 +- demo-shell/src/custom-style.scss | 20 +- demo-shell/src/polyfills.ts | 5 +- demo-shell/src/test.ts | 6 +- docs/license-info/README.md | 1 + .../license-info-5.0.0-angular.13.md | 193 + docs/vulnerability/README.md | 1 + .../audit-info-5.0.0-angular.13.md | 22 + .../directives/delete-directive.e2e.ts | 2 +- .../document-list-component.e2e.ts | 2 +- .../metadata/metadata-content-type.e2e.ts | 8 +- .../metadata/metadata-smoke-tests.e2e.ts | 4 +- .../datatable/data-table-component.e2e.ts | 44 - e2e/core/pages/content-services.page.ts | 2 +- e2e/core/pages/dialog/share-dialog.page.ts | 2 +- e2e/core/pages/login-shell.page.ts | 5 +- .../people-group-cloud-component.page.ts | 2 +- .../process/process-filter-results.e2e.ts | 2 +- .../process/process-header-cloud.e2e.ts | 2 +- .../task-list/task-header-cloud.e2e.ts | 2 +- .../task-list/task-list-properties.e2e.ts | 2 +- .../process/process-instance-details.e2e.ts | 2 +- .../tasks/custom-tasks-filters.e2e.ts | 2 +- e2e/process-services/tasks/info-drawer.e2e.ts | 2 +- .../tasks/task-details.e2e.ts | 2 +- e2e/resources/activiti7/simpleapp.zip | Bin 152492 -> 150838 bytes e2e/search/search-filters.e2e.ts | 58 +- e2e/test.config.js | 2 +- e2e/util/resources.js | 2 +- lib/cli/package-lock.json | 1924 - lib/cli/package.json | 4 +- lib/cli/scripts/artifact-from-s3.ts | 2 +- lib/cli/scripts/artifact-to-s3.ts | 2 +- lib/cli/scripts/audit.ts | 2 +- lib/cli/scripts/changelog.ts | 2 +- lib/cli/scripts/docker.ts | 2 +- lib/cli/scripts/init-aae-env.ts | 2 +- lib/cli/scripts/kubectl-clean-app.ts | 4 +- lib/cli/scripts/kubectl-delete.ts | 2 +- lib/cli/scripts/kubectl-image.ts | 2 +- lib/cli/scripts/licenses.ts | 2 +- lib/cli/scripts/npm-publish.ts | 2 +- lib/cli/scripts/scan-env.ts | 2 +- lib/cli/scripts/update-commit-sha.ts | 2 +- lib/cli/scripts/update-version.ts | 2 +- lib/cli/tsconfig.json | 1 + lib/cli/tsconfig.lib.prod.json | 2 +- lib/config/app.config.json | 7 + lib/config/webpack.style.js | 38 + lib/content-services/karma.conf.js | 14 +- lib/content-services/ng-package.json | 18 +- lib/content-services/package.json | 26 +- .../aspect-list-dialog.component.spec.ts | 4 +- .../aspect-list-dialog.component.ts | 1 + .../aspect-list/aspect-list.component.spec.ts | 2 +- .../lib/aspect-list/aspect-list.component.ts | 2 +- .../src/lib/aspect-list/public-api.ts | 5 +- .../{ => services}/aspect-list.service.ts | 36 +- .../services/dialog-aspect-list.service.ts | 62 + .../node-aspect.service.spec.ts | 20 +- .../{ => services}/node-aspect.service.ts | 6 +- .../lib/breadcrumb/breadcrumb.component.ts | 2 +- .../content-metadata-card.component.spec.ts | 2 +- .../content-metadata-card.component.ts | 2 +- .../content-type-property.service.spec.ts | 2 +- ...de-selector-panel.component-search.spec.ts | 787 + ...tent-node-selector-panel.component.spec.ts | 811 +- .../content-node-selector-panel.component.ts | 3 +- .../content-node-share.dialog.spec.ts | 2 +- .../content-node-share.dialog.ts | 2 +- .../src/lib/dialogs/node-lock.dialog.spec.ts | 2 +- .../src/lib/dialogs/node-lock.dialog.ts | 2 +- .../components/document-list.component.ts | 14 +- .../components/document-list.token.ts | 25 + .../filter-header.component.spec.ts | 4 +- .../filter-header/filter-header.component.ts | 4 +- .../lib/document-list/document-list.module.ts | 3 +- .../new-version-uploader.service.spec.ts | 14 +- .../permission-list.component.html | 2 +- .../permission-list.component.spec.ts | 8 +- .../user-role-column.component.ts | 40 +- .../components/search-control.component.scss | 4 +- .../search-filter-chips.component.scss | 4 +- .../search-form/search-form.component.scss | 4 +- .../src/lib/tag/tag-node-list.component.scss | 2 +- .../version-list.component.spec.ts | 6 +- lib/content-services/src/test.ts | 8 +- lib/content-services/tsconfig.lib.prod.json | 2 +- lib/core/.storybook/main.js | 2 +- lib/core/api/ng-package.json | 5 +- .../app-config/app-config.service.spec.ts | 1 - .../card-view-dateitem.component.spec.ts | 2 +- .../card-view-dateitem.component.ts | 7 +- .../card-view-textitem.component.html | 6 +- .../card-view-textitem.component.spec.ts | 2 + .../card-view/card-view.component.spec.ts | 4 +- .../comments/comments.component.stories.ts | 6 +- lib/core/context-menu/context-menu.spec.ts | 5 - .../datatable/datatable.component.scss | 10 +- .../datatable/datatable.component.spec.ts | 4 +- .../tooltip-card/tooltip-card.component.scss | 4 +- .../components/form-renderer.component.html | 59 +- .../components/form-renderer.component.scss | 107 + .../components/form-renderer.component.ts | 70 +- .../inplace-form-input.component.spec.ts | 4 +- .../form/components/mock/cloud-form.mock.ts | 1331 + lib/core/form/components/mock/form.mock.ts | 1332 + .../container/container-column.model.spec.ts | 41 - .../widgets/container/container.widget.html | 32 - .../container/container.widget.model.spec.ts | 76 - .../container/container.widget.model.ts | 66 - .../widgets/container/container.widget.scss | 106 - .../container/container.widget.spec.ts | 272 - .../widgets/container/container.widget.ts | 115 - .../widgets/core/container.model.ts | 34 + .../widgets/core/form-field-validator.ts | 2 +- .../widgets/core/form-field.model.ts | 2 +- .../widgets/core/form.model.spec.ts | 16 +- .../components/widgets/core/form.model.ts | 93 +- .../date-time/date-time.widget.spec.ts | 2 +- .../widgets/date-time/date-time.widget.ts | 3 +- .../widgets/date/date.widget.spec.ts | 2 +- .../components/widgets/date/date.widget.ts | 3 +- .../date-cell-validator-model.ts | 2 +- .../dynamic-table.widget.model.ts | 2 +- .../dynamic-table/dynamic-table.widget.scss | 1 - .../dynamic-table/editors/date/date.editor.ts | 3 +- .../editors/datetime/datetime.editor.spec.ts | 2 +- .../editors/datetime/datetime.editor.ts | 3 +- .../dynamic-table/editors/row.editor.spec.ts | 5 +- lib/core/form/components/widgets/index.ts | 7 - .../multiline-text/multiline-text.widget.html | 2 +- .../components/widgets/tabs/tabs.widget.html | 9 - .../widgets/tabs/tabs.widget.spec.ts | 156 - .../components/widgets/tabs/tabs.widget.ts | 54 - lib/core/form/form-base.module.ts | 1 + .../form/services/form-rendering.service.ts | 2 - .../widget-visibility-cloud.service.spec.ts | 2 +- .../widget-visibility.service.spec.ts | 2 +- .../services/widget-visibility.service.ts | 11 +- lib/core/karma.conf.js | 8 +- .../sidebar-action-menu.component.scss | 4 +- .../sidenav-layout.component.scss | 4 +- .../login/components/login.component.spec.ts | 10 +- lib/core/ng-package.json | 35 +- .../notification-history.component.spec.ts | 2 +- lib/core/package.json | 32 +- lib/core/pagination/pagination.component.scss | 4 +- lib/core/pipes/moment-date.pipe.ts | 3 +- lib/core/pipes/moment-datetime.pipe.ts | 3 +- lib/core/pipes/multi-value.pipe.spec.ts | 4 +- lib/core/pipes/time-ago.pipe.ts | 2 +- .../rich-text-editor.component.spec.ts | 10 +- lib/core/scss-bundle.config.json | 10 - .../auth-guard-sso-role.service.spec.ts | 8 +- .../services/authentication.service.spec.ts | 3 +- .../services/comment-process.service.spec.ts | 9 +- lib/core/services/ecm-user.service.spec.ts | 2 +- lib/core/services/lock.service.spec.ts | 2 +- lib/core/services/lock.service.ts | 3 +- .../services/people-content.service.spec.ts | 26 +- lib/core/services/search.service.spec.ts | 16 +- lib/core/services/storage.service.spec.ts | 3 +- .../user-content-access.service.spec.ts | 4 +- .../services/user-preferences.service.spec.ts | 4 + lib/core/styles/_flex.scss | 78 + lib/core/styles/_index.scss | 133 +- lib/core/styles/_theming.scss | 2 - lib/core/styles/_typography.scss | 30 +- lib/core/styles/prebuilt/adf-blue-orange.scss | 13 +- lib/core/styles/prebuilt/adf-blue-purple.scss | 13 +- lib/core/styles/prebuilt/adf-cyan-orange.scss | 13 +- lib/core/styles/prebuilt/adf-cyan-purple.scss | 13 +- .../styles/prebuilt/adf-green-orange.scss | 13 +- .../styles/prebuilt/adf-green-purple.scss | 13 +- lib/core/styles/prebuilt/adf-indigo-pink.scss | 13 +- .../styles/prebuilt/adf-pink-bluegrey.scss | 13 +- .../styles/prebuilt/adf-purple-green.scss | 13 +- lib/core/test.ts | 8 +- lib/core/theming/_index.scss | 1 + lib/core/tsconfig.lib.prod.json | 2 +- .../components/user-info.component.spec.ts | 2 +- lib/core/utils/moment-date-adapter.ts | 3 +- .../components/img-viewer.component.spec.ts | 80 +- .../components/pdf-viewer.component.spec.ts | 679 +- .../viewer/components/pdf-viewer.component.ts | 98 +- .../components/viewer.component.spec.ts | 14 +- .../viewer/components/viewer.component.ts | 6 +- lib/extensions/karma.conf.js | 2 +- lib/extensions/ng-package.json | 5 +- lib/extensions/package.json | 7 +- lib/extensions/src/test.ts | 8 +- lib/extensions/tsconfig.lib.prod.json | 2 +- lib/insights/karma.conf.js | 7 +- lib/insights/ng-package.json | 10 +- lib/insights/package.json | 16 +- .../analytics-report-parameters.component.ts | 2 +- .../widgets/date-range/date-range.widget.ts | 3 +- .../diagram/models/chart/bar-chart.model.ts | 2 +- lib/insights/src/test.ts | 8 +- lib/insights/tsconfig.lib.prod.json | 2 +- lib/process-services-cloud/.storybook/main.js | 2 +- lib/process-services-cloud/karma.conf.js | 7 +- lib/process-services-cloud/ng-package.json | 19 +- lib/process-services-cloud/package-lock.json | 5 - lib/process-services-cloud/package.json | 25 +- .../app-list-cloud.component.stories.ts | 4 +- .../date-range-filter.component.spec.ts | 4 +- .../date-range-filter.component.ts | 2 +- .../date-range-filter.service.spec.ts | 2 +- .../date-range-filter.service.ts | 2 +- .../components/form-cloud.component.spec.ts | 68 +- .../widgets/date/date-cloud.widget.spec.ts | 2 +- .../widgets/date/date-cloud.widget.ts | 3 +- .../dropdown/dropdown-cloud.widget.spec.ts | 49 +- .../properties-viewer.widget.spec.ts | 6 +- .../properties-viewer.widget.spec.ts | 4 +- .../lib/form/models/form-cloud.model.spec.ts | 8 - ...ontent-cloud-node-selector.service.spec.ts | 9 +- .../services/identity-group.service.spec.ts | 14 +- .../people/mock/identity-user.service.mock.ts | 4 +- .../lib/pipes/process-name-cloud.pipe.spec.ts | 6 +- .../src/lib/pipes/process-name-cloud.pipe.ts | 2 +- ...dit-process-filter-cloud.component.spec.ts | 2 +- .../edit-process-filter-cloud.component.ts | 3 +- .../models/process-filter-cloud.model.spec.ts | 2 +- .../start-process-cloud.service.spec.ts | 2 +- .../components/start-task-cloud.component.ts | 3 +- .../edit-task-filter-cloud.component.spec.ts | 2 +- .../edit-task-filter-cloud.component.ts | 3 +- .../task-assignment-filter.component.spec.ts | 10 +- .../task-header-cloud.component.spec.ts | 12 + .../task-list/mock/fake-task-response.mock.ts | 2 +- lib/process-services-cloud/src/test.ts | 8 +- .../tsconfig.lib.prod.json | 2 +- lib/process-services/karma.conf.js | 7 +- lib/process-services/ng-package.json | 11 +- lib/process-services/package.json | 25 +- .../src/lib/form/form.component.spec.ts | 50 +- .../src/lib/form/start-form.component.html | 11 +- .../src/lib/pipes/process-name.pipe.spec.ts | 6 +- .../src/lib/pipes/process-name.pipe.ts | 2 +- .../components/process-list.component.spec.ts | 4 - .../services/process.service.spec.ts | 2 +- .../components/start-task.component.ts | 3 +- .../components/task-list.component.spec.ts | 4 - .../components/task-list.component.ts | 2 +- lib/process-services/src/test.ts | 8 +- lib/process-services/tsconfig.lib.prod.json | 2 +- lib/stories/.storybook/main.js | 2 +- lib/stories/.storybook/tsconfig.json | 4 +- lib/testing/karma.conf.js | 2 +- lib/testing/ng-package.json | 11 +- lib/testing/package.json | 2 +- lib/testing/shared/package.json | 5 +- .../pages/search/search-check-list.page.ts | 2 +- .../protractor/core/pages/form/form-fields.ts | 8 +- .../form/widgets/attach-file-widget.page.ts | 3 +- .../form/widgets/checkbox-widget.page.ts | 2 +- .../pages/form/widgets/header-widget.page.ts | 7 +- .../material/date-picker-calendar.page.ts | 2 +- .../protractor/core/pages/settings.page.ts | 8 +- .../lib/protractor/core/utils/date-util.ts | 2 +- lib/testing/tsconfig.lib.prod.json | 2 +- migrations.json | 60 + nx.json | 56 +- package-lock.json | 46138 +++++----------- package.json | 124 +- scripts/build/build-all-lib.sh | 29 +- scripts/build/build-cli.sh | 11 +- scripts/build/build-content-services.sh | 9 - scripts/build/build-core.sh | 45 +- scripts/build/build-extensions.sh | 14 - scripts/build/build-insights.sh | 9 - scripts/build/build-process-services-cloud.sh | 9 - scripts/build/build-process-services.sh | 9 - scripts/build/build-testing.sh | 10 - scripts/ci/job_hooks/after_e2e.sh | 4 - scripts/ci/job_hooks/before_e2e.sh | 3 - scripts/ci/job_hooks/install.sh | 31 +- scripts/ci/utils/artifact-from-s3.sh | 37 - scripts/ci/utils/artifact-to-s3.sh | 27 - scripts/lint.sh | 6 +- scripts/travis/build/build-libs.sh | 11 + scripts/travis/release/release-npm.sh | 18 +- .../storybook-testing/storybook-test.sh | 3 +- 299 files changed, 19868 insertions(+), 37662 deletions(-) delete mode 100644 .storybook/webpack.config.js create mode 100644 docs/license-info/license-info-5.0.0-angular.13.md create mode 100644 docs/vulnerability/audit-info-5.0.0-angular.13.md delete mode 100644 lib/cli/package-lock.json create mode 100644 lib/config/app.config.json create mode 100644 lib/config/webpack.style.js rename lib/content-services/src/lib/aspect-list/{ => services}/aspect-list.service.ts (75%) create mode 100644 lib/content-services/src/lib/aspect-list/services/dialog-aspect-list.service.ts rename lib/content-services/src/lib/aspect-list/{ => services}/node-aspect.service.spec.ts (80%) rename lib/content-services/src/lib/aspect-list/{ => services}/node-aspect.service.ts (85%) create mode 100644 lib/content-services/src/lib/content-node-selector/content-node-selector-panel.component-search.spec.ts create mode 100644 lib/content-services/src/lib/document-list/components/document-list.token.ts create mode 100644 lib/core/form/components/mock/cloud-form.mock.ts create mode 100644 lib/core/form/components/mock/form.mock.ts delete mode 100644 lib/core/form/components/widgets/container/container-column.model.spec.ts delete mode 100644 lib/core/form/components/widgets/container/container.widget.html delete mode 100644 lib/core/form/components/widgets/container/container.widget.model.spec.ts delete mode 100644 lib/core/form/components/widgets/container/container.widget.model.ts delete mode 100644 lib/core/form/components/widgets/container/container.widget.scss delete mode 100644 lib/core/form/components/widgets/container/container.widget.spec.ts delete mode 100644 lib/core/form/components/widgets/container/container.widget.ts delete mode 100644 lib/core/form/components/widgets/tabs/tabs.widget.html delete mode 100644 lib/core/form/components/widgets/tabs/tabs.widget.spec.ts delete mode 100644 lib/core/form/components/widgets/tabs/tabs.widget.ts delete mode 100644 lib/core/scss-bundle.config.json create mode 100644 lib/core/styles/_flex.scss create mode 100644 lib/core/theming/_index.scss delete mode 100644 lib/process-services-cloud/package-lock.json create mode 100644 migrations.json delete mode 100755 scripts/build/build-extensions.sh delete mode 100755 scripts/ci/job_hooks/after_e2e.sh delete mode 100755 scripts/ci/utils/artifact-from-s3.sh delete mode 100755 scripts/ci/utils/artifact-to-s3.sh diff --git a/.gitignore b/.gitignore index e95c71a25d..a8b1999fa9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ +/.angular/cache *.log node_modules bundles @@ -30,3 +31,5 @@ out-tsc e2e-result-* licenses.txt .DS_Store + +.angular diff --git a/.storybook/tsconfig.json b/.storybook/tsconfig.json index ee045f6496..54a658ae74 100644 --- a/.storybook/tsconfig.json +++ b/.storybook/tsconfig.json @@ -1,10 +1,10 @@ { - "extends": "../tsconfig.json", - "exclude": [ - "../**/*.spec.js", - "../**/*.spec.ts", - "../**/*.spec.tsx", - "../**/*.spec.jsx" - ], - "include": ["../**/*"] + "extends": "../tsconfig.json", + "exclude": [ + "../**/*.spec.js", + "../**/*.spec.ts", + "../**/*.spec.tsx", + "../**/*.spec.jsx" + ], + "include": ["../**/*"] } diff --git a/.storybook/webpack.config.js b/.storybook/webpack.config.js deleted file mode 100644 index 69fcea7697..0000000000 --- a/.storybook/webpack.config.js +++ /dev/null @@ -1,12 +0,0 @@ -/** - * Export a function. Accept the base config as the only param. - * @param {Object} options - * @param {Required} options.config - * @param {'DEVELOPMENT' | 'PRODUCTION'} options.mode - change the build configuration. 'PRODUCTION' is used when building the static version of storybook. - */ -module.exports = async ({ config, mode }) => { - // Make whatever fine-grained changes you need - - // Return the altered config - return config; -}; diff --git a/.stylelintignore b/.stylelintignore index 66f64bc148..e4152edfa6 100644 --- a/.stylelintignore +++ b/.stylelintignore @@ -1,2 +1,3 @@ _theming.scss lib/core/viewer/components/pdf-viewer-host.component.scss +lib/dist diff --git a/.travis.yml b/.travis.yml index fbd6878b3c..e112065840 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,6 +47,13 @@ branches: only: - /^master(-patch.*)?$/ - /^develop(-patch.*)?$/ + - master + - develop +#remove after upgrade + - angular-upgrade-v13 + - angular-upgrade-v14 + - /.*old-env.*/ + - /.*next-release.*/ - /.*beta.*/ stages: @@ -61,9 +68,9 @@ stages: - name: "Build Demo shell" if: tag IS blank - name: "Unit test Lib" - if: type = pull_request || (type = cron || type = api) + if: type = pull_request || (type = cron || type = api) || branch = "angular-upgrade-v13" - name: "e2e Test" - if: type = pull_request || (type = cron || type = api) + if: type = pull_request || (type = cron || type = api) || branch = "angular-upgrade-v13" - name: "Release tag" if: branch =~ /^master(-patch.*)?$/ - name: "Deprecate develop builds" @@ -123,7 +130,7 @@ jobs: script: # Build Demo shell & Storybook for production docker" - NODE_OPTIONS=--max_old_space_size=8192 nx build demoshell --configuration production - - NODE_OPTIONS=--max_old_space_size=8192 nx run stories:build-storybook --configuration ci + - NODE_OPTIONS=--max_old_space_size=8192 nx run stories:build-storybook --configuration ci --projectBuildConfig=stories:build-storybook - ./scripts/travis/release/release-docker.sh workspaces: create: @@ -187,11 +194,15 @@ jobs: - ./scripts/ci/check-env/check-cs-env.sh || travis_terminate 1 - ./scripts/ci/check-env/check-ps-env.sh || travis_terminate 1 script: ./scripts/travis/e2e/e2e.sh - after_script: ./scripts/ci/job_hooks/after_e2e.sh workspaces: - use: - - built_libs_cache - - built_demo_shell_cache + create: + name: e2e_cache + paths: + - "$SMART_RUNNER_DIRECTORY" + use: + - built_libs_cache + - built_demo_shell_cache + - e2e_cache env: - FOLDER="core" - PROVIDER='ALL' @@ -203,11 +214,15 @@ jobs: - ./scripts/ci/job_hooks/before_e2e.sh - ./scripts/ci/check-env/check-cs-env.sh || travis_terminate 1 script: ./scripts/travis/e2e/e2e.sh - after_script: ./scripts/ci/job_hooks/after_e2e.sh workspaces: - use: - - built_libs_cache - - built_demo_shell_cache + create: + name: e2e_cache + paths: + - "$SMART_RUNNER_DIRECTORY" + use: + - built_libs_cache + - built_demo_shell_cache + - e2e_cache env: - FOLDER="content-services/components" - PROVIDER="ECM" @@ -219,11 +234,15 @@ jobs: - ./scripts/ci/job_hooks/before_e2e.sh - ./scripts/ci/check-env/check-cs-env.sh || travis_terminate 1 script: ./scripts/travis/e2e/e2e.sh - after_script: ./scripts/ci/job_hooks/after_e2e.sh workspaces: - use: - - built_libs_cache - - built_demo_shell_cache + create: + name: e2e_cache + paths: + - "$SMART_RUNNER_DIRECTORY" + use: + - built_libs_cache + - built_demo_shell_cache + - e2e_cache env: - FOLDER="content-services/directives" - PROVIDER="ECM" @@ -235,11 +254,15 @@ jobs: - ./scripts/ci/job_hooks/before_e2e.sh - ./scripts/ci/check-env/check-cs-env.sh || travis_terminate 1 script: ./scripts/travis/e2e/e2e.sh - after_script: ./scripts/ci/job_hooks/after_e2e.sh workspaces: - use: - - built_libs_cache - - built_demo_shell_cache + create: + name: e2e_cache + paths: + - "$SMART_RUNNER_DIRECTORY" + use: + - built_libs_cache + - built_demo_shell_cache + - e2e_cache env: - FOLDER="content-services/document-list" - PROVIDER="ECM" @@ -251,11 +274,15 @@ jobs: - ./scripts/ci/job_hooks/before_e2e.sh - ./scripts/ci/check-env/check-cs-env.sh || travis_terminate 1 script: ./scripts/travis/e2e/e2e.sh - after_script: ./scripts/ci/job_hooks/after_e2e.sh workspaces: - use: - - built_libs_cache - - built_demo_shell_cache + create: + name: e2e_cache + paths: + - "$SMART_RUNNER_DIRECTORY" + use: + - built_libs_cache + - built_demo_shell_cache + - e2e_cache env: - FOLDER="content-services/metadata" - PROVIDER="ECM" @@ -267,11 +294,15 @@ jobs: - ./scripts/ci/job_hooks/before_e2e.sh - ./scripts/ci/check-env/check-cs-env.sh || travis_terminate 1 script: ./scripts/travis/e2e/e2e.sh - after_script: ./scripts/ci/job_hooks/after_e2e.sh workspaces: - use: - - built_libs_cache - - built_demo_shell_cache + create: + name: e2e_cache + paths: + - "$SMART_RUNNER_DIRECTORY" + use: + - built_libs_cache + - built_demo_shell_cache + - e2e_cache env: - FOLDER="content-services/upload" - PROVIDER="ECM" @@ -283,11 +314,15 @@ jobs: - ./scripts/ci/job_hooks/before_e2e.sh - ./scripts/ci/check-env/check-cs-env.sh || travis_terminate 1 script: ./scripts/travis/e2e/e2e.sh - after_script: ./scripts/ci/job_hooks/after_e2e.sh workspaces: - use: - - built_libs_cache - - built_demo_shell_cache + create: + name: e2e_cache + paths: + - "$SMART_RUNNER_DIRECTORY" + use: + - built_libs_cache + - built_demo_shell_cache + - e2e_cache env: - FOLDER="search" - PROVIDER="ECM" @@ -296,15 +331,19 @@ jobs: - stage: "e2e Test" name: "Process: Form" before_script: - - ./scripts/ci/job_hooks/before_e2e.sh || travis_terminate 1 + - ./scripts/ci/job_hooks/before_e2e.sh - ./scripts/ci/check-env/check-ps-env.sh || travis_terminate 1 - ./scripts/ci/check-env/check-external-cs-env.sh || travis_terminate 1 script: ./scripts/travis/e2e/e2e.sh - after_script: ./scripts/ci/job_hooks/after_e2e.sh workspaces: - use: - - built_libs_cache - - built_demo_shell_cache + create: + name: e2e_cache + paths: + - "$SMART_RUNNER_DIRECTORY" + use: + - built_libs_cache + - built_demo_shell_cache + - e2e_cache env: - FOLDER="process-services/form" - PROVIDER="BPM" @@ -313,15 +352,19 @@ jobs: - stage: "e2e Test" name: "Process: Process" before_script: - - ./scripts/ci/job_hooks/before_e2e.sh || travis_terminate 1 + - ./scripts/ci/job_hooks/before_e2e.sh - ./scripts/ci/check-env/check-ps-env.sh || travis_terminate 1 - ./scripts/ci/check-env/check-external-cs-env.sh || travis_terminate 1 script: ./scripts/travis/e2e/e2e.sh - after_script: ./scripts/ci/job_hooks/after_e2e.sh workspaces: - use: - - built_libs_cache - - built_demo_shell_cache + create: + name: e2e_cache + paths: + - "$SMART_RUNNER_DIRECTORY" + use: + - built_libs_cache + - built_demo_shell_cache + - e2e_cache env: - FOLDER="process-services/process" - PROVIDER="BPM" @@ -330,15 +373,19 @@ jobs: - stage: "e2e Test" name: "Process: Tasks" before_script: - - ./scripts/ci/job_hooks/before_e2e.sh || travis_terminate 1 + - ./scripts/ci/job_hooks/before_e2e.sh - ./scripts/ci/check-env/check-ps-env.sh || travis_terminate 1 - ./scripts/ci/check-env/check-external-cs-env.sh || travis_terminate 1 script: ./scripts/travis/e2e/e2e.sh - after_script: ./scripts/ci/job_hooks/after_e2e.sh workspaces: - use: - - built_libs_cache - - built_demo_shell_cache + create: + name: e2e_cache + paths: + - "$SMART_RUNNER_DIRECTORY" + use: + - built_libs_cache + - built_demo_shell_cache + - e2e_cache env: - FOLDER="process-services/tasks" - PROVIDER="BPM" @@ -347,20 +394,36 @@ jobs: - stage: "e2e Test" name: "Process: Widgets" before_script: - - ./scripts/ci/job_hooks/before_e2e.sh || travis_terminate 1 + - ./scripts/ci/job_hooks/before_e2e.sh - ./scripts/ci/check-env/check-ps-env.sh || travis_terminate 1 - ./scripts/ci/check-env/check-external-cs-env.sh || travis_terminate 1 script: ./scripts/travis/e2e/e2e.sh - after_script: ./scripts/ci/job_hooks/after_e2e.sh workspaces: - use: - - built_libs_cache - - built_demo_shell_cache + create: + name: e2e_cache + paths: + - "$SMART_RUNNER_DIRECTORY" + use: + - built_libs_cache + - built_demo_shell_cache + - e2e_cache env: - FOLDER="process-services/widgets" - PROVIDER="BPM" - AUTH_TYPE="OAUTH" + - stage: "e2e Test" + name: "Process Cloud:playwright" + before_script: + - ./scripts/ci/job_hooks/before_e2e.sh + - ./scripts/ci/jobs/dbpci-before-playwright || travis_terminate 1 + - ./scripts/ci/check-env/check-ps-cloud-env.sh || travis_terminate 1 + script: ./scripts/travis/storybook-testing/storybook-test.sh + workspaces: + use: + - built_libs_cache + - built_demo_shell_cache + - stage: "e2e Test" name: "Process Cloud : Form" before_script: @@ -368,11 +431,15 @@ jobs: - ./scripts/ci/check-env/check-cs-env.sh || travis_terminate 1 - ./scripts/ci/check-env/check-ps-cloud-env.sh || travis_terminate 1 script: ./scripts/travis/e2e/e2e.sh - after_script: ./scripts/ci/job_hooks/after_e2e.sh workspaces: - use: - - built_libs_cache - - built_demo_shell_cache + create: + name: e2e_cache + paths: + - "$SMART_RUNNER_DIRECTORY" + use: + - built_libs_cache + - built_demo_shell_cache + - e2e_cache env: - FOLDER="process-services-cloud/form-field" - PROVIDER="ALL" @@ -386,11 +453,15 @@ jobs: - ./scripts/ci/check-env/check-cs-env.sh || travis_terminate 1 - ./scripts/ci/check-env/check-ps-cloud-env.sh || travis_terminate 1 script: ./scripts/travis/e2e/e2e.sh - after_script: ./scripts/ci/job_hooks/after_e2e.sh workspaces: - use: - - built_libs_cache - - built_demo_shell_cache + create: + name: e2e_cache + paths: + - "$SMART_RUNNER_DIRECTORY" + use: + - built_libs_cache + - built_demo_shell_cache + - e2e_cache env: - FOLDER="process-services-cloud/people" - PROVIDER="ALL" @@ -404,11 +475,15 @@ jobs: - ./scripts/ci/check-env/check-cs-env.sh || travis_terminate 1 - ./scripts/ci/check-env/check-ps-cloud-env.sh || travis_terminate 1 script: ./scripts/travis/e2e/e2e.sh - after_script: ./scripts/ci/job_hooks/after_e2e.sh workspaces: - use: - - built_libs_cache - - built_demo_shell_cache + create: + name: e2e_cache + paths: + - "$SMART_RUNNER_DIRECTORY" + use: + - built_libs_cache + - built_demo_shell_cache + - e2e_cache env: - FOLDER="process-services-cloud/process" - PROVIDER="ALL" @@ -422,11 +497,15 @@ jobs: - ./scripts/ci/check-env/check-cs-env.sh || travis_terminate 1 - ./scripts/ci/check-env/check-ps-cloud-env.sh || travis_terminate 1 script: ./scripts/travis/e2e/e2e.sh - after_script: ./scripts/ci/job_hooks/after_e2e.sh workspaces: - use: - - built_libs_cache - - built_demo_shell_cache + create: + name: e2e_cache + paths: + - "$SMART_RUNNER_DIRECTORY" + use: + - built_libs_cache + - built_demo_shell_cache + - e2e_cache env: - FOLDER="process-services-cloud/start-task" - PROVIDER="ALL" @@ -440,11 +519,15 @@ jobs: - ./scripts/ci/check-env/check-cs-env.sh || travis_terminate 1 - ./scripts/ci/check-env/check-ps-cloud-env.sh || travis_terminate 1 script: ./scripts/travis/e2e/e2e.sh - after_script: ./scripts/ci/job_hooks/after_e2e.sh workspaces: - use: - - built_libs_cache - - built_demo_shell_cache + create: + name: e2e_cache + paths: + - "$SMART_RUNNER_DIRECTORY" + use: + - built_libs_cache + - built_demo_shell_cache + - e2e_cache env: - FOLDER="process-services-cloud/task-list" - PROVIDER="ALL" diff --git a/.vscode/extensions.json b/.vscode/extensions.json index c96455222c..7714c29670 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,6 +1,4 @@ { "recommendations": [ - "stylelint.vscode-stylelint", - "editorconfig.editorconfig", ] } diff --git a/README.md b/README.md index 1f5ea291ad..3bc9b02183 100644 --- a/README.md +++ b/README.md @@ -72,4 +72,3 @@ All components are supported in the following browsers: * Due to a [known issue](https://bugzilla.mozilla.org/show_bug.cgi?id=1188880) in Firefox, the Alfresco Upload Component does not currently support folder upload functionality on Firefox. See the [Browser Support](BROWSER-SUPPORT.md) article for more details. - diff --git a/angular.json b/angular.json index 8fc764f4eb..a7c5611e56 100644 --- a/angular.json +++ b/angular.json @@ -11,12 +11,10 @@ "build": { "builder": "@angular-devkit/build-angular:browser", "options": { - "extractCss": true, "aot": true, "allowedCommonJsDependencies": [ "minimatch", "minimatch-browser", - "moment-es6", "superagent", "event-emitter", "brace-expansion", @@ -177,24 +175,27 @@ "node_modules/pdfjs-dist/web/pdf_viewer.js", "node_modules/raphael/raphael.min.js", "node_modules/moment/min/moment.min.js" - ] + ], + "vendorChunk": true, + "extractLicenses": false, + "buildOptimizer": false, + "sourceMap": true, + "optimization": false, + "namedChunks": true }, "configurations": { "production": { "budgets": [ { "type": "anyComponentStyle", - "maximumWarning": "6kb" + "maximumWarning": "12kb" } ], "optimization": true, "outputHashing": "all", "sourceMap": false, - "extractCss": true, "namedChunks": false, - "aot": true, "extractLicenses": true, - "vendorChunk": true, "buildOptimizer": true, "verbose": false, "fileReplacements": [ @@ -214,11 +215,8 @@ "optimization": true, "outputHashing": "all", "sourceMap": false, - "extractCss": true, "namedChunks": false, - "aot": true, "extractLicenses": true, - "vendorChunk": true, "buildOptimizer": true, "verbose": false, "fileReplacements": [ @@ -228,7 +226,8 @@ } ] } - } + }, + "defaultConfiguration": "" }, "serve": { "builder": "@angular-devkit/build-angular:dev-server", @@ -389,29 +388,17 @@ "protractorConfig": "./e2e/protractor.conf.js", "devServerTarget": "lib-e2e-test:serve" } - }, - "lint": { - "builder": "@angular-devkit/build-angular:tslint", - "options": { - "tsConfig": [ - "./e2e/tsconfig.e2e.json" - ], - "exclude": [ - "**/lib/**/*", - "**/node_modules/**/*" - ] - } } } }, "core": { + "projectType": "library", "root": "lib/core", "sourceRoot": "lib/core", - "projectType": "library", "prefix": "adf", "architect": { "build": { - "builder": "@angular-devkit/build-ng-packagr:build", + "builder": "@angular-devkit/build-angular:ng-packagr", "options": { "tsConfig": "lib/core/tsconfig.lib.json", "project": "lib/core/ng-package.json" @@ -420,8 +407,12 @@ "production": { "project": "lib/core/ng-package.json", "tsConfig": "lib/core/tsconfig.lib.prod.json" + }, + "development": { + "tsConfig": "lib/core/tsconfig.lib.json" } - } + }, + "defaultConfiguration": "production" }, "test": { "builder": "@angular-devkit/build-angular:karma", @@ -486,7 +477,7 @@ "prefix": "adf", "architect": { "build": { - "builder": "@angular-devkit/build-ng-packagr:build", + "builder": "@angular-devkit/build-angular:ng-packagr", "options": { "tsConfig": "lib/content-services/tsconfig.lib.json", "project": "lib/content-services/ng-package.json" @@ -558,7 +549,7 @@ "prefix": "adf", "architect": { "build": { - "builder": "@angular-devkit/build-ng-packagr:build", + "builder": "@angular-devkit/build-angular:ng-packagr", "options": { "tsConfig": "lib/process-services/tsconfig.lib.json", "project": "lib/process-services/ng-package.json" @@ -597,7 +588,7 @@ "prefix": "adf-cloud", "architect": { "build": { - "builder": "@angular-devkit/build-ng-packagr:build", + "builder": "@angular-devkit/build-angular:ng-packagr", "options": { "tsConfig": "lib/process-services-cloud/tsconfig.lib.json", "project": "lib/process-services-cloud/ng-package.json" @@ -669,7 +660,7 @@ "prefix": "adf", "architect": { "build": { - "builder": "@angular-devkit/build-ng-packagr:build", + "builder": "@angular-devkit/build-angular:ng-packagr", "options": { "tsConfig": "lib/insights/tsconfig.lib.json", "project": "lib/insights/ng-package.json" @@ -708,7 +699,7 @@ "prefix": "adf", "architect": { "build": { - "builder": "@angular-devkit/build-ng-packagr:build", + "builder": "@angular-devkit/build-angular:ng-packagr", "options": { "tsConfig": "lib/extensions/tsconfig.lib.json", "project": "lib/extensions/ng-package.json" @@ -746,13 +737,26 @@ "prefix": "adf", "architect": { "build": { - "builder": "@angular-devkit/build-ng-packagr:build", + "builder": "@nrwl/node:webpack", "options": { - "tsConfig": "lib/testing/tsconfig.lib.json", - "project": "lib/testing/ng-package.json" + "projectRoot": "lib/testing", + "outputPath": "lib/dist/testing", + "main": "lib/testing/index.ts", + "generatePackageJson" : true, + "tsConfig": "lib/testing/tsconfig.lib.prod.json", + "additionalEntryPoints": [ + { + "entryName": "shared", + "entryPath": "/lib/testing/src/lib/shared/index.ts" + } + ] }, "configurations": { "production": { + "projectRoot": "lib/testing", + "outputPath": "lib/dist/testing", + "main": "lib/testing/index.ts", + "generatePackageJson" : true, "tsConfig": "lib/testing/tsconfig.lib.prod.json" } } @@ -775,13 +779,15 @@ "prefix": "adf", "architect": { "build": { - "builder": "@angular-devkit/build-ng-packagr:build", + "builder": "@nrwl/workspace:run-commands", "options": { - "tsConfig": "lib/cli/tsconfig.json" + "commands": [ + "cd lib/cli && npm i && npm run dist" + ] }, "configurations": { "production": { - "tsConfig": "lib/cli/tsconfig.lib.prod.json" + "tsConfig": "lib/cli/tsconfig.json" } } }, diff --git a/demo-shell/e2e/tsconfig.e2e.json b/demo-shell/e2e/tsconfig.e2e.json index 69ed26a1b4..8ad53b9929 100644 --- a/demo-shell/e2e/tsconfig.e2e.json +++ b/demo-shell/e2e/tsconfig.e2e.json @@ -4,10 +4,6 @@ "outDir": "../out-tsc/e2e", "module": "commonjs", "target": "es5", - "types":[ - "jasmine", - "jasminewd2", - "node" - ] + "types": ["jasmine", "jasminewd2", "node"] } } diff --git a/demo-shell/package.json b/demo-shell/package.json index 9e1f74bde9..8c01f6f9e0 100644 --- a/demo-shell/package.json +++ b/demo-shell/package.json @@ -1,7 +1,7 @@ { "name": "Alfresco-ADF-Angular-Demo", "description": "Demo shell for Alfresco Angular components", - "version": "4.11.0", + "version": "5.0.0-angular.13", "author": "Alfresco Software, Ltd.", "repository": { "type": "git", diff --git a/demo-shell/src/app/components/aspect-list-sample/aspect-list-sample.component.ts b/demo-shell/src/app/components/aspect-list-sample/aspect-list-sample.component.ts index e9f08a2d44..766cced546 100644 --- a/demo-shell/src/app/components/aspect-list-sample/aspect-list-sample.component.ts +++ b/demo-shell/src/app/components/aspect-list-sample/aspect-list-sample.component.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import { AspectListService } from '@alfresco/adf-content-services'; +import { DialogAspectListService } from '@alfresco/adf-content-services'; import { Component } from '@angular/core'; @Component({ @@ -30,14 +30,14 @@ export class AspectListSampleComponent { currentResult: string[] = []; - constructor(private aspectListService: AspectListService) { } + constructor(private dialogAspectListService: DialogAspectListService) { } showAspectForNode() { this.isShowed = !this.isShowed; } openAspectDialog() { - this.aspectListService.openAspectListDialog(this.currentNodeId).subscribe((result) => this.currentResult = Array.from(result)); + this.dialogAspectListService.openAspectListDialog(this.currentNodeId).subscribe((result) => this.currentResult = Array.from(result)); } onValueChanged(aspects) { diff --git a/demo-shell/src/app/components/files/files.component.ts b/demo-shell/src/app/components/files/files.component.ts index 98199965c5..7dcfef8379 100644 --- a/demo-shell/src/app/components/files/files.component.ts +++ b/demo-shell/src/app/components/files/files.component.ts @@ -38,7 +38,7 @@ import { LibraryDialogComponent, ContentMetadataService, FilterSearch, - AspectListService + DialogAspectListService } from '@alfresco/adf-content-services'; import { SelectAppsDialogComponent, ProcessFormRenderingService } from '@alfresco/adf-process-services'; @@ -233,7 +233,7 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy { public alfrescoApiService: AlfrescoApiService, private contentMetadataService: ContentMetadataService, private sharedLinksApiService: SharedLinksApiService, - private aspectListService: AspectListService, + private dialogAspectListService: DialogAspectListService, private nodeService: NodesApiService) { } @@ -474,7 +474,7 @@ export class FilesComponent implements OnInit, OnChanges, OnDestroy { } onAspectUpdate(event: any) { - this.aspectListService.openAspectListDialog(event.value.entry.id).subscribe((aspectList) => { + this.dialogAspectListService.openAspectListDialog(event.value.entry.id).subscribe((aspectList) => { this.nodeService.updateNode(event.value.entry.id, {aspectNames : [...aspectList]}).subscribe(() => { this.openSnackMessageInfo('Node Aspects Updated'); }); diff --git a/demo-shell/src/app/components/task-list-demo/task-list-demo.component.ts b/demo-shell/src/app/components/task-list-demo/task-list-demo.component.ts index 17601beec1..f84b892ebe 100644 --- a/demo-shell/src/app/components/task-list-demo/task-list-demo.component.ts +++ b/demo-shell/src/app/components/task-list-demo/task-list-demo.component.ts @@ -19,7 +19,7 @@ import { Component, OnInit, OnDestroy } from '@angular/core'; import { FormGroup, FormBuilder, Validators, FormControl, AbstractControl } from '@angular/forms'; import { ActivatedRoute, Params } from '@angular/router'; import { debounceTime, takeUntil } from 'rxjs/operators'; -import moment from 'moment-es6'; +import moment from 'moment'; import { Subject } from 'rxjs'; const DEFAULT_SIZE = 20; diff --git a/demo-shell/src/custom-style-dev.scss b/demo-shell/src/custom-style-dev.scss index 497d0dc730..c35d1e11ef 100644 --- a/demo-shell/src/custom-style-dev.scss +++ b/demo-shell/src/custom-style-dev.scss @@ -1,11 +1,11 @@ -@import '~@angular/material/theming'; +@use '@angular/material' as mat; @import '../../lib/core/styles/index'; -@include mat-core($alfresco-typography); +@include mat.core($alfresco-typography); -$primary: mat-palette($alfresco-accent-orange); -$accent: mat-palette($alfresco-accent-purple); -$warn: mat-palette($alfresco-warn); -$theme: mat-light-theme( +$primary: mat.define-palette($alfresco-accent-orange); +$accent: mat.define-palette($alfresco-accent-purple); +$warn: mat.define-palette($alfresco-warn); +$theme: mat.define-light-theme( ( color: ( primary: $primary, @@ -14,7 +14,7 @@ $theme: mat-light-theme( ) ); -@include angular-material-theme($theme); +@include mat.all-component-themes($theme); @include alfresco-material-theme($theme); body, @@ -22,9 +22,9 @@ html { margin: 0; height: 100%; overflow: hidden; - font-size: mat-font-size($alfresco-typography, body-1); - font-family: mat-font-family($alfresco-typography); - line-height: mat-line-height($alfresco-typography, body-1); + font-size: mat.font-size($alfresco-typography, body-1); + font-family: mat.font-family($alfresco-typography); + line-height: mat.line-height($alfresco-typography, body-1); } body { diff --git a/demo-shell/src/custom-style.scss b/demo-shell/src/custom-style.scss index 40bd0fe084..c7cc6f98fd 100644 --- a/demo-shell/src/custom-style.scss +++ b/demo-shell/src/custom-style.scss @@ -1,11 +1,11 @@ -@import '~@angular/material/theming'; +@use '@angular/material' as mat; @import '~@alfresco/adf-core/theming'; -@include mat-core($alfresco-typography); +@include mat.core($alfresco-typography); -$primary: mat-palette($alfresco-accent-orange); -$accent: mat-palette($alfresco-accent-purple); -$warn: mat-palette($alfresco-warn); -$theme: mat-light-theme( +$primary: mat.define-palette($alfresco-accent-orange); +$accent: mat.define-palette($alfresco-accent-purple); +$warn: mat.define-palette($alfresco-warn); +$theme: mat.define-light-theme( ( color: ( primary: $primary, @@ -14,7 +14,7 @@ $theme: mat-light-theme( ) ); -@include angular-material-theme($theme); +@include mat.all-component-themes($theme); @include alfresco-material-theme($theme); body, @@ -22,9 +22,9 @@ html { margin: 0; height: 100%; overflow: hidden; - font-size: mat-font-size($alfresco-typography, body-1); - font-family: mat-font-family($alfresco-typography); - line-height: mat-line-height($alfresco-typography, body-1); + font-size: mat.font-size($alfresco-typography, body-1); + font-family: mat.font-family($alfresco-typography); + line-height: mat.line-height($alfresco-typography, body-1); } body { diff --git a/demo-shell/src/polyfills.ts b/demo-shell/src/polyfills.ts index 60af05a667..b31c92476c 100644 --- a/demo-shell/src/polyfills.ts +++ b/demo-shell/src/polyfills.ts @@ -35,13 +35,10 @@ * BROWSER POLYFILLS */ -/** IE10 and IE11 requires the following for NgClass support on SVG elements */ -// import 'classlist.js'; // Run `npm install --save classlist.js`. - /*************************************************************************************************** * Zone JS is required by Angular itself. */ -import 'zone.js/dist/zone'; // Included with Angular CLI. +import 'zone.js'; // Included with Angular CLI. /** * Support custom event in IE11 diff --git a/demo-shell/src/test.ts b/demo-shell/src/test.ts index b5b7ec32d1..b4f5f1fe3b 100644 --- a/demo-shell/src/test.ts +++ b/demo-shell/src/test.ts @@ -17,7 +17,7 @@ // This file is required by karma.conf.js and loads recursively all the .spec and framework files -import 'zone.js/dist/zone-testing'; +import 'zone.js/testing'; import { getTestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, @@ -29,7 +29,9 @@ declare const require: any; // First, initialize the Angular testing environment. getTestBed().initTestEnvironment( BrowserDynamicTestingModule, - platformBrowserDynamicTesting() + platformBrowserDynamicTesting(), { + teardown: { destroyAfterEach: false } +} ); // Then we find all the tests. const context = require.context('./', true, /\.spec\.ts$/); diff --git a/docs/license-info/README.md b/docs/license-info/README.md index 0836e8ecc9..99e3d4a168 100644 --- a/docs/license-info/README.md +++ b/docs/license-info/README.md @@ -29,3 +29,4 @@ The pages linked below contain the licenses for all third party dependencies of - [ADF 4.9.0](license-info-4.9.0.md) - [ADF 4.10.0](license-info-4.10.0.md) - [ADF 4.11.0](license-info-4.11.0.md) +- [ADF 5.0.0-angular.13](license-info-5.0.0-angular.13.md) diff --git a/docs/license-info/license-info-5.0.0-angular.13.md b/docs/license-info/license-info-5.0.0-angular.13.md new file mode 100644 index 0000000000..de19b94e53 --- /dev/null +++ b/docs/license-info/license-info-5.0.0-angular.13.md @@ -0,0 +1,193 @@ +--- +Title: License info, alfresco-ng2-components 5.0.0-angular.13 +--- + +# License information for alfresco-ng2-components 5.0.0-angular.13 + +This page lists all third party libraries the project depends on. + +## Libraries + +| Name | Version | License | +| --- | --- | --- | +| [@alfresco/js-api](https://github.com/Alfresco/alfresco-js-api) | 4.12.0-238 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [@angular/animations](https://github.com/angular/angular) | 13.3.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/cdk](https://github.com/angular/components) | 13.2.4 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/common](https://github.com/angular/angular) | 13.3.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/compiler](https://github.com/angular/angular) | 13.3.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/compiler](https://github.com/angular/angular) | 9.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/core](https://github.com/angular/angular) | 13.3.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/core](https://github.com/angular/angular) | 9.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/flex-layout](https://github.com/angular/flex-layout) | 13.0.0-beta.38 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/forms](https://github.com/angular/angular) | 13.3.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/material-moment-adapter](https://github.com/angular/components) | 13.3.9 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/material](https://github.com/angular/components) | 13.3.9 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/platform-browser-dynamic](https://github.com/angular/angular) | 13.3.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/platform-browser](https://github.com/angular/angular) | 13.3.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@angular/router](https://github.com/angular/angular) | 13.3.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@apollo/client](https://github.com/apollographql/apollo-client) | 3.6.9 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@babel/code-frame](https://github.com/babel/babel) | 7.18.6 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@babel/helper-validator-identifier](https://github.com/babel/babel) | 7.18.6 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@babel/highlight](https://github.com/babel/babel) | 7.18.6 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@editorjs/editorjs](https://github.com/codex-team/editor.js) | 2.25.0 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [@editorjs/header](https://github.com/editor-js/header) | 2.6.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@editorjs/list](https://github.com/editor-js/list) | 1.7.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@editorjs/underline](https://github.com/editor-js/underline) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@graphql-typed-document-node/core](https://github.com/dotansimha/graphql-typed-document-node) | 3.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@mat-datetimepicker/core](https://github.com/kuhnroyal/mat-datetimepicker) | 9.0.68 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@mat-datetimepicker/moment](https://github.com/kuhnroyal/mat-datetimepicker) | 9.0.68 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@ngx-translate/core](https://github.com/ngx-translate/core) | 13.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@types/chart.js](https://github.com/DefinitelyTyped/DefinitelyTyped) | 2.9.37 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@wry/context](https://github.com/benjamn/wryware) | 0.6.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@wry/equality](https://github.com/benjamn/wryware) | 0.5.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [@wry/trie](https://github.com/benjamn/wryware) | 0.3.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [adf-tslint-rules](https://github.com/Alfresco/alfresco-ng2-components) | 0.0.7 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [alfresco-ng2-components](https://github.com/Alfresco/alfresco-ng2-components) | 5.0.0-angular.13 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [ansi-styles](https://github.com/chalk/ansi-styles) | 3.2.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [apollo-angular](https://github.com/kamilkisiela/apollo-angular) | 2.6.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [app-root-path](https://github.com/inxilpro/node-app-root-path) | 2.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [app-root-path](https://github.com/inxilpro/node-app-root-path) | 3.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [argparse](https://github.com/nodeca/argparse) | 1.0.10 | [MIT](http://www.opensource.org/licenses/MIT) | +| [aria-query](https://github.com/A11yance/aria-query) | 3.0.0 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [ast-types-flow](https://github.com/kyldvs/ast-types-flow) | 0.0.7 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [asynckit](https://github.com/alexindigo/asynckit) | 0.4.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [axobject-query](https://github.com/A11yance/axobject-query) | 2.0.2 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [backo2](https://github.com/mokesmokes/backo) | 1.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [balanced-match](https://github.com/juliangruber/balanced-match) | 1.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [brace-expansion](https://github.com/juliangruber/brace-expansion) | 1.1.11 | [MIT](http://www.opensource.org/licenses/MIT) | +| [brace-expansion](https://github.com/juliangruber/brace-expansion) | 2.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [builtin-modules](https://github.com/sindresorhus/builtin-modules) | 1.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [call-bind](https://github.com/ljharb/call-bind) | 1.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [chalk](https://github.com/chalk/chalk) | 2.4.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [chart.js](https://github.com/chartjs/Chart.js) | 2.9.4 | [MIT](http://www.opensource.org/licenses/MIT) | +| [chartjs-color-string](https://github.com/chartjs/chartjs-color-string) | 0.6.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [chartjs-color](https://github.com/chartjs/chartjs-color) | 2.4.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [codelyzer](https://github.com/mgechev/codelyzer) | 6.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [codex-notifier](https://github.com/codex-team/js-notifier) | 1.1.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [codex-tooltip](https://github.com/codex-team/codex.tooltips) | 1.0.5 | [MIT](http://www.opensource.org/licenses/MIT) | +| [color-convert](https://github.com/Qix-/color-convert) | 1.9.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [color-name](https://github.com/dfcreative/color-name) | 1.1.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [color-name](https://github.com/colorjs/color-name) | 1.1.4 | [MIT](http://www.opensource.org/licenses/MIT) | +| [combined-stream](https://github.com/felixge/node-combined-stream) | 1.0.8 | [MIT](http://www.opensource.org/licenses/MIT) | +| [commander](https://github.com/tj/commander.js) | 2.20.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [component-emitter](https://github.com/component/emitter) | 1.3.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [concat-map](https://github.com/substack/node-concat-map) | 0.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [cookiejar](https://github.com/bmeck/node-cookiejar) | 2.1.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [cropperjs](https://github.com/fengyuanchen/cropperjs) | 1.5.12 | [MIT](http://www.opensource.org/licenses/MIT) | +| [css-selector-tokenizer](https://github.com/css-modules/css-selector-tokenizer) | 0.7.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [css-selector-tokenizer](https://github.com/css-modules/css-selector-tokenizer) | 0.7.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [cssauron](https://github.com/chrisdickinson/cssauron) | 1.4.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [cssesc](https://github.com/mathiasbynens/cssesc) | 0.1.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [cssesc](https://github.com/mathiasbynens/cssesc) | 3.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [custom-event-polyfill](https://github.com/kumarharsh/custom-event-polyfill) | 1.0.7 | [MIT](http://www.opensource.org/licenses/MIT) | +| [d](https://github.com/medikoo/d) | 1.0.1 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [damerau-levenshtein](https://github.com/tad-lispy/node-damerau-levenshtein) | 1.0.8 | [BSD-2-Clause](http://www.opensource.org/licenses/BSD-2-Clause) | +| [debug](https://github.com/debug-js/debug) | 4.3.4 | [MIT](http://www.opensource.org/licenses/MIT) | +| [delayed-stream](https://github.com/felixge/node-delayed-stream) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [diff](https://github.com/kpdecker/jsdiff) | 4.0.2 | [BSD-3-Clause](http://www.opensource.org/licenses/BSD-3-Clause) | +| dotenv-expand | 5.1.0 | [BSD-2-Clause](http://www.opensource.org/licenses/BSD-2-Clause) | +| editorjs-html | 3.4.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [editorjs-paragraph-with-alignment](https://github.com/kaaaaaaaaaaai/paragraph-with-alignment) | 3.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [es5-ext](https://github.com/medikoo/es5-ext) | 0.10.61 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [es6-iterator](https://github.com/medikoo/es6-iterator) | 2.0.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [es6-symbol](https://github.com/medikoo/es6-symbol) | 3.1.3 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [escape-string-regexp](https://github.com/sindresorhus/escape-string-regexp) | 1.0.5 | [MIT](http://www.opensource.org/licenses/MIT) | +| [esprima](https://github.com/jquery/esprima) | 4.0.1 | [BSD-2-Clause](http://www.opensource.org/licenses/BSD-2-Clause) | +| [eve-raphael](https://github.com/tomasAlabes/eve) | 0.5.0 | [Apache](http://www.apache.org/licenses/LICENSE-2.0) | +| [event-emitter](https://github.com/medikoo/event-emitter) | 0.3.5 | [MIT](http://www.opensource.org/licenses/MIT) | +| [eventemitter3](https://github.com/primus/eventemitter3) | 3.1.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [ext](https://github.com/medikoo/es5-ext.git#ext) | 1.6.0 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [extract-files](https://github.com/jaydenseric/extract-files) | 9.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [fast-safe-stringify](https://github.com/davidmarkclements/fast-safe-stringify) | 2.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [fastparse](https://github.com/webpack/fastparse) | 1.1.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [form-data](https://github.com/form-data/form-data) | 3.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [formidable](https://github.com/node-formidable/formidable) | 1.2.6 | [MIT](http://www.opensource.org/licenses/MIT) | +| [fs.realpath](https://github.com/isaacs/fs.realpath) | 1.0.0 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [function-bind](https://github.com/Raynos/function-bind) | 1.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [get-intrinsic](https://github.com/ljharb/get-intrinsic) | 1.1.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [glob](https://github.com/isaacs/node-glob) | 7.2.0 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [graphql-tag](https://github.com/apollographql/graphql-tag) | 2.12.6 | [MIT](http://www.opensource.org/licenses/MIT) | +| [graphql](https://github.com/graphql/graphql-js) | 15.8.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [has-flag](https://github.com/sindresorhus/has-flag) | 3.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [has-symbols](https://github.com/inspect-js/has-symbols) | 1.0.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [has](https://github.com/tarruda/has) | 1.0.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [hoist-non-react-statics](https://github.com/mridgway/hoist-non-react-statics) | 3.3.2 | [BSD-3-Clause](http://www.opensource.org/licenses/BSD-3-Clause) | +| [inflight](https://github.com/npm/inflight) | 1.0.6 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [inherits](https://github.com/isaacs/inherits) | 2.0.4 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [is-core-module](https://github.com/inspect-js/is-core-module) | 2.9.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [iterall](https://github.com/leebyron/iterall) | 1.3.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [js-tokens](https://github.com/lydell/js-tokens) | 4.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [js-yaml](https://github.com/nodeca/js-yaml) | 3.14.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [jsesc](https://github.com/mathiasbynens/jsesc) | 0.5.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [lodash-es](https://github.com/lodash/lodash) | 4.17.21 | [MIT](http://www.opensource.org/licenses/MIT) | +| [loose-envify](https://github.com/zertosh/loose-envify) | 1.4.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [lru-cache](https://github.com/isaacs/node-lru-cache) | 6.0.0 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [methods](https://github.com/jshttp/methods) | 1.1.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [mime-db](https://github.com/jshttp/mime-db) | 1.52.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [mime-types](https://github.com/jshttp/mime-types) | 2.1.35 | [MIT](http://www.opensource.org/licenses/MIT) | +| [mime](https://github.com/broofa/mime) | 2.6.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [minimatch-browser](https://github.com/isaacs/minimatch) | 1.0.0 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [minimatch](https://github.com/isaacs/minimatch) | 3.1.2 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [minimatch](https://github.com/isaacs/minimatch) | 5.0.1 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [minimist](https://github.com/substack/minimist) | 1.2.6 | [MIT](http://www.opensource.org/licenses/MIT) | +| [mkdirp](https://github.com/substack/node-mkdirp) | 0.5.6 | [MIT](http://www.opensource.org/licenses/MIT) | +| [moment](https://github.com/moment/moment) | 2.29.4 | [MIT](http://www.opensource.org/licenses/MIT) | +| [ms](https://github.com/zeit/ms) | 2.1.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [nanoid](https://github.com/ai/nanoid) | 3.3.4 | [MIT](http://www.opensource.org/licenses/MIT) | +| [next-tick](https://github.com/medikoo/next-tick) | 1.1.0 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [ng2-charts](https://github.com/valor-software/ng2-charts) | 2.4.2 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [ngx-monaco-editor](https://github.com/atularen/ngx-monaco-editor) | 8.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [object-assign](https://github.com/sindresorhus/object-assign) | 4.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [object-inspect](https://github.com/inspect-js/object-inspect) | 1.12.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [once](https://github.com/isaacs/once) | 1.4.0 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [optimism](https://github.com/benjamn/optimism) | 0.16.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [parse5](https://github.com/inikulin/parse5) | 5.1.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [path-is-absolute](https://github.com/sindresorhus/path-is-absolute) | 1.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [path-parse](https://github.com/jbgutierrez/path-parse) | 1.0.7 | [MIT](http://www.opensource.org/licenses/MIT) | +| [pdfjs-dist](https://github.com/mozilla/pdfjs-dist) | 2.5.207 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [prop-types](https://github.com/facebook/prop-types) | 15.8.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [qs](https://github.com/ljharb/qs) | 6.11.0 | [BSD-3-Clause](http://www.opensource.org/licenses/BSD-3-Clause) | +| [raphael](https://github.com/DmitryBaranovskiy/raphael) | 2.3.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [react-is](https://github.com/facebook/react) | 16.13.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [react](https://github.com/facebook/react) | 16.14.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [readable-stream](https://github.com/nodejs/readable-stream) | 3.6.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [regenerate](https://github.com/mathiasbynens/regenerate) | 1.4.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [regexpu-core](https://github.com/mathiasbynens/regexpu-core) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [regjsgen](https://github.com/d10/regjsgen) | 0.2.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [regjsparser](https://github.com/jviereck/regjsparser) | 0.1.5 | [BSD](http://www.opensource.org/licenses/BSD-2-Clause) | +| [resolve](https://github.com/browserify/resolve) | 1.22.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [rxjs](https://github.com/reactivex/rxjs) | 6.6.7 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [safe-buffer](https://github.com/feross/safe-buffer) | 5.2.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [semver-dsl](https://github.com/mgechev/semver-dsl) | 1.0.1 | [MIT](http://www.opensource.org/licenses/MIT) | +| [semver](https://github.com/npm/node-semver) | 5.7.1 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [semver](https://github.com/npm/node-semver) | 7.3.7 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [side-channel](https://github.com/ljharb/side-channel) | 1.0.4 | [MIT](http://www.opensource.org/licenses/MIT) | +| [source-map](https://github.com/mozilla/source-map) | 0.5.6 | [BSD-3-Clause](http://www.opensource.org/licenses/BSD-3-Clause) | +| [source-map](https://github.com/mozilla/source-map) | 0.5.7 | [BSD-3-Clause](http://www.opensource.org/licenses/BSD-3-Clause) | +| [sprintf-js](https://github.com/alexei/sprintf.js) | 1.0.3 | [BSD-3-Clause](http://www.opensource.org/licenses/BSD-3-Clause) | +| [sprintf-js](https://github.com/alexei/sprintf.js) | 1.1.2 | [BSD-3-Clause](http://www.opensource.org/licenses/BSD-3-Clause) | +| [string_decoder](https://github.com/nodejs/string_decoder) | 1.3.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [subscriptions-transport-ws](https://github.com/apollostack/subscriptions-transport-ws) | 0.11.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [superagent](https://github.com/visionmedia/superagent) | 6.1.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [supports-color](https://github.com/chalk/supports-color) | 5.5.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [supports-preserve-symlinks-flag](https://github.com/inspect-js/node-supports-preserve-symlinks-flag) | 1.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [symbol-observable](https://github.com/blesh/symbol-observable) | 1.2.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [symbol-observable](https://github.com/blesh/symbol-observable) | 4.0.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [through](https://github.com/dominictarr/through) | 2.3.8 | [MIT](http://www.opensource.org/licenses/MIT) | +| [ts-invariant](https://github.com/apollographql/invariant-packages) | 0.10.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [tslib](https://github.com/Microsoft/tslib) | 1.14.1 | [0BSD](http://landley.net/toybox/license.html) | +| [tslib](https://github.com/Microsoft/tslib) | 2.4.0 | [0BSD](http://landley.net/toybox/license.html) | +| [tslint](https://github.com/palantir/tslint) | 6.1.3 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [tsutils](https://github.com/ajafff/tsutils) | 2.29.0 | [MIT](http://www.opensource.org/licenses/MIT) | +| [type](https://github.com/medikoo/type) | 1.2.0 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [type](https://github.com/medikoo/type) | 2.6.0 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [typescript](https://github.com/Microsoft/TypeScript) | 4.5.5 | [Apache-2.0](http://www.apache.org/licenses/LICENSE-2.0) | +| [util-deprecate](https://github.com/TooTallNate/util-deprecate) | 1.0.2 | [MIT](http://www.opensource.org/licenses/MIT) | +| [wrappy](https://github.com/npm/wrappy) | 1.0.2 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [ws](https://github.com/websockets/ws) | 7.5.9 | [MIT](http://www.opensource.org/licenses/MIT) | +| [yallist](https://github.com/isaacs/yallist) | 4.0.0 | [ISC](https://www.isc.org/downloads/software-support-policy/isc-license/) | +| [zen-observable-ts](https://github.com/apollographql/zen-observable-ts) | 1.2.5 | [MIT](http://www.opensource.org/licenses/MIT) | +| [zen-observable](https://github.com/zenparsing/zen-observable) | 0.8.15 | [MIT](http://www.opensource.org/licenses/MIT) | +| [zone.js](https://github.com/angular/angular) | 0.10.3 | [MIT](http://www.opensource.org/licenses/MIT) | +| [zone.js](https://github.com/angular/angular) | 0.11.7 | [MIT](http://www.opensource.org/licenses/MIT) | + diff --git a/docs/vulnerability/README.md b/docs/vulnerability/README.md index b9a50d7198..0a5a3fc57a 100644 --- a/docs/vulnerability/README.md +++ b/docs/vulnerability/README.md @@ -26,3 +26,4 @@ The pages linked below contain the audit for all third party dependencies of ADF - [ADF 4.9.0](audit-info-4.9.0.md) - [ADF 4.10.0](audit-info-4.10.0.md) - [ADF 4.11.0](audit-info-4.11.0.md) +- [ADF 5.0.0-angular.13](audit-info-5.0.0-angular.13.md) diff --git a/docs/vulnerability/audit-info-5.0.0-angular.13.md b/docs/vulnerability/audit-info-5.0.0-angular.13.md new file mode 100644 index 0000000000..8361454568 --- /dev/null +++ b/docs/vulnerability/audit-info-5.0.0-angular.13.md @@ -0,0 +1,22 @@ +--- +Title: Audit info, alfresco-ng2-components 5.0.0-angular.13 +--- + +# Audit information for alfresco-ng2-components 5.0.0-angular.13 + +This page lists the security audit of the dependencies this project depends on. + +## Risks + +- Critical risk: 0 +- High risk: 0 +- Moderate risk: 0 +- Low risk: 0 + +Dependencies analyzed: 138 + +## Libraries + +| Severity | Module | Vulnerable versions | +| --- | --- | --- | + diff --git a/e2e/content-services/directives/delete-directive.e2e.ts b/e2e/content-services/directives/delete-directive.e2e.ts index fdc3ef5623..ce5f5aabda 100644 --- a/e2e/content-services/directives/delete-directive.e2e.ts +++ b/e2e/content-services/directives/delete-directive.e2e.ts @@ -149,7 +149,7 @@ describe('Delete Directive', () => { await contentListPage.dataTable.checkContentIsNotDisplayed('Display name', folderInfo.name); }); - it('[C260193] Delete file when different selections are set', async () => { + it('[C260193] Delete file when different selections are set', async () => { await contentServicesPage.chooseSelectionMode('None'); await contentListPage.selectRow(txtFileModel.name); await contentListPage.dataTable.checkRowIsNotSelected('Display name', txtFileModel.name); diff --git a/e2e/content-services/document-list/document-list-component.e2e.ts b/e2e/content-services/document-list/document-list-component.e2e.ts index 9ee20528a6..7bc6028e29 100644 --- a/e2e/content-services/document-list/document-list-component.e2e.ts +++ b/e2e/content-services/document-list/document-list-component.e2e.ts @@ -19,7 +19,7 @@ import { ContentServicesPage } from '../../core/pages/content-services.page'; import { browser } from 'protractor'; import { createApiService, LoginPage, StringUtil, UploadActions, UsersActions, ViewerPage } from '@alfresco/adf-testing'; import { FileModel } from '../../models/ACS/file.model'; -import moment from 'moment-es6'; +import * as moment from 'moment'; import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; describe('Document List Component', () => { diff --git a/e2e/content-services/metadata/metadata-content-type.e2e.ts b/e2e/content-services/metadata/metadata-content-type.e2e.ts index 186034ceb3..7096b42323 100644 --- a/e2e/content-services/metadata/metadata-content-type.e2e.ts +++ b/e2e/content-services/metadata/metadata-content-type.e2e.ts @@ -109,7 +109,7 @@ describe('content type', () => { }); it('[C593560] Should the user be able to select a new content type and save it only after the confirmation dialog', async () => { - await BrowserActions.getUrl(browser.baseUrl + `/(overlay:files/${pdfFile.id}/view)`); + await BrowserActions.getUrl(browser.baseUrl + `/files(overlay:files/${pdfFile.id}/view)`); await viewerPage.checkFileIsLoaded(pdfFile.name); await viewerPage.clickInfoButton(); await viewerPage.checkInfoSideBarIsDisplayed(); @@ -134,7 +134,7 @@ describe('content type', () => { await loginPage.login(acsUser.username, acsUser.password); await navigationBarPage.navigateToContentServices(); await contentServicesPage.contentList.dataTablePage().waitTillContentLoaded(); - await BrowserActions.getUrl(browser.baseUrl + `/(overlay:files/${pdfFile.id}/view)`); + await BrowserActions.getUrl(browser.baseUrl + `/files(overlay:files/${pdfFile.id}/view)`); await viewerPage.checkFileIsLoaded(pdfFile.name); await viewerPage.clickInfoButton(); await viewerPage.checkInfoSideBarIsDisplayed(); @@ -150,7 +150,7 @@ describe('content type', () => { }); it('[C593559] Should the user be able to select a new content type and not save it when press cancel in the confirmation dialog', async () => { - await BrowserActions.getUrl(browser.baseUrl + `/(overlay:files/${docxFileModel.id}/view)`); + await BrowserActions.getUrl(browser.baseUrl + `/files(overlay:files/${docxFileModel.id}/view)`); await viewerPage.checkFileIsLoaded(docxFileModel.name); await viewerPage.clickInfoButton(); await viewerPage.checkInfoSideBarIsDisplayed(); @@ -173,7 +173,7 @@ describe('content type', () => { await loginPage.login(acsUser.username, acsUser.password); await navigationBarPage.navigateToContentServices(); await contentServicesPage.contentList.dataTablePage().waitTillContentLoaded(); - await BrowserActions.getUrl(browser.baseUrl + `/(overlay:files/${docxFileModel.id}/view)`); + await BrowserActions.getUrl(browser.baseUrl + `/files(overlay:files/${docxFileModel.id}/view)`); await viewerPage.checkFileIsLoaded(docxFileModel.name); await viewerPage.clickInfoButton(); await viewerPage.checkInfoSideBarIsDisplayed(); diff --git a/e2e/content-services/metadata/metadata-smoke-tests.e2e.ts b/e2e/content-services/metadata/metadata-smoke-tests.e2e.ts index 722643c578..c071a5632d 100644 --- a/e2e/content-services/metadata/metadata-smoke-tests.e2e.ts +++ b/e2e/content-services/metadata/metadata-smoke-tests.e2e.ts @@ -30,7 +30,7 @@ import { MetadataViewPage } from '../../core/pages/metadata-view.page'; import { FileModel } from '../../models/ACS/file.model'; import { browser } from 'protractor'; import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; -import moment = require('moment'); +import * as moment from 'moment'; describe('Metadata component', () => { @@ -269,7 +269,7 @@ describe('Metadata component', () => { it('[C279960] Should show the last username modifier when modify a File', async () => { await loginPage.loginWithProfile('admin'); - await BrowserActions.getUrl(browser.baseUrl + `/(overlay:files/${pngFileModel.id}/view)`); + await BrowserActions.getUrl(browser.baseUrl + `/files(overlay:files/${pngFileModel.id}/view)`); await viewerPage.clickInfoButton(); await viewerPage.checkInfoSideBarIsDisplayed(); diff --git a/e2e/core/datatable/data-table-component.e2e.ts b/e2e/core/datatable/data-table-component.e2e.ts index c963a3a4a7..054acd424e 100644 --- a/e2e/core/datatable/data-table-component.e2e.ts +++ b/e2e/core/datatable/data-table-component.e2e.ts @@ -29,8 +29,6 @@ import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; describe('Datatable component', () => { - const dataTablePage = new DataTablePage('defaultTable'); - const copyContentDataTablePage = new DataTablePage('copyClipboardDataTable'); const dragAndDropDataTablePage = new DataTablePage(); const loginPage = new LoginPage(); const acsUser = new UserModel(); @@ -56,48 +54,6 @@ describe('Datatable component', () => { await navigationBarPage.clickLogoutButton(); }); - describe('Datatable component - copyContent', () => { - beforeAll(async () => { - await navigationBarPage.navigateToCopyContentDatatable(); - await dataTablePage.dataTable.waitForTableBody(); - }); - - it('[C307040] A column value with copyContent set to true is copied when clicking on it', async () => { - await dataTablePage.mouseOverIdColumn('1'); - await expect(await dataTablePage.getCopyContentTooltip()).toEqual('Click to copy'); - await dataTablePage.clickOnIdColumn('1'); - await notificationHistoryPage.checkNotifyContains('Text copied to clipboard'); - await dataTablePage.clickOnIdColumn('2'); - await notificationHistoryPage.checkNotifyContains('Text copied to clipboard'); - await dataTablePage.pasteClipboard(); - await expect(await dataTablePage.getClipboardInputText()).toEqual('2'); - }); - - it('[C307073] A column value with copyContent set to true is copied when clicking on it', async () => { - await copyContentDataTablePage.mouseOverIdColumn('1'); - await expect(await copyContentDataTablePage.getCopyContentTooltip()).toEqual('Click to copy'); - await copyContentDataTablePage.clickOnIdColumn('1'); - await notificationHistoryPage.checkNotifyContains('Text copied to clipboard'); - await copyContentDataTablePage.clickOnIdColumn('2'); - await notificationHistoryPage.checkNotifyContains('Text copied to clipboard'); - await copyContentDataTablePage.pasteClipboard(); - await expect(await copyContentDataTablePage.getClipboardInputText()).toEqual('2'); - }); - - it('[C307100] A column value of type text and with copyContent set to true is copied when clicking on it', async () => { - await dataTablePage.mouseOverIdColumn('1'); - await expect(await dataTablePage.getCopyContentTooltip()).toEqual('Click to copy'); - await dataTablePage.clickOnIdColumn('1'); - await notificationHistoryPage.checkNotifyContains('Text copied to clipboard'); - await dataTablePage.pasteClipboard(); - await expect(await dataTablePage.getClipboardInputText()).toEqual('1'); - }); - - afterAll(async () => { - await navigationBarPage.clickHomeButton(); - }); - }); - describe('Datatable component - Drag and Drop', () => { beforeAll(async () => { await navigationBarPage.navigateToDragAndDropDatatable(); diff --git a/e2e/core/pages/content-services.page.ts b/e2e/core/pages/content-services.page.ts index c9fd712605..288a573971 100644 --- a/e2e/core/pages/content-services.page.ts +++ b/e2e/core/pages/content-services.page.ts @@ -93,7 +93,7 @@ export class ContentServicesPage { notMarkedFavorite = element(by.cssContainingText('button[data-automation-id="favorite"] mat-icon', 'star_border')); multiSelectToggle = $('[data-automation-id="multiSelectToggle"]'); selectAllCheckbox = $$('.adf-checkbox-sr-only').first(); - selectionModeDropdown = $('.mat-select[aria-label="Selection Mode"]'); + selectionModeDropdown = $('.mat-select[placeholder="Selection Mode"]'); selectedNodesList = $$('.app-content-service-settings li'); siteListDropdown = new DropdownPage($(`mat-select[data-automation-id='site-my-files-option']`)); sortingDropdown = new DropdownPage($('mat-select[data-automation-id="grid-view-sorting"]')); diff --git a/e2e/core/pages/dialog/share-dialog.page.ts b/e2e/core/pages/dialog/share-dialog.page.ts index c1af62a1d7..af92b6cc9a 100644 --- a/e2e/core/pages/dialog/share-dialog.page.ts +++ b/e2e/core/pages/dialog/share-dialog.page.ts @@ -17,7 +17,7 @@ import { $$, $ } from 'protractor'; import { BrowserVisibility, TogglePage, BrowserActions, DateTimePickerPage } from '@alfresco/adf-testing'; -import moment = require('moment'); +import * as moment from 'moment'; export class ShareDialogPage { diff --git a/e2e/core/pages/login-shell.page.ts b/e2e/core/pages/login-shell.page.ts index ea9dd6dc8b..c596439de6 100644 --- a/e2e/core/pages/login-shell.page.ts +++ b/e2e/core/pages/login-shell.page.ts @@ -32,8 +32,8 @@ export class LoginShellPage { usernameError = $('span[data-automation-id="username-error"]'); passwordError = $('span[data-automation-id="password-required"]'); loginError = $('.adf-login-error-message'); - usernameInactive = $('input[id="username"][aria-invalid="false"]'); - passwordInactive = $('input[id="password"][aria-invalid="false"]'); + usernameInactive = $('input[id="username"][class*="ng-invalid"]'); + passwordInactive = $('input[id="password"][class*="ng-invalid"]'); adfLogo = $('.adf-img-logo'); usernameHighlighted = $('input[id="username"][aria-invalid="true"]'); @@ -115,6 +115,7 @@ export class LoginShellPage { async checkPasswordHighlighted(): Promise { await BrowserActions.click(this.adfLogo); + await browser.sleep(900000); await BrowserVisibility.waitUntilElementIsVisible(this.passwordHighlighted); } diff --git a/e2e/process-services-cloud/pages/people-group-cloud-component.page.ts b/e2e/process-services-cloud/pages/people-group-cloud-component.page.ts index b95a9e0615..6ad827fe6b 100644 --- a/e2e/process-services-cloud/pages/people-group-cloud-component.page.ts +++ b/e2e/process-services-cloud/pages/people-group-cloud-component.page.ts @@ -33,7 +33,7 @@ export class PeopleGroupCloudComponentPage { groupAppInput = $('input[data-automation-id="app-group-app-input"]'); peopleCloudComponentTitle = element(by.cssContainingText('mat-card-title', 'People Cloud Component')); groupCloudComponentTitle = element(by.cssContainingText('mat-card-title', 'Groups Cloud Component')); - preselectValidation = $$('mat-checkbox.app-preselect-value').first(); + preselectValidation = $$('mat-checkbox.app-preselect-value label').first(); preselectValidationStatus = $$('mat-checkbox.app-preselect-value label input').first(); async navigateTo() { diff --git a/e2e/process-services-cloud/process/process-filter-results.e2e.ts b/e2e/process-services-cloud/process/process-filter-results.e2e.ts index 8bed6136df..fa4663c664 100644 --- a/e2e/process-services-cloud/process/process-filter-results.e2e.ts +++ b/e2e/process-services-cloud/process/process-filter-results.e2e.ts @@ -35,7 +35,7 @@ import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; import { ProcessListPage } from '../../process-services/pages/process-list.page'; import { EditProcessFilterConfiguration } from './../config/edit-process-filter.config'; import { ProcessListCloudConfiguration } from './../config/process-list-cloud.config'; -import moment = require('moment'); +import * as moment from 'moment'; describe('Process filters cloud', () => { diff --git a/e2e/process-services-cloud/process/process-header-cloud.e2e.ts b/e2e/process-services-cloud/process/process-header-cloud.e2e.ts index d2d52550c1..06d73faf5e 100644 --- a/e2e/process-services-cloud/process/process-header-cloud.e2e.ts +++ b/e2e/process-services-cloud/process/process-header-cloud.e2e.ts @@ -21,7 +21,7 @@ import { ProcessCloudDemoPage } from './../pages/process-cloud-demo.page'; import { TasksCloudDemoPage } from './../pages/tasks-cloud-demo.page'; import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; import CONSTANTS = require('../../util/constants'); -import moment = require('moment'); +import * as moment from 'moment'; import { EditProcessFilterConfiguration } from './../config/edit-process-filter.config'; describe('Process Header cloud component', () => { diff --git a/e2e/process-services-cloud/task-list/task-header-cloud.e2e.ts b/e2e/process-services-cloud/task-list/task-header-cloud.e2e.ts index 96db495219..1b20699c44 100644 --- a/e2e/process-services-cloud/task-list/task-header-cloud.e2e.ts +++ b/e2e/process-services-cloud/task-list/task-header-cloud.e2e.ts @@ -29,7 +29,7 @@ import { createApiService, import { browser } from 'protractor'; import { TasksCloudDemoPage } from './../pages/tasks-cloud-demo.page'; import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; -import moment = require('moment'); +import * as moment from 'moment'; const isValueInvalid = (value: any): boolean => { return value === null || value === undefined; diff --git a/e2e/process-services-cloud/task-list/task-list-properties.e2e.ts b/e2e/process-services-cloud/task-list/task-list-properties.e2e.ts index df21a4d171..9f34906d5a 100644 --- a/e2e/process-services-cloud/task-list/task-list-properties.e2e.ts +++ b/e2e/process-services-cloud/task-list/task-list-properties.e2e.ts @@ -25,7 +25,7 @@ import { import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; import { TasksCloudDemoPage } from './../pages/tasks-cloud-demo.page'; import { TaskListCloudConfiguration } from './../config/task-list-cloud.config'; -import moment = require('moment'); +import * as moment from 'moment'; import { taskFilterConfiguration } from './../config/task-filter.config'; describe('Edit task filters and task list properties', () => { diff --git a/e2e/process-services/process/process-instance-details.e2e.ts b/e2e/process-services/process/process-instance-details.e2e.ts index 5ea4f4c0dc..e681222e16 100644 --- a/e2e/process-services/process/process-instance-details.e2e.ts +++ b/e2e/process-services/process/process-instance-details.e2e.ts @@ -28,7 +28,7 @@ import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; import { ProcessServiceTabBarPage } from './../pages/process-service-tab-bar.page'; import { ProcessListPage } from './../pages/process-list.page'; import { ProcessDetailsPage } from './../pages/process-details.page'; -import moment = require('moment'); +import * as moment from 'moment'; import { ProcessInstancesApi } from '@alfresco/js-api'; describe('Process Instance Details', () => { diff --git a/e2e/process-services/tasks/custom-tasks-filters.e2e.ts b/e2e/process-services/tasks/custom-tasks-filters.e2e.ts index 62dda7cc6a..6b5b731bcd 100644 --- a/e2e/process-services/tasks/custom-tasks-filters.e2e.ts +++ b/e2e/process-services/tasks/custom-tasks-filters.e2e.ts @@ -28,7 +28,7 @@ import { browser } from 'protractor'; import { TaskListDemoPage } from './../pages/task-list-demo.page'; import { NavigationBarPage } from '../../core/pages/navigation-bar.page'; import { TaskActionsApi, TaskRepresentation, TasksApi } from '@alfresco/js-api'; -import moment = require('moment'); +import * as moment from 'moment'; describe('Start Task - Custom App', () => { diff --git a/e2e/process-services/tasks/info-drawer.e2e.ts b/e2e/process-services/tasks/info-drawer.e2e.ts index 64d34fa378..14fe46b70c 100644 --- a/e2e/process-services/tasks/info-drawer.e2e.ts +++ b/e2e/process-services/tasks/info-drawer.e2e.ts @@ -33,7 +33,7 @@ import { ProcessServiceTabBarPage } from './../pages/process-service-tab-bar.pag import { ProcessFiltersPage } from './../pages/process-filters.page'; import { infoDrawerConfiguration } from './../config/task.config'; import CONSTANTS = require('../../util/constants'); -import moment = require('moment'); +import * as moment from 'moment'; describe('Info Drawer', () => { diff --git a/e2e/process-services/tasks/task-details.e2e.ts b/e2e/process-services/tasks/task-details.e2e.ts index 2e441e59ba..69b408190a 100644 --- a/e2e/process-services/tasks/task-details.e2e.ts +++ b/e2e/process-services/tasks/task-details.e2e.ts @@ -31,7 +31,7 @@ import Task = require('../../models/APS/Task'); import TaskModel = require('../../models/APS/TaskModel'); import FormModel = require('../../models/APS/FormModel'); import CONSTANTS = require('../../util/constants'); -import moment = require('moment'); +import * as moment from 'moment'; describe('Task Details component', () => { diff --git a/e2e/resources/activiti7/simpleapp.zip b/e2e/resources/activiti7/simpleapp.zip index cc66adf28925f655a20d8863d70a41004618b63a..d1e2705731104b857a998de08b2ad41c2a5fbd68 100644 GIT binary patch delta 107983 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�$2^5-g+XqFLB5-jeqCS=$5oS*GF4}D7G&9b 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

7|NfgQ~ zhy(ppKulpLXfM!?a|w_;y$5&tsnf6O_|fvrPA<*-}@@N~Z?)_Olx;M`70+ zhgxd&?wOuxm1O1N^ZV8UN{{_f`E47^2NiF2Htkam+Jes^2vw5gz)V?zvWN>Ww82+l zBh^7q)CN_!5q`w>c;N(kMsZLoME} zDWMpAn{A}o3XK`er+FGHN~=18fTV`yN?m)~+hL_}0L0><8x?D|uJ6P#TOk=HOW6H6 ztv$W9icUxwndXvvJ$#I0Ks(KTIbL`>aPEwLm(?;stxDHnm&YQK=ej-htk6DOx2wn? z`y7<#Y9x3ZbkZKtD0*N&_uo||6Z#SKi0mBJ%vDjxV1R7}ha1pn3B_^>)u}sw_^^@w`nc(n0Ydgx59Z=ah0g$H<<$7?0$j{chOa6zXrcS6 zLt5zF-CPKyJakHCUl@`E*U3UCOy{*T;P-|!$Ws7Vm{*~W-?Evzv5+P}(T_*K^7i`k zF2M->F;YHJoyjzz@F@rZKI!|WlPSuI&ev8M7C`UZ=;K6u5^~8|IK_aSj|47Jf4(rk zsAKM}#_c7pQt8EEbiT;IOr^pmbLSxLDcA$zLqa&E&`@Etzv#;nkz%v@t~+T4wykaw zy6;1B4PVeg!%4CF!9UUbUp3i>eA%ik-C%@s5{ z$Dd0cSAdqpk;9{zCxf@|CW)=3V&&BXU>Vs7ztJx#9mTpI!G2DL$7x?CsY|IRg=3y# zqMB@n+gi+<6DLct9Pr^Iy2+EAX(!X-tw8-<^xd>=(yFY#dX0Lt4`-d)(_EHk9X}BK z6bVu1z=q?%kFsG_(2Ey#CREeTaFhC^R10251c(Vd^mObd|g`B zVsvJ-YF&EH6_g>n+^aY8KSy8A2HIVP5XI8VoZC4*6sAO$ z6(fyM>Ub|?-kow{{n8aZ_>)T7n=3k=Y@1Jje~d;E1iP~R{dr~{;E61gtz~phGo=^7 z)m5!tRt`dScfLOm*&sxc#3V&cj<{yscHH#S=tS{-nwTB;K`1{lbSq?cFP}4I+Zq@F z%ssM{GLbUh(mW4ikcE0LDq#EPjK2@L znAzoVkBgQJf6U4V&_)X101*@)2`2Rf{|(+$GQ?k1N&`VfyV6=jS$4@0UoW$_i3T<( zJv-77m5Z+I7dqs(qsCHq^$edde96dwuDr0IcUed>b;P|rapa1Onoe|P{?wVrr=|7B z&tFe2bf{U{JO`%eHQa*`&=F)h~rH(BU2p+c`Zt;*^XGlps?w+G=X-KTG9uhTjmwg!o4gMU?I-jilMiL=X{Q13&QD$$}OD{EU1QgE< zz8>=&Ey-ky35HxA_l@gK z_Cfu6-*(mKx)PdWNH*m)1<&L%(X5H*+2SlOarB4-&FR{rsc5=jMhvLah~gYbMk>lE zkbH?XbN8ol@IT~B&laQ--bM_+KOq==F#pv+sFaCs_nk5~2NOQt1~)-qOm?pJO6BZgJ=H zc>!akCH~hAe777wKH8s0#trDmCLWNkM7IMp2SyJs_2Ut7dDr`6)0zaebq^e;+A11T zZ%09K47%DVR|L1dzX1F;E-Xe!R!F}G=D;Jg8+cI}0VpOOl-)@u{=r-}{foH_jceOC zPPpcP^NrQqSbP&dZ<*TrS3Wp^s>nnDEIYUVjk!$K>i`u7z)>i*u}Q)Gorn5`*af32 z&VT}}GB7Z}DkCLbVmi=txG}oh$zgBKc@X+N*zKClb}Ii|QP=_As5g$N2z{4ypK8Dp zPn0u|$%K4(u;YHw3mo_1{rq@;Wl9{6M!R2@tPIRHhyzmX`+3Fvl|bk5E!`J;(%ytU z4ldq`MT9zFoZBXkfIJjyt?S6&5-MeII7_AGfH-+lOzSYBp5S1Ze^$@l79o%uC;qxJM_QWZK{ zyQ~}0Ie4}=@b0|q`^x5*ZerrFoy}cK^P^X>p_iAvy=A;mS!kX9d2PR=iH2IW{<2M0 z0694U$;c3{l|6nSipxEI)bAPi{;*CnRN3WMwx4-ws5T|kPjFcwBoW4--$HqX$l;7t zK}MngrsbnyW-ZsdG!{=6Q$vml`oApzc&$&^B}*KmI*n9?p+Q;=md+`oC(- zV;3ktAgT?bfU@v3NV?M2qS96Z7(C)9QUwzNnK;oy%ob<-{ z=0Ilan2-=AZ)OW&3Zue!2ZK;@7uzB+l+rVKb(QKUxjQ&QD-5$=P(Juz$(_6sHH4jP{WZo&OR%Ba3AdqV9fj*oU!#4CXXQ_QUOSPma~}U}qqxOQ6Gjuuw%uIK zgx!8!lQ<3i{tfz)s^2eb_*mK$t6|~*95~X?N%Pw0o~RzK_ttP%xM*hRsBEtX(K45U z98Z*g3k(n4gfg(egnkWGCO%hWVG?aAzB+>jM9tdJ&EWRXdwtJIq`!5jQRA|khMS6Q zk(oHy2)>01-Oxzp7buFrQi|Ziq#%3R{CM1-((Cl`ad%Q^BkiOJKGv<41$Z@Bwf+nW zxs^@iJGT7o{Pla#CxtuOZHRi}2r-);g2PbI0cVmVvDE4N>;@ zs#J{^!QRA~F9F;CQ`dLEbKQN9^O3#x-h1!8_uey`D6(e=A0s0X5$`A>Nhw5RQ^?*U zG7}jgA!Wt?`sDf6=Xrkr_w#zc9)0e)=bm%!x#!$_-}jzF3{5`UwXbaR`h_7sfHQR| z0-bDB?X~mj>$aQzQO@^KjyOgFqe=_DW8r_432Uzj$j&<~%VF=ou+z=Ps230ub0H4> zO6l$=Pqyl(Wo8Z%iO$^c7T@0GDe`)rC5<{t0;Ay)DG7fpA~WlOnQ*doIx+s4q`9I1e7k*wOaIP7DRe^1T>Y;~t9_7Pdvp2;Ly9myKLHKTP- z?o@}53Pss1ZT`p^zIG6K*>a1vRMGQt3t}hdX<$JoIq*sA|M5v+FO&shcn897SZl+G zh;q%RL0SO3UzCcLQS{U4vrs`RDkc1OZlIk&L3nx^eoj;6nJSJ9 z>&?qKY!xW!f@%gLjxc9tGc0Xi(#aYOqP=fN6SF_Zaq!6nod_=R;Ci?X6O>bw42+pm z&NO2Zw)t(V@_qQ_k2=7y-M7;dmOx%*!@6+inxOia+_Z>bZr#U`oYIOXMy}>?D**{3 zsiQ2PFvucWOrTp~%e$rlTW3z}iS<#f>YK=2+dV^XpOPnxB8TIwBZ2oTUhw;*^hO{5 zq?Va>=99w`s_f)DGI1=)c-nJB_vmY$QghuSYL;rhxN%c?Hs zjT+_hUd@Ht3QCD*dF$J)_(?(9*kg3O679`90(kk)1=~=Ldc3I8CTuY+#TE4MtKLVI zn|0o0C%W3Il9QqKIem$lRLxZeyYTKSK6888pJMh)a!paMq(*tA?-4v*sEmUvHo2oN zdNi-0P0AUDQ}0&KF|y zipa|OX#QGV&b!GD?@>vs?Zg6Q_qdXpG& zOP`N7a8YB=62kR_TpvAq^Ic1Z)behJ=|ymJ?zfBTa!QsgUBbHH2`sAEoUpnTbDtE#)r)tLtSpYGn{tiLsk#-@ycCU!w~ssmeRmqx0n$SRAy zMP9YunZc2S>F|Q;-HxGIaBVKxm#sMNGdxMCkAz5r!CF_hZLG5_nr&3lOnV|iwem%` zi3mO;s-d_%{81vz>GBol2Ws97WCdJG*q2z|jgD-nE~!|PZJ?{OEnVTEs_-XTk&H1K z5Byw|xLp?>{1q}>e3y}QTRq0~`mLGd*3UT+McVN=w^H;i;MmoQL=?pPXZkL^4<8D^LNJOfuu~s3U-|%VIR=cI^ z>-}#yqYrPVm%`IL*#~HWn*x~uFoTWH+|(RB`-!qDuM2QfG;w{FnaYA}>9oW#wlwUl zNBt*1evJp)x6H{;+LZ};=q)hAEx%rmx@Jso$10Y11wV=&fACvlf*WmqP zeR#2{tsCX?}L*r2}GPF=JS%QeR8f^(4&8>^?mHJ#Qi0=`qoc1*c> z+4+QN?Gk-0Vs&H)R!6$JUf67usJJEZNqSES8tKD1>o$VFNj^Uf9s`L1iU+QD6TI4^ z{chDPL+zoEhKFXrW_RBznG08o6pd*xDhVS^I*p+j)mF`LI(4=N|lJvZtU_ zEolV8QC$mDmvQ?Rh;~ibBf6@#%L1&Fsu3$Cr%Q1CvZzMG9fv3UC}mzWVqx@j$=Hrz&!~501DKp1tcg^M9_D5ZB)6 z`cUz+bU^gIzmnBNr9b8Gd?F8)Pkw37-?%PSzRuFBa*_neYHq1XN3XLN&w=Grwxo~L zk`0r(FJoXtuM?F~2i3|89it1($~Ru&8K=i#t+J>|X1i&sTA$i!kj?=#oJaT#Xa;na5`_jW2nL?p@v$-M3cSt+$-(&eqa5-(CHPYiydqrHOk zYy7Y`zg&DJcE92&|7MYP!I~kqtz!hyY8S=sB~#JW!9tq#faI`!^ze66v!Qez)8ZII z%T)WBJkZk~R9!gNm!Ii%Ly`osXtQ$o1V6I{4o-3y)1E2OaM-<~p#hW%3f>^H)ZS&SMD2cXTOqRYS zoV2U90=vVUwSuSoWVBPwOc-0f`1u3*Vpdf7XT!lcIwT3Ta4p_;7Sh}f@<-_C?EyL= zs4>OVeP(5TKg__YC%emU#z6RHQqnLLCs%@;%8j*DuHq^cIegQcJ5sUE-ecwidEJ4E za)g(plvQ5kw=qHb_=}u-+mhK|h^CZFB7E_Nf@@Gor$@pu6@}9t;z+jkyDAdMc7M^EC()ovY2|2yrB z_Yh_0vCk9DINOz~sc^6&m@$)Cyk+_*uS-EAmFS52yD{U28zm=KzsJW1S zNVSv!idFf-p9B#XHEnD@v|q;h)-*!`+=~}*FY&;=B>Z+SL)Vt7KRw^E4iAZ5yI*?j zvC+@2Zgu1}=@Dum5gqGa+T-`jJ2vQ$_kwJX9aXupR)jfrpemmQil-zGUde-Ge%e2zN+z5RrJMN%L9mKMSGz=L;bV zb-UHZ%}Un`QUh28jB3$v{50&x`0qQpwlcv=XuJDX`Zva^he-#qk5dCbGG)Hj$gfMk zZDwdavdkrobtq$}!b%Y_=5?x333mW#7BvBZ8i>9c;O(_dYeToslNk{gj@!cXw! zTbr7E40hjW2vPkL!0ww!*n7o!l(NEv7FlS`>B_j+vny$|dOO2naKikDZ(e?UvF*)> zUxYE9`DK^JnQaNv;)8922K6f&tcR67({?W$XDWLMaWB6js*=T|ueRco%ShmA^X7SB z^s)RYbAK1eRQfTU{Q8ICU!=*qoH_2UFGe`SNbgStrTNSDG%s8mU}I3XRINq1j7Q_R zI$~Tf9GFrd{01{$`pW}2KNn|0Yml}ufsg_lclhZN^EcTpFLxuoU#g>TuGN<9f6!~; zkDNV@b#4WUVzPEQ=96J%Z9!pvuKN+a*t4DrMf?FiVj=|raenR z(vl~{%!`1PjKtGbhn(S2D;t)gkXcU~z!2SIL4 zZI1N2X8eS^3Gbt~X!d=bY#!cs7d=7*BK$1X;(X?Cw*Ipa0@=E0p`;=3MQGoxx}KEy zt$swbZg<~fnySSiYz3mzS#JKs53~0(?x#t{YZ%c|4Cd_)3-yGoBZ<%Guw#vN(o41WxqkYdG zBFA^-xnISkn0?&bD_QYhhAJ0hu)-iXyXv4Bc6jAc=y%pt~s#=ouvT0ry zrhc_VuhIr)@$2a6PGKIShvyu^&c1i)&l<(GfO8o%|2go2I1dDP1AEQ7zf&#-t8u%X1rkz){9ci zVszd4h210s^hsK)x0f6QeMezU>=#q9*Nr)fe? zLV@2H;sgqLF0BexE;GMR{PO6{(#U-$CVwxwjB@hZw9G4Fo+9p1&0@+|!m*jY-t=OX zi!HdXLg_#%JEtaWu)`pg0E>OA6p^dC>_;dREPOo%)qrJnqkk9vA`r_wBc@J|Y5^UK ztF_tr`*jW!B})rCPo54G_av|Nte89a(Q}#-D7+VOq&Ky0JAd&trgmb8{gK1g&Y|FB zlb3M=?;647vFI0Wv)8IJ?#{1SCrHN2ov>-UUV~0>s&{91cYe05`21Q~OYP0k5}9@6 z{9L0@bIC6W_iIk>Pq<6p6A!w|*0+xo1eD#a?vLE9yG!^nB>MDmIL&sG;VX6_j67Wo z$*a9?D{5ZXiE||rgTJN<^_r-RPQF##E-5O15xo5gox?}hu`t=mhG8O-HauoU?5!UG zcO%ZENTHllsKn1_fn1Ew8=q8~_0J7O9}_6YGdkyJ98BG$^|2I#6ErVwY7H=w&5Bw6 z@~$bTa&zU3jLcK5^ zj&#cIj-v+cox4MIa6(nS&y=Q&n6`Zt-DM%Ti>5DFwpwG2Z&}jaOL`?_%RnDIU=@xN ze@zVEm?iXHEd%G5oC8fM*2K_pC((5L{1wB-?jY4gL%D4IKzN^Yxi0(dKKI@8Lu6A+J&@1A>vG9!Hw@Exc`Hb(?ZXNGUG1uh@ zO^S=+rLVqlP$j8CFZrLdWJq8gZxwA=m*HFxl5B5k6qO5atRS1@r|pQ)l#Z3q>FCf- zyul!*iC+4wa+oW5NasG&BtCCB+IUHVkAuQ&sm1uJpC%;HVsfw@b4jJ8$kuZ0T7g1w z#KRApwAZEJad}h6wFlptPGv%6>Eg%Ai}%{_*RNJOI-K-O1?5+;$z#pq!R8^+!Sj^XqajYZui)E^y?VUufw>ZnAJgC53Ch=2 z|3-%Oc%dRCUggR(^?J!S*!p5*3;TwkRiwmRn~cLf!U44cHl_}&dVsqTU3bcQZtW@S zfQw}urOU&LA#~mcW7qZc{1>8RiIV7fXqO+n|8?77K26?vP7b@8I!T5l_aW1m5>NTY ze9V`J7xX!385Sr%C%7LYmL5m8+l}$SQig$!LyFypNWAq=r(xH~PoPTtInb6kgGvF> z>47y#O1h2V;#q*kTMzv_Rz}z&Y?v*kIC*+@lESm2m@85?$?DBdWrIyB)wLQL-(>_0 zgy(Iea^HO4CBypW`h)J6bcu4m>^pRnXpnT|w)DFY%!-xUL8?4^8gi$T$10sv9`U}* z)fJq_(+^~3q8RImehE7|KZ^~C_z-dVKVP*FR)#y$ywE`7i!vfpD4tOY>i-2u0&}3po*~*gbe50riD>c zpJaTbFfO}s=Oxh-2MpE}hmlqPZz5cn#E)Hb6GF&&?kAbB_zeWy#1%jdfRXIx=+?(H zqMHnUndU%mhI@7dus(2oM}<{i{ww#<5M%jdc7n*D*}HCT6|s7qq79xHIXRrz(eV;nH{v-cXI zJsq*f*Ft)Zd)q^13sUIr{<+aZ=(d*OgG-X7QY2HC19&M*!RGO1)ygy!0fuMrzarYOJBO!$+4Mc~8Zl8#bg$fV+q=SXUA774%cEDvYd-&n|DDe=&){NTN(=in1l{Cfjdw6q)} zbRV;G8g}t6(7W8D*urmhr{uA07t_L4P8(LcMT%3WVSk%!aPWI78H_`slOF#$*&yGg zb{j*xX4AX=r+2@rtnVI#HAwd>FrNBF&YIj9-6MXRjOsI3XqC?V);3@_&v5b(9)(5v z{nJ&CEa4!sek-MeIeYJ+!DOGn?|z26rKpiYA^Ru!*J1{a!z800)TpzG{1kq!qx0&* zBSE(bE#3)Bx$CHFsin$tZAV|9_R6^4`jYp!V{M7C;;xyFZ#KBIcp6HTMorvezO-}M zBg}KhLt@i{c2}Fm&f zHm6V8IW3X&lk3yX9(}V5W3%#y0l!3EUiJqefE&hVSAuJYXH(p|13OMvrOHY|gO986 zLJIDuEj!f8pY;CFGcU=wM6f@Gi^YRsW%8~1WNMi0kQQ9i_AAgYa5{Rj?vV#yteu*C z9noLSN$M4k^0M^Vm4aN^m-dw_M_<@~UV%52)F-Yz(OoQM2vNwR4DgLpPK(kqdl}Ty zbT6v36&hNRXVT(kcrj=!o*oa<}o6!S@fXKPCB8O4MgPxmJx&K0Eu)Zm%5w>5->i-@J!v z9$O{)flDp(ys-7oL9{J@tjFC$ed6uw-z@_Q4Bx_41ul z!rt+Q^WPQ=9$gyQDv)if0g@7Dk9vbtwz3nmmj&lh{Kxk94hY7^lP%r#LOY2eR)+# zK3*hsd(p^7{3`AN?DO08LyP95xmgJb-%EGDzWzlM{oSBbuNrrRlKR1e*8IBal2J4U zj1d2$vc&--&1>{!CMl9!l5IY3c2$|enoo}@9cm5`bN6vF{`Hq&?vDSTxjWe1psfMC zNh6#PgqX^2EdlGrVZ0>no#K(QIyF|1cGKyeP|6*mlUWwNs)p-fK8&oBI6pof4H#kZ zXqsLLdXgznV$04wuHzwAGUY~3X;V1LmVg!VjqTa)=Rm2fB9w$pJlLhdl1%N%v`3WE zSsYE-wl8yWUotK6@*MLRR|FDRNjz71CiUGOl zgFu%<`Y_xY#%0t31jmRJN}!M*?%k?{cYJH`A~%ak^}Q$um_D^mmQ)sbg-tu-qjzzK z1$jB-P28U~xEZC&VI_2vcu8ZD;Udkl<>W&<-U%c@_a8|hQVjxTX&}aRa8v#R$ookaF=#2&cu7KVl2lgo zS?+67&b={h&QZ!#B@qh`Hdw1}OLMxXP^+#MM+DkhUcjK;!r^67{%Ud^6FqH*8rrNf zW)h=B?a7IU3|n}HE!4JlM}BG#7}NsvgchGX>+oaST*vMBl;>VHv5t|_ilMI}nqurY zXYiF#ud@=)|NOI9|Irr6^)v4jmcDM+rJqDTGnFaSS?RfZ5GjXG!3D$M;6`Ip!Xyi) z&!mlwS|BH^P+GzyVSNm>Mb&!KwUtZXrhWTS&QppnS|L-JGMxKtp>|0OgRM^~@k{${ z3BMSVVKm4nxMo`XA!ihSEoRz{MENMJB4I3oWfnLuzFxnX$QEgQC@Kri@Q5${;2Kkl zmlgem6pq!`c!M7G@m>KWy$>-BgeJsW-H&9-om=rRMie`6iYGgD`(AfE;2<8)2&JZqpO*Viy7(N%IMWj$dD)*1z(VHvh9y zn@3Ro%2eJ;;KH2lLc(Rf$Kf%Urr*=I{WPxW*5_Tk-yS6Swfds)6t~!O67$dOk8*#I z_SI*N@L>-Tij`y3cu9)3q`IdJrc&_YkO7msSc%_D9DkyRe!|G9h&wB3@>-mAL8gE{0pr?T zaSUp=oN)^4xcx1V{X$}X4*C_2sq->kgn(XzcHJS|cOb`d;*om<7RLp-912Ur&E1~s z>wIENrpo$Wii&d*4Y?%JKQbL}7T%*3ju_5#5$SZ=Fz;Y|+b8A{zeoRiw<7jo&&iKS zgUodsvy6L1Gz|FPE693^(cK$j3W)@yL`J!PN=-X49{9hU2yd?4N`iv#j^(p|^ietx zSXSds^7dHXI^_=;J3!bNseGo{v(2Ehn>t9#o3nI3^6+VIa2+QCk?#jeyI_=|Gy8b_ z>Zo^>dr>npCheyzo3}TXwkCpMZWg5kaO-k7V@C~J|8p(jie1mC!h z-R>uJ*TI2-Ot+bKc1B=?OM)&jobHl}YQW7;pTfBWv9;;V`Fkrf)RZ~9Vd92&isuIN z^2}97;o_xN?tK~E+IHdb5hhqUr0~zZglZWq-8Up=7jZpjpou*xDrWIP)THWlvc}|+ zm}t#!N!Blj$I)&(jog=DYJT6je}#(*FO07A%P1G4xNVFmhIjO$wzTTbD5?2;8#VL z^ZtP0lLdU7#u>U(&Qyx|;-r;|FP~jkxQM>zJDKRC7rwVCrP^Hz_q8d8W0odAR2q^J z63x{(tg_#f7p)@L#0d>#)oyri@T$F#{G-X0X^)Ai$AZs0uZ1WR4RCrakze3bp;4=Z z`F+aCfwyt+l93K5l>6A(WtIH!rRT-odAb_WQz+vTYuJ_STnjIsbh);8by#yoTzgvT2`;aU7(-UG z)0%mSjFyo7=Yyn8{&Ghf--)USu3wM#STv~@7qitrdC@kHpxkV73rxja6^Myq`jKAx zIT>7S59v#1`Alq?WxT;ykqm_y%Ec@;Ssr|Ddx|q^HOSdcKszmrp^U*|pWV@PUFc;> z%-4MQE24HSXF?9H%I%bR%u-fi6 zFE_<6M+}8lMX+0c>w6s8>0j+SXf+r2fPA*W;=6I+=~PVaOFp?}8`qZ4?YSDK72~lF zH-;U~rly9ySQ1*ms670SQ9(@D_zqEVpbbM9HWaZ7Ca4wOZ6M4M3a_>uxWz=GC z-2QO;qu9p!68uKJ?hyTnc;u_^VYdX_He8|X8BudNqc~lS?Dk|BFZJioDtscSOi~>7 z4l@tCOck$@=(!$#{B+;vQ%7N&YB9Y=A<5NLZr+e`UZc^EM(@kRG=xi8loLej>=O5d z9FxX6Pb(P46Y5&g^EO*PckF3@Z93qY`a18w7I>3KPvZbyk}{BlQ@K7$|u%!%ZxMH{)yA0X1U7`6B#H(QZ842 zc=0&U+~VrCI=7SI@LYoAn`&prw+b^01B8zE#+2@7fpD6qn*?ee8>km3lABR5;}wJm zK53g_bS<{Q$NU+DZjgQq;i!@}m2lA~fgaR~=oz3sXRf)hlP(%~F`XR!i*L0vHRb)> zm&ABvw5+$^CRK*57=R+_OM@r-$rQci1WyAB;e>sX9-;Fy>D2KLd7(M6O zLRnw!zt=flY$3(!F~zlRA{%+a&w1B?+tr8s&5XpB_DeO9z=$qER3og zv(qdaLb()?x<9xE)o+}<-JXhx_!40sT1RB=f}hKo^)>*#J=hGD3+uITjE1-YRx0Pp z#RtC1*ID8799=jC3c>^Q|Pwv#o7cHk)bJ`LJk_ojR`;DsOs&`eT7M{&eE! z^A8CLg!88-O}!?!&^6`lF>EGo+mwEGbb<0uBpmb zw|==f+ES@N4N3GPV#vjQV%j-V-N`Jb0r>vyp>1qyM7zJk2`0WSp#~znI ztYxFJBW5WWWchv%w+g*@MdFb}kKgg?p=>H6H70cn=7^P`YPx-d=A9RM3Et^Tc9AB$ z1Ku1ooSOC2Fbk9icSF}gw>N|=ajeS1uAothblP$B|ptU$d z3iibJpM8Av!!42j$wb_?reJV?+C^2D(hBC#d$wb*yOQ58IY~MN$sa^Fn2)7fhPd3# z#7zz-cQO3l|2*sRNI1@#V-XI!#Rs&@?7ch%;v){R7C}wsYhtA>i|K{n%UkV6T4FFcMJrHnr%UjvI*;cN)gV8k&ttCAY_!V-Hx8J_%1Za3&;wLX zVqPDeY}*?)Tq`V_cN1W!{A*Cf0V;)d=?`?f^3o>e&!6f)n6TDq8TJ%c#f2?@E3_|8 z*lKf)QaCge>>@At?vS*GxTdDjG!!}uK1qJ0`nOdhJ_Pp#ZiAVq+UdJ1EJbm!&q-2` z)N!xfeJxO%Ml}9`oczxAd>9yaEoL=Yr{+f(NYd=3DeMQ zs-jn7lHy+)-;ik#$)u)F9fP|@)1@d^JTIWy=nh;kJGR8jt$gR9)EVf9cZ=3DthwfS zW#!7EjEF}gr{lH6qa!RGKa9mzrlPJ(v{;y4_trl0{lJ){R@lrq?U2ZN#BjS%2ail9 zgb-^B{n59Tbw)pT_|;k8h)s_9_f4OEN+CYHdS00$dI#pCm;OB;MQpbN(@j=mcZ6zy zj&{X+1uXfsz-s^Z9!>?>10yU;Grwn3Sha=KO=>nIovj)$=9Ap&bk+5YD{{NRpE+N~ z;@?o7>3*9SYIC)yGfEuQJ|MQpYq zap8WNOG^WUV(%6bxBYo6bIVjR_8M7av37f9N+*htJun$ zs{Q}J)L%D((ZB_qeZ9OzgaksoJgY720`3bDg>RKRhIC>j({J3&%^ov&0@nOu-FkC! zB6L>#OfhO3-zO})qKLOGN7nAYskz=z+|UMD-j^D&XTEfUgLU=`lU;0kp@Menos;h& zmue5k_j^B!q>x@;RaGKsRp%PLAmGFr@h((GtRLj}E%1X+7F=|zB$L|>i@fGD)url2TovZ~85+skCz-GprM4Xtb_@$k95?)Sc=*7_ z*|>HxFf$MLFH7yN!QqTKyHtJlaaKZE)1RB^&dru0p*HP%i$nw41oy?zEWW=HzAH|J z*S8|Q%nQGRdWHGhbviWNiW*$Ok`d-Hm-IS5Dq>0^Q$`jvzM1NVvMX;!2=O{Mf8bB} zdA79*d{p?(*X!`bn#D~sEKh^%2!phgDw=qOnDd#`V`_49Czo1%;X;Px%2352BkSz} z4f4SPRaei5X93?s> z<*!|xxvQepOPtnKL3T$rRV68OvZmP$VI&bEd>HUR72kUcRu&c8jUkdbDW9OB&>N&f zNtB~l&VJXAFzP>LzD=+)pGzP&uxZ?TY8EJRd6>cbEvw||H*jrju!=m*m;K{xBI7pgnq4Sd<{}JkE-d}3?8lItXk)McpqH08f;oK&X_Zi`eF6wNjZMdYct$0^&l~) zI{v{YxUTV+Eic2k$lhO;zf2W9yXRZtd1=*;oqe==@u|zUZFn?Ndf)ra=meA(gi;2Q z&H9GZm4*mBj%@XBN+7f;Q@Ne=^&xMVV%Wsvhm|iHvl?7#rpNR-PPFcCooJ_?BDPmc zUPK)jfa&>-e^1ZBRbXgI2po*SGl5Y@V$wm&1TE)R z_viDy!g)|dp2^iaR^07Hl1g8(zP;YI{B`XnF2BU31;fOaH*p2ex3vfeCNZnT@n7V( z!0${kZ%i>?ROC!8{}uWEr^<;G!>SXX#j&t6t>(L4uMx+IxZvydeyz6;saBT+xkfE) z-o9-_@e0S#Sb_~5=v*l(N_QK}{YY_B5RcByvHXwP zweD9ti(fkKFk09#<`A_-TU-%LP&`d{p+ADl+hzSM$Cqpfo3CP2@XJ7Ze^l{3B0M0j zRQ(Rc6Fxq(`n3Eek*E!LSaKeWvz)LNrZv(p=F<-7^;eZ{_HhqErqWgWb zk}AodYehe>r6*B6P)#>(JT^aV>acBPugN@&@6XN_y|SDJj?EMrO{d*8rI39?r<8wZ z^3uJIX0$o`mM^5fvS;Bgj6FZxd*P-Rcf()5XT)mab5@tlWDx>?`zNeqi*;Hgw>Xa%pOSsHy$U9ja(06WxbjNG?sYnr>s&OZQWNNk$T##7Y_Ts zFf6`g*ttByYU*N8nu%UTrQVK8O&)!l+fW5w#cDO5fA^8AmekM%od^~N_9V`(3?uC% z)BC*QTiFRWa@H}wkM79g61=91{gC-2v(V6FnRvh)ZSdVIS_PHe6>rtNf!)X973_1? zOPZL8f%;}UGV+(_WLPSU!o>^s47}BNC}PwllwgWNT(tN%r7MGKD|H$rvPn~~Eid1o=9^3vXqbnnu z)nN^)mPwBZPcT8$Y}wQA&VgmmX#(%CWRUIfNtJ4ihg~N~5!1;~eGt|0L1wS(TIEz~ ziLGhS1ZAbX7s+DBi{4mVVo}I5tUzv)Vj8|(Y8FC6kIU5H>MTTvo}C|D{bkvjLSq;lIs%)gq^;J*MHF4bXuJVNI70`y)kq703Xd-qXLUgs1d_j=_zC4rw>o1sq9FKKLnv)6W$zx zucs_=4Px_!M8=C79&pc)_Rqu9R$)g=Po)oS39X-YLsQgK>>~v#!VCsvmwG)#WTSXx zJr=F$m(&b-XJ_XWjtYNl@I-i>{7jKz33M6`P=PcQ1U~NPM@86jWvkyM<-vn#zG9v7MPfh2DU`+7a{bwKAZp;^1az_^#jTCNw>A$~i zwE9SY-+jv2IeF`A44q!!tAr2PFH07DP9Wf^ggKzVBbh+W&EOqCxckink$`3V_j9Ebm8aB_pTgvp_(XAOM@UFO`T%#P47(d;@=YDPuwFYd$J zCt2i~F*5xSa>n!TIVtpk7$$T!6NT_dU@UN10x%avFL(Az!FA?+ zJp%Gg8Zjm93BJ(sR%R-gS z#u!qU8E3}*bm_}qS=yJcmFTfwgBQe6S^DuFJvaYu+<5b$b6&apyEL}W(z32o#vpl$ z9{eXqi${n+U$nlc^Lr71&UEk^>7v5OP{{rl>Z^kUCV>qoH7nY9$x8>JlfqOGgzJ#P zXi*mW$kgN~~8H@(M(E& zXbXYi1Hb^2B0DRDh{$1d2sFC>yW3Wvx)XQ>k5)g?% zhOhur7R`AlzaB^HeS?aE;t3QLgysF~85RP7q>v&Fj08b@|D}21YJidmWJ>`W{nzsz z@}+_CBHCRI8=UL~=rRF1J)%}0-%}yLJ02sO9E(C zNRaki%yITl!JHBWrQ|=5G>|ndOb9_?I7zxy9RS(@K*$s-K+kAlya*r$EP09t0B9bt z!iLnQGPFwz6U91HQC#f}Vn~1vMu92_snfyO5j9m{_Sg&nbvQWk3{npN^^8C_>0n$4 zpc4X>>)*iySpxte(;x{A(Vf$<$=J<#c6b^NfI!f}zn&n7h8`w>utP)zxa0JYF+GeN zHgAxDYRC-Tq(ASp>bMf)-SbB1|Ei6GqHUVtWy*+vM34h3QPDe#+cyEYMQ$kpIt48u zIt~9_d6z2yG6z63Na(^YW<0z|2hq@-Hw+8c+c-m~2pXqFg5I6_)gQ%3qz4jC0XNCzNfVl7&i<|+_E+7zD35uXFW*8qr zi4r8?Hy%Lc%rJ6P6X+fDxsrakl#fONstSUtnQmh;CJHgL0u7dcXXwJ|Auft@^&p+T z;b;xSaEgb5!h%FWB^1R96Gl*w-CXfl5&&%hYsrKJWD5?s>*(efJ~y`ycF*bE@`^C(K>*O z9NF5#5z8LFW5NYFYmt(DLJ z0p~{O*gNjWZL*Lt7tk@|@_&kOG9t=xp){^@s};H`Tzf|0*(ZDvq{cs1o>fVI#r%hH zqV6RwdC>GYXc}4M`>%cj6GKYeFiM2P-3JKEAO~(B@wA%Xh1eO5H57la1-<&@s0^?T z18m5`c~W~`0ovw<(Ia^2g9?o6AxCb&i&7&f75RfFbLv^0!vBfKstG`{KxI7VDzil? zGXEAZd3JdPnc1y38K`f?{@{$09G=z%IA8sTQ=--k=2k(7N#K06Zn&qiD*$}IfZ`+L zd<{M1g()KjVrTcFwgebDF2L;}3(gEW<%P*1^k8-~4}t+q72xGU>Wa^O8QXn42@3|2)AZCp7{9wjsGzosBhPnjK1$+^0fwUU5 zb*4?oy4g4loeIFHGqz?hAy0wxS>r7MfTMrrpAwQkQmxkWy-))XommNFfyqH90x&rQ z3G#xVy1~L(bw(&u@SFytkIj^0psEI_iaa{|moiY7X`x<07#)JU)DJs^R?s&=z}^05 zP{aZ83!M*(zLXyU?*I}BfJ6xV|IhPi4M37XUP3S)1d>S3TU91dz7Rn2?#n+#1keW| z7$u^wUU{O&iUBP5fPNsa6nr5l1@n8_%Y1M<9wIa$lWnK}5nZ1}IVZoW1Lv zb#Oy~4-ND`@*3;c_cKuH45mGrKZ=|xn!WM{Xr3>a=^{7({Kr4wI2j*);38y?;E1f2 zQJ1tZ(@MaOyd8Q zQ$h;j=lbF8)HjL;h-?BcGQ0BRzu^Zcz-f%z;^&%PDh^ORqxfGDIV8w;j!HS2GUUuZ zbpHpHBh7DkMF|)OLQU#7wT04vSQ5avN0#3R?QhVB5-?^2sIk!Pgxdh)+07GVr_#iD z2Fea?GM@8_km9ar8tYF08x2-4$Rqa!q$CNGM<7iI=eJ1!NY9)fGSXA_Go9EK57S-(1D>fy1i*)4yD)vtiHw zyC{?&l^kKO5Uolug!{Y&Xqf&Z%XuM4SO!K1@r$5hLDJIazH~DXZTIX_)xm$vJc`Kw z;7R}B7p#chiwC%`g29X|fCBL|cy^FV>u;&znS~T<1N`)$!;qz#2norYOZ69Qu4ot# z?eZU@`DM?L(n3!GX2j4N0{?>9%l-ZpOBTk27_b=&MnjsAuq+s`3rfGm@KQ=1%Krcu5gk7#9`vXMv`!CNN7ktw=tTB>OwyCrw(0;rnt_~X-8Vgaa$_JK53o7G0r38LUO?q?FmXgbnG@ry(*f-ODYO4I=QK8eUdq9! zAUgSTdsnNfQLqb;WCHq-Mc8NpmCJ+eiZzpSkt0y+(x#T#0#XTp$dS!IuGty9Bw})+ z`LI_E`YI2jKx?){g$689g%JA1jM#(GA2VzL#NmO7F3%tG!Cw{^5wJ{utZ@~$Lo+L& z%ocErY*)POA$rBXjn!EPW+{TrtR09>5vG7>s-o}icBVA1n_VIJjgaM!5vCdf-yr~axgkXe`~n}-#wed z&48{%=B@xrRf0()G-}z3X>lDIRssqm;SDJ$1N-Rc{kLN0!`uQVfQ%@?VxJXBM%N&D zWta$pJN|oUGI@X^QUHiNupb7ZLKVTNtk6W@IaWjkxr7_JECBco$-i|mHyBYt0Af%% zH=7>jc4KXzWjoLSvdg5o4n0%>AKKKf|4lJljLN`$z;`fEITj>}MW8$tm@t9>IukLo zv&AJUP+sKzppQa@grm;;0|EPY24`f?Ivaz4WkIOP@4f@+bfGj=(08Oa5oPpext&=N zc>c~+h^*iXx6WZX)nE(=*uS&iA=8JFfeI04{7v8A8Kscvqs&CWvYchg!~J92{>}h| ztjiQRP?S2*WdY%HCHgxp1hT#jL2&hRpNmM203?03DS~WS$O@s`8o*m9g7gS~>^iLm zFm9J0|1L7ufKem#_3umo$l@V^QZ&xDFZ<7`#yvZ$$^_wPo|~e-L(3yi;-nxYO_(CW zUi=-vnHNbf)XO1dO&AL#%yqt^Ig7gseFWJC&`hgPA*U+T-_v2lh-o_u$O*xYi6I#MJA4`w63{-ht#!Uw|2ys#vLUvC6t!WJ2wD&U zZxFP=ezikN+F+i4y$Rh+?4>|*7g&cKY zcnH|P!vG);ZSNse2tI`Rd#@h>`}fUdWIae3M!>S3MGT-skdC-83km50F$#<$3MtO6 zHM1iSg@mR(Ck8`U5tuGy(@r$;2NoLww`p;q0o`*_|GuM%tOX%cs8GZVD)ZT0TROxz zJ-hq`Dd_>}_{<>6`2H+O{=PkhY;eM$mwGS>go9qw1BwV=fGYHW0b*~n`UbF|wXdN#vXW|MFS! z=vgLUf_HX&? delta 109544 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 IaABnRAI|*Oq5uE@ diff --git a/e2e/search/search-filters.e2e.ts b/e2e/search/search-filters.e2e.ts index c17367d818..c299d87a5c 100644 --- a/e2e/search/search-filters.e2e.ts +++ b/e2e/search/search-filters.e2e.ts @@ -20,7 +20,8 @@ import { SearchFiltersPage } from './pages/search-filters.page'; import { SearchResultsPage } from './pages/search-results.page'; import { FileModel } from '../models/ACS/file.model'; import { NavigationBarPage } from '../core/pages/navigation-bar.page'; -import { createApiService, +import { + createApiService, BrowserActions, DocumentListPage, LocalStorageUtil, @@ -33,7 +34,7 @@ import { createApiService, } from '@alfresco/adf-testing'; import { browser } from 'protractor'; import { SearchConfiguration } from './search.config'; -import moment from 'moment-es6'; +import * as moment from 'moment'; describe('Search Filters', () => { @@ -104,6 +105,9 @@ describe('Search Filters', () => { await browser.sleep(browser.params.testConfig.timeouts.index_search); // wait search index previous file/folder uploaded + }); + + beforeEach(async () => { jsonFile = SearchConfiguration.getConfiguration(); }); @@ -118,6 +122,37 @@ describe('Search Filters', () => { await navigationBarPage.clickLogoutButton(); }); + it('[C291980] Should group search facets under specified labels', async () => { + const currentYear = moment().year(); + + jsonFile.facetQueries.queries[0] = { + 'query': `created:${currentYear}`, + 'label': 'SEARCH.FACET_QUERIES.CREATED_THIS_YEAR' + }; + jsonFile.facetQueries.queries[1] = { + 'query': `content.mimetype:text/html`, + 'label': 'SEARCH.FACET_QUERIES.MIMETYPE', + 'group': 'Type facet queries' + }; + jsonFile.facetQueries.queries[2] = { + 'query': `content.size:[0 TO 10240]`, + 'label': 'SEARCH.FACET_QUERIES.XTRASMALL', + 'group': 'Size facet queries' + }; + + + await LocalStorageUtil.setConfigField('search', JSON.stringify(jsonFile)); + + await searchBarPage.clickOnSearchIcon(); + await searchBarPage.enterTextAndPressEnter('*'); + await searchResults.dataTable.waitTillContentLoaded(); + + await searchFiltersPage.checkDefaultFacetQueryGroupIsDisplayed(); + await searchFiltersPage.checkTypeFacetQueryGroupIsDisplayed(); + + await searchFiltersPage.checkSizeFacetQueryGroupIsDisplayed(); + }); + it('[C286298] Should be able to cancel a filter using "x" button from the toolbar', async () => { await searchBarPage.checkSearchIconIsVisible(); await searchBarPage.clickOnSearchIcon(); @@ -176,25 +211,6 @@ describe('Search Filters', () => { }); }); - it('[C291980] Should group search facets under specified labels', async () => { - const currentYear = moment().year(); - - jsonFile.facetQueries.queries[0] = {'query': `created:${currentYear}`, 'label': 'SEARCH.FACET_QUERIES.CREATED_THIS_YEAR'}; - jsonFile.facetQueries.queries[1] = {'query': `content.mimetype:text/html`, 'label': 'SEARCH.FACET_QUERIES.MIMETYPE', 'group': 'Type facet queries'}; - jsonFile.facetQueries.queries[2] = {'query': `content.size:[0 TO 10240]`, 'label': 'SEARCH.FACET_QUERIES.XTRASMALL', 'group': 'Size facet queries'}; - - await LocalStorageUtil.setConfigField('search', JSON.stringify(jsonFile)); - - await searchBarPage.clickOnSearchIcon(); - await searchBarPage.enterTextAndPressEnter('*'); - await searchResults.dataTable.waitTillContentLoaded(); - - await searchFiltersPage.checkDefaultFacetQueryGroupIsDisplayed(); - await searchFiltersPage.checkTypeFacetQueryGroupIsDisplayed(); - - await searchFiltersPage.checkSizeFacetQueryGroupIsDisplayed(); - }); - it('[C297509] Should display search intervals under specified labels from config', async () => { await searchBarPage.clickOnSearchIcon(); await searchBarPage.enterTextAndPressEnter('*'); diff --git a/e2e/test.config.js b/e2e/test.config.js index e67e524f90..72292dd3c6 100644 --- a/e2e/test.config.js +++ b/e2e/test.config.js @@ -7,7 +7,7 @@ require('dotenv').config({path: process.env.ENV_FILE}); const HOST = process.env.URL_HOST_ADF; -const LOG = process.env.LOG; +const LOG = process.env.E2E_LOG_LEVEL; const HOST_ECM = process.env.PROXY_HOST_ECM || HOST || 'ecm'; const HOST_BPM = process.env.PROXY_HOST_BPM || HOST || 'bpm'; diff --git a/e2e/util/resources.js b/e2e/util/resources.js index dfff18362d..32d8400439 100644 --- a/e2e/util/resources.js +++ b/e2e/util/resources.js @@ -22,7 +22,7 @@ * @class util.Resources */ var path = require('path'); -const ACTIVITI_CLOUD_APPS = require('../../lib/dist/testing/src'); +const ACTIVITI_CLOUD_APPS = require('../../lib/dist/testing'); const RESOURCES = { ...ACTIVITI_CLOUD_APPS, diff --git a/lib/cli/package-lock.json b/lib/cli/package-lock.json deleted file mode 100644 index e7a0944157..0000000000 --- a/lib/cli/package-lock.json +++ /dev/null @@ -1,1924 +0,0 @@ -{ - "name": "@alfresco/adf-cli", - "version": "4.11.0", - "lockfileVersion": 1, - "requires": true, - "dependencies": { - "@alfresco/js-api": { - "version": "4.12.0-236", - "resolved": "https://registry.npmjs.org/@alfresco/js-api/-/js-api-4.12.0-236.tgz", - "integrity": "sha512-9NVFHCTiwsBT02dGjjjoI1pNFyv9U+1K67S2v+Nksy2qcSYGvfTs6l2KmQOQNeqMVIh2AnETvmuC2oaNogQ0/w==", - "requires": { - "event-emitter": "^0.3.5", - "minimatch": "5.0.1", - "superagent": "^6.0.0" - }, - "dependencies": { - "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "requires": { - "balanced-match": "^1.0.0" - } - }, - "minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "requires": { - "brace-expansion": "^2.0.1" - } - } - } - }, - "@types/ejs": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@types/ejs/-/ejs-3.1.0.tgz", - "integrity": "sha512-DCg+Ka+uDQ31lJ/UtEXVlaeV3d6t81gifaVWKJy4MYVVgvJttyX/viREy+If7fz+tK/gVxTGMtyrFPnm4gjrVA==", - "dev": true - }, - "@types/glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-SEYeGAIQIQX8NN6LDKprLjbrd5dARM5EXsd8GI/A5l0apYI1fGMWgPHSe4ZKL4eozlAyI+doUE9XbYS4xCkQ1w==", - "dev": true, - "requires": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "@types/minimatch": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", - "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", - "dev": true - }, - "@types/node": { - "version": "14.14.20", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.14.20.tgz", - "integrity": "sha512-Y93R97Ouif9JEOWPIUyU+eyIdyRqQR0I8Ez1dzku4hDx34NWh4HbtIc3WNzwB1Y9ULvNGeu5B8h8bVL5cAk4/A==", - "dev": true - }, - "@types/shelljs": { - "version": "0.8.8", - "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.8.tgz", - "integrity": "sha512-lD3LWdg6j8r0VRBFahJVaxoW0SIcswxKaFUrmKl33RJVeeoNYQAz4uqCJ5Z6v4oIBOsC5GozX+I5SorIKiTcQA==", - "dev": true, - "requires": { - "@types/glob": "*", - "@types/node": "*" - } - }, - "JSONStream": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", - "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", - "requires": { - "jsonparse": "^1.2.0", - "through": ">=2.2.7 <3" - } - }, - "abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" - }, - "agent-base": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.3.0.tgz", - "integrity": "sha512-salcGninV0nPrwpGNn4VTXBb1SOuXQBiqbrNXoeizJsHrsL6ERFM2Ne3JUSBWRE6aeNJI2ROP/WEEIDUiDe3cg==", - "requires": { - "es6-promisify": "^5.0.0" - } - }, - "agentkeepalive": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/agentkeepalive/-/agentkeepalive-3.5.2.tgz", - "integrity": "sha512-e0L/HNe6qkQ7H19kTlRRqUibEAwDK5AFk6y3PtMsuut2VAH6+Q4xZml1tNDJD7kSAyqmbG/K08K5WEJYtUrSlQ==", - "requires": { - "humanize-ms": "^1.2.1" - } - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "requires": { - "color-convert": "^1.9.0" - } - }, - "aproba": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", - "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" - }, - "array-find-index": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", - "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=" - }, - "asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" - }, - "asn1": { - "version": "0.2.4", - "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz", - "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==", - "requires": { - "safer-buffer": "~2.1.0" - } - }, - "assert-plus": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", - "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" - }, - "asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" - }, - "aws-sign2": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", - "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=" - }, - "aws4": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz", - "integrity": "sha512-xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==" - }, - "balanced-match": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", - "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" - }, - "bcrypt-pbkdf": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz", - "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=", - "requires": { - "tweetnacl": "^0.14.3" - } - }, - "bluebird": { - "version": "3.7.2", - "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.7.2.tgz", - "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" - }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "buffer-from": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", - "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" - }, - "builtins": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz", - "integrity": "sha1-y5T662HIaWRR2zZTThQi+U8K7og=" - }, - "cacache": { - "version": "12.0.4", - "resolved": "https://registry.npmjs.org/cacache/-/cacache-12.0.4.tgz", - "integrity": "sha512-a0tMB40oefvuInr4Cwb3GerbL9xTj1D5yg0T5xrjGCGyfvbxseIXX7BAO/u/hIXdafzOI5JC3wDwHyf24buOAQ==", - "requires": { - "bluebird": "^3.5.5", - "chownr": "^1.1.1", - "figgy-pudding": "^3.5.1", - "glob": "^7.1.4", - "graceful-fs": "^4.1.15", - "infer-owner": "^1.0.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "mkdirp": "^0.5.1", - "move-concurrently": "^1.0.1", - "promise-inflight": "^1.0.1", - "rimraf": "^2.6.3", - "ssri": "^6.0.1", - "unique-filename": "^1.1.1", - "y18n": "^4.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } - } - }, - "call-bind": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.2.tgz", - "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", - "requires": { - "function-bind": "^1.1.1", - "get-intrinsic": "^1.0.2" - } - }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=" - }, - "chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "requires": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - } - }, - "chownr": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" - }, - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" - }, - "combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "requires": { - "delayed-stream": "~1.0.0" - } - }, - "commander": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", - "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==" - }, - "component-emitter": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", - "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" - }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" - }, - "concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", - "requires": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^2.2.2", - "typedarray": "^0.0.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "cookiejar": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.3.tgz", - "integrity": "sha512-JxbCBUdrfr6AQjOXrxoTvAMJO4HBTUIlBzslcJPAz+/KT8yk53fXun51u+RenNYvad/+Vc2DIz5o9UxlCDymFQ==" - }, - "copy-concurrently": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz", - "integrity": "sha512-f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==", - "requires": { - "aproba": "^1.1.1", - "fs-write-stream-atomic": "^1.0.8", - "iferr": "^0.1.5", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.0" - } - }, - "core-util-is": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", - "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" - }, - "cyclist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/cyclist/-/cyclist-1.0.1.tgz", - "integrity": "sha1-WW6WmP0MgOEgOMK4LW6xs1tiJNk=" - }, - "d": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", - "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", - "requires": { - "es5-ext": "^0.10.50", - "type": "^1.0.1" - } - }, - "dashdash": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", - "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "requires": { - "ms": "2.1.2" - } - }, - "debuglog": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/debuglog/-/debuglog-1.0.1.tgz", - "integrity": "sha1-qiT/uaw9+aI1GDfPstJ5NgzXhJI=" - }, - "delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" - }, - "dezalgo": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.3.tgz", - "integrity": "sha1-f3Qt4Gb8dIvI24IFad3c5Jvw1FY=", - "requires": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "duplexify": { - "version": "3.7.1", - "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", - "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", - "requires": { - "end-of-stream": "^1.0.0", - "inherits": "^2.0.1", - "readable-stream": "^2.0.0", - "stream-shift": "^1.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "ecc-jsbn": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz", - "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=", - "requires": { - "jsbn": "~0.1.0", - "safer-buffer": "^2.1.0" - } - }, - "ejs": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/ejs/-/ejs-2.7.4.tgz", - "integrity": "sha512-7vmuyh5+kuUyJKePhQfRQBhXV5Ce+RnaeeQArKu1EAMpL3WbgMt5WG6uQZpEVvYSSsxMXRKOewtDk9RaTKXRlA==" - }, - "encoding": { - "version": "0.1.13", - "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", - "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "requires": { - "iconv-lite": "^0.6.2" - } - }, - "end-of-stream": { - "version": "1.4.4", - "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", - "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", - "requires": { - "once": "^1.4.0" - } - }, - "err-code": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/err-code/-/err-code-1.1.2.tgz", - "integrity": "sha1-BuARbTAo9q70gGhJ6w6mp0iuaWA=" - }, - "es5-ext": { - "version": "0.10.62", - "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.62.tgz", - "integrity": "sha512-BHLqn0klhEpnOKSrzn/Xsz2UIW8j+cGmo9JLzr8BiUapV8hPL9+FliFqjwr9ngW7jWdnxv6eO+/LqyhJVqgrjA==", - "requires": { - "es6-iterator": "^2.0.3", - "es6-symbol": "^3.1.3", - "next-tick": "^1.1.0" - } - }, - "es6-iterator": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", - "integrity": "sha512-zw4SRzoUkd+cl+ZoE15A9o1oQd920Bb0iOJMQkQhl3jNc03YqVjAhG7scf9C5KWRU/R13Orf588uCC6525o02g==", - "requires": { - "d": "1", - "es5-ext": "^0.10.35", - "es6-symbol": "^3.1.1" - } - }, - "es6-promise": { - "version": "4.2.8", - "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.8.tgz", - "integrity": "sha512-HJDGx5daxeIvxdBxvG2cb9g4tEvwIk3i8+nhX0yGrYmZUzbkdg8QbDevheDB8gd0//uPj4c1EQua8Q+MViT0/w==" - }, - "es6-promisify": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/es6-promisify/-/es6-promisify-5.0.0.tgz", - "integrity": "sha1-UQnWLz5W6pZ8S2NQWu8IKRyKUgM=", - "requires": { - "es6-promise": "^4.0.3" - } - }, - "es6-symbol": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", - "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", - "requires": { - "d": "^1.0.1", - "ext": "^1.1.2" - } - }, - "escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" - }, - "event-emitter": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/event-emitter/-/event-emitter-0.3.5.tgz", - "integrity": "sha512-D9rRn9y7kLPnJ+hMq7S/nhvoKwwvVJahBi2BPmx3bvbsEdK3W9ii8cBSGjP+72/LnM4n6fo3+dkCX5FeTQruXA==", - "requires": { - "d": "1", - "es5-ext": "~0.10.14" - } - }, - "ext": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/ext/-/ext-1.6.0.tgz", - "integrity": "sha512-sdBImtzkq2HpkdRLtlLWDa6w4DX22ijZLKx8BMPUuKe1c5lbN6xwQDQCxSfxBQnHZ13ls/FH0MQZx/q/gr6FQg==", - "requires": { - "type": "^2.5.0" - }, - "dependencies": { - "type": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/type/-/type-2.6.1.tgz", - "integrity": "sha512-OvgH5rB0XM+iDZGQ1Eg/o7IZn0XYJFVrN/9FQ4OWIYILyJJgVP2s1hLTOFn6UOZoDUI/HctGa0PFlE2n2HW3NQ==" - } - } - }, - "extend": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", - "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" - }, - "extsprintf": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", - "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=" - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==" - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==" - }, - "fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==" - }, - "figgy-pudding": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/figgy-pudding/-/figgy-pudding-3.5.2.tgz", - "integrity": "sha512-0btnI/H8f2pavGMN8w40mlSKOfTK2SVJmBfBeVIj3kNw0swwgzyRq0d5TJVOwodFmtvpPeWPN/MCcfuWF0Ezbw==" - }, - "flush-write-stream": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.1.1.tgz", - "integrity": "sha512-3Z4XhFZ3992uIq0XOqb9AreonueSYphE6oYbpt5+3u06JWklbsPkNv3ZKkP9Bz/r+1MWCaMoSQ28P85+1Yc77w==", - "requires": { - "inherits": "^2.0.3", - "readable-stream": "^2.3.6" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "forever-agent": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", - "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" - }, - "form-data": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-3.0.1.tgz", - "integrity": "sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "mime-types": "^2.1.12" - } - }, - "formidable": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.6.tgz", - "integrity": "sha512-KcpbcpuLNOwrEjnbpMC0gS+X8ciDoZE1kkqzat4a8vrprf+s9pKNQ/QIwWfbfs4ltgmFl3MD177SNTkve3BwGQ==" - }, - "from2": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz", - "integrity": "sha1-i/tVAr3kpNNs/e6gB/zKIdfjgq8=", - "requires": { - "inherits": "^2.0.1", - "readable-stream": "^2.0.0" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "fs-write-stream-atomic": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz", - "integrity": "sha1-tH31NJPvkR33VzHnCp3tAYnbQMk=", - "requires": { - "graceful-fs": "^4.1.2", - "iferr": "^0.1.5", - "imurmurhash": "^0.1.4", - "readable-stream": "1 || 2" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" - }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" - }, - "get-intrinsic": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.1.2.tgz", - "integrity": "sha512-Jfm3OyCxHh9DJyc28qGk+JmfkpO41A4XkneDSujN9MDXrm4oDKdHvndhZ2dN94+ERNfkYJWDclW6k2L/ZGHjXA==", - "requires": { - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.3" - } - }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "requires": { - "assert-plus": "^1.0.0" - } - }, - "glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "graceful-fs": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.4.tgz", - "integrity": "sha512-WjKPNJF79dtJAVniUlGGWHYGz2jWxT6VhN/4m1NdkbZ2nOsEF+cI1Edgql5zCRhs/VsQYRvrXctxktVXZUkixw==" - }, - "har-schema": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", - "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=" - }, - "har-validator": { - "version": "5.1.5", - "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz", - "integrity": "sha512-nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==", - "requires": { - "ajv": "^6.12.3", - "har-schema": "^2.0.0" - } - }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "requires": { - "function-bind": "^1.1.1" - } - }, - "has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=" - }, - "has-symbols": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.3.tgz", - "integrity": "sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==" - }, - "hosted-git-info": { - "version": "2.8.9", - "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.9.tgz", - "integrity": "sha512-mxIDAb9Lsm6DoOJ7xH+5+X4y1LU/4Hi50L9C5sIswK3JzULS4bwk1FvjdBgvYR4bzT4tuUQiC15FE2f5HbLvYw==" - }, - "http-cache-semantics": { - "version": "3.8.1", - "resolved": "https://registry.npmjs.org/http-cache-semantics/-/http-cache-semantics-3.8.1.tgz", - "integrity": "sha512-5ai2iksyV8ZXmnZhHH4rWPoxxistEexSi5936zIQ1bnNTW5VnA85B6P/VpXiRM017IgRvb2kKo1a//y+0wSp3w==" - }, - "http-proxy-agent": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-2.1.0.tgz", - "integrity": "sha512-qwHbBLV7WviBl0rQsOzH6o5lwyOIvwp/BdFnvVxXORldu5TmjFfjzBcWUWS5kWAZhmv+JtiDhSuQCp4sBfbIgg==", - "requires": { - "agent-base": "4", - "debug": "3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", - "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", - "requires": { - "ms": "2.0.0" - } - }, - "ms": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", - "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" - } - } - }, - "http-signature": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", - "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", - "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" - } - }, - "https-proxy-agent": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-2.2.4.tgz", - "integrity": "sha512-OmvfoQ53WLjtA9HeYP9RNrWMJzzAz1JGaSFr1nijg0PVR1JaD/xbJq1mdEIIlxGpXp9eSe/O2LgU9DJmTPd0Eg==", - "requires": { - "agent-base": "^4.3.0", - "debug": "^3.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - } - } - }, - "humanize-ms": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", - "integrity": "sha1-xG4xWaKT9riW2ikxbYtv6Lt5u+0=", - "requires": { - "ms": "^2.0.0" - } - }, - "iconv-lite": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.2.tgz", - "integrity": "sha512-2y91h5OpQlolefMPmUlivelittSWy0rP+oYVpn6A7GwVHNE8AWzoYOBNmlwks3LobaJxgHCYZAnyNo2GgpNRNQ==", - "requires": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - } - }, - "iferr": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz", - "integrity": "sha1-xg7taebY/bazEEofy8ocGS3FtQE=" - }, - "imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=" - }, - "infer-owner": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/infer-owner/-/infer-owner-1.0.4.tgz", - "integrity": "sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==" - }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" - }, - "interpret": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.4.0.tgz", - "integrity": "sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==" - }, - "ip": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/ip/-/ip-1.1.5.tgz", - "integrity": "sha1-vd7XARQpCCjAoDnnLvJfWq7ENUo=" - }, - "is-core-module": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz", - "integrity": "sha512-XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==", - "requires": { - "has": "^1.0.3" - } - }, - "is-typedarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", - "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" - }, - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" - }, - "isstream": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", - "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" - }, - "jsbn": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", - "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=" - }, - "json-parse-better-errors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz", - "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==" - }, - "json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==" - }, - "json-schema": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", - "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" - }, - "json-stringify-safe": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", - "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" - }, - "jsonparse": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" - }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" - } - }, - "license-checker": { - "version": "25.0.1", - "resolved": "https://registry.npmjs.org/license-checker/-/license-checker-25.0.1.tgz", - "integrity": "sha512-mET5AIwl7MR2IAKYYoVBBpV0OnkKQ1xGj2IMMeEFIs42QAkEVjRtFZGWmQ28WeU7MP779iAgOaOy93Mn44mn6g==", - "requires": { - "chalk": "^2.4.1", - "debug": "^3.1.0", - "mkdirp": "^0.5.1", - "nopt": "^4.0.1", - "read-installed": "~4.0.3", - "semver": "^5.5.0", - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0", - "spdx-satisfies": "^4.0.0", - "treeify": "^1.1.0" - }, - "dependencies": { - "debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "requires": { - "ms": "^2.1.1" - } - }, - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "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==", - "requires": { - "yallist": "^4.0.0" - } - }, - "make-fetch-happen": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/make-fetch-happen/-/make-fetch-happen-5.0.2.tgz", - "integrity": "sha512-07JHC0r1ykIoruKO8ifMXu+xEU8qOXDFETylktdug6vJDACnP+HKevOu3PXyNPzFyTSlz8vrBYlBO1JZRe8Cag==", - "requires": { - "agentkeepalive": "^3.4.1", - "cacache": "^12.0.0", - "http-cache-semantics": "^3.8.1", - "http-proxy-agent": "^2.1.0", - "https-proxy-agent": "^2.2.3", - "lru-cache": "^5.1.1", - "mississippi": "^3.0.0", - "node-fetch-npm": "^2.0.2", - "promise-retry": "^1.1.1", - "socks-proxy-agent": "^4.0.0", - "ssri": "^6.0.0" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } - } - }, - "methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==" - }, - "mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==" - }, - "mime-db": { - "version": "1.45.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.45.0.tgz", - "integrity": "sha512-CkqLUxUk15hofLoLyljJSrukZi8mAtgd+yE5uO4tqRZsdsAJKv0O+rFMhVDRJgozy+yG6md5KwuXhD4ocIoP+w==" - }, - "mime-types": { - "version": "2.1.28", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.28.tgz", - "integrity": "sha512-0TO2yJ5YHYr7M2zzT7gDU1tbwHxEUWBCLt0lscSNpcdAfFyJOVEpRYNS7EXVcTLNj/25QO8gulHC5JtTzSE2UQ==", - "requires": { - "mime-db": "1.45.0" - } - }, - "minimatch": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", - "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", - "requires": { - "brace-expansion": "^1.1.7" - } - }, - "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==" - }, - "mississippi": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/mississippi/-/mississippi-3.0.0.tgz", - "integrity": "sha512-x471SsVjUtBRtcvd4BzKE9kFC+/2TeWgKCgw0bZcw1b9l2X3QX5vCWgF+KaZaYm87Ss//rHnWryupDrgLvmSkA==", - "requires": { - "concat-stream": "^1.5.0", - "duplexify": "^3.4.2", - "end-of-stream": "^1.1.0", - "flush-write-stream": "^1.0.0", - "from2": "^2.1.0", - "parallel-transform": "^1.1.0", - "pump": "^3.0.0", - "pumpify": "^1.3.3", - "stream-each": "^1.1.0", - "through2": "^2.0.0" - } - }, - "mkdirp": { - "version": "0.5.5", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", - "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", - "requires": { - "minimist": "^1.2.5" - } - }, - "move-concurrently": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz", - "integrity": "sha1-viwAX9oy4LKa8fBdfEszIUxwH5I=", - "requires": { - "aproba": "^1.1.1", - "copy-concurrently": "^1.0.0", - "fs-write-stream-atomic": "^1.0.8", - "mkdirp": "^0.5.1", - "rimraf": "^2.5.4", - "run-queue": "^1.0.3" - } - }, - "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" - }, - "next-tick": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.1.0.tgz", - "integrity": "sha512-CXdUiJembsNjuToQvxayPZF9Vqht7hewsvy2sOWafLvi2awflj9mOC6bHIg50orX8IJvWKY9wYQ/zB2kogPslQ==" - }, - "node-fetch-npm": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/node-fetch-npm/-/node-fetch-npm-2.0.4.tgz", - "integrity": "sha512-iOuIQDWDyjhv9qSDrj9aq/klt6F9z1p2otB3AV7v3zBDcL/x+OfGsvGQZZCcMZbUf4Ujw1xGNQkjvGnVT22cKg==", - "requires": { - "encoding": "^0.1.11", - "json-parse-better-errors": "^1.0.0", - "safe-buffer": "^5.1.1" - } - }, - "nopt": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz", - "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==", - "requires": { - "abbrev": "1", - "osenv": "^0.1.4" - } - }, - "normalize-package-data": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", - "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", - "requires": { - "hosted-git-info": "^2.1.4", - "resolve": "^1.10.0", - "semver": "2 || 3 || 4 || 5", - "validate-npm-package-license": "^3.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "npm-normalize-package-bin": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz", - "integrity": "sha512-EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==" - }, - "npm-package-arg": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.1.tgz", - "integrity": "sha512-qBpssaL3IOZWi5vEKUKW0cO7kzLeT+EQO9W8RsLOZf76KF9E/K9+wH0C7t06HXPpaH8WH5xF1MExLuCwbTqRUg==", - "requires": { - "hosted-git-info": "^2.7.1", - "osenv": "^0.1.5", - "semver": "^5.6.0", - "validate-npm-package-name": "^3.0.0" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "npm-registry-fetch": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/npm-registry-fetch/-/npm-registry-fetch-4.0.7.tgz", - "integrity": "sha512-cny9v0+Mq6Tjz+e0erFAB+RYJ/AVGzkjnISiobqP8OWj9c9FLoZZu8/SPSKJWE17F1tk4018wfjV+ZbIbqC7fQ==", - "requires": { - "JSONStream": "^1.3.4", - "bluebird": "^3.5.1", - "figgy-pudding": "^3.4.1", - "lru-cache": "^5.1.1", - "make-fetch-happen": "^5.0.0", - "npm-package-arg": "^6.1.0", - "safe-buffer": "^5.2.0" - }, - "dependencies": { - "lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "requires": { - "yallist": "^3.0.2" - } - }, - "yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" - } - } - }, - "oauth-sign": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz", - "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==" - }, - "object-inspect": { - "version": "1.12.2", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.12.2.tgz", - "integrity": "sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==" - }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", - "requires": { - "wrappy": "1" - } - }, - "os-homedir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", - "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" - }, - "os-tmpdir": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", - "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" - }, - "osenv": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", - "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", - "requires": { - "os-homedir": "^1.0.0", - "os-tmpdir": "^1.0.0" - } - }, - "parallel-transform": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.2.0.tgz", - "integrity": "sha512-P2vSmIu38uIlvdcU7fDkyrxj33gTUy/ABO5ZUbGowxNCopBq/OoD42bP4UmMrJoPyk4Uqf0mu3mtWBhHCZD8yg==", - "requires": { - "cyclist": "^1.0.1", - "inherits": "^2.0.3", - "readable-stream": "^2.1.5" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" - }, - "path-parse": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", - "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==" - }, - "performance-now": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", - "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=" - }, - "process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" - }, - "promise-inflight": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz", - "integrity": "sha1-mEcocL8igTL8vdhoEputEsPAKeM=" - }, - "promise-retry": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/promise-retry/-/promise-retry-1.1.1.tgz", - "integrity": "sha1-ZznpaOMFHaIM5kl/srUPaRHfPW0=", - "requires": { - "err-code": "^1.0.0", - "retry": "^0.10.0" - } - }, - "psl": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", - "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" - }, - "pump": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", - "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - }, - "pumpify": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", - "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", - "requires": { - "duplexify": "^3.6.0", - "inherits": "^2.0.3", - "pump": "^2.0.0" - }, - "dependencies": { - "pump": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", - "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", - "requires": { - "end-of-stream": "^1.1.0", - "once": "^1.3.1" - } - } - } - }, - "punycode": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" - }, - "qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", - "requires": { - "side-channel": "^1.0.4" - } - }, - "read-installed": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/read-installed/-/read-installed-4.0.3.tgz", - "integrity": "sha1-/5uLZ/GH0eTCm5/rMfayI6zRkGc=", - "requires": { - "debuglog": "^1.0.1", - "graceful-fs": "^4.1.2", - "read-package-json": "^2.0.0", - "readdir-scoped-modules": "^1.0.0", - "semver": "2 || 3 || 4 || 5", - "slide": "~1.1.3", - "util-extend": "^1.0.1" - }, - "dependencies": { - "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==" - } - } - }, - "read-package-json": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/read-package-json/-/read-package-json-2.1.2.tgz", - "integrity": "sha512-D1KmuLQr6ZSJS0tW8hf3WGpRlwszJOXZ3E8Yd/DNRaM5d+1wVRZdHlpGBLAuovjr28LbWvjpWkBHMxpRGGjzNA==", - "requires": { - "glob": "^7.1.1", - "json-parse-even-better-errors": "^2.3.0", - "normalize-package-data": "^2.0.0", - "npm-normalize-package-bin": "^1.0.0" - } - }, - "readable-stream": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", - "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", - "requires": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - } - }, - "readdir-scoped-modules": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/readdir-scoped-modules/-/readdir-scoped-modules-1.1.0.tgz", - "integrity": "sha512-asaikDeqAQg7JifRsZn1NJZXo9E+VwlyCfbkZhwyISinqk5zNS6266HS5kah6P0SaQKGF6SkNnZVHUzHFYxYDw==", - "requires": { - "debuglog": "^1.0.1", - "dezalgo": "^1.0.0", - "graceful-fs": "^4.1.2", - "once": "^1.3.0" - } - }, - "rechoir": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", - "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", - "requires": { - "resolve": "^1.1.6" - } - }, - "request": { - "version": "2.88.2", - "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz", - "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==", - "requires": { - "aws-sign2": "~0.7.0", - "aws4": "^1.8.0", - "caseless": "~0.12.0", - "combined-stream": "~1.0.6", - "extend": "~3.0.2", - "forever-agent": "~0.6.1", - "form-data": "~2.3.2", - "har-validator": "~5.1.3", - "http-signature": "~1.2.0", - "is-typedarray": "~1.0.0", - "isstream": "~0.1.2", - "json-stringify-safe": "~5.0.1", - "mime-types": "~2.1.19", - "oauth-sign": "~0.9.0", - "performance-now": "^2.1.0", - "qs": "~6.5.2", - "safe-buffer": "^5.1.2", - "tough-cookie": "~2.5.0", - "tunnel-agent": "^0.6.0", - "uuid": "^3.3.2" - }, - "dependencies": { - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, - "qs": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz", - "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==" - } - } - }, - "resolve": { - "version": "1.19.0", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.19.0.tgz", - "integrity": "sha512-rArEXAgsBG4UgRGcynxWIWKFvh/XZCcS8UJdHhwy91zwAvCZIbcs+vAbflgBnNjYMs/i/i+/Ux6IZhML1yPvxg==", - "requires": { - "is-core-module": "^2.1.0", - "path-parse": "^1.0.6" - } - }, - "retry": { - "version": "0.10.1", - "resolved": "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz", - "integrity": "sha1-52OI0heZLCUnUCQdPTlW/tmNj/Q=" - }, - "rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "requires": { - "glob": "^7.1.3" - } - }, - "run-queue": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz", - "integrity": "sha1-6Eg5bwV9Ij8kOGkkYY4laUFh7Ec=", - "requires": { - "aproba": "^1.1.1" - } - }, - "rxjs": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.6.3.tgz", - "integrity": "sha512-trsQc+xYYXZ3urjOiJOuCOa5N3jAZ3eiSpQB5hIT8zGlL2QfnHLJ2r7GMkBGuIausdJN1OneaI6gQlsqNHHmZQ==", - "requires": { - "tslib": "^1.9.0" - } - }, - "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==" - }, - "safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" - }, - "semver": { - "version": "7.3.7", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.7.tgz", - "integrity": "sha512-QlYTucUYOews+WeEujDoEGziz4K6c47V/Bd+LjSSYcA94p+DmINdf7ncaUinThfvZyu13lN9OY1XDxt8C0Tw0g==", - "requires": { - "lru-cache": "^6.0.0" - } - }, - "shelljs": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.4.tgz", - "integrity": "sha512-7gk3UZ9kOfPLIAbslLzyWeGiEqx9e3rxwZM0KE6EL8GlGwjym9Mrlx5/p33bWTu9YG6vcS4MBxYZDHYr5lr8BQ==", - "requires": { - "glob": "^7.0.0", - "interpret": "^1.0.0", - "rechoir": "^0.6.2" - } - }, - "side-channel": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.4.tgz", - "integrity": "sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==", - "requires": { - "call-bind": "^1.0.0", - "get-intrinsic": "^1.0.2", - "object-inspect": "^1.9.0" - } - }, - "slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=" - }, - "smart-buffer": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.1.0.tgz", - "integrity": "sha512-iVICrxOzCynf/SNaBQCw34eM9jROU/s5rzIhpOvzhzuYHfJR/DhZfDkXiZSgKXfgv26HT3Yni3AV/DGw0cGnnw==" - }, - "socks": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/socks/-/socks-2.3.3.tgz", - "integrity": "sha512-o5t52PCNtVdiOvzMry7wU4aOqYWL0PeCXRWBEiJow4/i/wr+wpsJQ9awEu1EonLIqsfGd5qSgDdxEOvCdmBEpA==", - "requires": { - "ip": "1.1.5", - "smart-buffer": "^4.1.0" - } - }, - "socks-proxy-agent": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-4.0.2.tgz", - "integrity": "sha512-NT6syHhI9LmuEMSK6Kd2V7gNv5KFZoLE7V5udWmn0de+3Mkj3UMA/AJPLyeNUVmElCurSHtUdM3ETpR3z770Wg==", - "requires": { - "agent-base": "~4.2.1", - "socks": "~2.3.2" - }, - "dependencies": { - "agent-base": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-4.2.1.tgz", - "integrity": "sha512-JVwXMr9nHYTUXsBFKUqhJwvlcYU/blreOEUkhNR2eXZIvwd+c+o5V4MgDPKWnMS/56awN3TRzIP+KoPn+roQtg==", - "requires": { - "es6-promisify": "^5.0.0" - } - } - } - }, - "spdx-compare": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/spdx-compare/-/spdx-compare-1.0.0.tgz", - "integrity": "sha512-C1mDZOX0hnu0ep9dfmuoi03+eOdDoz2yvK79RxbcrVEG1NO1Ph35yW102DHWKN4pk80nwCgeMmSY5L25VE4D9A==", - "requires": { - "array-find-index": "^1.0.2", - "spdx-expression-parse": "^3.0.0", - "spdx-ranges": "^2.0.0" - } - }, - "spdx-correct": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.1.tgz", - "integrity": "sha512-cOYcUWwhCuHCXi49RhFRCyJEK3iPj1Ziz9DpViV3tbZOwXD49QzIN3MpOLJNxh2qwq2lJJZaKMVw9qNi4jTC0w==", - "requires": { - "spdx-expression-parse": "^3.0.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-exceptions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz", - "integrity": "sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A==" - }, - "spdx-expression-parse": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz", - "integrity": "sha512-cbqHunsQWnJNE6KhVSMsMeH5H/L9EpymbzqTQ3uLwNCLZ1Q481oWaofqH7nO6V07xlXwY6PhQdQ2IedWx/ZK4Q==", - "requires": { - "spdx-exceptions": "^2.1.0", - "spdx-license-ids": "^3.0.0" - } - }, - "spdx-license-ids": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.7.tgz", - "integrity": "sha512-U+MTEOO0AiDzxwFvoa4JVnMV6mZlJKk2sBLt90s7G0Gd0Mlknc7kxEn3nuDPNZRta7O2uy8oLcZLVT+4sqNZHQ==" - }, - "spdx-license-list": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/spdx-license-list/-/spdx-license-list-5.0.0.tgz", - "integrity": "sha512-N5u9tEFRBUzQDjMKRRt8SHxC/UaqYApPmdF4MMFnICQg3z52onNbnneuro/sWw2rd+eGu9agQOzUbD671Xia7Q==" - }, - "spdx-ranges": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/spdx-ranges/-/spdx-ranges-2.1.1.tgz", - "integrity": "sha512-mcdpQFV7UDAgLpXEE/jOMqvK4LBoO0uTQg0uvXUewmEFhpiZx5yJSZITHB8w1ZahKdhfZqP5GPEOKLyEq5p8XA==" - }, - "spdx-satisfies": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/spdx-satisfies/-/spdx-satisfies-4.0.1.tgz", - "integrity": "sha512-WVzZ/cXAzoNmjCWiEluEA3BjHp5tiUmmhn9MK+X0tBbR9sOqtC6UQwmgCNrAIZvNlMuBUYAaHYfb2oqlF9SwKA==", - "requires": { - "spdx-compare": "^1.0.0", - "spdx-expression-parse": "^3.0.0", - "spdx-ranges": "^2.0.0" - } - }, - "sshpk": { - "version": "1.16.1", - "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz", - "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==", - "requires": { - "asn1": "~0.2.3", - "assert-plus": "^1.0.0", - "bcrypt-pbkdf": "^1.0.0", - "dashdash": "^1.12.0", - "ecc-jsbn": "~0.1.1", - "getpass": "^0.1.1", - "jsbn": "~0.1.0", - "safer-buffer": "^2.0.2", - "tweetnacl": "~0.14.0" - } - }, - "ssri": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/ssri/-/ssri-6.0.2.tgz", - "integrity": "sha512-cepbSq/neFK7xB6A50KHN0xHDotYzq58wWCa5LeWqnPrHG8GzfEjO/4O8kpmcGW+oaxkvhEJCWgbgNk4/ZV93Q==", - "requires": { - "figgy-pudding": "^3.5.1" - } - }, - "stream-each": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz", - "integrity": "sha512-vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==", - "requires": { - "end-of-stream": "^1.1.0", - "stream-shift": "^1.0.0" - } - }, - "stream-shift": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", - "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" - }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "requires": { - "safe-buffer": "~5.2.0" - } - }, - "superagent": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-6.1.0.tgz", - "integrity": "sha512-OUDHEssirmplo3F+1HWKUrUjvnQuA+nZI6i/JJBdXb5eq9IyEQwPyPpqND+SSsxf6TygpBEkUjISVRN4/VOpeg==", - "requires": { - "component-emitter": "^1.3.0", - "cookiejar": "^2.1.2", - "debug": "^4.1.1", - "fast-safe-stringify": "^2.0.7", - "form-data": "^3.0.0", - "formidable": "^1.2.2", - "methods": "^1.1.2", - "mime": "^2.4.6", - "qs": "^6.9.4", - "readable-stream": "^3.6.0", - "semver": "^7.3.2" - } - }, - "supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "requires": { - "has-flag": "^3.0.0" - } - }, - "through": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" - }, - "through2": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", - "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", - "requires": { - "readable-stream": "~2.3.6", - "xtend": "~4.0.1" - }, - "dependencies": { - "readable-stream": { - "version": "2.3.7", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", - "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", - "requires": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "safe-buffer": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", - "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" - }, - "string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "requires": { - "safe-buffer": "~5.1.0" - } - } - } - }, - "tough-cookie": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz", - "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==", - "requires": { - "psl": "^1.1.28", - "punycode": "^2.1.1" - } - }, - "treeify": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/treeify/-/treeify-1.1.0.tgz", - "integrity": "sha512-1m4RA7xVAJrSGrrXGs0L3YTwyvBs2S8PbRHaLZAkFw7JR8oIFwYtysxlBZhYIa7xSyiYJKZ3iGrrk55cGA3i9A==" - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==" - }, - "tunnel-agent": { - "version": "0.6.0", - "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", - "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", - "requires": { - "safe-buffer": "^5.0.1" - } - }, - "tweetnacl": { - "version": "0.14.5", - "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", - "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=" - }, - "type": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", - "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" - }, - "typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" - }, - "typescript": { - "version": "3.9.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.9.3.tgz", - "integrity": "sha512-D/wqnB2xzNFIcoBG9FG8cXRDjiqSTbG2wd8DMZeQyJlP1vfTkIxH4GKveWaEBYySKIg+USu+E+EDIR47SqnaMQ==", - "dev": true - }, - "unique-filename": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz", - "integrity": "sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==", - "requires": { - "unique-slug": "^2.0.0" - } - }, - "unique-slug": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.2.tgz", - "integrity": "sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==", - "requires": { - "imurmurhash": "^0.1.4" - } - }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "requires": { - "punycode": "^2.1.0" - } - }, - "util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" - }, - "util-extend": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/util-extend/-/util-extend-1.0.3.tgz", - "integrity": "sha1-p8IW0mdUUWljeztu3GypEZ4v+T8=" - }, - "uuid": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", - "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==" - }, - "validate-npm-package-license": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", - "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", - "requires": { - "spdx-correct": "^3.0.0", - "spdx-expression-parse": "^3.0.0" - } - }, - "validate-npm-package-name": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz", - "integrity": "sha1-X6kS2B630MdK/BQN5zF/DKffQ34=", - "requires": { - "builtins": "^1.0.3" - } - }, - "verror": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", - "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", - "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" - } - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" - }, - "xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" - }, - "y18n": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.1.tgz", - "integrity": "sha512-wNcy4NvjMYL8gogWWYAO7ZFWFfHcbdbE57tZO8e4cbpj8tfUcwrwqSl3ad8HxpYWCdXcJUCeKKZS62Av1affwQ==" - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" - } - } -} diff --git a/lib/cli/package.json b/lib/cli/package.json index ea6d84bf39..1f23a193ef 100644 --- a/lib/cli/package.json +++ b/lib/cli/package.json @@ -1,7 +1,7 @@ { "name": "@alfresco/adf-cli", "description": "Alfresco ADF cli and utils", - "version": "4.11.0", + "version": "5.0.0-angular.13", "author": "Alfresco Software, Ltd.", "bin": { "adf-cli": "./bin/adf-cli", @@ -21,7 +21,7 @@ }, "dependencies": { "@alfresco/js-api": "4.12.0-244", - "commander": "^4.0.0", + "commander": "6.2.1", "ejs": "^2.6.1", "license-checker": "^25.0.1", "npm-registry-fetch": "^4.0.5", diff --git a/lib/cli/scripts/artifact-from-s3.ts b/lib/cli/scripts/artifact-from-s3.ts index 33c3639ce3..1f338f3a23 100644 --- a/lib/cli/scripts/artifact-from-s3.ts +++ b/lib/cli/scripts/artifact-from-s3.ts @@ -19,7 +19,7 @@ import { exec } from './exec'; import { logger } from './logger'; -import * as program from 'commander'; +import program from 'commander'; function test(output: string) { const response = exec('test !', [`-d ${output} && mkdir ${output}`], {}); diff --git a/lib/cli/scripts/artifact-to-s3.ts b/lib/cli/scripts/artifact-to-s3.ts index 851aaad78c..c33b1c6013 100644 --- a/lib/cli/scripts/artifact-to-s3.ts +++ b/lib/cli/scripts/artifact-to-s3.ts @@ -19,7 +19,7 @@ import { exec } from './exec'; import { logger } from './logger'; -import * as program from 'commander'; +import program from 'commander'; function zipArtifact(artifact: string) { logger.info(`Perform zip artifact ${artifact}`); diff --git a/lib/cli/scripts/audit.ts b/lib/cli/scripts/audit.ts index 9aca3c7f58..bfa4164bad 100644 --- a/lib/cli/scripts/audit.ts +++ b/lib/cli/scripts/audit.ts @@ -21,7 +21,7 @@ import * as shell from 'shelljs'; import * as ejs from 'ejs'; import * as path from 'path'; import * as fs from 'fs'; -import * as program from 'commander'; +import program from 'commander'; export default function main(_args: string[], workingDir: string) { program diff --git a/lib/cli/scripts/changelog.ts b/lib/cli/scripts/changelog.ts index e112815e42..4c61832f29 100644 --- a/lib/cli/scripts/changelog.ts +++ b/lib/cli/scripts/changelog.ts @@ -21,7 +21,7 @@ import * as shell from 'shelljs'; import * as path from 'path'; -import * as program from 'commander'; +import program from 'commander'; import * as fs from 'fs'; import * as ejs from 'ejs'; diff --git a/lib/cli/scripts/docker.ts b/lib/cli/scripts/docker.ts index a6b24321b2..bb6239a292 100644 --- a/lib/cli/scripts/docker.ts +++ b/lib/cli/scripts/docker.ts @@ -18,7 +18,7 @@ */ import { exec } from './exec'; -import * as program from 'commander'; +import program from 'commander'; import { logger } from './logger'; import { resolve } from 'path'; diff --git a/lib/cli/scripts/init-aae-env.ts b/lib/cli/scripts/init-aae-env.ts index 992688aa63..1d14262042 100644 --- a/lib/cli/scripts/init-aae-env.ts +++ b/lib/cli/scripts/init-aae-env.ts @@ -17,7 +17,7 @@ * limitations under the License. */ -import * as program from 'commander'; +import program from 'commander'; import request = require('request'); import * as fs from 'fs'; import { logger } from './logger'; diff --git a/lib/cli/scripts/kubectl-clean-app.ts b/lib/cli/scripts/kubectl-clean-app.ts index 0f2ba27ead..57805112c5 100644 --- a/lib/cli/scripts/kubectl-clean-app.ts +++ b/lib/cli/scripts/kubectl-clean-app.ts @@ -17,8 +17,8 @@ * limitations under the License. */ -import * as program from 'commander'; -import moment from 'moment-es6'; +import program from 'commander'; +import moment from 'moment'; import { AlfrescoApi, AlfrescoApiConfig } from '@alfresco/js-api'; import { logger } from './logger'; import * as kube from './kube-utils'; diff --git a/lib/cli/scripts/kubectl-delete.ts b/lib/cli/scripts/kubectl-delete.ts index e94bdbaf2a..b3d897bc12 100644 --- a/lib/cli/scripts/kubectl-delete.ts +++ b/lib/cli/scripts/kubectl-delete.ts @@ -17,7 +17,7 @@ * limitations under the License. */ -import * as program from 'commander'; +import program from 'commander'; import * as kube from './kube-utils'; // eslint-disable-next-line prefer-arrow/prefer-arrow-functions diff --git a/lib/cli/scripts/kubectl-image.ts b/lib/cli/scripts/kubectl-image.ts index 7def05a9e0..c84d42d1c6 100644 --- a/lib/cli/scripts/kubectl-image.ts +++ b/lib/cli/scripts/kubectl-image.ts @@ -18,7 +18,7 @@ */ import { exec } from './exec'; -import * as program from 'commander'; +import program from 'commander'; import { logger } from './logger'; import * as kube from './kube-utils'; diff --git a/lib/cli/scripts/licenses.ts b/lib/cli/scripts/licenses.ts index 93d03f745e..bd318ab7fe 100644 --- a/lib/cli/scripts/licenses.ts +++ b/lib/cli/scripts/licenses.ts @@ -22,7 +22,7 @@ import * as fs from 'fs'; import * as checker from 'license-checker'; import * as licenseList from 'spdx-license-list'; import * as ejs from 'ejs'; -import * as program from 'commander'; +import program from 'commander'; interface PackageInfo { name: string; diff --git a/lib/cli/scripts/npm-publish.ts b/lib/cli/scripts/npm-publish.ts index 65602b4be0..a8ffccae27 100644 --- a/lib/cli/scripts/npm-publish.ts +++ b/lib/cli/scripts/npm-publish.ts @@ -20,7 +20,7 @@ import * as path from 'path'; import fs = require('fs'); import { exec } from './exec'; -import * as program from 'commander'; +import program from 'commander'; import { logger } from './logger'; export interface PublishArgs { diff --git a/lib/cli/scripts/scan-env.ts b/lib/cli/scripts/scan-env.ts index 88afa927f3..8cbd6a5367 100644 --- a/lib/cli/scripts/scan-env.ts +++ b/lib/cli/scripts/scan-env.ts @@ -1,5 +1,5 @@ import { AlfrescoApi, PeopleApi, NodesApi, GroupsApi, SitesApi, SearchApi, AlfrescoApiConfig } from '@alfresco/js-api'; -import * as program from 'commander'; +import program from 'commander'; import { logger } from './logger'; interface PeopleTally { enabled: number; disabled: number } diff --git a/lib/cli/scripts/update-commit-sha.ts b/lib/cli/scripts/update-commit-sha.ts index 0f394952d4..f30439f763 100644 --- a/lib/cli/scripts/update-commit-sha.ts +++ b/lib/cli/scripts/update-commit-sha.ts @@ -18,7 +18,7 @@ */ import { exec } from './exec'; -import * as program from 'commander'; +import program from 'commander'; import { logger } from './logger'; export interface CommitArgs { diff --git a/lib/cli/scripts/update-version.ts b/lib/cli/scripts/update-version.ts index 71fb8884f7..38e66211ae 100644 --- a/lib/cli/scripts/update-version.ts +++ b/lib/cli/scripts/update-version.ts @@ -17,7 +17,7 @@ * limitations under the License. */ -import * as program from 'commander'; +import program from 'commander'; import * as path from 'path'; import * as fs from 'fs'; import * as shell from 'shelljs'; diff --git a/lib/cli/tsconfig.json b/lib/cli/tsconfig.json index 9841b76db4..a323a98be1 100644 --- a/lib/cli/tsconfig.json +++ b/lib/cli/tsconfig.json @@ -10,6 +10,7 @@ "noImplicitThis": false, "noUnusedParameters": true, "noUnusedLocals": true, + "esModuleInterop": true, "outDir": "./dist", "rootDir": ".", "skipLibCheck": true, diff --git a/lib/cli/tsconfig.lib.prod.json b/lib/cli/tsconfig.lib.prod.json index 04c0e66277..2a2faa884c 100644 --- a/lib/cli/tsconfig.lib.prod.json +++ b/lib/cli/tsconfig.lib.prod.json @@ -4,6 +4,6 @@ "declarationMap": false }, "angularCompilerOptions": { - "enableIvy": false + "compilationMode": "partial" } } diff --git a/lib/config/app.config.json b/lib/config/app.config.json new file mode 100644 index 0000000000..729fb251d2 --- /dev/null +++ b/lib/config/app.config.json @@ -0,0 +1,7 @@ +{ + "description" : "this config file is used in the unit test", + "ecmHost": "http://{hostname}:{port}/ecm", + "bpmHost": "http://{hostname}:{port}/bpm", + "baseShareUrl": null, + "logLevel" : "silent" +} diff --git a/lib/config/webpack.style.js b/lib/config/webpack.style.js new file mode 100644 index 0000000000..a76983a4aa --- /dev/null +++ b/lib/config/webpack.style.js @@ -0,0 +1,38 @@ +const MiniCssExtractPlugin = require('mini-css-extract-plugin'); +const path = require("path"); +const CssMinimizerPlugin = require("css-minimizer-webpack-plugin"); + +module.exports = { + + mode: 'production', + + optimization: { + minimizer: [new CssMinimizerPlugin({})], + }, + + entry: { + 'adf-blue-orange': './lib/core/styles/prebuilt/adf-blue-orange.scss', + 'adf-blue-purple': './lib/core/styles/prebuilt/adf-blue-purple.scss', + 'adf-cyan-orange': './lib/core/styles/prebuilt/adf-cyan-orange.scss', + 'adf-cyan-purple': './lib/core/styles/prebuilt/adf-cyan-purple.scss', + 'adf-green-purple': './lib/core/styles/prebuilt/adf-green-purple.scss', + 'adf-green-orange': './lib/core/styles/prebuilt/adf-green-orange.scss', + 'adf-pink-bluegrey': './lib/core/styles/prebuilt/adf-pink-bluegrey.scss', + 'adf-indigo-pink': './lib/core/styles/prebuilt/adf-indigo-pink.scss', + 'adf-purple-green': './lib/core/styles/prebuilt/adf-purple-green.scss' + }, + + output: { + path: path.resolve(__dirname, '../dist/core/prebuilt-themes/'), + filename: '[name].js', + publicPath: '/dist' + }, + + module: { + rules: [{ + test: /\.scss$/, + use: [MiniCssExtractPlugin.loader, "css-loader", "sass-loader"] + }] + }, + plugins: [new MiniCssExtractPlugin()] +}; diff --git a/lib/content-services/karma.conf.js b/lib/content-services/karma.conf.js index c18fb3d052..d5878708e4 100644 --- a/lib/content-services/karma.conf.js +++ b/lib/content-services/karma.conf.js @@ -15,7 +15,12 @@ module.exports = function (config) { }, {pattern: 'node_modules/moment/min/moment.min.js', included: true, watched: false}, {pattern: 'lib/content-services/src/lib/i18n/**/en.json', included: false, served: true, watched: false}, - {pattern: 'lib/content-services/src/lib/assets/images/**/*.svg', included: false, served: true, watched: false}, + { + pattern: 'lib/content-services/src/lib/assets/images/**/*.svg', + included: false, + served: true, + watched: false + }, {pattern: 'lib/core/assets/images/ft_ic_folder.svg', included: false, served: true, watched: false}, {pattern: 'lib/core/i18n/**/en.json', included: false, served: true, watched: false}, {pattern: 'lib/content-services/**/*.ts', included: false, served: true, watched: false}, @@ -39,12 +44,15 @@ module.exports = function (config) { require('karma-jasmine'), require('karma-chrome-launcher'), require('karma-jasmine-html-reporter'), - require('karma-coverage-istanbul-reporter'), + require('karma-coverage'), require('@angular-devkit/build-angular/plugins/karma'), require('karma-mocha-reporter') ], client: { - clearContext: false // leave Jasmine Spec Runner output visible in browser + clearContext: false, + jasmine: { + random: false + } }, coverageIstanbulReporter: { diff --git a/lib/content-services/ng-package.json b/lib/content-services/ng-package.json index 902dd18567..75ad7aa8bc 100644 --- a/lib/content-services/ng-package.json +++ b/lib/content-services/ng-package.json @@ -8,22 +8,6 @@ ], "lib": { "entryFile": "src/public-api.ts", - "flatModuleFile": "adf-content-services", - "umdModuleIds": { - "@alfresco/js-api": "@alfresco/js-api", - "@angular/platform-browser/animations": "@angular/platform-browser/animations", - "@angular/material": "@angular/material", - "@mat-datetimepicker/core": "@mat-datetimepicker/core", - "@mat-datetimepicker/moment": "@mat-datetimepicker/moment", - "@angular/flex-layout": "@angular/flex-layout", - "@alfresco/adf-core": "@alfresco/adf-core", - "@angular/animations": "@angular/animations", - "@angular/cdk/platform": "@angular/cdk/platform", - "@angular/material/core": "@angular/material/core", - "moment": "moment", - "moment-es6": "moment-es6", - "moment/src/moment": "moment/src/moment", - "@ngx-translate/core": "@ngx-translate/core" - } + "flatModuleFile": "adf-content-services" } } diff --git a/lib/content-services/package.json b/lib/content-services/package.json index 7d517e0198..0aafd08ed4 100644 --- a/lib/content-services/package.json +++ b/lib/content-services/package.json @@ -1,9 +1,8 @@ { "name": "@alfresco/adf-content-services", "description": "Alfresco ADF content services", - "version": "4.11.0", + "version": "5.0.0-angular.13", "author": "Alfresco Software, Ltd.", - "main": "bundles/adf-content-services.js", "repository": { "type": "git", "url": "https://github.com/Alfresco/alfresco-ng2-components.git" @@ -12,18 +11,21 @@ "url": "https://github.com/Alfresco/alfresco-ng2-components/issues" }, "peerDependencies": { - "@angular/animations": ">=10.0.2", - "@angular/cdk": ">=10.0.1", - "@angular/common": ">10.0.2", - "@angular/core": ">=10.0.2", - "@angular/flex-layout": ">=10.0.0-beta.32", - "@angular/forms": ">=10.0.2", - "@angular/material": ">=10.0.1", - "@angular/router": ">=10.0.2", + "@angular/animations": ">=13.3.11", + "@angular/cdk": ">=13.3.9", + "@angular/common": ">=13.3.11", + "@angular/compiler": ">=13.3.11", + "@angular/core": ">=13.3.11", + "@angular/flex-layout": ">=13.0.0-beta.38", + "@angular/forms": ">=13.3.11", + "@angular/material": ">=13.3.9", + "@angular/platform-browser": ">=13.3.11", + "@angular/platform-browser-dynamic": ">=13.3.11", + "@angular/router": ">=13.3.11", "@alfresco/js-api": "4.12.0-244", - "@alfresco/adf-core": "4.11.0", "@ngx-translate/core": ">=13.0.0", - "moment": ">=2.22.2" + "moment": ">=2.22.2", + "@alfresco/adf-core": "5.0.0-angular.13" }, "keywords": [ "content-services", diff --git a/lib/content-services/src/lib/aspect-list/aspect-list-dialog.component.spec.ts b/lib/content-services/src/lib/aspect-list/aspect-list-dialog.component.spec.ts index a455a4f7a4..e4b26c140d 100644 --- a/lib/content-services/src/lib/aspect-list/aspect-list-dialog.component.spec.ts +++ b/lib/content-services/src/lib/aspect-list/aspect-list-dialog.component.spec.ts @@ -22,10 +22,10 @@ import { TranslateModule } from '@ngx-translate/core'; import { of, Subject } from 'rxjs'; import { ContentTestingModule } from '../testing/content.testing.module'; import { AspectListDialogComponentData } from './aspect-list-dialog-data.interface'; -import { NodesApiService } from 'core'; -import { AspectListService } from './aspect-list.service'; +import { AspectListService } from './services/aspect-list.service'; import { delay } from 'rxjs/operators'; import { AspectEntry, MinimalNode } from '@alfresco/js-api'; +import { NodesApiService } from '@alfresco/adf-core'; const aspectListMock: AspectEntry[] = [{ entry: { diff --git a/lib/content-services/src/lib/aspect-list/aspect-list-dialog.component.ts b/lib/content-services/src/lib/aspect-list/aspect-list-dialog.component.ts index b2062d3656..aea5423999 100644 --- a/lib/content-services/src/lib/aspect-list/aspect-list-dialog.component.ts +++ b/lib/content-services/src/lib/aspect-list/aspect-list-dialog.component.ts @@ -18,6 +18,7 @@ import { Component, Inject, OnInit, ViewEncapsulation } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; import { AspectListDialogComponentData } from './aspect-list-dialog-data.interface'; + @Component({ selector: 'adf-aspect-list-dialog', templateUrl: './aspect-list-dialog.component.html', diff --git a/lib/content-services/src/lib/aspect-list/aspect-list.component.spec.ts b/lib/content-services/src/lib/aspect-list/aspect-list.component.spec.ts index 6a42554b7b..5e79b19a62 100644 --- a/lib/content-services/src/lib/aspect-list/aspect-list.component.spec.ts +++ b/lib/content-services/src/lib/aspect-list/aspect-list.component.spec.ts @@ -20,7 +20,7 @@ import { NodesApiService, setupTestBed } from '@alfresco/adf-core'; import { ContentTestingModule } from '../testing/content.testing.module'; import { TranslateModule } from '@ngx-translate/core'; import { AspectListComponent } from './aspect-list.component'; -import { AspectListService } from './aspect-list.service'; +import { AspectListService } from './services/aspect-list.service'; import { of } from 'rxjs'; import { AspectEntry } from '@alfresco/js-api'; import { delay } from 'rxjs/operators'; diff --git a/lib/content-services/src/lib/aspect-list/aspect-list.component.ts b/lib/content-services/src/lib/aspect-list/aspect-list.component.ts index 50d7dfb02b..0a6abdc040 100644 --- a/lib/content-services/src/lib/aspect-list/aspect-list.component.ts +++ b/lib/content-services/src/lib/aspect-list/aspect-list.component.ts @@ -19,7 +19,7 @@ import { Component, EventEmitter, Input, OnDestroy, OnInit, Output, ViewEncapsul import { NodesApiService } from '@alfresco/adf-core'; import { Observable, Subject, zip } from 'rxjs'; import { concatMap, map, takeUntil, tap } from 'rxjs/operators'; -import { AspectListService } from './aspect-list.service'; +import { AspectListService } from './services/aspect-list.service'; import { MatCheckboxChange } from '@angular/material/checkbox'; import { AspectEntry } from '@alfresco/js-api'; @Component({ diff --git a/lib/content-services/src/lib/aspect-list/public-api.ts b/lib/content-services/src/lib/aspect-list/public-api.ts index 3c12160357..e05b2cc7af 100644 --- a/lib/content-services/src/lib/aspect-list/public-api.ts +++ b/lib/content-services/src/lib/aspect-list/public-api.ts @@ -17,8 +17,9 @@ export * from './aspect-list.component'; export * from './aspect-list-dialog.component'; -export * from './aspect-list.service'; -export * from './node-aspect.service'; +export * from './services/aspect-list.service'; +export * from './services/node-aspect.service'; +export * from './services/dialog-aspect-list.service'; export * from './aspect-list-dialog-data.interface'; diff --git a/lib/content-services/src/lib/aspect-list/aspect-list.service.ts b/lib/content-services/src/lib/aspect-list/services/aspect-list.service.ts similarity index 75% rename from lib/content-services/src/lib/aspect-list/aspect-list.service.ts rename to lib/content-services/src/lib/aspect-list/services/aspect-list.service.ts index cb8655459e..60d63545f9 100644 --- a/lib/content-services/src/lib/aspect-list/aspect-list.service.ts +++ b/lib/content-services/src/lib/aspect-list/services/aspect-list.service.ts @@ -16,11 +16,8 @@ */ import { Injectable } from '@angular/core'; -import { MatDialog } from '@angular/material/dialog'; import { AlfrescoApiService, AppConfigService, LogService } from '@alfresco/adf-core'; -import { from, Observable, of, Subject, zip } from 'rxjs'; -import { AspectListDialogComponentData } from './aspect-list-dialog-data.interface'; -import { AspectListDialogComponent } from './aspect-list-dialog.component'; +import { from, Observable, of, zip } from 'rxjs'; import { catchError, map } from 'rxjs/operators'; import { AspectEntry, AspectPaging, AspectsApi } from '@alfresco/js-api'; @@ -37,7 +34,6 @@ export class AspectListService { constructor(private alfrescoApiService: AlfrescoApiService, private appConfigService: AppConfigService, - private dialog: MatDialog, private logService: LogService) { } @@ -101,34 +97,4 @@ export class AspectListService { return visibleAspectList; } - openAspectListDialog(nodeId?: string): Observable { - const select = new Subject(); - select.subscribe({ - complete: this.close.bind(this) - }); - - const data: AspectListDialogComponentData = { - title: 'ADF-ASPECT-LIST.DIALOG.TITLE', - description: 'ADF-ASPECT-LIST.DIALOG.DESCRIPTION', - overTableMessage: 'ADF-ASPECT-LIST.DIALOG.OVER-TABLE-MESSAGE', - select, - nodeId - }; - - this.openDialog(data, 'adf-aspect-list-dialog', '750px'); - return select; - } - - private openDialog(data: AspectListDialogComponentData, panelClass: string, width: string) { - this.dialog.open(AspectListDialogComponent, { - data, - panelClass, - width, - disableClose: true - }); - } - - close() { - this.dialog.closeAll(); - } } diff --git a/lib/content-services/src/lib/aspect-list/services/dialog-aspect-list.service.ts b/lib/content-services/src/lib/aspect-list/services/dialog-aspect-list.service.ts new file mode 100644 index 0000000000..d0345670d9 --- /dev/null +++ b/lib/content-services/src/lib/aspect-list/services/dialog-aspect-list.service.ts @@ -0,0 +1,62 @@ +/*! + * @license + * Copyright 2019 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { Injectable } from '@angular/core'; +import { MatDialog } from '@angular/material/dialog'; +import { Observable, Subject } from 'rxjs'; +import { AspectListDialogComponentData } from '../aspect-list-dialog-data.interface'; +import { AspectListDialogComponent } from '../aspect-list-dialog.component'; + +@Injectable({ + providedIn: 'root' +}) +export class DialogAspectListService { + + constructor(private dialog: MatDialog) { + } + + openAspectListDialog(nodeId?: string): Observable { + const select = new Subject(); + select.subscribe({ + complete: this.close.bind(this) + }); + + const data: AspectListDialogComponentData = { + title: 'ADF-ASPECT-LIST.DIALOG.TITLE', + description: 'ADF-ASPECT-LIST.DIALOG.DESCRIPTION', + overTableMessage: 'ADF-ASPECT-LIST.DIALOG.OVER-TABLE-MESSAGE', + select, + nodeId + }; + + this.openDialog(data, 'adf-aspect-list-dialog', '750px'); + return select; + } + + private openDialog(data: AspectListDialogComponentData, panelClass: string, width: string) { + this.dialog.open(AspectListDialogComponent, { + data, + panelClass, + width, + disableClose: true + }); + } + + close() { + this.dialog.closeAll(); + } +} diff --git a/lib/content-services/src/lib/aspect-list/node-aspect.service.spec.ts b/lib/content-services/src/lib/aspect-list/services/node-aspect.service.spec.ts similarity index 80% rename from lib/content-services/src/lib/aspect-list/node-aspect.service.spec.ts rename to lib/content-services/src/lib/aspect-list/services/node-aspect.service.spec.ts index e950ab4fc0..571de395fc 100644 --- a/lib/content-services/src/lib/aspect-list/node-aspect.service.spec.ts +++ b/lib/content-services/src/lib/aspect-list/services/node-aspect.service.spec.ts @@ -18,15 +18,15 @@ import { MinimalNode } from '@alfresco/js-api'; import { TestBed } from '@angular/core/testing'; import { TranslateModule } from '@ngx-translate/core'; -import { AlfrescoApiService, CardViewUpdateService, NodesApiService, setupTestBed } from 'core'; +import { AlfrescoApiService, CardViewUpdateService, NodesApiService, setupTestBed } from '@alfresco/adf-core'; import { of } from 'rxjs'; -import { ContentTestingModule } from '../testing/content.testing.module'; -import { AspectListService } from './aspect-list.service'; +import { ContentTestingModule } from '../../testing/content.testing.module'; import { NodeAspectService } from './node-aspect.service'; +import { DialogAspectListService } from './dialog-aspect-list.service'; describe('NodeAspectService', () => { - let aspectListService: AspectListService; + let dialogAspectListService: DialogAspectListService; let nodeAspectService: NodeAspectService; let nodeApiService: NodesApiService; let alfrescoApiService: AlfrescoApiService; @@ -40,7 +40,7 @@ describe('NodeAspectService', () => { }); beforeEach(() => { - aspectListService = TestBed.inject(AspectListService); + dialogAspectListService = TestBed.inject(DialogAspectListService); nodeAspectService = TestBed.inject(NodeAspectService); nodeApiService = TestBed.inject(NodesApiService); alfrescoApiService = TestBed.inject(AlfrescoApiService); @@ -48,15 +48,15 @@ describe('NodeAspectService', () => { }); it('should open the aspect list dialog', () => { - spyOn(aspectListService, 'openAspectListDialog').and.returnValue(of([])); + spyOn(dialogAspectListService, 'openAspectListDialog').and.returnValue(of([])); spyOn(nodeApiService, 'updateNode').and.returnValue(of(null)); nodeAspectService.updateNodeAspects('fake-node-id'); - expect(aspectListService.openAspectListDialog).toHaveBeenCalledWith('fake-node-id'); + expect(dialogAspectListService.openAspectListDialog).toHaveBeenCalledWith('fake-node-id'); }); it('should update the node when the aspect dialog apply the changes', () => { const expectedParameters = { aspectNames: ['a', 'b', 'c'] }; - spyOn(aspectListService, 'openAspectListDialog').and.returnValue(of(['a', 'b', 'c'])); + spyOn(dialogAspectListService, 'openAspectListDialog').and.returnValue(of(['a', 'b', 'c'])); spyOn(nodeApiService, 'updateNode').and.returnValue(of(null)); nodeAspectService.updateNodeAspects('fake-node-id'); expect(nodeApiService.updateNode).toHaveBeenCalledWith('fake-node-id', expectedParameters); @@ -69,7 +69,7 @@ describe('NodeAspectService', () => { done(); }); const fakeNode = new MinimalNode({ id: 'fake-node-id', aspectNames: ['a', 'b', 'c'] }); - spyOn(aspectListService, 'openAspectListDialog').and.returnValue(of(['a', 'b', 'c'])); + spyOn(dialogAspectListService, 'openAspectListDialog').and.returnValue(of(['a', 'b', 'c'])); spyOn(nodeApiService, 'updateNode').and.returnValue(of(fakeNode)); nodeAspectService.updateNodeAspects('fake-node-id'); }); @@ -81,7 +81,7 @@ describe('NodeAspectService', () => { done(); }); const fakeNode = new MinimalNode({ id: 'fake-node-id', aspectNames: ['a', 'b', 'c'] }); - spyOn(aspectListService, 'openAspectListDialog').and.returnValue(of(['a', 'b', 'c'])); + spyOn(dialogAspectListService, 'openAspectListDialog').and.returnValue(of(['a', 'b', 'c'])); spyOn(nodeApiService, 'updateNode').and.returnValue(of(fakeNode)); nodeAspectService.updateNodeAspects('fake-node-id'); }); diff --git a/lib/content-services/src/lib/aspect-list/node-aspect.service.ts b/lib/content-services/src/lib/aspect-list/services/node-aspect.service.ts similarity index 85% rename from lib/content-services/src/lib/aspect-list/node-aspect.service.ts rename to lib/content-services/src/lib/aspect-list/services/node-aspect.service.ts index cc4a1e9b40..3b4e5c3889 100644 --- a/lib/content-services/src/lib/aspect-list/node-aspect.service.ts +++ b/lib/content-services/src/lib/aspect-list/services/node-aspect.service.ts @@ -17,7 +17,7 @@ import { Injectable } from '@angular/core'; import { AlfrescoApiService, CardViewUpdateService, NodesApiService } from '@alfresco/adf-core'; -import { AspectListService } from './aspect-list.service'; +import { DialogAspectListService } from './dialog-aspect-list.service'; @Injectable({ providedIn: 'root' @@ -26,12 +26,12 @@ export class NodeAspectService { constructor(private alfrescoApiService: AlfrescoApiService, private nodesApiService: NodesApiService, - private aspectListService: AspectListService, + private dialogAspectListService: DialogAspectListService, private cardViewUpdateService: CardViewUpdateService) { } updateNodeAspects(nodeId: string) { - this.aspectListService.openAspectListDialog(nodeId).subscribe((aspectList) => { + this.dialogAspectListService.openAspectListDialog(nodeId).subscribe((aspectList) => { this.nodesApiService.updateNode(nodeId, { aspectNames: [...aspectList] }).subscribe((updatedNode) => { this.alfrescoApiService.nodeUpdated.next(updatedNode); this.cardViewUpdateService.updateNodeAspect(updatedNode); diff --git a/lib/content-services/src/lib/breadcrumb/breadcrumb.component.ts b/lib/content-services/src/lib/breadcrumb/breadcrumb.component.ts index 037e47f73a..f68274fdeb 100644 --- a/lib/content-services/src/lib/breadcrumb/breadcrumb.component.ts +++ b/lib/content-services/src/lib/breadcrumb/breadcrumb.component.ts @@ -28,7 +28,7 @@ import { } from '@angular/core'; import { MatSelect } from '@angular/material/select'; import { Node, PathElementEntity } from '@alfresco/js-api'; -import { DocumentListComponent } from '../document-list'; +import { DocumentListComponent } from '../document-list/components/document-list.component'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; diff --git a/lib/content-services/src/lib/content-metadata/components/content-metadata-card/content-metadata-card.component.spec.ts b/lib/content-services/src/lib/content-metadata/components/content-metadata-card/content-metadata-card.component.spec.ts index c7d6173126..a7834ec858 100644 --- a/lib/content-services/src/lib/content-metadata/components/content-metadata-card/content-metadata-card.component.spec.ts +++ b/lib/content-services/src/lib/content-metadata/components/content-metadata-card/content-metadata-card.component.spec.ts @@ -24,7 +24,7 @@ import { setupTestBed, AllowableOperationsEnum } from '@alfresco/adf-core'; import { ContentTestingModule } from '../../../testing/content.testing.module'; import { SimpleChange } from '@angular/core'; import { TranslateModule } from '@ngx-translate/core'; -import { NodeAspectService } from 'content-services/src/lib/aspect-list'; +import { NodeAspectService } from '../../../aspect-list/services/node-aspect.service'; import { ContentMetadataService } from '../../services/content-metadata.service'; import { of } from 'rxjs'; diff --git a/lib/content-services/src/lib/content-metadata/components/content-metadata-card/content-metadata-card.component.ts b/lib/content-services/src/lib/content-metadata/components/content-metadata-card/content-metadata-card.component.ts index b509548aa1..6446868507 100644 --- a/lib/content-services/src/lib/content-metadata/components/content-metadata-card/content-metadata-card.component.ts +++ b/lib/content-services/src/lib/content-metadata/components/content-metadata-card/content-metadata-card.component.ts @@ -18,7 +18,7 @@ import { Component, Input, OnChanges, SimpleChanges, ViewEncapsulation } from '@angular/core'; import { Node } from '@alfresco/js-api'; import { ContentService, AllowableOperationsEnum, VersionCompatibilityService } from '@alfresco/adf-core'; -import { NodeAspectService } from '../../../aspect-list/node-aspect.service'; +import { NodeAspectService } from '../../../aspect-list/services/node-aspect.service'; import { PresetConfig } from '../../interfaces/content-metadata.interfaces'; @Component({ selector: 'adf-content-metadata-card', diff --git a/lib/content-services/src/lib/content-metadata/services/content-type-property.service.spec.ts b/lib/content-services/src/lib/content-metadata/services/content-type-property.service.spec.ts index 07b848359d..f841348748 100644 --- a/lib/content-services/src/lib/content-metadata/services/content-type-property.service.spec.ts +++ b/lib/content-services/src/lib/content-metadata/services/content-type-property.service.spec.ts @@ -17,7 +17,7 @@ import { TestBed } from '@angular/core/testing'; import { ContentTypePropertiesService } from './content-type-property.service'; -import { CardViewItem, CardViewSelectItemModel, CardViewTextItemModel, setupTestBed, VersionCompatibilityService } from 'core'; +import { CardViewItem, CardViewSelectItemModel, CardViewTextItemModel, setupTestBed, VersionCompatibilityService } from '@alfresco/adf-core'; import { ContentTestingModule } from '../../testing/content.testing.module'; import { TranslateModule } from '@ngx-translate/core'; import { ContentTypeService } from '../../content-type'; diff --git a/lib/content-services/src/lib/content-node-selector/content-node-selector-panel.component-search.spec.ts b/lib/content-services/src/lib/content-node-selector/content-node-selector-panel.component-search.spec.ts new file mode 100644 index 0000000000..d91e68a86c --- /dev/null +++ b/lib/content-services/src/lib/content-node-selector/content-node-selector-panel.component-search.spec.ts @@ -0,0 +1,787 @@ +/*! + * @license + * Copyright 2019 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; +import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; +import { By } from '@angular/platform-browser'; +import { + MinimalNode, + Node, + NodeEntry, + NodePaging, + RequestScope, + ResultSetPaging, + SiteEntry, + SitePaging +} from '@alfresco/js-api'; +import { + + NodesApiService, + setupTestBed, + SitesService +} from '@alfresco/adf-core'; +import { of } from 'rxjs'; +import { ContentNodeSelectorPanelComponent } from './content-node-selector-panel.component'; +import { ContentTestingModule } from '../testing/content.testing.module'; +import { DocumentListService } from '../document-list/services/document-list.service'; +import { DocumentListComponent } from '../document-list/components/document-list.component'; +import { CustomResourcesService } from '../document-list/services/custom-resources.service'; +import { NodeEntryEvent, ShareDataRow } from '../document-list'; +import { TranslateModule } from '@ngx-translate/core'; +import { SearchQueryBuilderService } from '../search'; +import { mockQueryBody } from '../mock/search-query.mock'; + +const fakeResultSetPaging: ResultSetPaging = { + list: { + pagination: { + totalItems: 1 + }, + entries: [ + { + entry: { + id: '123', + name: 'MyFolder', + isFile: false, + isFolder: true, + nodeType: 'mock' + } + } + ] + } +}; + +describe('ContentNodeSelectorPanelComponent', () => { + const debounceSearch = 200; + let component: ContentNodeSelectorPanelComponent; + let fixture: ComponentFixture; + let nodeService: NodesApiService; + let sitesService: SitesService; + let searchSpy: jasmine.Spy; + const fakeNodeEntry = new Node({ id: 'fakeId' }); + const nodeEntryEvent = new NodeEntryEvent(fakeNodeEntry); + let searchQueryBuilderService: SearchQueryBuilderService; + + const typeToSearchBox = (searchTerm = 'string-to-search') => { + const searchInput = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-search-input"]')); + searchInput.nativeElement.value = searchTerm; + component.searchInput.setValue(searchTerm); + fixture.detectChanges(); + }; + + const triggerSearchResults = (searchResults: ResultSetPaging) => { + component.queryBuilderService.executed.next(searchResults); + }; + + setupTestBed({ + imports: [ + TranslateModule.forRoot(), + ContentTestingModule + ], + schemas: [CUSTOM_ELEMENTS_SCHEMA] + }); + + describe('General component features', () => { + + beforeEach(async () => { + fixture = TestBed.createComponent(ContentNodeSelectorPanelComponent); + component = fixture.componentInstance; + component.debounceSearch = 0; + + nodeService = TestBed.inject(NodesApiService); + sitesService = TestBed.inject(SitesService); + + searchQueryBuilderService = component.queryBuilderService; + component.queryBuilderService.resetToDefaults(); + + spyOn(nodeService, 'getNode').and.returnValue(of(new MinimalNode({ + id: 'fake-node', + path: { elements: [{ nodeType: 'st:site', name: 'fake-site' }] } + }))); + searchSpy = spyOn(searchQueryBuilderService, 'execute'); + const fakeSite = new SiteEntry({ + entry: { + id: 'fake-site', + guid: 'fake-site', + title: 'fake-site', + visibility: 'visible' + } + }); + spyOn(sitesService, 'getSite').and.returnValue(of(fakeSite)); + }); + + afterEach(async () => { + fixture.destroy(); + component = null; + }); + + describe('Search functionality', () => { + let getCorrespondingNodeIdsSpy; + let customResourcesService: CustomResourcesService; + const entry: Node = { id: 'fakeid' } as Node; + + beforeEach(() => { + const documentListService = TestBed.inject(DocumentListService); + const expectedDefaultFolderNode = new NodeEntry(); + component.isSelectionValid = (node: Node) => node.isFile; + + spyOn(documentListService, 'getFolderNode').and.returnValue(of(expectedDefaultFolderNode)); + spyOn(documentListService, 'getFolder').and.returnValue(of(new NodePaging({ + list: { + pagination: {}, + entries: [], + source: {} + } + }))); + + spyOn(sitesService, 'getSites').and.returnValue(of(new SitePaging({ list: { entries: [] } }))); + + customResourcesService = TestBed.inject(CustomResourcesService); + getCorrespondingNodeIdsSpy = spyOn(customResourcesService, 'getCorrespondingNodeIds').and + .callFake((id) => { + if (id === '-sites-') { + return of(['123456testId', '09876543testId']); + } + return of([id]); + }); + + component.currentFolderId = 'cat-girl-nuku-nuku'; + component.documentList.ngOnInit(); + + fixture.detectChanges(); + }); + + it('should the user query get updated when the user types in the search input', fakeAsync(() => { + const updateSpy = spyOn(searchQueryBuilderService, 'update'); + typeToSearchBox('search-term'); + + tick(debounceSearch); + fixture.detectChanges(); + + expect(updateSpy).toHaveBeenCalled(); + expect(searchQueryBuilderService.userQuery).toEqual('(search-term*)'); + expect(component.searchTerm).toEqual('search-term'); + })); + + it('should perform a search when the queryBody gets updated and it is defined', fakeAsync(() => { + typeToSearchBox('search-term'); + + tick(debounceSearch); + fixture.detectChanges(); + + expect(searchSpy).toHaveBeenCalledWith(mockQueryBody); + })); + + it('should NOT perform a search and clear the results when the queryBody gets updated and it is NOT defined', async () => { + spyOn(component, 'clearSearch'); + + searchQueryBuilderService.userQuery = ''; + searchQueryBuilderService.update(); + + fixture.detectChanges(); + await fixture.whenStable(); + + expect(searchSpy).not.toHaveBeenCalled(); + expect(component.clearSearch).toHaveBeenCalled(); + }); + + it('should reset the search term when clicking the clear icon', async () => { + component.searchTerm = 'search-term'; + searchQueryBuilderService.userQuery = 'search-term'; + spyOn(component, 'clearSearch'); + + fixture.detectChanges(); + const clearIcon = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-search-clear"]')); + clearIcon.nativeElement.click(); + + fixture.detectChanges(); + + expect(searchQueryBuilderService.userQuery).toEqual(''); + expect(component.searchTerm).toEqual(''); + expect(component.clearSearch).toHaveBeenCalled(); + }); + + it('should load the results by calling the search api on search change', fakeAsync(() => { + typeToSearchBox('search-term'); + + tick(debounceSearch); + fixture.detectChanges(); + + expect(searchSpy).toHaveBeenCalledWith(mockQueryBody); + })); + + it('should the query include the show files filterQuery', fakeAsync(() => { + component.showFilesInResult = true; + typeToSearchBox('search-term'); + + const expectedQueryBody = mockQueryBody; + expectedQueryBody.filterQueries.push({ + query: `TYPE:'cm:folder' OR TYPE:'cm:content'` + }); + + tick(debounceSearch); + fixture.detectChanges(); + + expect(searchSpy).toHaveBeenCalledWith(expectedQueryBody); + })); + + it('should reset the currently chosen node in case of starting a new search', fakeAsync(() => { + component.chosenNode = [entry]; + typeToSearchBox('kakarot'); + + tick(debounceSearch); + fixture.detectChanges(); + + expect(component.chosenNode).toBeNull(); + })); + + it('should update the breadcrumb when changing to a custom site', async () => { + component.documentList.folderNode = { id: 'fakeNodeId', isFolder: true, path: {} } as Node; + + component.siteChanged({ entry: { guid: '-mysites-', title: 'My Sites' } } as SiteEntry); + + expect(component.breadcrumbFolderTitle).toBe('My Sites'); + }); + + it('should perform a search when selecting a site with the correct query', fakeAsync(() => { + typeToSearchBox('search-term'); + + tick(debounceSearch); + + expect(searchSpy.calls.count()).toBe(1, 'Search count should be one after only one search'); + + component.siteChanged({ entry: { guid: 'namek' } } as SiteEntry); + + const expectedQueryBody = mockQueryBody; + expectedQueryBody.filterQueries = [{ query: `ANCESTOR:'workspace://SpacesStore/namek'` }]; + + expect(searchSpy.calls.count()).toBe(2, 'Search count should be two after the site change'); + expect(searchSpy).toHaveBeenCalledWith(expectedQueryBody); + })); + + it('should create the query with the right parameters on changing the site selectBox value from a custom dropdown menu', fakeAsync(() => { + component.dropdownSiteList = { list: { entries: [{ entry: { guid: '-sites-' } }, { entry: { guid: 'namek' } }] } } as SitePaging; + component.documentList.folderNode = { id: 'fakeNodeId', isFolder: true, path: {} } as Node; + fixture.detectChanges(); + + typeToSearchBox('search-term'); + + tick(debounceSearch); + + expect(searchSpy.calls.count()).toBe(1); + + component.siteChanged({ entry: { guid: '-sites-' } } as SiteEntry); + + const expectedQueryBodyWithSiteChange = mockQueryBody; + expectedQueryBodyWithSiteChange.filterQueries = [ + { query: `ANCESTOR:'workspace://SpacesStore/-sites-' OR ANCESTOR:'workspace://SpacesStore/123456testId' OR ANCESTOR:'workspace://SpacesStore/09876543testId'` } + ]; + + expect(searchSpy).toHaveBeenCalled(); + expect(searchSpy.calls.count()).toBe(2); + expect(searchSpy).toHaveBeenCalledWith(mockQueryBody); + expect(searchSpy).toHaveBeenCalledWith(expectedQueryBodyWithSiteChange); + })); + + it('should get the corresponding node ids on search when a known alias is selected from dropdown', fakeAsync(() => { + component.documentList.folderNode = { id: 'fakeNodeId', isFolder: true, path: {} } as Node; + + typeToSearchBox('vegeta'); + + tick(debounceSearch); + + component.siteChanged({ entry: { guid: '-sites-' } } as SiteEntry); + expect(getCorrespondingNodeIdsSpy.calls.count()).toBe(1, 'getCorrespondingNodeIdsSpy calls count should be one after the site changes to known alias \'-sites\-'); + expect(getCorrespondingNodeIdsSpy.calls.mostRecent().args[0]).toEqual('-sites-'); + })); + + it('should get the corresponding node ids on search when a known alias is selected from CUSTOM dropdown', fakeAsync(() => { + component.dropdownSiteList = { list: { entries: [{ entry: { guid: '-sites-' } }, { entry: { guid: 'namek' } }] } } as SitePaging; + component.documentList.folderNode = { id: 'fakeNodeId', isFolder: true, path: {} } as Node; + + fixture.detectChanges(); + + typeToSearchBox('vegeta'); + + tick(debounceSearch); + + component.siteChanged({ entry: { guid: '-sites-' } } as SiteEntry); + expect(getCorrespondingNodeIdsSpy.calls.count()).toBe(1); + expect(getCorrespondingNodeIdsSpy.calls.mostRecent().args[0]).toEqual('-sites-'); + })); + + it('should NOT get the corresponding node ids on search when NOTHING is selected from dropdown', fakeAsync(() => { + component.dropdownSiteList = { list: { entries: [{ entry: { guid: '-sites-' } }, { entry: { guid: 'namek' } }] } } as SitePaging; + fixture.detectChanges(); + + typeToSearchBox('vegeta'); + + tick(debounceSearch); + + expect(getCorrespondingNodeIdsSpy.calls.count()).toBe(0, 'getCorrespondingNodeIdsSpy calls count should be 0 when no site is selected'); + })); + + it('should NOT get the corresponding node ids on search when NO known alias is selected from dropdown', fakeAsync(() => { + typeToSearchBox('vegeta'); + tick(debounceSearch); + + expect(getCorrespondingNodeIdsSpy.calls.count()).toBe(0, 'getCorrespondingNodeIdsSpy should not be called'); + + component.siteChanged({ entry: { guid: 'namek' } } as SiteEntry); + + expect(getCorrespondingNodeIdsSpy).not.toHaveBeenCalled(); + })); + + it('should NOT get the corresponding node ids on search when NO known alias is selected from CUSTOM dropdown', fakeAsync(() => { + component.dropdownSiteList = { list: { entries: [{ entry: { guid: '-sites-' } }, { entry: { guid: 'namek' } }] } } as SitePaging; + fixture.detectChanges(); + + typeToSearchBox('vegeta'); + tick(debounceSearch); + + expect(getCorrespondingNodeIdsSpy.calls.count()).toBe(0, 'getCorrespondingNodeIdsSpy should not be called'); + + component.siteChanged({ entry: { guid: 'namek' } } as SiteEntry); + + expect(getCorrespondingNodeIdsSpy).not.toHaveBeenCalled(); + })); + + it('should show the search icon by default without the X (clear) icon', fakeAsync(() => { + fixture.detectChanges(); + tick(debounceSearch); + + const searchIcon = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-search-icon"]')); + const clearIcon = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-search-clear"]')); + + expect(searchIcon).not.toBeNull('Search icon should be in the DOM'); + expect(clearIcon).toBeNull('Clear icon should NOT be in the DOM'); + })); + + it('should show the X (clear) icon without the search icon when the search contains at least one character', fakeAsync(() => { + fixture.detectChanges(); + typeToSearchBox('123'); + tick(debounceSearch); + + fixture.detectChanges(); + + const searchIcon = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-search-icon"]')); + const clearIcon = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-search-clear"]')); + + expect(searchIcon).toBeNull('Search icon should NOT be in the DOM'); + expect(clearIcon).not.toBeNull('Clear icon should be in the DOM'); + })); + + it('should clear the search field, nodes and chosenNode when clicking on the X (clear) icon', async () => { + component.chosenNode = [entry]; + + component.nodePaging = { + list: { + entries: [{ entry }] + } + }; + component.searchTerm = 'piccolo'; + component.showingSearchResults = true; + + component.clear(); + + expect(component.searchTerm).toBe(''); + expect(component.nodePaging).toEqual(null); + expect(component.chosenNode).toBeNull(); + expect(component.showingSearchResults).toBeFalsy(); + }); + + it('should the query restrict the search to the currentFolderId in case is defined', fakeAsync(() => { + component.currentFolderId = 'my-root-id'; + component.restrictRootToCurrentFolderId = true; + component.ngOnInit(); + typeToSearchBox('search-term'); + tick(debounceSearch); + + const expectedQueryBody = mockQueryBody; + expectedQueryBody.filterQueries = [{ query: `ANCESTOR:'workspace://SpacesStore/my-root-id'` }]; + + expect(searchSpy).toHaveBeenCalledWith(expectedQueryBody); + })); + + it('should emit showingSearch event with true while searching', async () => { + searchQueryBuilderService.userQuery = 'mock-search-term'; + searchQueryBuilderService.update(); + spyOn(customResourcesService, 'hasCorrespondingNodeIds').and.returnValue(true); + const showingSearchSpy = spyOn(component.showingSearch, 'emit'); + + component.queryBuilderService.execute({ query: { query: 'search' } }); + + triggerSearchResults(fakeResultSetPaging); + fixture.detectChanges(); + await fixture.whenStable(); + + expect(component.showingSearchResults).toBe(true); + expect(showingSearchSpy).toHaveBeenCalledWith(true); + }); + + it('should emit showingSearch event with false if you remove search term without clicking on X (icon) icon', fakeAsync(() => { + const showingSearchSpy = spyOn(component.showingSearch, 'emit'); + typeToSearchBox(''); + tick(debounceSearch); + + fixture.detectChanges(); + + expect(component.showingSearchResults).toBe(false); + expect(showingSearchSpy).toHaveBeenCalledWith(false); + })); + + it('should emit showingResults event with false when clicking on the X (clear) icon', async () => { + const showingSearchSpy = spyOn(component.showingSearch, 'emit'); + component.chosenNode = [entry]; + + component.nodePaging = { + list: { + entries: [{ entry }] + } + }; + component.searchTerm = 'piccolo'; + component.showingSearchResults = true; + + component.clear(); + + expect(component.showingSearchResults).toBe(false); + expect(showingSearchSpy).toHaveBeenCalledWith(false); + }); + + it('should emit showingResults event with false if search api fails', async () => { + searchQueryBuilderService.userQuery = 'mock-search-term'; + searchQueryBuilderService.update(); + getCorrespondingNodeIdsSpy.and.throwError('Failed'); + const showingSearchSpy = spyOn(component.showingSearch, 'emit'); + component.queryBuilderService.execute({ query: { query: 'search' } }); + + triggerSearchResults(fakeResultSetPaging); + fixture.detectChanges(); + await fixture.whenStable(); + + expect(component.showingSearchResults).toBe(true); + expect(showingSearchSpy).toHaveBeenCalledWith(true); + }); + + it('should the query restrict the search to the site and not to the currentFolderId in case is changed', async () => { + component.queryBuilderService.userQuery = 'search-term*'; + component.currentFolderId = 'my-root-id'; + component.restrictRootToCurrentFolderId = true; + component.siteChanged({ entry: { guid: 'my-site-id' } } as SiteEntry); + + const expectedQueryBodyWithSiteChange = mockQueryBody; + expectedQueryBodyWithSiteChange.filterQueries = [ + { query: `ANCESTOR:'workspace://SpacesStore/my-site-id'` } + ]; + + expect(searchSpy).toHaveBeenCalledWith(expectedQueryBodyWithSiteChange); + }); + + it('should restrict the breadcrumb to the currentFolderId in case restrictedRoot is true', async () => { + component.currentFolderId = 'my-root-id'; + component.restrictRootToCurrentFolderId = true; + component.ngOnInit(); + expect(component.breadcrumbRootId).toEqual('my-root-id'); + }); + + it('should NOT restrict the breadcrumb to the currentFolderId in case restrictedRoot is false', async () => { + component.currentFolderId = 'my-root-id'; + component.restrictRootToCurrentFolderId = false; + component.ngOnInit(); + expect(component.breadcrumbRootId).toBeUndefined(); + }); + + it('should clear the search field, nodes and chosenNode when deleting the search input', fakeAsync(() => { + spyOn(component, 'clearSearch').and.callThrough(); + typeToSearchBox('a'); + + tick(debounceSearch); + fixture.detectChanges(); + + expect(searchSpy.calls.count()).toBe(1); + + typeToSearchBox(''); + + tick(debounceSearch); + fixture.detectChanges(); + + expect(searchSpy.calls.count()).toBe(1, 'no other search has been performed'); + expect(component.clearSearch).toHaveBeenCalled(); + expect(component.folderIdToShow).toBe('cat-girl-nuku-nuku', 'back to the folder in which the search was performed'); + })); + + it('should folderIdToShow equal the folder node id when navigation changes', async () => { + component.folderIdToShow = null; + const folderChangeEvent: NodeEntryEvent = new NodeEntryEvent(fakeNodeEntry); + component.onFolderChange(folderChangeEvent); + + expect(component.folderIdToShow).toEqual(fakeNodeEntry.id); + }); + + it('should clear the search field, nodes and chosenNode on folder navigation in the results list', async () => { + spyOn(component, 'clearSearch').and.callThrough(); + triggerSearchResults(fakeResultSetPaging); + + fixture.detectChanges(); + + component.onFolderChange(nodeEntryEvent); + fixture.detectChanges(); + + expect(component.clearSearch).toHaveBeenCalled(); + }); + + it('should show nodes from the same folder as selected in the dropdown on clearing the search input', fakeAsync(() => { + typeToSearchBox('piccolo'); + tick(debounceSearch); + + expect(searchSpy.calls.count()).toBe(1); + + component.siteChanged({ entry: { guid: 'namek' } } as SiteEntry); + + expect(searchSpy.calls.count()).toBe(2); + + component.clear(); + + expect(component.searchTerm).toBe(''); + expect(component.folderIdToShow).toBe('namek'); + })); + + it('should show the current folder\'s content instead of search results if search was not performed', async () => { + const documentList = fixture.debugElement.query(By.directive(DocumentListComponent)); + expect(documentList).not.toBeNull('Document list should be shown'); + expect(documentList.componentInstance.currentFolderId).toBe('cat-girl-nuku-nuku'); + }); + + it('should pass through the rowFilter to the documentList', async () => { + const filter = (shareDataRow: ShareDataRow) => + shareDataRow.node.entry.name === 'impossible-name'; + + component.rowFilter = filter; + + fixture.detectChanges(); + + const documentList = fixture.debugElement.query(By.directive(DocumentListComponent)); + expect(documentList).not.toBeNull('Document list should be shown'); + expect(documentList.componentInstance.rowFilter({ + node: { + entry: new Node({ + name: 'impossible-name', + id: 'name' + }) + } + })) + .toBe(filter({ + node: { + entry: new Node({ + name: 'impossible-name', + id: 'name' + }) + } + } as ShareDataRow)); + }); + + it('should pass through the excludeSiteContent to the rowFilter of the documentList', async () => { + component.excludeSiteContent = ['blog']; + + fixture.detectChanges(); + + const documentList = fixture.debugElement.query(By.directive(DocumentListComponent)); + expect(documentList).not.toBeNull('Document list should be shown'); + expect(documentList.componentInstance.rowFilter).toBeTruthy('Document list should have had a rowFilter'); + + const testSiteContent = new Node({ id: 'blog-id', properties: { 'st:componentId': 'blog' } }); + expect(documentList.componentInstance.rowFilter({ node: { entry: testSiteContent } }, null, null)) + .toBe(false); + }); + + it('should pass through the imageResolver to the documentList', async () => { + const resolver = () => 'piccolo'; + component.imageResolver = resolver; + + fixture.detectChanges(); + + const documentList = fixture.debugElement.query(By.directive(DocumentListComponent)); + expect(documentList).not.toBeNull('Document list should be shown'); + expect(documentList.componentInstance.imageResolver).toBe(resolver); + }); + + it('should show the result list when search was performed', (done) => { + typeToSearchBox(); + + setTimeout(() => { + triggerSearchResults(fakeResultSetPaging); + + fixture.detectChanges(); + const documentList = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-document-list"]')); + expect(documentList).not.toBeNull('Document list should be shown'); + expect(component.hasValidQuery).toEqual(true); + expect(documentList.componentInstance.currentFolderId).toBeNull(); + done(); + }, 300); + }); + + it('should not show the result list when results are returned but there is no search term typed', (done) => { + searchQueryBuilderService.userQuery = ''; + searchQueryBuilderService.update(); + + setTimeout(() => { + triggerSearchResults(fakeResultSetPaging); + fixture.detectChanges(); + + expect(component.hasValidQuery).toEqual(false); + expect(component.showingSearchResults).toEqual(false); + done(); + }, 300); + }); + + it('should highlight the results when search was performed in the next timeframe', (done) => { + typeToSearchBox('My'); + + setTimeout(() => { + triggerSearchResults(fakeResultSetPaging); + fixture.detectChanges(); + + fixture.whenStable().then(() => { + expect(fixture.debugElement.nativeElement.querySelector('.adf-highlight').innerHTML).toBe('My'); + + done(); + }); + }, 300); + }); + + it('should show the default text instead of result list if search was cleared', (done) => { + typeToSearchBox(); + + setTimeout(() => { + triggerSearchResults(fakeResultSetPaging); + fixture.detectChanges(); + + fixture.whenStable().then(() => { + const clearButton = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-search-clear"]')); + expect(clearButton).not.toBeNull('Clear button should be in DOM'); + clearButton.triggerEventHandler('click', {}); + fixture.detectChanges(); + + const documentList = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-document-list"]')); + expect(documentList).not.toBeNull('Document list should be shown'); + expect(documentList.componentInstance.currentFolderId).toBe('cat-girl-nuku-nuku'); + done(); + }); + }, 300); + }); + + it('should reload the original folderId when clearing the search input', fakeAsync(() => { + typeToSearchBox('search-term'); + tick(debounceSearch); + fixture.detectChanges(); + + expect(component.folderIdToShow).toBe(null); + + typeToSearchBox(''); + tick(debounceSearch); + fixture.detectChanges(); + + expect(component.folderIdToShow).toBe('cat-girl-nuku-nuku'); + })); + + it('should set the folderIdToShow to the default "currentFolderId" if siteId is undefined', (done) => { + component.siteChanged({ entry: { guid: 'Kame-Sennin Muten Roshi' } } as SiteEntry); + fixture.detectChanges(); + + let documentList = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-document-list"]')); + expect(documentList.componentInstance.currentFolderId).toBe('Kame-Sennin Muten Roshi'); + + component.siteChanged({ entry: { guid: undefined } } as SiteEntry); + fixture.detectChanges(); + + documentList = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-document-list"]')); + expect(documentList.componentInstance.currentFolderId).toBe('cat-girl-nuku-nuku'); + + done(); + }); + + describe('Pagination "Load more" button', () => { + + it('should NOT be shown by default', () => { + fixture.detectChanges(); + const pagination = fixture.debugElement.query(By.css('[data-automation-id="adf-infinite-pagination-button"]')); + expect(pagination).toBeNull(); + }); + + it('button callback should load the next batch of folder results when there is no searchTerm', () => { + component.searchTerm = ''; + fixture.detectChanges(); + + component.getNextPageOfSearch({ + hasMoreItems: false, + skipCount: 10, + maxItems: 45, + totalItems: 0 + }); + + fixture.detectChanges(); + expect(component.searchTerm).toBe(''); + + expect(component.infiniteScroll).toBeTruthy(); + expect(component.queryBuilderService.paging.maxItems).toBe(45); + expect(searchSpy).not.toHaveBeenCalled(); + }); + + it('should set its loading state to true to perform a new search', async () => { + component.prepareDialogForNewSearch(mockQueryBody); + fixture.detectChanges(); + await fixture.whenStable(); + + const spinnerSelector = By.css('[data-automation-id="content-node-selector-search-pagination"] [data-automation-id="adf-infinite-pagination-spinner"]'); + const paginationLoading = fixture.debugElement.query(spinnerSelector); + + expect(paginationLoading).not.toBeNull(); + }); + + it('Should infinite pagination target be null when we use it for search ', fakeAsync(() => { + component.showingSearchResults = true; + typeToSearchBox('shenron'); + tick(debounceSearch); + fixture.detectChanges(); + + expect(component.target).toBeNull(); + })); + + it('Should infinite pagination target be present when search finish', () => { + triggerSearchResults(fakeResultSetPaging); + fixture.detectChanges(); + + expect(component.target).not.toBeNull(); + }); + + it('Should infinite pagination target on init be the document list', fakeAsync(() => { + component.showingSearchResults = true; + + expect(component.target).toEqual(component.documentList); + })); + + it('Should set the scope to nodes when the component inits', () => { + const expectedScope: RequestScope = { locations: 'nodes' }; + const setScopeSpy = spyOn(component.queryBuilderService, 'setScope'); + component.ngOnInit(); + + expect(setScopeSpy).toHaveBeenCalledWith(expectedScope); + }); + }); + }); + + }); +}); diff --git a/lib/content-services/src/lib/content-node-selector/content-node-selector-panel.component.spec.ts b/lib/content-services/src/lib/content-node-selector/content-node-selector-panel.component.spec.ts index 71849fdde0..c598978799 100644 --- a/lib/content-services/src/lib/content-node-selector/content-node-selector-panel.component.spec.ts +++ b/lib/content-services/src/lib/content-node-selector/content-node-selector-panel.component.spec.ts @@ -18,20 +18,39 @@ import { CUSTOM_ELEMENTS_SCHEMA } from '@angular/core'; import { ComponentFixture, fakeAsync, TestBed, tick } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; -import { MinimalNode, Node, NodeEntry, NodePaging, RequestScope, ResultSetPaging, SiteEntry, SitePaging, UserInfo } from '@alfresco/js-api'; -import { AppConfigService, FileModel, FileUploadStatus, NodesApiService, setupTestBed, SitesService, UploadService, FileUploadCompleteEvent, DataRow, ThumbnailService, ContentService, DataColumn } from '@alfresco/adf-core'; +import { + MinimalNode, + Node, + NodeEntry, + NodePaging, + ResultSetPaging, + SiteEntry, + SitePaging, + UserInfo +} from '@alfresco/js-api'; +import { + AppConfigService, + FileModel, + FileUploadStatus, + NodesApiService, + setupTestBed, + SitesService, + UploadService, + FileUploadCompleteEvent, + DataRow, + ThumbnailService, + ContentService, + DataColumn +} from '@alfresco/adf-core'; import { of, throwError } from 'rxjs'; import { DropdownBreadcrumbComponent } from '../breadcrumb'; import { ContentNodeSelectorPanelComponent } from './content-node-selector-panel.component'; import { ContentTestingModule } from '../testing/content.testing.module'; import { DocumentListService } from '../document-list/services/document-list.service'; -import { DocumentListComponent } from '../document-list/components/document-list.component'; import { DropdownSitesComponent } from '../site-dropdown/sites-dropdown.component'; -import { CustomResourcesService } from '../document-list/services/custom-resources.service'; import { NodeEntryEvent, ShareDataRow, ShareDataTableAdapter } from '../document-list'; import { TranslateModule } from '@ngx-translate/core'; import { SearchQueryBuilderService } from '../search'; -import { mockQueryBody } from '../mock/search-query.mock'; import { ContentNodeSelectorPanelService } from './content-node-selector-panel.service'; import { mockContentModelTextProperty } from '../mock/content-model.mock'; @@ -55,12 +74,10 @@ const fakeResultSetPaging: ResultSetPaging = { }; describe('ContentNodeSelectorPanelComponent', () => { - const debounceSearch = 200; let component: ContentNodeSelectorPanelComponent; let fixture: ComponentFixture; let nodeService: NodesApiService; let sitesService: SitesService; - let searchSpy: jasmine.Spy; const fakeNodeEntry = new Node({ id: 'fakeId' }); const nodeEntryEvent = new NodeEntryEvent(fakeNodeEntry); let searchQueryBuilderService: SearchQueryBuilderService; @@ -69,13 +86,6 @@ describe('ContentNodeSelectorPanelComponent', () => { let thumbnailService: ThumbnailService; let contentService: ContentService; - const typeToSearchBox = (searchTerm = 'string-to-search') => { - const searchInput = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-search-input"]')); - searchInput.nativeElement.value = searchTerm; - component.searchInput.setValue(searchTerm); - fixture.detectChanges(); - }; - const triggerSearchResults = (searchResults: ResultSetPaging) => { component.queryBuilderService.executed.next(searchResults); }; @@ -105,9 +115,18 @@ describe('ContentNodeSelectorPanelComponent', () => { searchQueryBuilderService = component.queryBuilderService; component.queryBuilderService.resetToDefaults(); - spyOn(nodeService, 'getNode').and.returnValue(of(new MinimalNode({ id: 'fake-node', path: { elements: [{ nodeType: 'st:site', name: 'fake-site'}] } }))); - searchSpy = spyOn(searchQueryBuilderService, 'execute'); - const fakeSite = new SiteEntry({ entry: { id: 'fake-site', guid: 'fake-site', title: 'fake-site', visibility: 'visible' } }); + spyOn(nodeService, 'getNode').and.returnValue(of(new MinimalNode({ + id: 'fake-node', + path: { elements: [{ nodeType: 'st:site', name: 'fake-site' }] } + }))); + const fakeSite = new SiteEntry({ + entry: { + id: 'fake-site', + guid: 'fake-site', + title: 'fake-site', + visibility: 'visible' + } + }); spyOn(sitesService, 'getSite').and.returnValue(of(fakeSite)); }); @@ -115,6 +134,40 @@ describe('ContentNodeSelectorPanelComponent', () => { fixture.destroy(); }); + describe('Site selection', () => { + + beforeEach(() => { + spyOn(sitesService, 'getSites').and.returnValue(of(new SitePaging({ list: { entries: [] } }))); + component.currentFolderId = 'fake-starting-folder'; + }); + + it('should trigger siteChange event on init with parent site Title of start folder', (done) => { + component.siteChange.subscribe((siteTitle: string) => { + expect(siteTitle).toBe('fake-site'); + done(); + }); + + component.ngOnInit(); + fixture.detectChanges(); + expect(component.startSiteGuid).toBe('fake-site'); + }); + + it('should trigger siteChange event when a site is selected in sites-dropdown', (done) => { + const fakeSiteEntry = new SiteEntry({ entry: { title: 'fake-new-site', guid: 'fake-new-site' } }); + fixture.detectChanges(); + + fixture.whenStable().then(() => { + component.siteChange.subscribe((siteTitle: string) => { + expect(siteTitle).toBe('fake-new-site'); + done(); + }); + + const sitesDropdown = fixture.debugElement.query(By.directive(DropdownSitesComponent)); + sitesDropdown.componentInstance.selectedSite({ value: fakeSiteEntry }); + }); + }); + }); + describe('Parameters', () => { let documentListService: DocumentListService; @@ -122,7 +175,7 @@ describe('ContentNodeSelectorPanelComponent', () => { beforeEach(() => { documentListService = TestBed.inject(DocumentListService); - spyOn(documentListService, 'getFolderNode').and.returnValue(of({ entry: { path: { elements: [] } } })); + spyOn(documentListService, 'getFolderNode').and.returnValue(of(new NodeEntry())); spyOn(documentListService, 'getFolder').and.returnValue(throwError('No results for test')); spyOn(sitesService, 'getSites').and.returnValue(of(new SitePaging({ list: { @@ -142,7 +195,7 @@ describe('ContentNodeSelectorPanelComponent', () => { }); it('should trigger the select event when selection has been made', (done) => { - const expectedNode = { id: 'fakeid'} as Node; + const expectedNode = { id: 'fakeid' } as Node; component.select.subscribe((nodes) => { expect(nodes.length).toBe(1); expect(nodes[0]).toBe(expectedNode); @@ -196,27 +249,27 @@ describe('ContentNodeSelectorPanelComponent', () => { it('should render search input by default', () => { fixture.detectChanges(); expect(fixture.debugElement.nativeElement.querySelector('.adf-content-node-selector-content-input')) - .not.toBe(null); + .not.toBe(null); }); it('should not render search input if `showSearch` is false', () => { component.showSearch = false; fixture.detectChanges(); expect(fixture.debugElement.nativeElement.querySelector('.adf-content-node-selector-content-input')) - .toBe(null); + .toBe(null); }); it('should render sites list dropdown by default', () => { fixture.detectChanges(); expect(fixture.debugElement.nativeElement.querySelector('adf-sites-dropdown')) - .not.toBe(null); + .not.toBe(null); }); it('should not render sites list dropdown if `showDropdownSiteList` is false', () => { component.showDropdownSiteList = false; fixture.detectChanges(); expect(fixture.debugElement.nativeElement.querySelector('adf-sites-dropdown')) - .toBe(null); + .toBe(null); }); }); @@ -227,7 +280,7 @@ describe('ContentNodeSelectorPanelComponent', () => { beforeEach(() => { documentListService = TestBed.inject(DocumentListService); - spyOn(documentListService, 'getFolderNode').and.returnValue(of({ entry: { path: { elements: [] } } })); + spyOn(documentListService, 'getFolderNode').and.returnValue(of(new NodeEntry())); spyOn(documentListService, 'getFolder').and.returnValue(throwError('No results for test')); spyOn(sitesService, 'getSites').and.returnValue(of(new SitePaging({ list: { entries: [] } }))); @@ -275,7 +328,7 @@ describe('ContentNodeSelectorPanelComponent', () => { triggerSearchResults(fakeResultSetPaging); const chosenNode = new Node({ path: { elements: ['one'] } }); - component.onCurrentSelection([ { entry: chosenNode } ]); + component.onCurrentSelection([{ entry: chosenNode }]); fixture.detectChanges(); const breadcrumb = fixture.debugElement.query(By.directive(DropdownBreadcrumbComponent)); @@ -306,7 +359,7 @@ describe('ContentNodeSelectorPanelComponent', () => { fixture.detectChanges(); const chosenNode = { path: { elements: [] } } as Node; - component.onCurrentSelection([ { entry: chosenNode } ]); + component.onCurrentSelection([{ entry: chosenNode }]); fixture.detectChanges(); const breadcrumb = fixture.debugElement.query(By.directive(DropdownBreadcrumbComponent)); @@ -348,692 +401,9 @@ describe('ContentNodeSelectorPanelComponent', () => { }); }); - describe('Site selection', () => { - - beforeEach(() => { - spyOn(sitesService, 'getSites').and.returnValue(of(new SitePaging({ list: { entries: [] } }))); - component.currentFolderId = 'fake-starting-folder'; - }); - - it('should trigger siteChange event on init with parent site Title of start folder', (done) => { - component.siteChange.subscribe((siteTitle: string) => { - expect(siteTitle).toBe('fake-site'); - done(); - }); - - component.ngOnInit(); - fixture.detectChanges(); - expect(component.startSiteGuid).toBe('fake-site'); - }); - - it('should trigger siteChange event when a site is selected in sites-dropdown', (done) => { - const fakeSiteEntry = new SiteEntry({ entry: { title: 'fake-new-site', guid: 'fake-new-site' } }); - fixture.detectChanges(); - - fixture.whenStable().then(() => { - component.siteChange.subscribe((siteTitle: string) => { - expect(siteTitle).toBe('fake-new-site'); - done(); - }); - - const sitesDropdown = fixture.debugElement.query(By.directive(DropdownSitesComponent)); - sitesDropdown.componentInstance.selectedSite({value: fakeSiteEntry}); - }); - }); - }); - - describe('Search functionality', () => { - let getCorrespondingNodeIdsSpy; - let customResourcesService: CustomResourcesService; - const entry: Node = { id: 'fakeid'} as Node; - - beforeEach(() => { - const documentListService = TestBed.inject(DocumentListService); - const expectedDefaultFolderNode = { entry: { path: { elements: [] } } }; - component.isSelectionValid = (node: Node) => node.isFile; - - spyOn(documentListService, 'getFolderNode').and.returnValue(of(expectedDefaultFolderNode)); - spyOn(documentListService, 'getFolder').and.returnValue(of(new NodePaging({ - list: { - pagination: {}, - entries: [], - source: {} - } - }))); - - spyOn(sitesService, 'getSites').and.returnValue(of(new SitePaging({ list: { entries: [] } }))); - - customResourcesService = TestBed.inject(CustomResourcesService); - getCorrespondingNodeIdsSpy = spyOn(customResourcesService, 'getCorrespondingNodeIds').and - .callFake((id) => { - if (id === '-sites-') { - return of(['123456testId', '09876543testId']); - } - return of([id]); - }); - - component.currentFolderId = 'cat-girl-nuku-nuku'; - component.documentList.ngOnInit(); - - fixture.detectChanges(); - }); - - it('should the user query get updated when the user types in the search input', fakeAsync(() => { - const updateSpy = spyOn(searchQueryBuilderService, 'update'); - typeToSearchBox('search-term'); - - tick(debounceSearch); - fixture.detectChanges(); - - expect(updateSpy).toHaveBeenCalled(); - expect(searchQueryBuilderService.userQuery).toEqual('(search-term*)'); - expect(component.searchTerm).toEqual('search-term'); - })); - - it('should perform a search when the queryBody gets updated and it is defined', async () => { - searchQueryBuilderService.userQuery = 'search-term*'; - searchQueryBuilderService.update(); - - fixture.detectChanges(); - await fixture.whenStable(); - - expect(searchSpy).toHaveBeenCalledWith(mockQueryBody); - }); - - it('should NOT perform a search and clear the results when the queryBody gets updated and it is NOT defined', async () => { - spyOn(component, 'clearSearch'); - - searchQueryBuilderService.userQuery = ''; - searchQueryBuilderService.update(); - - fixture.detectChanges(); - await fixture.whenStable(); - - expect(searchSpy).not.toHaveBeenCalled(); - expect(component.clearSearch).toHaveBeenCalled(); - }); - - it('should reset the search term when clicking the clear icon', () => { - component.searchTerm = 'search-term'; - searchQueryBuilderService.userQuery = 'search-term'; - spyOn(component, 'clearSearch'); - - fixture.detectChanges(); - const clearIcon = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-search-clear"]')); - clearIcon.nativeElement.click(); - - fixture.detectChanges(); - - expect(searchQueryBuilderService.userQuery).toEqual(''); - expect(component.searchTerm).toEqual(''); - expect(component.clearSearch).toHaveBeenCalled(); - }); - - it('should load the results by calling the search api on search change', fakeAsync(() => { - typeToSearchBox('search-term'); - - tick(debounceSearch); - fixture.detectChanges(); - - expect(searchSpy).toHaveBeenCalledWith(mockQueryBody); - })); - - it('should the query include the show files filterQuery', fakeAsync(() => { - component.showFilesInResult = true; - typeToSearchBox('search-term'); - - const expectedQueryBody = mockQueryBody; - expectedQueryBody.filterQueries.push({ - query: `TYPE:'cm:folder' OR TYPE:'cm:content'` - }); - - tick(debounceSearch); - fixture.detectChanges(); - - expect(searchSpy).toHaveBeenCalledWith(expectedQueryBody); - })); - - it('should reset the currently chosen node in case of starting a new search', fakeAsync(() => { - component.chosenNode = [entry]; - typeToSearchBox('kakarot'); - - tick(debounceSearch); - fixture.detectChanges(); - - expect(component.chosenNode).toBeNull(); - })); - - it('should update the breadcrumb when changing to a custom site', async () => { - component.siteChanged({ entry: { guid: '-mysites-', title: 'My Sites' } } as SiteEntry); - - expect(component.breadcrumbFolderTitle).toBe('My Sites'); - }); - - it('should perform a search when selecting a site with the correct query', fakeAsync(() => { - typeToSearchBox('search-term'); - - tick(debounceSearch); - - expect(searchSpy.calls.count()).toBe(1, 'Search count should be one after only one search'); - - component.siteChanged({ entry: { guid: 'namek' } } as SiteEntry); - - const expectedQueryBody = mockQueryBody; - expectedQueryBody.filterQueries = [ { query: `ANCESTOR:'workspace://SpacesStore/namek'`} ]; - - expect(searchSpy.calls.count()).toBe(2, 'Search count should be two after the site change'); - expect(searchSpy).toHaveBeenCalledWith(expectedQueryBody); - })); - - it('should create the query with the right parameters on changing the site selectBox value from a custom dropdown menu', fakeAsync(() => { - component.dropdownSiteList = { list: { entries: [{ entry: { guid: '-sites-' } }, { entry: { guid: 'namek' } }] } } as SitePaging; - fixture.detectChanges(); - - typeToSearchBox('search-term'); - - tick(debounceSearch); - - expect(searchSpy.calls.count()).toBe(1); - - component.siteChanged({ entry: { guid: '-sites-' } } as SiteEntry); - - const expectedQueryBodyWithSiteChange = mockQueryBody; - expectedQueryBodyWithSiteChange.filterQueries = [ - { query: `ANCESTOR:'workspace://SpacesStore/-sites-' OR ANCESTOR:'workspace://SpacesStore/123456testId' OR ANCESTOR:'workspace://SpacesStore/09876543testId'` } - ]; - - expect(searchSpy).toHaveBeenCalled(); - expect(searchSpy.calls.count()).toBe(2); - expect(searchSpy).toHaveBeenCalledWith(mockQueryBody); - expect(searchSpy).toHaveBeenCalledWith(expectedQueryBodyWithSiteChange); - })); - - it('should get the corresponding node ids on search when a known alias is selected from dropdown', fakeAsync(() => { - typeToSearchBox('vegeta'); - - tick(debounceSearch); - - component.siteChanged({ entry: { guid: '-sites-' } } as SiteEntry); - expect(getCorrespondingNodeIdsSpy.calls.count()).toBe(1, 'getCorrespondingNodeIdsSpy calls count should be one after the site changes to known alias \'-sites\-'); - expect(getCorrespondingNodeIdsSpy.calls.mostRecent().args[0]).toEqual('-sites-'); - })); - - it('should get the corresponding node ids on search when a known alias is selected from CUSTOM dropdown', fakeAsync(() => { - component.dropdownSiteList = { list: { entries: [{ entry: { guid: '-sites-' } }, { entry: { guid: 'namek' } }] } } as SitePaging; - fixture.detectChanges(); - - typeToSearchBox('vegeta'); - - tick(debounceSearch); - - component.siteChanged({ entry: { guid: '-sites-' } } as SiteEntry); - expect(getCorrespondingNodeIdsSpy.calls.count()).toBe(1); - expect(getCorrespondingNodeIdsSpy.calls.mostRecent().args[0]).toEqual('-sites-'); - })); - - it('should NOT get the corresponding node ids on search when NOTHING is selected from dropdown', fakeAsync(() => { - component.dropdownSiteList = { list: { entries: [{ entry: { guid: '-sites-' } }, { entry: { guid: 'namek' } }] } } as SitePaging; - fixture.detectChanges(); - - typeToSearchBox('vegeta'); - - tick(debounceSearch); - - expect(getCorrespondingNodeIdsSpy.calls.count()).toBe(0, 'getCorrespondingNodeIdsSpy calls count should be 0 when no site is selected'); - })); - - it('should NOT get the corresponding node ids on search when NO known alias is selected from dropdown', fakeAsync(() => { - typeToSearchBox('vegeta'); - tick(debounceSearch); - - expect(getCorrespondingNodeIdsSpy.calls.count()).toBe(0, 'getCorrespondingNodeIdsSpy should not be called'); - - component.siteChanged({ entry: { guid: 'namek' } } as SiteEntry); - - expect(getCorrespondingNodeIdsSpy).not.toHaveBeenCalled(); - })); - - it('should NOT get the corresponding node ids on search when NO known alias is selected from CUSTOM dropdown', fakeAsync(() => { - component.dropdownSiteList = { list: { entries: [{ entry: { guid: '-sites-' } }, { entry: { guid: 'namek' } }] } } as SitePaging; - fixture.detectChanges(); - - typeToSearchBox('vegeta'); - tick(debounceSearch); - - expect(getCorrespondingNodeIdsSpy.calls.count()).toBe(0, 'getCorrespondingNodeIdsSpy should not be called'); - - component.siteChanged({ entry: { guid: 'namek' } } as SiteEntry); - - expect(getCorrespondingNodeIdsSpy).not.toHaveBeenCalled(); - })); - - it('should show the search icon by default without the X (clear) icon', fakeAsync(() => { - fixture.detectChanges(); - tick(debounceSearch); - - const searchIcon = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-search-icon"]')); - const clearIcon = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-search-clear"]')); - - expect(searchIcon).not.toBeNull('Search icon should be in the DOM'); - expect(clearIcon).toBeNull('Clear icon should NOT be in the DOM'); - })); - - it('should show the X (clear) icon without the search icon when the search contains at least one character', fakeAsync(() => { - fixture.detectChanges(); - typeToSearchBox('123'); - tick(debounceSearch); - - fixture.detectChanges(); - - const searchIcon = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-search-icon"]')); - const clearIcon = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-search-clear"]')); - - expect(searchIcon).toBeNull('Search icon should NOT be in the DOM'); - expect(clearIcon).not.toBeNull('Clear icon should be in the DOM'); - })); - - it('should clear the search field, nodes and chosenNode when clicking on the X (clear) icon', () => { - component.chosenNode = [entry]; - - component.nodePaging = { - list: { - entries: [{ entry }] - } - }; - component.searchTerm = 'piccolo'; - component.showingSearchResults = true; - - component.clear(); - - expect(component.searchTerm).toBe(''); - expect(component.nodePaging).toEqual(null); - expect(component.chosenNode).toBeNull(); - expect(component.showingSearchResults).toBeFalsy(); - }); - - it('should the query restrict the search to the currentFolderId in case is defined', fakeAsync(() => { - component.currentFolderId = 'my-root-id'; - component.restrictRootToCurrentFolderId = true; - component.ngOnInit(); - typeToSearchBox('search-term'); - tick(debounceSearch); - - const expectedQueryBody = mockQueryBody; - expectedQueryBody.filterQueries = [ { query: `ANCESTOR:'workspace://SpacesStore/my-root-id'`} ]; - - expect(searchSpy).toHaveBeenCalledWith(expectedQueryBody); - })); - - it('should emit showingSearch event with true while searching', async () => { - searchQueryBuilderService.userQuery = 'mock-search-term'; - searchQueryBuilderService.update(); - spyOn(customResourcesService, 'hasCorrespondingNodeIds').and.returnValue(true); - const showingSearchSpy = spyOn(component.showingSearch, 'emit'); - - component.queryBuilderService.execute({ query: { query: 'search' } }); - - triggerSearchResults(fakeResultSetPaging); - fixture.detectChanges(); - await fixture.whenStable(); - - expect(component.showingSearchResults).toBe(true); - expect(showingSearchSpy).toHaveBeenCalledWith(true); - }); - - it('should emit showingSearch event with false if you remove search term without clicking on X (icon) icon', fakeAsync(() => { - const showingSearchSpy = spyOn(component.showingSearch, 'emit'); - typeToSearchBox(''); - tick(debounceSearch); - - fixture.detectChanges(); - - expect(component.showingSearchResults).toBe(false); - expect(showingSearchSpy).toHaveBeenCalledWith(false); - })); - - it('should emit showingResults event with false when clicking on the X (clear) icon', () => { - const showingSearchSpy = spyOn(component.showingSearch, 'emit'); - component.chosenNode = [entry]; - - component.nodePaging = { - list: { - entries: [{ entry }] - } - }; - component.searchTerm = 'piccolo'; - component.showingSearchResults = true; - - component.clear(); - - expect(component.showingSearchResults).toBe(false); - expect(showingSearchSpy).toHaveBeenCalledWith(false); - }); - - it('should emit showingResults event with false if search api fails', async () => { - searchQueryBuilderService.userQuery = 'mock-search-term'; - searchQueryBuilderService.update(); - getCorrespondingNodeIdsSpy.and.throwError('Failed'); - const showingSearchSpy = spyOn(component.showingSearch, 'emit'); - component.queryBuilderService.execute({ query: { query: 'search' } }); - - triggerSearchResults(fakeResultSetPaging); - fixture.detectChanges(); - await fixture.whenStable(); - - expect(component.showingSearchResults).toBe(true); - expect(showingSearchSpy).toHaveBeenCalledWith(true); - }); - - it('should the query restrict the search to the site and not to the currentFolderId in case is changed', () => { - component.queryBuilderService.userQuery = 'search-term*'; - component.currentFolderId = 'my-root-id'; - component.restrictRootToCurrentFolderId = true; - component.siteChanged({ entry: { guid: 'my-site-id' } } as SiteEntry); - - const expectedQueryBodyWithSiteChange = mockQueryBody; - expectedQueryBodyWithSiteChange.filterQueries = [ - { query: `ANCESTOR:'workspace://SpacesStore/my-site-id'` } - ]; - - expect(searchSpy).toHaveBeenCalledWith(expectedQueryBodyWithSiteChange); - }); - - it('should restrict the breadcrumb to the currentFolderId in case restrictedRoot is true', () => { - component.currentFolderId = 'my-root-id'; - component.restrictRootToCurrentFolderId = true; - component.ngOnInit(); - expect(component.breadcrumbRootId).toEqual('my-root-id'); - }); - - it('should NOT restrict the breadcrumb to the currentFolderId in case restrictedRoot is false', () => { - component.currentFolderId = 'my-root-id'; - component.restrictRootToCurrentFolderId = false; - component.ngOnInit(); - expect(component.breadcrumbRootId).toBeUndefined(); - }); - - it('should clear the search field, nodes and chosenNode when deleting the search input', fakeAsync (() => { - spyOn(component, 'clearSearch').and.callThrough(); - typeToSearchBox('a'); - - tick(debounceSearch); - fixture.detectChanges(); - - expect(searchSpy.calls.count()).toBe(1); - - typeToSearchBox(''); - - tick(debounceSearch); - fixture.detectChanges(); - - expect(searchSpy.calls.count()).toBe(1, 'no other search has been performed'); - expect(component.clearSearch).toHaveBeenCalled(); - expect(component.folderIdToShow).toBe('cat-girl-nuku-nuku', 'back to the folder in which the search was performed'); - })); - - it('should folderIdToShow equal the folder node id when navigation changes', () => { - component.folderIdToShow = null; - const folderChangeEvent: NodeEntryEvent = new NodeEntryEvent(fakeNodeEntry); - component.onFolderChange(folderChangeEvent); - - expect(component.folderIdToShow).toEqual(fakeNodeEntry.id); - }); - - it('should clear the search field, nodes and chosenNode on folder navigation in the results list', async () => { - spyOn(component, 'clearSearch').and.callThrough(); - triggerSearchResults(fakeResultSetPaging); - - fixture.detectChanges(); - - component.onFolderChange(nodeEntryEvent); - fixture.detectChanges(); - - expect(component.clearSearch).toHaveBeenCalled(); - }); - - it('should show nodes from the same folder as selected in the dropdown on clearing the search input', fakeAsync (() => { - typeToSearchBox('piccolo'); - tick(debounceSearch); - - expect(searchSpy.calls.count()).toBe(1); - - component.siteChanged({ entry: { guid: 'namek' } } as SiteEntry); - - expect(searchSpy.calls.count()).toBe(2); - - component.clear(); - - expect(component.searchTerm).toBe(''); - expect(component.folderIdToShow).toBe('namek'); - })); - - it('should show the current folder\'s content instead of search results if search was not performed', () => { - const documentList = fixture.debugElement.query(By.directive(DocumentListComponent)); - expect(documentList).not.toBeNull('Document list should be shown'); - expect(documentList.componentInstance.currentFolderId).toBe('cat-girl-nuku-nuku'); - }); - - it('should pass through the rowFilter to the documentList', () => { - const filter = (shareDataRow: ShareDataRow) => - shareDataRow.node.entry.name === 'impossible-name'; - - component.rowFilter = filter; - - fixture.detectChanges(); - - const documentList = fixture.debugElement.query(By.directive(DocumentListComponent)); - expect(documentList).not.toBeNull('Document list should be shown'); - expect(documentList.componentInstance.rowFilter({ - node: { - entry: new Node({ - name: 'impossible-name', - id: 'name' - }) - } - })) - .toBe(filter({ - node: { - entry: new Node({ - name: 'impossible-name', - id: 'name' - }) - } - } as ShareDataRow)); - }); - - it('should pass through the excludeSiteContent to the rowFilter of the documentList', () => { - component.excludeSiteContent = ['blog']; - - fixture.detectChanges(); - - const documentList = fixture.debugElement.query(By.directive(DocumentListComponent)); - expect(documentList).not.toBeNull('Document list should be shown'); - expect(documentList.componentInstance.rowFilter).toBeTruthy('Document list should have had a rowFilter'); - - const testSiteContent = new Node({ id: 'blog-id', properties: { 'st:componentId': 'blog' } }); - expect(documentList.componentInstance.rowFilter({ node: { entry: testSiteContent } }, null, null)) - .toBe(false); - }); - - it('should pass through the imageResolver to the documentList', () => { - const resolver = () => 'piccolo'; - component.imageResolver = resolver; - - fixture.detectChanges(); - - const documentList = fixture.debugElement.query(By.directive(DocumentListComponent)); - expect(documentList).not.toBeNull('Document list should be shown'); - expect(documentList.componentInstance.imageResolver).toBe(resolver); - }); - - it('should show the result list when search was performed', (done) => { - typeToSearchBox(); - - setTimeout(() => { - triggerSearchResults(fakeResultSetPaging); - - fixture.detectChanges(); - const documentList = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-document-list"]')); - expect(documentList).not.toBeNull('Document list should be shown'); - expect(component.hasValidQuery).toEqual(true); - expect(documentList.componentInstance.currentFolderId).toBeNull(); - done(); - }, 300); - }); - - it('should not show the result list when results are returned but there is no search term typed', (done) => { - searchQueryBuilderService.userQuery = ''; - searchQueryBuilderService.update(); - - setTimeout(() => { - triggerSearchResults(fakeResultSetPaging); - fixture.detectChanges(); - - expect(component.hasValidQuery).toEqual(false); - expect(component.showingSearchResults).toEqual(false); - done(); - }, 300); - }); - - it('should highlight the results when search was performed in the next timeframe', (done) => { - typeToSearchBox('My'); - - setTimeout(() => { - triggerSearchResults(fakeResultSetPaging); - fixture.detectChanges(); - - fixture.whenStable().then(() => { - expect(fixture.debugElement.nativeElement.querySelector('.adf-highlight').innerHTML).toBe('My'); - - done(); - }); - }, 300); - }); - - it('should show the default text instead of result list if search was cleared', (done) => { - typeToSearchBox(); - - setTimeout(() => { - triggerSearchResults(fakeResultSetPaging); - fixture.detectChanges(); - - fixture.whenStable().then(() => { - const clearButton = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-search-clear"]')); - expect(clearButton).not.toBeNull('Clear button should be in DOM'); - clearButton.triggerEventHandler('click', {}); - fixture.detectChanges(); - - const documentList = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-document-list"]')); - expect(documentList).not.toBeNull('Document list should be shown'); - expect(documentList.componentInstance.currentFolderId).toBe('cat-girl-nuku-nuku'); - done(); - }); - }, 300); - }); - - it('should reload the original folderId when clearing the search input', fakeAsync(() => { - typeToSearchBox('search-term'); - tick(debounceSearch); - fixture.detectChanges(); - - expect(component.folderIdToShow).toBe(null); - - typeToSearchBox(''); - tick(debounceSearch); - fixture.detectChanges(); - - expect(component.folderIdToShow).toBe('cat-girl-nuku-nuku'); - })); - - it('should set the folderIdToShow to the default "currentFolderId" if siteId is undefined', (done) => { - component.siteChanged({ entry: { guid: 'Kame-Sennin Muten Roshi' } } as SiteEntry); - fixture.detectChanges(); - - let documentList = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-document-list"]')); - expect(documentList.componentInstance.currentFolderId).toBe('Kame-Sennin Muten Roshi'); - - component.siteChanged({ entry: { guid: undefined } } as SiteEntry); - fixture.detectChanges(); - - documentList = fixture.debugElement.query(By.css('[data-automation-id="content-node-selector-document-list"]')); - expect(documentList.componentInstance.currentFolderId).toBe('cat-girl-nuku-nuku'); - - done(); - }); - - describe('Pagination "Load more" button', () => { - - it('should NOT be shown by default', () => { - fixture.detectChanges(); - const pagination = fixture.debugElement.query(By.css('[data-automation-id="adf-infinite-pagination-button"]')); - expect(pagination).toBeNull(); - }); - - it('button callback should load the next batch of folder results when there is no searchTerm', () => { - component.searchTerm = ''; - fixture.detectChanges(); - - component.getNextPageOfSearch({ - hasMoreItems: false, - skipCount: 10, - maxItems: 45, - totalItems: 0 - }); - - fixture.detectChanges(); - expect(component.searchTerm).toBe(''); - - expect(component.infiniteScroll).toBeTruthy(); - expect(component.queryBuilderService.paging.maxItems).toBe(45); - expect(searchSpy).not.toHaveBeenCalled(); - }); - - it('should set its loading state to true to perform a new search', async () => { - component.prepareDialogForNewSearch(mockQueryBody); - fixture.detectChanges(); - await fixture.whenStable(); - - const spinnerSelector = By.css('[data-automation-id="content-node-selector-search-pagination"] [data-automation-id="adf-infinite-pagination-spinner"]'); - const paginationLoading = fixture.debugElement.query(spinnerSelector); - - expect(paginationLoading).not.toBeNull(); - }); - - it('Should infinite pagination target be null when we use it for search ', fakeAsync (() => { - component.showingSearchResults = true; - typeToSearchBox('shenron'); - tick(debounceSearch); - fixture.detectChanges(); - - expect(component.target).toBeNull(); - })); - - it('Should infinite pagination target be present when search finish', () => { - triggerSearchResults(fakeResultSetPaging); - fixture.detectChanges(); - - expect(component.target).not.toBeNull(); - }); - - it('Should infinite pagination target on init be the document list', fakeAsync(() => { - component.showingSearchResults = true; - - expect(component.target).toEqual(component.documentList); - })); - - it('Should set the scope to nodes when the component inits', () => { - const expectedScope: RequestScope = { locations: 'nodes' }; - const setScopeSpy = spyOn(component.queryBuilderService, 'setScope'); - component.ngOnInit(); - - expect(setScopeSpy).toHaveBeenCalledWith(expectedScope); - }); - }); - }); - describe('Chosen node', () => { - const entry: Node = { id: 'fakeid'} as Node; + const entry: Node = { id: 'fakeid' } as Node; const nodePage: NodePaging = { list: { pagination: {} } }; let hasAllowableOperations; const fakeFolderNode = { id: 'fakeNodeId', isFolder: true } as Node; @@ -1145,7 +515,7 @@ describe('ContentNodeSelectorPanelComponent', () => { expect(component.chosenNode[0]).toBe(entry); }); - component.onCurrentSelection([ { entry } ]); + component.onCurrentSelection([{ entry }]); }); it('should remain empty when clicking on a node (with the WRONG permissions) in the list (onNodeSelect)', async () => { @@ -1157,7 +527,7 @@ describe('ContentNodeSelectorPanelComponent', () => { expect(component.chosenNode).toEqual([]); }); - component.onCurrentSelection([ { entry } ]); + component.onCurrentSelection([{ entry }]); }); it('should become empty when clicking on a node (with the WRONG permissions) after previously selecting a right node', async () => { @@ -1299,8 +669,11 @@ describe('ContentNodeSelectorPanelComponent', () => { const isUploadingSpy = spyOn(uploadService, 'isUploading').and.returnValue(true); const documentListReloadSpy = spyOn(component.documentList, 'reloadWithoutResettingSelection'); - const fakeFileModels = [new FileModel({ name: 'fake-name', size: 100 } as File), new FileModel({ name: 'fake-name-2', size: 200 } as File)]; - const fileUploadCompleteEvent = new FileUploadCompleteEvent(fakeFileModels[0], 1, fakeFileModels[0], 0); + const fakeFileModels = [new FileModel({ + name: 'fake-name', + size: 100 + } as File), new FileModel({ name: 'fake-name-2', size: 200 } as File)]; + const fileUploadCompleteEvent = new FileUploadCompleteEvent(fakeFileModels[0], 1, fakeFileModels[0], 0); uploadService.fileUploadComplete.next(fileUploadCompleteEvent); tick(500); @@ -1312,7 +685,7 @@ describe('ContentNodeSelectorPanelComponent', () => { isUploadingSpy.and.returnValue(false); - const secondFileUploadCompleteEvent = new FileUploadCompleteEvent(fakeFileModels[1], 2, fakeFileModels[1], 0); + const secondFileUploadCompleteEvent = new FileUploadCompleteEvent(fakeFileModels[1], 2, fakeFileModels[1], 0); uploadService.fileUploadComplete.next(secondFileUploadCompleteEvent); tick(500); @@ -1371,7 +744,7 @@ describe('ContentNodeSelectorPanelComponent', () => { contentNodeSelectorPanelService.customModels = undefined; }); - it ('should search panel be collapsed by default and expand when clicking the filter button', async () => { + it('should search panel be collapsed by default and expand when clicking the filter button', async () => { contentNodeSelectorPanelService.customModels = [mockContentModelTextProperty]; fixture.detectChanges(); @@ -1386,7 +759,7 @@ describe('ContentNodeSelectorPanelComponent', () => { expect(component.searchPanelExpanded).toEqual(true); }); - it ('should search panel be present when the filter section is expanded', () => { + it('should search panel be present when the filter section is expanded', () => { component.searchPanelExpanded = true; fixture.detectChanges(); @@ -1395,7 +768,7 @@ describe('ContentNodeSelectorPanelComponent', () => { expect(searchPanelContainer).not.toBe(null); }); - it('should filter button be present only when there are custom models', () => { + it('should filter button be present only when there are custom models', () => { contentNodeSelectorPanelService.customModels = [mockContentModelTextProperty]; fixture.detectChanges(); @@ -1404,7 +777,7 @@ describe('ContentNodeSelectorPanelComponent', () => { expect(toggleFiltersPanelButton).not.toEqual(null); }); - it('should filter button not be present when there are no custom models', () => { + it('should filter button not be present when there are no custom models', () => { fixture.detectChanges(); const toggleFiltersPanelButton = fixture.debugElement.query(By.css('[data-automation-id="adf-toggle-search-panel-button"]')); diff --git a/lib/content-services/src/lib/content-node-selector/content-node-selector-panel.component.ts b/lib/content-services/src/lib/content-node-selector/content-node-selector-panel.component.ts index 1698bd2f6d..ccfe899825 100644 --- a/lib/content-services/src/lib/content-node-selector/content-node-selector-panel.component.ts +++ b/lib/content-services/src/lib/content-node-selector/content-node-selector-panel.component.ts @@ -47,11 +47,12 @@ import { RowFilter } from '../document-list/data/row-filter.model'; import { ImageResolver } from '../document-list/data/image-resolver.model'; import { debounceTime, takeUntil } from 'rxjs/operators'; import { CustomResourcesService } from '../document-list/services/custom-resources.service'; -import { NodeEntryEvent, ShareDataRow } from '../document-list'; +import { ShareDataRow } from '../document-list/data/share-data-row.model'; import { Subject } from 'rxjs'; import { SEARCH_QUERY_SERVICE_TOKEN } from '../search/search-query-service.token'; import { SearchQueryBuilderService } from '../search/services/search-query-builder.service'; import { ContentNodeSelectorPanelService } from './content-node-selector-panel.service'; +import { NodeEntryEvent } from '../document-list/components/node.event'; export type ValidationFunction = (entry: Node) => boolean; diff --git a/lib/content-services/src/lib/content-node-share/content-node-share.dialog.spec.ts b/lib/content-services/src/lib/content-node-share/content-node-share.dialog.spec.ts index ac7f667bbf..1e0b87f2e7 100644 --- a/lib/content-services/src/lib/content-node-share/content-node-share.dialog.spec.ts +++ b/lib/content-services/src/lib/content-node-share/content-node-share.dialog.spec.ts @@ -27,7 +27,7 @@ import { AppConfigService } from '@alfresco/adf-core'; import { ShareDialogComponent } from './content-node-share.dialog'; -import moment from 'moment-es6'; +import moment from 'moment'; import { ContentTestingModule } from '../testing/content.testing.module'; import { TranslateModule } from '@ngx-translate/core'; diff --git a/lib/content-services/src/lib/content-node-share/content-node-share.dialog.ts b/lib/content-services/src/lib/content-node-share/content-node-share.dialog.ts index 831cbce4d6..a3093f8221 100644 --- a/lib/content-services/src/lib/content-node-share/content-node-share.dialog.ts +++ b/lib/content-services/src/lib/content-node-share/content-node-share.dialog.ts @@ -36,7 +36,7 @@ import { } from '@alfresco/adf-core'; import { SharedLinkEntry, Node } from '@alfresco/js-api'; import { ConfirmDialogComponent } from '../dialogs/confirm.dialog'; -import moment from 'moment-es6'; +import moment from 'moment'; import { ContentNodeShareSettings } from './content-node-share.settings'; import { takeUntil, debounceTime } from 'rxjs/operators'; diff --git a/lib/content-services/src/lib/dialogs/node-lock.dialog.spec.ts b/lib/content-services/src/lib/dialogs/node-lock.dialog.spec.ts index a95e7a6483..249f8a663e 100644 --- a/lib/content-services/src/lib/dialogs/node-lock.dialog.spec.ts +++ b/lib/content-services/src/lib/dialogs/node-lock.dialog.spec.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import moment from 'moment-es6'; +import moment from 'moment'; import { TestBed, fakeAsync, tick, ComponentFixture } from '@angular/core/testing'; import { MatDialogRef } from '@angular/material/dialog'; diff --git a/lib/content-services/src/lib/dialogs/node-lock.dialog.ts b/lib/content-services/src/lib/dialogs/node-lock.dialog.ts index dcbbdd7a2d..604d8e89b3 100644 --- a/lib/content-services/src/lib/dialogs/node-lock.dialog.ts +++ b/lib/content-services/src/lib/dialogs/node-lock.dialog.ts @@ -15,7 +15,7 @@ * limitations under the License. */ -import moment from 'moment-es6'; +import moment from 'moment'; import { Component, Inject, OnInit, Optional, ViewEncapsulation } from '@angular/core'; import { MAT_DIALOG_DATA, MatDialogRef } from '@angular/material/dialog'; diff --git a/lib/content-services/src/lib/document-list/components/document-list.component.ts b/lib/content-services/src/lib/document-list/components/document-list.component.ts index 457d5a13ee..8f1bae2c7c 100644 --- a/lib/content-services/src/lib/document-list/components/document-list.component.ts +++ b/lib/content-services/src/lib/document-list/components/document-list.component.ts @@ -19,7 +19,7 @@ /* eslint-disable @typescript-eslint/naming-convention */ import { - AfterContentInit, Component, ContentChild, ElementRef, EventEmitter, HostListener, Input, NgZone, + AfterContentInit, Component, ContentChild, ElementRef, EventEmitter, HostListener, Input, OnChanges, OnDestroy, OnInit, Output, SimpleChanges, ViewChild, ViewEncapsulation } from '@angular/core'; @@ -63,11 +63,16 @@ import { RowFilter } from '../data/row-filter.model'; import { DocumentListService } from '../services/document-list.service'; import { DocumentLoaderNode } from '../models/document-folder.model'; import { takeUntil } from 'rxjs/operators'; +import { ADF_DOCUMENT_PARENT_COMPONENT } from './document-list.token'; @Component({ selector: 'adf-document-list', templateUrl: './document-list.component.html', styleUrls: ['./document-list.component.scss'], + providers:[{ + provide: ADF_DOCUMENT_PARENT_COMPONENT, + useExisting: DocumentListComponent + }], encapsulation: ViewEncapsulation.None, host: { class: 'adf-document-list' } }) @@ -352,7 +357,6 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte } constructor(private documentListService: DocumentListService, - private ngZone: NgZone, private elementRef: ElementRef, private appConfig: AppConfigService, private userPreferencesService: UserPreferencesService, @@ -507,10 +511,8 @@ export class DocumentListComponent implements OnInit, OnChanges, OnDestroy, Afte } reload() { - this.ngZone.run(() => { - this.resetSelection(); - this.reloadWithoutResettingSelection(); - }); + this.resetSelection(); + this.reloadWithoutResettingSelection(); } reloadWithoutResettingSelection() { diff --git a/lib/content-services/src/lib/document-list/components/document-list.token.ts b/lib/content-services/src/lib/document-list/components/document-list.token.ts new file mode 100644 index 0000000000..b5b8fc3640 --- /dev/null +++ b/lib/content-services/src/lib/document-list/components/document-list.token.ts @@ -0,0 +1,25 @@ +/*! + * @license + * Copyright 2019 Alfresco Software, Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/* eslint-disable rxjs/no-subject-value */ +/* eslint-disable @typescript-eslint/naming-convention */ + +import { InjectionToken } from '@angular/core'; + +export const ADF_DOCUMENT_PARENT_COMPONENT = new InjectionToken( + 'ADF_DOCUMENT_PARENT_COMPONENT' +); diff --git a/lib/content-services/src/lib/document-list/components/filter-header/filter-header.component.spec.ts b/lib/content-services/src/lib/document-list/components/filter-header/filter-header.component.spec.ts index a9519d090e..bcd7ebfa4c 100644 --- a/lib/content-services/src/lib/document-list/components/filter-header/filter-header.component.spec.ts +++ b/lib/content-services/src/lib/document-list/components/filter-header/filter-header.component.spec.ts @@ -26,6 +26,7 @@ import { SEARCH_QUERY_SERVICE_TOKEN } from './../../../search/search-query-servi import { DocumentListComponent } from './../document-list.component'; import { FilterHeaderComponent } from './filter-header.component'; import { Pagination } from '@alfresco/js-api'; +import { ADF_DOCUMENT_PARENT_COMPONENT } from '../document-list.token'; describe('FilterHeaderComponent', () => { let fixture: ComponentFixture; @@ -52,6 +53,7 @@ describe('FilterHeaderComponent', () => { ContentTestingModule ], providers: [ + { provide: ADF_DOCUMENT_PARENT_COMPONENT, useExisting: DocumentListComponent }, { provide: SearchService, useValue: searchMock }, { provide: SEARCH_QUERY_SERVICE_TOKEN, useClass: SearchHeaderQueryBuilderService }, { provide: DocumentListComponent, useValue: documentListMock }, @@ -121,7 +123,7 @@ describe('FilterHeaderComponent', () => { await fixture.whenStable(); expect(queryBuilder.getActiveFilters().length).toBe(0); - const initialFilterValue = { name: 'pinocchio'}; + const initialFilterValue = { name: 'pinocchio' }; component.value = initialFilterValue; const currentFolderNodeIdChange = new SimpleChange('current-node-id', 'next-node-id', true); component.ngOnChanges({ currentFolderId: currentFolderNodeIdChange }); diff --git a/lib/content-services/src/lib/document-list/components/filter-header/filter-header.component.ts b/lib/content-services/src/lib/document-list/components/filter-header/filter-header.component.ts index 07400f90d8..5c2fbb3c5e 100644 --- a/lib/content-services/src/lib/document-list/components/filter-header/filter-header.component.ts +++ b/lib/content-services/src/lib/document-list/components/filter-header/filter-header.component.ts @@ -17,13 +17,13 @@ import { Component, Inject, OnInit, OnChanges, SimpleChanges, Input, Output, EventEmitter, OnDestroy } from '@angular/core'; import { PaginationModel, DataSorting } from '@alfresco/adf-core'; -import { DocumentListComponent } from '../document-list.component'; import { SEARCH_QUERY_SERVICE_TOKEN } from '../../../search/search-query-service.token'; import { SearchHeaderQueryBuilderService } from '../../../search/services/search-header-query-builder.service'; import { FilterSearch } from './../../../search/models/filter-search.interface'; import { Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { NodePaging, MinimalNode } from '@alfresco/js-api'; +import { ADF_DOCUMENT_PARENT_COMPONENT } from '../document-list.token'; @Component({ selector: 'adf-filter-header', @@ -47,7 +47,7 @@ export class FilterHeaderComponent implements OnInit, OnChanges, OnDestroy { isFilterServiceActive: boolean; private onDestroy$ = new Subject(); - constructor(@Inject(DocumentListComponent) private documentList: DocumentListComponent, + constructor(@Inject(ADF_DOCUMENT_PARENT_COMPONENT) private documentList: any, @Inject(SEARCH_QUERY_SERVICE_TOKEN) private searchFilterQueryBuilder: SearchHeaderQueryBuilderService) { this.isFilterServiceActive = this.searchFilterQueryBuilder.isFilterServiceActive(); } diff --git a/lib/content-services/src/lib/document-list/document-list.module.ts b/lib/content-services/src/lib/document-list/document-list.module.ts index 785e352082..9c9e032d23 100644 --- a/lib/content-services/src/lib/document-list/document-list.module.ts +++ b/lib/content-services/src/lib/document-list/document-list.module.ts @@ -68,4 +68,5 @@ import { SearchModule } from './../search/search.module'; FilterHeaderComponent ] }) -export class DocumentListModule {} +export class DocumentListModule { +} diff --git a/lib/content-services/src/lib/new-version-uploader/new-version-uploader.service.spec.ts b/lib/content-services/src/lib/new-version-uploader/new-version-uploader.service.spec.ts index 8a0be24b00..ac6d01c93c 100644 --- a/lib/content-services/src/lib/new-version-uploader/new-version-uploader.service.spec.ts +++ b/lib/content-services/src/lib/new-version-uploader/new-version-uploader.service.spec.ts @@ -101,7 +101,7 @@ describe('NewVersionUploaderService', () => { spyOn(contentService, 'hasAllowableOperations').and.returnValue(true); spyOn(service.versionsApi, 'listVersionHistory').and.returnValue(Promise.resolve({ list: { entries: [{ entry: '2' }] } - })); + } as any)); mockNewVersionUploaderDialogData = { node: mockNode, file: mockFile @@ -115,7 +115,7 @@ describe('NewVersionUploaderService', () => { data: { file: mockFile, node: mockNode, currentVersion: '2', showComments: true, allowDownload: true, showVersionsOnly: undefined }, panelClass: ['adf-new-version-uploader-dialog', 'adf-new-version-uploader-dialog-upload'], width: '630px' - }); + } as any); })); it('Should override default dialog panelClass', fakeAsync(() => { @@ -129,7 +129,7 @@ describe('NewVersionUploaderService', () => { data: { file: mockFile, node: mockNode, currentVersion: '2', showComments: true, allowDownload: true, showVersionsOnly: undefined }, panelClass: 'adf-custom-class', width: '500px' - }); + } as any); })); it('Should set dialog height', fakeAsync(() => { @@ -143,7 +143,7 @@ describe('NewVersionUploaderService', () => { panelClass: ['adf-new-version-uploader-dialog', 'adf-new-version-uploader-dialog-upload'], width: '630px', height: '600px' - }); + } as any); })); it('Should not override dialog configuration, if dialog configuration is empty', fakeAsync(() => { @@ -154,7 +154,7 @@ describe('NewVersionUploaderService', () => { data: { file: mockFile, node: mockNode, currentVersion: '2', showComments: true, allowDownload: true, showVersionsOnly: undefined }, panelClass: ['adf-new-version-uploader-dialog', 'adf-new-version-uploader-dialog-upload'], width: '630px' - }); + } as any); })); it('Should dialog add list css class if showVersionsOnly is true', fakeAsync(() => { @@ -169,7 +169,7 @@ describe('NewVersionUploaderService', () => { data: { file: mockFile, node: mockNode, currentVersion: '2', showComments: true, allowDownload: true, showVersionsOnly: true }, panelClass: ['adf-new-version-uploader-dialog', 'adf-new-version-uploader-dialog-list'], width: '630px' - }); + } as any); })); }); @@ -181,7 +181,7 @@ describe('NewVersionUploaderService', () => { spyOn(contentService, 'hasAllowableOperations').and.returnValue(true); spyOn(service.versionsApi, 'listVersionHistory').and.returnValue(Promise.resolve({ list: { entries: [{ entry: '2' }] } - })); + }) as any); mockNewVersionUploaderDialogData = { node: mockNode, file: mockFile diff --git a/lib/content-services/src/lib/permission-manager/components/permission-list/permission-list.component.html b/lib/content-services/src/lib/permission-manager/components/permission-list/permission-list.component.html index b30c7bb449..661a30d5be 100644 --- a/lib/content-services/src/lib/permission-manager/components/permission-list/permission-list.component.html +++ b/lib/content-services/src/lib/permission-manager/components/permission-list/permission-list.component.html @@ -1,5 +1,5 @@ -

+
diff --git a/lib/content-services/src/lib/permission-manager/components/permission-list/permission-list.component.spec.ts b/lib/content-services/src/lib/permission-manager/components/permission-list/permission-list.component.spec.ts index 0aa7ece7e3..b6e6941c01 100644 --- a/lib/content-services/src/lib/permission-manager/components/permission-list/permission-list.component.spec.ts +++ b/lib/content-services/src/lib/permission-manager/components/permission-list/permission-list.component.spec.ts @@ -16,7 +16,7 @@ */ import { NodesApiService, SearchService, setupTestBed } from '@alfresco/adf-core'; -import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; +import { ComponentFixture, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { TranslateModule } from '@ngx-translate/core'; import { of, throwError } from 'rxjs'; @@ -128,7 +128,7 @@ describe('PermissionListComponent', () => { .toBe('PERMISSION_MANAGER.LABELS.INHERITED-SUBTITLE'); }); - it('should toggle the inherited button', fakeAsync(() => { + it('should toggle the inherited button', async () => { getNodeSpy.and.returnValue(of(fakeNodeInheritedOnly)); component.ngOnInit(); @@ -152,7 +152,7 @@ describe('PermissionListComponent', () => { .toBe('PERMISSION_MANAGER.LABELS.INHERITED-PERMISSIONS PERMISSION_MANAGER.LABELS.OFF'); expect(element.querySelector('span[title="total"]').textContent.trim()) .toBe('PERMISSION_MANAGER.LABELS.INHERITED-SUBTITLE'); - })); + }); it('should not toggle inherited button for read only users', async () => { getNodeSpy.and.returnValue(of(fakeReadOnlyNodeInherited)); @@ -186,7 +186,7 @@ describe('PermissionListComponent', () => { }); - describe('locally set permission', () => { + describe('locally set permission', () => { beforeEach(() => { getNodeSpy.and.returnValue(of(fakeLocalPermission)); }); diff --git a/lib/content-services/src/lib/permission-manager/components/user-role-column/user-role-column.component.ts b/lib/content-services/src/lib/permission-manager/components/user-role-column/user-role-column.component.ts index 9902f5d916..589d75af5b 100644 --- a/lib/content-services/src/lib/permission-manager/components/user-role-column/user-role-column.component.ts +++ b/lib/content-services/src/lib/permission-manager/components/user-role-column/user-role-column.component.ts @@ -19,33 +19,35 @@ import { Component, EventEmitter, Input, Output } from '@angular/core'; import { RoleModel } from '../../models/role.model'; @Component({ - selector: 'adf-user-role-column', - template: ` - - - - {{ role.label | adfLocalizedRole }} - - - + selector: 'adf-user-role-column', + template: ` + + + + {{ role.label | adfLocalizedRole }} + + + - + {{value | adfLocalizedRole}} - `, + `, host: { class: 'adf-user-role-column adf-datatable-content-cell adf-expand-cell-4' }, styles: [ `.adf-role-selector-field { width: 100%; - .mat-form-field { - width: 100%; - max-width: 200px; - } } + + .adf-role-selector-field .mat-form-field { + width: 100%; + max-width: 200px; + } + .adf-readonly-role { padding-left: 0 !important; } diff --git a/lib/content-services/src/lib/search/components/search-control.component.scss b/lib/content-services/src/lib/search/components/search-control.component.scss index 5dbfe6eb10..a3115a577e 100644 --- a/lib/content-services/src/lib/search/components/search-control.component.scss +++ b/lib/content-services/src/lib/search/components/search-control.component.scss @@ -1,11 +1,11 @@ -@import '~@angular/material/theming'; +@use '@angular/material' as mat; $mat-menu-overlay-min-width: 112px !default; // 56 * 2 $mat-menu-overlay-max-width: 280px !default; // 56 * 5 .adf { &-search-result-autocomplete { - @include mat-overridable-elevation(2); + @include mat.overridable-elevation(2); min-width: $mat-menu-overlay-min-width; max-width: $mat-menu-overlay-max-width; diff --git a/lib/content-services/src/lib/search/components/search-filter-chips/search-filter-chips.component.scss b/lib/content-services/src/lib/search/components/search-filter-chips/search-filter-chips.component.scss index c5c8ca9bb8..95231da64d 100644 --- a/lib/content-services/src/lib/search/components/search-filter-chips/search-filter-chips.component.scss +++ b/lib/content-services/src/lib/search/components/search-filter-chips/search-filter-chips.component.scss @@ -1,4 +1,4 @@ -@import '~@angular/material/theming'; +@use '@angular/material' as mat; .adf-search-filter-chip { &.mat-chip { @@ -53,6 +53,6 @@ min-width: 320px; border-radius: 12px; - @include mat-elevation(2); + @include mat.elevation(2); } } diff --git a/lib/content-services/src/lib/search/components/search-form/search-form.component.scss b/lib/content-services/src/lib/search/components/search-form/search-form.component.scss index a8b71d9e55..32a6efea66 100644 --- a/lib/content-services/src/lib/search/components/search-form/search-form.component.scss +++ b/lib/content-services/src/lib/search/components/search-form/search-form.component.scss @@ -1,4 +1,4 @@ -@import '~@angular/material/theming'; +@use '@angular/material' as mat; .adf-search-form { &.mat-button { @@ -37,7 +37,7 @@ } &-menu + * .mat-menu-panel { - @include mat-elevation(2); + @include mat.elevation(2); border-radius: 6px; diff --git a/lib/content-services/src/lib/tag/tag-node-list.component.scss b/lib/content-services/src/lib/tag/tag-node-list.component.scss index ab14d76697..edc2a7e19c 100644 --- a/lib/content-services/src/lib/tag/tag-node-list.component.scss +++ b/lib/content-services/src/lib/tag/tag-node-list.component.scss @@ -20,7 +20,7 @@ font-size: var(--theme-title-font-size); background-repeat: no-repeat; display: inline-block; - fill: currentColor; + fill: currentcolor; height: 20px; width: 20px; color: var(--theme-primary-color-default-contrast) !important; diff --git a/lib/content-services/src/lib/version-manager/version-list.component.spec.ts b/lib/content-services/src/lib/version-manager/version-list.component.spec.ts index cbb034d72c..de95b2c45d 100644 --- a/lib/content-services/src/lib/version-manager/version-list.component.spec.ts +++ b/lib/content-services/src/lib/version-manager/version-list.component.spec.ts @@ -22,7 +22,7 @@ import { VersionListComponent } from './version-list.component'; import { setupTestBed } from '@alfresco/adf-core'; import { MatDialog } from '@angular/material/dialog'; import { of } from 'rxjs'; -import { Node, VersionPaging, VersionEntry } from '@alfresco/js-api'; +import { Node, VersionPaging, VersionEntry, NodeEntry } from '@alfresco/js-api'; import { ContentTestingModule } from '../testing/content.testing.module'; import { TranslateModule } from '@ngx-translate/core'; import { ContentVersionService } from './content-version.service'; @@ -63,7 +63,7 @@ describe('VersionListComponent', () => { component.node = { id: nodeId, allowableOperations: ['update'] } as Node; spyOn(component, 'downloadContent').and.stub(); - spyOn(component['nodesApi'], 'getNode').and.returnValue(Promise.resolve({ entry: { id: 'nodeInfoId' } })); + spyOn(component['nodesApi'], 'getNode').and.returnValue(Promise.resolve(new NodeEntry({ entry: { id: 'nodeInfoId' } }))); }); it('should raise confirmation dialog on delete', () => { @@ -299,7 +299,7 @@ describe('VersionListComponent', () => { fixture.detectChanges(); tick(); - expect(component.restored.emit).toHaveBeenCalledWith({ id: 'nodeInfoId' }); + expect(component.restored.emit).toHaveBeenCalledWith(new Node({ id: 'nodeInfoId' })); })); it('should reload the version list after a version restore', fakeAsync(() => { diff --git a/lib/content-services/src/test.ts b/lib/content-services/src/test.ts index 968367ccd9..f65cd98c51 100644 --- a/lib/content-services/src/test.ts +++ b/lib/content-services/src/test.ts @@ -15,8 +15,8 @@ * limitations under the License. */ -import 'zone.js/dist/zone'; -import 'zone.js/dist/zone-testing'; +import 'zone.js'; +import 'zone.js/testing'; import { getTestBed } from '@angular/core/testing'; import { BrowserDynamicTestingModule, @@ -28,7 +28,9 @@ declare const require: any; // First, initialize the Angular testing environment. getTestBed().initTestEnvironment( BrowserDynamicTestingModule, - platformBrowserDynamicTesting() + platformBrowserDynamicTesting(), { + teardown: { destroyAfterEach: false } +} ); declare const pdfjsLib: any; diff --git a/lib/content-services/tsconfig.lib.prod.json b/lib/content-services/tsconfig.lib.prod.json index 04c0e66277..2a2faa884c 100644 --- a/lib/content-services/tsconfig.lib.prod.json +++ b/lib/content-services/tsconfig.lib.prod.json @@ -4,6 +4,6 @@ "declarationMap": false }, "angularCompilerOptions": { - "enableIvy": false + "compilationMode": "partial" } } diff --git a/lib/core/.storybook/main.js b/lib/core/.storybook/main.js index 0ba498c521..15262367e2 100644 --- a/lib/core/.storybook/main.js +++ b/lib/core/.storybook/main.js @@ -4,7 +4,7 @@ const rootMain = require('../../../.storybook/main'); module.exports = { ...rootMain, - core: { ...rootMain.core, builder: 'webpack4' }, + core: { ...rootMain.core, builder: 'webpack5' }, stories: [ ...rootMain.stories, diff --git a/lib/core/api/ng-package.json b/lib/core/api/ng-package.json index b22f819668..ed278942e8 100644 --- a/lib/core/api/ng-package.json +++ b/lib/core/api/ng-package.json @@ -1,9 +1,6 @@ { "$schema": "../../../node_modules/ng-packagr/ng-package.schema.json", "lib": { - "entryFile": "public-api.ts", - "umdModuleIds": { - "@alfresco/js-api": "@alfresco/js-api" - } + "entryFile": "public-api.ts" } } diff --git a/lib/core/app-config/app-config.service.spec.ts b/lib/core/app-config/app-config.service.spec.ts index c0f1ae26cf..779eb5566d 100644 --- a/lib/core/app-config/app-config.service.spec.ts +++ b/lib/core/app-config/app-config.service.spec.ts @@ -67,7 +67,6 @@ describe('AppConfigService', () => { spyOn(httpClient, 'get').and.returnValue(of(mockResponse)); extensionService = TestBed.inject(ExtensionService); - appConfigService = TestBed.inject(AppConfigService); appConfigService.load(); }); diff --git a/lib/core/card-view/components/card-view-dateitem/card-view-dateitem.component.spec.ts b/lib/core/card-view/components/card-view-dateitem/card-view-dateitem.component.spec.ts index e1e2e6bd32..e3c7cd1454 100644 --- a/lib/core/card-view/components/card-view-dateitem/card-view-dateitem.component.spec.ts +++ b/lib/core/card-view/components/card-view-dateitem/card-view-dateitem.component.spec.ts @@ -18,7 +18,7 @@ import { ComponentFixture, fakeAsync, TestBed } from '@angular/core/testing'; import { By } from '@angular/platform-browser'; import { setupTestBed } from '../../../testing/setup-test-bed'; -import moment from 'moment-es6'; +import moment from 'moment'; import { CardViewDateItemModel } from '../../models/card-view-dateitem.model'; import { CardViewUpdateService } from '../../services/card-view-update.service'; import { CardViewDateItemComponent } from './card-view-dateitem.component'; diff --git a/lib/core/card-view/components/card-view-dateitem/card-view-dateitem.component.ts b/lib/core/card-view/components/card-view-dateitem/card-view-dateitem.component.ts index 2ea33cf062..78ddbb4627 100644 --- a/lib/core/card-view/components/card-view-dateitem/card-view-dateitem.component.ts +++ b/lib/core/card-view/components/card-view-dateitem/card-view-dateitem.component.ts @@ -17,10 +17,9 @@ import { Component, Input, OnDestroy, OnInit, ViewChild, ViewEncapsulation } from '@angular/core'; import { DateAdapter, MAT_DATE_FORMATS } from '@angular/material/core'; -import { DatetimeAdapter, MAT_DATETIME_FORMATS, MatDatetimepicker } from '@mat-datetimepicker/core'; +import { DatetimeAdapter, MAT_DATETIME_FORMATS, MatDatetimepickerComponent } from '@mat-datetimepicker/core'; import { MAT_MOMENT_DATETIME_FORMATS, MomentDatetimeAdapter } from '@mat-datetimepicker/moment'; -import moment from 'moment-es6'; -import { Moment } from 'moment'; +import moment, { Moment } from 'moment'; import { CardViewDateItemModel } from '../../models/card-view-dateitem.model'; import { CardViewUpdateService } from '../../services/card-view-update.service'; import { UserPreferencesService, UserPreferenceValues } from '../../../services/user-preferences.service'; @@ -60,7 +59,7 @@ export class CardViewDateItemComponent extends BaseCardView; + public datepicker: MatDatetimepickerComponent; valueDate: Moment; dateFormat: string; diff --git a/lib/core/card-view/components/card-view-textitem/card-view-textitem.component.html b/lib/core/card-view/components/card-view-textitem/card-view-textitem.component.html index b85643b022..137de56463 100644 --- a/lib/core/card-view/components/card-view-textitem/card-view-textitem.component.html +++ b/lib/core/card-view/components/card-view-textitem/card-view-textitem.component.html @@ -21,9 +21,9 @@ [attr.data-automation-id]="'card-textitem-value-' + property.key">