From 1b4296050fd508c13e72d549648e75ed132159ba Mon Sep 17 00:00:00 2001 From: Kevin Gilland Date: Tue, 25 Oct 2022 07:57:54 -0600 Subject: [PATCH] 1.0.0 (#3) * ci: adding package-lock.json and dependency on grid-js * chore: Port of GARSConstants.java * chore: initial port of GridLine.java * fix: updating to conform to typescript * ci: porting of BandLettersRange.java * chore: port of BandNumberRange.java * chore: port of GARSLabeler.java * chore: port of Grid.java * chore: port of GridLabel.java * chore: port of GridLabeler.java * chore: port of GridRange.java * chore: port of Grids.java * chore: port of GridType.java * chore: port of ZoomGrids.java * chore: port of GARSProperties.java * chore: port of GARS.java * chore: port of GARSUtils.java * fix: fixing compile errors * fix: fixing compile errors in BandLettersRange.ts * fix: fixing compile errors in BandNumberRange * fix: correcting some compile errors for GARSLabeler and GridLabeler. Sill broken. * fix: fixing some compile errors in Grid. Still broken * fix: fixing compile errors in GridLabel * refactor: making iterators easier to use * fix: making iterator easier to use in GridRange and fixing compile error in BandLettersRange * fix: correcting some compile errors in Grids. Still broken. * fix: fixing some compile errors in GARS. Still broken. * feat: upgradeing grid-js to 0.0.1-beta.2 * fix: correcting constructors. still broken. * chore: port of gars.properties * ci: adding build support directory * fix: correcting compile errors * fix: correcting compile errors in Grids.ts * feat: bump of grid-js to 0.0.0-beta.7 * fix: fixing compile errors of GridTypeUtils * fix: fixing compile errors in GARSUtils * fix: fixing compile errors of GARS * refactor: formatting * refactor: lint cleanup * test: adding stub of a test * refactor: renaming test * refactor: renaming test * config: exclding node_modules for tsconfig * ci: looking for *.spec.* for tests * refactor: changing how lib will be packaged * feat: adding tsconfig recommented * refactor: moving src to lib * ci: removing test from dist * test: trying to get tests working, and failing again * ci: pointing to dist for main and types * test: finally getting tests running, but they are still failing * test: getting band value working * test: getting band letters tested * test: getting quadrants tested * test: testing keypads * chore: port of GARSTest.java testParse. test is failing * test: commenting out gars equals checks for now * test: port of GARSTest parse invalid * test: port of GARSTest coordinate. test is failing * test: port of GARSTest 30 minute parse. test is failing * test: uncommenting out failing parts of the test parse * ci: adding exports for the package * feat: adding sprintf-js dependency. adding bitwise opertations for converting to gars from lat/lon * test: getting parse test working for GARS * fix: correcting reversed iterator logic * fix: More iterator work, test now times out * test: increasing 30 minute test to timeout after 20 seconds * refactor: code formatting * ci: removing dependency on winston * feat: bump to 0.0.0-beta.20 grid-js * fix: appending resources/ to gars.properties filename * feat: bump to 0.0.0-beta.22 of grid-js * chore: adding CHANGELOG * 0.0.1-beta.1 * feat: bump to rc.0 of grid-js * ci: trying to fix prettier action * ci: removing prettier action and moving it to a lint action * test: increasing test timeout to 30s * feat: bump to version 1.1.0 of grid-js * doc: updating README to inclue Properties * doc: Updating reference to remote dependencies * doc: Adding examples to the readme, taken from Readme.spec.ts * ci: update fix:prrettier task * feat: bump to version 1.2.0 of grid-js * test: removed timeout in the test class in favor of the one in the config * test: adding test for GridLine * linet: fixing lint errors * test: adding BandLettersRange test * test: adding BandNumberRange test * refactor: rremoving Comparable * fix: getting precision correctly * test: adding Grid test * test: adding GridRange test * fix: correcting construction logic for enabled grids * test: adding Grids test * test: adding GridTypeUtils test * lint: adding linter exception for prefer-for-of * fix: adding comparable to Grid * lint: fixing lint issues * doc: changing java to javascript * doc: renaming color to gars * doc: removed @author * 0.1.0 * 0.1.1-0 * 0.1.1-beta.0 * feat: upgrade grid-js to 2.0.1-beta.0 * 0.1.1-beta.1 * feat: bump to grid-js version 2.0.1-beta.1 * 0.1.1-beta.2 * fix: using object.keys to comply with es2015 * 0.1.1-beta.3 * ci: removing resources directory * build: allowing for importing of json * 0.1.1-beta.4 * ci: removing resources * 0.1.1-beta.5 * test: adding GARSProperties test * 0.1.1-beta.6 * fix: correcting null/undefined checks * 0.1.1-beta.7 * fix: corrrecting null/undefined checks again * 0.1.1-beta.8 * feat: bump to 2.0.1-beta.5 of grid-js * 0.1.1-beta.9 * feat: bump to latest version of grid-js * 0.1.1-beta.10 * fix: correcting getColor to call base * fix: removing circular dependency * fix: setting color correctly * fix: setting width correctly * test: adding zoom grids test and gars labeler test * chore: removing incorrect comment * feat: bump grid-js 2.0.0 * doc: changing engine requirement for npm to 6.x * 1.0.0 --- .github/ISSUE_TEMPLATE/bug_report.md | 4 +- .github/ISSUE_TEMPLATE/config.yml | 2 +- .github/workflows/build-test.yml | 4 +- .mocharc.js | 3 +- .npmignore | 1 + README.md | 74 +++- lib/GARS.ts | 14 +- lib/GARSConstants.ts | 2 +- lib/GARSUtils.ts | 76 +---- lib/features/GridLine.ts | 8 +- lib/grid/BandLettersRange.ts | 2 +- lib/grid/BandNumberRange.ts | 2 +- lib/grid/GARSLabeler.ts | 2 +- lib/grid/Grid.ts | 83 +++-- lib/grid/GridLabel.ts | 2 +- lib/grid/GridLabeler.ts | 2 +- lib/grid/GridRange.ts | 4 +- lib/grid/GridType.ts | 2 +- lib/grid/GridTypeUtils.ts | 38 ++- lib/grid/Grids.ts | 24 +- lib/grid/ZoomGrids.ts | 2 +- lib/property/GARSProperties.ts | 17 +- package-lock.json | 484 ++++++++++++++------------- package.json | 19 +- resources/gars.json | 119 +++++++ resources/gars.properties | 101 ------ test/GARS.spec.ts | 1 - test/Readme.spec.ts | 2 +- test/features/GridLine.spec.ts | 28 ++ test/grid/BandLettersRange.spec.ts | 16 + test/grid/BandNumberRange.spec.ts | 16 + test/grid/GARSLabeler.spec.ts | 39 +++ test/grid/Grid.spec.ts | 26 ++ test/grid/GridRange.spec.ts | 17 + test/grid/GridTypeUtils.spec.ts | 19 ++ test/grid/Grids.spec.ts | 64 ++++ test/grid/ZoomGrids.spec.ts | 17 + test/property/GARSProperties.spec.ts | 20 ++ tsconfig.json | 1 + tslint.json | 3 +- 40 files changed, 833 insertions(+), 527 deletions(-) create mode 100644 resources/gars.json delete mode 100644 resources/gars.properties create mode 100644 test/features/GridLine.spec.ts create mode 100644 test/grid/BandLettersRange.spec.ts create mode 100644 test/grid/BandNumberRange.spec.ts create mode 100644 test/grid/GARSLabeler.spec.ts create mode 100644 test/grid/Grid.spec.ts create mode 100644 test/grid/GridRange.spec.ts create mode 100644 test/grid/GridTypeUtils.spec.ts create mode 100644 test/grid/Grids.spec.ts create mode 100644 test/grid/ZoomGrids.spec.ts create mode 100644 test/property/GARSProperties.spec.ts diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 01d2a4b..4526044 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -11,8 +11,8 @@ Please fill out as much known and relevant information as possible. #### Version Information: - * Color Javascript Version: - * Color Javascript Source: (e.g. Central Repository, Release, Source Code Build) + * GARS Javascript Version: + * GARS Javascript Source: (e.g. Central Repository, Release, Source Code Build) * IDE Name & Version: * NPM Version: (npm --version) * Node Version: (node --version) diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 519e2d5..5337dd9 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -2,5 +2,5 @@ blank_issues_enabled: false contact_links: - name: Discussions - url: https://github.com/ngageoint/color-js/discussions + url: https://github.com/ngageoint/gars-js/discussions about: Questions, Feature Requests, Feedback, Conversations diff --git a/.github/workflows/build-test.yml b/.github/workflows/build-test.yml index ef58f29..41b94bf 100644 --- a/.github/workflows/build-test.yml +++ b/.github/workflows/build-test.yml @@ -11,7 +11,7 @@ jobs: - name: Checkout Repository uses: actions/checkout@v1 - - name: Install + - name: Install Dependencies run: npm ci - name: Build @@ -26,7 +26,7 @@ jobs: - name: Coverage run: npm run coverage - - name: Coveralls + - name: Upload Coverage uses: coverallsapp/github-action@master if: github.ref_name == 'master' with: diff --git a/.mocharc.js b/.mocharc.js index 9e1cb0b..7b0fa3e 100644 --- a/.mocharc.js +++ b/.mocharc.js @@ -5,5 +5,6 @@ module.exports = { ignore: ['node_modules/**'], recursive: true, require: ['ts-node/register'], - spec: ["test/**/*.spec.*"] + spec: ["test/**/*.spec.*"], + timeout: '30000' }; \ No newline at end of file diff --git a/.npmignore b/.npmignore index ba1926b..0bfb16b 100644 --- a/.npmignore +++ b/.npmignore @@ -3,6 +3,7 @@ docs/ lib/ test/ +resources/ *.js.map diff --git a/README.md b/README.md index f5276d5..0f66deb 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,9 @@ -# GARS Java +# GARS Javascript + +![Build & Test](https://github.com/ngageoint/gars-js/actions/workflows/build-test.yml/badge.svg) +[![NPM](https://img.shields.io/npm/v/@ngageoint/gars-js.svg)](https://www.npmjs.com/package/@ngageoint/gars-js) +[![Coverage Status](https://coveralls.io/repos/github/ngageoint/gars-js/badge.svg)](https://coveralls.io/github/ngageoint/gars-js) +[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier) #### Global Area Reference System Lib #### @@ -11,10 +16,67 @@ Software source code previously released under an open source license and then m ### About ### -[GARS](http://ngageoint.github.io/gars-js/) is a Java library providing Global Area Reference System functionality, a standardized geospatial reference system for areas. +[GARS](http://ngageoint.github.io/gars-js/) is a Javascript library providing Global Area Reference System functionality, a standardized geospatial reference system for areas. -### Build and Installation ### +#### Properties #### -![Build & Test](https://github.com/ngageoint/gars-js/actions/workflows/build-test.yml/badge.svg) -[![NPM](https://img.shields.io/npm/v/@ngageoint/gars-js.svg)](https://www.npmjs.com/package/@ngageoint/gars-js) -[![Coverage Status](https://coveralls.io/repos/github/ngageoint/gars-js/badge.svg)](https://coveralls.io/github/ngageoint/gars-js) \ No newline at end of file +Default grid properties including zoom ranges, styles, and labelers are defined in [gars.properties](https://github.com/ngageoint/gars-js/blob/master/resources/gars.properties). The defaults can be changed in code by modifying the [Grids](https://github.com/ngageoint/gars-js/blob/master/lib/grid/Grids.ts). + +#### Coordinates #### + +```javascript + + const gars = GARS.parse('006AG39'); + const point = gars.toPoint(); + const pointMeters = point.toMeters(); + + const latitude = 63.98862388; + const longitude = 29.06755082; + const point2 = Point.point(longitude, latitude); + const gars2 = GARS.fromPoint(point2); + const garsCoordinate = gars2.toString(); + const gars30m = gars2.coordinate(GridType.THIRTY_MINUTE); + const gars15m = gars2.coordinate(GridType.FIFTEEN_MINUTE); + const gars5m = gars2.coordinate(GridType.FIVE_MINUTE); + +``` + +#### Draw Tile Template #### + +See [gars-android](https://github.com/ngageoint/gars-android) for a concrete example + +```javascript + + // GridTile tile = ...; + + const grids = Grids.create(); + + const zoomGrids = grids.getGrids(tile.getZoom()); + if (zoomGrids && zoomGrids.hasGrids()) { + for (const grid of zoomGrids) { + const lines = grid.getLinesFromGridTile(tile); + if (lines) { + for (const line of lines) { + const pixel1 = line.getPoint1().getPixelFromTile(tile); + const pixel2 = line.getPoint2().getPixelFromTile(tile); + // Draw line + } + } + + const labels = grid.getLabelsFromGridTile(tile); + if (labels) { + for (const label of labels) { + const pixelRange = label.getBounds()!.getPixelRangeFromTile(tile); + const centerPixel = label.getCenter()!.getPixelFromTile(tile); + // Draw label + } + } + } + } + +``` + + +### Remote Dependencies ### + +* [Grid Javascript](https://github.com/ngageoint/grid-js) (The MIT License (MIT)) - Grid Library \ No newline at end of file diff --git a/lib/GARS.ts b/lib/GARS.ts index 28395e2..444bd5a 100644 --- a/lib/GARS.ts +++ b/lib/GARS.ts @@ -6,8 +6,6 @@ import * as sprintf from 'sprintf-js'; /** * Global Area Reference System Coordinate - * - * @author osbornb */ export class GARS { /** @@ -168,9 +166,7 @@ export class GARS { if (typeof this !== typeof obj) return false; const other = obj as GARS; if (this.keypad !== other.keypad) return false; - if (!this.latitude) { - if (other.latitude) return false; - } else if (this.latitude !== other.latitude) return false; + if (this.latitude !== other.latitude) return false; if (this.longitude !== other.longitude) return false; if (this.quadrant !== other.quadrant) return false; return true; @@ -302,11 +298,11 @@ export class GARS { let keypad = GARSConstants.DEFAULT_KEYPAD; const quadrantValue = matches![3]; - if (quadrantValue) { + if (quadrantValue !== null && quadrantValue !== undefined) { quadrant = Number.parseInt(quadrantValue, 10); const keypadValue = matches![4]; - if (keypadValue) { + if (keypadValue !== null && keypadValue !== undefined) { keypad = Number.parseInt(keypadValue, 10); } } @@ -331,9 +327,9 @@ export class GARS { let precision: GridType; - if (matches![4]) { + if (matches![4] !== null && matches![4] !== undefined) { precision = GridType.FIVE_MINUTE; - } else if (matches![3]) { + } else if (matches![3] !== null && matches![3] !== undefined) { precision = GridType.FIFTEEN_MINUTE; } else { precision = GridType.THIRTY_MINUTE; diff --git a/lib/GARSConstants.ts b/lib/GARSConstants.ts index 4e0be41..2cab93b 100644 --- a/lib/GARSConstants.ts +++ b/lib/GARSConstants.ts @@ -3,7 +3,7 @@ import { GridConstants } from '@ngageoint/grid-js'; /** * Global Area Reference System Constants * - * @author osbornb + * */ export class GARSConstants { /** diff --git a/lib/GARSUtils.ts b/lib/GARSUtils.ts index ae65a55..52b25de 100644 --- a/lib/GARSUtils.ts +++ b/lib/GARSUtils.ts @@ -1,14 +1,11 @@ -import { Bounds, GridConstants, GridUtils } from '@ngageoint/grid-js'; +import { GridConstants, GridUtils } from '@ngageoint/grid-js'; import { GARSConstants } from './GARSConstants'; -import { BandLettersRange } from './grid/BandLettersRange'; -import { BandNumberRange } from './grid/BandNumberRange'; -import { GridRange } from './grid/GridRange'; import { GridType } from './grid/GridType'; /** * Global Area Reference System utilities * - * @author osbornb + * */ export class GARSUtils { /** @@ -245,75 +242,6 @@ export class GARSUtils { return (2 - row) * 3 + column + 1; } - /** - * Get a grid range from the bounds - * - * @param bounds - * bounds - * @return grid range - */ - public static getGridRange(bounds: Bounds): GridRange { - bounds = bounds.toDegrees(); - const bandNumberRange = this.getBandNumberRangeFromBounds(bounds); - const bandLettersRange = this.getBandLettersRangeFromBounds(bounds); - return new GridRange(bandNumberRange, bandLettersRange); - } - - /** - * Get a band number range between the western and eastern bounds - * - * @param bounds - * bounds - * @return band number range - */ - public static getBandNumberRangeFromBounds(bounds: Bounds): BandNumberRange { - bounds = bounds.toDegrees(); - return this.getBandNumberRange(bounds.getMinLongitude(), bounds.getMaxLongitude()); - } - - /** - * Get a band number range between the western and eastern longitudes - * - * @param west - * western longitude in degrees - * @param east - * eastern longitude in degrees - * @return band number range - */ - public static getBandNumberRange(west: number, east: number): BandNumberRange { - const westBand = this.getLongitudeBand(west); - const eastBand = this.getLongitudeBand(east); - return new BandNumberRange(westBand, eastBand); - } - - /** - * Get a band letters range between the southern and northern bounds - * - * @param bounds - * bounds - * @return band letters range - */ - public static getBandLettersRangeFromBounds(bounds: Bounds): BandLettersRange { - bounds = bounds.toDegrees(); - return this.getBandLettersRange(bounds.getMinLatitude(), bounds.getMaxLatitude()); - } - - /** - * Get a band letters range between the southern and northern latitudes in - * degrees - * - * @param south - * southern latitude in degrees - * @param north - * northern latitude in degrees - * @return band letters range - */ - public static getBandLettersRange(south: number, north: number): BandLettersRange { - const southBand = this.getLatitudeBand(south); - const northBand = this.getLatitudeBand(north); - return new BandLettersRange(southBand, northBand); - } - /** * Create a degree grid label * diff --git a/lib/features/GridLine.ts b/lib/features/GridLine.ts index 5b503bb..070fad9 100644 --- a/lib/features/GridLine.ts +++ b/lib/features/GridLine.ts @@ -3,8 +3,6 @@ import { GridType } from '../grid/GridType'; /** * Line between two points - * - * @author osbornb */ export class GridLine extends Line { /** @@ -65,7 +63,7 @@ export class GridLine extends Line { * @return true if has grid type */ public hasGridType(): boolean { - return this.gridType !== null; + return this.gridType !== null && this.gridType !== undefined; } /** @@ -84,7 +82,9 @@ export class GridLine extends Line { * @return line copy */ public copy(): GridLine { - return new GridLine(this); + const gridLineCopy = new GridLine(this); + gridLineCopy.setGridType(this.gridType); + return gridLineCopy; } /** diff --git a/lib/grid/BandLettersRange.ts b/lib/grid/BandLettersRange.ts index 280e316..0cec335 100644 --- a/lib/grid/BandLettersRange.ts +++ b/lib/grid/BandLettersRange.ts @@ -4,7 +4,7 @@ import { GARSUtils } from '../GARSUtils'; /** * Latitude Band Letters Range * - * @author osbornb + * */ export class BandLettersRange implements IterableIterator { /** diff --git a/lib/grid/BandNumberRange.ts b/lib/grid/BandNumberRange.ts index f201288..ed43f14 100644 --- a/lib/grid/BandNumberRange.ts +++ b/lib/grid/BandNumberRange.ts @@ -4,7 +4,7 @@ import { GARSUtils } from '../GARSUtils'; /** * Longitude Band Number Range * - * @author osbornb + * */ export class BandNumberRange implements IterableIterator { /** diff --git a/lib/grid/GARSLabeler.ts b/lib/grid/GARSLabeler.ts index 5e89db9..ce28fdd 100644 --- a/lib/grid/GARSLabeler.ts +++ b/lib/grid/GARSLabeler.ts @@ -9,7 +9,7 @@ import { GridType } from './GridType'; /** * GARS grid labeler * - * @author osbornb + * */ export class GARSLabeler extends GridLabeler { constructor(enabled: boolean, minZoom = 0, maxZoom?: number, color?: Color, textSize?: number, buffer?: number) { diff --git a/lib/grid/Grid.ts b/lib/grid/Grid.ts index c8f22d8..e4dfc6b 100644 --- a/lib/grid/Grid.ts +++ b/lib/grid/Grid.ts @@ -1,6 +1,6 @@ import { Color } from '@ngageoint/color-js'; import { BaseGrid, Bounds, GridStyle, GridTile, Point, PropertyConstants } from '@ngageoint/grid-js'; -import { Comparable } from '@ngageoint/simple-features-js'; +import { IComparable } from 'tstl'; import { GridLine } from '../features/GridLine'; import { GARSUtils } from '../GARSUtils'; import { GARSProperties } from '../property/GARSProperties'; @@ -11,10 +11,8 @@ import { GridTypeUtils } from './GridTypeUtils'; /** * Grid - * - * @author osbornb */ -export class Grid extends BaseGrid implements Comparable { +export class Grid extends BaseGrid implements IComparable { /** * Default line width */ @@ -71,7 +69,7 @@ export class Grid extends BaseGrid implements Comparable { * @return precision degrees */ public getPrecision(): number { - return this.type; + return GridTypeUtils.getPrecision(this.type); } /** @@ -81,14 +79,16 @@ export class Grid extends BaseGrid implements Comparable { * grid type * @return grid type line style */ - public getStyle(gridType?: GridType): GridStyle | undefined { - let style: GridStyle | undefined; - if (gridType) { + public getStyle(gridType?: GridType): GridStyle { + let style: GridStyle; + if (gridType !== null && gridType !== undefined) { if (gridType === this.type) { style = super.getStyle(); } else { - style = this.styles.get(gridType); + style = this.styles.get(gridType)!; } + } else { + style = super.getStyle(); } return style; @@ -103,7 +103,7 @@ export class Grid extends BaseGrid implements Comparable { */ private getOrCreateStyle(gridType: GridType): GridStyle { let style = this.getStyle(gridType); - if (style === null) { + if (!style) { style = new GridStyle(undefined, 0); this.setStyle(style, gridType); } @@ -118,21 +118,23 @@ export class Grid extends BaseGrid implements Comparable { * @param style * grid line style */ - public setStyle(style: GridStyle, gridType?: GridType): void { - if (gridType) { - if (gridType < this.getPrecision()) { - throw new Error( - 'Grid can not define a style for a higher precision grid type. Type: ' + - this.type + - ', Style Type: ' + - gridType, - ); - } - if (gridType === this.type) { - super.setStyle(style); - } else { - this.styles.set(gridType, style != null ? style : new GridStyle(undefined, 0)); - } + public setStyle(style?: GridStyle, gridType?: GridType): void { + if (gridType === null || gridType === undefined) { + gridType = this.type; + } + + if (gridType < this.getPrecision()) { + throw new Error( + 'Grid can not define a style for a higher precision grid type. Type: ' + + this.type + + ', Style Type: ' + + gridType, + ); + } + if (gridType === this.type) { + super.setStyle(style); + } else { + this.styles.set(gridType, style ? style : new GridStyle(undefined, 0)); } } @@ -152,14 +154,14 @@ export class Grid extends BaseGrid implements Comparable { */ public getColor(gridType?: GridType): Color | undefined { let color: Color | undefined; - if (gridType) { + if (gridType !== null && gridType !== undefined) { const style = this.getStyle(gridType); if (style) { color = style.getColor(); } - if (!color) { - color = super.getColor(); - } + } + if (!color) { + color = super.getColor(); } return color; @@ -174,9 +176,10 @@ export class Grid extends BaseGrid implements Comparable { * grid line color */ public setColor(color?: Color, gridType?: GridType): void { - if (gridType) { - this.getOrCreateStyle(gridType).setColor(color); + if (gridType === null || gridType === undefined) { + gridType = this.type; } + this.getOrCreateStyle(gridType).setColor(color); } /** @@ -207,9 +210,10 @@ export class Grid extends BaseGrid implements Comparable { * grid line width */ public setWidth(width: number, gridType?: GridType): void { - if (gridType) { - this.getOrCreateStyle(gridType).setWidth(width); + if (gridType === null || gridType === undefined) { + gridType = this.type; } + this.getOrCreateStyle(gridType).setWidth(width); } /** @@ -336,15 +340,26 @@ export class Grid extends BaseGrid implements Comparable { : 1; // (0.0, -0.0) or (NaN, !NaN) } + public hashCode(): number { + const prime = 31; + let result = 1; + result = prime * result + (!this.type ? 0 : GridTypeUtils.hashCode(this.type)); + return result; + } + /** * {@inheritDoc} */ public equals(obj: any): boolean { if (this === obj) return true; - if (obj === null) return false; + if (!obj) return false; if (typeof this !== typeof obj) return false; const other = obj as Grid; if (this.type !== other.type) return false; return true; } + + public less(other: Grid): boolean { + return this.hashCode() < other.hashCode(); + } } diff --git a/lib/grid/GridLabel.ts b/lib/grid/GridLabel.ts index 3b77c96..00bb9f8 100644 --- a/lib/grid/GridLabel.ts +++ b/lib/grid/GridLabel.ts @@ -5,7 +5,7 @@ import { GridType } from './GridType'; /** * GARS Grid Label * - * @author osbornb + * */ export class GridLabel extends Label { /** diff --git a/lib/grid/GridLabeler.ts b/lib/grid/GridLabeler.ts index 7a99d08..fd96978 100644 --- a/lib/grid/GridLabeler.ts +++ b/lib/grid/GridLabeler.ts @@ -7,7 +7,7 @@ import { GridType } from './GridType'; /** * Grid Labeler * - * @author osbornb + * */ export abstract class GridLabeler extends Labeler { /** diff --git a/lib/grid/GridRange.ts b/lib/grid/GridRange.ts index b891afd..a539113 100644 --- a/lib/grid/GridRange.ts +++ b/lib/grid/GridRange.ts @@ -6,7 +6,7 @@ import { BandNumberRange } from './BandNumberRange'; /** * Grid Range * - * @author osbornb + * */ export class GridRange implements IterableIterator { /** @@ -107,7 +107,7 @@ export class GridRange implements IterableIterator { } public next(): IteratorResult { - if (this.bandNumber && !this.bandLetters.done) { + if (this.bandNumber !== null && this.bandNumber !== undefined && !this.bandLetters.done) { const letters = this.bandLetters.value; this.bandLetters = this.bandLettersRange.next(); const gars = GARS.create(this.bandNumber, letters); diff --git a/lib/grid/GridType.ts b/lib/grid/GridType.ts index 4e484eb..54b5395 100644 --- a/lib/grid/GridType.ts +++ b/lib/grid/GridType.ts @@ -1,7 +1,7 @@ /** * Grid type enumeration * - * @author osbornb + * */ export enum GridType { /** diff --git a/lib/grid/GridTypeUtils.ts b/lib/grid/GridTypeUtils.ts index 0696da8..3e8fb51 100644 --- a/lib/grid/GridTypeUtils.ts +++ b/lib/grid/GridTypeUtils.ts @@ -3,7 +3,7 @@ import { GridType } from './GridType'; /** * Grid type enumeration utilities * - * @author osbornb + * */ export class GridTypeUtils { /** @@ -41,7 +41,7 @@ export class GridTypeUtils { */ public static lessPrecise(type: GridType): Set { const values = GridTypeUtils.values(); - const ordinal = Object.keys(GridType).indexOf(type.toString()); + const ordinal = GridTypeUtils.ordinal(type); const types = new Set(); for (let i = 0; i < ordinal; i++) { @@ -60,7 +60,7 @@ export class GridTypeUtils { */ public static morePrecise(type: GridType): Set { const values = GridTypeUtils.values(); - const ordinal = Object.keys(GridType).indexOf(type.toString()); + const ordinal = GridTypeUtils.ordinal(type); const types = new Set(); for (let i = ordinal; i < values.length; i++) { @@ -71,9 +71,37 @@ export class GridTypeUtils { public static values(): GridType[] { const gridTypes: GridType[] = []; - for (const type of Object.keys(GridType)) { - gridTypes.push(GridType[type as keyof typeof GridType]); + const values = Object.keys(GridType).map((key: any) => GridType[key]); + for (const type of values) { + if (Number.isInteger(type)) { + gridTypes.push(type as unknown as number); + } } return gridTypes; } + + public static ordinal(type: GridType): number { + const types: string[] = Object.keys(GridType); + + let ordinal = 0; + for (let i = 0; i < types.length; i++) { + if (isNaN(Number(types[i]))) { + if (types[i] === GridType[type]) { + break; + } + ordinal++; + } + } + + return ordinal; + } + + public static hashCode(type: GridType): number { + let h: number = 0; + const str = type.toString(); + for (let i = 0; i < str.length; i++) { + h = 31 * h + str.charCodeAt(i); + } + return h & 0xffffffff; + } } diff --git a/lib/grid/Grids.ts b/lib/grid/Grids.ts index 23bdf16..0e1d481 100644 --- a/lib/grid/Grids.ts +++ b/lib/grid/Grids.ts @@ -10,8 +10,6 @@ import { ZoomGrids } from './ZoomGrids'; /** * Grids - * - * @author osbornb */ export class Grids extends BaseGrids { /** @@ -39,16 +37,16 @@ export class Grids extends BaseGrids { constructor(types?: GridType[]) { super(GARSProperties.getInstance()); - // createGrids(); - this.createGrids(false); - - if (types) { + if (types && types.length > 0) { + this.createGrids(false); for (const type of types) { const grid = this.getGrid(type); if (grid) { grid.setEnabled(true); } } + } else { + this.createGrids(); } this.createZoomGrids(); @@ -192,22 +190,22 @@ export class Grids extends BaseGrids { let color = this.loadGridStyleColor(gridKey, gridKey2); let width = this.loadGridStyleWidth(gridKey, gridKey2); - if ((!color || !width) && styles) { + if ((!color || width === undefined || width === null) && styles) { const style = styles.get(gridType); if (style) { - if (color === null) { + if (!color) { const styleColor = style.getColor(); if (styleColor) { color = styleColor.copy(); } } - if (width === null) { + if (width === null || width === undefined) { width = style.getWidth(); } } } - if (color || width) { + if (color || (width !== null && width !== undefined)) { const style = this.getGridStyle(grid, color, width); grid.setStyle(style, gridType); @@ -610,7 +608,7 @@ export class Grids extends BaseGrids { const labeler = this.getRequiredLabeler(type); labeler.setMinZoom(minZoom); const maxZoom = labeler.getMaxZoom(); - if (maxZoom && maxZoom < minZoom) { + if (maxZoom !== null && maxZoom !== undefined && maxZoom < minZoom) { labeler.setMaxZoom(minZoom); } } @@ -626,7 +624,7 @@ export class Grids extends BaseGrids { public setLabelMaxZoom(type: GridType, maxZoom: number): void { const labeler = this.getRequiredLabeler(type); labeler.setMaxZoom(maxZoom); - if (maxZoom && labeler.getMinZoom() > maxZoom) { + if (maxZoom !== null && maxZoom !== undefined && labeler.getMinZoom() > maxZoom) { labeler.setMinZoom(maxZoom); } } @@ -643,7 +641,7 @@ export class Grids extends BaseGrids { */ public setLabelZoomRange(type: GridType, minZoom: number, maxZoom: number): void { const labeler = this.getRequiredLabeler(type); - if (maxZoom && maxZoom < minZoom) { + if (maxZoom !== null && maxZoom !== undefined && maxZoom < minZoom) { throw new Error("Min zoom '" + minZoom + "' can not be larger than max zoom '" + maxZoom + "'"); } labeler.setMinZoom(minZoom); diff --git a/lib/grid/ZoomGrids.ts b/lib/grid/ZoomGrids.ts index c069ac3..4cd49a3 100644 --- a/lib/grid/ZoomGrids.ts +++ b/lib/grid/ZoomGrids.ts @@ -5,7 +5,7 @@ import { GridType } from './GridType'; /** * Zoom Level Matching Grids * - * @author osbornb + * */ export class ZoomGrids extends BaseZoomGrids { /** diff --git a/lib/property/GARSProperties.ts b/lib/property/GARSProperties.ts index 431f6cd..710b32c 100644 --- a/lib/property/GARSProperties.ts +++ b/lib/property/GARSProperties.ts @@ -1,20 +1,16 @@ import { GridProperties } from '@ngageoint/grid-js'; +import * as config from '../../resources/gars.json'; /** * GARS property loader * - * @author osbornb + * */ export class GARSProperties extends GridProperties { - /** - * Property file name - */ - public static readonly PROPERTIES_FILE = './resources/gars.properties'; - /** * Singleton instance */ - public static instance = new GARSProperties(); + public static instance = new GARSProperties(config); /** * Get the singleton instance @@ -24,11 +20,4 @@ export class GARSProperties extends GridProperties { public static getInstance(): GARSProperties { return GARSProperties.instance; } - - /** - * {@inheritDoc} - */ - public getFile(): string { - return GARSProperties.PROPERTIES_FILE; - } } diff --git a/package-lock.json b/package-lock.json index edaab95..c25da35 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,18 +1,18 @@ { "name": "@ngageoint/gars-js", - "version": "0.0.1-beta.1", + "version": "1.0.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@ngageoint/gars-js", - "version": "0.0.1-beta.1", + "version": "0.1.1-beta.10", "license": "MIT", "dependencies": { "@ngageoint/color-js": "^2.1.0", - "@ngageoint/grid-js": "^0.0.1-beta.22", - "@ngageoint/simple-features-js": "1.1.1-beta.0", - "sprintf-js": "^1.1.2" + "@ngageoint/grid-js": "^2.0.0", + "sprintf-js": "^1.1.2", + "tstl": "^2.5.8" }, "devDependencies": { "@tsconfig/recommended": "^1.0.1", @@ -59,30 +59,30 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz", - "integrity": "sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz", + "integrity": "sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", - "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz", + "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", + "@babel/generator": "^7.19.6", "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.0", - "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.3", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helpers": "^7.19.4", + "@babel/parser": "^7.19.6", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.3", - "@babel/types": "^7.19.3", + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -98,12 +98,12 @@ } }, "node_modules/@babel/generator": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.3.tgz", - "integrity": "sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.6.tgz", + "integrity": "sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA==", "dev": true, "dependencies": { - "@babel/types": "^7.19.3", + "@babel/types": "^7.19.4", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -190,31 +190,31 @@ } }, "node_modules/@babel/helper-module-transforms": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", - "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", + "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-simple-access": "^7.19.4", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4" }, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", + "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", "dev": true, "dependencies": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.19.4" }, "engines": { "node": ">=6.9.0" @@ -233,9 +233,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", "dev": true, "engines": { "node": ">=6.9.0" @@ -260,14 +260,14 @@ } }, "node_modules/@babel/helpers": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", - "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz", + "integrity": "sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==", "dev": true, "dependencies": { "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/traverse": "^7.19.4", + "@babel/types": "^7.19.4" }, "engines": { "node": ">=6.9.0" @@ -359,9 +359,9 @@ } }, "node_modules/@babel/parser": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz", - "integrity": "sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz", + "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -385,19 +385,19 @@ } }, "node_modules/@babel/traverse": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.3.tgz", - "integrity": "sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.6.tgz", + "integrity": "sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ==", "dev": true, "dependencies": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", + "@babel/generator": "^7.19.6", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.3", - "@babel/types": "^7.19.3", + "@babel/parser": "^7.19.6", + "@babel/types": "^7.19.4", "debug": "^4.1.0", "globals": "^11.1.0" }, @@ -406,12 +406,12 @@ } }, "node_modules/@babel/types": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.3.tgz", - "integrity": "sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz", + "integrity": "sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==", "dev": true, "dependencies": { - "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" }, @@ -556,13 +556,13 @@ "dev": true }, "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "dev": true, "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "node_modules/@ngageoint/color-js": { @@ -574,13 +574,14 @@ } }, "node_modules/@ngageoint/grid-js": { - "version": "0.0.1-beta.22", - "resolved": "https://registry.npmjs.org/@ngageoint/grid-js/-/grid-js-0.0.1-beta.22.tgz", - "integrity": "sha512-swSNKRRWwIqyi8UKK6dDU1OIZ37NkDV+l703omqmmFg4IK27HBwa9vHC87xyaK+ho4OX01gbtLl+93/DzlM23A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ngageoint/grid-js/-/grid-js-2.0.0.tgz", + "integrity": "sha512-XlVhLFZAdIjjm69b4VGputF0As7ZP8vZEnAdeC96LrwoEARQsJigMSjkPZPOlwtZg13iY9y1s+mU8fg6P0vYog==", "dependencies": { "@ngageoint/color-js": "^2.1.0", - "@ngageoint/simple-features-js": "1.1.1-beta.0", - "properties-file": "^2.1.6", + "@ngageoint/simple-features-js": "1.1.0", + "@types/lodash": "^4.14.186", + "lodash": "^4.17.21", "tstl": "^2.5.8" }, "engines": { @@ -588,15 +589,12 @@ } }, "node_modules/@ngageoint/simple-features-js": { - "version": "1.1.1-beta.0", - "resolved": "https://registry.npmjs.org/@ngageoint/simple-features-js/-/simple-features-js-1.1.1-beta.0.tgz", - "integrity": "sha512-b5SebckxYNb5WcAnhD3pTYqUuewMsWBI+qQ+FPkNotaOY2KVxJJMfjkPGEdiVrhbIQlQf7puHt0Ev2Ab7sK33A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ngageoint/simple-features-js/-/simple-features-js-1.1.0.tgz", + "integrity": "sha512-QhJvGiEvPiR5Mk+dUQNsxJF+A77mFfdiOU1CU95q0oHdaEuixrJrrPwJZeG2pSICRNlc36P65Hp26zjzgt7v5Q==", "dependencies": { "js_cols": "1.0.1", "timsort": "^0.3.0" - }, - "bin": { - "simple-features-js": "cli" } }, "node_modules/@tsconfig/node10": { @@ -635,6 +633,11 @@ "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==", "dev": true }, + "node_modules/@types/lodash": { + "version": "4.14.186", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz", + "integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw==" + }, "node_modules/@types/mocha": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", @@ -642,9 +645,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "18.7.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.23.tgz", - "integrity": "sha512-DWNcCHolDq0ZKGizjx2DZjR/PqsYwAcYUJmfMWqtVU2MBMG5Mo+xFZrhGId5r/O5HOuMPyQEcM6KUBp5lBZZBg==", + "version": "18.11.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.5.tgz", + "integrity": "sha512-3JRwhbjI+cHLAkUorhf8RnqUbFXajvzX4q6fMn5JwkgtuwfYtRQYI3u4V92vI6NJuTsbBQWWh3RZjFsuevyMGQ==", "dev": true, "peer": true }, @@ -654,16 +657,10 @@ "integrity": "sha512-hkgzYF+qnIl8uTO8rmUSVSfQ8BIfMXC4yJAF4n8BE758YsKBZvFC4NumnAegj7KmylP0liEZNpb9RRGFMbFejA==", "dev": true }, - "node_modules/@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, "node_modules/acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "dev": true, "bin": { "acorn": "bin/acorn" @@ -956,9 +953,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001414", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", - "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==", + "version": "1.0.30001425", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001425.tgz", + "integrity": "sha512-/pzFv0OmNG6W0ym80P3NtapU0QEiDS3VuYAZMGoLLqiC7f6FJFe1MjpQDREGApeenD9wloeytmVDj+JLXPC6qw==", "dev": true, "funding": [ { @@ -1128,13 +1125,10 @@ "dev": true }, "node_modules/convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.1.1" - } + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true }, "node_modules/core-util-is": { "version": "1.0.2", @@ -1238,15 +1232,18 @@ } }, "node_modules/default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", "dev": true, "dependencies": { "strip-bom": "^4.0.0" }, "engines": { "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" } }, "node_modules/delayed-stream": { @@ -1278,9 +1275,9 @@ } }, "node_modules/electron-to-chromium": { - "version": "1.4.268", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.268.tgz", - "integrity": "sha512-PO90Bv++vEzdln+eA9qLg1IRnh0rKETus6QkTzcFm5P3Wg3EQBZud5dcnzkpYXuIKWBjKe5CO8zjz02cicvn1g==", + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", "dev": true }, "node_modules/emoji-regex": { @@ -1743,9 +1740,9 @@ } }, "node_modules/is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "dependencies": { "has": "^1.0.3" @@ -2070,6 +2067,11 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "node_modules/lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", @@ -2165,10 +2167,13 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", - "dev": true + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/mkdirp": { "version": "0.5.6", @@ -2183,12 +2188,11 @@ } }, "node_modules/mocha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", - "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", + "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", "dev": true, "dependencies": { - "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", @@ -2686,14 +2690,6 @@ "node": ">=8" } }, - "node_modules/properties-file": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/properties-file/-/properties-file-2.1.6.tgz", - "integrity": "sha512-Oov2JYciBGQN7aGIuqkCpgPNSzJau6FiXTMlJoA/UXhFpcup6PRKV3XDsYdGDDMADIDGYOsVMipfCZlwlaD6/w==", - "engines": { - "node": "^14.18.1 || ^16.0.0" - } - }, "node_modules/psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -2850,10 +2846,24 @@ } }, "node_modules/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==", - "dev": true + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] }, "node_modules/safer-buffer": { "version": "2.1.2", @@ -3330,9 +3340,9 @@ } }, "node_modules/tstl": { - "version": "2.5.8", - "resolved": "https://registry.npmjs.org/tstl/-/tstl-2.5.8.tgz", - "integrity": "sha512-NtwB4wQA0QQOqVYq+AEx9d8BlKGjFKHTf24XJlWmUkIQ4o7QOl4ecwrfWzx+bAbUu2KdNb/2iNgCyHJKvEuwXw==" + "version": "2.5.12", + "resolved": "https://registry.npmjs.org/tstl/-/tstl-2.5.12.tgz", + "integrity": "sha512-xAJrE0R+PSxNXnQ7nJ1UPif/gBQYWMnEvIR6c7kKr+7oFrtalo+FunuJHLwpuH4DFClMB1hsaJTAOKkraET9Uw==" }, "node_modules/tsutils": { "version": "2.29.0", @@ -3405,9 +3415,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", "dev": true, "funding": [ { @@ -3648,27 +3658,27 @@ } }, "@babel/compat-data": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.3.tgz", - "integrity": "sha512-prBHMK4JYYK+wDjJF1q99KK4JLL+egWS4nmNqdlMUgCExMZ+iZW0hGhyC3VEbsPjvaN0TBhW//VIFwBrk8sEiw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.19.4.tgz", + "integrity": "sha512-CHIGpJcUQ5lU9KrPHTjBMhVwQG6CQjxfg36fGXl3qk/Gik1WwWachaXFuo0uCWJT/mStOKtcbFJCaVLihC1CMw==", "dev": true }, "@babel/core": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.3.tgz", - "integrity": "sha512-WneDJxdsjEvyKtXKsaBGbDeiyOjR5vYq4HcShxnIbG0qixpoHjI3MqeZM9NDvsojNCEBItQE4juOo/bU6e72gQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.19.6.tgz", + "integrity": "sha512-D2Ue4KHpc6Ys2+AxpIx1BZ8+UegLLLE2p3KJEuJRKmokHOtl49jQ5ny1773KsGLZs8MQvBidAF6yWUJxRqtKtg==", "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", + "@babel/generator": "^7.19.6", "@babel/helper-compilation-targets": "^7.19.3", - "@babel/helper-module-transforms": "^7.19.0", - "@babel/helpers": "^7.19.0", - "@babel/parser": "^7.19.3", + "@babel/helper-module-transforms": "^7.19.6", + "@babel/helpers": "^7.19.4", + "@babel/parser": "^7.19.6", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.3", - "@babel/types": "^7.19.3", + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", @@ -3677,12 +3687,12 @@ } }, "@babel/generator": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.3.tgz", - "integrity": "sha512-fqVZnmp1ncvZU757UzDheKZpfPgatqY59XtW2/j/18H7u76akb8xqvjw82f+i2UKd/ksYsSick/BCLQUUtJ/qQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.19.6.tgz", + "integrity": "sha512-oHGRUQeoX1QrKeJIKVe0hwjGqNnVYsM5Nep5zo0uE0m42sLH+Fsd2pStJ5sRM1bNyTUUoz0pe2lTeMJrb/taTA==", "dev": true, "requires": { - "@babel/types": "^7.19.3", + "@babel/types": "^7.19.4", "@jridgewell/gen-mapping": "^0.3.2", "jsesc": "^2.5.1" }, @@ -3747,28 +3757,28 @@ } }, "@babel/helper-module-transforms": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.0.tgz", - "integrity": "sha512-3HBZ377Fe14RbLIA+ac3sY4PTgpxHVkFrESaWhoI5PuyXPBBX8+C34qblV9G89ZtycGJCmCI/Ut+VUDK4bltNQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.19.6.tgz", + "integrity": "sha512-fCmcfQo/KYr/VXXDIyd3CBGZ6AFhPFy1TfSEJ+PilGVlQT6jcbqtHAM4C1EciRqMza7/TpOUZliuSH+U6HAhJw==", "dev": true, "requires": { "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-module-imports": "^7.18.6", - "@babel/helper-simple-access": "^7.18.6", + "@babel/helper-simple-access": "^7.19.4", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/helper-validator-identifier": "^7.18.6", + "@babel/helper-validator-identifier": "^7.19.1", "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/traverse": "^7.19.6", + "@babel/types": "^7.19.4" } }, "@babel/helper-simple-access": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.18.6.tgz", - "integrity": "sha512-iNpIgTgyAvDQpDj76POqg+YEt8fPxx3yaNBg3S30dxNKm2SWfYhD0TGrK/Eu9wHpUW63VQU894TsTg+GLbUa1g==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.19.4.tgz", + "integrity": "sha512-f9Xq6WqBFqaDfbCzn2w85hwklswz5qsKlh7f08w4Y9yhJHpnNC0QemtSkK5YyOY8kPGvyiwdzZksGUhnGdaUIg==", "dev": true, "requires": { - "@babel/types": "^7.18.6" + "@babel/types": "^7.19.4" } }, "@babel/helper-split-export-declaration": { @@ -3781,9 +3791,9 @@ } }, "@babel/helper-string-parser": { - "version": "7.18.10", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.18.10.tgz", - "integrity": "sha512-XtIfWmeNY3i4t7t4D2t02q50HvqHybPqW2ki1kosnvWCwuCMeo81Jf0gwr85jy/neUdg5XDdeFE/80DXiO+njw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.19.4.tgz", + "integrity": "sha512-nHtDoQcuqFmwYNYPz3Rah5ph2p8PFeFCsZk9A/48dPc/rGocJ5J3hAAZ7pb76VWX3fZKu+uEr/FhH5jLx7umrw==", "dev": true }, "@babel/helper-validator-identifier": { @@ -3799,14 +3809,14 @@ "dev": true }, "@babel/helpers": { - "version": "7.19.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.0.tgz", - "integrity": "sha512-DRBCKGwIEdqY3+rPJgG/dKfQy9+08rHIAJx8q2p+HSWP87s2HCrQmaAMMyMll2kIXKCW0cO1RdQskx15Xakftg==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.19.4.tgz", + "integrity": "sha512-G+z3aOx2nfDHwX/kyVii5fJq+bgscg89/dJNWpYeKeBv3v9xX8EIabmx1k6u9LS04H7nROFVRVK+e3k0VHp+sw==", "dev": true, "requires": { "@babel/template": "^7.18.10", - "@babel/traverse": "^7.19.0", - "@babel/types": "^7.19.0" + "@babel/traverse": "^7.19.4", + "@babel/types": "^7.19.4" } }, "@babel/highlight": { @@ -3879,9 +3889,9 @@ } }, "@babel/parser": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.3.tgz", - "integrity": "sha512-pJ9xOlNWHiy9+FuFP09DEAFbAn4JskgRsVcc169w2xRBC3FRGuQEwjeIMMND9L2zc0iEhO/tGv4Zq+km+hxNpQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.19.6.tgz", + "integrity": "sha512-h1IUp81s2JYJ3mRkdxJgs4UvmSsRvDrx5ICSJbPvtWYv5i1nTBGcBpnog+89rAFMwvvru6E5NUHdBe01UeSzYA==", "dev": true }, "@babel/template": { @@ -3896,30 +3906,30 @@ } }, "@babel/traverse": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.3.tgz", - "integrity": "sha512-qh5yf6149zhq2sgIXmwjnsvmnNQC2iw70UFjp4olxucKrWd/dvlUsBI88VSLUsnMNF7/vnOiA+nk1+yLoCqROQ==", + "version": "7.19.6", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.19.6.tgz", + "integrity": "sha512-6l5HrUCzFM04mfbG09AagtYyR2P0B71B1wN7PfSPiksDPz2k5H9CBC1tcZpz2M8OxbKTPccByoOJ22rUKbpmQQ==", "dev": true, "requires": { "@babel/code-frame": "^7.18.6", - "@babel/generator": "^7.19.3", + "@babel/generator": "^7.19.6", "@babel/helper-environment-visitor": "^7.18.9", "@babel/helper-function-name": "^7.19.0", "@babel/helper-hoist-variables": "^7.18.6", "@babel/helper-split-export-declaration": "^7.18.6", - "@babel/parser": "^7.19.3", - "@babel/types": "^7.19.3", + "@babel/parser": "^7.19.6", + "@babel/types": "^7.19.4", "debug": "^4.1.0", "globals": "^11.1.0" } }, "@babel/types": { - "version": "7.19.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.3.tgz", - "integrity": "sha512-hGCaQzIY22DJlDh9CH7NOxgKkFjBk0Cw9xDO1Xmh2151ti7wiGfQ3LauXzL4HP1fmFlTX6XjpRETTpUcv7wQLw==", + "version": "7.19.4", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.19.4.tgz", + "integrity": "sha512-M5LK7nAeS6+9j7hAq+b3fQs+pNfUtTGq+yFFfHnauFA8zQtLRfmuipmsKDKKLuyG+wC8ABW43A153YNawNTEtw==", "dev": true, "requires": { - "@babel/helper-string-parser": "^7.18.10", + "@babel/helper-string-parser": "^7.19.4", "@babel/helper-validator-identifier": "^7.19.1", "to-fast-properties": "^2.0.0" } @@ -4032,13 +4042,13 @@ "dev": true }, "@jridgewell/trace-mapping": { - "version": "0.3.15", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.15.tgz", - "integrity": "sha512-oWZNOULl+UbhsgB51uuZzglikfIKSUBO/M9W2OfEjn7cmqoAiCgmv9lyACTUacZwBz0ITnJ2NqjU8Tx0DHL88g==", + "version": "0.3.17", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", + "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", "dev": true, "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" + "@jridgewell/resolve-uri": "3.1.0", + "@jridgewell/sourcemap-codec": "1.4.14" } }, "@ngageoint/color-js": { @@ -4047,20 +4057,21 @@ "integrity": "sha512-jiiZRtEgwIpMUEUVcef7kWGLd7yOSvHKHzxbGOV9YAXulYTnl9LPiq7uY6wO95iJ8NSVoanWTnRrDJ49NF+g5A==" }, "@ngageoint/grid-js": { - "version": "0.0.1-beta.22", - "resolved": "https://registry.npmjs.org/@ngageoint/grid-js/-/grid-js-0.0.1-beta.22.tgz", - "integrity": "sha512-swSNKRRWwIqyi8UKK6dDU1OIZ37NkDV+l703omqmmFg4IK27HBwa9vHC87xyaK+ho4OX01gbtLl+93/DzlM23A==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/@ngageoint/grid-js/-/grid-js-2.0.0.tgz", + "integrity": "sha512-XlVhLFZAdIjjm69b4VGputF0As7ZP8vZEnAdeC96LrwoEARQsJigMSjkPZPOlwtZg13iY9y1s+mU8fg6P0vYog==", "requires": { "@ngageoint/color-js": "^2.1.0", - "@ngageoint/simple-features-js": "1.1.1-beta.0", - "properties-file": "^2.1.6", + "@ngageoint/simple-features-js": "1.1.0", + "@types/lodash": "^4.14.186", + "lodash": "^4.17.21", "tstl": "^2.5.8" } }, "@ngageoint/simple-features-js": { - "version": "1.1.1-beta.0", - "resolved": "https://registry.npmjs.org/@ngageoint/simple-features-js/-/simple-features-js-1.1.1-beta.0.tgz", - "integrity": "sha512-b5SebckxYNb5WcAnhD3pTYqUuewMsWBI+qQ+FPkNotaOY2KVxJJMfjkPGEdiVrhbIQlQf7puHt0Ev2Ab7sK33A==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@ngageoint/simple-features-js/-/simple-features-js-1.1.0.tgz", + "integrity": "sha512-QhJvGiEvPiR5Mk+dUQNsxJF+A77mFfdiOU1CU95q0oHdaEuixrJrrPwJZeG2pSICRNlc36P65Hp26zjzgt7v5Q==", "requires": { "js_cols": "1.0.1", "timsort": "^0.3.0" @@ -4102,6 +4113,11 @@ "integrity": "sha512-hC7OMnszpxhZPduX+m+nrx+uFoLkWOMiR4oa/AZF3MuSETYTZmFfJAHqZEM8MVlvfG7BEUcgvtwoCTxBp6hm3g==", "dev": true }, + "@types/lodash": { + "version": "4.14.186", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.186.tgz", + "integrity": "sha512-eHcVlLXP0c2FlMPm56ITode2AgLMSa6aJ05JTTbYbI+7EMkCEE5qk2E41d5g2lCVTqRe0GnnRFurmlCsDODrPw==" + }, "@types/mocha": { "version": "9.1.1", "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", @@ -4109,9 +4125,9 @@ "dev": true }, "@types/node": { - "version": "18.7.23", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.7.23.tgz", - "integrity": "sha512-DWNcCHolDq0ZKGizjx2DZjR/PqsYwAcYUJmfMWqtVU2MBMG5Mo+xFZrhGId5r/O5HOuMPyQEcM6KUBp5lBZZBg==", + "version": "18.11.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.5.tgz", + "integrity": "sha512-3JRwhbjI+cHLAkUorhf8RnqUbFXajvzX4q6fMn5JwkgtuwfYtRQYI3u4V92vI6NJuTsbBQWWh3RZjFsuevyMGQ==", "dev": true, "peer": true }, @@ -4121,16 +4137,10 @@ "integrity": "sha512-hkgzYF+qnIl8uTO8rmUSVSfQ8BIfMXC4yJAF4n8BE758YsKBZvFC4NumnAegj7KmylP0liEZNpb9RRGFMbFejA==", "dev": true }, - "@ungap/promise-all-settled": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@ungap/promise-all-settled/-/promise-all-settled-1.1.2.tgz", - "integrity": "sha512-sL/cEvJWAnClXw0wHk85/2L0G6Sj8UB0Ctc1TEMbKSsmpRosqhwj9gWgFRZSrBr2f9tiXISwNhCPmlfqUqyb9Q==", - "dev": true - }, "acorn": { - "version": "8.8.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.0.tgz", - "integrity": "sha512-QOxyigPVrpZ2GXT+PFyZTl6TtOFc5egxHIP9IlQ+RbupQuX4RkT/Bee4/kQuC02Xkzg84JcT7oLYtDIQxp+v7w==", + "version": "8.8.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.1.tgz", + "integrity": "sha512-7zFpHzhnqYKrkYdUjF1HI1bzd0VygEGX8lFk4k5zVMqHEoES+P+7TKI+EvLO9WVMJ8eekdO0aDEK044xTXwPPA==", "dev": true }, "acorn-walk": { @@ -4351,9 +4361,9 @@ "dev": true }, "caniuse-lite": { - "version": "1.0.30001414", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001414.tgz", - "integrity": "sha512-t55jfSaWjCdocnFdKQoO+d2ct9C59UZg4dY3OnUlSZ447r8pUtIKdp0hpAzrGFultmTC+Us+KpKi4GZl/LXlFg==", + "version": "1.0.30001425", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001425.tgz", + "integrity": "sha512-/pzFv0OmNG6W0ym80P3NtapU0QEiDS3VuYAZMGoLLqiC7f6FJFe1MjpQDREGApeenD9wloeytmVDj+JLXPC6qw==", "dev": true }, "caseless": { @@ -4480,13 +4490,10 @@ "dev": true }, "convert-source-map": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.8.0.tgz", - "integrity": "sha512-+OQdjP49zViI/6i7nIJpA8rAl4sV/JdPfU9nZs3VqOwGIgizICvuN2ru6fMd+4llL0tar18UYJXfZ/TWtmhUjA==", - "dev": true, - "requires": { - "safe-buffer": "~5.1.1" - } + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "dev": true }, "core-util-is": { "version": "1.0.2", @@ -4566,9 +4573,9 @@ } }, "default-require-extensions": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.0.tgz", - "integrity": "sha512-ek6DpXq/SCpvjhpFsLFRVtIxJCRw6fUR42lYMVZuUMK7n8eMz4Uh5clckdBjEpLhn/gEBZo7hDJnJcwdKLKQjg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-3.0.1.tgz", + "integrity": "sha512-eXTJmRbm2TIt9MgWTsOH1wEuhew6XGZcMeGKCtLedIg/NCsg1iBePXkceTdK4Fii7pzmN9tGsZhKzZ4h7O/fxw==", "dev": true, "requires": { "strip-bom": "^4.0.0" @@ -4597,9 +4604,9 @@ } }, "electron-to-chromium": { - "version": "1.4.268", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.268.tgz", - "integrity": "sha512-PO90Bv++vEzdln+eA9qLg1IRnh0rKETus6QkTzcFm5P3Wg3EQBZud5dcnzkpYXuIKWBjKe5CO8zjz02cicvn1g==", + "version": "1.4.284", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.284.tgz", + "integrity": "sha512-M8WEXFuKXMYMVr45fo8mq0wUrrJHheiKZf6BArTKk9ZBYCKJEOU5H8cdWgDT+qCVZf7Na4lVUaZsA+h6uA9+PA==", "dev": true }, "emoji-regex": { @@ -4935,9 +4942,9 @@ } }, "is-core-module": { - "version": "2.10.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.10.0.tgz", - "integrity": "sha512-Erxj2n/LDAZ7H8WNJXd9tw38GYM3dv8rk8Zcs+jJuxYTW7sozH+SS8NtrSjVL1/vpLvWi1hxy96IzjJ3EHTJJg==", + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", + "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", "dev": true, "requires": { "has": "^1.0.3" @@ -5180,6 +5187,11 @@ "p-locate": "^5.0.0" } }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "lodash.flattendeep": { "version": "4.4.0", "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz", @@ -5251,9 +5263,9 @@ } }, "minimist": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz", - "integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==", + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", "dev": true }, "mkdirp": { @@ -5266,12 +5278,11 @@ } }, "mocha": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.0.0.tgz", - "integrity": "sha512-0Wl+elVUD43Y0BqPZBzZt8Tnkw9CMUdNYnUsTfOM1vuhJVZL+kiesFYsqwBkEEuEixaiPe5ZQdqDgX2jddhmoA==", + "version": "10.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.1.0.tgz", + "integrity": "sha512-vUF7IYxEoN7XhQpFLxQAEMtE4W91acW4B6En9l97MwE9stL1A9gusXfoHZCLVHDUJ/7V5+lbCM6yMqzo5vNymg==", "dev": true, "requires": { - "@ungap/promise-all-settled": "1.1.2", "ansi-colors": "4.1.1", "browser-stdout": "1.3.1", "chokidar": "3.5.3", @@ -5647,11 +5658,6 @@ "fromentries": "^1.2.0" } }, - "properties-file": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/properties-file/-/properties-file-2.1.6.tgz", - "integrity": "sha512-Oov2JYciBGQN7aGIuqkCpgPNSzJau6FiXTMlJoA/UXhFpcup6PRKV3XDsYdGDDMADIDGYOsVMipfCZlwlaD6/w==" - }, "psl": { "version": "1.9.0", "resolved": "https://registry.npmjs.org/psl/-/psl-1.9.0.tgz", @@ -5772,9 +5778,9 @@ } }, "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==", + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", + "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", "dev": true }, "safer-buffer": { @@ -6128,9 +6134,9 @@ "dev": true }, "tstl": { - "version": "2.5.8", - "resolved": "https://registry.npmjs.org/tstl/-/tstl-2.5.8.tgz", - "integrity": "sha512-NtwB4wQA0QQOqVYq+AEx9d8BlKGjFKHTf24XJlWmUkIQ4o7QOl4ecwrfWzx+bAbUu2KdNb/2iNgCyHJKvEuwXw==" + "version": "2.5.12", + "resolved": "https://registry.npmjs.org/tstl/-/tstl-2.5.12.tgz", + "integrity": "sha512-xAJrE0R+PSxNXnQ7nJ1UPif/gBQYWMnEvIR6c7kKr+7oFrtalo+FunuJHLwpuH4DFClMB1hsaJTAOKkraET9Uw==" }, "tsutils": { "version": "2.29.0", @@ -6184,9 +6190,9 @@ "dev": true }, "update-browserslist-db": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.9.tgz", - "integrity": "sha512-/xsqn21EGVdXI3EXSum1Yckj3ZVZugqyOZQ/CxYPBD/R+ko9NSUScf8tFF4dOKY+2pvSSJA/S+5B8s4Zr4kyvg==", + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", + "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", "dev": true, "requires": { "escalade": "^3.1.1", diff --git a/package.json b/package.json index c623945..578a6fd 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@ngageoint/gars-js", - "version": "0.0.1-beta.1", + "version": "1.0.0", "displayName": "GARS Javascript", "description": "GARS Javascript", "keywords": [ @@ -22,16 +22,16 @@ ], "homepage": "https://www.nga.mil", "engines": { - "npm": ">= 8.x" + "npm": ">= 6.x" }, "license": "MIT", "main": "dist/index.js", "types": "dist/index.d.ts", "dependencies": { "@ngageoint/color-js": "^2.1.0", - "@ngageoint/grid-js": "^0.0.1-beta.22", - "@ngageoint/simple-features-js": "1.1.1-beta.0", - "sprintf-js": "^1.1.2" + "@ngageoint/grid-js": "^2.0.0", + "sprintf-js": "^1.1.2", + "tstl": "^2.5.8" }, "devDependencies": { "@tsconfig/recommended": "^1.0.1", @@ -56,15 +56,16 @@ "build": "npm run compile", "report": "nyc report", "coverage": "nyc npm run test:run", - "format": "prettier --write \"lib/**/*.ts\" \"test/**/*.ts\"", - "lint": "tslint -p tsconfig.json", + "lint:prettier": "prettier --check \"lib/**/*.ts\" \"test/**/*.ts\"", + "lint:tslint": "tslint -p tsconfig.json", + "lint": "npm run lint:tslint && npm run lint:prettier", + "fix:prettier": "prettier --write \"lib/**/*.ts\" \"test/**/*.ts\"", "prebuild": "npm run clean", "pretest": "npm run build", "prepublishOnly": "npm run build && npm run lint" }, "files": [ - "dist", - "resources" + "dist" ], "directories": { "lib": "./lib" diff --git a/resources/gars.json b/resources/gars.json new file mode 100644 index 0000000..6e9f666 --- /dev/null +++ b/resources/gars.json @@ -0,0 +1,119 @@ +{ + "grids":{ + "twenty_degree":{ + "enabled":"true", + "min_zoom":"0", + "max_zoom":"3", + "color":"707070", + "width":"2.0", + "labeler":{ + "enabled":"true", + "min_zoom":"0", + "max_zoom":"3", + "color":"17202A", + "text_size":"24.0", + "buffer":"0.05" + } + }, + "ten_degree":{ + "enabled":"true", + "min_zoom":"4", + "max_zoom":"5", + "color":"707070", + "width":"2.0", + "labeler":{ + "enabled":"true", + "min_zoom":"4", + "max_zoom":"5", + "color":"17202A", + "text_size":"24.0", + "buffer":"0.05" + } + }, + "five_degree":{ + "enabled":"true", + "min_zoom":"6", + "max_zoom":"6", + "color":"707070", + "width":"2.0", + "labeler":{ + "enabled":"true", + "min_zoom":"6", + "max_zoom":"6", + "color":"17202A", + "text_size":"24.0", + "buffer":"0.05" + } + }, + "one_degree":{ + "enabled":"true", + "min_zoom":"7", + "max_zoom":"7", + "color":"707070", + "width":"2.0", + "labeler":{ + "enabled":"true", + "min_zoom":"7", + "max_zoom":"7", + "color":"17202A", + "text_size":"24.0", + "buffer":"0.05" + } + }, + "thirty_minute":{ + "enabled":"true", + "min_zoom":"8", + "max_zoom":"9", + "color":"EF5350", + "width":"2.0", + "twenty_degree":{ + "color":"EF5350" + }, + "ten_degree":{ + "color":"EF5350" + }, + "five_degree":{ + "color":"EF5350" + }, + "one_degree":{ + "color":"EF5350" + }, + "labeler":{ + "enabled":"true", + "min_zoom":"8", + "max_zoom":"9", + "color":"EF5350", + "text_size":"24.0", + "buffer":"0.05" + } + }, + "fifteen_minute":{ + "enabled":"true", + "min_zoom":"10", + "max_zoom":"10", + "color":"3D8C40", + "width":"2.0", + "labeler":{ + "enabled":"true", + "min_zoom":"10", + "max_zoom":"10", + "color":"3D8C40", + "text_size":"24.0", + "buffer":"0.05" + } + }, + "five_minute":{ + "enabled":"true", + "min_zoom":"11", + "color":"6E6E6E", + "width":"2.0", + "labeler":{ + "enabled":"true", + "min_zoom":"11", + "color":"17202A", + "text_size":"24.0", + "buffer":"0.05" + } + } + } +} \ No newline at end of file diff --git a/resources/gars.properties b/resources/gars.properties deleted file mode 100644 index 68f0a7a..0000000 --- a/resources/gars.properties +++ /dev/null @@ -1,101 +0,0 @@ - -grid.width=2.0 -labeler.text_size=24.0 -labeler.buffer=0.05 - -grids.propagate=true - -grids.twenty_degree.enabled=true -grids.twenty_degree.min_zoom=0 -grids.twenty_degree.max_zoom=3 -grids.twenty_degree.color=707070 -grids.twenty_degree.width=2.0 - -grids.twenty_degree.labeler.enabled=true -grids.twenty_degree.labeler.min_zoom=0 -grids.twenty_degree.labeler.max_zoom=3 -grids.twenty_degree.labeler.color=17202A -grids.twenty_degree.labeler.text_size=24.0 -grids.twenty_degree.labeler.buffer=0.05 - -grids.ten_degree.enabled=true -grids.ten_degree.min_zoom=4 -grids.ten_degree.max_zoom=5 -grids.ten_degree.color=707070 -grids.ten_degree.width=2.0 - -grids.ten_degree.labeler.enabled=true -grids.ten_degree.labeler.min_zoom=4 -grids.ten_degree.labeler.max_zoom=5 -grids.ten_degree.labeler.color=17202A -grids.ten_degree.labeler.text_size=24.0 -grids.ten_degree.labeler.buffer=0.05 - -grids.five_degree.enabled=true -grids.five_degree.min_zoom=6 -grids.five_degree.max_zoom=6 -grids.five_degree.color=707070 -grids.five_degree.width=2.0 - -grids.five_degree.labeler.enabled=true -grids.five_degree.labeler.min_zoom=6 -grids.five_degree.labeler.max_zoom=6 -grids.five_degree.labeler.color=17202A -grids.five_degree.labeler.text_size=24.0 -grids.five_degree.labeler.buffer=0.05 - -grids.one_degree.enabled=true -grids.one_degree.min_zoom=7 -grids.one_degree.max_zoom=7 -grids.one_degree.color=707070 -grids.one_degree.width=2.0 - -grids.one_degree.labeler.enabled=true -grids.one_degree.labeler.min_zoom=7 -grids.one_degree.labeler.max_zoom=7 -grids.one_degree.labeler.color=17202A -grids.one_degree.labeler.text_size=24.0 -grids.one_degree.labeler.buffer=0.05 - -grids.thirty_minute.enabled=true -grids.thirty_minute.min_zoom=8 -grids.thirty_minute.max_zoom=9 -grids.thirty_minute.color=EF5350 -grids.thirty_minute.width=2.0 -grids.thirty_minute.twenty_degree.color=EF5350 -grids.thirty_minute.ten_degree.color=EF5350 -grids.thirty_minute.five_degree.color=EF5350 -grids.thirty_minute.one_degree.color=EF5350 - -grids.thirty_minute.labeler.enabled=true -grids.thirty_minute.labeler.min_zoom=8 -grids.thirty_minute.labeler.max_zoom=9 -grids.thirty_minute.labeler.color=EF5350 -grids.thirty_minute.labeler.text_size=24.0 -grids.thirty_minute.labeler.buffer=0.05 - -grids.fifteen_minute.enabled=true -grids.fifteen_minute.min_zoom=10 -grids.fifteen_minute.max_zoom=10 -grids.fifteen_minute.color=3D8C40 -grids.fifteen_minute.width=2.0 - -grids.fifteen_minute.labeler.enabled=true -grids.fifteen_minute.labeler.min_zoom=10 -grids.fifteen_minute.labeler.max_zoom=10 -grids.fifteen_minute.labeler.color=3D8C40 -grids.fifteen_minute.labeler.text_size=24.0 -grids.fifteen_minute.labeler.buffer=0.05 - -grids.five_minute.enabled=true -grids.five_minute.min_zoom=11 -grids.five_minute.max_zoom= -grids.five_minute.color=6E6E6E -grids.five_minute.width=2.0 - -grids.five_minute.labeler.enabled=true -grids.five_minute.labeler.min_zoom=11 -grids.five_minute.labeler.max_zoom= -grids.five_minute.labeler.color=17202A -grids.five_minute.labeler.text_size=24.0 -grids.five_minute.labeler.buffer=0.05 diff --git a/test/GARS.spec.ts b/test/GARS.spec.ts index a1bb935..e775d9f 100644 --- a/test/GARS.spec.ts +++ b/test/GARS.spec.ts @@ -255,7 +255,6 @@ describe('GARS Tests', function () { * upon failure to parse */ it('test 30 minute parse', function () { - this.timeout(20000); const gridRange = new GridRange(); let count = 0; diff --git a/test/Readme.spec.ts b/test/Readme.spec.ts index d6c7f9c..b857b63 100644 --- a/test/Readme.spec.ts +++ b/test/Readme.spec.ts @@ -6,7 +6,7 @@ import { Grids } from '../lib/grid/Grids'; /** * README example tests * - * @author osbornb + * */ describe('Readme Tests', function () { /** diff --git a/test/features/GridLine.spec.ts b/test/features/GridLine.spec.ts new file mode 100644 index 0000000..3b07e55 --- /dev/null +++ b/test/features/GridLine.spec.ts @@ -0,0 +1,28 @@ +import { Point } from '@ngageoint/grid-js'; +import { expect } from 'chai'; +import { GridLine } from '../../lib/features/GridLine'; +import { GridType } from '../../lib/grid/GridType'; + +describe('GridLine Tests', function () { + it('test copy', function () { + const gridLine = new GridLine(); + gridLine.setGridType(GridType.FIVE_MINUTE); + const point1 = Point.point(0, 0); + const point2 = Point.point(1, 1); + gridLine.setPoints(point1, point2); + + const gridLineCopy = gridLine.copy(); + expect(gridLineCopy.getGridType()).to.equal(gridLine.getGridType()); + expect(gridLineCopy.numPoints()).to.equal(gridLineCopy.numPoints()); + expect(gridLineCopy.equals(gridLine)).to.be.true; + }); + + it('test create from line', function () { + const point1 = Point.point(0, 0); + const point2 = Point.point(1, 1); + const gridType = GridType.TWENTY_DEGREE; + const gridLine = GridLine.line(point1, point2, gridType); + expect(gridLine.numPoints()).to.equal(2); + expect(gridLine.getGridType()).to.equal(gridType); + }); +}); diff --git a/test/grid/BandLettersRange.spec.ts b/test/grid/BandLettersRange.spec.ts new file mode 100644 index 0000000..fd485d8 --- /dev/null +++ b/test/grid/BandLettersRange.spec.ts @@ -0,0 +1,16 @@ +import { expect } from 'chai'; +import { BandLettersRange } from '../../lib/grid/BandLettersRange'; + +describe('BandLettersRange Tests', function () { + it('test iterator', function () { + const bandLettersRange = new BandLettersRange(); + expect(bandLettersRange.getSouthValue()).to.be.greaterThan(0); + expect(bandLettersRange.getNorthValue()).to.be.greaterThan(0); + + let count = 0; + for (const letter of bandLettersRange) { + count++; + } + expect(count).to.be.greaterThanOrEqual(bandLettersRange.getNorthValue()); + }); +}); diff --git a/test/grid/BandNumberRange.spec.ts b/test/grid/BandNumberRange.spec.ts new file mode 100644 index 0000000..46350f1 --- /dev/null +++ b/test/grid/BandNumberRange.spec.ts @@ -0,0 +1,16 @@ +import { expect } from 'chai'; +import { BandNumberRange } from '../../lib/grid/BandNumberRange'; + +describe('BandNumberRange Tests', function () { + it('test iterator', function () { + const bandNumberRange = new BandNumberRange(); + expect(bandNumberRange.getEast()).to.be.greaterThan(0); + expect(bandNumberRange.getWest()).to.be.greaterThan(0); + + let count = 0; + for (const letter of bandNumberRange) { + count++; + } + expect(count).to.be.greaterThanOrEqual(bandNumberRange.getEast()); + }); +}); diff --git a/test/grid/GARSLabeler.spec.ts b/test/grid/GARSLabeler.spec.ts new file mode 100644 index 0000000..e943725 --- /dev/null +++ b/test/grid/GARSLabeler.spec.ts @@ -0,0 +1,39 @@ +import { expect } from 'chai'; +import { Bounds } from '@ngageoint/grid-js'; +import { GARSLabeler } from '../../lib/grid/GARSLabeler'; +import { GridType } from '../../lib/grid/GridType'; + +describe('GARSLabeler Tests', function () { + it('test getLabels', function () { + const boundsIndia = Bounds.degrees(69, 7, 98, 38); + + const labeler = new GARSLabeler(true); + let labels = labeler.getLabels(boundsIndia, GridType.TWENTY_DEGREE); + expect(labels.length).to.be.equal(9); + labels.forEach((label) => { + expect(label.getName()?.includes('E')).to.be.true; + expect(label.getName()?.includes('N')).to.be.true; + }); + + labels = labeler.getLabels(boundsIndia, GridType.TEN_DEGREE); + expect(labels.length).to.be.equal(25); + labels.forEach((label) => { + expect(label.getName()?.includes('E')).to.be.true; + expect(label.getName()?.includes('N')).to.be.true; + }); + + labels = labeler.getLabels(boundsIndia, GridType.FIVE_DEGREE); + expect(labels.length).to.be.equal(64); + labels.forEach((label) => { + expect(label.getName()?.includes('E')).to.be.true; + expect(label.getName()?.includes('N')).to.be.true; + }); + + labels = labeler.getLabels(boundsIndia, GridType.ONE_DEGREE); + expect(labels.length).to.be.equal(1023); + labels.forEach((label) => { + expect(label.getName()?.includes('E')).to.be.true; + expect(label.getName()?.includes('N')).to.be.true; + }); + }); +}); diff --git a/test/grid/Grid.spec.ts b/test/grid/Grid.spec.ts new file mode 100644 index 0000000..13833e0 --- /dev/null +++ b/test/grid/Grid.spec.ts @@ -0,0 +1,26 @@ +import { GridStyle } from '@ngageoint/grid-js'; +import { expect } from 'chai'; +import { Grid } from '../../lib/grid/Grid'; +import { GridType } from '../../lib/grid/GridType'; + +describe('Grid Tests', function () { + it('test precision', function () { + const grid = new Grid(GridType.ONE_DEGREE); + expect(grid.getPrecision()).to.equal(GridType.ONE_DEGREE); + }); + + it('test style', function () { + const grid = new Grid(GridType.THIRTY_MINUTE); + expect(grid.getStyle()).to.not.be.undefined; + + expect(function () { + grid.setStyle(new GridStyle(undefined, 0), GridType.FIFTEEN_MINUTE); + }).to.throw(Error); + }); + + it('test equals', function () { + const grid = new Grid(GridType.ONE_DEGREE); + const grid2 = new Grid(GridType.ONE_DEGREE); + expect(grid.equals(grid2)).to.be.true; + }); +}); diff --git a/test/grid/GridRange.spec.ts b/test/grid/GridRange.spec.ts new file mode 100644 index 0000000..732419c --- /dev/null +++ b/test/grid/GridRange.spec.ts @@ -0,0 +1,17 @@ +import { expect } from 'chai'; +import { GARSConstants } from '../../lib/GARSConstants'; +import { GridRange } from '../../lib/grid/GridRange'; + +describe('GridRange Tests', function () { + it('test iterator', function () { + const range = new GridRange(); + expect(range.getBandLettersRange()).to.not.be.undefined; + expect(range.getBandNumberRange()).to.not.be.undefined; + + let count = 0; + for (const gars of range) { + count++; + } + expect(count).to.equal(GARSConstants.MAX_BAND_NUMBER * GARSConstants.MAX_BAND_LETTERS_NUMBER); + }); +}); diff --git a/test/grid/GridTypeUtils.spec.ts b/test/grid/GridTypeUtils.spec.ts new file mode 100644 index 0000000..7b3d645 --- /dev/null +++ b/test/grid/GridTypeUtils.spec.ts @@ -0,0 +1,19 @@ +import { expect } from 'chai'; +import { GridTypeUtils } from '../../lib/grid/GridTypeUtils'; +import { GridType } from '../../lib/grid/GridType'; + +describe('GridTypeUtils Tests', function () { + it('test less precise', function () { + const lessPreciseTypes = GridTypeUtils.lessPrecise(GridType.ONE_DEGREE); + expect(lessPreciseTypes.size).to.be.equal(3); + }); + + it('test more precise', function () { + const lessPreciseTypes = GridTypeUtils.lessPrecise(GridType.FIFTEEN_MINUTE); + expect(lessPreciseTypes.size).to.be.equal(5); + }); + + it('test ordinal', function () { + expect(GridTypeUtils.ordinal(GridType.TEN_DEGREE)).to.be.equal(1); + }); +}); diff --git a/test/grid/Grids.spec.ts b/test/grid/Grids.spec.ts new file mode 100644 index 0000000..048cff0 --- /dev/null +++ b/test/grid/Grids.spec.ts @@ -0,0 +1,64 @@ +import { GridTile } from '@ngageoint/grid-js'; +import { expect } from 'chai'; +import { Grids } from '../../lib/grid/Grids'; +import { GridType } from '../../lib/grid/GridType'; + +describe('Grids Tests', function () { + it('test construction', function () { + const defaultGrids = new Grids(); + for (const grid of defaultGrids.grids()) { + expect(grid.isEnabled()).to.equal(true); + } + + const enabledGrids = new Grids([GridType.FIFTEEN_MINUTE]); + for (const grid of enabledGrids.grids()) { + if (grid.getType().valueOf() === GridType.FIFTEEN_MINUTE.valueOf()) { + expect(grid.isEnabled()).to.equal(true); + } else { + expect(grid.isEnabled()).to.equal(false); + } + } + }); + + it('test color', function () { + const grids = Grids.create([GridType.TEN_DEGREE]); + const grid = grids.getGrid(GridType.TEN_DEGREE); + expect(grid?.getColor()).to.not.be.undefined; + }); + + it('test width', function () { + const grids = Grids.create([GridType.TEN_DEGREE]); + const grid = grids.getGrid(GridType.TEN_DEGREE); + expect(grid?.getWidth()).to.equal(2); + }); + + it('test tile grids', function () { + const zoom = 5; + + const grids = Grids.create(); + const tile = GridTile.tile(256, 256, 45, 28, zoom); + const zoomGrids = grids.getGrids(zoom); + expect(zoomGrids?.hasGrids()).to.be.true; + expect(zoomGrids?.getGrids().size()).to.equal(1); + expect(zoomGrids?.getPrecision()?.valueOf()).to.equal(GridType.TEN_DEGREE); + + for (const grid of zoomGrids!.getGrids()) { + const lines = grid.getLinesFromGridTile(tile); + expect(lines?.length).to.equal(18); + lines?.forEach((line) => { + expect(line.getPoint1().getLongitude()).is.greaterThanOrEqual(320); + expect(line.getPoint1().getLongitude()).is.lessThanOrEqual(340); + + expect(line.getPoint1().getLatitude()).is.greaterThanOrEqual(-90); + expect(line.getPoint1().getLatitude()).is.lessThanOrEqual(-70); + }); + + const labels = grid.getLabelsFromGridTile(tile); + expect(labels?.length).to.equal(9); + labels?.forEach((label) => { + expect(label.getName()?.includes('E')).to.be.true; + expect(label.getName()?.includes('S')).to.be.true; + }); + } + }); +}); diff --git a/test/grid/ZoomGrids.spec.ts b/test/grid/ZoomGrids.spec.ts new file mode 100644 index 0000000..c93b95b --- /dev/null +++ b/test/grid/ZoomGrids.spec.ts @@ -0,0 +1,17 @@ +import { expect } from 'chai'; +import { ZoomGrids } from '../../lib/grid/ZoomGrids'; +import { GridType } from '../../lib/grid/GridType'; +import { Grid } from '../../lib/grid/Grid'; + +describe('ZoomGrids Tests', function () { + it('test precision', function () { + const zoomGrids = new ZoomGrids(5); + expect(zoomGrids.getPrecision()).to.be.undefined; + + zoomGrids.addGrid(new Grid(GridType.TWENTY_DEGREE)); + zoomGrids.addGrid(new Grid(GridType.TEN_DEGREE)); + zoomGrids.addGrid(new Grid(GridType.ONE_DEGREE)); + + expect(zoomGrids.getPrecision()?.valueOf()).to.equal(GridType.ONE_DEGREE.valueOf()); + }); +}); diff --git a/test/property/GARSProperties.spec.ts b/test/property/GARSProperties.spec.ts new file mode 100644 index 0000000..8695f5d --- /dev/null +++ b/test/property/GARSProperties.spec.ts @@ -0,0 +1,20 @@ +import { expect } from 'chai'; +import { GARSProperties } from '../../lib/property/GARSProperties'; + +describe('GARSProperties Tests', function () { + it('test GARS property', function () { + const prop = GARSProperties.getInstance().getBooleanProperty( + true, + GARSProperties.getInstance().buildProperty(['grids', 'twenty_degree', 'enabled']), + ); + expect(prop).to.be.true; + }); + + it('test Grid property', function () { + const prop = GARSProperties.getInstance().getBooleanProperty( + true, + GARSProperties.getInstance().buildProperty(['grids', 'propagate']), + ); + expect(prop).to.be.true; + }); +}); diff --git a/tsconfig.json b/tsconfig.json index e99c329..4ba47f8 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,6 +5,7 @@ "declaration": true, /* Generates corresponding '.d.ts' file. */ "declarationMap": true, /* Generates a sourcemap for each corresponding '.d.ts' file. */ "sourceMap": true, /* Generates corresponding '.map' file. */ + "resolveJsonModule": true }, "exclude": [ "**/*.d.ts", diff --git a/tslint.json b/tslint.json index 9c52fc7..c2d8c81 100644 --- a/tslint.json +++ b/tslint.json @@ -8,6 +8,7 @@ ] }, "rules": { - "no-bitwise": false + "no-bitwise": false, + "prefer-for-of": false } } \ No newline at end of file