@speleotica/frcsdata 4.3.1 → 5.0.0-beta.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 (172) hide show
  1. package/ParseIssue.d.ts +98 -0
  2. package/ParseIssue.d.ts.map +1 -0
  3. package/ParseIssue.js +17 -0
  4. package/ParseIssue.js.map +1 -0
  5. package/SourceLoc.d.ts +67 -0
  6. package/SourceLoc.d.ts.map +1 -0
  7. package/SourceLoc.js +18 -0
  8. package/SourceLoc.js.map +1 -0
  9. package/chunksToLines.d.ts +5 -0
  10. package/chunksToLines.d.ts.map +1 -0
  11. package/chunksToLines.js +37 -0
  12. package/chunksToLines.js.map +1 -0
  13. package/cli/check-survey-correspondence.d.ts +2 -0
  14. package/cli/check-survey-correspondence.d.ts.map +1 -0
  15. package/cli/check-survey-correspondence.js +44 -0
  16. package/cli/check-survey-correspondence.js.map +1 -0
  17. package/cli/check-survey.d.ts +2 -0
  18. package/cli/check-survey.d.ts.map +1 -0
  19. package/cli/check-survey.js +27 -0
  20. package/cli/check-survey.js.map +1 -0
  21. package/cli/parse-survey.d.ts +2 -0
  22. package/cli/parse-survey.d.ts.map +1 -0
  23. package/cli/parse-survey.js +15 -0
  24. package/cli/parse-survey.js.map +1 -0
  25. package/cli/summarize-survey.d.ts +2 -0
  26. package/cli/summarize-survey.d.ts.map +1 -0
  27. package/cli/summarize-survey.js +33 -0
  28. package/cli/summarize-survey.js.map +1 -0
  29. package/cli.d.ts +2 -0
  30. package/cli.d.ts.map +1 -0
  31. package/cli.js +72 -0
  32. package/cli.js.map +1 -0
  33. package/formatFrcsTripSummaryFile.d.ts +3 -0
  34. package/formatFrcsTripSummaryFile.d.ts.map +1 -0
  35. package/formatFrcsTripSummaryFile.js +33 -0
  36. package/formatFrcsTripSummaryFile.js.map +1 -0
  37. package/formatIssues.d.ts +10 -0
  38. package/formatIssues.d.ts.map +1 -0
  39. package/formatIssues.js +52 -0
  40. package/formatIssues.js.map +1 -0
  41. package/index.d.ts +5 -7
  42. package/index.d.ts.map +1 -1
  43. package/index.js +16 -49
  44. package/index.js.map +1 -1
  45. package/node/index.d.ts +4 -2
  46. package/node/index.d.ts.map +1 -1
  47. package/node/index.js +6 -12
  48. package/node/index.js.map +1 -1
  49. package/package.json +8 -6
  50. package/parseFrcsPlotFile.js +112 -245
  51. package/parseFrcsPlotFile.js.map +1 -1
  52. package/parseFrcsTripSummaryFile.d.ts +3 -1
  53. package/parseFrcsTripSummaryFile.d.ts.map +1 -1
  54. package/parseFrcsTripSummaryFile.js +53 -119
  55. package/parseFrcsTripSummaryFile.js.map +1 -1
  56. package/src/ParseIssue.ts +19 -0
  57. package/src/SourceLoc.ts +13 -0
  58. package/src/chunksToLines.ts +26 -0
  59. package/src/cli/check-survey-correspondence.ts +49 -0
  60. package/src/cli/check-survey.ts +23 -0
  61. package/src/cli/parse-survey.ts +10 -0
  62. package/src/cli/summarize-survey.ts +28 -0
  63. package/src/cli.ts +63 -0
  64. package/src/formatFrcsTripSummaryFile.ts +45 -0
  65. package/src/formatIssues.ts +97 -0
  66. package/src/index.ts +9 -7
  67. package/src/node/index.ts +18 -5
  68. package/src/parseFrcsTripSummaryFile.ts +8 -2
  69. package/src/string/index.ts +18 -5
  70. package/src/survey/FrcsSurveyFile.ts +217 -0
  71. package/src/survey/FrcsSurveyFileJson.ts +46 -0
  72. package/src/survey/ZodFrcsSurveyFileJson.ts +260 -0
  73. package/src/survey/ZodFrcsSurveyFileToJson.ts +297 -0
  74. package/src/{formatFrcsShot.ts → survey/formatFrcsShot.ts} +39 -22
  75. package/src/{formatFrcsSurveyFile.ts → survey/formatFrcsSurveyFile.ts} +4 -5
  76. package/src/survey/getColumnRanges.ts +82 -0
  77. package/src/survey/normalizeTeamMemberName.ts +7 -0
  78. package/src/survey/parseFrcsSurveyFile.ts +848 -0
  79. package/src/survey/parsers.ts +128 -0
  80. package/src/survey/summarizeSurvey.ts +51 -0
  81. package/src/survey/validators.ts +24 -0
  82. package/src/underlineSource.ts +34 -0
  83. package/src/unwrapInvalid.ts +3 -0
  84. package/src/web/index.ts +27 -21
  85. package/string/index.d.ts +4 -2
  86. package/string/index.d.ts.map +1 -1
  87. package/string/index.js +8 -34
  88. package/string/index.js.map +1 -1
  89. package/survey/FrcsSurveyFile.d.ts +172 -0
  90. package/survey/FrcsSurveyFile.d.ts.map +1 -0
  91. package/{FrcsSurveyFile.js → survey/FrcsSurveyFile.js} +3 -1
  92. package/survey/FrcsSurveyFile.js.map +1 -0
  93. package/survey/FrcsSurveyFileJson.d.ts +15 -0
  94. package/survey/FrcsSurveyFileJson.d.ts.map +1 -0
  95. package/{FrcsTrip.js → survey/FrcsSurveyFileJson.js} +1 -1
  96. package/survey/FrcsSurveyFileJson.js.map +1 -0
  97. package/survey/ZodFrcsSurveyFileJson.d.ts +60549 -0
  98. package/survey/ZodFrcsSurveyFileJson.d.ts.map +1 -0
  99. package/survey/ZodFrcsSurveyFileJson.js +186 -0
  100. package/survey/ZodFrcsSurveyFileJson.js.map +1 -0
  101. package/survey/ZodFrcsSurveyFileToJson.d.ts +60390 -0
  102. package/survey/ZodFrcsSurveyFileToJson.d.ts.map +1 -0
  103. package/survey/ZodFrcsSurveyFileToJson.js +209 -0
  104. package/survey/ZodFrcsSurveyFileToJson.js.map +1 -0
  105. package/{formatFrcsShot.d.ts → survey/formatFrcsShot.d.ts} +2 -3
  106. package/survey/formatFrcsShot.d.ts.map +1 -0
  107. package/survey/formatFrcsShot.js +107 -0
  108. package/survey/formatFrcsShot.js.map +1 -0
  109. package/survey/formatFrcsSurveyFile.d.ts +3 -0
  110. package/survey/formatFrcsSurveyFile.d.ts.map +1 -0
  111. package/survey/formatFrcsSurveyFile.js +87 -0
  112. package/survey/formatFrcsSurveyFile.js.map +1 -0
  113. package/survey/getColumnRanges.d.ts +24 -0
  114. package/survey/getColumnRanges.d.ts.map +1 -0
  115. package/survey/getColumnRanges.js +62 -0
  116. package/survey/getColumnRanges.js.map +1 -0
  117. package/survey/normalizeTeamMemberName.d.ts +2 -0
  118. package/survey/normalizeTeamMemberName.d.ts.map +1 -0
  119. package/survey/normalizeTeamMemberName.js +12 -0
  120. package/survey/normalizeTeamMemberName.js.map +1 -0
  121. package/{parseFrcsSurveyFile.d.ts → survey/parseFrcsSurveyFile.d.ts} +2 -5
  122. package/survey/parseFrcsSurveyFile.d.ts.map +1 -0
  123. package/survey/parseFrcsSurveyFile.js +626 -0
  124. package/survey/parseFrcsSurveyFile.js.map +1 -0
  125. package/survey/parsers.d.ts +11 -0
  126. package/survey/parsers.d.ts.map +1 -0
  127. package/survey/parsers.js +119 -0
  128. package/survey/parsers.js.map +1 -0
  129. package/survey/summarizeSurvey.d.ts +6 -0
  130. package/survey/summarizeSurvey.d.ts.map +1 -0
  131. package/survey/summarizeSurvey.js +58 -0
  132. package/survey/summarizeSurvey.js.map +1 -0
  133. package/survey/validators.d.ts +7 -0
  134. package/survey/validators.d.ts.map +1 -0
  135. package/survey/validators.js +36 -0
  136. package/survey/validators.js.map +1 -0
  137. package/underlineSource.d.ts +6 -0
  138. package/underlineSource.d.ts.map +1 -0
  139. package/underlineSource.js +22 -0
  140. package/underlineSource.js.map +1 -0
  141. package/unwrapInvalid.d.ts +4 -0
  142. package/unwrapInvalid.d.ts.map +1 -0
  143. package/unwrapInvalid.js +10 -0
  144. package/unwrapInvalid.js.map +1 -0
  145. package/web/index.d.ts +6 -6
  146. package/web/index.d.ts.map +1 -1
  147. package/web/index.js +60 -118
  148. package/web/index.js.map +1 -1
  149. package/FrcsShot.d.ts +0 -57
  150. package/FrcsShot.d.ts.map +0 -1
  151. package/FrcsShot.js +0 -13
  152. package/FrcsShot.js.map +0 -1
  153. package/FrcsSurveyFile.d.ts +0 -29
  154. package/FrcsSurveyFile.d.ts.map +0 -1
  155. package/FrcsSurveyFile.js.map +0 -1
  156. package/FrcsTrip.d.ts +0 -23
  157. package/FrcsTrip.d.ts.map +0 -1
  158. package/FrcsTrip.js.map +0 -1
  159. package/formatFrcsShot.d.ts.map +0 -1
  160. package/formatFrcsShot.js +0 -96
  161. package/formatFrcsShot.js.map +0 -1
  162. package/formatFrcsSurveyFile.d.ts +0 -3
  163. package/formatFrcsSurveyFile.d.ts.map +0 -1
  164. package/formatFrcsSurveyFile.js +0 -165
  165. package/formatFrcsSurveyFile.js.map +0 -1
  166. package/parseFrcsSurveyFile.d.ts.map +0 -1
  167. package/parseFrcsSurveyFile.js +0 -812
  168. package/parseFrcsSurveyFile.js.map +0 -1
  169. package/src/FrcsShot.ts +0 -56
  170. package/src/FrcsSurveyFile.ts +0 -47
  171. package/src/FrcsTrip.ts +0 -25
  172. package/src/parseFrcsSurveyFile.ts +0 -788
@@ -0,0 +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","columnRanges","getColumnRanges","maxRange","Math","max","Object","values","decimal","map","r","cave","undefined","location","trips","issues","tripName","tripTeam","tripDate","inTripComment","tripCommentStartLine","tripCommentEndLine","tripComment","commentLines","trip","inBlockComment","section","commentFromStationLruds","Map","unitsChanged","alternateUnits","nextShotUnits","lineNumber","line","lineStartIndex","lineIssues","tripIssues","began","startIndex","chunksToLines","length","test","match","exec","trim","parseUnits","dateMatch","team","substring","index","split","indexOf","flatMap","member","addIssue","normalizeTeamMemberName","month","day","year","parseInt","parseMonth","Date","push","addCommentLine","replace","header","name","comment","join","date","units","some","i","type","INVALID","shots","tripNumber","distanceUnit","unwrapInvalid","Length","feet","azimuthUnit","Angle","degrees","inclinationUnit","inches","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","excludeDistance","getComment","addShot","get","delete","fromLrudMatch","RegExp","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","isSplay","isValidFloat","h","NaN","v","sqrt","atan2","in","d","asin","parseNumber","parseAzimuth","toLruds","forEach","every","t","parsedFromStationLruds","parseFromStationLruds","set","code","message","startColumn","endColumn","indicesArray","loc","start","column","end","parseLengthUnit","slice","parseAngleUnit","backsightAzimuthCorrected","backsightInclinationCorrected","hasBacksightAzimuth","hasBacksightInclination","fieldName","validator","field","toUpperCase","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} 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'\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 }: 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 issues: ParseIssue[] = []\n\n let tripName: string | undefined\n let tripTeam: string[] | undefined\n let tripDate: Date | 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 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*([^,]+)(,(.*))?/.exec(line)\n if (match) {\n cave = match[1].trim()\n if (match[3]) {\n location = match[3].trim()\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 section = undefined\n tripTeam = undefined\n tripDate = 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 && line.trim()\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})))/i.exec(\n line\n )\n if (dateMatch) {\n const team = line.substring(0, dateMatch.index)\n tripTeam = team\n .split(team.indexOf(';') >= 0 ? ';' : ',')\n .flatMap((member) => member.trim() || [])\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 } 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 if (/^\\*\\s*%/.test(line)) {\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 header = {\n name: tripName || '',\n comment: (tripComment && tripComment.join('\\n')) || undefined,\n section,\n date: tripDate,\n team: tripTeam,\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 excludeDistance: true,\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\n const frontsightAzimuth = parseAzimuth(azmFsStr, azimuthUnit)\n const backsightAzimuth = parseAzimuth(azmBsStr, azimuthUnit)\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 }\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 }\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 }\n }\n\n return {\n INVALID: {\n cave,\n columns: outputColumns ? columns : undefined,\n location,\n trips,\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 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.INVALID = {\n ...shot.INVALID,\n recorded,\n }\n } else if ('INVALID' in recorded) {\n shot = {\n INVALID: {\n ...shot,\n recorded,\n },\n }\n } else {\n shot = { ...shot, recorded }\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.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.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"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,11 @@
1
+ import { UnitType, Unit, UnitizedNumber, Angle, Length } from '@speleotica/unitized';
2
+ import type { FrcsShot } from './FrcsSurveyFile';
3
+ export declare function parseMonth(month: string): 1 | 5 | 6 | 4 | 3 | 2 | 7 | 8 | 9 | 10 | 11 | 12;
4
+ export declare function parseNumber<T extends UnitType<T>>(s: string, unit: Unit<T>): UnitizedNumber<T> | undefined;
5
+ export declare function parseAzimuth(s: string, unit: Unit<Angle>): UnitizedNumber<Angle> | undefined;
6
+ export declare function parseSpecialKind(kind: string): FrcsShot['specialKind'];
7
+ export declare function parseLengthUnit(unit: string): Unit<Length> | undefined;
8
+ export declare function parseAngleUnit(unit: string): Unit<Angle> | undefined;
9
+ export declare function parseLrud<T extends UnitType<T>>(s: string, unit: Unit<Length>): UnitizedNumber<Length> | undefined;
10
+ export declare function parseFromStationLruds(line: string, distanceUnit: Unit<Length>): [string, NonNullable<FrcsShot['fromLruds']>] | undefined;
11
+ //# sourceMappingURL=parsers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsers.d.ts","sourceRoot":"","sources":["../../src/survey/parsers.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,QAAQ,EACR,IAAI,EACJ,cAAc,EACd,KAAK,EACL,MAAM,EACP,MAAM,sBAAsB,CAAA;AAE7B,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAA;AAGhD,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,oDA6BvC;AACD,wBAAgB,WAAW,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAC/C,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,GACZ,cAAc,CAAC,CAAC,CAAC,GAAG,SAAS,CAI/B;AACD,wBAAgB,YAAY,CAC1B,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,GAChB,cAAc,CAAC,KAAK,CAAC,GAAG,SAAS,CAGnC;AACD,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,QAAQ,CAAC,aAAa,CAAC,CAStE;AACD,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,SAAS,CAatE;AACD,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,SAAS,CAUpE;AACD,wBAAgB,SAAS,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAC7C,CAAC,EAAE,MAAM,EACT,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,GACjB,cAAc,CAAC,MAAM,CAAC,GAAG,SAAS,CAKpC;AACD,wBAAgB,qBAAqB,CACnC,IAAI,EAAE,MAAM,EACZ,YAAY,EAAE,IAAI,CAAC,MAAM,CAAC,GACzB,CAAC,MAAM,EAAE,WAAW,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC,CAAC,GAAG,SAAS,CAwB1D"}
@@ -0,0 +1,119 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.parseAngleUnit = parseAngleUnit;
7
+ exports.parseAzimuth = parseAzimuth;
8
+ exports.parseFromStationLruds = parseFromStationLruds;
9
+ exports.parseLengthUnit = parseLengthUnit;
10
+ exports.parseLrud = parseLrud;
11
+ exports.parseMonth = parseMonth;
12
+ exports.parseNumber = parseNumber;
13
+ exports.parseSpecialKind = parseSpecialKind;
14
+ var _unitized = require("@speleotica/unitized");
15
+ var _validators = require("./validators.js");
16
+ function parseMonth(month) {
17
+ switch (month.substring(0, 3).toLowerCase()) {
18
+ case 'jan':
19
+ return 1;
20
+ case 'feb':
21
+ return 2;
22
+ case 'mar':
23
+ return 3;
24
+ case 'apr':
25
+ return 4;
26
+ case 'may':
27
+ return 5;
28
+ case 'jun':
29
+ return 6;
30
+ case 'jul':
31
+ return 7;
32
+ case 'aug':
33
+ return 8;
34
+ case 'sep':
35
+ return 9;
36
+ case 'oct':
37
+ return 10;
38
+ case 'nov':
39
+ return 11;
40
+ case 'dec':
41
+ return 12;
42
+ default:
43
+ throw new Error(`invalid month: ${month}`);
44
+ }
45
+ }
46
+ function parseNumber(s, unit) {
47
+ const value = parseFloat(s);
48
+ if (isNaN(value)) return undefined;
49
+ return new _unitized.UnitizedNumber(value, unit);
50
+ }
51
+ function parseAzimuth(s, unit) {
52
+ const parsed = parseNumber(s, unit);
53
+ return parsed?.get(_unitized.Angle.degrees) === 360 ? _unitized.Unitize.degrees(0) : parsed;
54
+ }
55
+ function parseSpecialKind(kind) {
56
+ switch (kind) {
57
+ case 'H':
58
+ return 'horizontal';
59
+ case 'D':
60
+ return 'diagonal';
61
+ default:
62
+ return undefined;
63
+ }
64
+ }
65
+ function parseLengthUnit(unit) {
66
+ switch (unit) {
67
+ case 'FI':
68
+ return _unitized.Length.inches;
69
+ case 'FF':
70
+ case 'FT':
71
+ return _unitized.Length.feet;
72
+ case 'MT':
73
+ case 'MM':
74
+ case 'M ':
75
+ return _unitized.Length.meters;
76
+ }
77
+ return undefined;
78
+ }
79
+ function parseAngleUnit(unit) {
80
+ switch (unit) {
81
+ case 'D':
82
+ return _unitized.Angle.degrees;
83
+ case 'G':
84
+ return _unitized.Angle.gradians;
85
+ case 'M':
86
+ return _unitized.Angle.milsNATO;
87
+ }
88
+ return undefined;
89
+ }
90
+ function parseLrud(s, unit) {
91
+ const value = parseFloat(s);
92
+ return !Number.isFinite(value) || value < 0 ? undefined : new _unitized.UnitizedNumber(value, unit);
93
+ }
94
+ function parseFromStationLruds(line, distanceUnit) {
95
+ const fromStr = line.substring(0, 5);
96
+ if (!/^\s*\S+$/.test(fromStr)) return undefined;
97
+ const gap = line.substring(5, 40);
98
+ if (gap.trim()) return undefined;
99
+ const lrudStr = line.substring(40, 52);
100
+ if (!/\d/.test(lrudStr)) return undefined;
101
+ const lStr = line.substring(40, 43);
102
+ const rStr = line.substring(43, 46);
103
+ const uStr = line.substring(46, 49);
104
+ const dStr = line.substring(49, 52);
105
+ if (!(0, _validators.isValidOptFloat)(lStr) || !(0, _validators.isValidOptFloat)(rStr) || !(0, _validators.isValidOptFloat)(uStr) || !(0, _validators.isValidOptFloat)(dStr)) {
106
+ return undefined;
107
+ }
108
+ const up = parseLrud(uStr, distanceUnit);
109
+ const down = parseLrud(dStr, distanceUnit);
110
+ const left = parseLrud(lStr, distanceUnit);
111
+ const right = parseLrud(rStr, distanceUnit);
112
+ return [fromStr.trim(), {
113
+ left,
114
+ right,
115
+ up,
116
+ down
117
+ }];
118
+ }
119
+ //# sourceMappingURL=parsers.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parsers.js","names":["_unitized","require","_validators","parseMonth","month","substring","toLowerCase","Error","parseNumber","s","unit","value","parseFloat","isNaN","undefined","UnitizedNumber","parseAzimuth","parsed","get","Angle","degrees","Unitize","parseSpecialKind","kind","parseLengthUnit","Length","inches","feet","meters","parseAngleUnit","gradians","milsNATO","parseLrud","Number","isFinite","parseFromStationLruds","line","distanceUnit","fromStr","test","gap","trim","lrudStr","lStr","rStr","uStr","dStr","isValidOptFloat","up","down","left","right"],"sources":["../../src/survey/parsers.ts"],"sourcesContent":["import {\n UnitType,\n Unit,\n UnitizedNumber,\n Angle,\n Length,\n} from '@speleotica/unitized'\nimport { Unitize } from '@speleotica/unitized'\nimport type { FrcsShot } from './FrcsSurveyFile'\nimport { isValidOptFloat } from './validators'\n\nexport function parseMonth(month: string) {\n switch (month.substring(0, 3).toLowerCase()) {\n case 'jan':\n return 1\n case 'feb':\n return 2\n case 'mar':\n return 3\n case 'apr':\n return 4\n case 'may':\n return 5\n case 'jun':\n return 6\n case 'jul':\n return 7\n case 'aug':\n return 8\n case 'sep':\n return 9\n case 'oct':\n return 10\n case 'nov':\n return 11\n case 'dec':\n return 12\n default:\n throw new Error(`invalid month: ${month}`)\n }\n}\nexport function parseNumber<T extends UnitType<T>>(\n s: string,\n unit: Unit<T>\n): UnitizedNumber<T> | undefined {\n const value = parseFloat(s)\n if (isNaN(value)) return undefined\n return new UnitizedNumber(value, unit)\n}\nexport function parseAzimuth(\n s: string,\n unit: Unit<Angle>\n): UnitizedNumber<Angle> | undefined {\n const parsed = parseNumber(s, unit)\n return parsed?.get(Angle.degrees) === 360 ? Unitize.degrees(0) : parsed\n}\nexport function parseSpecialKind(kind: string): FrcsShot['specialKind'] {\n switch (kind) {\n case 'H':\n return 'horizontal'\n case 'D':\n return 'diagonal'\n default:\n return undefined\n }\n}\nexport function parseLengthUnit(unit: string): Unit<Length> | undefined {\n switch (unit) {\n case 'FI':\n return Length.inches\n case 'FF':\n case 'FT':\n return Length.feet\n case 'MT':\n case 'MM':\n case 'M ':\n return Length.meters\n }\n return undefined\n}\nexport function parseAngleUnit(unit: string): Unit<Angle> | undefined {\n switch (unit) {\n case 'D':\n return Angle.degrees\n case 'G':\n return Angle.gradians\n case 'M':\n return Angle.milsNATO\n }\n return undefined\n}\nexport function parseLrud<T extends UnitType<T>>(\n s: string,\n unit: Unit<Length>\n): UnitizedNumber<Length> | undefined {\n const value = parseFloat(s)\n return !Number.isFinite(value) || value < 0\n ? undefined\n : new UnitizedNumber(value, unit)\n}\nexport function parseFromStationLruds(\n line: string,\n distanceUnit: Unit<Length>\n): [string, NonNullable<FrcsShot['fromLruds']>] | undefined {\n const fromStr = line.substring(0, 5)\n if (!/^\\s*\\S+$/.test(fromStr)) return undefined\n const gap = line.substring(5, 40)\n if (gap.trim()) return undefined\n const lrudStr = line.substring(40, 52)\n if (!/\\d/.test(lrudStr)) return undefined\n const lStr = line.substring(40, 43)\n const rStr = line.substring(43, 46)\n const uStr = line.substring(46, 49)\n const dStr = line.substring(49, 52)\n if (\n !isValidOptFloat(lStr) ||\n !isValidOptFloat(rStr) ||\n !isValidOptFloat(uStr) ||\n !isValidOptFloat(dStr)\n ) {\n return undefined\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 return [fromStr.trim(), { left, right, up, down }]\n}\n"],"mappings":"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","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ import { FrcsTripSummaryFile } from '../FrcsTripSummaryFile.js';
2
+ import { FrcsSurveyFile, InvalidFrcsSurveyFile } from './FrcsSurveyFile.js';
3
+ export declare function summarizeSurvey(parsed: FrcsSurveyFile | InvalidFrcsSurveyFile, options?: {
4
+ ignoreVerticalOfHShots?: boolean;
5
+ }): FrcsTripSummaryFile;
6
+ //# sourceMappingURL=summarizeSurvey.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarizeSurvey.d.ts","sourceRoot":"","sources":["../../src/survey/summarizeSurvey.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAA;AAC/D,OAAO,EAAE,cAAc,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAA;AAG3E,wBAAgB,eAAe,CAC7B,MAAM,EAAE,cAAc,GAAG,qBAAqB,EAC9C,OAAO,CAAC,EAAE;IAAE,sBAAsB,CAAC,EAAE,OAAO,CAAA;CAAE,uBA2C/C"}
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.summarizeSurvey = summarizeSurvey;
7
+ var _unitized = require("@speleotica/unitized");
8
+ var _unwrapInvalid = require("../unwrapInvalid.js");
9
+ function summarizeSurvey(parsed, options) {
10
+ const summary = {
11
+ tripSummaries: []
12
+ };
13
+ let tripIndex = 0;
14
+ for (const trip of (0, _unwrapInvalid.unwrapInvalid)(parsed).trips) {
15
+ const {
16
+ tripNumber,
17
+ header,
18
+ units,
19
+ shots
20
+ } = (0, _unwrapInvalid.unwrapInvalid)(trip);
21
+ const {
22
+ name,
23
+ date,
24
+ team
25
+ } = (0, _unwrapInvalid.unwrapInvalid)(header);
26
+ const distanceUnit = (0, _unwrapInvalid.unwrapInvalid)(units).distanceUnit || _unitized.Length.feet;
27
+ let totalLength = new _unitized.UnitizedNumber(0, distanceUnit);
28
+ let excludedLength = new _unitized.UnitizedNumber(0, distanceUnit);
29
+ let numExcludedShots = 0;
30
+ for (const shot of (0, _unwrapInvalid.unwrapInvalid)(shots)) {
31
+ const {
32
+ distance,
33
+ horizontalDistance,
34
+ excludeDistance
35
+ } = (0, _unwrapInvalid.unwrapInvalid)(shot);
36
+ const statDistance = options?.ignoreVerticalOfHShots && horizontalDistance ? horizontalDistance : distance;
37
+ if (statDistance) totalLength = totalLength.add(statDistance);
38
+ if (excludeDistance) {
39
+ numExcludedShots++;
40
+ if (statDistance) excludedLength = excludedLength.add(statDistance);
41
+ }
42
+ }
43
+ summary.tripSummaries.push({
44
+ tripNumber: tripNumber ?? NaN,
45
+ tripIndex: tripIndex++,
46
+ date: date || new Date(NaN),
47
+ name: name || '',
48
+ team: team || [],
49
+ numShots: shots.length,
50
+ totalLength,
51
+ numExcludedShots,
52
+ excludedLength,
53
+ shots: []
54
+ });
55
+ }
56
+ return summary;
57
+ }
58
+ //# sourceMappingURL=summarizeSurvey.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"summarizeSurvey.js","names":["_unitized","require","_unwrapInvalid","summarizeSurvey","parsed","options","summary","tripSummaries","tripIndex","trip","unwrapInvalid","trips","tripNumber","header","units","shots","name","date","team","distanceUnit","Length","feet","totalLength","UnitizedNumber","excludedLength","numExcludedShots","shot","distance","horizontalDistance","excludeDistance","statDistance","ignoreVerticalOfHShots","add","push","NaN","Date","numShots","length"],"sources":["../../src/survey/summarizeSurvey.ts"],"sourcesContent":["import { Length, UnitizedNumber } from '@speleotica/unitized'\nimport { FrcsTripSummaryFile } from '../FrcsTripSummaryFile.js'\nimport { FrcsSurveyFile, InvalidFrcsSurveyFile } from './FrcsSurveyFile.js'\nimport { unwrapInvalid } from '../unwrapInvalid.js'\n\nexport function summarizeSurvey(\n parsed: FrcsSurveyFile | InvalidFrcsSurveyFile,\n options?: { ignoreVerticalOfHShots?: boolean }\n) {\n const summary: FrcsTripSummaryFile = {\n tripSummaries: [],\n }\n let tripIndex = 0\n for (const trip of unwrapInvalid(parsed).trips) {\n const { tripNumber, header, units, shots } = unwrapInvalid(trip)\n const { name, date, team } = unwrapInvalid(header)\n const distanceUnit = unwrapInvalid(units).distanceUnit || Length.feet\n let totalLength = new UnitizedNumber(0, distanceUnit)\n let excludedLength = new UnitizedNumber(0, distanceUnit)\n let numExcludedShots = 0\n\n for (const shot of unwrapInvalid(shots)) {\n const { distance, horizontalDistance, excludeDistance } =\n unwrapInvalid(shot)\n const statDistance =\n options?.ignoreVerticalOfHShots && horizontalDistance\n ? horizontalDistance\n : distance\n if (statDistance) totalLength = totalLength.add(statDistance)\n if (excludeDistance) {\n numExcludedShots++\n if (statDistance) excludedLength = excludedLength.add(statDistance)\n }\n }\n\n summary.tripSummaries.push({\n tripNumber: tripNumber ?? NaN,\n tripIndex: tripIndex++,\n date: date || new Date(NaN),\n name: name || '',\n team: team || [],\n numShots: shots.length,\n totalLength,\n numExcludedShots,\n excludedLength,\n shots: [],\n })\n }\n\n return summary\n}\n"],"mappings":";;;;;;AAAA,IAAAA,SAAA,GAAAC,OAAA;AAGA,IAAAC,cAAA,GAAAD,OAAA;AAEO,SAASE,eAAeA,CAC7BC,MAA8C,EAC9CC,OAA8C,EAC9C;EACA,MAAMC,OAA4B,GAAG;IACnCC,aAAa,EAAE;EACjB,CAAC;EACD,IAAIC,SAAS,GAAG,CAAC;EACjB,KAAK,MAAMC,IAAI,IAAI,IAAAC,4BAAa,EAACN,MAAM,CAAC,CAACO,KAAK,EAAE;IAC9C,MAAM;MAAEC,UAAU;MAAEC,MAAM;MAAEC,KAAK;MAAEC;IAAM,CAAC,GAAG,IAAAL,4BAAa,EAACD,IAAI,CAAC;IAChE,MAAM;MAAEO,IAAI;MAAEC,IAAI;MAAEC;IAAK,CAAC,GAAG,IAAAR,4BAAa,EAACG,MAAM,CAAC;IAClD,MAAMM,YAAY,GAAG,IAAAT,4BAAa,EAACI,KAAK,CAAC,CAACK,YAAY,IAAIC,gBAAM,CAACC,IAAI;IACrE,IAAIC,WAAW,GAAG,IAAIC,wBAAc,CAAC,CAAC,EAAEJ,YAAY,CAAC;IACrD,IAAIK,cAAc,GAAG,IAAID,wBAAc,CAAC,CAAC,EAAEJ,YAAY,CAAC;IACxD,IAAIM,gBAAgB,GAAG,CAAC;IAExB,KAAK,MAAMC,IAAI,IAAI,IAAAhB,4BAAa,EAACK,KAAK,CAAC,EAAE;MACvC,MAAM;QAAEY,QAAQ;QAAEC,kBAAkB;QAAEC;MAAgB,CAAC,GACrD,IAAAnB,4BAAa,EAACgB,IAAI,CAAC;MACrB,MAAMI,YAAY,GAChBzB,OAAO,EAAE0B,sBAAsB,IAAIH,kBAAkB,GACjDA,kBAAkB,GAClBD,QAAQ;MACd,IAAIG,YAAY,EAAER,WAAW,GAAGA,WAAW,CAACU,GAAG,CAACF,YAAY,CAAC;MAC7D,IAAID,eAAe,EAAE;QACnBJ,gBAAgB,EAAE;QAClB,IAAIK,YAAY,EAAEN,cAAc,GAAGA,cAAc,CAACQ,GAAG,CAACF,YAAY,CAAC;MACrE;IACF;IAEAxB,OAAO,CAACC,aAAa,CAAC0B,IAAI,CAAC;MACzBrB,UAAU,EAAEA,UAAU,IAAIsB,GAAG;MAC7B1B,SAAS,EAAEA,SAAS,EAAE;MACtBS,IAAI,EAAEA,IAAI,IAAI,IAAIkB,IAAI,CAACD,GAAG,CAAC;MAC3BlB,IAAI,EAAEA,IAAI,IAAI,EAAE;MAChBE,IAAI,EAAEA,IAAI,IAAI,EAAE;MAChBkB,QAAQ,EAAErB,KAAK,CAACsB,MAAM;MACtBf,WAAW;MACXG,gBAAgB;MAChBD,cAAc;MACdT,KAAK,EAAE;IACT,CAAC,CAAC;EACJ;EAEA,OAAOT,OAAO;AAChB","ignoreList":[]}
@@ -0,0 +1,7 @@
1
+ export declare function isValidStation(s: string): boolean;
2
+ export declare function isValidUInt(s: string): boolean;
3
+ export declare function isValidFloat(s: string): boolean;
4
+ export declare function isValidOptFloat(s: string): boolean;
5
+ export declare function isValidOptUFloat(s: string): boolean;
6
+ export declare function isValidUFloat(s: string): boolean;
7
+ //# sourceMappingURL=validators.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.d.ts","sourceRoot":"","sources":["../../src/survey/validators.ts"],"names":[],"mappings":"AACA,wBAAgB,cAAc,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAEjD;AAED,wBAAgB,WAAW,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAE9C;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAElD;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,aAAa,CAAC,CAAC,EAAE,MAAM,GAAG,OAAO,CAEhD"}
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.isValidFloat = isValidFloat;
7
+ exports.isValidOptFloat = isValidOptFloat;
8
+ exports.isValidOptUFloat = isValidOptUFloat;
9
+ exports.isValidStation = isValidStation;
10
+ exports.isValidUFloat = isValidUFloat;
11
+ exports.isValidUInt = isValidUInt;
12
+ // determines if a cell contains a valid station name.
13
+ function isValidStation(s) {
14
+ return /^\s*\S+\s*$/.test(s);
15
+ }
16
+ // determines if a cell contains a valid unsigned integer.
17
+ function isValidUInt(s) {
18
+ return /^\s*[0-9]+\s*$/.test(s);
19
+ }
20
+ // determines if a cell contains a valid float.
21
+ function isValidFloat(s) {
22
+ return /^\s*[-+]?([0-9]+(\.[0-9]*)?|\.[0-9]+)\s*$/.test(s);
23
+ }
24
+ // determines if a cell contains a valid unsigned float or whitespace.
25
+ function isValidOptFloat(s) {
26
+ return /^\s*([-+]?([0-9]+(\.[0-9]*)?|\.[0-9]+))?\s*$/.test(s);
27
+ }
28
+ // determines if a cell contains a valid unsigned float or whitespace.
29
+ function isValidOptUFloat(s) {
30
+ return /^\s*([0-9]+(\.[0-9]*)?|\.[0-9]+)?\s*$/.test(s);
31
+ }
32
+ // determines if a cell contains a valid unsigned float.
33
+ function isValidUFloat(s) {
34
+ return /^\s*([0-9]+(\.[0-9]*)?|\.[0-9]+)\s*$/.test(s);
35
+ }
36
+ //# sourceMappingURL=validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validators.js","names":["isValidStation","s","test","isValidUInt","isValidFloat","isValidOptFloat","isValidOptUFloat","isValidUFloat"],"sources":["../../src/survey/validators.ts"],"sourcesContent":["// determines if a cell contains a valid station name.\nexport function isValidStation(s: string): boolean {\n return /^\\s*\\S+\\s*$/.test(s)\n}\n// determines if a cell contains a valid unsigned integer.\nexport function isValidUInt(s: string): boolean {\n return /^\\s*[0-9]+\\s*$/.test(s)\n}\n// determines if a cell contains a valid float.\nexport function isValidFloat(s: string): boolean {\n return /^\\s*[-+]?([0-9]+(\\.[0-9]*)?|\\.[0-9]+)\\s*$/.test(s)\n}\n// determines if a cell contains a valid unsigned float or whitespace.\nexport function isValidOptFloat(s: string): boolean {\n return /^\\s*([-+]?([0-9]+(\\.[0-9]*)?|\\.[0-9]+))?\\s*$/.test(s)\n}\n// determines if a cell contains a valid unsigned float or whitespace.\nexport function isValidOptUFloat(s: string): boolean {\n return /^\\s*([0-9]+(\\.[0-9]*)?|\\.[0-9]+)?\\s*$/.test(s)\n}\n// determines if a cell contains a valid unsigned float.\nexport function isValidUFloat(s: string): boolean {\n return /^\\s*([0-9]+(\\.[0-9]*)?|\\.[0-9]+)\\s*$/.test(s)\n}\n"],"mappings":";;;;;;;;;;;AAAA;AACO,SAASA,cAAcA,CAACC,CAAS,EAAW;EACjD,OAAO,aAAa,CAACC,IAAI,CAACD,CAAC,CAAC;AAC9B;AACA;AACO,SAASE,WAAWA,CAACF,CAAS,EAAW;EAC9C,OAAO,gBAAgB,CAACC,IAAI,CAACD,CAAC,CAAC;AACjC;AACA;AACO,SAASG,YAAYA,CAACH,CAAS,EAAW;EAC/C,OAAO,2CAA2C,CAACC,IAAI,CAACD,CAAC,CAAC;AAC5D;AACA;AACO,SAASI,eAAeA,CAACJ,CAAS,EAAW;EAClD,OAAO,8CAA8C,CAACC,IAAI,CAACD,CAAC,CAAC;AAC/D;AACA;AACO,SAASK,gBAAgBA,CAACL,CAAS,EAAW;EACnD,OAAO,uCAAuC,CAACC,IAAI,CAACD,CAAC,CAAC;AACxD;AACA;AACO,SAASM,aAAaA,CAACN,CAAS,EAAW;EAChD,OAAO,sCAAsC,CAACC,IAAI,CAACD,CAAC,CAAC;AACvD","ignoreList":[]}
@@ -0,0 +1,6 @@
1
+ import { SourceLoc } from './SourceLoc';
2
+ export declare function underlineSource(source: string, loc: SourceLoc, { underlineChar, underlineStyle, }?: {
3
+ underlineChar?: string;
4
+ underlineStyle?: (s: string) => string;
5
+ }): string;
6
+ //# sourceMappingURL=underlineSource.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"underlineSource.d.ts","sourceRoot":"","sources":["src/underlineSource.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAEvC,wBAAgB,eAAe,CAC7B,MAAM,EAAE,MAAM,EACd,GAAG,EAAE,SAAS,EACd,EACE,aAAmB,EACnB,cAAyB,GAC1B,GAAE;IAAE,aAAa,CAAC,EAAE,MAAM,CAAC;IAAC,cAAc,CAAC,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,MAAM,CAAA;CAAO,UAyB3E"}
@@ -0,0 +1,22 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.underlineSource = underlineSource;
7
+ function underlineSource(source, loc, {
8
+ underlineChar = '^',
9
+ underlineStyle = s => s
10
+ } = {}) {
11
+ let start = source.lastIndexOf('\n', loc.start.index);
12
+ if (start < 0) start = source.lastIndexOf('\r', loc.start.index);
13
+ if (start < 0) start = -1;
14
+ if (start < loc.start.index) start++;
15
+ let end = source.indexOf('\r', loc.end.index);
16
+ if (end < 0) end = source.indexOf('\n', loc.end.index);
17
+ if (end < 0) end = source.length;
18
+ const sourcelines = source.substring(start, end).split(/\r\n?|\n/gm);
19
+ const underlineLines = (' '.repeat(loc.start.index - start) + source.substring(loc.start.index, Math.max(loc.start.index + 1, loc.end.index)).replace(/[^\r\n]/g, underlineChar) + ' '.repeat(end - loc.end.index)).split(/\r\n?|\n/gm).map(line => underlineStyle(line));
20
+ return sourcelines.flatMap((line, index) => [line, underlineLines[index]]).join('\n');
21
+ }
22
+ //# sourceMappingURL=underlineSource.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"underlineSource.js","names":["underlineSource","source","loc","underlineChar","underlineStyle","s","start","lastIndexOf","index","end","indexOf","length","sourcelines","substring","split","underlineLines","repeat","Math","max","replace","map","line","flatMap","join"],"sources":["src/underlineSource.ts"],"sourcesContent":["import { SourceLoc } from './SourceLoc'\n\nexport function underlineSource(\n source: string,\n loc: SourceLoc,\n {\n underlineChar = '^',\n underlineStyle = (s) => s,\n }: { underlineChar?: string; underlineStyle?: (s: string) => string } = {}\n) {\n let start = source.lastIndexOf('\\n', loc.start.index)\n if (start < 0) start = source.lastIndexOf('\\r', loc.start.index)\n if (start < 0) start = -1\n if (start < loc.start.index) start++\n\n let end = source.indexOf('\\r', loc.end.index)\n if (end < 0) end = source.indexOf('\\n', loc.end.index)\n if (end < 0) end = source.length\n\n const sourcelines = source.substring(start, end).split(/\\r\\n?|\\n/gm)\n const underlineLines = (\n ' '.repeat(loc.start.index - start) +\n source\n .substring(loc.start.index, Math.max(loc.start.index + 1, loc.end.index))\n .replace(/[^\\r\\n]/g, underlineChar) +\n ' '.repeat(end - loc.end.index)\n )\n .split(/\\r\\n?|\\n/gm)\n .map((line) => underlineStyle(line))\n\n return sourcelines\n .flatMap((line, index) => [line, underlineLines[index]])\n .join('\\n')\n}\n"],"mappings":";;;;;;AAEO,SAASA,eAAeA,CAC7BC,MAAc,EACdC,GAAc,EACd;EACEC,aAAa,GAAG,GAAG;EACnBC,cAAc,GAAIC,CAAC,IAAKA;AAC0C,CAAC,GAAG,CAAC,CAAC,EAC1E;EACA,IAAIC,KAAK,GAAGL,MAAM,CAACM,WAAW,CAAC,IAAI,EAAEL,GAAG,CAACI,KAAK,CAACE,KAAK,CAAC;EACrD,IAAIF,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAGL,MAAM,CAACM,WAAW,CAAC,IAAI,EAAEL,GAAG,CAACI,KAAK,CAACE,KAAK,CAAC;EAChE,IAAIF,KAAK,GAAG,CAAC,EAAEA,KAAK,GAAG,CAAC,CAAC;EACzB,IAAIA,KAAK,GAAGJ,GAAG,CAACI,KAAK,CAACE,KAAK,EAAEF,KAAK,EAAE;EAEpC,IAAIG,GAAG,GAAGR,MAAM,CAACS,OAAO,CAAC,IAAI,EAAER,GAAG,CAACO,GAAG,CAACD,KAAK,CAAC;EAC7C,IAAIC,GAAG,GAAG,CAAC,EAAEA,GAAG,GAAGR,MAAM,CAACS,OAAO,CAAC,IAAI,EAAER,GAAG,CAACO,GAAG,CAACD,KAAK,CAAC;EACtD,IAAIC,GAAG,GAAG,CAAC,EAAEA,GAAG,GAAGR,MAAM,CAACU,MAAM;EAEhC,MAAMC,WAAW,GAAGX,MAAM,CAACY,SAAS,CAACP,KAAK,EAAEG,GAAG,CAAC,CAACK,KAAK,CAAC,YAAY,CAAC;EACpE,MAAMC,cAAc,GAAG,CACrB,GAAG,CAACC,MAAM,CAACd,GAAG,CAACI,KAAK,CAACE,KAAK,GAAGF,KAAK,CAAC,GACnCL,MAAM,CACHY,SAAS,CAACX,GAAG,CAACI,KAAK,CAACE,KAAK,EAAES,IAAI,CAACC,GAAG,CAAChB,GAAG,CAACI,KAAK,CAACE,KAAK,GAAG,CAAC,EAAEN,GAAG,CAACO,GAAG,CAACD,KAAK,CAAC,CAAC,CACxEW,OAAO,CAAC,UAAU,EAAEhB,aAAa,CAAC,GACrC,GAAG,CAACa,MAAM,CAACP,GAAG,GAAGP,GAAG,CAACO,GAAG,CAACD,KAAK,CAAC,EAE9BM,KAAK,CAAC,YAAY,CAAC,CACnBM,GAAG,CAAEC,IAAI,IAAKjB,cAAc,CAACiB,IAAI,CAAC,CAAC;EAEtC,OAAOT,WAAW,CACfU,OAAO,CAAC,CAACD,IAAI,EAAEb,KAAK,KAAK,CAACa,IAAI,EAAEN,cAAc,CAACP,KAAK,CAAC,CAAC,CAAC,CACvDe,IAAI,CAAC,IAAI,CAAC;AACf","ignoreList":[]}
@@ -0,0 +1,4 @@
1
+ export declare function unwrapInvalid<T>(t: T): T extends {
2
+ INVALID: infer I;
3
+ } ? I : T;
4
+ //# sourceMappingURL=unwrapInvalid.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unwrapInvalid.d.ts","sourceRoot":"","sources":["src/unwrapInvalid.ts"],"names":[],"mappings":"AAAA,wBAAgB,aAAa,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,CAAC,SAAS;IAAE,OAAO,EAAE,MAAM,CAAC,CAAA;CAAE,GAAG,CAAC,GAAG,CAAC,CAE7E"}
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.unwrapInvalid = unwrapInvalid;
7
+ function unwrapInvalid(t) {
8
+ return t instanceof Object && 'INVALID' in t ? t.INVALID : t;
9
+ }
10
+ //# sourceMappingURL=unwrapInvalid.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unwrapInvalid.js","names":["unwrapInvalid","t","Object","INVALID"],"sources":["src/unwrapInvalid.ts"],"sourcesContent":["export function unwrapInvalid<T>(t: T): T extends { INVALID: infer I } ? I : T {\n return (t instanceof Object && 'INVALID' in t ? t.INVALID : t) as any\n}\n"],"mappings":";;;;;;AAAO,SAASA,aAAaA,CAAIC,CAAI,EAA0C;EAC7E,OAAQA,CAAC,YAAYC,MAAM,IAAI,SAAS,IAAID,CAAC,GAAGA,CAAC,CAACE,OAAO,GAAGF,CAAC;AAC/D","ignoreList":[]}
package/web/index.d.ts CHANGED
@@ -1,13 +1,13 @@
1
- import { ParseFrcsSurveyFileOptions } from '../parseFrcsSurveyFile';
2
- import { FrcsSurveyFile } from '../FrcsSurveyFile';
3
- export declare function parseFrcsSurveyFile(file: File, options?: ParseFrcsSurveyFileOptions): Promise<FrcsSurveyFile>;
4
- export declare function parseFrcsSurveyFile(file: string, input: Blob | ReadableStream<Uint8Array>, options?: ParseFrcsSurveyFileOptions): Promise<FrcsSurveyFile>;
1
+ import { ParseFrcsSurveyFileOptions } from '../survey/FrcsSurveyFile';
2
+ import type { FrcsSurveyFile, InvalidFrcsSurveyFile } from '../survey/FrcsSurveyFile';
3
+ export declare function parseFrcsSurveyFile(file: File, options?: ParseFrcsSurveyFileOptions): Promise<FrcsSurveyFile | InvalidFrcsSurveyFile>;
4
+ export declare function parseFrcsSurveyFile(file: string, input: Blob | ReadableStream<Uint8Array>, options?: ParseFrcsSurveyFileOptions): Promise<FrcsSurveyFile | InvalidFrcsSurveyFile>;
5
5
  export declare const parseFrcsPlotFile: {
6
6
  (file: File): Promise<import("..").FrcsPlotFile>;
7
- (file: string, input: Blob | ReadableStream<Uint8Array>): Promise<import("..").FrcsPlotFile>;
7
+ (file: string, input: Blob | ReadableStream): Promise<import("..").FrcsPlotFile>;
8
8
  };
9
9
  export declare const parseFrcsTripSummaryFile: {
10
10
  (file: File): Promise<import("..").FrcsTripSummaryFile>;
11
- (file: string, input: Blob | ReadableStream<Uint8Array>): Promise<import("..").FrcsTripSummaryFile>;
11
+ (file: string, input: Blob | ReadableStream): Promise<import("..").FrcsTripSummaryFile>;
12
12
  };
13
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/web/index.ts"],"names":[],"mappings":"AAAA,OAA6B,EAC3B,0BAA0B,EAC3B,MAAM,wBAAwB,CAAA;AAG/B,OAAO,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAA;AA0FlD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,cAAc,CAAC,CAAA;AAC1B,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,IAAI,GAAG,cAAc,CAAC,UAAU,CAAC,EACxC,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,cAAc,CAAC,CAAA;AAc1B,eAAO,MAAM,iBAAiB;WArCH,IAAI;WAErB,MAAM,SACL,IAAI,GAAG,eAAe,UAAU,CAAC;CAkCgB,CAAA;AAC5D,eAAO,MAAM,wBAAwB;WAtCV,IAAI;WAErB,MAAM,SACL,IAAI,GAAG,eAAe,UAAU,CAAC;CAmC8B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/web/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAA;AAGrE,OAAO,KAAK,EACV,cAAc,EACd,qBAAqB,EACtB,MAAM,0BAA0B,CAAA;AA4FjC,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,IAAI,EACV,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,cAAc,GAAG,qBAAqB,CAAC,CAAA;AAClD,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,KAAK,EAAE,IAAI,GAAG,cAAc,CAAC,UAAU,CAAC,EACxC,OAAO,CAAC,EAAE,0BAA0B,GACnC,OAAO,CAAC,cAAc,GAAG,qBAAqB,CAAC,CAAA;AAclD,eAAO,MAAM,iBAAiB;WA1CH,IAAI;WACJ,MAAM,SAAS,IAAI,GAAG,cAAc;CAyCM,CAAA;AACrE,eAAO,MAAM,wBAAwB;WA3CV,IAAI;WACJ,MAAM,SAAS,IAAI,GAAG,cAAc;CA4C9D,CAAA"}