@speleotica/frcsdata 5.1.0 → 5.1.2

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.
Files changed (42) hide show
  1. package/chunksToLines.d.ts +7 -2
  2. package/chunksToLines.d.ts.map +1 -1
  3. package/chunksToLines.js +5 -5
  4. package/chunksToLines.js.map +1 -1
  5. package/cli/encodeWindows1252.d.ts +2 -0
  6. package/cli/encodeWindows1252.d.ts.map +1 -0
  7. package/cli/encodeWindows1252.js +11 -0
  8. package/cli/encodeWindows1252.js.map +1 -0
  9. package/cli/list-names.d.ts.map +1 -1
  10. package/cli/list-names.js +6 -1
  11. package/cli/list-names.js.map +1 -1
  12. package/cli/merge-names-files.d.ts.map +1 -1
  13. package/cli/merge-names-files.js +2 -1
  14. package/cli/merge-names-files.js.map +1 -1
  15. package/cli/readFile.d.ts.map +1 -1
  16. package/cli/readFile.js +1 -1
  17. package/cli/readFile.js.map +1 -1
  18. package/cli/replace-names.d.ts.map +1 -1
  19. package/cli/replace-names.js +3 -2
  20. package/cli/replace-names.js.map +1 -1
  21. package/cli/summarize.d.ts.map +1 -1
  22. package/cli/summarize.js +2 -1
  23. package/cli/summarize.js.map +1 -1
  24. package/node/index.d.ts.map +1 -1
  25. package/node/index.js +5 -3
  26. package/node/index.js.map +1 -1
  27. package/package.json +2 -1
  28. package/src/chunksToLines.ts +18 -4
  29. package/src/cli/encodeWindows1252.ts +5 -0
  30. package/src/cli/list-names.ts +13 -6
  31. package/src/cli/merge-names-files.ts +2 -1
  32. package/src/cli/readFile.ts +3 -1
  33. package/src/cli/replace-names.ts +3 -2
  34. package/src/cli/summarize.ts +2 -1
  35. package/src/node/index.ts +19 -3
  36. package/src/survey/parseFrcsSurveyFile.ts +23 -4
  37. package/src/web/index.ts +1 -1
  38. package/survey/parseFrcsSurveyFile.d.ts.map +1 -1
  39. package/survey/parseFrcsSurveyFile.js +18 -4
  40. package/survey/parseFrcsSurveyFile.js.map +1 -1
  41. package/web/index.js +1 -1
  42. package/web/index.js.map +1 -1
@@ -1,5 +1,10 @@
1
- export declare function chunksToLines(chunks: Iterable<string> | AsyncIterable<string>): AsyncGenerator<{
1
+ export declare function chunksToLines(chunks: Iterable<string> | AsyncIterable<string>, options: {
2
+ includeStartIndex: true;
3
+ }): AsyncIterable<{
2
4
  line: string;
3
5
  startIndex: number;
4
- }, void, unknown>;
6
+ }>;
7
+ export declare function chunksToLines(chunks: Iterable<string> | AsyncIterable<string>, options?: {
8
+ includeStartIndex?: false;
9
+ }): AsyncIterable<string>;
5
10
  //# sourceMappingURL=chunksToLines.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"chunksToLines.d.ts","sourceRoot":"","sources":["src/chunksToLines.ts"],"names":[],"mappings":"AAAA,wBAAuB,aAAa,CAClC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC;;;kBAwBjD"}
1
+ {"version":3,"file":"chunksToLines.d.ts","sourceRoot":"","sources":["src/chunksToLines.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,EAChD,OAAO,EAAE;IAAE,iBAAiB,EAAE,IAAI,CAAA;CAAE,GACnC,aAAa,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAAA;AACtD,wBAAgB,aAAa,CAC3B,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,EAChD,OAAO,CAAC,EAAE;IAAE,iBAAiB,CAAC,EAAE,KAAK,CAAA;CAAE,GACtC,aAAa,CAAC,MAAM,CAAC,CAAA"}
package/chunksToLines.js CHANGED
@@ -4,7 +4,7 @@ Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
6
  exports.chunksToLines = chunksToLines;
7
- async function* chunksToLines(chunks) {
7
+ async function* chunksToLines(chunks, options) {
8
8
  let chunkStartIndex = 0;
9
9
  let remainder = '';
10
10
  let prevChunkEndedWithCarriageReturn = false;
@@ -19,19 +19,19 @@ async function* chunksToLines(chunks) {
19
19
  rx.lastIndex = end;
20
20
  for (const match of chunk.matchAll(rx)) {
21
21
  const line = chunk.substring(end, match.index);
22
- yield {
22
+ yield options?.includeStartIndex ? {
23
23
  line,
24
24
  startIndex: chunkStartIndex + end
25
- };
25
+ } : line;
26
26
  end = match.index + match[0].length;
27
27
  }
28
28
  if (end < chunk.length) remainder = chunk.substring(end);
29
29
  chunkStartIndex += end;
30
30
  prevChunkEndedWithCarriageReturn = chunk[chunk.length - 1] === '\r';
31
31
  }
32
- if (remainder) yield {
32
+ if (remainder) yield options?.includeStartIndex ? {
33
33
  line: remainder,
34
34
  startIndex: chunkStartIndex
35
- };
35
+ } : remainder;
36
36
  }
37
37
  //# sourceMappingURL=chunksToLines.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"chunksToLines.js","names":["chunksToLines","chunks","chunkStartIndex","remainder","prevChunkEndedWithCarriageReturn","chunk","length","end","rx","lastIndex","match","matchAll","line","substring","index","startIndex"],"sources":["src/chunksToLines.ts"],"sourcesContent":["export async function* chunksToLines(\n chunks: Iterable<string> | AsyncIterable<string>\n) {\n let chunkStartIndex = 0\n let remainder = ''\n let prevChunkEndedWithCarriageReturn = false\n for await (let chunk of chunks) {\n if (!chunk.length) continue\n if (remainder) {\n chunk = remainder + chunk\n remainder = ''\n }\n let end = prevChunkEndedWithCarriageReturn && chunk[0] === '\\n' ? 1 : 0\n const rx = /\\r\\n?|\\n/gm\n rx.lastIndex = end\n for (const match of chunk.matchAll(rx)) {\n const line = chunk.substring(end, match.index)\n yield { line, startIndex: chunkStartIndex + end }\n end = match.index + match[0].length\n }\n if (end < chunk.length) remainder = chunk.substring(end)\n chunkStartIndex += end\n prevChunkEndedWithCarriageReturn = chunk[chunk.length - 1] === '\\r'\n }\n if (remainder) yield { line: remainder, startIndex: chunkStartIndex }\n}\n"],"mappings":";;;;;;AAAO,gBAAgBA,aAAaA,CAClCC,MAAgD,EAChD;EACA,IAAIC,eAAe,GAAG,CAAC;EACvB,IAAIC,SAAS,GAAG,EAAE;EAClB,IAAIC,gCAAgC,GAAG,KAAK;EAC5C,WAAW,IAAIC,KAAK,IAAIJ,MAAM,EAAE;IAC9B,IAAI,CAACI,KAAK,CAACC,MAAM,EAAE;IACnB,IAAIH,SAAS,EAAE;MACbE,KAAK,GAAGF,SAAS,GAAGE,KAAK;MACzBF,SAAS,GAAG,EAAE;IAChB;IACA,IAAII,GAAG,GAAGH,gCAAgC,IAAIC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC;IACvE,MAAMG,EAAE,GAAG,YAAY;IACvBA,EAAE,CAACC,SAAS,GAAGF,GAAG;IAClB,KAAK,MAAMG,KAAK,IAAIL,KAAK,CAACM,QAAQ,CAACH,EAAE,CAAC,EAAE;MACtC,MAAMI,IAAI,GAAGP,KAAK,CAACQ,SAAS,CAACN,GAAG,EAAEG,KAAK,CAACI,KAAK,CAAC;MAC9C,MAAM;QAAEF,IAAI;QAAEG,UAAU,EAAEb,eAAe,GAAGK;MAAI,CAAC;MACjDA,GAAG,GAAGG,KAAK,CAACI,KAAK,GAAGJ,KAAK,CAAC,CAAC,CAAC,CAACJ,MAAM;IACrC;IACA,IAAIC,GAAG,GAAGF,KAAK,CAACC,MAAM,EAAEH,SAAS,GAAGE,KAAK,CAACQ,SAAS,CAACN,GAAG,CAAC;IACxDL,eAAe,IAAIK,GAAG;IACtBH,gCAAgC,GAAGC,KAAK,CAACA,KAAK,CAACC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI;EACrE;EACA,IAAIH,SAAS,EAAE,MAAM;IAAES,IAAI,EAAET,SAAS;IAAEY,UAAU,EAAEb;EAAgB,CAAC;AACvE","ignoreList":[]}
1
+ {"version":3,"file":"chunksToLines.js","names":["chunksToLines","chunks","options","chunkStartIndex","remainder","prevChunkEndedWithCarriageReturn","chunk","length","end","rx","lastIndex","match","matchAll","line","substring","index","includeStartIndex","startIndex"],"sources":["src/chunksToLines.ts"],"sourcesContent":["export function chunksToLines(\n chunks: Iterable<string> | AsyncIterable<string>,\n options: { includeStartIndex: true }\n): AsyncIterable<{ line: string; startIndex: number }>\nexport function chunksToLines(\n chunks: Iterable<string> | AsyncIterable<string>,\n options?: { includeStartIndex?: false }\n): AsyncIterable<string>\nexport async function* chunksToLines(\n chunks: Iterable<string> | AsyncIterable<string>,\n options?: { includeStartIndex?: boolean }\n): AsyncIterable<string | { line: string; startIndex: number }> {\n let chunkStartIndex = 0\n let remainder = ''\n let prevChunkEndedWithCarriageReturn = false\n for await (let chunk of chunks) {\n if (!chunk.length) continue\n if (remainder) {\n chunk = remainder + chunk\n remainder = ''\n }\n let end = prevChunkEndedWithCarriageReturn && chunk[0] === '\\n' ? 1 : 0\n const rx = /\\r\\n?|\\n/gm\n rx.lastIndex = end\n for (const match of chunk.matchAll(rx)) {\n const line = chunk.substring(end, match.index)\n yield options?.includeStartIndex\n ? { line, startIndex: chunkStartIndex + end }\n : line\n end = match.index + match[0].length\n }\n if (end < chunk.length) remainder = chunk.substring(end)\n chunkStartIndex += end\n prevChunkEndedWithCarriageReturn = chunk[chunk.length - 1] === '\\r'\n }\n if (remainder)\n yield options?.includeStartIndex\n ? { line: remainder, startIndex: chunkStartIndex }\n : remainder\n}\n"],"mappings":";;;;;;AAQO,gBAAgBA,aAAaA,CAClCC,MAAgD,EAChDC,OAAyC,EACqB;EAC9D,IAAIC,eAAe,GAAG,CAAC;EACvB,IAAIC,SAAS,GAAG,EAAE;EAClB,IAAIC,gCAAgC,GAAG,KAAK;EAC5C,WAAW,IAAIC,KAAK,IAAIL,MAAM,EAAE;IAC9B,IAAI,CAACK,KAAK,CAACC,MAAM,EAAE;IACnB,IAAIH,SAAS,EAAE;MACbE,KAAK,GAAGF,SAAS,GAAGE,KAAK;MACzBF,SAAS,GAAG,EAAE;IAChB;IACA,IAAII,GAAG,GAAGH,gCAAgC,IAAIC,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,GAAG,CAAC;IACvE,MAAMG,EAAE,GAAG,YAAY;IACvBA,EAAE,CAACC,SAAS,GAAGF,GAAG;IAClB,KAAK,MAAMG,KAAK,IAAIL,KAAK,CAACM,QAAQ,CAACH,EAAE,CAAC,EAAE;MACtC,MAAMI,IAAI,GAAGP,KAAK,CAACQ,SAAS,CAACN,GAAG,EAAEG,KAAK,CAACI,KAAK,CAAC;MAC9C,MAAMb,OAAO,EAAEc,iBAAiB,GAC5B;QAAEH,IAAI;QAAEI,UAAU,EAAEd,eAAe,GAAGK;MAAI,CAAC,GAC3CK,IAAI;MACRL,GAAG,GAAGG,KAAK,CAACI,KAAK,GAAGJ,KAAK,CAAC,CAAC,CAAC,CAACJ,MAAM;IACrC;IACA,IAAIC,GAAG,GAAGF,KAAK,CAACC,MAAM,EAAEH,SAAS,GAAGE,KAAK,CAACQ,SAAS,CAACN,GAAG,CAAC;IACxDL,eAAe,IAAIK,GAAG;IACtBH,gCAAgC,GAAGC,KAAK,CAACA,KAAK,CAACC,MAAM,GAAG,CAAC,CAAC,KAAK,IAAI;EACrE;EACA,IAAIH,SAAS,EACX,MAAMF,OAAO,EAAEc,iBAAiB,GAC5B;IAAEH,IAAI,EAAET,SAAS;IAAEa,UAAU,EAAEd;EAAgB,CAAC,GAChDC,SAAS;AACjB","ignoreList":[]}
@@ -0,0 +1,2 @@
1
+ export declare function encodeWindows1252(text: string): Uint8Array<ArrayBuffer>;
2
+ //# sourceMappingURL=encodeWindows1252.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encodeWindows1252.d.ts","sourceRoot":"","sources":["../../src/cli/encodeWindows1252.ts"],"names":[],"mappings":"AAEA,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,2BAE7C"}
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.encodeWindows1252 = encodeWindows1252;
7
+ var _windows = require("windows-1252");
8
+ function encodeWindows1252(text) {
9
+ return new Uint8Array((0, _windows.encode)(text));
10
+ }
11
+ //# sourceMappingURL=encodeWindows1252.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encodeWindows1252.js","names":["_windows","require","encodeWindows1252","text","Uint8Array","encode"],"sources":["../../src/cli/encodeWindows1252.ts"],"sourcesContent":["import { encode } from 'windows-1252'\n\nexport function encodeWindows1252(text: string) {\n return new Uint8Array(encode(text))\n}\n"],"mappings":";;;;;;AAAA,IAAAA,QAAA,GAAAC,OAAA;AAEO,SAASC,iBAAiBA,CAACC,IAAY,EAAE;EAC9C,OAAO,IAAIC,UAAU,CAAC,IAAAC,eAAM,EAACF,IAAI,CAAC,CAAC;AACrC","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"list-names.d.ts","sourceRoot":"","sources":["../../src/cli/list-names.ts"],"names":[],"mappings":"AASA,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAC;IAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAAE,iBAyErE"}
1
+ {"version":3,"file":"list-names.d.ts","sourceRoot":"","sources":["../../src/cli/list-names.ts"],"names":[],"mappings":"AAUA,wBAAsB,eAAe,CACnC,IAAI,EAAE,MAAM,EACZ,OAAO,CAAC,EAAE;IAAE,aAAa,CAAC,EAAE,OAAO,CAAC;IAAC,mBAAmB,CAAC,EAAE,OAAO,CAAA;CAAE,iBA+ErE"}
package/cli/list-names.js CHANGED
@@ -11,6 +11,7 @@ var _unwrapInvalid = require("../unwrapInvalid.js");
11
11
  var _groupBy = require("@jcoreio/utils/groupBy");
12
12
  var _compareNames = require("./compareNames.js");
13
13
  var _readFile = require("./readFile.js");
14
+ var _encodeWindows = require("./encodeWindows1252.js");
14
15
  /* eslint-disable no-console */
15
16
 
16
17
  async function listSurveyNames(file, options) {
@@ -60,7 +61,11 @@ async function listSurveyNames(file, options) {
60
61
  }
61
62
  for (const [name, count] of table) {
62
63
  const replacement = replacements.get(name);
63
- if (includeCounts) console.log(count.toFixed().padStart(countLength), name, ...(replacement ? ['=>', replacement] : []));else console.log(name, ...(replacement ? ['=>', replacement] : []));
64
+ if (includeCounts) {
65
+ process.stdout.write((0, _encodeWindows.encodeWindows1252)(`${count.toFixed().padStart(countLength)} ${name}${replacement ? ` => ${replacement}` : ''}\n`));
66
+ } else {
67
+ process.stdout.write((0, _encodeWindows.encodeWindows1252)(`${name}${replacement ? ` => ${replacement}` : ''}\n`));
68
+ }
64
69
  }
65
70
  }
66
71
  const countCaps = name => {
@@ -1 +1 @@
1
- {"version":3,"file":"list-names.js","names":["_index","require","_normalizeTeamMemberName","_ZodFrcsSurveyFileToJson","_unwrapInvalid","_groupBy","_compareNames","_readFile","listSurveyNames","file","options","parsed","ZodValidOrInvalidFrcsSurveyFileToJson","parse","parseFrcsSurveyFile","readFile","normalizeNames","nameCounts","Map","trip","unwrapInvalid","trips","team","header","name","set","get","table","entries","sort","a","b","compareNames","maxNameCount","reduce","max","count","Math","countLength","toFixed","length","includeCounts","names","keys","replacements","suggestReplacements","group","groupBy","toLowerCase","values","normalized","normalizeNameCapitalization","best","map","countCaps","firstInitials","filter","test","replace","firstInitial","m","substring","matches","match","replacement","console","log","padStart","lower","i"],"sources":["../../src/cli/list-names.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { parseFrcsSurveyFile } from '../string/index'\nimport { normalizeNameCapitalization } from '../survey/normalizeTeamMemberName'\nimport { ZodValidOrInvalidFrcsSurveyFileToJson } from '../survey/ZodFrcsSurveyFileToJson'\nimport { unwrapInvalid } from '../unwrapInvalid'\nimport { groupBy } from '@jcoreio/utils/groupBy'\nimport { compareNames } from './compareNames'\nimport { readFile } from './readFile'\n\nexport async function listSurveyNames(\n file: string,\n options?: { includeCounts?: boolean; suggestReplacements?: boolean }\n) {\n const parsed = ZodValidOrInvalidFrcsSurveyFileToJson.parse(\n await parseFrcsSurveyFile(file, await readFile(file), {\n normalizeNames: false,\n })\n )\n const nameCounts = new Map<string, number>()\n for (const trip of unwrapInvalid(parsed).trips) {\n const { team } = unwrapInvalid(unwrapInvalid(trip).header)\n if (!team) continue\n for (const name of team) {\n nameCounts.set(name, (nameCounts.get(name) ?? 0) + 1)\n }\n }\n\n const table = [...nameCounts.entries()].sort((a, b) =>\n compareNames(a[0], b[0])\n )\n const maxNameCount = table.reduce((max, [, count]) => Math.max(max, count), 0)\n const countLength = maxNameCount.toFixed().length\n\n const includeCounts = options?.includeCounts ?? false\n\n const names = [...nameCounts.keys()]\n\n const replacements = new Map<string, string>()\n if (options?.suggestReplacements) {\n for (const group of groupBy(names, (name) => name.toLowerCase()).values()) {\n if (group.length === 1) {\n const [name] = group\n const normalized = normalizeNameCapitalization(name)\n if (normalized !== name) replacements.set(name, normalized)\n continue\n }\n const best = group\n .map((name) => normalizeNameCapitalization(name))\n .reduce((a, b) => (countCaps(a) > countCaps(b) ? a : b))\n for (const name of group) {\n if (name !== best) replacements.set(name, best)\n }\n }\n\n const firstInitials = groupBy(\n names.filter((name) => /^\\S[. ]/.test(name)),\n (name) => name.toLowerCase().replace(/\\.\\s*/g, ' ')\n )\n\n for (const name of names) {\n if (/^\\S[. ]/.test(name)) continue\n const firstInitial = name\n .toLowerCase()\n .replace(/^\\S+/, (m) => m.substring(0, 1))\n .replace(/\\.\\s*/g, ' ')\n const matches = firstInitials.get(firstInitial)\n if (matches) {\n for (const match of matches) {\n replacements.set(match, replacements.get(name) ?? name)\n }\n }\n }\n }\n\n for (const [name, count] of table) {\n const replacement = replacements.get(name)\n if (includeCounts)\n console.log(\n count.toFixed().padStart(countLength),\n name,\n ...(replacement ? ['=>', replacement] : [])\n )\n else console.log(name, ...(replacement ? ['=>', replacement] : []))\n }\n}\n\nconst countCaps = (name: string) => {\n const lower = name.toLowerCase()\n let count = 0\n for (let i = 0; i < name.length; i++) {\n if (name[i] !== lower[i]) count++\n }\n return count\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"list-names.js","names":["_index","require","_normalizeTeamMemberName","_ZodFrcsSurveyFileToJson","_unwrapInvalid","_groupBy","_compareNames","_readFile","_encodeWindows","listSurveyNames","file","options","parsed","ZodValidOrInvalidFrcsSurveyFileToJson","parse","parseFrcsSurveyFile","readFile","normalizeNames","nameCounts","Map","trip","unwrapInvalid","trips","team","header","name","set","get","table","entries","sort","a","b","compareNames","maxNameCount","reduce","max","count","Math","countLength","toFixed","length","includeCounts","names","keys","replacements","suggestReplacements","group","groupBy","toLowerCase","values","normalized","normalizeNameCapitalization","best","map","countCaps","firstInitials","filter","test","replace","firstInitial","m","substring","matches","match","replacement","process","stdout","write","encodeWindows1252","padStart","lower","i"],"sources":["../../src/cli/list-names.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport { parseFrcsSurveyFile } from '../string/index'\nimport { normalizeNameCapitalization } from '../survey/normalizeTeamMemberName'\nimport { ZodValidOrInvalidFrcsSurveyFileToJson } from '../survey/ZodFrcsSurveyFileToJson'\nimport { unwrapInvalid } from '../unwrapInvalid'\nimport { groupBy } from '@jcoreio/utils/groupBy'\nimport { compareNames } from './compareNames'\nimport { readFile } from './readFile'\nimport { encodeWindows1252 } from './encodeWindows1252'\n\nexport async function listSurveyNames(\n file: string,\n options?: { includeCounts?: boolean; suggestReplacements?: boolean }\n) {\n const parsed = ZodValidOrInvalidFrcsSurveyFileToJson.parse(\n await parseFrcsSurveyFile(file, await readFile(file), {\n normalizeNames: false,\n })\n )\n const nameCounts = new Map<string, number>()\n for (const trip of unwrapInvalid(parsed).trips) {\n const { team } = unwrapInvalid(unwrapInvalid(trip).header)\n if (!team) continue\n for (const name of team) {\n nameCounts.set(name, (nameCounts.get(name) ?? 0) + 1)\n }\n }\n\n const table = [...nameCounts.entries()].sort((a, b) =>\n compareNames(a[0], b[0])\n )\n const maxNameCount = table.reduce((max, [, count]) => Math.max(max, count), 0)\n const countLength = maxNameCount.toFixed().length\n\n const includeCounts = options?.includeCounts ?? false\n\n const names = [...nameCounts.keys()]\n\n const replacements = new Map<string, string>()\n if (options?.suggestReplacements) {\n for (const group of groupBy(names, (name) => name.toLowerCase()).values()) {\n if (group.length === 1) {\n const [name] = group\n const normalized = normalizeNameCapitalization(name)\n if (normalized !== name) replacements.set(name, normalized)\n continue\n }\n const best = group\n .map((name) => normalizeNameCapitalization(name))\n .reduce((a, b) => (countCaps(a) > countCaps(b) ? a : b))\n for (const name of group) {\n if (name !== best) replacements.set(name, best)\n }\n }\n\n const firstInitials = groupBy(\n names.filter((name) => /^\\S[. ]/.test(name)),\n (name) => name.toLowerCase().replace(/\\.\\s*/g, ' ')\n )\n\n for (const name of names) {\n if (/^\\S[. ]/.test(name)) continue\n const firstInitial = name\n .toLowerCase()\n .replace(/^\\S+/, (m) => m.substring(0, 1))\n .replace(/\\.\\s*/g, ' ')\n const matches = firstInitials.get(firstInitial)\n if (matches) {\n for (const match of matches) {\n replacements.set(match, replacements.get(name) ?? name)\n }\n }\n }\n }\n\n for (const [name, count] of table) {\n const replacement = replacements.get(name)\n if (includeCounts) {\n process.stdout.write(\n encodeWindows1252(\n `${count.toFixed().padStart(countLength)} ${name}${\n replacement ? ` => ${replacement}` : ''\n }\\n`\n )\n )\n } else {\n process.stdout.write(\n encodeWindows1252(`${name}${replacement ? ` => ${replacement}` : ''}\\n`)\n )\n }\n }\n}\n\nconst countCaps = (name: string) => {\n const lower = name.toLowerCase()\n let count = 0\n for (let i = 0; i < name.length; i++) {\n if (name[i] !== lower[i]) count++\n }\n return count\n}\n"],"mappings":"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","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"merge-names-files.d.ts","sourceRoot":"","sources":["../../src/cli/merge-names-files.ts"],"names":[],"mappings":"AAIA,wBAAsB,eAAe,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,iBAavD"}
1
+ {"version":3,"file":"merge-names-files.d.ts","sourceRoot":"","sources":["../../src/cli/merge-names-files.ts"],"names":[],"mappings":"AAKA,wBAAsB,eAAe,CAAC,GAAG,KAAK,EAAE,MAAM,EAAE,iBAavD"}
@@ -7,6 +7,7 @@ exports.mergeNamesFiles = mergeNamesFiles;
7
7
  var _parseNamesFile = require("./parseNamesFile.js");
8
8
  var _formatNamesFile = require("./formatNamesFile.js");
9
9
  var _readFile = require("./readFile.js");
10
+ var _encodeWindows = require("./encodeWindows1252.js");
10
11
  async function mergeNamesFiles(...files) {
11
12
  const names = new Map();
12
13
  for (const file of files) {
@@ -20,6 +21,6 @@ async function mergeNamesFiles(...files) {
20
21
  });else if (!existing.replacement) existing.replacement = replacement;
21
22
  }
22
23
  }
23
- process.stdout.write((0, _formatNamesFile.formatNamesFile)(names));
24
+ process.stdout.write((0, _encodeWindows.encodeWindows1252)((0, _formatNamesFile.formatNamesFile)(names)));
24
25
  }
25
26
  //# sourceMappingURL=merge-names-files.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"merge-names-files.js","names":["_parseNamesFile","require","_formatNamesFile","_readFile","mergeNamesFiles","files","names","Map","file","parsed","parseNamesFile","readFile","name","replacement","existing","get","set","process","stdout","write","formatNamesFile"],"sources":["../../src/cli/merge-names-files.ts"],"sourcesContent":["import { parseNamesFile } from './parseNamesFile'\nimport { formatNamesFile } from './formatNamesFile'\nimport { readFile } from './readFile'\n\nexport async function mergeNamesFiles(...files: string[]) {\n const names = new Map<string, { replacement?: string }>()\n\n for (const file of files) {\n const parsed = parseNamesFile(await readFile(file))\n for (const [name, { replacement }] of parsed) {\n const existing = names.get(name)\n if (!existing) names.set(name, { replacement })\n else if (!existing.replacement) existing.replacement = replacement\n }\n }\n\n process.stdout.write(formatNamesFile(names))\n}\n"],"mappings":";;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,gBAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AAEO,eAAeG,eAAeA,CAAC,GAAGC,KAAe,EAAE;EACxD,MAAMC,KAAK,GAAG,IAAIC,GAAG,CAAmC,CAAC;EAEzD,KAAK,MAAMC,IAAI,IAAIH,KAAK,EAAE;IACxB,MAAMI,MAAM,GAAG,IAAAC,8BAAc,EAAC,MAAM,IAAAC,kBAAQ,EAACH,IAAI,CAAC,CAAC;IACnD,KAAK,MAAM,CAACI,IAAI,EAAE;MAAEC;IAAY,CAAC,CAAC,IAAIJ,MAAM,EAAE;MAC5C,MAAMK,QAAQ,GAAGR,KAAK,CAACS,GAAG,CAACH,IAAI,CAAC;MAChC,IAAI,CAACE,QAAQ,EAAER,KAAK,CAACU,GAAG,CAACJ,IAAI,EAAE;QAAEC;MAAY,CAAC,CAAC,MAC1C,IAAI,CAACC,QAAQ,CAACD,WAAW,EAAEC,QAAQ,CAACD,WAAW,GAAGA,WAAW;IACpE;EACF;EAEAI,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC,IAAAC,gCAAe,EAACd,KAAK,CAAC,CAAC;AAC9C","ignoreList":[]}
1
+ {"version":3,"file":"merge-names-files.js","names":["_parseNamesFile","require","_formatNamesFile","_readFile","_encodeWindows","mergeNamesFiles","files","names","Map","file","parsed","parseNamesFile","readFile","name","replacement","existing","get","set","process","stdout","write","encodeWindows1252","formatNamesFile"],"sources":["../../src/cli/merge-names-files.ts"],"sourcesContent":["import { parseNamesFile } from './parseNamesFile'\nimport { formatNamesFile } from './formatNamesFile'\nimport { readFile } from './readFile'\nimport { encodeWindows1252 } from './encodeWindows1252'\n\nexport async function mergeNamesFiles(...files: string[]) {\n const names = new Map<string, { replacement?: string }>()\n\n for (const file of files) {\n const parsed = parseNamesFile(await readFile(file))\n for (const [name, { replacement }] of parsed) {\n const existing = names.get(name)\n if (!existing) names.set(name, { replacement })\n else if (!existing.replacement) existing.replacement = replacement\n }\n }\n\n process.stdout.write(encodeWindows1252(formatNamesFile(names)))\n}\n"],"mappings":";;;;;;AAAA,IAAAA,eAAA,GAAAC,OAAA;AACA,IAAAC,gBAAA,GAAAD,OAAA;AACA,IAAAE,SAAA,GAAAF,OAAA;AACA,IAAAG,cAAA,GAAAH,OAAA;AAEO,eAAeI,eAAeA,CAAC,GAAGC,KAAe,EAAE;EACxD,MAAMC,KAAK,GAAG,IAAIC,GAAG,CAAmC,CAAC;EAEzD,KAAK,MAAMC,IAAI,IAAIH,KAAK,EAAE;IACxB,MAAMI,MAAM,GAAG,IAAAC,8BAAc,EAAC,MAAM,IAAAC,kBAAQ,EAACH,IAAI,CAAC,CAAC;IACnD,KAAK,MAAM,CAACI,IAAI,EAAE;MAAEC;IAAY,CAAC,CAAC,IAAIJ,MAAM,EAAE;MAC5C,MAAMK,QAAQ,GAAGR,KAAK,CAACS,GAAG,CAACH,IAAI,CAAC;MAChC,IAAI,CAACE,QAAQ,EAAER,KAAK,CAACU,GAAG,CAACJ,IAAI,EAAE;QAAEC;MAAY,CAAC,CAAC,MAC1C,IAAI,CAACC,QAAQ,CAACD,WAAW,EAAEC,QAAQ,CAACD,WAAW,GAAGA,WAAW;IACpE;EACF;EAEAI,OAAO,CAACC,MAAM,CAACC,KAAK,CAAC,IAAAC,gCAAiB,EAAC,IAAAC,gCAAe,EAACf,KAAK,CAAC,CAAC,CAAC;AACjE","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"readFile.d.ts","sourceRoot":"","sources":["../../src/cli/readFile.ts"],"names":[],"mappings":"AAGA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,mBAE1C"}
1
+ {"version":3,"file":"readFile.d.ts","sourceRoot":"","sources":["../../src/cli/readFile.ts"],"names":[],"mappings":"AAGA,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,mBAI1C"}
package/cli/readFile.js CHANGED
@@ -8,6 +8,6 @@ exports.readFile = readFile;
8
8
  var _fs = _interopRequireDefault(require("fs"));
9
9
  var _util = require("util");
10
10
  async function readFile(file) {
11
- return await (0, _util.promisify)(cb => _fs.default.readFile(file || 0, 'utf8', cb))();
11
+ return new TextDecoder('windows-1252').decode(await (0, _util.promisify)(cb => _fs.default.readFile(file || 0, cb))());
12
12
  }
13
13
  //# sourceMappingURL=readFile.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"readFile.js","names":["_fs","_interopRequireDefault","require","_util","readFile","file","promisify","cb","fs"],"sources":["../../src/cli/readFile.ts"],"sourcesContent":["import fs from 'fs'\nimport { promisify } from 'util'\n\nexport async function readFile(file: string) {\n return await promisify<string>((cb) => fs.readFile(file || 0, 'utf8', cb))()\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,GAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AAEO,eAAeE,QAAQA,CAACC,IAAY,EAAE;EAC3C,OAAO,MAAM,IAAAC,eAAS,EAAUC,EAAE,IAAKC,WAAE,CAACJ,QAAQ,CAACC,IAAI,IAAI,CAAC,EAAE,MAAM,EAAEE,EAAE,CAAC,CAAC,CAAC,CAAC;AAC9E","ignoreList":[]}
1
+ {"version":3,"file":"readFile.js","names":["_fs","_interopRequireDefault","require","_util","readFile","file","TextDecoder","decode","promisify","cb","fs"],"sources":["../../src/cli/readFile.ts"],"sourcesContent":["import fs from 'fs'\nimport { promisify } from 'util'\n\nexport async function readFile(file: string) {\n return new TextDecoder('windows-1252').decode(\n await promisify<Buffer>((cb) => fs.readFile(file || 0, cb))()\n )\n}\n"],"mappings":";;;;;;;AAAA,IAAAA,GAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,KAAA,GAAAD,OAAA;AAEO,eAAeE,QAAQA,CAACC,IAAY,EAAE;EAC3C,OAAO,IAAIC,WAAW,CAAC,cAAc,CAAC,CAACC,MAAM,CAC3C,MAAM,IAAAC,eAAS,EAAUC,EAAE,IAAKC,WAAE,CAACN,QAAQ,CAACC,IAAI,IAAI,CAAC,EAAEI,EAAE,CAAC,CAAC,CAAC,CAC9D,CAAC;AACH","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"replace-names.d.ts","sourceRoot":"","sources":["../../src/cli/replace-names.ts"],"names":[],"mappings":"AAWA,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,iBAuEF"}
1
+ {"version":3,"file":"replace-names.d.ts","sourceRoot":"","sources":["../../src/cli/replace-names.ts"],"names":[],"mappings":"AAYA,wBAAsB,kBAAkB,CACtC,UAAU,EAAE,MAAM,EAClB,gBAAgB,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE;IACR,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,KAAK,CAAC,EAAE,OAAO,CAAA;CAChB,iBAuEF"}
@@ -14,6 +14,7 @@ var _readFile = require("./readFile.js");
14
14
  var _promises = require("fs/promises");
15
15
  var _chalk = _interopRequireDefault(require("chalk"));
16
16
  var _compareNames = require("./compareNames.js");
17
+ var _encodeWindows = require("./encodeWindows1252.js");
17
18
  /* eslint-disable no-console */
18
19
 
19
20
  async function replaceSurveyNames(surveyFile, replacementsFile, options) {
@@ -53,9 +54,9 @@ async function replaceSurveyNames(surveyFile, replacementsFile, options) {
53
54
  }
54
55
  }
55
56
  }
56
- const replaced = (0, _replaceRanges.replaceRanges)(source, replacements);
57
+ const replaced = (0, _encodeWindows.encodeWindows1252)((0, _replaceRanges.replaceRanges)(source, replacements));
57
58
  if (options?.write) {
58
- await (0, _promises.writeFile)(surveyFile, replaced, 'utf8');
59
+ await (0, _promises.writeFile)(surveyFile, replaced);
59
60
  } else {
60
61
  process.stdout.write(replaced);
61
62
  }
@@ -1 +1 @@
1
- {"version":3,"file":"replace-names.js","names":["_parseFrcsSurveyFile","_interopRequireDefault","require","_replaceRanges","_ZodFrcsSurveyFileToJson","_unwrapInvalid","_parseNamesFile","_readFile","_promises","_chalk","_compareNames","replaceSurveyNames","surveyFile","replacementsFile","options","source","readFile","parsed","ZodValidOrInvalidFrcsSurveyFileToJson","parse","parseFrcsSurveyFile","normalizeNames","includeLocs","names","parseNamesFile","unreplacedNames","Set","entries","flatMap","name","replacement","replacedNames","replacementCount","replacements","trip","unwrapInvalid","trips","team","locs","teamLocs","header","i","length","loc","get","delete","add","push","start","index","end","value","replaced","replaceRanges","write","writeFile","process","stdout","console","error","chalk","yellow","size","verbose","green","sort","compareNames"],"sources":["../../src/cli/replace-names.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport parseFrcsSurveyFile from '../survey/parseFrcsSurveyFile'\nimport { replaceRanges } from '../replaceRanges'\nimport { ZodValidOrInvalidFrcsSurveyFileToJson } from '../survey/ZodFrcsSurveyFileToJson'\nimport { unwrapInvalid } from '../unwrapInvalid'\nimport { parseNamesFile } from './parseNamesFile'\nimport { readFile } from './readFile'\nimport { writeFile } from 'fs/promises'\nimport chalk from 'chalk'\nimport { compareNames } from './compareNames'\n\nexport async function replaceSurveyNames(\n surveyFile: string,\n replacementsFile: string,\n options?: {\n verbose?: boolean\n write?: boolean\n }\n) {\n const source = await readFile(surveyFile)\n const parsed = ZodValidOrInvalidFrcsSurveyFileToJson.parse(\n await parseFrcsSurveyFile(surveyFile, [source], {\n normalizeNames: false,\n includeLocs: true,\n })\n )\n const names = await parseNamesFile(await readFile(replacementsFile))\n\n const unreplacedNames = new Set<string>(\n [...names.entries()].flatMap(([name, { replacement }]) =>\n replacement ? name : []\n )\n )\n const replacedNames = new Set<string>()\n let replacementCount = 0\n\n const replacements: { start: number; end: number; value: string }[] = []\n for (const trip of unwrapInvalid(parsed).trips) {\n const { team, locs: { team: teamLocs } = {} } = unwrapInvalid(\n unwrapInvalid(trip).header\n )\n if (!team || !teamLocs) continue\n for (let i = 0; i < team.length; i++) {\n const name = team[i]\n const loc = teamLocs[i]\n const replacement = names.get(name)?.replacement\n if (replacement && loc) {\n unreplacedNames.delete(name)\n replacedNames.add(name)\n replacementCount++\n replacements.push({\n start: loc.start.index,\n end: loc.end.index,\n value: replacement,\n })\n }\n }\n }\n\n const replaced = replaceRanges(source, replacements)\n if (options?.write) {\n await writeFile(surveyFile, replaced, 'utf8')\n } else {\n process.stdout.write(replaced)\n }\n console.error(\n chalk.yellow(\n `replaced ${replacedNames.size} name${\n replacedNames.size === 1 ? '' : 's'\n } in ${replacementCount} location${replacementCount === 1 ? '' : 's'}`\n )\n )\n console.error(\n unreplacedNames.size\n ? chalk.yellow(\n `${unreplacedNames.size} name replacement${\n unreplacedNames.size === 1 ? ' was' : 's were'\n } unused${options?.verbose ? ':' : ''}`\n )\n : chalk.green('all name replacements were used')\n )\n if (options?.verbose) {\n for (const name of [...unreplacedNames].sort(compareNames)) {\n console.error(\n chalk.yellow(` ${name} => ${names.get(name)?.replacement}`)\n )\n }\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"replace-names.js","names":["_parseFrcsSurveyFile","_interopRequireDefault","require","_replaceRanges","_ZodFrcsSurveyFileToJson","_unwrapInvalid","_parseNamesFile","_readFile","_promises","_chalk","_compareNames","_encodeWindows","replaceSurveyNames","surveyFile","replacementsFile","options","source","readFile","parsed","ZodValidOrInvalidFrcsSurveyFileToJson","parse","parseFrcsSurveyFile","normalizeNames","includeLocs","names","parseNamesFile","unreplacedNames","Set","entries","flatMap","name","replacement","replacedNames","replacementCount","replacements","trip","unwrapInvalid","trips","team","locs","teamLocs","header","i","length","loc","get","delete","add","push","start","index","end","value","replaced","encodeWindows1252","replaceRanges","write","writeFile","process","stdout","console","error","chalk","yellow","size","verbose","green","sort","compareNames"],"sources":["../../src/cli/replace-names.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport parseFrcsSurveyFile from '../survey/parseFrcsSurveyFile'\nimport { replaceRanges } from '../replaceRanges'\nimport { ZodValidOrInvalidFrcsSurveyFileToJson } from '../survey/ZodFrcsSurveyFileToJson'\nimport { unwrapInvalid } from '../unwrapInvalid'\nimport { parseNamesFile } from './parseNamesFile'\nimport { readFile } from './readFile'\nimport { writeFile } from 'fs/promises'\nimport chalk from 'chalk'\nimport { compareNames } from './compareNames'\nimport { encodeWindows1252 } from './encodeWindows1252'\n\nexport async function replaceSurveyNames(\n surveyFile: string,\n replacementsFile: string,\n options?: {\n verbose?: boolean\n write?: boolean\n }\n) {\n const source = await readFile(surveyFile)\n const parsed = ZodValidOrInvalidFrcsSurveyFileToJson.parse(\n await parseFrcsSurveyFile(surveyFile, [source], {\n normalizeNames: false,\n includeLocs: true,\n })\n )\n const names = await parseNamesFile(await readFile(replacementsFile))\n\n const unreplacedNames = new Set<string>(\n [...names.entries()].flatMap(([name, { replacement }]) =>\n replacement ? name : []\n )\n )\n const replacedNames = new Set<string>()\n let replacementCount = 0\n\n const replacements: { start: number; end: number; value: string }[] = []\n for (const trip of unwrapInvalid(parsed).trips) {\n const { team, locs: { team: teamLocs } = {} } = unwrapInvalid(\n unwrapInvalid(trip).header\n )\n if (!team || !teamLocs) continue\n for (let i = 0; i < team.length; i++) {\n const name = team[i]\n const loc = teamLocs[i]\n const replacement = names.get(name)?.replacement\n if (replacement && loc) {\n unreplacedNames.delete(name)\n replacedNames.add(name)\n replacementCount++\n replacements.push({\n start: loc.start.index,\n end: loc.end.index,\n value: replacement,\n })\n }\n }\n }\n\n const replaced = encodeWindows1252(replaceRanges(source, replacements))\n if (options?.write) {\n await writeFile(surveyFile, replaced)\n } else {\n process.stdout.write(replaced)\n }\n console.error(\n chalk.yellow(\n `replaced ${replacedNames.size} name${\n replacedNames.size === 1 ? '' : 's'\n } in ${replacementCount} location${replacementCount === 1 ? '' : 's'}`\n )\n )\n console.error(\n unreplacedNames.size\n ? chalk.yellow(\n `${unreplacedNames.size} name replacement${\n unreplacedNames.size === 1 ? ' was' : 's were'\n } unused${options?.verbose ? ':' : ''}`\n )\n : chalk.green('all name replacements were used')\n )\n if (options?.verbose) {\n for (const name of [...unreplacedNames].sort(compareNames)) {\n console.error(\n chalk.yellow(` ${name} => ${names.get(name)?.replacement}`)\n )\n }\n }\n}\n"],"mappings":";;;;;;;AACA,IAAAA,oBAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,cAAA,GAAAD,OAAA;AACA,IAAAE,wBAAA,GAAAF,OAAA;AACA,IAAAG,cAAA,GAAAH,OAAA;AACA,IAAAI,eAAA,GAAAJ,OAAA;AACA,IAAAK,SAAA,GAAAL,OAAA;AACA,IAAAM,SAAA,GAAAN,OAAA;AACA,IAAAO,MAAA,GAAAR,sBAAA,CAAAC,OAAA;AACA,IAAAQ,aAAA,GAAAR,OAAA;AACA,IAAAS,cAAA,GAAAT,OAAA;AAVA;;AAYO,eAAeU,kBAAkBA,CACtCC,UAAkB,EAClBC,gBAAwB,EACxBC,OAGC,EACD;EACA,MAAMC,MAAM,GAAG,MAAM,IAAAC,kBAAQ,EAACJ,UAAU,CAAC;EACzC,MAAMK,MAAM,GAAGC,8DAAqC,CAACC,KAAK,CACxD,MAAM,IAAAC,4BAAmB,EAACR,UAAU,EAAE,CAACG,MAAM,CAAC,EAAE;IAC9CM,cAAc,EAAE,KAAK;IACrBC,WAAW,EAAE;EACf,CAAC,CACH,CAAC;EACD,MAAMC,KAAK,GAAG,MAAM,IAAAC,8BAAc,EAAC,MAAM,IAAAR,kBAAQ,EAACH,gBAAgB,CAAC,CAAC;EAEpE,MAAMY,eAAe,GAAG,IAAIC,GAAG,CAC7B,CAAC,GAAGH,KAAK,CAACI,OAAO,CAAC,CAAC,CAAC,CAACC,OAAO,CAAC,CAAC,CAACC,IAAI,EAAE;IAAEC;EAAY,CAAC,CAAC,KACnDA,WAAW,GAAGD,IAAI,GAAG,EACvB,CACF,CAAC;EACD,MAAME,aAAa,GAAG,IAAIL,GAAG,CAAS,CAAC;EACvC,IAAIM,gBAAgB,GAAG,CAAC;EAExB,MAAMC,YAA6D,GAAG,EAAE;EACxE,KAAK,MAAMC,IAAI,IAAI,IAAAC,4BAAa,EAAClB,MAAM,CAAC,CAACmB,KAAK,EAAE;IAC9C,MAAM;MAAEC,IAAI;MAAEC,IAAI,EAAE;QAAED,IAAI,EAAEE;MAAS,CAAC,GAAG,CAAC;IAAE,CAAC,GAAG,IAAAJ,4BAAa,EAC3D,IAAAA,4BAAa,EAACD,IAAI,CAAC,CAACM,MACtB,CAAC;IACD,IAAI,CAACH,IAAI,IAAI,CAACE,QAAQ,EAAE;IACxB,KAAK,IAAIE,CAAC,GAAG,CAAC,EAAEA,CAAC,GAAGJ,IAAI,CAACK,MAAM,EAAED,CAAC,EAAE,EAAE;MACpC,MAAMZ,IAAI,GAAGQ,IAAI,CAACI,CAAC,CAAC;MACpB,MAAME,GAAG,GAAGJ,QAAQ,CAACE,CAAC,CAAC;MACvB,MAAMX,WAAW,GAAGP,KAAK,CAACqB,GAAG,CAACf,IAAI,CAAC,EAAEC,WAAW;MAChD,IAAIA,WAAW,IAAIa,GAAG,EAAE;QACtBlB,eAAe,CAACoB,MAAM,CAAChB,IAAI,CAAC;QAC5BE,aAAa,CAACe,GAAG,CAACjB,IAAI,CAAC;QACvBG,gBAAgB,EAAE;QAClBC,YAAY,CAACc,IAAI,CAAC;UAChBC,KAAK,EAAEL,GAAG,CAACK,KAAK,CAACC,KAAK;UACtBC,GAAG,EAAEP,GAAG,CAACO,GAAG,CAACD,KAAK;UAClBE,KAAK,EAAErB;QACT,CAAC,CAAC;MACJ;IACF;EACF;EAEA,MAAMsB,QAAQ,GAAG,IAAAC,gCAAiB,EAAC,IAAAC,4BAAa,EAACvC,MAAM,EAAEkB,YAAY,CAAC,CAAC;EACvE,IAAInB,OAAO,EAAEyC,KAAK,EAAE;IAClB,MAAM,IAAAC,mBAAS,EAAC5C,UAAU,EAAEwC,QAAQ,CAAC;EACvC,CAAC,MAAM;IACLK,OAAO,CAACC,MAAM,CAACH,KAAK,CAACH,QAAQ,CAAC;EAChC;EACAO,OAAO,CAACC,KAAK,CACXC,cAAK,CAACC,MAAM,CACV,YAAY/B,aAAa,CAACgC,IAAI,QAC5BhC,aAAa,CAACgC,IAAI,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,OAC9B/B,gBAAgB,YAAYA,gBAAgB,KAAK,CAAC,GAAG,EAAE,GAAG,GAAG,EACtE,CACF,CAAC;EACD2B,OAAO,CAACC,KAAK,CACXnC,eAAe,CAACsC,IAAI,GAChBF,cAAK,CAACC,MAAM,CACV,GAAGrC,eAAe,CAACsC,IAAI,oBACrBtC,eAAe,CAACsC,IAAI,KAAK,CAAC,GAAG,MAAM,GAAG,QAAQ,UACtCjD,OAAO,EAAEkD,OAAO,GAAG,GAAG,GAAG,EAAE,EACvC,CAAC,GACDH,cAAK,CAACI,KAAK,CAAC,iCAAiC,CACnD,CAAC;EACD,IAAInD,OAAO,EAAEkD,OAAO,EAAE;IACpB,KAAK,MAAMnC,IAAI,IAAI,CAAC,GAAGJ,eAAe,CAAC,CAACyC,IAAI,CAACC,0BAAY,CAAC,EAAE;MAC1DR,OAAO,CAACC,KAAK,CACXC,cAAK,CAACC,MAAM,CAAC,KAAKjC,IAAI,OAAON,KAAK,CAACqB,GAAG,CAACf,IAAI,CAAC,EAAEC,WAAW,EAAE,CAC7D,CAAC;IACH;EACF;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"summarize.d.ts","sourceRoot":"","sources":["../../src/cli/summarize.ts"],"names":[],"mappings":"AAQA,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,iBAmBjD"}
1
+ {"version":3,"file":"summarize.d.ts","sourceRoot":"","sources":["../../src/cli/summarize.ts"],"names":[],"mappings":"AASA,wBAAsB,eAAe,CAAC,IAAI,EAAE,MAAM,iBAmBjD"}
package/cli/summarize.js CHANGED
@@ -11,6 +11,7 @@ var _index = require("../string/index.js");
11
11
  var _formatFrcsTripSummaryFile = require("../formatFrcsTripSummaryFile.js");
12
12
  var _summarizeSurvey = require("../survey/summarizeSurvey.js");
13
13
  var _readFile = require("./readFile.js");
14
+ var _encodeWindows = require("./encodeWindows1252.js");
14
15
  /* eslint-disable no-console */
15
16
 
16
17
  async function summarizeSurvey(file) {
@@ -27,7 +28,7 @@ async function summarizeSurvey(file) {
27
28
  process.exit(1);
28
29
  }
29
30
  for (const line of (0, _formatFrcsTripSummaryFile.formatFrcsTripSummaryFile)((0, _summarizeSurvey.summarizeSurvey)(parsed))) {
30
- console.log(line);
31
+ process.stdout.write((0, _encodeWindows.encodeWindows1252)(line + '\n'));
31
32
  }
32
33
  }
33
34
  //# sourceMappingURL=summarize.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"summarize.js","names":["_chalk","_interopRequireDefault","require","_formatIssues","_index","_formatFrcsTripSummaryFile","_summarizeSurvey","_readFile","summarizeSurvey","file","source","readFile","parsed","parseFrcsSurveyFile","console","log","formatIssues","errorStyle","chalk","red","warningStyle","yellow","process","exit","line","formatFrcsTripSummaryFile","baseSummarizeSurvey"],"sources":["../../src/cli/summarize.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport chalk from 'chalk'\nimport { formatIssues } from '../formatIssues'\nimport { parseFrcsSurveyFile } from '../string/index'\nimport { formatFrcsTripSummaryFile } from '../formatFrcsTripSummaryFile'\nimport { summarizeSurvey as baseSummarizeSurvey } from '../survey/summarizeSurvey'\nimport { readFile } from './readFile'\n\nexport async function summarizeSurvey(file: string) {\n const source = await readFile(file)\n const parsed = await parseFrcsSurveyFile(file, source)\n if ('INVALID' in parsed) {\n console.log(\n formatIssues({\n file,\n source,\n parsed,\n errorStyle: chalk.red,\n warningStyle: chalk.yellow,\n })\n )\n process.exit(1)\n }\n\n for (const line of formatFrcsTripSummaryFile(baseSummarizeSurvey(parsed))) {\n console.log(line)\n }\n}\n"],"mappings":";;;;;;;AACA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AACA,IAAAG,0BAAA,GAAAH,OAAA;AACA,IAAAI,gBAAA,GAAAJ,OAAA;AACA,IAAAK,SAAA,GAAAL,OAAA;AANA;;AAQO,eAAeM,eAAeA,CAACC,IAAY,EAAE;EAClD,MAAMC,MAAM,GAAG,MAAM,IAAAC,kBAAQ,EAACF,IAAI,CAAC;EACnC,MAAMG,MAAM,GAAG,MAAM,IAAAC,0BAAmB,EAACJ,IAAI,EAAEC,MAAM,CAAC;EACtD,IAAI,SAAS,IAAIE,MAAM,EAAE;IACvBE,OAAO,CAACC,GAAG,CACT,IAAAC,0BAAY,EAAC;MACXP,IAAI;MACJC,MAAM;MACNE,MAAM;MACNK,UAAU,EAAEC,cAAK,CAACC,GAAG;MACrBC,YAAY,EAAEF,cAAK,CAACG;IACtB,CAAC,CACH,CAAC;IACDC,OAAO,CAACC,IAAI,CAAC,CAAC,CAAC;EACjB;EAEA,KAAK,MAAMC,IAAI,IAAI,IAAAC,oDAAyB,EAAC,IAAAC,gCAAmB,EAACd,MAAM,CAAC,CAAC,EAAE;IACzEE,OAAO,CAACC,GAAG,CAACS,IAAI,CAAC;EACnB;AACF","ignoreList":[]}
1
+ {"version":3,"file":"summarize.js","names":["_chalk","_interopRequireDefault","require","_formatIssues","_index","_formatFrcsTripSummaryFile","_summarizeSurvey","_readFile","_encodeWindows","summarizeSurvey","file","source","readFile","parsed","parseFrcsSurveyFile","console","log","formatIssues","errorStyle","chalk","red","warningStyle","yellow","process","exit","line","formatFrcsTripSummaryFile","baseSummarizeSurvey","stdout","write","encodeWindows1252"],"sources":["../../src/cli/summarize.ts"],"sourcesContent":["/* eslint-disable no-console */\nimport chalk from 'chalk'\nimport { formatIssues } from '../formatIssues'\nimport { parseFrcsSurveyFile } from '../string/index'\nimport { formatFrcsTripSummaryFile } from '../formatFrcsTripSummaryFile'\nimport { summarizeSurvey as baseSummarizeSurvey } from '../survey/summarizeSurvey'\nimport { readFile } from './readFile'\nimport { encodeWindows1252 } from './encodeWindows1252'\n\nexport async function summarizeSurvey(file: string) {\n const source = await readFile(file)\n const parsed = await parseFrcsSurveyFile(file, source)\n if ('INVALID' in parsed) {\n console.log(\n formatIssues({\n file,\n source,\n parsed,\n errorStyle: chalk.red,\n warningStyle: chalk.yellow,\n })\n )\n process.exit(1)\n }\n\n for (const line of formatFrcsTripSummaryFile(baseSummarizeSurvey(parsed))) {\n process.stdout.write(encodeWindows1252(line + '\\n'))\n }\n}\n"],"mappings":";;;;;;;AACA,IAAAA,MAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,aAAA,GAAAD,OAAA;AACA,IAAAE,MAAA,GAAAF,OAAA;AACA,IAAAG,0BAAA,GAAAH,OAAA;AACA,IAAAI,gBAAA,GAAAJ,OAAA;AACA,IAAAK,SAAA,GAAAL,OAAA;AACA,IAAAM,cAAA,GAAAN,OAAA;AAPA;;AASO,eAAeO,eAAeA,CAACC,IAAY,EAAE;EAClD,MAAMC,MAAM,GAAG,MAAM,IAAAC,kBAAQ,EAACF,IAAI,CAAC;EACnC,MAAMG,MAAM,GAAG,MAAM,IAAAC,0BAAmB,EAACJ,IAAI,EAAEC,MAAM,CAAC;EACtD,IAAI,SAAS,IAAIE,MAAM,EAAE;IACvBE,OAAO,CAACC,GAAG,CACT,IAAAC,0BAAY,EAAC;MACXP,IAAI;MACJC,MAAM;MACNE,MAAM;MACNK,UAAU,EAAEC,cAAK,CAACC,GAAG;MACrBC,YAAY,EAAEF,cAAK,CAACG;IACtB,CAAC,CACH,CAAC;IACDC,OAAO,CAACC,IAAI,CAAC,CAAC,CAAC;EACjB;EAEA,KAAK,MAAMC,IAAI,IAAI,IAAAC,oDAAyB,EAAC,IAAAC,gCAAmB,EAACd,MAAM,CAAC,CAAC,EAAE;IACzEU,OAAO,CAACK,MAAM,CAACC,KAAK,CAAC,IAAAC,gCAAiB,EAACL,IAAI,GAAG,IAAI,CAAC,CAAC;EACtD;AACF","ignoreList":[]}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AA4BA,eAAO,MAAM,mBAAmB,SAHvB,MAAM,kKAG2D,CAAA;AAC1E,eAAO,MAAM,iBAAiB,SAfrB,MAAM,uCAesD,CAAA;AACrE,eAAO,MAAM,wBAAwB,SAhB5B,MAAM;;2DAkBd,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/node/index.ts"],"names":[],"mappings":"AA4CA,eAAO,MAAM,mBAAmB,SATvB,MAAM,kKAS2D,CAAA;AAC1E,eAAO,MAAM,iBAAiB,SA7BrB,MAAM,uCA6BsD,CAAA;AACrE,eAAO,MAAM,wBAAwB,SA9B5B,MAAM;;2DAgCd,CAAA"}
package/node/index.js CHANGED
@@ -6,12 +6,14 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.parseFrcsTripSummaryFile = exports.parseFrcsSurveyFile = exports.parseFrcsPlotFile = void 0;
8
8
  var _fs = _interopRequireDefault(require("fs"));
9
- var _readline = _interopRequireDefault(require("readline"));
10
9
  var _parseFrcsSurveyFile2 = _interopRequireDefault(require("../survey/parseFrcsSurveyFile.js"));
11
10
  var _parseFrcsPlotFile2 = _interopRequireDefault(require("../parseFrcsPlotFile.js"));
12
11
  var _parseFrcsTripSummaryFile2 = _interopRequireDefault(require("../parseFrcsTripSummaryFile.js"));
13
- const convertLineBased = fn => (file, ...rest) => fn(file, _readline.default.createInterface(_fs.default.createReadStream(file)), ...rest);
14
- const convertChunkBased = fn => (file, ...rest) => fn(file, _fs.default.createReadStream(file, 'utf8'), ...rest);
12
+ var _stream = require("stream");
13
+ var _web = require("stream/web");
14
+ var _chunksToLines = require("../chunksToLines.js");
15
+ const convertLineBased = fn => (file, ...rest) => fn(file, (0, _chunksToLines.chunksToLines)(_stream.Readable.toWeb(_fs.default.createReadStream(file)).pipeThrough(new _web.TextDecoderStream('windows-1252'))), ...rest);
16
+ const convertChunkBased = fn => (file, ...rest) => fn(file, _stream.Readable.toWeb(_fs.default.createReadStream(file)).pipeThrough(new _web.TextDecoderStream('windows-1252')), ...rest);
15
17
  const parseFrcsSurveyFile = exports.parseFrcsSurveyFile = convertChunkBased(_parseFrcsSurveyFile2.default);
16
18
  const parseFrcsPlotFile = exports.parseFrcsPlotFile = convertLineBased(_parseFrcsPlotFile2.default);
17
19
  const parseFrcsTripSummaryFile = exports.parseFrcsTripSummaryFile = convertLineBased(_parseFrcsTripSummaryFile2.default);
package/node/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_fs","_interopRequireDefault","require","_readline","_parseFrcsSurveyFile2","_parseFrcsPlotFile2","_parseFrcsTripSummaryFile2","convertLineBased","fn","file","rest","readline","createInterface","fs","createReadStream","convertChunkBased","parseFrcsSurveyFile","exports","_parseFrcsSurveyFile","parseFrcsPlotFile","_parseFrcsPlotFile","parseFrcsTripSummaryFile","_parseFrcsTripSummaryFile"],"sources":["../../src/node/index.ts"],"sourcesContent":["import fs from 'fs'\nimport readline from 'readline'\nimport _parseFrcsSurveyFile from '../survey/parseFrcsSurveyFile'\nimport _parseFrcsPlotFile from '../parseFrcsPlotFile'\nimport _parseFrcsTripSummaryFile from '../parseFrcsTripSummaryFile'\n\nconst convertLineBased =\n <T, Rest extends any[]>(\n fn: (\n file: string,\n lines: AsyncIterable<string>,\n ...rest: Rest\n ) => Promise<T>\n ) =>\n (file: string, ...rest: Rest): Promise<T> =>\n fn(file, readline.createInterface(fs.createReadStream(file)), ...rest)\n\nconst convertChunkBased =\n <T, Rest extends any[]>(\n fn: (\n file: string,\n lines: AsyncIterable<string>,\n ...rest: Rest\n ) => Promise<T>\n ) =>\n (file: string, ...rest: Rest): Promise<T> =>\n fn(file, fs.createReadStream(file, 'utf8'), ...rest)\n\nexport const parseFrcsSurveyFile = convertChunkBased(_parseFrcsSurveyFile)\nexport const parseFrcsPlotFile = convertLineBased(_parseFrcsPlotFile)\nexport const parseFrcsTripSummaryFile = convertLineBased(\n _parseFrcsTripSummaryFile\n)\n"],"mappings":";;;;;;;AAAA,IAAAA,GAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,SAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,qBAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,mBAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,0BAAA,GAAAL,sBAAA,CAAAC,OAAA;AAEA,MAAMK,gBAAgB,GAElBC,EAIe,IAEjB,CAACC,IAAY,EAAE,GAAGC,IAAU,KAC1BF,EAAE,CAACC,IAAI,EAAEE,iBAAQ,CAACC,eAAe,CAACC,WAAE,CAACC,gBAAgB,CAACL,IAAI,CAAC,CAAC,EAAE,GAAGC,IAAI,CAAC;AAE1E,MAAMK,iBAAiB,GAEnBP,EAIe,IAEjB,CAACC,IAAY,EAAE,GAAGC,IAAU,KAC1BF,EAAE,CAACC,IAAI,EAAEI,WAAE,CAACC,gBAAgB,CAACL,IAAI,EAAE,MAAM,CAAC,EAAE,GAAGC,IAAI,CAAC;AAEjD,MAAMM,mBAAmB,GAAAC,OAAA,CAAAD,mBAAA,GAAGD,iBAAiB,CAACG,6BAAoB,CAAC;AACnE,MAAMC,iBAAiB,GAAAF,OAAA,CAAAE,iBAAA,GAAGZ,gBAAgB,CAACa,2BAAkB,CAAC;AAC9D,MAAMC,wBAAwB,GAAAJ,OAAA,CAAAI,wBAAA,GAAGd,gBAAgB,CACtDe,kCACF,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["_fs","_interopRequireDefault","require","_parseFrcsSurveyFile2","_parseFrcsPlotFile2","_parseFrcsTripSummaryFile2","_stream","_web","_chunksToLines","convertLineBased","fn","file","rest","chunksToLines","Readable","toWeb","fs","createReadStream","pipeThrough","TextDecoderStream","convertChunkBased","parseFrcsSurveyFile","exports","_parseFrcsSurveyFile","parseFrcsPlotFile","_parseFrcsPlotFile","parseFrcsTripSummaryFile","_parseFrcsTripSummaryFile"],"sources":["../../src/node/index.ts"],"sourcesContent":["import fs from 'fs'\nimport _parseFrcsSurveyFile from '../survey/parseFrcsSurveyFile'\nimport _parseFrcsPlotFile from '../parseFrcsPlotFile'\nimport _parseFrcsTripSummaryFile from '../parseFrcsTripSummaryFile'\nimport { Readable } from 'stream'\nimport { TextDecoderStream } from 'stream/web'\nimport { chunksToLines } from '../chunksToLines'\n\nconst convertLineBased =\n <T, Rest extends any[]>(\n fn: (\n file: string,\n lines: AsyncIterable<string>,\n ...rest: Rest\n ) => Promise<T>\n ) =>\n (file: string, ...rest: Rest): Promise<T> =>\n fn(\n file,\n chunksToLines(\n Readable.toWeb(fs.createReadStream(file)).pipeThrough(\n new TextDecoderStream('windows-1252')\n )\n ),\n ...rest\n )\n\nconst convertChunkBased =\n <T, Rest extends any[]>(\n fn: (\n file: string,\n lines: AsyncIterable<string>,\n ...rest: Rest\n ) => Promise<T>\n ) =>\n (file: string, ...rest: Rest): Promise<T> =>\n fn(\n file,\n Readable.toWeb(fs.createReadStream(file)).pipeThrough(\n new TextDecoderStream('windows-1252')\n ),\n ...rest\n )\n\nexport const parseFrcsSurveyFile = convertChunkBased(_parseFrcsSurveyFile)\nexport const parseFrcsPlotFile = convertLineBased(_parseFrcsPlotFile)\nexport const parseFrcsTripSummaryFile = convertLineBased(\n _parseFrcsTripSummaryFile\n)\n"],"mappings":";;;;;;;AAAA,IAAAA,GAAA,GAAAC,sBAAA,CAAAC,OAAA;AACA,IAAAC,qBAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,mBAAA,GAAAH,sBAAA,CAAAC,OAAA;AACA,IAAAG,0BAAA,GAAAJ,sBAAA,CAAAC,OAAA;AACA,IAAAI,OAAA,GAAAJ,OAAA;AACA,IAAAK,IAAA,GAAAL,OAAA;AACA,IAAAM,cAAA,GAAAN,OAAA;AAEA,MAAMO,gBAAgB,GAElBC,EAIe,IAEjB,CAACC,IAAY,EAAE,GAAGC,IAAU,KAC1BF,EAAE,CACAC,IAAI,EACJ,IAAAE,4BAAa,EACXC,gBAAQ,CAACC,KAAK,CAACC,WAAE,CAACC,gBAAgB,CAACN,IAAI,CAAC,CAAC,CAACO,WAAW,CACnD,IAAIC,sBAAiB,CAAC,cAAc,CACtC,CACF,CAAC,EACD,GAAGP,IACL,CAAC;AAEL,MAAMQ,iBAAiB,GAEnBV,EAIe,IAEjB,CAACC,IAAY,EAAE,GAAGC,IAAU,KAC1BF,EAAE,CACAC,IAAI,EACJG,gBAAQ,CAACC,KAAK,CAACC,WAAE,CAACC,gBAAgB,CAACN,IAAI,CAAC,CAAC,CAACO,WAAW,CACnD,IAAIC,sBAAiB,CAAC,cAAc,CACtC,CAAC,EACD,GAAGP,IACL,CAAC;AAEE,MAAMS,mBAAmB,GAAAC,OAAA,CAAAD,mBAAA,GAAGD,iBAAiB,CAACG,6BAAoB,CAAC;AACnE,MAAMC,iBAAiB,GAAAF,OAAA,CAAAE,iBAAA,GAAGf,gBAAgB,CAACgB,2BAAkB,CAAC;AAC9D,MAAMC,wBAAwB,GAAAJ,OAAA,CAAAI,wBAAA,GAAGjB,gBAAgB,CACtDkB,kCACF,CAAC","ignoreList":[]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@speleotica/frcsdata",
3
- "version": "5.1.0",
3
+ "version": "5.1.2",
4
4
  "description": "parser for Chip Hopper's survey data format used in Fisher Ridge Cave System",
5
5
  "sideEffects": false,
6
6
  "bin": {
@@ -30,6 +30,7 @@
30
30
  "dedent-js": "^1.0.1",
31
31
  "glob": "^13.0.6",
32
32
  "parse-segment": "^1.5.4",
33
+ "windows-1252": "^3.0.4",
33
34
  "yaml": "^2.8.2",
34
35
  "yargs": "^17",
35
36
  "zod": "^3"
@@ -1,6 +1,15 @@
1
+ export function chunksToLines(
2
+ chunks: Iterable<string> | AsyncIterable<string>,
3
+ options: { includeStartIndex: true }
4
+ ): AsyncIterable<{ line: string; startIndex: number }>
5
+ export function chunksToLines(
6
+ chunks: Iterable<string> | AsyncIterable<string>,
7
+ options?: { includeStartIndex?: false }
8
+ ): AsyncIterable<string>
1
9
  export async function* chunksToLines(
2
- chunks: Iterable<string> | AsyncIterable<string>
3
- ) {
10
+ chunks: Iterable<string> | AsyncIterable<string>,
11
+ options?: { includeStartIndex?: boolean }
12
+ ): AsyncIterable<string | { line: string; startIndex: number }> {
4
13
  let chunkStartIndex = 0
5
14
  let remainder = ''
6
15
  let prevChunkEndedWithCarriageReturn = false
@@ -15,12 +24,17 @@ export async function* chunksToLines(
15
24
  rx.lastIndex = end
16
25
  for (const match of chunk.matchAll(rx)) {
17
26
  const line = chunk.substring(end, match.index)
18
- yield { line, startIndex: chunkStartIndex + end }
27
+ yield options?.includeStartIndex
28
+ ? { line, startIndex: chunkStartIndex + end }
29
+ : line
19
30
  end = match.index + match[0].length
20
31
  }
21
32
  if (end < chunk.length) remainder = chunk.substring(end)
22
33
  chunkStartIndex += end
23
34
  prevChunkEndedWithCarriageReturn = chunk[chunk.length - 1] === '\r'
24
35
  }
25
- if (remainder) yield { line: remainder, startIndex: chunkStartIndex }
36
+ if (remainder)
37
+ yield options?.includeStartIndex
38
+ ? { line: remainder, startIndex: chunkStartIndex }
39
+ : remainder
26
40
  }
@@ -0,0 +1,5 @@
1
+ import { encode } from 'windows-1252'
2
+
3
+ export function encodeWindows1252(text: string) {
4
+ return new Uint8Array(encode(text))
5
+ }
@@ -6,6 +6,7 @@ import { unwrapInvalid } from '../unwrapInvalid'
6
6
  import { groupBy } from '@jcoreio/utils/groupBy'
7
7
  import { compareNames } from './compareNames'
8
8
  import { readFile } from './readFile'
9
+ import { encodeWindows1252 } from './encodeWindows1252'
9
10
 
10
11
  export async function listSurveyNames(
11
12
  file: string,
@@ -74,13 +75,19 @@ export async function listSurveyNames(
74
75
 
75
76
  for (const [name, count] of table) {
76
77
  const replacement = replacements.get(name)
77
- if (includeCounts)
78
- console.log(
79
- count.toFixed().padStart(countLength),
80
- name,
81
- ...(replacement ? ['=>', replacement] : [])
78
+ if (includeCounts) {
79
+ process.stdout.write(
80
+ encodeWindows1252(
81
+ `${count.toFixed().padStart(countLength)} ${name}${
82
+ replacement ? ` => ${replacement}` : ''
83
+ }\n`
84
+ )
82
85
  )
83
- else console.log(name, ...(replacement ? ['=>', replacement] : []))
86
+ } else {
87
+ process.stdout.write(
88
+ encodeWindows1252(`${name}${replacement ? ` => ${replacement}` : ''}\n`)
89
+ )
90
+ }
84
91
  }
85
92
  }
86
93
 
@@ -1,6 +1,7 @@
1
1
  import { parseNamesFile } from './parseNamesFile'
2
2
  import { formatNamesFile } from './formatNamesFile'
3
3
  import { readFile } from './readFile'
4
+ import { encodeWindows1252 } from './encodeWindows1252'
4
5
 
5
6
  export async function mergeNamesFiles(...files: string[]) {
6
7
  const names = new Map<string, { replacement?: string }>()
@@ -14,5 +15,5 @@ export async function mergeNamesFiles(...files: string[]) {
14
15
  }
15
16
  }
16
17
 
17
- process.stdout.write(formatNamesFile(names))
18
+ process.stdout.write(encodeWindows1252(formatNamesFile(names)))
18
19
  }
@@ -2,5 +2,7 @@ import fs from 'fs'
2
2
  import { promisify } from 'util'
3
3
 
4
4
  export async function readFile(file: string) {
5
- return await promisify<string>((cb) => fs.readFile(file || 0, 'utf8', cb))()
5
+ return new TextDecoder('windows-1252').decode(
6
+ await promisify<Buffer>((cb) => fs.readFile(file || 0, cb))()
7
+ )
6
8
  }
@@ -8,6 +8,7 @@ import { readFile } from './readFile'
8
8
  import { writeFile } from 'fs/promises'
9
9
  import chalk from 'chalk'
10
10
  import { compareNames } from './compareNames'
11
+ import { encodeWindows1252 } from './encodeWindows1252'
11
12
 
12
13
  export async function replaceSurveyNames(
13
14
  surveyFile: string,
@@ -57,9 +58,9 @@ export async function replaceSurveyNames(
57
58
  }
58
59
  }
59
60
 
60
- const replaced = replaceRanges(source, replacements)
61
+ const replaced = encodeWindows1252(replaceRanges(source, replacements))
61
62
  if (options?.write) {
62
- await writeFile(surveyFile, replaced, 'utf8')
63
+ await writeFile(surveyFile, replaced)
63
64
  } else {
64
65
  process.stdout.write(replaced)
65
66
  }
@@ -5,6 +5,7 @@ import { parseFrcsSurveyFile } from '../string/index'
5
5
  import { formatFrcsTripSummaryFile } from '../formatFrcsTripSummaryFile'
6
6
  import { summarizeSurvey as baseSummarizeSurvey } from '../survey/summarizeSurvey'
7
7
  import { readFile } from './readFile'
8
+ import { encodeWindows1252 } from './encodeWindows1252'
8
9
 
9
10
  export async function summarizeSurvey(file: string) {
10
11
  const source = await readFile(file)
@@ -23,6 +24,6 @@ export async function summarizeSurvey(file: string) {
23
24
  }
24
25
 
25
26
  for (const line of formatFrcsTripSummaryFile(baseSummarizeSurvey(parsed))) {
26
- console.log(line)
27
+ process.stdout.write(encodeWindows1252(line + '\n'))
27
28
  }
28
29
  }
package/src/node/index.ts CHANGED
@@ -1,8 +1,10 @@
1
1
  import fs from 'fs'
2
- import readline from 'readline'
3
2
  import _parseFrcsSurveyFile from '../survey/parseFrcsSurveyFile'
4
3
  import _parseFrcsPlotFile from '../parseFrcsPlotFile'
5
4
  import _parseFrcsTripSummaryFile from '../parseFrcsTripSummaryFile'
5
+ import { Readable } from 'stream'
6
+ import { TextDecoderStream } from 'stream/web'
7
+ import { chunksToLines } from '../chunksToLines'
6
8
 
7
9
  const convertLineBased =
8
10
  <T, Rest extends any[]>(
@@ -13,7 +15,15 @@ const convertLineBased =
13
15
  ) => Promise<T>
14
16
  ) =>
15
17
  (file: string, ...rest: Rest): Promise<T> =>
16
- fn(file, readline.createInterface(fs.createReadStream(file)), ...rest)
18
+ fn(
19
+ file,
20
+ chunksToLines(
21
+ Readable.toWeb(fs.createReadStream(file)).pipeThrough(
22
+ new TextDecoderStream('windows-1252')
23
+ )
24
+ ),
25
+ ...rest
26
+ )
17
27
 
18
28
  const convertChunkBased =
19
29
  <T, Rest extends any[]>(
@@ -24,7 +34,13 @@ const convertChunkBased =
24
34
  ) => Promise<T>
25
35
  ) =>
26
36
  (file: string, ...rest: Rest): Promise<T> =>
27
- fn(file, fs.createReadStream(file, 'utf8'), ...rest)
37
+ fn(
38
+ file,
39
+ Readable.toWeb(fs.createReadStream(file)).pipeThrough(
40
+ new TextDecoderStream('windows-1252')
41
+ ),
42
+ ...rest
43
+ )
28
44
 
29
45
  export const parseFrcsSurveyFile = convertChunkBased(_parseFrcsSurveyFile)
30
46
  export const parseFrcsPlotFile = convertLineBased(_parseFrcsPlotFile)
@@ -115,7 +115,8 @@ export default async function parseFrcsSurveyFile(
115
115
  let tripCommentEndLine = -1
116
116
  const tripComment: string[] = []
117
117
  const commentLines: string[] = []
118
- let trip: FrcsTrip | InvalidFrcsTrip | undefined = undefined
118
+ let trip: FrcsTrip | InvalidFrcsTrip | undefined
119
+ let lastShot: FrcsShot | InvalidFrcsShot | undefined
119
120
  let inBlockComment = false
120
121
  let section
121
122
  let sectionLoc: SourceLoc | undefined
@@ -137,7 +138,9 @@ export default async function parseFrcsSurveyFile(
137
138
 
138
139
  let began = false
139
140
 
140
- for await ({ line, startIndex: lineStartIndex } of chunksToLines(chunks)) {
141
+ for await ({ line, startIndex: lineStartIndex } of chunksToLines(chunks, {
142
+ includeStartIndex: true,
143
+ })) {
141
144
  if (lineIssues.length) lineIssues = []
142
145
 
143
146
  lineNumber++
@@ -179,6 +182,8 @@ export default async function parseFrcsSurveyFile(
179
182
  alternateUnits = nextShotUnits = undefined
180
183
  unitsChanged = false
181
184
  if (inTripComment) {
185
+ const trailingComment = getComment()
186
+ if (trailingComment) attachComment(lastShot, trailingComment)
182
187
  tripName = undefined
183
188
  tripNameLoc = undefined
184
189
  section = undefined
@@ -316,7 +321,10 @@ export default async function parseFrcsSurveyFile(
316
321
  inBlockComment = false
317
322
  } else {
318
323
  inBlockComment = !inBlockComment
319
- if (inBlockComment) commentLines.length = 0
324
+ if (inBlockComment) {
325
+ const trailingComment = getComment()
326
+ if (trailingComment) attachComment(lastShot, trailingComment)
327
+ }
320
328
  }
321
329
  } else if (inBlockComment) {
322
330
  addCommentLine(line)
@@ -708,12 +716,22 @@ export default async function parseFrcsSurveyFile(
708
716
  ////////////////////////////////////////////////////////////////////////////////////////////
709
717
 
710
718
  function getComment(): string | undefined {
711
- if (!commentLines?.length) return undefined
719
+ if (!commentLines.length) return undefined
712
720
  const comment = commentLines.join('\n').trim()
713
721
  commentLines.length = 0
714
722
  return comment || undefined
715
723
  }
716
724
 
725
+ function attachComment(
726
+ shot: FrcsShot | InvalidFrcsShot | undefined,
727
+ comment: string
728
+ ) {
729
+ const unwrapped = unwrapInvalid(shot)
730
+ if (!unwrapped) return
731
+ if (unwrapped.comment) unwrapped.comment += '\n' + comment
732
+ else unwrapped.comment = comment
733
+ }
734
+
717
735
  function addCommentLine(comment: string): void {
718
736
  if (trip) {
719
737
  const distanceUnit =
@@ -938,6 +956,7 @@ export default async function parseFrcsSurveyFile(
938
956
  }
939
957
 
940
958
  function addShot(shot: FrcsShot | InvalidFrcsShot) {
959
+ lastShot = shot
941
960
  if (!trip) return
942
961
  if (alternateUnits) {
943
962
  const recorded:
package/src/web/index.ts CHANGED
@@ -92,7 +92,7 @@ const convertLineBased = <T>(
92
92
  function chunksOf(input: Blob | ReadableStream): AsyncIterable<string> {
93
93
  return readableStreamValues(
94
94
  (input instanceof ReadableStream ? input : input.stream()).pipeThrough(
95
- new TextDecoderStream()
95
+ new TextDecoderStream('windows-1252')
96
96
  )
97
97
  )
98
98
  }
@@ -1 +1 @@
1
- {"version":3,"file":"parseFrcsSurveyFile.d.ts","sourceRoot":"","sources":["../../src/survey/parseFrcsSurveyFile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,0BAA0B,EAC1B,cAAc,EAId,qBAAqB,EAKtB,MAAM,kBAAkB,CAAA;AA2BzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4CI;AACJ,wBAA8B,mBAAmB,CAC/C,IAAI,EAAE,GAAG,EAAE,yDAAyD;AACpE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,EAChD,EACE,OAAqC,EACrC,aAAqB,EACrB,cAAqB,EACrB,gBAAgB,EAChB,WAAW,GACZ,GAAE,0BAA+B,GACjC,OAAO,CAAC,cAAc,GAAG,qBAAqB,CAAC,CAo6BjD"}
1
+ {"version":3,"file":"parseFrcsSurveyFile.d.ts","sourceRoot":"","sources":["../../src/survey/parseFrcsSurveyFile.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,0BAA0B,EAC1B,cAAc,EAId,qBAAqB,EAKtB,MAAM,kBAAkB,CAAA;AA2BzB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;IA4CI;AACJ,wBAA8B,mBAAmB,CAC/C,IAAI,EAAE,GAAG,EAAE,yDAAyD;AACpE,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,GAAG,aAAa,CAAC,MAAM,CAAC,EAChD,EACE,OAAqC,EACrC,aAAqB,EACrB,cAAqB,EACrB,gBAAgB,EAChB,WAAW,GACZ,GAAE,0BAA+B,GACjC,OAAO,CAAC,cAAc,GAAG,qBAAqB,CAAC,CAu7BjD"}
@@ -84,7 +84,8 @@ chunks, {
84
84
  let tripCommentEndLine = -1;
85
85
  const tripComment = [];
86
86
  const commentLines = [];
87
- let trip = undefined;
87
+ let trip;
88
+ let lastShot;
88
89
  let inBlockComment = false;
89
90
  let section;
90
91
  let sectionLoc;
@@ -101,7 +102,9 @@ chunks, {
101
102
  for await ({
102
103
  line,
103
104
  startIndex: lineStartIndex
104
- } of (0, _chunksToLines.chunksToLines)(chunks)) {
105
+ } of (0, _chunksToLines.chunksToLines)(chunks, {
106
+ includeStartIndex: true
107
+ })) {
105
108
  if (lineIssues.length) lineIssues = [];
106
109
  lineNumber++;
107
110
  if (!began) {
@@ -132,6 +135,8 @@ chunks, {
132
135
  alternateUnits = nextShotUnits = undefined;
133
136
  unitsChanged = false;
134
137
  if (inTripComment) {
138
+ const trailingComment = getComment();
139
+ if (trailingComment) attachComment(lastShot, trailingComment);
135
140
  tripName = undefined;
136
141
  tripNameLoc = undefined;
137
142
  section = undefined;
@@ -221,7 +226,10 @@ chunks, {
221
226
  inBlockComment = false;
222
227
  } else {
223
228
  inBlockComment = !inBlockComment;
224
- if (inBlockComment) commentLines.length = 0;
229
+ if (inBlockComment) {
230
+ const trailingComment = getComment();
231
+ if (trailingComment) attachComment(lastShot, trailingComment);
232
+ }
225
233
  }
226
234
  } else if (inBlockComment) {
227
235
  addCommentLine(line);
@@ -511,11 +519,16 @@ chunks, {
511
519
  ////////////////////////////////////////////////////////////////////////////////////////////
512
520
 
513
521
  function getComment() {
514
- if (!commentLines?.length) return undefined;
522
+ if (!commentLines.length) return undefined;
515
523
  const comment = commentLines.join('\n').trim();
516
524
  commentLines.length = 0;
517
525
  return comment || undefined;
518
526
  }
527
+ function attachComment(shot, comment) {
528
+ const unwrapped = (0, _unwrapInvalid.unwrapInvalid)(shot);
529
+ if (!unwrapped) return;
530
+ if (unwrapped.comment) unwrapped.comment += '\n' + comment;else unwrapped.comment = comment;
531
+ }
519
532
  function addCommentLine(comment) {
520
533
  if (trip) {
521
534
  const distanceUnit = (0, _unwrapInvalid.unwrapInvalid)(alternateUnits)?.distanceUnit || (0, _unwrapInvalid.unwrapInvalid)((0, _unwrapInvalid.unwrapInvalid)(trip).units).distanceUnit || _unitized.Length.feet;
@@ -655,6 +668,7 @@ chunks, {
655
668
  }
656
669
  }
657
670
  function addShot(shot) {
671
+ lastShot = shot;
658
672
  if (!trip) return;
659
673
  if (alternateUnits) {
660
674
  const recorded = shot;
@@ -1 +1 @@
1
- {"version":3,"file":"parseFrcsSurveyFile.js","names":["_FrcsSurveyFile","require","_unitized","_chunksToLines","_validators","_getColumnRanges","_parsers","_normalizeTeamMemberName","_unwrapInvalid","parseFrcsSurveyFile","file","chunks","columns","defaultFrcsShotColumnConfig","outputColumns","normalizeNames","suppressWarnings","includeLocs","columnRanges","getColumnRanges","maxRange","Math","max","Object","values","decimal","map","r","cave","undefined","location","trips","rootLocs","issues","tripName","tripNameLoc","tripTeam","tripTeamLoc","tripDate","tripDateLoc","inTripComment","tripCommentStartLine","tripCommentEndLine","tripComment","commentLines","trip","inBlockComment","section","sectionLoc","commentFromStationLruds","Map","unitsChanged","alternateUnits","nextShotUnits","lineNumber","line","lineStartIndex","lineIssues","tripIssues","began","startIndex","chunksToLines","length","test","match","exec","trim","indices","makeLineLoc","parseUnits","startColumn","index","endColumn","dateMatch","team","substring","replace","matchAll","includes","name","push","addIssue","normalizeTeamMemberName","month","day","year","parseInt","parseMonth","Date","currentUnits","unwrapInvalid","units","distanceUnit","Length","inches","meters","feet","addCommentLine","comment","join","headerLocs","date","header","locs","some","i","type","INVALID","shots","tripNumber","azimuthUnit","Angle","degrees","inclinationUnit","ranges","feetAndInches","fromStation","fromStr","validate","isValidStation","from","lStr","left","isValidOptFloat","rStr","right","uStr","up","dStr","down","parseLrud","toStr","toStation","shot","to","distance","UnitizedNumber","frontsightAzimuth","backsightAzimuth","frontsightInclination","backsightInclination","fromLruds","getComment","addShot","get","delete","fromLrudMatch","RegExp","split","s","azmFsStr","isValidOptUFloat","azmBsStr","incFsStr","incBsStr","horizontalDistance","verticalDistance","feetStr","distanceFeet","inchesStr","distanceInches","isValidUInt","Unitize","parseFloat","add","distStr","isValidUFloat","distNum","Number","isFinite","specialKindStr","kind","exclude","specialKind","parseSpecialKind","excludeDistance","isSplay","isValidFloat","h","NaN","v","sqrt","atan2","in","d","asin","parseNumber","validateInclinationRange","parseAzimuth","validateAzimuthRange","toLruds","loc","forEach","every","t","parsedFromStationLruds","parseFromStationLruds","set","code","message","indicesArray","start","column","end","parseLengthUnit","slice","parseAngleUnit","backsightAzimuthCorrected","backsightInclinationCorrected","hasBacksightAzimuth","hasBacksightInclination","fieldName","validator","field","toUpperCase","azimuth","rawValue","unit","Infinity","gradians","radians","PI","milsNATO","inclination","recorded","unwrappedAlternateUnits","unwrappedShot","opposite","negate","module","exports","default"],"sources":["../../src/survey/parseFrcsSurveyFile.ts"],"sourcesContent":["import { defaultFrcsShotColumnConfig } from './FrcsSurveyFile'\nimport type {\n ParseFrcsSurveyFileOptions,\n FrcsSurveyFile,\n FrcsTrip,\n FrcsUnits,\n FrcsShot,\n InvalidFrcsSurveyFile,\n InvalidFrcsUnits,\n InvalidFrcsTrip,\n InvalidFrcsShot,\n FrcsTripHeader,\n} from './FrcsSurveyFile'\nimport { Angle, Length, UnitizedNumber, Unitize } from '@speleotica/unitized'\nimport { ParseIssue, ParseIssueSeverity } from '../ParseIssue'\nimport { chunksToLines } from '../chunksToLines'\nimport {\n isValidStation,\n isValidOptFloat,\n isValidOptUFloat,\n isValidUInt,\n isValidUFloat,\n isValidFloat,\n} from './validators'\nimport { getColumnRanges } from './getColumnRanges'\nimport {\n parseFromStationLruds,\n parseLengthUnit,\n parseAngleUnit,\n parseMonth,\n parseLrud,\n parseSpecialKind,\n parseNumber,\n parseAzimuth,\n} from './parsers'\nimport { normalizeTeamMemberName } from './normalizeTeamMemberName'\nimport { unwrapInvalid } from '../unwrapInvalid'\nimport { SourceLoc } from '../SourceLoc'\n\n/**\n * Parses a raw cdata.fr survey file. These look like so:\n *\n <pre> Fisher Ridge Cave System, Hart Co., KY\n ENTRANCE DROPS, JOE'S \"I LOVE MY WIFE TRAVERSE\", TRICKY TRAVERSE\n PETER QUICK, KEITH ORTIZ - 2-15-81\n This File has Crumps test connected. 11/20/12\n *\n FT C DD A\n AE20 0 1 3 0 2\n * %FS\n * AE20 0 0 0 Bug-can't put before so put after-so can't make 2 fixed 10/28/12\n AE19 AE20 9.3 60.0 60.0-36.0 2 12 0 20\n AE18 AE19 24.5 0.0 0.0-90.0 6 10 25 0\n AE17 AE18 8.0 350.5 350.5 17.0 3 5 0 0\n AE16 AE17 6.7 0.0 0.0-90.0 3 5 6 1\n AE15 AE16 12.6 70.5 71.0-18.0 4 0 2 1\n AE14 AE15 10.0 21.5 20.0 6.0 5 5 0 3\n AE13 AE14 26.8 288.0 286.0-50.0 0 7 20 5\n *\n *SHORT CANYON AT THE BASE OF THE SECOND DROP\n AE12 AE13 20.7 236.0 236.0 34.0 3 5 4 4\n AE11 AE12 12.4 210.0 210.0 35.0 7 4 5 1\n AE10 AE13 25.7 40.0 40.0 -9.0 2 2 3 6\n *\n *AE10 AT JOE'S \" I LOVE MY WIFE TRAVERSE \"\n AE9 AE10 17.8 32.5 31.0 23.0 4 5 20 15\n AE1 AE9 13.7 82.0 82.0-13.0\n A1 AE1 34.3 46.0 48.0-17.5\n *\n *SURVEY TO DOME NEAR THE ENTRANCE DOME (ABOVE THE SECOND DROP)\n AD1 AE15 8.0 200.0 200.0 0.0 3 1 1 1\n AD2 AD1 17.7 161.0 161.0 7.0 1 4 25 1\n AD3 AD2 10.4 180.0 180.0 50.0 4 1 15 5\n *\n TRICKY TRAVERSE AND THEN FIRST SURVEY IN UPPER CROWLWAY\n DAN CROWL, KEITH ORTIZ, CHIP HOPPER, PETER QUICK, LARRY BEAN 14 FEB 1981\n *\n FI B DD\n A2 A1 48 10 292.0 110.0-42.0 5 10 35 5\n A3 A2 12 5 333.5 153.5 35.0 3 1 15 5\n A4 A3 4 2 0.0 0.0 90.0 3 1 10 10\n ...</pre>\n *\n */\nexport default async function parseFrcsSurveyFile(\n file: any, // eslint-disable-line @typescript-eslint/no-explicit-any\n chunks: Iterable<string> | AsyncIterable<string>,\n {\n columns = defaultFrcsShotColumnConfig,\n outputColumns = false,\n normalizeNames = true,\n suppressWarnings,\n includeLocs,\n }: ParseFrcsSurveyFileOptions = {}\n): Promise<FrcsSurveyFile | InvalidFrcsSurveyFile> {\n const columnRanges = getColumnRanges(columns)\n const maxRange = Math.max(\n ...Object.values(columnRanges.decimal).map((r) => r[1])\n )\n\n let cave: string | undefined = undefined\n let location: string | undefined = undefined\n const trips: (FrcsTrip | InvalidFrcsTrip)[] = []\n const rootLocs: FrcsSurveyFile['locs'] = {}\n const issues: ParseIssue[] = []\n\n let tripName: string | undefined\n let tripNameLoc: SourceLoc | undefined\n let tripTeam: string[] | undefined\n let tripTeamLoc: SourceLoc[] | undefined\n let tripDate: Date | undefined\n let tripDateLoc: SourceLoc | undefined\n let inTripComment = true\n let tripCommentStartLine = 1\n let tripCommentEndLine = -1\n const tripComment: string[] = []\n const commentLines: string[] = []\n let trip: FrcsTrip | InvalidFrcsTrip | undefined = undefined\n let inBlockComment = false\n let section\n let sectionLoc: SourceLoc | undefined\n const commentFromStationLruds = new Map<\n string,\n NonNullable<FrcsShot['fromLruds']>\n >()\n\n let unitsChanged = false\n let alternateUnits: FrcsUnits | InvalidFrcsUnits | undefined\n let nextShotUnits: FrcsUnits | InvalidFrcsUnits | undefined\n\n let lineNumber = 0\n let line: string\n let lineStartIndex = 0\n\n let lineIssues: number[] = []\n let tripIssues: number[] = []\n\n let began = false\n\n for await ({ line, startIndex: lineStartIndex } of chunksToLines(chunks)) {\n if (lineIssues.length) lineIssues = []\n\n lineNumber++\n\n if (!began) {\n began = true\n if (/^\\s+\\*/.test(line)) {\n continue\n }\n const match = /^\\s*([^,]+)(,(.*))?/d.exec(line)\n if (match) {\n cave = match[1].trim()\n if (includeLocs && match.indices) {\n rootLocs.cave = makeLineLoc(\n lineNumber,\n lineStartIndex,\n ...match.indices[1]\n )\n }\n if (match[3]) {\n location = match[3].trim()\n if (includeLocs && match.indices) {\n rootLocs.cave = makeLineLoc(\n lineNumber,\n lineStartIndex,\n ...match.indices[3]\n )\n }\n }\n }\n }\n\n if (unitsChanged) {\n unitsChanged = false\n alternateUnits = parseUnits()\n nextShotUnits = alternateUnits\n } else if (/^\\s{1,8}\\*(?!\\*)/.test(line)) {\n inTripComment = !inTripComment\n alternateUnits = nextShotUnits = undefined\n unitsChanged = false\n if (inTripComment) {\n tripName = undefined\n tripNameLoc = undefined\n section = undefined\n sectionLoc = undefined\n tripTeam = undefined\n tripTeamLoc = undefined\n tripDate = undefined\n tripDateLoc = undefined\n tripComment.length = 0\n tripCommentStartLine = lineNumber\n } else {\n tripCommentEndLine = lineNumber\n }\n } else if (inTripComment) {\n if (lineNumber === tripCommentStartLine + 1) {\n tripName = line.trim()\n const startColumn = /\\S/.exec(line)?.index ?? 0\n const endColumn = startColumn + tripName.length\n tripNameLoc = makeLineLoc(\n lineNumber,\n lineStartIndex,\n startColumn,\n endColumn\n )\n } else if (lineNumber === tripCommentStartLine + 2) {\n const dateMatch =\n /(?:[-.]\\s*)?((\\d+)[-/](\\d+)[-/](\\d{2,4})|((\\d+)[-/ ](january|february|march|april|may|june|july|august|september|october|november|december|(?:jan|feb|mar|apr|jun|jul|aug|sept?|oct|nov|dec)\\.?)[-/ ](\\d{2,4}))|((january|february|march|april|may|june|july|august|september|october|november|december|(?:jan|feb|mar|apr|jun|jul|aug|sept?|oct|nov|dec)\\.?)\\s+(\\d+)(?:,\\s*|,?\\s+)(\\d{2,4})))/di.exec(\n line\n )\n if (dateMatch) {\n const team = line.substring(0, dateMatch.index).replace(/\\.?\\s*$/, '')\n tripTeam = []\n tripTeamLoc = []\n for (const match of team.matchAll(\n team.includes(';')\n ? /\\s*([^;]+)\\s*/dg\n : team.includes(',')\n ? /\\s*([^,]+)\\s*/dg\n : team.includes('&')\n ? /\\s*([^&]+)\\s*/dg\n : /\\S {2,}\\S/.test(team)\n ? /(\\S+( \\S+)*)/dg\n : /(\\S+( \\S\\.? )? \\S{2,})/dg\n )) {\n const name = match[1].trim()\n tripTeam.push(name)\n if (includeLocs && match.indices) {\n const index = match.indices[1][0]\n tripTeamLoc.push(\n makeLineLoc(\n lineNumber,\n lineStartIndex,\n index,\n index + name.length\n )\n )\n }\n }\n if (!tripTeam.length) {\n addIssue(\n 'warning',\n 'missingTripTeam',\n 'Missing team',\n 0,\n dateMatch.index,\n tripIssues\n )\n }\n if (normalizeNames) tripTeam = tripTeam.map(normalizeTeamMemberName)\n let month, day, year\n if (dateMatch[2]) {\n month = parseInt(dateMatch[2])\n day = parseInt(dateMatch[3])\n year = parseInt(dateMatch[4])\n } else if (dateMatch[6]) {\n day = parseInt(dateMatch[6])\n month = parseMonth(dateMatch[7])\n year = parseInt(dateMatch[8])\n } else {\n month = parseMonth(dateMatch[10])\n day = parseInt(dateMatch[11])\n year = parseInt(dateMatch[12])\n }\n tripDate = new Date(year < 60 ? year + 2000 : year, month - 1, day)\n if (includeLocs && dateMatch.indices) {\n tripDateLoc = makeLineLoc(\n lineNumber,\n lineStartIndex,\n ...dateMatch.indices[1]\n )\n }\n } else {\n addIssue(\n 'warning',\n 'missingTripDate',\n 'Missing date',\n line.length,\n line.length,\n tripIssues\n )\n }\n } else if (lineNumber > 1) {\n tripComment.push(line)\n }\n const match = /^\\*\\*\\*([^*]+)\\*\\*\\*/.exec(line)\n if (match) {\n section = match[1].trim()\n }\n } else if (/^(\\s{9,}|)\\*(?!\\*)/.test(line)) {\n if (/^\\*\\s*%NC(\\b|$)/.test(line)) {\n unitsChanged = true\n }\n let match: RegExpMatchArray | null\n if ((match = /^\\*\\s*%T([ITM])(\\b|$)/.exec(line))) {\n const currentUnits = alternateUnits || unwrapInvalid(trip)?.units\n if (currentUnits && !('INVALID' in currentUnits)) {\n alternateUnits = {\n ...currentUnits,\n distanceUnit:\n match[1] === 'I'\n ? Length.inches\n : match[1] === 'M'\n ? Length.meters\n : Length.feet,\n }\n nextShotUnits = alternateUnits\n }\n }\n if (/^\\*\\s*%/.test(line)) {\n inBlockComment = false\n continue\n }\n if (/[^\\s*]/.test(line)) {\n addCommentLine(line.replace(/^\\s*\\*/, ''))\n inBlockComment = false\n } else {\n inBlockComment = !inBlockComment\n if (inBlockComment) commentLines.length = 0\n }\n } else if (inBlockComment) {\n addCommentLine(line)\n } else if (lineNumber === tripCommentEndLine + 1) {\n if (trip) trips.push(trip)\n const comment = tripComment.join('\\n') || undefined\n const headerLocs: FrcsTripHeader['locs'] =\n includeLocs && tripNameLoc\n ? {\n name: tripNameLoc,\n date: tripDateLoc,\n section: sectionLoc,\n team: tripTeamLoc,\n }\n : undefined\n const header = {\n name: tripName || '',\n comment,\n section,\n date: tripDate,\n team: tripTeam,\n ...(headerLocs && { locs: headerLocs }),\n }\n const units = parseUnits()\n if (\n 'INVALID' in units ||\n tripIssues.some((i) => issues[i]?.type === 'error')\n ) {\n trip = {\n INVALID: {\n header,\n units,\n shots: [],\n },\n ...(tripIssues.length ? { issues: tripIssues } : {}),\n }\n } else {\n trip = {\n tripNumber: 1,\n header,\n units,\n shots: [],\n }\n }\n tripIssues = []\n } else if (trip) {\n let distanceUnit =\n unwrapInvalid(alternateUnits)?.distanceUnit ||\n unwrapInvalid(unwrapInvalid(trip).units).distanceUnit ||\n Length.feet\n const azimuthUnit =\n unwrapInvalid(alternateUnits)?.azimuthUnit ||\n unwrapInvalid(unwrapInvalid(trip).units).azimuthUnit ||\n Angle.degrees\n const inclinationUnit =\n unwrapInvalid(alternateUnits)?.inclinationUnit ||\n unwrapInvalid(unwrapInvalid(trip).units).inclinationUnit ||\n Angle.degrees\n\n const inches = distanceUnit === Length.inches\n if (inches) distanceUnit = Length.feet\n\n const ranges = inches ? columnRanges.feetAndInches : columnRanges.decimal\n\n // from station name\n if (!/\\S/.test(line.substring(...ranges.fromStation))) continue\n const fromStr = validate(\n ...ranges.fromStation,\n 'from station',\n isValidStation\n )\n const from = fromStr.trim()\n\n // Sadly I have found negative LRUD values in Chip's format and apparently\n // his program doesn't fail on them, so I have to accept them here\n // isValidOptFloat instead of isValidOptUFloat\n const lStr = validate(...ranges.left, 'left', isValidOptFloat)\n const rStr = validate(...ranges.right, 'right', isValidOptFloat)\n const uStr = validate(...ranges.up, 'up', isValidOptFloat)\n const dStr = validate(...ranges.down, 'down', isValidOptFloat)\n\n const up = parseLrud(uStr, distanceUnit)\n const down = parseLrud(dStr, distanceUnit)\n const left = parseLrud(lStr, distanceUnit)\n const right = parseLrud(rStr, distanceUnit)\n\n // to station name\n const toStr = line.substring(...ranges.toStation)\n if (!toStr.trim()) {\n const shot: FrcsShot = {\n from,\n to: undefined,\n distance: new UnitizedNumber(0, distanceUnit),\n frontsightAzimuth: undefined,\n backsightAzimuth: undefined,\n frontsightInclination: undefined,\n backsightInclination: undefined,\n fromLruds: {\n left,\n right,\n up,\n down,\n },\n comment: getComment(),\n }\n addShot(\n lineIssues.length ? { INVALID: shot, issues: lineIssues } : shot\n )\n continue\n }\n if (!isValidStation(toStr)) {\n addIssue(\n 'error',\n 'invalidStationName',\n 'Invalid station name',\n ...ranges.toStation\n )\n }\n\n let fromLruds = commentFromStationLruds.get(from)\n if (fromLruds) {\n commentFromStationLruds.delete(from)\n } else {\n const fromLrudMatch = new RegExp(\n `^\\\\s+${fromStr\n .trim()\n .replace(\n /[.*+?^${}()|[\\]\\\\]/g,\n '\\\\$&'\n )}((\\\\s+(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)){4})`\n ).exec(line.substring(maxRange))\n if (fromLrudMatch) {\n const [left, right, up, down] = fromLrudMatch[1]\n .trim()\n .split(/\\s+/g)\n .map((s) => parseLrud(s, distanceUnit))\n fromLruds = { left, right, up, down }\n }\n }\n\n const comment = getComment()\n\n // azimuth and inclination\n const azmFsStr = validate(\n ranges.frontsightAzimuth[0],\n ranges.frontsightAzimuth[1],\n 'azimuth',\n isValidOptUFloat\n )\n const azmBsStr = validate(\n ...ranges.backsightAzimuth,\n 'azimuth',\n isValidOptUFloat\n )\n const incFsStr = line.substring(...ranges.frontsightInclination)\n const incBsStr = line.substring(...ranges.backsightInclination)\n\n let distance: UnitizedNumber<Length> | undefined\n let horizontalDistance: UnitizedNumber<Length> | undefined\n let verticalDistance: UnitizedNumber<Length> | undefined\n let frontsightInclination: UnitizedNumber<Angle> | undefined\n let backsightInclination: UnitizedNumber<Angle> | undefined\n\n // parse distance\n if (inches) {\n const feetStr = validate(\n ...ranges.distanceFeet,\n 'feet',\n isValidOptUFloat\n )\n const inchesStr = validate(\n ...ranges.distanceInches,\n 'inches',\n isValidOptUFloat\n )\n if (!/\\S/.test(feetStr) && !/\\S/.test(inchesStr)) {\n addIssue(\n 'error',\n 'missingDistance',\n 'Missing distance',\n ranges.distanceFeet[0],\n ranges.distanceInches[1]\n )\n }\n // sometimes inches are omitted, hence the || 0...I'm assuming it's possible\n // for feet to be omitted as well\n else if (\n (isValidUInt(feetStr) && isValidOptUFloat(inchesStr)) ||\n (isValidOptUFloat(feetStr) && isValidUInt(inchesStr))\n ) {\n distance = Unitize.inches(parseFloat(inchesStr) || 0).add(\n Unitize.feet(parseFloat(feetStr) || 0)\n )\n }\n // NOTE there are two columns around here that can contain a *.\n // I think they might represent different values, but thisis confused by\n // the fact that for ft/in shots, if there is a D or H flag it occupies the\n // first column that can contain a * for decimal feet shots\n } else {\n const distStr = validate(...ranges.distance, 'distance', isValidUFloat)\n const distNum = parseFloat(distStr)\n distance = Number.isFinite(distNum)\n ? new UnitizedNumber(distNum, distanceUnit)\n : undefined\n }\n const specialKindStr = line.substring(...ranges.kind).trim()\n const exclude = line.substring(...ranges.exclude).trim()\n const specialKind = parseSpecialKind(specialKindStr)\n\n if (specialKindStr && !specialKind) {\n addIssue(\n 'error',\n 'invalidShotType',\n 'Invalid shot type',\n ranges.kind[0],\n ranges.kind[1]\n )\n }\n\n const excludeDistance = exclude === '*' || exclude === 's'\n const isSplay = exclude === 's'\n\n if (exclude && !excludeDistance) {\n addIssue(\n 'error',\n 'invalidShotFlag',\n 'Invalid shot flag',\n ranges.exclude[0],\n ranges.exclude[1]\n )\n }\n\n if (specialKind) {\n validate(\n ...ranges.frontsightInclination,\n 'vertical-distance',\n isValidFloat\n )\n }\n\n // convert horizontal and diagonal shots to standard\n // in this case incFs is the vertical offset between stations\n // fortunately it appears we can always count on incFs being specified\n // and incBs not being specified for these types of shots\n if (specialKind === 'horizontal') {\n // distance is horizontal offset and incFsStr is vertical offset\n horizontalDistance = distance\n const h = horizontalDistance?.get(distanceUnit) ?? NaN\n const v = parseFloat(incFsStr)\n verticalDistance = Number.isFinite(v)\n ? new UnitizedNumber(v, distanceUnit)\n : undefined\n distance = new UnitizedNumber(Math.sqrt(h * h + v * v), distanceUnit)\n frontsightInclination =\n verticalDistance && horizontalDistance\n ? Angle.atan2(verticalDistance, horizontalDistance).in(\n inclinationUnit\n )\n : undefined\n backsightInclination = undefined\n } else if (specialKind === 'diagonal') {\n // distance is as usual, but incFsStr is vertical offset\n const d = distance?.get(distanceUnit) ?? NaN\n const v = parseFloat(incFsStr)\n verticalDistance = Number.isFinite(v)\n ? new UnitizedNumber(v, distanceUnit)\n : undefined\n frontsightInclination = Angle.asin(v / d).in(inclinationUnit)\n backsightInclination = undefined\n } else {\n // frontsight inclination\n validate(\n ...ranges.frontsightInclination,\n 'inclination',\n isValidOptFloat\n )\n // backsight inclination\n validate(...ranges.backsightInclination, 'inclination', isValidOptFloat)\n frontsightInclination = parseNumber(incFsStr, inclinationUnit)\n backsightInclination = parseNumber(incBsStr, inclinationUnit)\n\n validateInclinationRange(\n frontsightInclination,\n ...ranges.frontsightInclination\n )\n validateInclinationRange(\n backsightInclination,\n ...ranges.backsightInclination\n )\n }\n\n const frontsightAzimuth = parseAzimuth(azmFsStr, azimuthUnit)\n const backsightAzimuth = parseAzimuth(azmBsStr, azimuthUnit)\n\n validateAzimuthRange(frontsightAzimuth, ...ranges.frontsightAzimuth)\n validateAzimuthRange(backsightAzimuth, ...ranges.backsightAzimuth)\n\n if (!/\\S/.test(incFsStr) && !/\\S/.test(incBsStr)) {\n frontsightInclination = Unitize.degrees(0)\n }\n\n if (from && distance && !lineIssues.length) {\n const shot: FrcsShot = {\n from,\n to: toStr.trim(),\n specialKind,\n distance,\n frontsightAzimuth,\n backsightAzimuth,\n frontsightInclination,\n backsightInclination,\n toLruds: {\n left,\n right,\n up,\n down,\n },\n excludeDistance,\n comment,\n ...(includeLocs && {\n loc: makeLineLoc(lineNumber, lineStartIndex, 0, line.length),\n }),\n }\n if (isSplay) shot.isSplay = true\n if (fromLruds) shot.fromLruds = fromLruds\n if (horizontalDistance) shot.horizontalDistance = horizontalDistance\n if (verticalDistance) shot.verticalDistance = verticalDistance\n addShot(shot)\n } else {\n const shot: InvalidFrcsShot['INVALID'] = {\n from,\n to: toStr.trim(),\n specialKind,\n distance,\n frontsightAzimuth,\n backsightAzimuth,\n frontsightInclination,\n backsightInclination,\n toLruds: {\n left,\n right,\n up,\n down,\n },\n excludeDistance,\n comment,\n ...(includeLocs && {\n loc: makeLineLoc(lineNumber, lineStartIndex, 0, line.length),\n }),\n }\n if (isSplay) shot.isSplay = true\n if (fromLruds) shot.fromLruds = fromLruds\n if (horizontalDistance) shot.horizontalDistance = horizontalDistance\n if (verticalDistance) shot.verticalDistance = verticalDistance\n addShot({ INVALID: shot, issues: lineIssues })\n }\n }\n }\n\n if (trip) trips.push(trip)\n\n trips.forEach((trip, index) => (unwrapInvalid(trip).tripNumber = index + 1))\n\n if (\n !issues.some((i) => i.type === 'error') &&\n trips.every((t): t is FrcsTrip => !('INVALID' in t))\n ) {\n return {\n cave,\n columns: outputColumns ? columns : undefined,\n location,\n trips,\n ...(issues.length ? { issues } : undefined),\n ...(includeLocs && { locs: rootLocs }),\n }\n }\n\n return {\n INVALID: {\n cave,\n columns: outputColumns ? columns : undefined,\n location,\n trips,\n ...(includeLocs && { locs: rootLocs }),\n },\n issues,\n }\n\n ////////////////////////////////////////////////////////////////////////////////////////////\n\n function getComment(): string | undefined {\n if (!commentLines?.length) return undefined\n const comment = commentLines.join('\\n').trim()\n commentLines.length = 0\n return comment || undefined\n }\n\n function addCommentLine(comment: string): void {\n if (trip) {\n const distanceUnit =\n unwrapInvalid(alternateUnits)?.distanceUnit ||\n unwrapInvalid(unwrapInvalid(trip).units).distanceUnit ||\n Length.feet\n const parsedFromStationLruds = parseFromStationLruds(\n comment,\n distanceUnit\n )\n if (parsedFromStationLruds) {\n commentFromStationLruds.set(\n parsedFromStationLruds[0],\n parsedFromStationLruds[1]\n )\n return\n }\n }\n if (commentLines) {\n commentLines.push(comment)\n }\n }\n\n function addIssue(\n type: ParseIssueSeverity,\n code: string,\n message: string,\n startColumn: number,\n endColumn: number,\n indicesArray?: number[]\n ) {\n if (\n suppressWarnings &&\n type === 'warning' &&\n (suppressWarnings === true ||\n ('code' in suppressWarnings &&\n suppressWarnings[code as keyof typeof suppressWarnings] === true))\n ) {\n return\n }\n\n issues.push({\n type,\n code,\n message,\n loc: {\n start: {\n line: lineNumber,\n column: startColumn,\n index: lineStartIndex + startColumn,\n },\n end: {\n line: lineNumber,\n column: endColumn,\n index: lineStartIndex + endColumn,\n },\n },\n })\n if (!lineIssues) lineIssues = []\n lineIssues.push(issues.length - 1)\n indicesArray?.push(issues.length - 1)\n }\n\n function parseUnits(): FrcsUnits | InvalidFrcsUnits {\n // FT CC DD\n // 01234567\n const distanceUnit = parseLengthUnit(line.slice(0, 2))\n if (!distanceUnit) {\n addIssue('error', 'invalidDistanceUnit', 'Invalid distance unit', 0, 2)\n }\n const azimuthUnit = parseAngleUnit(line[6])\n if (!azimuthUnit) {\n addIssue('error', 'invalidAzimuthUnit', 'Invalid azimuth unit', 6, 7)\n }\n const inclinationUnit = parseAngleUnit(line[7])\n if (!inclinationUnit) {\n addIssue(\n 'error',\n 'invalidInclinationUnit',\n 'Invalid inclination unit',\n 7,\n 8\n )\n }\n const backsightAzimuthCorrected = line[3] === 'C'\n const backsightInclinationCorrected = line[4] === 'C'\n const hasBacksightAzimuth = line[3] !== ' ' && line[3] !== '-'\n const hasBacksightInclination = line[4] !== ' ' && line[4] !== '-'\n\n if (!/[-CB ]/.test(line[3])) {\n addIssue(\n 'error',\n 'invalidBacksightAzimuthType',\n 'Invalid backsight azimuth type',\n 3,\n 4\n )\n }\n if (!/[-CB ]/.test(line[4])) {\n addIssue(\n 'error',\n 'invalidBacksightInclinationType',\n 'Invalid backsight inclination type',\n 4,\n 5\n )\n }\n\n if (!distanceUnit || !azimuthUnit || !inclinationUnit) {\n return {\n INVALID: {\n distanceUnit,\n azimuthUnit,\n inclinationUnit,\n backsightAzimuthCorrected,\n backsightInclinationCorrected,\n hasBacksightAzimuth,\n hasBacksightInclination,\n },\n issues: lineIssues,\n }\n }\n\n return {\n distanceUnit,\n azimuthUnit,\n inclinationUnit,\n backsightAzimuthCorrected,\n backsightInclinationCorrected,\n hasBacksightAzimuth,\n hasBacksightInclination,\n }\n }\n\n function validate(\n startColumn: number,\n endColumn: number,\n fieldName: string,\n validator: (value: string) => boolean\n ): string {\n const field = line.substring(startColumn, endColumn)\n if (!validator(field)) {\n addIssue(\n 'error',\n `${\n field.trim() ? 'invalid' : 'missing'\n }${fieldName[0].toUpperCase()}${fieldName.substring(1)}`,\n (field.trim() ? 'Invalid ' : 'Missing ') + fieldName,\n startColumn,\n endColumn\n )\n }\n return field\n }\n\n function validateAzimuthRange(\n azimuth: UnitizedNumber<Angle> | undefined,\n startColumn: number,\n endColumn: number\n ) {\n if (!azimuth) return\n const rawValue = azimuth.get(azimuth.unit)\n let max = Infinity\n switch (azimuth.unit) {\n case Angle.degrees:\n max = 360\n break\n case Angle.gradians:\n max = 400\n break\n case Angle.radians:\n max = Math.PI * 2\n break\n case Angle.milsNATO:\n max = 6400\n break\n }\n if (rawValue < 0 || rawValue >= max) {\n addIssue(\n 'error',\n 'azimuthOutOfRange',\n 'Azimuth out of range',\n startColumn,\n endColumn,\n lineIssues\n )\n }\n }\n\n function validateInclinationRange(\n inclination: UnitizedNumber<Angle> | undefined,\n startColumn: number,\n endColumn: number\n ) {\n if (!inclination) return\n const rawValue = inclination.get(inclination.unit)\n let max = Infinity\n switch (inclination.unit) {\n case Angle.degrees:\n max = 90\n break\n case Angle.gradians:\n max = 100\n break\n case Angle.radians:\n max = Math.PI / 2\n break\n case Angle.milsNATO:\n max = 1600\n break\n }\n if (rawValue < -max || rawValue > max) {\n addIssue(\n 'error',\n 'inclinationOutOfRange',\n 'Inclination out of range',\n startColumn,\n endColumn,\n lineIssues\n )\n }\n }\n\n function addShot(shot: FrcsShot | InvalidFrcsShot) {\n if (!trip) return\n if (alternateUnits) {\n const recorded:\n | FrcsShot['recorded']\n | InvalidFrcsShot['INVALID']['recorded'] = shot\n if ('INVALID' in shot) {\n shot = {\n INVALID: {\n ...shot.INVALID,\n recorded: shot,\n },\n issues: shot.issues,\n }\n } else {\n shot = { ...shot, recorded: shot }\n }\n if (nextShotUnits) {\n unwrapInvalid(recorded).units = nextShotUnits\n nextShotUnits = undefined\n }\n const {\n backsightAzimuthCorrected,\n backsightInclinationCorrected,\n distanceUnit,\n azimuthUnit,\n inclinationUnit,\n } = unwrapInvalid(unwrapInvalid(trip).units)\n const unwrappedAlternateUnits = unwrapInvalid(alternateUnits)\n const unwrappedShot = unwrapInvalid(shot)\n {\n const alternateUnits = unwrappedAlternateUnits\n const shot = unwrappedShot\n if (\n alternateUnits.backsightAzimuthCorrected !== backsightAzimuthCorrected\n ) {\n shot.backsightAzimuth = shot.backsightAzimuth\n ? Angle.opposite(shot.backsightAzimuth)\n : undefined\n }\n if (\n alternateUnits.backsightInclinationCorrected !==\n backsightInclinationCorrected\n ) {\n shot.backsightInclination = shot.backsightInclination?.negate()\n }\n if (distanceUnit && distanceUnit !== alternateUnits.distanceUnit) {\n shot.distance = shot.distance?.in(distanceUnit)\n if (shot.fromLruds) {\n shot.fromLruds = { ...shot.fromLruds }\n shot.fromLruds.left = shot.fromLruds.left?.in(distanceUnit)\n shot.fromLruds.right = shot.fromLruds.right?.in(distanceUnit)\n shot.fromLruds.up = shot.fromLruds.up?.in(distanceUnit)\n shot.fromLruds.down = shot.fromLruds.down?.in(distanceUnit)\n }\n if (shot.toLruds) {\n shot.toLruds = { ...shot.toLruds }\n shot.toLruds.left = shot.toLruds.left?.in(distanceUnit)\n shot.toLruds.right = shot.toLruds.right?.in(distanceUnit)\n shot.toLruds.up = shot.toLruds.up?.in(distanceUnit)\n shot.toLruds.down = shot.toLruds.down?.in(distanceUnit)\n }\n }\n if (azimuthUnit && azimuthUnit !== alternateUnits.azimuthUnit) {\n shot.frontsightAzimuth = shot.frontsightAzimuth?.in(azimuthUnit)\n shot.backsightAzimuth = shot.backsightAzimuth?.in(azimuthUnit)\n }\n if (\n inclinationUnit &&\n inclinationUnit !== alternateUnits.inclinationUnit\n ) {\n shot.frontsightInclination =\n shot.frontsightInclination?.in(inclinationUnit)\n shot.backsightInclination =\n shot.backsightInclination?.in(inclinationUnit)\n }\n }\n }\n if ('INVALID' in trip) {\n trip.INVALID.shots.push(shot)\n } else if ('INVALID' in shot) {\n trip = { INVALID: trip }\n trip.INVALID.shots.push(shot)\n } else {\n trip.shots.push(shot)\n }\n }\n}\n\nfunction makeLineLoc(\n line: number,\n lineStartIndex: number,\n startColumn: number,\n endColumn: number\n): SourceLoc {\n return {\n start: {\n index: lineStartIndex + startColumn,\n line,\n column: startColumn,\n },\n end: {\n index: lineStartIndex + endColumn,\n line,\n column: endColumn,\n },\n }\n}\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"parseFrcsSurveyFile.js","names":["_FrcsSurveyFile","require","_unitized","_chunksToLines","_validators","_getColumnRanges","_parsers","_normalizeTeamMemberName","_unwrapInvalid","parseFrcsSurveyFile","file","chunks","columns","defaultFrcsShotColumnConfig","outputColumns","normalizeNames","suppressWarnings","includeLocs","columnRanges","getColumnRanges","maxRange","Math","max","Object","values","decimal","map","r","cave","undefined","location","trips","rootLocs","issues","tripName","tripNameLoc","tripTeam","tripTeamLoc","tripDate","tripDateLoc","inTripComment","tripCommentStartLine","tripCommentEndLine","tripComment","commentLines","trip","lastShot","inBlockComment","section","sectionLoc","commentFromStationLruds","Map","unitsChanged","alternateUnits","nextShotUnits","lineNumber","line","lineStartIndex","lineIssues","tripIssues","began","startIndex","chunksToLines","includeStartIndex","length","test","match","exec","trim","indices","makeLineLoc","parseUnits","trailingComment","getComment","attachComment","startColumn","index","endColumn","dateMatch","team","substring","replace","matchAll","includes","name","push","addIssue","normalizeTeamMemberName","month","day","year","parseInt","parseMonth","Date","currentUnits","unwrapInvalid","units","distanceUnit","Length","inches","meters","feet","addCommentLine","comment","join","headerLocs","date","header","locs","some","i","type","INVALID","shots","tripNumber","azimuthUnit","Angle","degrees","inclinationUnit","ranges","feetAndInches","fromStation","fromStr","validate","isValidStation","from","lStr","left","isValidOptFloat","rStr","right","uStr","up","dStr","down","parseLrud","toStr","toStation","shot","to","distance","UnitizedNumber","frontsightAzimuth","backsightAzimuth","frontsightInclination","backsightInclination","fromLruds","addShot","get","delete","fromLrudMatch","RegExp","split","s","azmFsStr","isValidOptUFloat","azmBsStr","incFsStr","incBsStr","horizontalDistance","verticalDistance","feetStr","distanceFeet","inchesStr","distanceInches","isValidUInt","Unitize","parseFloat","add","distStr","isValidUFloat","distNum","Number","isFinite","specialKindStr","kind","exclude","specialKind","parseSpecialKind","excludeDistance","isSplay","isValidFloat","h","NaN","v","sqrt","atan2","in","d","asin","parseNumber","validateInclinationRange","parseAzimuth","validateAzimuthRange","toLruds","loc","forEach","every","t","unwrapped","parsedFromStationLruds","parseFromStationLruds","set","code","message","indicesArray","start","column","end","parseLengthUnit","slice","parseAngleUnit","backsightAzimuthCorrected","backsightInclinationCorrected","hasBacksightAzimuth","hasBacksightInclination","fieldName","validator","field","toUpperCase","azimuth","rawValue","unit","Infinity","gradians","radians","PI","milsNATO","inclination","recorded","unwrappedAlternateUnits","unwrappedShot","opposite","negate","module","exports","default"],"sources":["../../src/survey/parseFrcsSurveyFile.ts"],"sourcesContent":["import { defaultFrcsShotColumnConfig } from './FrcsSurveyFile'\nimport type {\n ParseFrcsSurveyFileOptions,\n FrcsSurveyFile,\n FrcsTrip,\n FrcsUnits,\n FrcsShot,\n InvalidFrcsSurveyFile,\n InvalidFrcsUnits,\n InvalidFrcsTrip,\n InvalidFrcsShot,\n FrcsTripHeader,\n} from './FrcsSurveyFile'\nimport { Angle, Length, UnitizedNumber, Unitize } from '@speleotica/unitized'\nimport { ParseIssue, ParseIssueSeverity } from '../ParseIssue'\nimport { chunksToLines } from '../chunksToLines'\nimport {\n isValidStation,\n isValidOptFloat,\n isValidOptUFloat,\n isValidUInt,\n isValidUFloat,\n isValidFloat,\n} from './validators'\nimport { getColumnRanges } from './getColumnRanges'\nimport {\n parseFromStationLruds,\n parseLengthUnit,\n parseAngleUnit,\n parseMonth,\n parseLrud,\n parseSpecialKind,\n parseNumber,\n parseAzimuth,\n} from './parsers'\nimport { normalizeTeamMemberName } from './normalizeTeamMemberName'\nimport { unwrapInvalid } from '../unwrapInvalid'\nimport { SourceLoc } from '../SourceLoc'\n\n/**\n * Parses a raw cdata.fr survey file. These look like so:\n *\n <pre> Fisher Ridge Cave System, Hart Co., KY\n ENTRANCE DROPS, JOE'S \"I LOVE MY WIFE TRAVERSE\", TRICKY TRAVERSE\n PETER QUICK, KEITH ORTIZ - 2-15-81\n This File has Crumps test connected. 11/20/12\n *\n FT C DD A\n AE20 0 1 3 0 2\n * %FS\n * AE20 0 0 0 Bug-can't put before so put after-so can't make 2 fixed 10/28/12\n AE19 AE20 9.3 60.0 60.0-36.0 2 12 0 20\n AE18 AE19 24.5 0.0 0.0-90.0 6 10 25 0\n AE17 AE18 8.0 350.5 350.5 17.0 3 5 0 0\n AE16 AE17 6.7 0.0 0.0-90.0 3 5 6 1\n AE15 AE16 12.6 70.5 71.0-18.0 4 0 2 1\n AE14 AE15 10.0 21.5 20.0 6.0 5 5 0 3\n AE13 AE14 26.8 288.0 286.0-50.0 0 7 20 5\n *\n *SHORT CANYON AT THE BASE OF THE SECOND DROP\n AE12 AE13 20.7 236.0 236.0 34.0 3 5 4 4\n AE11 AE12 12.4 210.0 210.0 35.0 7 4 5 1\n AE10 AE13 25.7 40.0 40.0 -9.0 2 2 3 6\n *\n *AE10 AT JOE'S \" I LOVE MY WIFE TRAVERSE \"\n AE9 AE10 17.8 32.5 31.0 23.0 4 5 20 15\n AE1 AE9 13.7 82.0 82.0-13.0\n A1 AE1 34.3 46.0 48.0-17.5\n *\n *SURVEY TO DOME NEAR THE ENTRANCE DOME (ABOVE THE SECOND DROP)\n AD1 AE15 8.0 200.0 200.0 0.0 3 1 1 1\n AD2 AD1 17.7 161.0 161.0 7.0 1 4 25 1\n AD3 AD2 10.4 180.0 180.0 50.0 4 1 15 5\n *\n TRICKY TRAVERSE AND THEN FIRST SURVEY IN UPPER CROWLWAY\n DAN CROWL, KEITH ORTIZ, CHIP HOPPER, PETER QUICK, LARRY BEAN 14 FEB 1981\n *\n FI B DD\n A2 A1 48 10 292.0 110.0-42.0 5 10 35 5\n A3 A2 12 5 333.5 153.5 35.0 3 1 15 5\n A4 A3 4 2 0.0 0.0 90.0 3 1 10 10\n ...</pre>\n *\n */\nexport default async function parseFrcsSurveyFile(\n file: any, // eslint-disable-line @typescript-eslint/no-explicit-any\n chunks: Iterable<string> | AsyncIterable<string>,\n {\n columns = defaultFrcsShotColumnConfig,\n outputColumns = false,\n normalizeNames = true,\n suppressWarnings,\n includeLocs,\n }: ParseFrcsSurveyFileOptions = {}\n): Promise<FrcsSurveyFile | InvalidFrcsSurveyFile> {\n const columnRanges = getColumnRanges(columns)\n const maxRange = Math.max(\n ...Object.values(columnRanges.decimal).map((r) => r[1])\n )\n\n let cave: string | undefined = undefined\n let location: string | undefined = undefined\n const trips: (FrcsTrip | InvalidFrcsTrip)[] = []\n const rootLocs: FrcsSurveyFile['locs'] = {}\n const issues: ParseIssue[] = []\n\n let tripName: string | undefined\n let tripNameLoc: SourceLoc | undefined\n let tripTeam: string[] | undefined\n let tripTeamLoc: SourceLoc[] | undefined\n let tripDate: Date | undefined\n let tripDateLoc: SourceLoc | undefined\n let inTripComment = true\n let tripCommentStartLine = 1\n let tripCommentEndLine = -1\n const tripComment: string[] = []\n const commentLines: string[] = []\n let trip: FrcsTrip | InvalidFrcsTrip | undefined\n let lastShot: FrcsShot | InvalidFrcsShot | undefined\n let inBlockComment = false\n let section\n let sectionLoc: SourceLoc | undefined\n const commentFromStationLruds = new Map<\n string,\n NonNullable<FrcsShot['fromLruds']>\n >()\n\n let unitsChanged = false\n let alternateUnits: FrcsUnits | InvalidFrcsUnits | undefined\n let nextShotUnits: FrcsUnits | InvalidFrcsUnits | undefined\n\n let lineNumber = 0\n let line: string\n let lineStartIndex = 0\n\n let lineIssues: number[] = []\n let tripIssues: number[] = []\n\n let began = false\n\n for await ({ line, startIndex: lineStartIndex } of chunksToLines(chunks, {\n includeStartIndex: true,\n })) {\n if (lineIssues.length) lineIssues = []\n\n lineNumber++\n\n if (!began) {\n began = true\n if (/^\\s+\\*/.test(line)) {\n continue\n }\n const match = /^\\s*([^,]+)(,(.*))?/d.exec(line)\n if (match) {\n cave = match[1].trim()\n if (includeLocs && match.indices) {\n rootLocs.cave = makeLineLoc(\n lineNumber,\n lineStartIndex,\n ...match.indices[1]\n )\n }\n if (match[3]) {\n location = match[3].trim()\n if (includeLocs && match.indices) {\n rootLocs.cave = makeLineLoc(\n lineNumber,\n lineStartIndex,\n ...match.indices[3]\n )\n }\n }\n }\n }\n\n if (unitsChanged) {\n unitsChanged = false\n alternateUnits = parseUnits()\n nextShotUnits = alternateUnits\n } else if (/^\\s{1,8}\\*(?!\\*)/.test(line)) {\n inTripComment = !inTripComment\n alternateUnits = nextShotUnits = undefined\n unitsChanged = false\n if (inTripComment) {\n const trailingComment = getComment()\n if (trailingComment) attachComment(lastShot, trailingComment)\n tripName = undefined\n tripNameLoc = undefined\n section = undefined\n sectionLoc = undefined\n tripTeam = undefined\n tripTeamLoc = undefined\n tripDate = undefined\n tripDateLoc = undefined\n tripComment.length = 0\n tripCommentStartLine = lineNumber\n } else {\n tripCommentEndLine = lineNumber\n }\n } else if (inTripComment) {\n if (lineNumber === tripCommentStartLine + 1) {\n tripName = line.trim()\n const startColumn = /\\S/.exec(line)?.index ?? 0\n const endColumn = startColumn + tripName.length\n tripNameLoc = makeLineLoc(\n lineNumber,\n lineStartIndex,\n startColumn,\n endColumn\n )\n } else if (lineNumber === tripCommentStartLine + 2) {\n const dateMatch =\n /(?:[-.]\\s*)?((\\d+)[-/](\\d+)[-/](\\d{2,4})|((\\d+)[-/ ](january|february|march|april|may|june|july|august|september|october|november|december|(?:jan|feb|mar|apr|jun|jul|aug|sept?|oct|nov|dec)\\.?)[-/ ](\\d{2,4}))|((january|february|march|april|may|june|july|august|september|october|november|december|(?:jan|feb|mar|apr|jun|jul|aug|sept?|oct|nov|dec)\\.?)\\s+(\\d+)(?:,\\s*|,?\\s+)(\\d{2,4})))/di.exec(\n line\n )\n if (dateMatch) {\n const team = line.substring(0, dateMatch.index).replace(/\\.?\\s*$/, '')\n tripTeam = []\n tripTeamLoc = []\n for (const match of team.matchAll(\n team.includes(';')\n ? /\\s*([^;]+)\\s*/dg\n : team.includes(',')\n ? /\\s*([^,]+)\\s*/dg\n : team.includes('&')\n ? /\\s*([^&]+)\\s*/dg\n : /\\S {2,}\\S/.test(team)\n ? /(\\S+( \\S+)*)/dg\n : /(\\S+( \\S\\.? )? \\S{2,})/dg\n )) {\n const name = match[1].trim()\n tripTeam.push(name)\n if (includeLocs && match.indices) {\n const index = match.indices[1][0]\n tripTeamLoc.push(\n makeLineLoc(\n lineNumber,\n lineStartIndex,\n index,\n index + name.length\n )\n )\n }\n }\n if (!tripTeam.length) {\n addIssue(\n 'warning',\n 'missingTripTeam',\n 'Missing team',\n 0,\n dateMatch.index,\n tripIssues\n )\n }\n if (normalizeNames) tripTeam = tripTeam.map(normalizeTeamMemberName)\n let month, day, year\n if (dateMatch[2]) {\n month = parseInt(dateMatch[2])\n day = parseInt(dateMatch[3])\n year = parseInt(dateMatch[4])\n } else if (dateMatch[6]) {\n day = parseInt(dateMatch[6])\n month = parseMonth(dateMatch[7])\n year = parseInt(dateMatch[8])\n } else {\n month = parseMonth(dateMatch[10])\n day = parseInt(dateMatch[11])\n year = parseInt(dateMatch[12])\n }\n tripDate = new Date(year < 60 ? year + 2000 : year, month - 1, day)\n if (includeLocs && dateMatch.indices) {\n tripDateLoc = makeLineLoc(\n lineNumber,\n lineStartIndex,\n ...dateMatch.indices[1]\n )\n }\n } else {\n addIssue(\n 'warning',\n 'missingTripDate',\n 'Missing date',\n line.length,\n line.length,\n tripIssues\n )\n }\n } else if (lineNumber > 1) {\n tripComment.push(line)\n }\n const match = /^\\*\\*\\*([^*]+)\\*\\*\\*/.exec(line)\n if (match) {\n section = match[1].trim()\n }\n } else if (/^(\\s{9,}|)\\*(?!\\*)/.test(line)) {\n if (/^\\*\\s*%NC(\\b|$)/.test(line)) {\n unitsChanged = true\n }\n let match: RegExpMatchArray | null\n if ((match = /^\\*\\s*%T([ITM])(\\b|$)/.exec(line))) {\n const currentUnits = alternateUnits || unwrapInvalid(trip)?.units\n if (currentUnits && !('INVALID' in currentUnits)) {\n alternateUnits = {\n ...currentUnits,\n distanceUnit:\n match[1] === 'I'\n ? Length.inches\n : match[1] === 'M'\n ? Length.meters\n : Length.feet,\n }\n nextShotUnits = alternateUnits\n }\n }\n if (/^\\*\\s*%/.test(line)) {\n inBlockComment = false\n continue\n }\n if (/[^\\s*]/.test(line)) {\n addCommentLine(line.replace(/^\\s*\\*/, ''))\n inBlockComment = false\n } else {\n inBlockComment = !inBlockComment\n if (inBlockComment) {\n const trailingComment = getComment()\n if (trailingComment) attachComment(lastShot, trailingComment)\n }\n }\n } else if (inBlockComment) {\n addCommentLine(line)\n } else if (lineNumber === tripCommentEndLine + 1) {\n if (trip) trips.push(trip)\n const comment = tripComment.join('\\n') || undefined\n const headerLocs: FrcsTripHeader['locs'] =\n includeLocs && tripNameLoc\n ? {\n name: tripNameLoc,\n date: tripDateLoc,\n section: sectionLoc,\n team: tripTeamLoc,\n }\n : undefined\n const header = {\n name: tripName || '',\n comment,\n section,\n date: tripDate,\n team: tripTeam,\n ...(headerLocs && { locs: headerLocs }),\n }\n const units = parseUnits()\n if (\n 'INVALID' in units ||\n tripIssues.some((i) => issues[i]?.type === 'error')\n ) {\n trip = {\n INVALID: {\n header,\n units,\n shots: [],\n },\n ...(tripIssues.length ? { issues: tripIssues } : {}),\n }\n } else {\n trip = {\n tripNumber: 1,\n header,\n units,\n shots: [],\n }\n }\n tripIssues = []\n } else if (trip) {\n let distanceUnit =\n unwrapInvalid(alternateUnits)?.distanceUnit ||\n unwrapInvalid(unwrapInvalid(trip).units).distanceUnit ||\n Length.feet\n const azimuthUnit =\n unwrapInvalid(alternateUnits)?.azimuthUnit ||\n unwrapInvalid(unwrapInvalid(trip).units).azimuthUnit ||\n Angle.degrees\n const inclinationUnit =\n unwrapInvalid(alternateUnits)?.inclinationUnit ||\n unwrapInvalid(unwrapInvalid(trip).units).inclinationUnit ||\n Angle.degrees\n\n const inches = distanceUnit === Length.inches\n if (inches) distanceUnit = Length.feet\n\n const ranges = inches ? columnRanges.feetAndInches : columnRanges.decimal\n\n // from station name\n if (!/\\S/.test(line.substring(...ranges.fromStation))) continue\n const fromStr = validate(\n ...ranges.fromStation,\n 'from station',\n isValidStation\n )\n const from = fromStr.trim()\n\n // Sadly I have found negative LRUD values in Chip's format and apparently\n // his program doesn't fail on them, so I have to accept them here\n // isValidOptFloat instead of isValidOptUFloat\n const lStr = validate(...ranges.left, 'left', isValidOptFloat)\n const rStr = validate(...ranges.right, 'right', isValidOptFloat)\n const uStr = validate(...ranges.up, 'up', isValidOptFloat)\n const dStr = validate(...ranges.down, 'down', isValidOptFloat)\n\n const up = parseLrud(uStr, distanceUnit)\n const down = parseLrud(dStr, distanceUnit)\n const left = parseLrud(lStr, distanceUnit)\n const right = parseLrud(rStr, distanceUnit)\n\n // to station name\n const toStr = line.substring(...ranges.toStation)\n if (!toStr.trim()) {\n const shot: FrcsShot = {\n from,\n to: undefined,\n distance: new UnitizedNumber(0, distanceUnit),\n frontsightAzimuth: undefined,\n backsightAzimuth: undefined,\n frontsightInclination: undefined,\n backsightInclination: undefined,\n fromLruds: {\n left,\n right,\n up,\n down,\n },\n comment: getComment(),\n }\n addShot(\n lineIssues.length ? { INVALID: shot, issues: lineIssues } : shot\n )\n continue\n }\n if (!isValidStation(toStr)) {\n addIssue(\n 'error',\n 'invalidStationName',\n 'Invalid station name',\n ...ranges.toStation\n )\n }\n\n let fromLruds = commentFromStationLruds.get(from)\n if (fromLruds) {\n commentFromStationLruds.delete(from)\n } else {\n const fromLrudMatch = new RegExp(\n `^\\\\s+${fromStr\n .trim()\n .replace(\n /[.*+?^${}()|[\\]\\\\]/g,\n '\\\\$&'\n )}((\\\\s+(\\\\d+(\\\\.\\\\d*)?|\\\\.\\\\d+)){4})`\n ).exec(line.substring(maxRange))\n if (fromLrudMatch) {\n const [left, right, up, down] = fromLrudMatch[1]\n .trim()\n .split(/\\s+/g)\n .map((s) => parseLrud(s, distanceUnit))\n fromLruds = { left, right, up, down }\n }\n }\n\n const comment = getComment()\n\n // azimuth and inclination\n const azmFsStr = validate(\n ranges.frontsightAzimuth[0],\n ranges.frontsightAzimuth[1],\n 'azimuth',\n isValidOptUFloat\n )\n const azmBsStr = validate(\n ...ranges.backsightAzimuth,\n 'azimuth',\n isValidOptUFloat\n )\n const incFsStr = line.substring(...ranges.frontsightInclination)\n const incBsStr = line.substring(...ranges.backsightInclination)\n\n let distance: UnitizedNumber<Length> | undefined\n let horizontalDistance: UnitizedNumber<Length> | undefined\n let verticalDistance: UnitizedNumber<Length> | undefined\n let frontsightInclination: UnitizedNumber<Angle> | undefined\n let backsightInclination: UnitizedNumber<Angle> | undefined\n\n // parse distance\n if (inches) {\n const feetStr = validate(\n ...ranges.distanceFeet,\n 'feet',\n isValidOptUFloat\n )\n const inchesStr = validate(\n ...ranges.distanceInches,\n 'inches',\n isValidOptUFloat\n )\n if (!/\\S/.test(feetStr) && !/\\S/.test(inchesStr)) {\n addIssue(\n 'error',\n 'missingDistance',\n 'Missing distance',\n ranges.distanceFeet[0],\n ranges.distanceInches[1]\n )\n }\n // sometimes inches are omitted, hence the || 0...I'm assuming it's possible\n // for feet to be omitted as well\n else if (\n (isValidUInt(feetStr) && isValidOptUFloat(inchesStr)) ||\n (isValidOptUFloat(feetStr) && isValidUInt(inchesStr))\n ) {\n distance = Unitize.inches(parseFloat(inchesStr) || 0).add(\n Unitize.feet(parseFloat(feetStr) || 0)\n )\n }\n // NOTE there are two columns around here that can contain a *.\n // I think they might represent different values, but thisis confused by\n // the fact that for ft/in shots, if there is a D or H flag it occupies the\n // first column that can contain a * for decimal feet shots\n } else {\n const distStr = validate(...ranges.distance, 'distance', isValidUFloat)\n const distNum = parseFloat(distStr)\n distance = Number.isFinite(distNum)\n ? new UnitizedNumber(distNum, distanceUnit)\n : undefined\n }\n const specialKindStr = line.substring(...ranges.kind).trim()\n const exclude = line.substring(...ranges.exclude).trim()\n const specialKind = parseSpecialKind(specialKindStr)\n\n if (specialKindStr && !specialKind) {\n addIssue(\n 'error',\n 'invalidShotType',\n 'Invalid shot type',\n ranges.kind[0],\n ranges.kind[1]\n )\n }\n\n const excludeDistance = exclude === '*' || exclude === 's'\n const isSplay = exclude === 's'\n\n if (exclude && !excludeDistance) {\n addIssue(\n 'error',\n 'invalidShotFlag',\n 'Invalid shot flag',\n ranges.exclude[0],\n ranges.exclude[1]\n )\n }\n\n if (specialKind) {\n validate(\n ...ranges.frontsightInclination,\n 'vertical-distance',\n isValidFloat\n )\n }\n\n // convert horizontal and diagonal shots to standard\n // in this case incFs is the vertical offset between stations\n // fortunately it appears we can always count on incFs being specified\n // and incBs not being specified for these types of shots\n if (specialKind === 'horizontal') {\n // distance is horizontal offset and incFsStr is vertical offset\n horizontalDistance = distance\n const h = horizontalDistance?.get(distanceUnit) ?? NaN\n const v = parseFloat(incFsStr)\n verticalDistance = Number.isFinite(v)\n ? new UnitizedNumber(v, distanceUnit)\n : undefined\n distance = new UnitizedNumber(Math.sqrt(h * h + v * v), distanceUnit)\n frontsightInclination =\n verticalDistance && horizontalDistance\n ? Angle.atan2(verticalDistance, horizontalDistance).in(\n inclinationUnit\n )\n : undefined\n backsightInclination = undefined\n } else if (specialKind === 'diagonal') {\n // distance is as usual, but incFsStr is vertical offset\n const d = distance?.get(distanceUnit) ?? NaN\n const v = parseFloat(incFsStr)\n verticalDistance = Number.isFinite(v)\n ? new UnitizedNumber(v, distanceUnit)\n : undefined\n frontsightInclination = Angle.asin(v / d).in(inclinationUnit)\n backsightInclination = undefined\n } else {\n // frontsight inclination\n validate(\n ...ranges.frontsightInclination,\n 'inclination',\n isValidOptFloat\n )\n // backsight inclination\n validate(...ranges.backsightInclination, 'inclination', isValidOptFloat)\n frontsightInclination = parseNumber(incFsStr, inclinationUnit)\n backsightInclination = parseNumber(incBsStr, inclinationUnit)\n\n validateInclinationRange(\n frontsightInclination,\n ...ranges.frontsightInclination\n )\n validateInclinationRange(\n backsightInclination,\n ...ranges.backsightInclination\n )\n }\n\n const frontsightAzimuth = parseAzimuth(azmFsStr, azimuthUnit)\n const backsightAzimuth = parseAzimuth(azmBsStr, azimuthUnit)\n\n validateAzimuthRange(frontsightAzimuth, ...ranges.frontsightAzimuth)\n validateAzimuthRange(backsightAzimuth, ...ranges.backsightAzimuth)\n\n if (!/\\S/.test(incFsStr) && !/\\S/.test(incBsStr)) {\n frontsightInclination = Unitize.degrees(0)\n }\n\n if (from && distance && !lineIssues.length) {\n const shot: FrcsShot = {\n from,\n to: toStr.trim(),\n specialKind,\n distance,\n frontsightAzimuth,\n backsightAzimuth,\n frontsightInclination,\n backsightInclination,\n toLruds: {\n left,\n right,\n up,\n down,\n },\n excludeDistance,\n comment,\n ...(includeLocs && {\n loc: makeLineLoc(lineNumber, lineStartIndex, 0, line.length),\n }),\n }\n if (isSplay) shot.isSplay = true\n if (fromLruds) shot.fromLruds = fromLruds\n if (horizontalDistance) shot.horizontalDistance = horizontalDistance\n if (verticalDistance) shot.verticalDistance = verticalDistance\n addShot(shot)\n } else {\n const shot: InvalidFrcsShot['INVALID'] = {\n from,\n to: toStr.trim(),\n specialKind,\n distance,\n frontsightAzimuth,\n backsightAzimuth,\n frontsightInclination,\n backsightInclination,\n toLruds: {\n left,\n right,\n up,\n down,\n },\n excludeDistance,\n comment,\n ...(includeLocs && {\n loc: makeLineLoc(lineNumber, lineStartIndex, 0, line.length),\n }),\n }\n if (isSplay) shot.isSplay = true\n if (fromLruds) shot.fromLruds = fromLruds\n if (horizontalDistance) shot.horizontalDistance = horizontalDistance\n if (verticalDistance) shot.verticalDistance = verticalDistance\n addShot({ INVALID: shot, issues: lineIssues })\n }\n }\n }\n\n if (trip) trips.push(trip)\n\n trips.forEach((trip, index) => (unwrapInvalid(trip).tripNumber = index + 1))\n\n if (\n !issues.some((i) => i.type === 'error') &&\n trips.every((t): t is FrcsTrip => !('INVALID' in t))\n ) {\n return {\n cave,\n columns: outputColumns ? columns : undefined,\n location,\n trips,\n ...(issues.length ? { issues } : undefined),\n ...(includeLocs && { locs: rootLocs }),\n }\n }\n\n return {\n INVALID: {\n cave,\n columns: outputColumns ? columns : undefined,\n location,\n trips,\n ...(includeLocs && { locs: rootLocs }),\n },\n issues,\n }\n\n ////////////////////////////////////////////////////////////////////////////////////////////\n\n function getComment(): string | undefined {\n if (!commentLines.length) return undefined\n const comment = commentLines.join('\\n').trim()\n commentLines.length = 0\n return comment || undefined\n }\n\n function attachComment(\n shot: FrcsShot | InvalidFrcsShot | undefined,\n comment: string\n ) {\n const unwrapped = unwrapInvalid(shot)\n if (!unwrapped) return\n if (unwrapped.comment) unwrapped.comment += '\\n' + comment\n else unwrapped.comment = comment\n }\n\n function addCommentLine(comment: string): void {\n if (trip) {\n const distanceUnit =\n unwrapInvalid(alternateUnits)?.distanceUnit ||\n unwrapInvalid(unwrapInvalid(trip).units).distanceUnit ||\n Length.feet\n const parsedFromStationLruds = parseFromStationLruds(\n comment,\n distanceUnit\n )\n if (parsedFromStationLruds) {\n commentFromStationLruds.set(\n parsedFromStationLruds[0],\n parsedFromStationLruds[1]\n )\n return\n }\n }\n if (commentLines) {\n commentLines.push(comment)\n }\n }\n\n function addIssue(\n type: ParseIssueSeverity,\n code: string,\n message: string,\n startColumn: number,\n endColumn: number,\n indicesArray?: number[]\n ) {\n if (\n suppressWarnings &&\n type === 'warning' &&\n (suppressWarnings === true ||\n ('code' in suppressWarnings &&\n suppressWarnings[code as keyof typeof suppressWarnings] === true))\n ) {\n return\n }\n\n issues.push({\n type,\n code,\n message,\n loc: {\n start: {\n line: lineNumber,\n column: startColumn,\n index: lineStartIndex + startColumn,\n },\n end: {\n line: lineNumber,\n column: endColumn,\n index: lineStartIndex + endColumn,\n },\n },\n })\n if (!lineIssues) lineIssues = []\n lineIssues.push(issues.length - 1)\n indicesArray?.push(issues.length - 1)\n }\n\n function parseUnits(): FrcsUnits | InvalidFrcsUnits {\n // FT CC DD\n // 01234567\n const distanceUnit = parseLengthUnit(line.slice(0, 2))\n if (!distanceUnit) {\n addIssue('error', 'invalidDistanceUnit', 'Invalid distance unit', 0, 2)\n }\n const azimuthUnit = parseAngleUnit(line[6])\n if (!azimuthUnit) {\n addIssue('error', 'invalidAzimuthUnit', 'Invalid azimuth unit', 6, 7)\n }\n const inclinationUnit = parseAngleUnit(line[7])\n if (!inclinationUnit) {\n addIssue(\n 'error',\n 'invalidInclinationUnit',\n 'Invalid inclination unit',\n 7,\n 8\n )\n }\n const backsightAzimuthCorrected = line[3] === 'C'\n const backsightInclinationCorrected = line[4] === 'C'\n const hasBacksightAzimuth = line[3] !== ' ' && line[3] !== '-'\n const hasBacksightInclination = line[4] !== ' ' && line[4] !== '-'\n\n if (!/[-CB ]/.test(line[3])) {\n addIssue(\n 'error',\n 'invalidBacksightAzimuthType',\n 'Invalid backsight azimuth type',\n 3,\n 4\n )\n }\n if (!/[-CB ]/.test(line[4])) {\n addIssue(\n 'error',\n 'invalidBacksightInclinationType',\n 'Invalid backsight inclination type',\n 4,\n 5\n )\n }\n\n if (!distanceUnit || !azimuthUnit || !inclinationUnit) {\n return {\n INVALID: {\n distanceUnit,\n azimuthUnit,\n inclinationUnit,\n backsightAzimuthCorrected,\n backsightInclinationCorrected,\n hasBacksightAzimuth,\n hasBacksightInclination,\n },\n issues: lineIssues,\n }\n }\n\n return {\n distanceUnit,\n azimuthUnit,\n inclinationUnit,\n backsightAzimuthCorrected,\n backsightInclinationCorrected,\n hasBacksightAzimuth,\n hasBacksightInclination,\n }\n }\n\n function validate(\n startColumn: number,\n endColumn: number,\n fieldName: string,\n validator: (value: string) => boolean\n ): string {\n const field = line.substring(startColumn, endColumn)\n if (!validator(field)) {\n addIssue(\n 'error',\n `${\n field.trim() ? 'invalid' : 'missing'\n }${fieldName[0].toUpperCase()}${fieldName.substring(1)}`,\n (field.trim() ? 'Invalid ' : 'Missing ') + fieldName,\n startColumn,\n endColumn\n )\n }\n return field\n }\n\n function validateAzimuthRange(\n azimuth: UnitizedNumber<Angle> | undefined,\n startColumn: number,\n endColumn: number\n ) {\n if (!azimuth) return\n const rawValue = azimuth.get(azimuth.unit)\n let max = Infinity\n switch (azimuth.unit) {\n case Angle.degrees:\n max = 360\n break\n case Angle.gradians:\n max = 400\n break\n case Angle.radians:\n max = Math.PI * 2\n break\n case Angle.milsNATO:\n max = 6400\n break\n }\n if (rawValue < 0 || rawValue >= max) {\n addIssue(\n 'error',\n 'azimuthOutOfRange',\n 'Azimuth out of range',\n startColumn,\n endColumn,\n lineIssues\n )\n }\n }\n\n function validateInclinationRange(\n inclination: UnitizedNumber<Angle> | undefined,\n startColumn: number,\n endColumn: number\n ) {\n if (!inclination) return\n const rawValue = inclination.get(inclination.unit)\n let max = Infinity\n switch (inclination.unit) {\n case Angle.degrees:\n max = 90\n break\n case Angle.gradians:\n max = 100\n break\n case Angle.radians:\n max = Math.PI / 2\n break\n case Angle.milsNATO:\n max = 1600\n break\n }\n if (rawValue < -max || rawValue > max) {\n addIssue(\n 'error',\n 'inclinationOutOfRange',\n 'Inclination out of range',\n startColumn,\n endColumn,\n lineIssues\n )\n }\n }\n\n function addShot(shot: FrcsShot | InvalidFrcsShot) {\n lastShot = shot\n if (!trip) return\n if (alternateUnits) {\n const recorded:\n | FrcsShot['recorded']\n | InvalidFrcsShot['INVALID']['recorded'] = shot\n if ('INVALID' in shot) {\n shot = {\n INVALID: {\n ...shot.INVALID,\n recorded: shot,\n },\n issues: shot.issues,\n }\n } else {\n shot = { ...shot, recorded: shot }\n }\n if (nextShotUnits) {\n unwrapInvalid(recorded).units = nextShotUnits\n nextShotUnits = undefined\n }\n const {\n backsightAzimuthCorrected,\n backsightInclinationCorrected,\n distanceUnit,\n azimuthUnit,\n inclinationUnit,\n } = unwrapInvalid(unwrapInvalid(trip).units)\n const unwrappedAlternateUnits = unwrapInvalid(alternateUnits)\n const unwrappedShot = unwrapInvalid(shot)\n {\n const alternateUnits = unwrappedAlternateUnits\n const shot = unwrappedShot\n if (\n alternateUnits.backsightAzimuthCorrected !== backsightAzimuthCorrected\n ) {\n shot.backsightAzimuth = shot.backsightAzimuth\n ? Angle.opposite(shot.backsightAzimuth)\n : undefined\n }\n if (\n alternateUnits.backsightInclinationCorrected !==\n backsightInclinationCorrected\n ) {\n shot.backsightInclination = shot.backsightInclination?.negate()\n }\n if (distanceUnit && distanceUnit !== alternateUnits.distanceUnit) {\n shot.distance = shot.distance?.in(distanceUnit)\n if (shot.fromLruds) {\n shot.fromLruds = { ...shot.fromLruds }\n shot.fromLruds.left = shot.fromLruds.left?.in(distanceUnit)\n shot.fromLruds.right = shot.fromLruds.right?.in(distanceUnit)\n shot.fromLruds.up = shot.fromLruds.up?.in(distanceUnit)\n shot.fromLruds.down = shot.fromLruds.down?.in(distanceUnit)\n }\n if (shot.toLruds) {\n shot.toLruds = { ...shot.toLruds }\n shot.toLruds.left = shot.toLruds.left?.in(distanceUnit)\n shot.toLruds.right = shot.toLruds.right?.in(distanceUnit)\n shot.toLruds.up = shot.toLruds.up?.in(distanceUnit)\n shot.toLruds.down = shot.toLruds.down?.in(distanceUnit)\n }\n }\n if (azimuthUnit && azimuthUnit !== alternateUnits.azimuthUnit) {\n shot.frontsightAzimuth = shot.frontsightAzimuth?.in(azimuthUnit)\n shot.backsightAzimuth = shot.backsightAzimuth?.in(azimuthUnit)\n }\n if (\n inclinationUnit &&\n inclinationUnit !== alternateUnits.inclinationUnit\n ) {\n shot.frontsightInclination =\n shot.frontsightInclination?.in(inclinationUnit)\n shot.backsightInclination =\n shot.backsightInclination?.in(inclinationUnit)\n }\n }\n }\n if ('INVALID' in trip) {\n trip.INVALID.shots.push(shot)\n } else if ('INVALID' in shot) {\n trip = { INVALID: trip }\n trip.INVALID.shots.push(shot)\n } else {\n trip.shots.push(shot)\n }\n }\n}\n\nfunction makeLineLoc(\n line: number,\n lineStartIndex: number,\n startColumn: number,\n endColumn: number\n): SourceLoc {\n return {\n start: {\n index: lineStartIndex + startColumn,\n line,\n column: startColumn,\n },\n end: {\n index: lineStartIndex + endColumn,\n line,\n column: endColumn,\n },\n }\n}\n"],"mappings":"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","ignoreList":[]}
package/web/index.js CHANGED
@@ -79,7 +79,7 @@ const convertLineBased = fn => {
79
79
  return converted;
80
80
  };
81
81
  function chunksOf(input) {
82
- return readableStreamValues((input instanceof ReadableStream ? input : input.stream()).pipeThrough(new TextDecoderStream()));
82
+ return readableStreamValues((input instanceof ReadableStream ? input : input.stream()).pipeThrough(new TextDecoderStream('windows-1252')));
83
83
  }
84
84
  function parseFrcsSurveyFile(file, input, options) {
85
85
  if (file instanceof File) return (0, _parseFrcsSurveyFile2.default)(file.name, chunksOf(file), options);
package/web/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["_parseFrcsSurveyFile2","_interopRequireDefault","require","_parseFrcsPlotFile2","_parseFrcsTripSummaryFile2","LinesTransform","TransformStream","parts","constructor","transform","chunk","controller","end","match","matchAll","push","substring","index","enqueue","join","length","flush","readableStreamValues","stream","preventCancel","reader","getReader","next","result","read","done","releaseLock","e","return","value","cancelPromise","cancel","Symbol","asyncIterator","linesOf","input","ReadableStream","pipeThrough","TextDecoderStream","convertLineBased","fn","converted","file","File","name","chunksOf","parseFrcsSurveyFile","options","_parseFrcsSurveyFile","Blob","Error","parseFrcsPlotFile","exports","_parseFrcsPlotFile","parseFrcsTripSummaryFile","_parseFrcsTripSummaryFile"],"sources":["../../src/web/index.ts"],"sourcesContent":["import _parseFrcsSurveyFile from '../survey/parseFrcsSurveyFile'\nimport { ParseFrcsSurveyFileOptions } from '../survey/FrcsSurveyFile'\nimport _parseFrcsPlotFile from '../parseFrcsPlotFile'\nimport _parseFrcsTripSummaryFile from '../parseFrcsTripSummaryFile'\nimport type {\n FrcsSurveyFile,\n InvalidFrcsSurveyFile,\n} from '../survey/FrcsSurveyFile'\n\nclass LinesTransform extends TransformStream<string> {\n parts: string[] = []\n\n constructor() {\n super({\n transform: (chunk, controller) => {\n let end = 0\n for (const match of chunk.matchAll(/\\r\\n?|\\n/gm)) {\n this.parts.push(chunk.substring(end, match.index))\n controller.enqueue(this.parts.join(''))\n this.parts.length = 0\n end = match.index + match[0].length\n }\n if (end < chunk.length) this.parts.push(chunk.substring(end))\n },\n flush: (controller) => {\n if (this.parts.length) {\n controller.enqueue(this.parts.join(''))\n this.parts.length = 0\n }\n },\n })\n }\n}\n\nfunction readableStreamValues<T>(\n stream: ReadableStream<T>,\n { preventCancel = false }: { preventCancel?: boolean } = {}\n): AsyncIterableIterator<T> {\n const reader = stream.getReader()\n return {\n async next() {\n try {\n const result = await reader.read()\n if (result.done) {\n reader.releaseLock()\n }\n return result\n } catch (e) {\n reader.releaseLock()\n throw e\n }\n },\n async return(value: T) {\n if (!preventCancel) {\n const cancelPromise = reader.cancel(value)\n reader.releaseLock()\n await cancelPromise\n } else {\n reader.releaseLock()\n }\n return { done: true, value }\n },\n [Symbol.asyncIterator]() {\n return this\n },\n }\n}\n\nfunction linesOf(input: Blob | ReadableStream): AsyncIterable<string> {\n return readableStreamValues(\n (input instanceof ReadableStream ? input : input.stream())\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new LinesTransform())\n )\n}\n\nconst convertLineBased = <T>(\n fn: (file: string, lines: AsyncIterable<string>) => Promise<T>\n) => {\n function converted(file: File): Promise<T>\n function converted(file: string, input: Blob | ReadableStream): Promise<T>\n function converted(\n file: string | File,\n input?: Blob | ReadableStream\n ): Promise<T> {\n if (file instanceof File) return converted(file.name, file)\n return fn(file, linesOf(input!))\n }\n return converted\n}\n\nfunction chunksOf(input: Blob | ReadableStream): AsyncIterable<string> {\n return readableStreamValues(\n (input instanceof ReadableStream ? input : input.stream()).pipeThrough(\n new TextDecoderStream()\n )\n )\n}\n\nexport function parseFrcsSurveyFile(\n file: File,\n options?: ParseFrcsSurveyFileOptions\n): Promise<FrcsSurveyFile | InvalidFrcsSurveyFile>\nexport function parseFrcsSurveyFile(\n file: string,\n input: Blob | ReadableStream<Uint8Array>,\n options?: ParseFrcsSurveyFileOptions\n): Promise<FrcsSurveyFile | InvalidFrcsSurveyFile>\nexport function parseFrcsSurveyFile(\n file: string | File,\n input?: Blob | ReadableStream<Uint8Array> | ParseFrcsSurveyFileOptions,\n options?: ParseFrcsSurveyFileOptions\n): Promise<FrcsSurveyFile | InvalidFrcsSurveyFile> {\n if (file instanceof File)\n return _parseFrcsSurveyFile(file.name, chunksOf(file), options)\n if (input instanceof Blob || input instanceof ReadableStream) {\n return _parseFrcsSurveyFile(file, chunksOf(input), options)\n }\n throw new Error(`input ust be a Blob or ReadableStream if file is not a File`)\n}\n\nexport const parseFrcsPlotFile = convertLineBased(_parseFrcsPlotFile)\nexport const parseFrcsTripSummaryFile = convertLineBased(\n _parseFrcsTripSummaryFile\n)\n"],"mappings":";;;;;;;;;AAAA,IAAAA,qBAAA,GAAAC,sBAAA,CAAAC,OAAA;AAEA,IAAAC,mBAAA,GAAAF,sBAAA,CAAAC,OAAA;AACA,IAAAE,0BAAA,GAAAH,sBAAA,CAAAC,OAAA;AAMA,MAAMG,cAAc,SAASC,eAAe,CAAS;EACnDC,KAAK,GAAa,EAAE;EAEpBC,WAAWA,CAAA,EAAG;IACZ,KAAK,CAAC;MACJC,SAAS,EAAEA,CAACC,KAAK,EAAEC,UAAU,KAAK;QAChC,IAAIC,GAAG,GAAG,CAAC;QACX,KAAK,MAAMC,KAAK,IAAIH,KAAK,CAACI,QAAQ,CAAC,YAAY,CAAC,EAAE;UAChD,IAAI,CAACP,KAAK,CAACQ,IAAI,CAACL,KAAK,CAACM,SAAS,CAACJ,GAAG,EAAEC,KAAK,CAACI,KAAK,CAAC,CAAC;UAClDN,UAAU,CAACO,OAAO,CAAC,IAAI,CAACX,KAAK,CAACY,IAAI,CAAC,EAAE,CAAC,CAAC;UACvC,IAAI,CAACZ,KAAK,CAACa,MAAM,GAAG,CAAC;UACrBR,GAAG,GAAGC,KAAK,CAACI,KAAK,GAAGJ,KAAK,CAAC,CAAC,CAAC,CAACO,MAAM;QACrC;QACA,IAAIR,GAAG,GAAGF,KAAK,CAACU,MAAM,EAAE,IAAI,CAACb,KAAK,CAACQ,IAAI,CAACL,KAAK,CAACM,SAAS,CAACJ,GAAG,CAAC,CAAC;MAC/D,CAAC;MACDS,KAAK,EAAGV,UAAU,IAAK;QACrB,IAAI,IAAI,CAACJ,KAAK,CAACa,MAAM,EAAE;UACrBT,UAAU,CAACO,OAAO,CAAC,IAAI,CAACX,KAAK,CAACY,IAAI,CAAC,EAAE,CAAC,CAAC;UACvC,IAAI,CAACZ,KAAK,CAACa,MAAM,GAAG,CAAC;QACvB;MACF;IACF,CAAC,CAAC;EACJ;AACF;AAEA,SAASE,oBAAoBA,CAC3BC,MAAyB,EACzB;EAAEC,aAAa,GAAG;AAAmC,CAAC,GAAG,CAAC,CAAC,EACjC;EAC1B,MAAMC,MAAM,GAAGF,MAAM,CAACG,SAAS,CAAC,CAAC;EACjC,OAAO;IACL,MAAMC,IAAIA,CAAA,EAAG;MACX,IAAI;QACF,MAAMC,MAAM,GAAG,MAAMH,MAAM,CAACI,IAAI,CAAC,CAAC;QAClC,IAAID,MAAM,CAACE,IAAI,EAAE;UACfL,MAAM,CAACM,WAAW,CAAC,CAAC;QACtB;QACA,OAAOH,MAAM;MACf,CAAC,CAAC,OAAOI,CAAC,EAAE;QACVP,MAAM,CAACM,WAAW,CAAC,CAAC;QACpB,MAAMC,CAAC;MACT;IACF,CAAC;IACD,MAAMC,MAAMA,CAACC,KAAQ,EAAE;MACrB,IAAI,CAACV,aAAa,EAAE;QAClB,MAAMW,aAAa,GAAGV,MAAM,CAACW,MAAM,CAACF,KAAK,CAAC;QAC1CT,MAAM,CAACM,WAAW,CAAC,CAAC;QACpB,MAAMI,aAAa;MACrB,CAAC,MAAM;QACLV,MAAM,CAACM,WAAW,CAAC,CAAC;MACtB;MACA,OAAO;QAAED,IAAI,EAAE,IAAI;QAAEI;MAAM,CAAC;IAC9B,CAAC;IACD,CAACG,MAAM,CAACC,aAAa,IAAI;MACvB,OAAO,IAAI;IACb;EACF,CAAC;AACH;AAEA,SAASC,OAAOA,CAACC,KAA4B,EAAyB;EACpE,OAAOlB,oBAAoB,CACzB,CAACkB,KAAK,YAAYC,cAAc,GAAGD,KAAK,GAAGA,KAAK,CAACjB,MAAM,CAAC,CAAC,EACtDmB,WAAW,CAAC,IAAIC,iBAAiB,CAAC,CAAC,CAAC,CACpCD,WAAW,CAAC,IAAIrC,cAAc,CAAC,CAAC,CACrC,CAAC;AACH;AAEA,MAAMuC,gBAAgB,GACpBC,EAA8D,IAC3D;EAGH,SAASC,SAASA,CAChBC,IAAmB,EACnBP,KAA6B,EACjB;IACZ,IAAIO,IAAI,YAAYC,IAAI,EAAE,OAAOF,SAAS,CAACC,IAAI,CAACE,IAAI,EAAEF,IAAI,CAAC;IAC3D,OAAOF,EAAE,CAACE,IAAI,EAAER,OAAO,CAACC,KAAM,CAAC,CAAC;EAClC;EACA,OAAOM,SAAS;AAClB,CAAC;AAED,SAASI,QAAQA,CAACV,KAA4B,EAAyB;EACrE,OAAOlB,oBAAoB,CACzB,CAACkB,KAAK,YAAYC,cAAc,GAAGD,KAAK,GAAGA,KAAK,CAACjB,MAAM,CAAC,CAAC,EAAEmB,WAAW,CACpE,IAAIC,iBAAiB,CAAC,CACxB,CACF,CAAC;AACH;AAWO,SAASQ,mBAAmBA,CACjCJ,IAAmB,EACnBP,KAAsE,EACtEY,OAAoC,EACa;EACjD,IAAIL,IAAI,YAAYC,IAAI,EACtB,OAAO,IAAAK,6BAAoB,EAACN,IAAI,CAACE,IAAI,EAAEC,QAAQ,CAACH,IAAI,CAAC,EAAEK,OAAO,CAAC;EACjE,IAAIZ,KAAK,YAAYc,IAAI,IAAId,KAAK,YAAYC,cAAc,EAAE;IAC5D,OAAO,IAAAY,6BAAoB,EAACN,IAAI,EAAEG,QAAQ,CAACV,KAAK,CAAC,EAAEY,OAAO,CAAC;EAC7D;EACA,MAAM,IAAIG,KAAK,CAAC,6DAA6D,CAAC;AAChF;AAEO,MAAMC,iBAAiB,GAAAC,OAAA,CAAAD,iBAAA,GAAGZ,gBAAgB,CAACc,2BAAkB,CAAC;AAC9D,MAAMC,wBAAwB,GAAAF,OAAA,CAAAE,wBAAA,GAAGf,gBAAgB,CACtDgB,kCACF,CAAC","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["_parseFrcsSurveyFile2","_interopRequireDefault","require","_parseFrcsPlotFile2","_parseFrcsTripSummaryFile2","LinesTransform","TransformStream","parts","constructor","transform","chunk","controller","end","match","matchAll","push","substring","index","enqueue","join","length","flush","readableStreamValues","stream","preventCancel","reader","getReader","next","result","read","done","releaseLock","e","return","value","cancelPromise","cancel","Symbol","asyncIterator","linesOf","input","ReadableStream","pipeThrough","TextDecoderStream","convertLineBased","fn","converted","file","File","name","chunksOf","parseFrcsSurveyFile","options","_parseFrcsSurveyFile","Blob","Error","parseFrcsPlotFile","exports","_parseFrcsPlotFile","parseFrcsTripSummaryFile","_parseFrcsTripSummaryFile"],"sources":["../../src/web/index.ts"],"sourcesContent":["import _parseFrcsSurveyFile from '../survey/parseFrcsSurveyFile'\nimport { ParseFrcsSurveyFileOptions } from '../survey/FrcsSurveyFile'\nimport _parseFrcsPlotFile from '../parseFrcsPlotFile'\nimport _parseFrcsTripSummaryFile from '../parseFrcsTripSummaryFile'\nimport type {\n FrcsSurveyFile,\n InvalidFrcsSurveyFile,\n} from '../survey/FrcsSurveyFile'\n\nclass LinesTransform extends TransformStream<string> {\n parts: string[] = []\n\n constructor() {\n super({\n transform: (chunk, controller) => {\n let end = 0\n for (const match of chunk.matchAll(/\\r\\n?|\\n/gm)) {\n this.parts.push(chunk.substring(end, match.index))\n controller.enqueue(this.parts.join(''))\n this.parts.length = 0\n end = match.index + match[0].length\n }\n if (end < chunk.length) this.parts.push(chunk.substring(end))\n },\n flush: (controller) => {\n if (this.parts.length) {\n controller.enqueue(this.parts.join(''))\n this.parts.length = 0\n }\n },\n })\n }\n}\n\nfunction readableStreamValues<T>(\n stream: ReadableStream<T>,\n { preventCancel = false }: { preventCancel?: boolean } = {}\n): AsyncIterableIterator<T> {\n const reader = stream.getReader()\n return {\n async next() {\n try {\n const result = await reader.read()\n if (result.done) {\n reader.releaseLock()\n }\n return result\n } catch (e) {\n reader.releaseLock()\n throw e\n }\n },\n async return(value: T) {\n if (!preventCancel) {\n const cancelPromise = reader.cancel(value)\n reader.releaseLock()\n await cancelPromise\n } else {\n reader.releaseLock()\n }\n return { done: true, value }\n },\n [Symbol.asyncIterator]() {\n return this\n },\n }\n}\n\nfunction linesOf(input: Blob | ReadableStream): AsyncIterable<string> {\n return readableStreamValues(\n (input instanceof ReadableStream ? input : input.stream())\n .pipeThrough(new TextDecoderStream())\n .pipeThrough(new LinesTransform())\n )\n}\n\nconst convertLineBased = <T>(\n fn: (file: string, lines: AsyncIterable<string>) => Promise<T>\n) => {\n function converted(file: File): Promise<T>\n function converted(file: string, input: Blob | ReadableStream): Promise<T>\n function converted(\n file: string | File,\n input?: Blob | ReadableStream\n ): Promise<T> {\n if (file instanceof File) return converted(file.name, file)\n return fn(file, linesOf(input!))\n }\n return converted\n}\n\nfunction chunksOf(input: Blob | ReadableStream): AsyncIterable<string> {\n return readableStreamValues(\n (input instanceof ReadableStream ? input : input.stream()).pipeThrough(\n new TextDecoderStream('windows-1252')\n )\n )\n}\n\nexport function parseFrcsSurveyFile(\n file: File,\n options?: ParseFrcsSurveyFileOptions\n): Promise<FrcsSurveyFile | InvalidFrcsSurveyFile>\nexport function parseFrcsSurveyFile(\n file: string,\n input: Blob | ReadableStream<Uint8Array>,\n options?: ParseFrcsSurveyFileOptions\n): Promise<FrcsSurveyFile | InvalidFrcsSurveyFile>\nexport function parseFrcsSurveyFile(\n file: string | File,\n input?: Blob | ReadableStream<Uint8Array> | ParseFrcsSurveyFileOptions,\n options?: ParseFrcsSurveyFileOptions\n): Promise<FrcsSurveyFile | InvalidFrcsSurveyFile> {\n if (file instanceof File)\n return _parseFrcsSurveyFile(file.name, chunksOf(file), options)\n if (input instanceof Blob || input instanceof ReadableStream) {\n return _parseFrcsSurveyFile(file, chunksOf(input), options)\n }\n throw new Error(`input ust be a Blob or ReadableStream if file is not a File`)\n}\n\nexport const parseFrcsPlotFile = convertLineBased(_parseFrcsPlotFile)\nexport const parseFrcsTripSummaryFile = convertLineBased(\n _parseFrcsTripSummaryFile\n)\n"],"mappings":"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","ignoreList":[]}