@accelint/geo 0.2.4 → 0.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cartesian.js +0 -1
- package/dist/cartesian.js.map +1 -1
- package/dist/coordinates/coordinate.js +2 -3
- package/dist/coordinates/coordinate.js.map +1 -1
- package/dist/coordinates/latlon/decimal-degrees/parser.js +4 -5
- package/dist/coordinates/latlon/decimal-degrees/parser.js.map +1 -1
- package/dist/coordinates/latlon/decimal-degrees/system.js +1 -2
- package/dist/coordinates/latlon/decimal-degrees/system.js.map +1 -1
- package/dist/coordinates/latlon/degrees-decimal-minutes/parser.js +4 -5
- package/dist/coordinates/latlon/degrees-decimal-minutes/parser.js.map +1 -1
- package/dist/coordinates/latlon/degrees-decimal-minutes/system.js +1 -2
- package/dist/coordinates/latlon/degrees-decimal-minutes/system.js.map +1 -1
- package/dist/coordinates/latlon/degrees-minutes-seconds/parser.js +4 -5
- package/dist/coordinates/latlon/degrees-minutes-seconds/parser.js.map +1 -1
- package/dist/coordinates/latlon/degrees-minutes-seconds/system.js +1 -2
- package/dist/coordinates/latlon/degrees-minutes-seconds/system.js.map +1 -1
- package/dist/coordinates/latlon/internal/create-cache.js +2 -3
- package/dist/coordinates/latlon/internal/create-cache.js.map +1 -1
- package/dist/coordinates/latlon/internal/exhaustive-errors.js +4 -5
- package/dist/coordinates/latlon/internal/exhaustive-errors.js.map +1 -1
- package/dist/coordinates/latlon/internal/in-range.js +1 -2
- package/dist/coordinates/latlon/internal/in-range.js.map +1 -1
- package/dist/coordinates/latlon/internal/index.js +9 -10
- package/dist/coordinates/latlon/internal/index.js.map +1 -1
- package/dist/coordinates/latlon/internal/lexer.js +8 -9
- package/dist/coordinates/latlon/internal/lexer.js.map +1 -1
- package/dist/coordinates/latlon/internal/parse-format.js +3 -4
- package/dist/coordinates/latlon/internal/parse-format.js.map +1 -1
- package/dist/coordinates/latlon/internal/parse.js +0 -1
- package/dist/coordinates/latlon/internal/parse.js.map +1 -1
- package/dist/coordinates/latlon/internal/pipes/check-ambiguous.js +0 -1
- package/dist/coordinates/latlon/internal/pipes/check-ambiguous.js.map +1 -1
- package/dist/coordinates/latlon/internal/pipes/check-numbers.js +0 -1
- package/dist/coordinates/latlon/internal/pipes/check-numbers.js.map +1 -1
- package/dist/coordinates/latlon/internal/pipes/fix-bearings.js +4 -5
- package/dist/coordinates/latlon/internal/pipes/fix-bearings.js.map +1 -1
- package/dist/coordinates/latlon/internal/pipes/fix-dividers.js +2 -3
- package/dist/coordinates/latlon/internal/pipes/fix-dividers.js.map +1 -1
- package/dist/coordinates/latlon/internal/pipes/genome.js +1 -2
- package/dist/coordinates/latlon/internal/pipes/genome.js.map +1 -1
- package/dist/coordinates/latlon/internal/pipes/index.js +4 -5
- package/dist/coordinates/latlon/internal/pipes/index.js.map +1 -1
- package/dist/coordinates/latlon/internal/pipes/simpler.js +1 -2
- package/dist/coordinates/latlon/internal/pipes/simpler.js.map +1 -1
- package/dist/coordinates/latlon/internal/violation.js +1 -2
- package/dist/coordinates/latlon/internal/violation.js.map +1 -1
- package/dist/coordinates/mgrs/parser.js +2 -3
- package/dist/coordinates/mgrs/parser.js.map +1 -1
- package/dist/coordinates/mgrs/system.js +1 -2
- package/dist/coordinates/mgrs/system.js.map +1 -1
- package/dist/coordinates/utm/parser.js +2 -3
- package/dist/coordinates/utm/parser.js.map +1 -1
- package/dist/coordinates/utm/system.js +1 -2
- package/dist/coordinates/utm/system.js.map +1 -1
- package/dist/metafile-esm.json +1 -0
- package/dist/patterning.js +5 -6
- package/dist/patterning.js.map +1 -1
- package/package.json +6 -6
package/dist/cartesian.js
CHANGED
package/dist/cartesian.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/cartesian.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../src/cartesian.ts"],"names":[],"mappings":"AA+BO,SAAS,aAAgB,GAAA,EAAmB;AACjD,EAAA,OAAO,GAAA,CAAI,MAAA;AAAA,IACT,CAAC,OAAA,EAAS,OAAA,KACR,OAAA,CACG,GAAA,CAAI,CAAC,MAAA,KAAW,OAAA,CAAQ,GAAA,CAAI,CAAC,KAAA,KAAU,MAAA,CAAO,MAAA,CAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAA,CAC9D,MAAA,CAAO,CAAC,GAAA,EAAK,GAAA,KAAQ,GAAA,CAAI,MAAA,CAAO,GAAG,CAAA,EAAG,EAAE,CAAA;AAAA,IAC7C,CAAC,EAAE;AAAA,GACL;AACF","file":"cartesian.js","sourcesContent":["// __private-exports\n/*\n * Copyright 2024 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n * Computes the Cartesian product of multiple arrays.\n *\n * @template T\n * the type of elements in the input arrays.\n * @param {...T[][]} all\n * a variadic number of arrays to compute the Cartesian product of.\n * @returns {T[][]}\n * An array containing all possible combinations of elements from the input\n * arrays, where each combination is represented as an array.\n *\n * @remarks\n * pure function\n *\n * @example\n * const result = cartesian([1, 2], ['a', 'b']);\n * // result: [[1, 'a'], [1, 'b'], [2, 'a'], [2, 'b']]\n */\nexport function cartesian<T>(...all: T[][]): T[][] {\n return all.reduce<T[][]>(\n (results, entries) =>\n results\n .map((result) => entries.map((entry) => result.concat([entry])))\n .reduce((sub, res) => sub.concat(res), []),\n [[]],\n );\n}\n"]}
|
|
@@ -6,15 +6,14 @@ import { createCache } from './latlon/internal/create-cache.js';
|
|
|
6
6
|
import { systemMGRS } from './mgrs/system.js';
|
|
7
7
|
import { systemUTM } from './utm/system.js';
|
|
8
8
|
|
|
9
|
-
|
|
10
|
-
var coordinateSystems = Object.freeze({
|
|
9
|
+
const coordinateSystems = Object.freeze({
|
|
11
10
|
dd: systemDecimalDegrees,
|
|
12
11
|
ddm: systemDegreesDecimalMinutes,
|
|
13
12
|
dms: systemDegreesMinutesSeconds,
|
|
14
13
|
mgrs: systemMGRS,
|
|
15
14
|
utm: systemUTM
|
|
16
15
|
});
|
|
17
|
-
|
|
16
|
+
const freezeCoordinate = (errors, to, raw, valid) => Object.freeze({
|
|
18
17
|
dd: (format) => to(systemDecimalDegrees, format),
|
|
19
18
|
ddm: (format) => to(systemDegreesDecimalMinutes, format),
|
|
20
19
|
dms: (format) => to(systemDegreesMinutesSeconds, format),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/coordinates/coordinate.ts"],"names":["errors","key"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../src/coordinates/coordinate.ts"],"names":["errors","key"],"mappings":"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","file":"coordinate.js","sourcesContent":["/*\n * Copyright 2024 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport { systemDecimalDegrees } from './latlon/decimal-degrees/system';\nimport { systemDegreesDecimalMinutes } from './latlon/degrees-decimal-minutes/system';\nimport { systemDegreesMinutesSeconds } from './latlon/degrees-minutes-seconds/system';\nimport {\n type Axes,\n type Errors,\n FORMATS_DEFAULT,\n type Format,\n SYMBOLS,\n} from './latlon/internal';\nimport type { CoordinateSystem } from './latlon/internal/coordinate-system';\nimport {\n type CoordinateCache,\n createCache,\n} from './latlon/internal/create-cache';\nimport type { Tokens } from './latlon/internal/lexer';\nimport { systemMGRS } from './mgrs/system';\nimport { systemUTM } from './utm/system';\n\ntype Coordinate = {\n /** {@interitDoc Formatter} */\n dd: Formatter;\n /** {@interitDoc Formatter} */\n ddm: Formatter;\n /** {@interitDoc Formatter} */\n dms: Formatter;\n /** {@interitDoc Formatter} */\n mgrs: Formatter;\n /** {@interitDoc Formatter} */\n utm: Formatter;\n errors: string[];\n raw: CoordinateInternalValue;\n valid: boolean;\n};\n\n// biome-ignore lint/style/useNamingConvention: consistency with Axes type\ntype CoordinateInternalValue = { LAT: number; LON: number };\n\n/**\n * Output a string value of a coordinate using an available system. The\n * original value is preserved without conversion to an internal\n * representation - Decimal Degrees - to prevent the possibility of\n * rounding errors. All alternative values are computed from a common\n * internal value to reduce complexity.\n *\n * @link https://en.wikipedia.org/wiki/Coordinate_system\n *\n * @remarks\n * pure function\n *\n * @example\n * const create = createCoordinate(coordinateSystems.dd, 'LATLON')\n * const coord = create('89.765432109 / 123.456789012')\n *\n * // honors the instantiation format 'LATLON'\n * coord.dd() === '89.765432109 N / 123.456789012 E'\n * coord.ddm() === '89 45.92592654 N / 123 27.40734072 E'\n * coord.dms() === '89 45 55.5555924 N / 123 27 24.4404432 E'\n *\n * // change format to 'LONLAT'\n * coord.dms('LONLAT') === '123 27 24.4404432 E / 89 45 55.5555924 N'\n */\ntype Formatter = (f?: Format) => string;\n\ntype ToFloatArg = Parameters<CoordinateSystem['toFloat']>[0];\n\ntype OutputCache = Record<keyof typeof coordinateSystems, CoordinateCache>;\n\nexport const coordinateSystems = Object.freeze({\n dd: systemDecimalDegrees,\n ddm: systemDegreesDecimalMinutes,\n dms: systemDegreesMinutesSeconds,\n mgrs: systemMGRS,\n utm: systemUTM,\n} as const);\n\nconst freezeCoordinate = (\n errors: Coordinate['errors'],\n to: (s?: CoordinateSystem, f?: Format) => string,\n raw: CoordinateInternalValue,\n valid: Coordinate['valid'],\n) =>\n Object.freeze({\n dd: (format?: Format) => to(systemDecimalDegrees, format),\n ddm: (format?: Format) => to(systemDegreesDecimalMinutes, format),\n dms: (format?: Format) => to(systemDegreesMinutesSeconds, format),\n mgrs: (format?: Format) => to(systemMGRS, format),\n errors,\n raw,\n valid,\n } as Coordinate);\n\n/**\n * Create a coordinate object enabling: lexing, parsing, validation, and\n * formatting in alternative systems and formats. The system and format will be\n * used for validation and eventually for output as defaults if no alternatives\n * are provided.\n *\n * @param initSystem dd, ddm, dms, mgrs, or utm of coordinateSystems\n *\n * @remarks\n * pure function\n *\n * @example\n * const create = createCoordinate(coordinateSystems.dd, 'LATLON')\n * const create = createCoordinate(coordinateSystems.ddm, 'LONLAT')\n */\nexport function createCoordinate(\n initSystem: CoordinateSystem = coordinateSystems.dd,\n initFormat: Format = FORMATS_DEFAULT,\n) {\n return (input: string) => {\n let tokens: Tokens;\n let errors: Errors;\n\n try {\n [tokens, errors] = initSystem.parse(initFormat, input);\n\n if (errors.length) {\n throw errors;\n }\n } catch (errors) {\n return freezeCoordinate(\n errors as Coordinate['errors'],\n () => '',\n {} as CoordinateInternalValue,\n false,\n );\n }\n\n // start with the original value for the original system in the original format\n // other values will be computed as needed and cached per request\n const cachedValues = {\n [initSystem.name]: createCache(\n initFormat,\n // because mgrs doesn't have two formats: LATLON v LONLAT\n initSystem.name === systemMGRS.name ? input : tokens.join(' '),\n ),\n } as OutputCache;\n\n // Create the \"internal\" representation - Decimal Degrees - for\n // consistency and ease of computation; all systems expect to\n // start from a common starting point to reduce complexity.\n const raw = Object.fromEntries([\n [\n initFormat.slice(0, 3),\n initSystem.toFloat(\n tokens.slice(0, tokens.indexOf(SYMBOLS.DIVIDER)) as ToFloatArg,\n ),\n ],\n [\n initFormat.slice(3),\n initSystem.toFloat(\n tokens.slice(1 + tokens.indexOf(SYMBOLS.DIVIDER)) as ToFloatArg,\n ),\n ],\n ]) as CoordinateInternalValue;\n\n function to(\n system: CoordinateSystem = initSystem,\n format: Format = initFormat,\n ) {\n const key = system.name as keyof typeof coordinateSystems;\n\n if (!cachedValues[key]?.[format]) {\n // cache \"miss\" - fill the missing value in the cache before returning it\n\n // update the cache to include the newly computed value\n cachedValues[key] = {\n ...cachedValues[key],\n // use the Format to build the object, correctly pairing the halves of\n // the coordinate value with their labels\n [format]: system.toFormat(\n format,\n ([format.slice(0, 3), format.slice(3)] as Axes[]).map(\n (key) => raw[key],\n ) as [number, number],\n ),\n };\n }\n\n return cachedValues[key][format];\n }\n\n return freezeCoordinate([] as Coordinate['errors'], to, raw, true);\n };\n}\n"]}
|
|
@@ -1,9 +1,8 @@
|
|
|
1
|
-
import * as Patterning from '
|
|
1
|
+
import * as Patterning from './../../../patterning.js';
|
|
2
2
|
import { PARTIAL_PATTERNS, SYMBOLS, SYMBOL_PATTERNS, BEARINGS, LIMITS } from '../internal/index.js';
|
|
3
3
|
import { createParser } from '../internal/parse-format.js';
|
|
4
4
|
|
|
5
|
-
|
|
6
|
-
var checks = {
|
|
5
|
+
const checks = {
|
|
7
6
|
deg: (deg, limit) => {
|
|
8
7
|
if (Number.parseFloat(deg) > limit) {
|
|
9
8
|
return `Degrees value (${deg}) exceeds max value (${limit}).`;
|
|
@@ -20,7 +19,7 @@ var checks = {
|
|
|
20
19
|
}
|
|
21
20
|
}
|
|
22
21
|
};
|
|
23
|
-
|
|
22
|
+
const formats = {
|
|
24
23
|
LATLON: Patterning.fromTemplate(
|
|
25
24
|
PARTIAL_PATTERNS,
|
|
26
25
|
`degLatDec NS ${SYMBOLS.DIVIDER} degLonDec EW`
|
|
@@ -66,7 +65,7 @@ function identifyPieces(half) {
|
|
|
66
65
|
return acc;
|
|
67
66
|
}, places);
|
|
68
67
|
}
|
|
69
|
-
|
|
68
|
+
const parseDecimalDegrees = createParser({
|
|
70
69
|
formats,
|
|
71
70
|
identifyErrors,
|
|
72
71
|
identifyPieces
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/coordinates/latlon/decimal-degrees/parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../src/coordinates/latlon/decimal-degrees/parser.ts"],"names":[],"mappings":"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","file":"parser.js","sourcesContent":["/*\n * Copyright 2024 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport * as Patterning from '@/patterning';\n\nimport {\n BEARINGS,\n type Format,\n LIMITS,\n PARTIAL_PATTERNS,\n SYMBOLS,\n SYMBOL_PATTERNS,\n} from '../internal';\nimport type { ParseResults } from '../internal/parse';\nimport { createParser } from '../internal/parse-format';\n\ntype DecimalDegrees = {\n bear: string;\n deg: string;\n};\n\nconst checks = {\n deg: (deg: string, limit: number) => {\n if (Number.parseFloat(deg) > limit) {\n return `Degrees value (${deg}) exceeds max value (${limit}).`;\n }\n },\n min: (val: string) => {\n if (val.includes(SYMBOLS.MINUTES)) {\n return `Seconds indicator (${SYMBOLS.MINUTES}) not valid in Decimal Degrees.`;\n }\n },\n sec: (val: string) => {\n if (val.includes(SYMBOLS.SECONDS)) {\n return `Seconds indicator (${SYMBOLS.SECONDS}) not valid in Decimal Degrees.`;\n }\n },\n};\n\nconst formats = {\n LATLON: Patterning.fromTemplate(\n PARTIAL_PATTERNS,\n `degLatDec NS ${SYMBOLS.DIVIDER} degLonDec EW`,\n ),\n LONLAT: Patterning.fromTemplate(\n PARTIAL_PATTERNS,\n `degLonDec EW ${SYMBOLS.DIVIDER} degLatDec NS`,\n ),\n};\n\nfunction identifyErrors(format: Format) {\n return (arg: DecimalDegrees | undefined, i: number) => {\n if (!arg) {\n return [[], ['Invalid coordinate value.']] as ParseResults;\n }\n\n let { bear, deg } = arg;\n\n deg ??= '0';\n\n let isNegative: 0 | 1 = SYMBOL_PATTERNS.NEGATIVE_SIGN.test(deg) ? 1 : 0;\n const bearingOptions = BEARINGS[format][i] as [string, string];\n\n if (!bear || isNegative) {\n bear = bearingOptions[isNegative];\n deg = Math.abs(Number.parseFloat(deg)).toString();\n isNegative = 0;\n }\n\n const errors = [\n ...[checks.deg(deg, LIMITS[format][i] ?? 0)],\n ...[checks.min([bear, deg].join(''))],\n ...[checks.sec([bear, deg].join(''))],\n ].filter(Boolean);\n\n return (errors.length ? [[], errors] : [[deg, bear], []]) as ParseResults;\n };\n}\n\nfunction identifyPieces(half: string[]) {\n if (half.length > 2 || half.length < 1) {\n return;\n }\n\n const places = { bear: '', deg: '' };\n\n return half.reduce((acc, token) => {\n if (SYMBOL_PATTERNS.NSEW.test(token) && !acc.bear) {\n acc.bear ||= token;\n } else {\n acc.deg ||= token;\n }\n\n return acc;\n }, places);\n}\n\n/** Parse a Decimal Degrees coordinate. */\nexport const parseDecimalDegrees = createParser<DecimalDegrees>({\n formats,\n identifyErrors,\n identifyPieces,\n});\n"]}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { BEARINGS, SYMBOLS, SYMBOL_PATTERNS } from '../internal/index.js';
|
|
2
2
|
import { parseDecimalDegrees } from './parser.js';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
var systemDecimalDegrees = {
|
|
4
|
+
const systemDecimalDegrees = {
|
|
6
5
|
name: "Decimal Degrees",
|
|
7
6
|
parse: parseDecimalDegrees,
|
|
8
7
|
toFloat(arg) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/coordinates/latlon/decimal-degrees/system.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../src/coordinates/latlon/decimal-degrees/system.ts"],"names":[],"mappings":";;;AAwBO,MAAM,oBAAA,GAAyC;AAAA,EACpD,IAAA,EAAM,iBAAA;AAAA,EAEN,KAAA,EAAO,mBAAA;AAAA,EAEP,QAAQ,GAAA,EAAK;AACX,IAAA,MAAM,CAAC,GAAA,EAAK,IAAI,CAAA,GAAI,GAAA;AAEpB,IAAA,OACE,MAAA,CAAO,WAAW,GAAG,CAAA,IACpB,gBAAgB,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA,GAAI,EAAA,GAAK,CAAA,CAAA;AAAA,EAEzD,CAAA;AAAA,EAEA,QAAA,CAAS,MAAA,EAAgB,CAAC,IAAA,EAAM,KAAK,CAAA,EAAqB;AACxD,IAAA,OAAO,CAAC,IAAA,EAAM,KAAK,CAAA,CAChB,GAAA;AAAA,MACC,CAAC,GAAA,EAAK,KAAA,KACJ,CAAA,EAAG,IAAA,CAAK,IAAI,GAAG,CAAC,CAAA,CAAA,EAAI,QAAA,CAAS,MAAM,CAAA,CAAE,KAAc,EAAE,EAAE,GAAA,GAAM,EAAE,CAAC,CAAA;AAAA,KACpE,CACC,IAAA,CAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,EAChC;AACF","file":"system.js","sourcesContent":["// __private-exports\n/*\n * Copyright 2024 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {\n BEARINGS,\n type Compass,\n type Format,\n SYMBOLS,\n SYMBOL_PATTERNS,\n} from '../internal';\nimport type { CoordinateSystem } from '../internal/coordinate-system';\n\nimport { parseDecimalDegrees } from './parser';\n\nexport const systemDecimalDegrees: CoordinateSystem = {\n name: 'Decimal Degrees',\n\n parse: parseDecimalDegrees,\n\n toFloat(arg) {\n const [num, bear] = arg as [string, Compass];\n\n return (\n Number.parseFloat(num) *\n (SYMBOL_PATTERNS.NEGATIVE_BEARINGS.test(bear) ? -1 : 1)\n );\n },\n\n toFormat(format: Format, [left, right]: [number, number]) {\n return [left, right]\n .map(\n (num, index) =>\n `${Math.abs(num)} ${BEARINGS[format][index as 0 | 1][+(num < 0)]}`,\n )\n .join(` ${SYMBOLS.DIVIDER} `);\n },\n};\n"]}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import * as Patterning from '
|
|
1
|
+
import * as Patterning from './../../../patterning.js';
|
|
2
2
|
import { PARTIAL_PATTERNS, SYMBOLS, SYMBOL_PATTERNS, BEARINGS, LIMITS } from '../internal/index.js';
|
|
3
3
|
import { inRange } from '../internal/in-range.js';
|
|
4
4
|
import { createParser } from '../internal/parse-format.js';
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
var checks = {
|
|
6
|
+
const checks = {
|
|
8
7
|
deg: (deg, limit) => {
|
|
9
8
|
if (Number.parseFloat(deg) > limit) {
|
|
10
9
|
return `Degrees value (${deg}) exceeds max value (${limit}).`;
|
|
@@ -20,7 +19,7 @@ var checks = {
|
|
|
20
19
|
}
|
|
21
20
|
}
|
|
22
21
|
};
|
|
23
|
-
|
|
22
|
+
const formats = {
|
|
24
23
|
LATLON: Patterning.fromTemplate(
|
|
25
24
|
PARTIAL_PATTERNS,
|
|
26
25
|
`degLat minDec NS ${SYMBOLS.DIVIDER} degLon minDec EW`
|
|
@@ -75,7 +74,7 @@ function identifyPieces(half) {
|
|
|
75
74
|
return acc;
|
|
76
75
|
}, places);
|
|
77
76
|
}
|
|
78
|
-
|
|
77
|
+
const parseDegreesDecimalMinutes = createParser({
|
|
79
78
|
formats,
|
|
80
79
|
identifyErrors,
|
|
81
80
|
identifyPieces
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/coordinates/latlon/degrees-decimal-minutes/parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../src/coordinates/latlon/degrees-decimal-minutes/parser.ts"],"names":[],"mappings":";;;;;AAgCA,MAAM,MAAA,GAAS;AAAA,EACb,GAAA,EAAK,CAAC,GAAA,EAAa,KAAA,KAAkB;AACnC,IAAA,IAAI,MAAA,CAAO,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA,EAAO;AAClC,MAAA,OAAO,CAAA,eAAA,EAAkB,GAAG,CAAA,qBAAA,EAAwB,KAAK,CAAA,EAAA,CAAA;AAAA,IAC3D;AAEA,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,EAAG;AAClB,MAAA,OAAO,kBAAkB,GAAG,CAAA,iCAAA,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA;AAAA,EACA,KAAK,CAAC,GAAA,KAAgB,OAAA,CAAQ,SAAA,EAAW,KAAK,YAAY,CAAA;AAAA,EAC1D,GAAA,EAAK,CAAC,GAAA,KAAgB;AACpB,IAAA,IAAI,GAAA,CAAI,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA,EAAG;AACjC,MAAA,OAAO,CAAA,mBAAA,EAAsB,QAAQ,OAAO,CAAA,sCAAA,CAAA;AAAA,IAC9C;AAAA,EACF;AACF,CAAA;AAEA,MAAM,OAAA,GAAU;AAAA,EACd,QAAQ,UAAA,CAAW,YAAA;AAAA,IACjB,gBAAA;AAAA,IACA,CAAA,iBAAA,EAAoB,QAAQ,OAAO,CAAA,iBAAA;AAAA,GACrC;AAAA,EACA,QAAQ,UAAA,CAAW,YAAA;AAAA,IACjB,gBAAA;AAAA,IACA,CAAA,iBAAA,EAAoB,QAAQ,OAAO,CAAA,iBAAA;AAAA;AAEvC,CAAA;AAEA,SAAS,eAAe,MAAA,EAAgB;AACtC,EAAA,OAAO,CAAC,KAAwC,CAAA,KAAc;AAC5D,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO,CAAC,EAAC,EAAG,CAAC,2BAA2B,CAAC,CAAA;AAAA,IAC3C;AAEA,IAAA,IAAI,EAAE,IAAA,EAAM,GAAA,EAAK,GAAA,EAAI,GAAI,GAAA;AAEzB,IAAA,GAAA,KAAQ,GAAA;AACR,IAAA,GAAA,KAAQ,GAAA;AAER,IAAA,IAAI,aAAoB,eAAA,CAAgB,aAAA,CAAc,IAAA,CAAK,GAAG,IAAI,CAAA,GAAI,CAAA;AACtE,IAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAC,CAAA;AAEzC,IAAA,IAAI,CAAC,QAAQ,UAAA,EAAY;AACvB,MAAA,IAAA,GAAO,eAAe,UAAU,CAAA;AAChC,MAAA,GAAA,GAAM,KAAK,GAAA,CAAI,MAAA,CAAO,WAAW,GAAG,CAAC,EAAE,QAAA,EAAS;AAChD,MAAA,UAAA,GAAa,CAAA;AAAA,IACf;AAEA,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,GAAG,CAAC,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,MAAM,CAAA,CAAE,CAAC,CAAA,IAAK,CAAC,CAAC,CAAA;AAAA,MAC3C,GAAG,CAAC,MAAA,CAAO,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,MACnB,GAAG,CAAC,MAAA,CAAO,GAAA,CAAI,CAAC,IAAA,EAAM,GAAA,EAAK,GAAG,CAAA,CAAE,IAAA,CAAK,EAAE,CAAC,CAAC;AAAA,KAC3C,CAAE,OAAO,OAAO,CAAA;AAEhB,IAAA,OACE,MAAA,CAAO,MAAA,GAAS,CAAC,IAAI,MAAM,CAAA,GAAI,CAAC,CAAC,GAAA,EAAK,GAAA,EAAK,IAAI,CAAA,EAAG,EAAE,CAAA;AAAA,EAExD,CAAA;AACF;AAEA,SAAS,eAAe,IAAA,EAAgB;AACtC,EAAA,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AACtC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAC9B,EAAA,MAAM,SAAS,EAAE,IAAA,EAAM,IAAI,GAAA,EAAK,EAAA,EAAI,KAAK,EAAA,EAAG;AAC5C,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,EAAO,KAAK,CAAA;AAC1B,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,EAAW,CAAA,EAAY,CAAA,KACnC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,IAAM,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA,IAAK,CAAA;AAEpC,EAAA,OAAO,IAAA,CAAK,OAAO,CAAC,GAAA,EAAK,OAAO,CAAA,EAAG,EAAE,QAAO,KAAM;AAChD,IAAA,IAAI,KAAK,eAAA,CAAgB,IAAA,EAAM,MAAM,MAAA,GAAS,CAAA,EAAG,KAAK,CAAA,EAAG;AACvD,MAAA,GAAA,CAAI,IAAA,KAAS,KAAA;AAAA,IACf,WAAW,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA,KAAM,CAAA,EAAG,KAAK,CAAA,EAAG;AACxD,MAAA,GAAA,CAAI,GAAA,KAAQ,KAAA;AAAA,IACd,WAAW,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA,KAAM,CAAA,EAAG,KAAK,CAAA,EAAG;AACxD,MAAA,GAAA,CAAI,GAAA,KAAQ,KAAA;AAAA,IACd,CAAA,MAAO;AACL,MAAA,MAAM,GAAA,GAAM,KAAK,IAAA,CAAK,CAAC,MAAM,CAAC,GAAA,CAAI,CAAC,CAAC,CAAA;AAEpC,MAAA,GAAA,CAAI,GAAuB,CAAA,GAAI,KAAA;AAAA,IACjC;AAEA,IAAA,OAAO,GAAA;AAAA,EACT,GAAG,MAAM,CAAA;AACX;AAGO,MAAM,6BAA6B,YAAA,CAAoC;AAAA,EAC5E,OAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAC","file":"parser.js","sourcesContent":["/*\n * Copyright 2024 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport * as Patterning from '@/patterning';\n\nimport {\n BEARINGS,\n type Format,\n LIMITS,\n PARTIAL_PATTERNS,\n SYMBOLS,\n SYMBOL_PATTERNS,\n} from '../internal';\nimport { inRange } from '../internal/in-range';\nimport type { ParseResults } from '../internal/parse';\nimport { createParser } from '../internal/parse-format';\n\ntype DegreesDecimalMinutes = {\n bear: string;\n deg: string;\n min: string;\n};\n\nconst checks = {\n deg: (deg: string, limit: number) => {\n if (Number.parseFloat(deg) > limit) {\n return `Degrees value (${deg}) exceeds max value (${limit}).`;\n }\n\n if (/\\./.test(deg)) {\n return `Degrees value (${deg}) must not include decimal value.`;\n }\n },\n min: (min: string) => inRange('Minutes', min, 59.999999999),\n sec: (val: string) => {\n if (val.includes(SYMBOLS.SECONDS)) {\n return `Seconds indicator (${SYMBOLS.SECONDS}) not valid in Degree Decimal Minutes.`;\n }\n },\n};\n\nconst formats = {\n LATLON: Patterning.fromTemplate(\n PARTIAL_PATTERNS,\n `degLat minDec NS ${SYMBOLS.DIVIDER} degLon minDec EW`,\n ),\n LONLAT: Patterning.fromTemplate(\n PARTIAL_PATTERNS,\n `degLon minDec EW ${SYMBOLS.DIVIDER} degLat minDec NS`,\n ),\n};\n\nfunction identifyErrors(format: Format) {\n return (arg: DegreesDecimalMinutes | undefined, i: number) => {\n if (!arg) {\n return [[], ['Invalid coordinate value.']] as ParseResults;\n }\n\n let { bear, deg, min } = arg;\n\n deg ??= '0';\n min ??= '0';\n\n let isNegative: 0 | 1 = SYMBOL_PATTERNS.NEGATIVE_SIGN.test(deg) ? 1 : 0;\n const bearingOptions = BEARINGS[format][i] as [string, string];\n\n if (!bear || isNegative) {\n bear = bearingOptions[isNegative];\n deg = Math.abs(Number.parseFloat(deg)).toString();\n isNegative = 0;\n }\n\n const errors = [\n ...[checks.deg(deg, LIMITS[format][i] ?? 0)],\n ...[checks.min(min)],\n ...[checks.sec([bear, deg, min].join(''))],\n ].filter(Boolean);\n\n return (\n errors.length ? [[], errors] : [[deg, min, bear], []]\n ) as ParseResults;\n };\n}\n\nfunction identifyPieces(half: string[]) {\n if (half.length < 1 || half.length > 3) {\n return;\n }\n\n const asString = half.join(' ');\n const places = { bear: '', deg: '', min: '' };\n const keys = ['deg', 'min'] as (keyof typeof places)[];\n const test = (r: RegExp, b: boolean, v: string) =>\n r.test(v) || (r.test(asString) && b);\n\n return half.reduce((acc, token, i, { length }) => {\n if (test(SYMBOL_PATTERNS.NSEW, i === length - 1, token)) {\n acc.bear ||= token;\n } else if (test(SYMBOL_PATTERNS.DEGREES, i === 0, token)) {\n acc.deg ||= token;\n } else if (test(SYMBOL_PATTERNS.MINUTES, i === 1, token)) {\n acc.min ||= token;\n } else {\n const key = keys.find((k) => !acc[k]);\n\n acc[key as keyof typeof acc] = token;\n }\n\n return acc;\n }, places);\n}\n\n/** Parse a Degrees Decimal Minutes coordinate. */\nexport const parseDegreesDecimalMinutes = createParser<DegreesDecimalMinutes>({\n formats,\n identifyErrors,\n identifyPieces,\n});\n"]}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { BEARINGS, SYMBOLS, SYMBOL_PATTERNS } from '../internal/index.js';
|
|
2
2
|
import { parseDegreesDecimalMinutes } from './parser.js';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
var systemDegreesDecimalMinutes = {
|
|
4
|
+
const systemDegreesDecimalMinutes = {
|
|
6
5
|
name: "Degrees Decimal Minutes",
|
|
7
6
|
parse: parseDegreesDecimalMinutes,
|
|
8
7
|
toFloat(arg) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/coordinates/latlon/degrees-decimal-minutes/system.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../src/coordinates/latlon/degrees-decimal-minutes/system.ts"],"names":[],"mappings":";;;AAwBO,MAAM,2BAAA,GAAgD;AAAA,EAC3D,IAAA,EAAM,yBAAA;AAAA,EAEN,KAAA,EAAO,0BAAA;AAAA,EAEP,QAAQ,GAAA,EAAK;AACX,IAAA,MAAM,CAAC,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA,GAAI,GAAA;AAEjC,IAAA,OAAO,MAAA,CAAO,UAAA;AAAA,MAAA,CAAA,CAET,OAAO,UAAA,CAAW,OAAO,CAAA,GAAI,MAAA,CAAO,WAAW,OAAO,CAAA,GAAI,EAAA,KAC1D,eAAA,CAAgB,kBAAkB,IAAA,CAAK,IAAI,IAAI,EAAA,GAAK,CAAA,CAAA,EACrD,QAAQ,CAAC;AAAA,KACb;AAAA,EACF,CAAA;AAAA,EAEA,QAAA,CAAS,MAAA,EAAgB,CAAC,IAAA,EAAM,KAAK,CAAA,EAAqB;AACxD,IAAA,OAAO,CAAC,IAAA,EAAM,KAAK,EAChB,GAAA,CAAI,CAAC,KAAK,KAAA,KAAU;AACnB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AACxB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC1B,MAAA,MAAM,GAAA,GAAM,OAAO,UAAA,CAAA,CAAA,CAAa,GAAA,GAAM,OAAO,EAAA,EAAI,OAAA,CAAQ,CAAC,CAAC,CAAA;AAE3D,MAAA,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,GAAG,CAAA,CAAA,EAAI,QAAA,CAAS,MAAM,CAAA,CAAE,KAAc,CAAA,CAAE,EAAE,GAAA,GAAM,EAAE,CAAC,CAAA,CAAA;AAAA,IACtE,CAAC,CAAA,CACA,IAAA,CAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,EAChC;AACF","file":"system.js","sourcesContent":["// __private-exports\n/*\n * Copyright 2024 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {\n BEARINGS,\n type Compass,\n type Format,\n SYMBOLS,\n SYMBOL_PATTERNS,\n} from '../internal';\nimport type { CoordinateSystem } from '../internal/coordinate-system';\n\nimport { parseDegreesDecimalMinutes } from './parser';\n\nexport const systemDegreesDecimalMinutes: CoordinateSystem = {\n name: 'Degrees Decimal Minutes',\n\n parse: parseDegreesDecimalMinutes,\n\n toFloat(arg) {\n const [degrees, minutes, bear] = arg as [string, string, Compass];\n\n return Number.parseFloat(\n (\n (Number.parseFloat(degrees) + Number.parseFloat(minutes) / 60) *\n (SYMBOL_PATTERNS.NEGATIVE_BEARINGS.test(bear) ? -1 : 1)\n ).toFixed(9),\n );\n },\n\n toFormat(format: Format, [left, right]: [number, number]) {\n return [left, right]\n .map((num, index) => {\n const abs = Math.abs(num);\n const deg = Math.floor(abs);\n const min = Number.parseFloat(((abs - deg) * 60).toFixed(9));\n\n return `${deg} ${min} ${BEARINGS[format][index as 0 | 1][+(num < 0)]}`;\n })\n .join(` ${SYMBOLS.DIVIDER} `);\n },\n};\n"]}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
|
-
import * as Patterning from '
|
|
1
|
+
import * as Patterning from './../../../patterning.js';
|
|
2
2
|
import { PARTIAL_PATTERNS, SYMBOLS, SYMBOL_PATTERNS, BEARINGS, LIMITS } from '../internal/index.js';
|
|
3
3
|
import { inRange } from '../internal/in-range.js';
|
|
4
4
|
import { createParser } from '../internal/parse-format.js';
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
var checks = {
|
|
6
|
+
const checks = {
|
|
8
7
|
deg: (deg, limit) => {
|
|
9
8
|
if (Number.parseFloat(deg) > limit) {
|
|
10
9
|
return `Degrees value (${deg}) exceeds max value (${limit}).`;
|
|
@@ -16,7 +15,7 @@ var checks = {
|
|
|
16
15
|
min: (min) => inRange("Minutes", min, 59),
|
|
17
16
|
sec: (sec) => inRange("Seconds", sec, 59.999999999)
|
|
18
17
|
};
|
|
19
|
-
|
|
18
|
+
const formats = {
|
|
20
19
|
LATLON: Patterning.fromTemplate(
|
|
21
20
|
PARTIAL_PATTERNS,
|
|
22
21
|
`degLat min secDec NS ${SYMBOLS.DIVIDER} degLon min secDec EW`
|
|
@@ -74,7 +73,7 @@ function identifyPieces(half) {
|
|
|
74
73
|
return acc;
|
|
75
74
|
}, places);
|
|
76
75
|
}
|
|
77
|
-
|
|
76
|
+
const parseDegreesMinutesSeconds = createParser({
|
|
78
77
|
formats,
|
|
79
78
|
identifyErrors,
|
|
80
79
|
identifyPieces
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/coordinates/latlon/degrees-minutes-seconds/parser.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../src/coordinates/latlon/degrees-minutes-seconds/parser.ts"],"names":[],"mappings":";;;;;AAiCA,MAAM,MAAA,GAAS;AAAA,EACb,GAAA,EAAK,CAAC,GAAA,EAAa,KAAA,KAAkB;AACnC,IAAA,IAAI,MAAA,CAAO,UAAA,CAAW,GAAG,CAAA,GAAI,KAAA,EAAO;AAClC,MAAA,OAAO,CAAA,eAAA,EAAkB,GAAG,CAAA,qBAAA,EAAwB,KAAK,CAAA,EAAA,CAAA;AAAA,IAC3D;AAEA,IAAA,IAAI,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA,EAAG;AAClB,MAAA,OAAO,kBAAkB,GAAG,CAAA,iCAAA,CAAA;AAAA,IAC9B;AAAA,EACF,CAAA;AAAA,EACA,KAAK,CAAC,GAAA,KAAgB,OAAA,CAAQ,SAAA,EAAW,KAAK,EAAE,CAAA;AAAA,EAChD,KAAK,CAAC,GAAA,KAAgB,OAAA,CAAQ,SAAA,EAAW,KAAK,YAAY;AAC5D,CAAA;AAEA,MAAM,OAAA,GAAU;AAAA,EACd,QAAQ,UAAA,CAAW,YAAA;AAAA,IACjB,gBAAA;AAAA,IACA,CAAA,qBAAA,EAAwB,QAAQ,OAAO,CAAA,qBAAA;AAAA,GACzC;AAAA,EACA,QAAQ,UAAA,CAAW,YAAA;AAAA,IACjB,gBAAA;AAAA,IACA,CAAA,qBAAA,EAAwB,QAAQ,OAAO,CAAA,qBAAA;AAAA;AAE3C,CAAA;AAEA,SAAS,eAAe,MAAA,EAAgB;AACtC,EAAA,OAAO,CAAC,KAAwC,CAAA,KAAc;AAC5D,IAAA,IAAI,CAAC,GAAA,EAAK;AACR,MAAA,OAAO,CAAC,EAAC,EAAG,CAAC,2BAA2B,CAAC,CAAA;AAAA,IAC3C;AAEA,IAAA,IAAI,EAAE,IAAA,EAAM,GAAA,EAAK,GAAA,EAAK,KAAI,GAAI,GAAA;AAE9B,IAAA,GAAA,KAAQ,GAAA;AAER,IAAA,GAAA,KAAQ,GAAA;AACR,IAAA,GAAA,KAAQ,GAAA;AAER,IAAA,IAAI,aAAoB,eAAA,CAAgB,aAAA,CAAc,IAAA,CAAK,GAAG,IAAI,CAAA,GAAI,CAAA;AACtE,IAAA,MAAM,cAAA,GAAiB,QAAA,CAAS,MAAM,CAAA,CAAE,CAAC,CAAA;AAEzC,IAAA,IAAI,CAAC,QAAQ,UAAA,EAAY;AACvB,MAAA,IAAA,GAAO,eAAe,UAAU,CAAA;AAChC,MAAA,GAAA,GAAM,KAAK,GAAA,CAAI,MAAA,CAAO,WAAW,GAAG,CAAC,EAAE,QAAA,EAAS;AAChD,MAAA,UAAA,GAAa,CAAA;AAAA,IACf;AAEA,IAAA,MAAM,MAAA,GAAS;AAAA,MACb,GAAG,CAAC,MAAA,CAAO,GAAA,CAAI,GAAA,EAAK,MAAA,CAAO,MAAM,CAAA,CAAE,CAAC,CAAA,IAAK,CAAC,CAAC,CAAA;AAAA,MAC3C,GAAG,CAAC,MAAA,CAAO,GAAA,CAAI,GAAG,CAAC,CAAA;AAAA,MACnB,GAAG,CAAC,MAAA,CAAO,GAAA,CAAI,GAAG,CAAC;AAAA,KACrB,CAAE,OAAO,OAAO,CAAA;AAEhB,IAAA,OACE,MAAA,CAAO,MAAA,GAAS,CAAC,IAAI,MAAM,CAAA,GAAI,CAAC,CAAC,KAAK,GAAA,EAAK,GAAA,EAAK,IAAI,CAAA,EAAG,EAAE,CAAA;AAAA,EAE7D,CAAA;AACF;AAEA,SAAS,eAAe,IAAA,EAAgB;AACtC,EAAA,IAAI,IAAA,CAAK,MAAA,GAAS,CAAA,IAAK,IAAA,CAAK,SAAS,CAAA,EAAG;AACtC,IAAA;AAAA,EACF;AAEA,EAAA,MAAM,QAAA,GAAW,IAAA,CAAK,IAAA,CAAK,GAAG,CAAA;AAC9B,EAAA,MAAM,MAAA,GAAS,EAAE,IAAA,EAAM,EAAA,EAAI,KAAK,EAAA,EAAI,GAAA,EAAK,EAAA,EAAI,GAAA,EAAK,EAAA,EAAG;AACrD,EAAA,MAAM,IAAA,GAAO,CAAC,KAAA,EAAO,KAAA,EAAO,KAAK,CAAA;AACjC,EAAA,MAAM,IAAA,GAAO,CAAC,CAAA,EAAW,CAAA,EAAY,CAAA,KACnC,CAAA,CAAE,IAAA,CAAK,CAAC,CAAA,IAAM,CAAA,CAAE,IAAA,CAAK,QAAQ,CAAA,IAAK,CAAA;AAEpC,EAAA,OAAO,IAAA,CAAK,OAAO,CAAC,GAAA,EAAK,OAAO,CAAA,EAAG,EAAE,QAAO,KAAM;AAChD,IAAA,IAAI,KAAK,eAAA,CAAgB,IAAA,EAAM,MAAM,MAAA,GAAS,CAAA,EAAG,KAAK,CAAA,EAAG;AACvD,MAAA,GAAA,CAAI,IAAA,KAAS,KAAA;AAAA,IACf,WAAW,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA,KAAM,CAAA,EAAG,KAAK,CAAA,EAAG;AACxD,MAAA,GAAA,CAAI,GAAA,KAAQ,KAAA;AAAA,IACd,WAAW,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA,KAAM,CAAA,EAAG,KAAK,CAAA,EAAG;AACxD,MAAA,GAAA,CAAI,GAAA,KAAQ,KAAA;AAAA,IACd,WAAW,IAAA,CAAK,eAAA,CAAgB,SAAS,CAAA,KAAM,CAAA,EAAG,KAAK,CAAA,EAAG;AACxD,MAAA,GAAA,CAAI,GAAA,KAAQ,KAAA;AAAA,IACd,CAAA,MAAO;AACL,MAAA,MAAM,GAAA,GAAM,KAAK,IAAA,CAAK,CAAC,MAAM,CAAC,GAAA,CAAI,CAAC,CAAC,CAAA;AAEpC,MAAA,GAAA,CAAI,GAAuB,CAAA,GAAI,KAAA;AAAA,IACjC;AAEA,IAAA,OAAO,GAAA;AAAA,EACT,GAAG,MAAM,CAAA;AACX;AAGO,MAAM,6BAA6B,YAAA,CAAoC;AAAA,EAC5E,OAAA;AAAA,EACA,cAAA;AAAA,EACA;AACF,CAAC","file":"parser.js","sourcesContent":["/*\n * Copyright 2024 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport * as Patterning from '@/patterning';\n\nimport {\n BEARINGS,\n type Format,\n LIMITS,\n PARTIAL_PATTERNS,\n SYMBOLS,\n SYMBOL_PATTERNS,\n} from '../internal';\nimport { inRange } from '../internal/in-range';\nimport type { ParseResults } from '../internal/parse';\nimport { createParser } from '../internal/parse-format';\n\ntype DegreesMinutesSeconds = {\n bear: string;\n deg: string;\n min: string;\n sec: string;\n};\n\nconst checks = {\n deg: (deg: string, limit: number) => {\n if (Number.parseFloat(deg) > limit) {\n return `Degrees value (${deg}) exceeds max value (${limit}).`;\n }\n\n if (/\\./.test(deg)) {\n return `Degrees value (${deg}) must not include decimal value.`;\n }\n },\n min: (min: string) => inRange('Minutes', min, 59),\n sec: (sec: string) => inRange('Seconds', sec, 59.999999999),\n};\n\nconst formats = {\n LATLON: Patterning.fromTemplate(\n PARTIAL_PATTERNS,\n `degLat min secDec NS ${SYMBOLS.DIVIDER} degLon min secDec EW`,\n ),\n LONLAT: Patterning.fromTemplate(\n PARTIAL_PATTERNS,\n `degLon min secDec EW ${SYMBOLS.DIVIDER} degLat min secDec NS`,\n ),\n};\n\nfunction identifyErrors(format: Format) {\n return (arg: DegreesMinutesSeconds | undefined, i: number) => {\n if (!arg) {\n return [[], ['Invalid coordinate value.']] as ParseResults;\n }\n\n let { bear, deg, min, sec } = arg;\n\n deg ??= '0';\n // NOTE: need `||=` not `??=` because empty-string is not nullish\n min ||= '0';\n sec ||= '0';\n\n let isNegative: 0 | 1 = SYMBOL_PATTERNS.NEGATIVE_SIGN.test(deg) ? 1 : 0;\n const bearingOptions = BEARINGS[format][i] as [string, string];\n\n if (!bear || isNegative) {\n bear = bearingOptions[isNegative];\n deg = Math.abs(Number.parseFloat(deg)).toString();\n isNegative = 0;\n }\n\n const errors = [\n ...[checks.deg(deg, LIMITS[format][i] ?? 0)],\n ...[checks.min(min)],\n ...[checks.sec(sec)],\n ].filter(Boolean);\n\n return (\n errors.length ? [[], errors] : [[deg, min, sec, bear], []]\n ) as ParseResults;\n };\n}\n\nfunction identifyPieces(half: string[]) {\n if (half.length < 1 || half.length > 4) {\n return;\n }\n\n const asString = half.join(' ');\n const places = { bear: '', deg: '', min: '', sec: '' };\n const keys = ['deg', 'min', 'sec'] as (keyof typeof places)[];\n const test = (r: RegExp, b: boolean, v: string) =>\n r.test(v) || (r.test(asString) && b);\n\n return half.reduce((acc, token, i, { length }) => {\n if (test(SYMBOL_PATTERNS.NSEW, i === length - 1, token)) {\n acc.bear ||= token;\n } else if (test(SYMBOL_PATTERNS.DEGREES, i === 0, token)) {\n acc.deg ||= token;\n } else if (test(SYMBOL_PATTERNS.MINUTES, i === 1, token)) {\n acc.min ||= token;\n } else if (test(SYMBOL_PATTERNS.SECONDS, i === 2, token)) {\n acc.sec ||= token;\n } else {\n const key = keys.find((k) => !acc[k]);\n\n acc[key as keyof typeof acc] = token;\n }\n\n return acc;\n }, places);\n}\n\n/** Parse a Degrees Minutes Seconds coordinate. */\nexport const parseDegreesMinutesSeconds = createParser<DegreesMinutesSeconds>({\n formats,\n identifyErrors,\n identifyPieces,\n});\n"]}
|
|
@@ -1,8 +1,7 @@
|
|
|
1
1
|
import { BEARINGS, SYMBOLS, SYMBOL_PATTERNS } from '../internal/index.js';
|
|
2
2
|
import { parseDegreesMinutesSeconds } from './parser.js';
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
var systemDegreesMinutesSeconds = {
|
|
4
|
+
const systemDegreesMinutesSeconds = {
|
|
6
5
|
name: "Degrees Minutes Seconds",
|
|
7
6
|
parse: parseDegreesMinutesSeconds,
|
|
8
7
|
toFloat(arg) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/coordinates/latlon/degrees-minutes-seconds/system.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../src/coordinates/latlon/degrees-minutes-seconds/system.ts"],"names":[],"mappings":";;;AAwBO,MAAM,2BAAA,GAAgD;AAAA,EAC3D,IAAA,EAAM,yBAAA;AAAA,EAEN,KAAA,EAAO,0BAAA;AAAA,EAEP,QAAQ,GAAA,EAAK;AACX,IAAA,MAAM,CAAC,OAAA,EAAS,OAAA,EAAS,OAAA,EAAS,IAAI,CAAA,GAAI,GAAA;AAO1C,IAAA,OAAO,MAAA,CAAO,UAAA;AAAA,MAAA,CAAA,CAET,MAAA,CAAO,WAAW,OAAO,CAAA,GACxB,OAAO,UAAA,CAAW,OAAO,CAAA,GAAI,EAAA,GAC7B,MAAA,CAAO,UAAA,CAAW,OAAO,CAAA,GAAI,IAAA,KAC9B,gBAAgB,iBAAA,CAAkB,IAAA,CAAK,IAAI,CAAA,GAAI,EAAA,GAAK,CAAA,CAAA,EACrD,OAAA,CAAQ,CAAC;AAAA,KACb;AAAA,EACF,CAAA;AAAA,EAEA,QAAA,CAAS,MAAA,EAAgB,CAAC,IAAA,EAAM,KAAK,CAAA,EAAqB;AACxD,IAAA,OAAO,CAAC,IAAA,EAAM,KAAK,EAChB,GAAA,CAAI,CAAC,KAAK,KAAA,KAAU;AACnB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,GAAA,CAAI,GAAG,CAAA;AACxB,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC1B,MAAA,MAAM,GAAA,GAAA,CAAO,MAAM,GAAA,IAAO,EAAA;AAC1B,MAAA,MAAM,GAAA,GAAM,IAAA,CAAK,KAAA,CAAM,GAAG,CAAA;AAC1B,MAAA,MAAM,GAAA,GAAM,OAAO,UAAA,CAAA,CAAA,CAAa,GAAA,GAAM,OAAO,EAAA,EAAI,OAAA,CAAQ,CAAC,CAAC,CAAA;AAE3D,MAAA,OAAO,CAAA,EAAG,GAAG,CAAA,CAAA,EAAI,GAAG,IAAI,GAAG,CAAA,CAAA,EAAI,QAAA,CAAS,MAAM,EAAE,KAAc,CAAA,CAAE,EAAE,GAAA,GAAM,EAAE,CAAC,CAAA,CAAA;AAAA,IAC7E,CAAC,CAAA,CACA,IAAA,CAAK,CAAA,CAAA,EAAI,OAAA,CAAQ,OAAO,CAAA,CAAA,CAAG,CAAA;AAAA,EAChC;AACF","file":"system.js","sourcesContent":["// __private-exports\n/*\n * Copyright 2024 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport {\n BEARINGS,\n type Compass,\n type Format,\n SYMBOLS,\n SYMBOL_PATTERNS,\n} from '../internal';\nimport type { CoordinateSystem } from '../internal/coordinate-system';\n\nimport { parseDegreesMinutesSeconds } from './parser';\n\nexport const systemDegreesMinutesSeconds: CoordinateSystem = {\n name: 'Degrees Minutes Seconds',\n\n parse: parseDegreesMinutesSeconds,\n\n toFloat(arg) {\n const [degrees, minutes, seconds, bear] = arg as [\n string,\n string,\n string,\n Compass,\n ];\n\n return Number.parseFloat(\n (\n (Number.parseFloat(degrees) +\n Number.parseFloat(minutes) / 60 +\n Number.parseFloat(seconds) / 3600) *\n (SYMBOL_PATTERNS.NEGATIVE_BEARINGS.test(bear) ? -1 : 1)\n ).toFixed(9),\n );\n },\n\n toFormat(format: Format, [left, right]: [number, number]) {\n return [left, right]\n .map((num, index) => {\n const abs = Math.abs(num);\n const deg = Math.floor(abs);\n const rem = (abs - deg) * 60;\n const min = Math.floor(rem);\n const sec = Number.parseFloat(((rem - min) * 60).toFixed(9));\n\n return `${deg} ${min} ${sec} ${BEARINGS[format][index as 0 | 1][+(num < 0)]}`;\n })\n .join(` ${SYMBOLS.DIVIDER} `);\n },\n};\n"]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { SYMBOLS, FORMATS } from '
|
|
1
|
+
import { SYMBOLS, FORMATS } from '.';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
var DIVIDER = ` ${SYMBOLS.DIVIDER} `;
|
|
3
|
+
const DIVIDER = ` ${SYMBOLS.DIVIDER} `;
|
|
5
4
|
function createCache(format, value) {
|
|
6
5
|
const [alternate] = FORMATS.filter((o) => o !== format);
|
|
7
6
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/coordinates/latlon/internal/create-cache.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../src/coordinates/latlon/internal/create-cache.ts"],"names":[],"mappings":";;AAiBA,MAAM,OAAA,GAAU,CAAA,CAAA,EAAI,OAAA,CAAQ,OAAO,CAAA,CAAA,CAAA;AAQ5B,SAAS,WAAA,CAAY,QAAgB,KAAA,EAAe;AACzD,EAAA,MAAM,CAAC,SAAS,CAAA,GAAI,OAAA,CAAQ,OAAO,CAAC,CAAA,KAAM,MAAM,MAAM,CAAA;AAEtD,EAAA,OAAO;AAAA,IACL,CAAC,MAAM,GAAG,KAAA;AAAA,IACV,CAAC,SAAS,GAAG,MAAM,QAAA,CAAS,OAAA,CAAQ,OAAO,CAAA,GACvC,KAAA,CAAM,KAAA,CAAM,OAAO,EAAE,OAAA,EAAQ,CAAE,KAAK,OAAO,CAAA,CAAE,MAAK,GAClD;AAAA,GACN;AACF","file":"create-cache.js","sourcesContent":["// __private-exports\n/*\n * Copyright 2024 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport { FORMATS, type Format, SYMBOLS } from '.';\n\nexport type CoordinateCache = Record<Format, string>;\n\nconst DIVIDER = ` ${SYMBOLS.DIVIDER} `;\n\n/**\n * Create, and initialize, a cache object for coordinate conversions so that\n * conversions are only ever done once and only \"one-direction-ally\". The\n * \"one-direction\" concept is to avoid the problem of encountering rounding\n * errors when converting between multiple formats.\n * */\nexport function createCache(format: Format, value: string) {\n const [alternate] = FORMATS.filter((o) => o !== format) as [Format];\n\n return {\n [format]: value,\n [alternate]: value.includes(SYMBOLS.DIVIDER)\n ? value.split(DIVIDER).reverse().join(DIVIDER).trim()\n : value,\n } as CoordinateCache;\n}\n"]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import { cartesian } from '
|
|
1
|
+
import { cartesian } from './../../../cartesian.js';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
var values = {
|
|
3
|
+
const values = {
|
|
5
4
|
invalid: {
|
|
6
5
|
BLAT: ["X", "random garbage"],
|
|
7
6
|
BLON: ["X", "random garbage"],
|
|
@@ -26,7 +25,7 @@ var values = {
|
|
|
26
25
|
SS: "59.999999999"
|
|
27
26
|
}
|
|
28
27
|
};
|
|
29
|
-
|
|
28
|
+
const systems = [
|
|
30
29
|
{
|
|
31
30
|
designation: "DD",
|
|
32
31
|
LAT: ["DDLAT", "BLAT DDLAT", "DDLAT BLAT"],
|
|
@@ -43,7 +42,7 @@ var systems = [
|
|
|
43
42
|
LON: ["DLON M SS", "BLON DLON M SS", "DLON M SS BLON"]
|
|
44
43
|
}
|
|
45
44
|
];
|
|
46
|
-
|
|
45
|
+
const EXHAUSTIVE_ERRORS = Object.fromEntries(
|
|
47
46
|
systems.map(({ designation, ...system }) => {
|
|
48
47
|
const options = ["LAT LON", "LON LAT"].map((format) => [
|
|
49
48
|
// create object key: 'LATLON' or 'LONLAT'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/coordinates/latlon/internal/exhaustive-errors.ts"],"names":["values"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../src/coordinates/latlon/internal/exhaustive-errors.ts"],"names":["values"],"mappings":"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","file":"exhaustive-errors.js","sourcesContent":["// __private-exports\n/*\n * Copyright 2024 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\nimport { cartesian } from '@/cartesian';\n\ntype Values = {\n invalid: Record<string, string[]>;\n valid: Record<string, string>;\n};\n\nconst values: Values = {\n invalid: {\n BLAT: ['X', 'random garbage'],\n BLON: ['X', 'random garbage'],\n DLAT: ['91', 'nope'],\n DDLAT: ['90.1', 'nope'],\n DLON: ['181', 'nope'],\n DDLON: ['180.1', 'nope'],\n M: ['-1', '61', 'nope'],\n MM: ['-0.1', '60.1', 'nope'],\n SS: ['-0.1', '60.1', 'nope'],\n },\n valid: {\n '/': '/',\n BLAT: 'N',\n BLON: 'E',\n DLAT: '89',\n DDLAT: '89.999999999',\n DLON: '179',\n DDLON: '179.999999999',\n M: '59',\n MM: '59.999999999',\n SS: '59.999999999',\n },\n};\n\nconst systems = [\n {\n designation: 'DD',\n LAT: ['DDLAT', 'BLAT DDLAT', 'DDLAT BLAT'],\n LON: ['DDLON', 'BLON DDLON', 'DDLON BLON'],\n },\n {\n designation: 'DDM',\n LAT: ['DLAT MM', 'BLAT DLAT MM', 'DLAT MM BLAT'],\n LON: ['DLON MM', 'BLON DLON MM', 'DLON MM BLON'],\n },\n {\n designation: 'DMS',\n LAT: ['DLAT M SS', 'BLAT DLAT M SS', 'DLAT M SS BLAT'],\n LON: ['DLON M SS', 'BLON DLON M SS', 'DLON M SS BLON'],\n },\n];\n\n/**\n * A collection of input strings each with exactly one error in a unique\n * position for each format (LATLON and LONLAT) in each system (DD, DDM, DMS).\n */\nexport const EXHAUSTIVE_ERRORS = Object.fromEntries(\n systems.map(({ designation, ...system }) => {\n // for both format options\n const options = ['LAT LON', 'LON LAT'].map((format) => [\n // create object key: 'LATLON' or 'LONLAT'\n format.replace(' ', ''),\n\n // cross-join each variation of LAT with each variation of LON in the system\n cartesian(\n ...format.split(' ').map((key) => system[key as keyof typeof system]),\n )\n // input not including this isn't an error so no need for variation\n .map((pair) => pair.join(' / '))\n // fill the generated template with actual values\n .flatMap((t) => fillTemplate(t, values)),\n ]);\n\n return [designation, Object.fromEntries(options)];\n }),\n);\n\nfunction fillTemplate(template: string, values: Values) {\n return template\n .split(' ')\n .flatMap((key, i, original) => {\n if (!values.invalid[key]) {\n return '';\n }\n\n return (values.invalid[key] as string[]).map((opt) =>\n [...original.slice(0, i), opt, ...original.slice(i + 1)]\n .map((token) => (token in values.valid ? values.valid[token] : token))\n .join(' '),\n );\n })\n .filter(Boolean);\n}\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/coordinates/latlon/internal/in-range.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../src/coordinates/latlon/internal/in-range.ts"],"names":[],"mappings":"AAiBO,MAAM,OAAA,GAAU,CAAC,KAAA,EAAe,KAAA,EAAe,KAAA,KAAkB;AACtE,EAAA,MAAM,GAAA,GAAM,MAAA,CAAO,UAAA,CAAW,KAAK,CAAA;AAEnC,EAAA,IAAI,QAAQ,GAAA,EAAK;AACf,IAAA,OAAO,CAAA,EAAG,KAAK,CAAA,QAAA,EAAW,KAAK,wBAAwB,KAAK,CAAA,EAAA,CAAA;AAAA,EAC9D;AAEA,EAAA,IAAI,MAAM,CAAA,EAAG;AACX,IAAA,OAAO,CAAA,EAAG,KAAK,CAAA,QAAA,EAAW,KAAK,CAAA,mBAAA,CAAA;AAAA,EACjC;AACF","file":"in-range.js","sourcesContent":["// __private-exports\n/*\n * Copyright 2024 Hypergiant Galactic Systems Inc. All rights reserved.\n * This file is licensed to you under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License. You may obtain a copy\n * of the License at https://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software distributed under\n * the License is distributed on an \"AS IS\" BASIS, WITHOUT WARRANTIES OR REPRESENTATIONS\n * OF ANY KIND, either express or implied. See the License for the specific language\n * governing permissions and limitations under the License.\n */\n\n/**\n * Return an error string if the value is outside the range where the limits\n * are 0-limit.\n */\nexport const inRange = (label: string, value: string, limit: number) => {\n const num = Number.parseFloat(value);\n\n if (limit < num) {\n return `${label} value (${value}) exceeds max value (${limit}).`;\n }\n\n if (num < 0) {\n return `${label} value (${value}) must be positive.`;\n }\n};\n"]}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
import * as Patterning from '
|
|
1
|
+
import * as Patterning from './../../../patterning.js';
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
var BEARINGS = {
|
|
3
|
+
const BEARINGS = {
|
|
5
4
|
LAT: ["N", "S"],
|
|
6
5
|
LON: ["E", "W"],
|
|
7
6
|
LATLON: [
|
|
@@ -13,16 +12,16 @@ var BEARINGS = {
|
|
|
13
12
|
["N", "S"]
|
|
14
13
|
]
|
|
15
14
|
};
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
15
|
+
const FORMATS = ["LATLON", "LONLAT"];
|
|
16
|
+
const FORMATS_DEFAULT = FORMATS[0];
|
|
17
|
+
const LIMITS = { LATLON: [90, 180], LONLAT: [180, 90] };
|
|
18
|
+
const SYMBOLS = {
|
|
20
19
|
DEGREES: "\xB0",
|
|
21
20
|
MINUTES: "'",
|
|
22
21
|
SECONDS: '"',
|
|
23
22
|
DIVIDER: "/"
|
|
24
23
|
};
|
|
25
|
-
|
|
24
|
+
const SYMBOL_PATTERNS = {
|
|
26
25
|
LAT: new RegExp(`[${BEARINGS.LAT.join("")}]`),
|
|
27
26
|
LON: new RegExp(`[${BEARINGS.LON.join("")}]`),
|
|
28
27
|
NSEW: new RegExp(`[${[...BEARINGS.LAT, ...BEARINGS.LON].join("")}]`),
|
|
@@ -40,7 +39,7 @@ var SYMBOL_PATTERNS = {
|
|
|
40
39
|
// follow: new RegExp(`\\s?\\k<${'NAMED_SEPARATOR'}>\\s?`),
|
|
41
40
|
// },
|
|
42
41
|
};
|
|
43
|
-
|
|
42
|
+
const decimalSecAndMin = (symbol) => Patterning.optional(
|
|
44
43
|
// Negative lookbehind
|
|
45
44
|
// to ensure that the match is not preceded by a digit,
|
|
46
45
|
// avoiding partial matches within larger numbers.
|
|
@@ -54,7 +53,7 @@ var decimalSecAndMin = (symbol) => Patterning.optional(
|
|
|
54
53
|
// avoiding partial matches within larger numbers.
|
|
55
54
|
/(?!\d)/
|
|
56
55
|
);
|
|
57
|
-
|
|
56
|
+
const PARTIAL_PATTERNS = {
|
|
58
57
|
" ": /\s*/,
|
|
59
58
|
"/": Patterning.capture(SYMBOL_PATTERNS.DIVIDER),
|
|
60
59
|
NS: Patterning.optional(Patterning.capture(SYMBOL_PATTERNS.LAT)),
|