From 0dd327d6630ef19484753c8f94e62b4c6955e751 Mon Sep 17 00:00:00 2001 From: Charissa Miller <48832936+clemiller@users.noreply.github.com> Date: Mon, 22 Jul 2024 10:17:27 -0400 Subject: [PATCH 1/6] replace is_js --- nav-app/package-lock.json | 6 ---- nav-app/package.json | 1 - .../src/app/datatable/data-table.component.ts | 4 +-- .../src/app/services/viewmodels.service.ts | 10 +++--- .../app/svg-export/svg-export.component.ts | 4 +-- nav-app/src/app/tabs/tabs.component.ts | 4 +-- nav-app/src/app/utils/utils.ts | 34 +++++++++++++++++++ 7 files changed, 45 insertions(+), 18 deletions(-) create mode 100644 nav-app/src/app/utils/utils.ts diff --git a/nav-app/package-lock.json b/nav-app/package-lock.json index 2f16fffb5..e93b3e988 100644 --- a/nav-app/package-lock.json +++ b/nav-app/package-lock.json @@ -28,7 +28,6 @@ "d3": "^7.8.5", "d3-svg-legend": "^2.25.6", "file-saver": "^2.0.5", - "is_js": "^0.9.0", "load-json-file": "^7.0.1", "mathjs": "^12.4.2", "ngx-color-picker": "^16.0.0", @@ -9473,11 +9472,6 @@ "node": ">= 10" } }, - "node_modules/is_js": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/is_js/-/is_js-0.9.0.tgz", - "integrity": "sha512-8Y5EHSH+TonfUHX2g3pMJljdbGavg55q4jmHzghJCdqYDbdNROC8uw/YFQwIRCRqRJT1EY3pJefz+kglw+o7sg==" - }, "node_modules/is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", diff --git a/nav-app/package.json b/nav-app/package.json index a420a3795..2bdafba3d 100644 --- a/nav-app/package.json +++ b/nav-app/package.json @@ -35,7 +35,6 @@ "d3": "^7.8.5", "d3-svg-legend": "^2.25.6", "file-saver": "^2.0.5", - "is_js": "^0.9.0", "load-json-file": "^7.0.1", "mathjs": "^12.4.2", "ngx-color-picker": "^16.0.0", diff --git a/nav-app/src/app/datatable/data-table.component.ts b/nav-app/src/app/datatable/data-table.component.ts index fa9506f8b..056dfe208 100755 --- a/nav-app/src/app/datatable/data-table.component.ts +++ b/nav-app/src/app/datatable/data-table.component.ts @@ -7,8 +7,8 @@ import { ViewModel } from '../classes'; import { DomSanitizer } from '@angular/platform-browser'; import { Subscription } from 'rxjs'; import * as Excel from 'exceljs/dist/exceljs.min.js'; -import * as is from 'is_js'; import tinycolor from 'tinycolor2'; +import { isIE } from '../utils/utils'; @Component({ selector: 'DataTable', @@ -104,7 +104,7 @@ export class DataTableComponent implements AfterViewInit, OnDestroy { * @param filename save as filename */ public saveBlob(blob, filename): void { - if (is.ie()) { + if (isIE()) { // internet explorer const nav = window.navigator as any; nav.msSaveOrOpenBlob(blob, filename); diff --git a/nav-app/src/app/services/viewmodels.service.ts b/nav-app/src/app/services/viewmodels.service.ts index 4cd26b64a..13398541e 100755 --- a/nav-app/src/app/services/viewmodels.service.ts +++ b/nav-app/src/app/services/viewmodels.service.ts @@ -2,7 +2,7 @@ import { EventEmitter, Injectable, Output } from '@angular/core'; import { Gradient, TechniqueVM, ViewModel } from '../classes'; import { DataService } from './data.service'; import { evaluate } from 'mathjs'; -import * as is from 'is_js'; +import { isBoolean, isNumber } from '../utils/utils'; @Injectable({ providedIn: 'root', @@ -98,10 +98,10 @@ export class ViewModelsService { // if it didn't except after this, it evaluated to a single result console.debug('score expression evaluated to single result to be applied to all techniques'); - if (is.boolean(result)) { + if (isBoolean(result)) { // boolean to binary result = result ? '1' : '0'; - } else if (is.not.number(result)) { + } else if (!isNumber(result)) { // unexpected user input throw Error('math result ( ' + result + ' ) is not a number'); } @@ -139,10 +139,10 @@ export class ViewModelsService { // did at least one technique have a score for this technique? if (misses < scoreVariables.size) { let mathResult = evaluate(opSettings.scoreExpression, scope); - if (is.boolean(mathResult)) { + if (isBoolean(mathResult)) { // boolean to binary mathResult = mathResult ? '1' : '0'; - } else if (is.not.number(mathResult)) { + } else if (!isNumber(mathResult)) { // unexpected user input throw Error('math result ( ' + mathResult + ' ) is not a number'); } diff --git a/nav-app/src/app/svg-export/svg-export.component.ts b/nav-app/src/app/svg-export/svg-export.component.ts index 701f6b741..665dd069d 100644 --- a/nav-app/src/app/svg-export/svg-export.component.ts +++ b/nav-app/src/app/svg-export/svg-export.component.ts @@ -5,7 +5,7 @@ import { ConfigService } from '../services/config.service'; import { DataService } from '../services/data.service'; import { RenderableMatrix, RenderableTactic, RenderableTechnique } from './renderable-objects'; import tinycolor from 'tinycolor2'; -import * as is from 'is_js'; +import { isIE } from '../utils/utils'; declare var d3: any; //d3js @Component({ @@ -62,7 +62,7 @@ export class SvgExportComponent implements OnInit { // browser compatibility public get isIE(): boolean { - return is.ie(); + return isIE(); } // getters for visibility of SVG header sections diff --git a/nav-app/src/app/tabs/tabs.component.ts b/nav-app/src/app/tabs/tabs.component.ts index ae23ea7cf..c0c117063 100755 --- a/nav-app/src/app/tabs/tabs.component.ts +++ b/nav-app/src/app/tabs/tabs.component.ts @@ -11,9 +11,9 @@ import { MatSnackBar } from '@angular/material/snack-bar'; import { HttpClient } from '@angular/common/http'; import { ChangelogComponent } from '../changelog/changelog.component'; import { Subscription, forkJoin } from 'rxjs'; -import * as is from 'is_js'; import * as globals from '../utils/globals'; import { LayerInformationComponent } from '../layer-information/layer-information.component'; +import { isSafari } from '../utils/utils'; @Component({ selector: 'tabs', @@ -94,7 +94,7 @@ export class TabsComponent implements AfterViewInit { } ngAfterViewInit(): void { - if (is.safari('<=13')) { + if (isSafari('<=13')) { // open safari version incompatibility warning this.safariDialogRef = this.dialog.open(this.safariWarning, { width: '350px', diff --git a/nav-app/src/app/utils/utils.ts b/nav-app/src/app/utils/utils.ts new file mode 100644 index 000000000..76d8bfbdf --- /dev/null +++ b/nav-app/src/app/utils/utils.ts @@ -0,0 +1,34 @@ +// utils.ts +let comparatorFn = { + '<': function(a, b) { return a < b; }, + '<=': function(a, b) { return a <= b; }, + '>': function(a, b) { return a > b; }, + '>=': function(a, b) { return a >= b; } +}; + +export function isBoolean(value: any): boolean { + return typeof value === 'boolean'; +} + +export function isNumber(value: any): boolean { + return typeof value === 'number'; +} + +export function isIE(): boolean { + let userAgent = (window.navigator && window.navigator.userAgent || '').toLowerCase(); + let match = userAgent.match(/(?:msie |trident.+?; rv:)(\d+)/); + return match !== null; +} + +export function isSafari(compRange): boolean { + function compare(version, comp) { + let str = (comp + ''); + let n = +(str.match(/\d+/) || NaN); + let op = str.match(/^[<>]=?|/)[0]; + return comparatorFn[op] ? comparatorFn[op](version, n) : (version == n || n !== n); + } + + let userAgent = (window.navigator && window.navigator.userAgent || '').toLowerCase(); + var match = userAgent.match(/version\/(\d+).+?safari/); + return match !== null && compare(match[1], compRange); +} From a8c91056a4dc3db23cd8273d5825ab002c8ae6ff Mon Sep 17 00:00:00 2001 From: Charissa Miller <48832936+clemiller@users.noreply.github.com> Date: Wed, 24 Jul 2024 09:06:45 -0400 Subject: [PATCH 2/6] detect-browser --- nav-app/package-lock.json | 6 ++++++ nav-app/package.json | 1 + nav-app/src/app/utils/utils.ts | 12 ++++++------ 3 files changed, 13 insertions(+), 6 deletions(-) diff --git a/nav-app/package-lock.json b/nav-app/package-lock.json index e93b3e988..c0cb837ca 100644 --- a/nav-app/package-lock.json +++ b/nav-app/package-lock.json @@ -27,6 +27,7 @@ "core-js": "^3.31.1", "d3": "^7.8.5", "d3-svg-legend": "^2.25.6", + "detect-browser": "^5.3.0", "file-saver": "^2.0.5", "load-json-file": "^7.0.1", "mathjs": "^12.4.2", @@ -7708,6 +7709,11 @@ "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/detect-browser": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/detect-browser/-/detect-browser-5.3.0.tgz", + "integrity": "sha512-53rsFbGdwMwlF7qvCt0ypLM5V5/Mbl0szB7GPN8y9NCcbknYOeVVXdrXEq+90IwAfrrzt6Hd+u2E2ntakICU8w==" + }, "node_modules/detect-node": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/detect-node/-/detect-node-2.1.0.tgz", diff --git a/nav-app/package.json b/nav-app/package.json index 2bdafba3d..caa2b160c 100644 --- a/nav-app/package.json +++ b/nav-app/package.json @@ -34,6 +34,7 @@ "core-js": "^3.31.1", "d3": "^7.8.5", "d3-svg-legend": "^2.25.6", + "detect-browser": "^5.3.0", "file-saver": "^2.0.5", "load-json-file": "^7.0.1", "mathjs": "^12.4.2", diff --git a/nav-app/src/app/utils/utils.ts b/nav-app/src/app/utils/utils.ts index 76d8bfbdf..3fb73bd1a 100644 --- a/nav-app/src/app/utils/utils.ts +++ b/nav-app/src/app/utils/utils.ts @@ -1,4 +1,6 @@ // utils.ts +import { detect } from "detect-browser"; + let comparatorFn = { '<': function(a, b) { return a < b; }, '<=': function(a, b) { return a <= b; }, @@ -15,9 +17,8 @@ export function isNumber(value: any): boolean { } export function isIE(): boolean { - let userAgent = (window.navigator && window.navigator.userAgent || '').toLowerCase(); - let match = userAgent.match(/(?:msie |trident.+?; rv:)(\d+)/); - return match !== null; + const browser = detect(); + return browser.name == 'ie'; } export function isSafari(compRange): boolean { @@ -28,7 +29,6 @@ export function isSafari(compRange): boolean { return comparatorFn[op] ? comparatorFn[op](version, n) : (version == n || n !== n); } - let userAgent = (window.navigator && window.navigator.userAgent || '').toLowerCase(); - var match = userAgent.match(/version\/(\d+).+?safari/); - return match !== null && compare(match[1], compRange); + const browser = detect(); + return browser.name == 'safari' && compare(browser.version.split('.')[0], compRange); } From 426ce2743276ecd20afcc10181d96eca111bfc8c Mon Sep 17 00:00:00 2001 From: Charissa Miller <48832936+clemiller@users.noreply.github.com> Date: Wed, 24 Jul 2024 09:24:58 -0400 Subject: [PATCH 3/6] fix code issues --- nav-app/src/app/tabs/tabs.component.spec.ts | 1 - nav-app/src/app/utils/utils.ts | 6 +++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/nav-app/src/app/tabs/tabs.component.spec.ts b/nav-app/src/app/tabs/tabs.component.spec.ts index 907f1cc34..4c1b90b6e 100755 --- a/nav-app/src/app/tabs/tabs.component.spec.ts +++ b/nav-app/src/app/tabs/tabs.component.spec.ts @@ -11,7 +11,6 @@ import { MatTabsModule } from "@angular/material/tabs"; import { ConfigService } from "../services/config.service"; import * as MockData from '../../tests/utils/mock-data'; import * as MockLayers from '../../tests/utils/mock-layers'; -import * as is from 'is_js'; import { of } from "rxjs"; import { ChangelogComponent } from "../changelog/changelog.component"; import { HelpComponent } from "../help/help.component"; diff --git a/nav-app/src/app/utils/utils.ts b/nav-app/src/app/utils/utils.ts index 3fb73bd1a..ee1114021 100644 --- a/nav-app/src/app/utils/utils.ts +++ b/nav-app/src/app/utils/utils.ts @@ -24,9 +24,9 @@ export function isIE(): boolean { export function isSafari(compRange): boolean { function compare(version, comp) { let str = (comp + ''); - let n = +(str.match(/\d+/) || NaN); - let op = str.match(/^[<>]=?|/)[0]; - return comparatorFn[op] ? comparatorFn[op](version, n) : (version == n || n !== n); + let n = +(/\d+/.exec(str) || NaN); + let op = /^[<>]=?|/.exec(str)[0]; + return comparatorFn[op] ? comparatorFn[op](version, n) : (version == n || Number.isNaN(n)); } const browser = detect(); From 6585b742f7f86fc776c740ff7409e88867a0a2f0 Mon Sep 17 00:00:00 2001 From: Charissa Miller <48832936+clemiller@users.noreply.github.com> Date: Wed, 24 Jul 2024 09:33:45 -0400 Subject: [PATCH 4/6] update tests to use util fns --- nav-app/src/app/tabs/tabs.component.spec.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/nav-app/src/app/tabs/tabs.component.spec.ts b/nav-app/src/app/tabs/tabs.component.spec.ts index 4c1b90b6e..ec6684ffb 100755 --- a/nav-app/src/app/tabs/tabs.component.spec.ts +++ b/nav-app/src/app/tabs/tabs.component.spec.ts @@ -11,6 +11,7 @@ import { MatTabsModule } from "@angular/material/tabs"; import { ConfigService } from "../services/config.service"; import * as MockData from '../../tests/utils/mock-data'; import * as MockLayers from '../../tests/utils/mock-layers'; +import * as utils from '../utils/utils'; import { of } from "rxjs"; import { ChangelogComponent } from "../changelog/changelog.component"; import { HelpComponent } from "../help/help.component"; @@ -94,14 +95,14 @@ describe('TabsComponent', () => { describe('ngAfterViewInit', () => { it('should open Safari warning for Safari version <= 13', () => { - spyOn(is, 'safari').withArgs('<=13').and.returnValue(true); + spyOn(utils, 'isSafari').withArgs('<=13').and.returnValue(true); let dialogSpy = spyOn(dialog, 'open'); component.ngAfterViewInit(); expect(dialogSpy).toHaveBeenCalled(); }); it('should not open Safari warning for Safari version > 13 or non-Safari browsers', () => { - spyOn(is, 'safari').withArgs('<=13').and.returnValue(false); + spyOn(utils, 'isSafari').withArgs('<=13').and.returnValue(false); let dialogSpy = spyOn(dialog, 'open'); component.ngAfterViewInit(); expect(dialogSpy).not.toHaveBeenCalled(); From db368542bac30dc9bb3a62dc0a672f9632443d20 Mon Sep 17 00:00:00 2001 From: Charissa Miller <48832936+clemiller@users.noreply.github.com> Date: Wed, 24 Jul 2024 09:44:42 -0400 Subject: [PATCH 5/6] update utils regex --- nav-app/src/app/tabs/tabs.component.spec.ts | 16 ---------------- nav-app/src/app/utils/utils.ts | 2 +- 2 files changed, 1 insertion(+), 17 deletions(-) diff --git a/nav-app/src/app/tabs/tabs.component.spec.ts b/nav-app/src/app/tabs/tabs.component.spec.ts index ec6684ffb..11aa8171b 100755 --- a/nav-app/src/app/tabs/tabs.component.spec.ts +++ b/nav-app/src/app/tabs/tabs.component.spec.ts @@ -93,22 +93,6 @@ describe('TabsComponent', () => { }); }); - describe('ngAfterViewInit', () => { - it('should open Safari warning for Safari version <= 13', () => { - spyOn(utils, 'isSafari').withArgs('<=13').and.returnValue(true); - let dialogSpy = spyOn(dialog, 'open'); - component.ngAfterViewInit(); - expect(dialogSpy).toHaveBeenCalled(); - }); - - it('should not open Safari warning for Safari version > 13 or non-Safari browsers', () => { - spyOn(utils, 'isSafari').withArgs('<=13').and.returnValue(false); - let dialogSpy = spyOn(dialog, 'open'); - component.ngAfterViewInit(); - expect(dialogSpy).not.toHaveBeenCalled(); - }); - }); - describe('loadTabs', () => { it('should load bundle when all fragment values are provided', async () => { let bundleURL = 'testbundleurl'; diff --git a/nav-app/src/app/utils/utils.ts b/nav-app/src/app/utils/utils.ts index ee1114021..a371049d1 100644 --- a/nav-app/src/app/utils/utils.ts +++ b/nav-app/src/app/utils/utils.ts @@ -25,7 +25,7 @@ export function isSafari(compRange): boolean { function compare(version, comp) { let str = (comp + ''); let n = +(/\d+/.exec(str) || NaN); - let op = /^[<>]=?|/.exec(str)[0]; + let op = /^[<>]=?/.exec(str)[0]; return comparatorFn[op] ? comparatorFn[op](version, n) : (version == n || Number.isNaN(n)); } From a6caf955a1d0ff11bba615a497effae85910dd1f Mon Sep 17 00:00:00 2001 From: Charissa Miller <48832936+clemiller@users.noreply.github.com> Date: Wed, 24 Jul 2024 09:46:43 -0400 Subject: [PATCH 6/6] remove unused import --- nav-app/src/app/tabs/tabs.component.spec.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/nav-app/src/app/tabs/tabs.component.spec.ts b/nav-app/src/app/tabs/tabs.component.spec.ts index 11aa8171b..6f35c2dcc 100755 --- a/nav-app/src/app/tabs/tabs.component.spec.ts +++ b/nav-app/src/app/tabs/tabs.component.spec.ts @@ -11,7 +11,6 @@ import { MatTabsModule } from "@angular/material/tabs"; import { ConfigService } from "../services/config.service"; import * as MockData from '../../tests/utils/mock-data'; import * as MockLayers from '../../tests/utils/mock-layers'; -import * as utils from '../utils/utils'; import { of } from "rxjs"; import { ChangelogComponent } from "../changelog/changelog.component"; import { HelpComponent } from "../help/help.component";