ropegeo-common 1.16.1 → 1.17.0

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 (62) hide show
  1. package/README.md +22 -14
  2. package/dist/components/RopeGeoDataLoader.d.ts +5 -3
  3. package/dist/components/RopeGeoDataLoader.d.ts.map +1 -1
  4. package/dist/components/RopeGeoDataLoader.js +12 -2
  5. package/dist/models/api/params/acaDifficultyParams.d.ts +8 -8
  6. package/dist/models/api/params/acaDifficultyParams.d.ts.map +1 -1
  7. package/dist/models/api/params/acaDifficultyParams.js +13 -13
  8. package/dist/models/api/params/difficultyParams.d.ts +5 -5
  9. package/dist/models/api/params/difficultyParams.d.ts.map +1 -1
  10. package/dist/models/api/params/difficultyParams.js +3 -3
  11. package/dist/models/difficulty/acaDifficultyRating.d.ts +31 -0
  12. package/dist/models/difficulty/acaDifficultyRating.d.ts.map +1 -0
  13. package/dist/models/difficulty/acaDifficultyRating.js +113 -0
  14. package/dist/models/difficulty/{acaRatings.d.ts → acaSubRatings.d.ts} +10 -10
  15. package/dist/models/difficulty/acaSubRatings.d.ts.map +1 -0
  16. package/dist/models/difficulty/acaSubRatings.js +78 -0
  17. package/dist/models/difficulty/difficultyRating.d.ts +29 -0
  18. package/dist/models/difficulty/difficultyRating.d.ts.map +1 -0
  19. package/dist/models/difficulty/difficultyRating.js +65 -0
  20. package/dist/models/difficulty/registerDifficultyRatingParsers.d.ts +7 -0
  21. package/dist/models/difficulty/registerDifficultyRatingParsers.d.ts.map +1 -0
  22. package/dist/models/difficulty/registerDifficultyRatingParsers.js +8 -0
  23. package/dist/models/filters/acaDifficultyFilterOptions.d.ts +15 -15
  24. package/dist/models/filters/acaDifficultyFilterOptions.d.ts.map +1 -1
  25. package/dist/models/filters/acaDifficultyFilterOptions.js +15 -15
  26. package/dist/models/filters/difficultyFilterOptions.d.ts +6 -6
  27. package/dist/models/filters/difficultyFilterOptions.d.ts.map +1 -1
  28. package/dist/models/filters/difficultyFilterOptions.js +6 -6
  29. package/dist/models/index.d.ts +26 -12
  30. package/dist/models/index.d.ts.map +1 -1
  31. package/dist/models/index.js +54 -32
  32. package/dist/models/mobile/savedPage.js +10 -10
  33. package/dist/models/pageViews/offlineRopewikiPageView.d.ts +1 -1
  34. package/dist/models/pageViews/offlineRopewikiPageView.d.ts.map +1 -1
  35. package/dist/models/pageViews/offlineRopewikiPageView.js +3 -3
  36. package/dist/models/pageViews/onlineRopewikiPageView.d.ts +1 -1
  37. package/dist/models/pageViews/onlineRopewikiPageView.d.ts.map +1 -1
  38. package/dist/models/pageViews/onlineRopewikiPageView.js +4 -4
  39. package/dist/models/pageViews/ropewikiPageView.d.ts +5 -5
  40. package/dist/models/pageViews/ropewikiPageView.d.ts.map +1 -1
  41. package/dist/models/pageViews/ropewikiPageView.js +13 -13
  42. package/dist/models/previews/offlinePagePreview.d.ts +1 -1
  43. package/dist/models/previews/offlinePagePreview.d.ts.map +1 -1
  44. package/dist/models/previews/offlinePagePreview.js +2 -2
  45. package/dist/models/previews/onlinePagePreview.d.ts +1 -1
  46. package/dist/models/previews/onlinePagePreview.d.ts.map +1 -1
  47. package/dist/models/previews/onlinePagePreview.js +3 -3
  48. package/dist/models/previews/pagePreview.d.ts +7 -7
  49. package/dist/models/previews/pagePreview.d.ts.map +1 -1
  50. package/dist/models/previews/pagePreview.js +19 -16
  51. package/package.json +1 -1
  52. package/dist/models/difficulty/acaDifficulty.d.ts +0 -31
  53. package/dist/models/difficulty/acaDifficulty.d.ts.map +0 -1
  54. package/dist/models/difficulty/acaDifficulty.js +0 -110
  55. package/dist/models/difficulty/acaRatings.d.ts.map +0 -1
  56. package/dist/models/difficulty/acaRatings.js +0 -78
  57. package/dist/models/difficulty/difficulty.d.ts +0 -25
  58. package/dist/models/difficulty/difficulty.d.ts.map +0 -1
  59. package/dist/models/difficulty/difficulty.js +0 -55
  60. package/dist/models/difficulty/registerDifficultyParsers.d.ts +0 -7
  61. package/dist/models/difficulty/registerDifficultyParsers.d.ts.map +0 -1
  62. package/dist/models/difficulty/registerDifficultyParsers.js +0 -8
package/README.md CHANGED
@@ -83,23 +83,31 @@ Helper tables use columns **Name**, **Description**, **Import**. Model tables ad
83
83
 
84
84
  | Name | Base class | Description | Import |
85
85
  | --- | --- | --- | --- |
86
- | `DifficultyType` | N/A | Discriminator for difficulty scales (e.g. ACA). | `import { DifficultyType } from 'ropegeo-common/models'` |
87
- | `Difficulty` | N/A | Abstract base for page/route difficulty; `fromResult` dispatches by `difficultyType`. | `import { Difficulty } from 'ropegeo-common/models'` |
88
- | `registerDifficultyParser` | N/A | Registers a `Difficulty.fromResult` parser for a `DifficultyType`. | `import { registerDifficultyParser } from 'ropegeo-common/models'` |
86
+ | `DifficultyRatingSystem` | N/A | Discriminator for difficulty rating scales (e.g. ACA). | `import { DifficultyRatingSystem } from 'ropegeo-common/models'` |
87
+ | `DifficultyRating` | N/A | Abstract base for page/route difficulty ratings; `fromResult` dispatches by `difficultyRatingSystem`. | `import { DifficultyRating } from 'ropegeo-common/models'` |
88
+ | `resolveDifficultyRatingFromRecord` | N/A | Reads nested difficulty rating JSON from `difficultyRating` or legacy `difficulty` keys. | `import { resolveDifficultyRatingFromRecord } from 'ropegeo-common/models'` |
89
+ | `registerDifficultyParser` | N/A | Registers a `DifficultyRating.fromResult` parser for a `DifficultyRatingSystem`. | `import { registerDifficultyParser } from 'ropegeo-common/models'` |
89
90
  | `ACA_RISK_ORDER` | N/A | Numeric total order for ACA risk ratings. | `import { ACA_RISK_ORDER } from 'ropegeo-common/models'` |
90
91
  | `ACA_TECHNICAL_ORDER` | N/A | Numeric total order for ACA technical ratings. | `import { ACA_TECHNICAL_ORDER } from 'ropegeo-common/models'` |
91
92
  | `ACA_TIME_ORDER` | N/A | Numeric total order for ACA time ratings. | `import { ACA_TIME_ORDER } from 'ropegeo-common/models'` |
92
93
  | `ACA_WATER_ORDER` | N/A | Numeric total order for ACA water ratings. | `import { ACA_WATER_ORDER } from 'ropegeo-common/models'` |
93
- | `AcaTechnicalRating` | N/A | ACA technical rating enum (1–4). | `import { AcaTechnicalRating } from 'ropegeo-common/models'` |
94
- | `AcaWaterRating` | N/A | ACA water rating enum. | `import { AcaWaterRating } from 'ropegeo-common/models'` |
95
- | `AcaTimeRating` | N/A | ACA time rating enum (I–VI). | `import { AcaTimeRating } from 'ropegeo-common/models'` |
96
- | `AcaRiskRating` | N/A | ACA risk rating enum. | `import { AcaRiskRating } from 'ropegeo-common/models'` |
94
+ | `AcaTechnicalSubRating` | N/A | ACA technical sub-rating enum (1–4). | `import { AcaTechnicalSubRating } from 'ropegeo-common/models'` |
95
+ | `AcaWaterSubRating` | N/A | ACA water sub-rating enum. | `import { AcaWaterSubRating } from 'ropegeo-common/models'` |
96
+ | `AcaTimeSubRating` | N/A | ACA time sub-rating enum (I–VI). | `import { AcaTimeSubRating } from 'ropegeo-common/models'` |
97
+ | `AcaRiskSubRating` | N/A | ACA risk sub-rating enum. | `import { AcaRiskSubRating } from 'ropegeo-common/models'` |
97
98
  | `RISK_ORDER` | N/A | Deprecated alias for `ACA_RISK_ORDER`. | `import { RISK_ORDER } from 'ropegeo-common/models'` |
98
- | `AcaDifficulty` | `Difficulty` | ACA difficulty from DB/API strings; raw vs effective risk. | `import { AcaDifficulty } from 'ropegeo-common/models'` |
99
- | `DifficultyTechnical` | N/A | Deprecated alias for `AcaTechnicalRating`. | `import { DifficultyTechnical } from 'ropegeo-common/models'` |
100
- | `DifficultyWater` | N/A | Deprecated alias for `AcaWaterRating`. | `import { DifficultyWater } from 'ropegeo-common/models'` |
101
- | `DifficultyTime` | N/A | Deprecated alias for `AcaTimeRating`. | `import { DifficultyTime } from 'ropegeo-common/models'` |
102
- | `DifficultyRisk` | N/A | Deprecated alias for `AcaRiskRating`. | `import { DifficultyRisk } from 'ropegeo-common/models'` |
99
+ | `AcaDifficultyRating` | `DifficultyRating` | ACA difficulty rating from DB/API strings; raw vs effective risk. | `import { AcaDifficultyRating } from 'ropegeo-common/models'` |
100
+ | `DifficultyType` | N/A | Deprecated alias for `DifficultyRatingSystem`. | `import { DifficultyType } from 'ropegeo-common/models'` |
101
+ | `Difficulty` | N/A | Deprecated alias for `DifficultyRating`. | `import { Difficulty } from 'ropegeo-common/models'` |
102
+ | `AcaDifficulty` | N/A | Deprecated alias for `AcaDifficultyRating`. | `import { AcaDifficulty } from 'ropegeo-common/models'` |
103
+ | `AcaTechnicalRating` | N/A | Deprecated alias for `AcaTechnicalSubRating`. | `import { AcaTechnicalRating } from 'ropegeo-common/models'` |
104
+ | `AcaWaterRating` | N/A | Deprecated alias for `AcaWaterSubRating`. | `import { AcaWaterRating } from 'ropegeo-common/models'` |
105
+ | `AcaTimeRating` | N/A | Deprecated alias for `AcaTimeSubRating`. | `import { AcaTimeRating } from 'ropegeo-common/models'` |
106
+ | `AcaRiskRating` | N/A | Deprecated alias for `AcaRiskSubRating`. | `import { AcaRiskRating } from 'ropegeo-common/models'` |
107
+ | `DifficultyTechnical` | N/A | Deprecated alias for `AcaTechnicalSubRating`. | `import { DifficultyTechnical } from 'ropegeo-common/models'` |
108
+ | `DifficultyWater` | N/A | Deprecated alias for `AcaWaterSubRating`. | `import { DifficultyWater } from 'ropegeo-common/models'` |
109
+ | `DifficultyTime` | N/A | Deprecated alias for `AcaTimeSubRating`. | `import { DifficultyTime } from 'ropegeo-common/models'` |
110
+ | `DifficultyRisk` | N/A | Deprecated alias for `AcaRiskSubRating`. | `import { DifficultyRisk } from 'ropegeo-common/models'` |
103
111
 
104
112
  ### API query parameters (`src/models/api/params/`)
105
113
 
@@ -110,7 +118,7 @@ Helper tables use columns **Name**, **Description**, **Import**. Model tables ad
110
118
  | `DifficultyParams` | N/A | Abstract GET-query difficulty filter; `fromQueryStringParams` / `fromResult`. | `import { DifficultyParams } from 'ropegeo-common/models'` |
111
119
  | `DifficultyParamsQueryRecord` | N/A | Flat string map for difficulty query parsing. | `import type { DifficultyParamsQueryRecord } from 'ropegeo-common/models'` |
112
120
  | `registerDifficultyParamsQueryInference` | N/A | Registers inference when `difficulty-type` is omitted. | `import { registerDifficultyParamsQueryInference } from 'ropegeo-common/models'` |
113
- | `registerDifficultyParamsQueryParser` | N/A | Registers a query parser for a `DifficultyType`. | `import { registerDifficultyParamsQueryParser } from 'ropegeo-common/models'` |
121
+ | `registerDifficultyParamsQueryParser` | N/A | Registers a query parser for a `DifficultyRatingSystem`. | `import { registerDifficultyParamsQueryParser } from 'ropegeo-common/models'` |
114
122
  | `isDifficultyParamsActive` | N/A | True if difficulty params are non-null and active. | `import { isDifficultyParamsActive } from 'ropegeo-common/models'` |
115
123
  | `AcaDifficultyParams` | `DifficultyParams` | ACA pipe-list allow-lists for routes/search query strings. | `import { AcaDifficultyParams } from 'ropegeo-common/models'` |
116
124
  | `Q_DIFFICULTY_TYPE` | N/A | Query key constant for difficulty type. | `import { Q_DIFFICULTY_TYPE } from 'ropegeo-common/models'` |
@@ -326,7 +334,7 @@ Legend entries for page minimaps are keyed objects (`legend` on `PageMiniMap`);
326
334
 
327
335
  | Name | Description | Import |
328
336
  | --- | --- | --- |
329
- | `RopeGeoDataLoader` | Single-request loader: `onlinePath` / `onlinePathParams`, optional `offlineData` (object used as `data` immediately; no network), optional `timeoutAfterSeconds` and `isOnline`. Children receive `data`, `errors`, `timeoutCountdown` (numeric only while an online fetch is in flight, otherwise `null`), and `reload`. Reconnect refetch uses `dirtyWhileOffline` driven by a semantic key (no `refreshOnReconnect` prop). Also exports `Method`, `Service`, `SERVICE_BASE_URL`. | `import { RopeGeoDataLoader, Method, Service } from 'ropegeo-common/components'` |
337
+ | `RopeGeoDataLoader` | Single-request loader: `onlinePath` / `onlinePathParams`, optional `offlineData` (`undefined` fetch online; `null` → `data` null / loading-style, no fetch; `T` → use as `data`, no fetch), optional `timeoutAfterSeconds` and `isOnline`. Children receive `data`, `errors`, `timeoutCountdown` (numeric only while an online fetch is in flight, otherwise `null`), and `reload`. Reconnect refetch uses `dirtyWhileOffline` driven by a semantic key (no `refreshOnReconnect` prop). Also exports `Method`, `Service`, `SERVICE_BASE_URL`. | `import { RopeGeoDataLoader, Method, Service } from 'ropegeo-common/components'` |
330
338
  | `RopeGeoPagedDataLoader` | Cursor-paginated list: same networking props as above; children get `loadNextPage`, `loadingNextPage`, `morePages`, plus `data`, `errors`, `timeoutCountdown`, `reload`. | `import { RopeGeoPagedDataLoader } from 'ropegeo-common/components'` |
331
339
  | `RopeGeoProgressDataLoader` | Page-based “progress” fetch: batches additional pages until `total` is satisfied; children get `received`, `total`, `data`, `errors`, `timeoutCountdown`, `reload`. | `import { RopeGeoProgressDataLoader } from 'ropegeo-common/components'` |
332
340
 
@@ -31,10 +31,12 @@ export type RopeGeoDataLoaderProps<T = unknown> = {
31
31
  */
32
32
  isOnline?: boolean;
33
33
  /**
34
- * When set, this value is used as `data` immediately (no network). Callers that load from disk
35
- * should read and parse the file themselves, then pass the resulting object here.
34
+ * Offline / local-first behavior without reading files inside the loader:
35
+ * - **`undefined`**: omit or leave unset fetch from {@link onlinePath} as usual.
36
+ * - **`null`**: do not fetch; children receive `data: null` and `errors: null` (loading-style).
37
+ * - **`T`**: use as `data` immediately; no network.
36
38
  */
37
- offlineData?: T;
39
+ offlineData?: T | null;
38
40
  children: (args: {
39
41
  data: T | null;
40
42
  errors: Error | null;
@@ -1 +1 @@
1
- {"version":3,"file":"RopeGeoDataLoader.d.ts","sourceRoot":"","sources":["../../src/components/RopeGeoDataLoader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAavC,eAAO,MAAM,OAAO;;CAEV,CAAC;AACX,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC;AAE7D,eAAO,MAAM,MAAM;;;;;CAKT,CAAC;AACX,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,OAAO,MAAM,CAAC,CAAC;AAE1D,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAEpD,CAAC;AAoEF,MAAM,MAAM,sBAAsB,CAAC,CAAC,GAAG,OAAO,IAAI;IAChD,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;OAGG;IACH,WAAW,CAAC,EAAE,CAAC,CAAC;IAChB,QAAQ,EAAE,CAAC,IAAI,EAAE;QACf,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;QACf,MAAM,EAAE,KAAK,GAAG,IAAI,CAAC;QACrB;;;WAGG;QACH,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,iFAAiF;QACjF,MAAM,EAAE,MAAM,IAAI,CAAC;KACpB,KAAK,SAAS,CAAC;CACjB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,CAAC,GAAG,OAAO,EAAE,EAC7C,OAAO,EACP,MAAM,EACN,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,IAAI,EACJ,mBAAmB,EACnB,QAAQ,EACR,WAAW,EACX,QAAQ,GACT,EAAE,sBAAsB,CAAC,CAAC,CAAC,2CAwT3B"}
1
+ {"version":3,"file":"RopeGeoDataLoader.d.ts","sourceRoot":"","sources":["../../src/components/RopeGeoDataLoader.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAavC,eAAO,MAAM,OAAO;;CAEV,CAAC;AACX,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,OAAO,CAAC,CAAC,MAAM,OAAO,OAAO,CAAC,CAAC;AAE7D,eAAO,MAAM,MAAM;;;;;CAKT,CAAC;AACX,MAAM,MAAM,MAAM,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,OAAO,MAAM,CAAC,CAAC;AAE1D,eAAO,MAAM,gBAAgB,EAAE,MAAM,CAAC,OAAO,EAAE,MAAM,CAEpD,CAAC;AAqEF,MAAM,MAAM,sBAAsB,CAAC,CAAC,GAAG,OAAO,IAAI;IAChD,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;IACf,0FAA0F;IAC1F,UAAU,EAAE,MAAM,CAAC;IACnB,gBAAgB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC,CAAC;IACpE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;OAGG;IACH,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;OAIG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IACvB,QAAQ,EAAE,CAAC,IAAI,EAAE;QACf,IAAI,EAAE,CAAC,GAAG,IAAI,CAAC;QACf,MAAM,EAAE,KAAK,GAAG,IAAI,CAAC;QACrB;;;WAGG;QACH,gBAAgB,EAAE,MAAM,GAAG,IAAI,CAAC;QAChC,iFAAiF;QACjF,MAAM,EAAE,MAAM,IAAI,CAAC;KACpB,KAAK,SAAS,CAAC;CACjB,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,CAAC,GAAG,OAAO,EAAE,EAC7C,OAAO,EACP,MAAM,EACN,UAAU,EACV,gBAAgB,EAChB,WAAW,EACX,IAAI,EACJ,mBAAmB,EACnB,QAAQ,EACR,WAAW,EACX,QAAQ,GACT,EAAE,sBAAsB,CAAC,CAAC,CAAC,2CAgU3B"}
@@ -57,6 +57,8 @@ function dataLoaderReconnectSemanticKey(service, method, onlinePath, pathParamsK
57
57
  function offlineDataKeyPart(offlineData) {
58
58
  if (offlineData === undefined)
59
59
  return "";
60
+ if (offlineData === null)
61
+ return "|offline:null";
60
62
  return `|obj:${JSON.stringify(offlineData)}`;
61
63
  }
62
64
  function RopeGeoDataLoader({ service, method, onlinePath, onlinePathParams, queryParams, body, timeoutAfterSeconds, isOnline, offlineData, children, }) {
@@ -104,11 +106,19 @@ function RopeGeoDataLoader({ service, method, onlinePath, onlinePathParams, quer
104
106
  setReloadTick((n) => n + 1);
105
107
  }, [isOnline]);
106
108
  const lastRequestKeyRef = (0, react_1.useRef)("");
107
- /** `offlineData` object immediate `data`, no network. */
109
+ /** Sync `data` from {@link offlineData} when it is `null` or `T`; `undefined` defers to the network effect. */
108
110
  (0, react_1.useEffect)(() => {
109
111
  if (offlineData === undefined) {
110
112
  return;
111
113
  }
114
+ if (offlineData === null) {
115
+ setData(null);
116
+ setErrors(null);
117
+ hasCommittedRef.current = false;
118
+ dirtyWhileOfflineRef.current = false;
119
+ semanticSnapshotRef.current = null;
120
+ return;
121
+ }
112
122
  setData(offlineData);
113
123
  setErrors(null);
114
124
  hasCommittedRef.current = true;
@@ -130,7 +140,7 @@ function RopeGeoDataLoader({ service, method, onlinePath, onlinePathParams, quer
130
140
  dirtyWhileOfflineRef.current = true;
131
141
  }
132
142
  }
133
- /** Object `offlineData`: dedicated effect owns `data`; never hit the network here. */
143
+ /** `offlineData` is `null` or `T`: own `data`; never hit the network here. */
134
144
  if (offlineData !== undefined) {
135
145
  prevIsOnlineRef.current = online;
136
146
  return;
@@ -1,5 +1,5 @@
1
- import { DifficultyType } from '../../difficulty/difficulty';
2
- import { AcaRiskRating, AcaTechnicalRating, AcaTimeRating, AcaWaterRating } from '../../difficulty/acaRatings';
1
+ import { DifficultyRatingSystem } from '../../difficulty/difficultyRating';
2
+ import { AcaRiskSubRating, AcaTechnicalSubRating, AcaTimeSubRating, AcaWaterSubRating } from '../../difficulty/acaSubRatings';
3
3
  import { DifficultyParams, type DifficultyParamsQueryRecord } from './difficultyParams';
4
4
  export declare const Q_DIFFICULTY_TYPE = "difficulty-type";
5
5
  export declare const Q_ACA_TECHNICAL = "aca-technical-rating";
@@ -7,12 +7,12 @@ export declare const Q_ACA_WATER = "aca-water-rating";
7
7
  export declare const Q_ACA_TIME = "aca-time-rating";
8
8
  export declare const Q_ACA_RISK = "aca-risk-rating";
9
9
  export declare class AcaDifficultyParams extends DifficultyParams {
10
- readonly difficultyType = DifficultyType.ACA;
11
- readonly technical: AcaTechnicalRating[];
12
- readonly water: AcaWaterRating[];
13
- readonly time: AcaTimeRating[];
14
- readonly effectiveRisk: AcaRiskRating[];
15
- constructor(technical: AcaTechnicalRating[], water: AcaWaterRating[], time: AcaTimeRating[], effectiveRisk: AcaRiskRating[]);
10
+ readonly difficultyType = DifficultyRatingSystem.ACA;
11
+ readonly technical: AcaTechnicalSubRating[];
12
+ readonly water: AcaWaterSubRating[];
13
+ readonly time: AcaTimeSubRating[];
14
+ readonly effectiveRisk: AcaRiskSubRating[];
15
+ constructor(technical: AcaTechnicalSubRating[], water: AcaWaterSubRating[], time: AcaTimeSubRating[], effectiveRisk: AcaRiskSubRating[]);
16
16
  isActive(): boolean;
17
17
  toQueryString(): string;
18
18
  static fromQueryStringParams(q: DifficultyParamsQueryRecord): AcaDifficultyParams;
@@ -1 +1 @@
1
- {"version":3,"file":"acaDifficultyParams.d.ts","sourceRoot":"","sources":["../../../../src/models/api/params/acaDifficultyParams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAC7D,OAAO,EACH,aAAa,EACb,kBAAkB,EAClB,aAAa,EACb,cAAc,EACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACH,gBAAgB,EAChB,KAAK,2BAA2B,EAGnC,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,iBAAiB,oBAAoB,CAAC;AACnD,eAAO,MAAM,eAAe,yBAAyB,CAAC;AACtD,eAAO,MAAM,WAAW,qBAAqB,CAAC;AAC9C,eAAO,MAAM,UAAU,oBAAoB,CAAC;AAC5C,eAAO,MAAM,UAAU,oBAAoB,CAAC;AA8C5C,qBAAa,mBAAoB,SAAQ,gBAAgB;IACrD,QAAQ,CAAC,cAAc,sBAAsB;IAE7C,QAAQ,CAAC,SAAS,EAAE,kBAAkB,EAAE,CAAC;IACzC,QAAQ,CAAC,KAAK,EAAE,cAAc,EAAE,CAAC;IACjC,QAAQ,CAAC,IAAI,EAAE,aAAa,EAAE,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,aAAa,EAAE,CAAC;gBAGpC,SAAS,EAAE,kBAAkB,EAAE,EAC/B,KAAK,EAAE,cAAc,EAAE,EACvB,IAAI,EAAE,aAAa,EAAE,EACrB,aAAa,EAAE,aAAa,EAAE;IASlC,QAAQ,IAAI,OAAO;IASnB,aAAa,IAAI,MAAM;IAwBvB,MAAM,CAAC,qBAAqB,CACxB,CAAC,EAAE,2BAA2B,GAC/B,mBAAmB;IAwBtB,OAAO,CAAC,MAAM,CAAC,cAAc;IAW7B,uFAAuF;IACvF,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,mBAAmB;IAgCpE,kEAAkE;IAClE,MAAM,CAAC,cAAc,CACjB,MAAM,EAAE,mBAAmB,GAAG,IAAI,GACnC,mBAAmB,GAAG,IAAI;CAIhC"}
1
+ {"version":3,"file":"acaDifficultyParams.d.ts","sourceRoot":"","sources":["../../../../src/models/api/params/acaDifficultyParams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAC3E,OAAO,EACH,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACpB,MAAM,gCAAgC,CAAC;AACxC,OAAO,EACH,gBAAgB,EAChB,KAAK,2BAA2B,EAGnC,MAAM,oBAAoB,CAAC;AAE5B,eAAO,MAAM,iBAAiB,oBAAoB,CAAC;AACnD,eAAO,MAAM,eAAe,yBAAyB,CAAC;AACtD,eAAO,MAAM,WAAW,qBAAqB,CAAC;AAC9C,eAAO,MAAM,UAAU,oBAAoB,CAAC;AAC5C,eAAO,MAAM,UAAU,oBAAoB,CAAC;AA8C5C,qBAAa,mBAAoB,SAAQ,gBAAgB;IACrD,QAAQ,CAAC,cAAc,8BAA8B;IAErD,QAAQ,CAAC,SAAS,EAAE,qBAAqB,EAAE,CAAC;IAC5C,QAAQ,CAAC,KAAK,EAAE,iBAAiB,EAAE,CAAC;IACpC,QAAQ,CAAC,IAAI,EAAE,gBAAgB,EAAE,CAAC;IAClC,QAAQ,CAAC,aAAa,EAAE,gBAAgB,EAAE,CAAC;gBAGvC,SAAS,EAAE,qBAAqB,EAAE,EAClC,KAAK,EAAE,iBAAiB,EAAE,EAC1B,IAAI,EAAE,gBAAgB,EAAE,EACxB,aAAa,EAAE,gBAAgB,EAAE;IASrC,QAAQ,IAAI,OAAO;IASnB,aAAa,IAAI,MAAM;IAwBvB,MAAM,CAAC,qBAAqB,CACxB,CAAC,EAAE,2BAA2B,GAC/B,mBAAmB;IAwBtB,OAAO,CAAC,MAAM,CAAC,cAAc;IAW7B,uFAAuF;IACvF,MAAM,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,mBAAmB;IAgCpE,kEAAkE;IAClE,MAAM,CAAC,cAAc,CACjB,MAAM,EAAE,mBAAmB,GAAG,IAAI,GACnC,mBAAmB,GAAG,IAAI;CAIhC"}
@@ -1,8 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AcaDifficultyParams = exports.Q_ACA_RISK = exports.Q_ACA_TIME = exports.Q_ACA_WATER = exports.Q_ACA_TECHNICAL = exports.Q_DIFFICULTY_TYPE = void 0;
4
- const difficulty_1 = require("../../difficulty/difficulty");
5
- const acaRatings_1 = require("../../difficulty/acaRatings");
4
+ const difficultyRating_1 = require("../../difficulty/difficultyRating");
5
+ const acaSubRatings_1 = require("../../difficulty/acaSubRatings");
6
6
  const difficultyParams_1 = require("./difficultyParams");
7
7
  exports.Q_DIFFICULTY_TYPE = 'difficulty-type';
8
8
  exports.Q_ACA_TECHNICAL = 'aca-technical-rating';
@@ -45,7 +45,7 @@ function acaAxisKeysPresent(q) {
45
45
  class AcaDifficultyParams extends difficultyParams_1.DifficultyParams {
46
46
  constructor(technical, water, time, effectiveRisk) {
47
47
  super();
48
- this.difficultyType = difficulty_1.DifficultyType.ACA;
48
+ this.difficultyType = difficultyRating_1.DifficultyRatingSystem.ACA;
49
49
  this.technical = [...technical];
50
50
  this.water = [...water];
51
51
  this.time = [...time];
@@ -75,10 +75,10 @@ class AcaDifficultyParams extends difficultyParams_1.DifficultyParams {
75
75
  return p.toString();
76
76
  }
77
77
  static fromQueryStringParams(q) {
78
- const technical = parseEnumTokens(q[exports.Q_ACA_TECHNICAL] ?? q['Aca-Technical-Rating'], Object.values(acaRatings_1.AcaTechnicalRating), 'aca-technical-rating');
79
- const water = parseEnumTokens(q[exports.Q_ACA_WATER] ?? q['Aca-Water-Rating'], Object.values(acaRatings_1.AcaWaterRating), 'aca-water-rating');
80
- const time = parseEnumTokens(q[exports.Q_ACA_TIME] ?? q['Aca-Time-Rating'], Object.values(acaRatings_1.AcaTimeRating), 'aca-time-rating');
81
- const effectiveRisk = parseEnumTokens(q[exports.Q_ACA_RISK] ?? q['Aca-Risk-Rating'], Object.values(acaRatings_1.AcaRiskRating), 'aca-risk-rating');
78
+ const technical = parseEnumTokens(q[exports.Q_ACA_TECHNICAL] ?? q['Aca-Technical-Rating'], Object.values(acaSubRatings_1.AcaTechnicalSubRating), 'aca-technical-rating');
79
+ const water = parseEnumTokens(q[exports.Q_ACA_WATER] ?? q['Aca-Water-Rating'], Object.values(acaSubRatings_1.AcaWaterSubRating), 'aca-water-rating');
80
+ const time = parseEnumTokens(q[exports.Q_ACA_TIME] ?? q['Aca-Time-Rating'], Object.values(acaSubRatings_1.AcaTimeSubRating), 'aca-time-rating');
81
+ const effectiveRisk = parseEnumTokens(q[exports.Q_ACA_RISK] ?? q['Aca-Risk-Rating'], Object.values(acaSubRatings_1.AcaRiskSubRating), 'aca-risk-rating');
82
82
  return new AcaDifficultyParams(technical, water, time, effectiveRisk);
83
83
  }
84
84
  static optionalString(obj, ...keys) {
@@ -91,10 +91,10 @@ class AcaDifficultyParams extends difficultyParams_1.DifficultyParams {
91
91
  }
92
92
  /** Parses JSON objects with the same key variants as {@link fromQueryStringParams}. */
93
93
  static fromResult(obj) {
94
- const technical = parseEnumTokens(AcaDifficultyParams.optionalString(obj, exports.Q_ACA_TECHNICAL, 'Aca-Technical-Rating'), Object.values(acaRatings_1.AcaTechnicalRating), 'aca-technical-rating');
95
- const water = parseEnumTokens(AcaDifficultyParams.optionalString(obj, exports.Q_ACA_WATER, 'Aca-Water-Rating'), Object.values(acaRatings_1.AcaWaterRating), 'aca-water-rating');
96
- const time = parseEnumTokens(AcaDifficultyParams.optionalString(obj, exports.Q_ACA_TIME, 'Aca-Time-Rating'), Object.values(acaRatings_1.AcaTimeRating), 'aca-time-rating');
97
- const effectiveRisk = parseEnumTokens(AcaDifficultyParams.optionalString(obj, exports.Q_ACA_RISK, 'Aca-Risk-Rating'), Object.values(acaRatings_1.AcaRiskRating), 'aca-risk-rating');
94
+ const technical = parseEnumTokens(AcaDifficultyParams.optionalString(obj, exports.Q_ACA_TECHNICAL, 'Aca-Technical-Rating'), Object.values(acaSubRatings_1.AcaTechnicalSubRating), 'aca-technical-rating');
95
+ const water = parseEnumTokens(AcaDifficultyParams.optionalString(obj, exports.Q_ACA_WATER, 'Aca-Water-Rating'), Object.values(acaSubRatings_1.AcaWaterSubRating), 'aca-water-rating');
96
+ const time = parseEnumTokens(AcaDifficultyParams.optionalString(obj, exports.Q_ACA_TIME, 'Aca-Time-Rating'), Object.values(acaSubRatings_1.AcaTimeSubRating), 'aca-time-rating');
97
+ const effectiveRisk = parseEnumTokens(AcaDifficultyParams.optionalString(obj, exports.Q_ACA_RISK, 'Aca-Risk-Rating'), Object.values(acaSubRatings_1.AcaRiskSubRating), 'aca-risk-rating');
98
98
  return new AcaDifficultyParams(technical, water, time, effectiveRisk);
99
99
  }
100
100
  /** Returns null if every axis is empty (no difficulty filter). */
@@ -105,5 +105,5 @@ class AcaDifficultyParams extends difficultyParams_1.DifficultyParams {
105
105
  }
106
106
  }
107
107
  exports.AcaDifficultyParams = AcaDifficultyParams;
108
- (0, difficultyParams_1.registerDifficultyParamsQueryInference)((q) => acaAxisKeysPresent(q) ? difficulty_1.DifficultyType.ACA : null);
109
- (0, difficultyParams_1.registerDifficultyParamsQueryParser)(difficulty_1.DifficultyType.ACA, (q) => AcaDifficultyParams.fromQueryStringParams(q));
108
+ (0, difficultyParams_1.registerDifficultyParamsQueryInference)((q) => acaAxisKeysPresent(q) ? difficultyRating_1.DifficultyRatingSystem.ACA : null);
109
+ (0, difficultyParams_1.registerDifficultyParamsQueryParser)(difficultyRating_1.DifficultyRatingSystem.ACA, (q) => AcaDifficultyParams.fromQueryStringParams(q));
@@ -1,16 +1,16 @@
1
- import { DifficultyType } from '../../difficulty/difficulty';
1
+ import { DifficultyRatingSystem } from '../../difficulty/difficultyRating';
2
2
  /** Flat query / query-like record for {@link DifficultyParams.fromQueryStringParams}. */
3
3
  export type DifficultyParamsQueryRecord = Record<string, string | undefined>;
4
4
  /**
5
- * When `difficulty-type` is absent, this hook may return a {@link DifficultyType} to parse with
5
+ * When `difficulty-type` is absent, this hook may return a {@link DifficultyRatingSystem} to parse with
6
6
  * {@link registerDifficultyParamsQueryParser} (e.g. ACA when any `aca-*-rating` key is present).
7
7
  */
8
- export declare function registerDifficultyParamsQueryInference(fn: (q: DifficultyParamsQueryRecord) => DifficultyType | null): void;
8
+ export declare function registerDifficultyParamsQueryInference(fn: (q: DifficultyParamsQueryRecord) => DifficultyRatingSystem | null): void;
9
9
  /**
10
10
  * Registers the parser for {@link DifficultyParams.fromQueryStringParams} for a given type
11
11
  * (see `registerDifficultyParamsParsers.ts`).
12
12
  */
13
- export declare function registerDifficultyParamsQueryParser(type: DifficultyType, parse: (q: DifficultyParamsQueryRecord) => DifficultyParams): void;
13
+ export declare function registerDifficultyParamsQueryParser(type: DifficultyRatingSystem, parse: (q: DifficultyParamsQueryRecord) => DifficultyParams): void;
14
14
  /**
15
15
  * Registers {@link DifficultyParams.fromResult} (see `registerDifficultyParamsParsers.ts`).
16
16
  */
@@ -19,7 +19,7 @@ export declare function registerDifficultyParamsResultParser(parse: (result: unk
19
19
  * Query serialization for GET /routes and GET /search difficulty filters.
20
20
  */
21
21
  export declare abstract class DifficultyParams {
22
- abstract readonly difficultyType: DifficultyType;
22
+ abstract readonly difficultyType: DifficultyRatingSystem;
23
23
  abstract toQueryString(): string;
24
24
  abstract isActive(): boolean;
25
25
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"difficultyParams.d.ts","sourceRoot":"","sources":["../../../../src/models/api/params/difficultyParams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,6BAA6B,CAAC;AAE7D,yFAAyF;AACzF,MAAM,MAAM,2BAA2B,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAe7E;;;GAGG;AACH,wBAAgB,sCAAsC,CAClD,EAAE,EAAE,CAAC,CAAC,EAAE,2BAA2B,KAAK,cAAc,GAAG,IAAI,GAC9D,IAAI,CAEN;AAED;;;GAGG;AACH,wBAAgB,mCAAmC,CAC/C,IAAI,EAAE,cAAc,EACpB,KAAK,EAAE,CAAC,CAAC,EAAE,2BAA2B,KAAK,gBAAgB,GAC5D,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,oCAAoC,CAChD,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,gBAAgB,GAAG,IAAI,GACpD,IAAI,CAEN;AAED;;GAEG;AACH,8BAAsB,gBAAgB;IAClC,QAAQ,CAAC,QAAQ,CAAC,cAAc,EAAE,cAAc,CAAC;IAEjD,QAAQ,CAAC,aAAa,IAAI,MAAM;IAEhC,QAAQ,CAAC,QAAQ,IAAI,OAAO;IAE5B;;;OAGG;IACH,MAAM,CAAC,qBAAqB,CACxB,CAAC,EAAE,2BAA2B,GAC/B,gBAAgB,GAAG,IAAI;IAmC1B;;;OAGG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI;IAS3D,8FAA8F;IAC9F,MAAM,CAAC,uBAAuB,CAC1B,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,gBAAgB,GAAG,IAAI,GACpC,IAAI;CAOV;AAED,wBAAgB,wBAAwB,CACpC,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,GACvC,OAAO,CAET"}
1
+ {"version":3,"file":"difficultyParams.d.ts","sourceRoot":"","sources":["../../../../src/models/api/params/difficultyParams.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AAE3E,yFAAyF;AACzF,MAAM,MAAM,2BAA2B,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,CAAC;AAe7E;;;GAGG;AACH,wBAAgB,sCAAsC,CAClD,EAAE,EAAE,CAAC,CAAC,EAAE,2BAA2B,KAAK,sBAAsB,GAAG,IAAI,GACtE,IAAI,CAEN;AAED;;;GAGG;AACH,wBAAgB,mCAAmC,CAC/C,IAAI,EAAE,sBAAsB,EAC5B,KAAK,EAAE,CAAC,CAAC,EAAE,2BAA2B,KAAK,gBAAgB,GAC5D,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,oCAAoC,CAChD,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,gBAAgB,GAAG,IAAI,GACpD,IAAI,CAEN;AAED;;GAEG;AACH,8BAAsB,gBAAgB;IAClC,QAAQ,CAAC,QAAQ,CAAC,cAAc,EAAE,sBAAsB,CAAC;IAEzD,QAAQ,CAAC,aAAa,IAAI,MAAM;IAEhC,QAAQ,CAAC,QAAQ,IAAI,OAAO;IAE5B;;;OAGG;IACH,MAAM,CAAC,qBAAqB,CACxB,CAAC,EAAE,2BAA2B,GAC/B,gBAAgB,GAAG,IAAI;IAmC1B;;;OAGG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB,GAAG,IAAI;IAS3D,8FAA8F;IAC9F,MAAM,CAAC,uBAAuB,CAC1B,MAAM,EAAE,eAAe,EACvB,UAAU,EAAE,gBAAgB,GAAG,IAAI,GACpC,IAAI;CAOV;AAED,wBAAgB,wBAAwB,CACpC,CAAC,EAAE,gBAAgB,GAAG,IAAI,GAAG,SAAS,GACvC,OAAO,CAET"}
@@ -5,12 +5,12 @@ exports.registerDifficultyParamsQueryInference = registerDifficultyParamsQueryIn
5
5
  exports.registerDifficultyParamsQueryParser = registerDifficultyParamsQueryParser;
6
6
  exports.registerDifficultyParamsResultParser = registerDifficultyParamsResultParser;
7
7
  exports.isDifficultyParamsActive = isDifficultyParamsActive;
8
- const difficulty_1 = require("../../difficulty/difficulty");
8
+ const difficultyRating_1 = require("../../difficulty/difficultyRating");
9
9
  const queryParsers = new Map();
10
10
  let queryInference;
11
11
  let parseFromResult;
12
12
  /**
13
- * When `difficulty-type` is absent, this hook may return a {@link DifficultyType} to parse with
13
+ * When `difficulty-type` is absent, this hook may return a {@link DifficultyRatingSystem} to parse with
14
14
  * {@link registerDifficultyParamsQueryParser} (e.g. ACA when any `aca-*-rating` key is present).
15
15
  */
16
16
  function registerDifficultyParamsQueryInference(fn) {
@@ -55,7 +55,7 @@ class DifficultyParams {
55
55
  return parser(q);
56
56
  }
57
57
  if (rawType === 'aca') {
58
- const parser = queryParsers.get(difficulty_1.DifficultyType.ACA);
58
+ const parser = queryParsers.get(difficultyRating_1.DifficultyRatingSystem.ACA);
59
59
  if (parser === undefined) {
60
60
  throw new Error('No difficulty params query parser registered for difficultyType ACA');
61
61
  }
@@ -0,0 +1,31 @@
1
+ import { DifficultyRating, DifficultyRatingSystem } from './difficultyRating';
2
+ import { AcaRiskSubRating, AcaTechnicalSubRating, AcaTimeSubRating, AcaWaterSubRating } from './acaSubRatings';
3
+ /**
4
+ * ACA canyon difficulty rating from DB strings. `additionalRisk` is the raw stored value
5
+ * (`riskRating` column); `effectiveRisk` applies the technical default floor when `additionalRisk`
6
+ * is null or milder than that default.
7
+ */
8
+ export declare class AcaDifficultyRating extends DifficultyRating {
9
+ readonly difficultyRatingSystem = DifficultyRatingSystem.ACA;
10
+ readonly technical: AcaTechnicalSubRating | null;
11
+ readonly water: AcaWaterSubRating | null;
12
+ readonly time: AcaTimeSubRating | null;
13
+ /** Raw additional risk from ropewiki (`riskRating` column), after enum parse; null if unset. */
14
+ readonly additionalRisk: AcaRiskSubRating | null;
15
+ /** Risk used for display and sorting (never milder than the default implied by technical). */
16
+ readonly effectiveRisk: AcaRiskSubRating | null;
17
+ constructor(technicalRating: string | null | undefined, waterRating: string | null | undefined, timeRating: string | null | undefined, additionalRiskRating: string | null | undefined);
18
+ getEffectiveRiskForDisplay(): AcaRiskSubRating | null;
19
+ private static assignParts;
20
+ private static defaultRiskFromTechnical;
21
+ private static computeEffectiveRisk;
22
+ private static parseField;
23
+ /**
24
+ * Parses JSON/API objects: `difficultyRatingSystem: 'ACA'` (optional when dispatched via
25
+ * {@link DifficultyRating.fromResult}), `technical`, `water`, `time`, `additionalRisk` (raw),
26
+ * optional `effectiveRisk` override. Legacy `difficultyType` is accepted.
27
+ */
28
+ static fromResult(result: unknown): AcaDifficultyRating;
29
+ private static coerceOptionalString;
30
+ }
31
+ //# sourceMappingURL=acaDifficultyRating.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acaDifficultyRating.d.ts","sourceRoot":"","sources":["../../../src/models/difficulty/acaDifficultyRating.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,gBAAgB,EAChB,sBAAsB,EAEzB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAEH,gBAAgB,EAChB,qBAAqB,EACrB,gBAAgB,EAChB,iBAAiB,EACpB,MAAM,iBAAiB,CAAC;AAUzB;;;;GAIG;AACH,qBAAa,mBAAoB,SAAQ,gBAAgB;IACrD,QAAQ,CAAC,sBAAsB,8BAA8B;IAE7D,QAAQ,CAAC,SAAS,EAAG,qBAAqB,GAAG,IAAI,CAAC;IAClD,QAAQ,CAAC,KAAK,EAAG,iBAAiB,GAAG,IAAI,CAAC;IAC1C,QAAQ,CAAC,IAAI,EAAG,gBAAgB,GAAG,IAAI,CAAC;IACxC,gGAAgG;IAChG,QAAQ,CAAC,cAAc,EAAG,gBAAgB,GAAG,IAAI,CAAC;IAClD,8FAA8F;IAC9F,QAAQ,CAAC,aAAa,EAAG,gBAAgB,GAAG,IAAI,CAAC;gBAG7C,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC1C,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACtC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACrC,oBAAoB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAoCnD,0BAA0B,IAAI,gBAAgB,GAAG,IAAI;IAIrD,OAAO,CAAC,MAAM,CAAC,WAAW;IAa1B,OAAO,CAAC,MAAM,CAAC,wBAAwB;IAcvC,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAcnC,OAAO,CAAC,MAAM,CAAC,UAAU;IAezB;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,mBAAmB;IA6CvD,OAAO,CAAC,MAAM,CAAC,oBAAoB;CAOtC"}
@@ -0,0 +1,113 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AcaDifficultyRating = void 0;
4
+ const difficultyRating_1 = require("./difficultyRating");
5
+ const acaSubRatings_1 = require("./acaSubRatings");
6
+ /**
7
+ * ACA canyon difficulty rating from DB strings. `additionalRisk` is the raw stored value
8
+ * (`riskRating` column); `effectiveRisk` applies the technical default floor when `additionalRisk`
9
+ * is null or milder than that default.
10
+ */
11
+ class AcaDifficultyRating extends difficultyRating_1.DifficultyRating {
12
+ constructor(technicalRating, waterRating, timeRating, additionalRiskRating) {
13
+ super();
14
+ this.difficultyRatingSystem = difficultyRating_1.DifficultyRatingSystem.ACA;
15
+ const technical = AcaDifficultyRating.parseField(technicalRating, Object.values(acaSubRatings_1.AcaTechnicalSubRating), 'technical');
16
+ const water = AcaDifficultyRating.parseField(waterRating, Object.values(acaSubRatings_1.AcaWaterSubRating), 'water');
17
+ const time = AcaDifficultyRating.parseField(timeRating, Object.values(acaSubRatings_1.AcaTimeSubRating), 'time');
18
+ const parsedAdditionalRisk = AcaDifficultyRating.parseField(additionalRiskRating, Object.values(acaSubRatings_1.AcaRiskSubRating), 'additionalRisk');
19
+ const parts = {
20
+ technical,
21
+ water,
22
+ time,
23
+ additionalRisk: parsedAdditionalRisk,
24
+ effectiveRisk: AcaDifficultyRating.computeEffectiveRisk(parsedAdditionalRisk, technical),
25
+ };
26
+ AcaDifficultyRating.assignParts(this, parts);
27
+ }
28
+ getEffectiveRiskForDisplay() {
29
+ return this.effectiveRisk;
30
+ }
31
+ static assignParts(target, parts) {
32
+ target.technical = parts.technical;
33
+ target.water = parts.water;
34
+ target.time = parts.time;
35
+ target.additionalRisk =
36
+ parts.additionalRisk;
37
+ target.effectiveRisk =
38
+ parts.effectiveRisk;
39
+ }
40
+ static defaultRiskFromTechnical(technical) {
41
+ if (technical === acaSubRatings_1.AcaTechnicalSubRating.One)
42
+ return acaSubRatings_1.AcaRiskSubRating.G;
43
+ if (technical === acaSubRatings_1.AcaTechnicalSubRating.Two)
44
+ return acaSubRatings_1.AcaRiskSubRating.PG;
45
+ if (technical === acaSubRatings_1.AcaTechnicalSubRating.Three ||
46
+ technical === acaSubRatings_1.AcaTechnicalSubRating.Four) {
47
+ return acaSubRatings_1.AcaRiskSubRating.PG13;
48
+ }
49
+ return null;
50
+ }
51
+ static computeEffectiveRisk(additionalRisk, technical) {
52
+ const defaultRisk = AcaDifficultyRating.defaultRiskFromTechnical(technical);
53
+ if (additionalRisk != null) {
54
+ return defaultRisk != null &&
55
+ acaSubRatings_1.ACA_RISK_ORDER[additionalRisk] < acaSubRatings_1.ACA_RISK_ORDER[defaultRisk]
56
+ ? defaultRisk
57
+ : additionalRisk;
58
+ }
59
+ return defaultRisk;
60
+ }
61
+ static parseField(value, allowed, fieldName) {
62
+ if (value == null || value === '')
63
+ return null;
64
+ const trimmed = value.trim();
65
+ if (!allowed.includes(trimmed)) {
66
+ throw new Error(`Invalid difficulty ${fieldName}: "${value}" is not one of [${allowed.join(', ')}]`);
67
+ }
68
+ return trimmed;
69
+ }
70
+ /**
71
+ * Parses JSON/API objects: `difficultyRatingSystem: 'ACA'` (optional when dispatched via
72
+ * {@link DifficultyRating.fromResult}), `technical`, `water`, `time`, `additionalRisk` (raw),
73
+ * optional `effectiveRisk` override. Legacy `difficultyType` is accepted.
74
+ */
75
+ static fromResult(result) {
76
+ if (result == null || typeof result !== 'object') {
77
+ throw new Error('AcaDifficultyRating result must be an object');
78
+ }
79
+ const r = result;
80
+ const dtype = r.difficultyRatingSystem ??
81
+ r.DifficultyRatingSystem ??
82
+ r.difficultyType ??
83
+ r.DifficultyType;
84
+ if (dtype !== undefined &&
85
+ dtype !== null &&
86
+ typeof dtype === 'string' &&
87
+ dtype.toUpperCase() !== difficultyRating_1.DifficultyRatingSystem.ACA) {
88
+ throw new Error(`Unsupported difficultyRatingSystem for AcaDifficultyRating.fromResult: ${JSON.stringify(dtype)}`);
89
+ }
90
+ const tech = AcaDifficultyRating.coerceOptionalString(r.technical ?? r.Technical);
91
+ const water = AcaDifficultyRating.coerceOptionalString(r.water ?? r.Water);
92
+ const time = AcaDifficultyRating.coerceOptionalString(r.time ?? r.Time);
93
+ const additionalRiskRaw = AcaDifficultyRating.coerceOptionalString(r.additionalRisk ?? r.AdditionalRisk);
94
+ const effectiveRaw = AcaDifficultyRating.coerceOptionalString(r.effectiveRisk ?? r.EffectiveRisk);
95
+ if (effectiveRaw !== null) {
96
+ const inst = new AcaDifficultyRating(tech, water, time, additionalRiskRaw);
97
+ const effParsed = AcaDifficultyRating.parseField(effectiveRaw, Object.values(acaSubRatings_1.AcaRiskSubRating), 'effectiveRisk');
98
+ inst.effectiveRisk = effParsed;
99
+ return inst;
100
+ }
101
+ return new AcaDifficultyRating(tech, water, time, additionalRiskRaw);
102
+ }
103
+ static coerceOptionalString(v) {
104
+ if (v === undefined || v === null || v === '')
105
+ return null;
106
+ if (typeof v !== 'string') {
107
+ throw new Error('AcaDifficultyRating field must be string or null');
108
+ }
109
+ return v;
110
+ }
111
+ }
112
+ exports.AcaDifficultyRating = AcaDifficultyRating;
113
+ (0, difficultyRating_1.registerDifficultyParser)(difficultyRating_1.DifficultyRatingSystem.ACA, (v) => AcaDifficultyRating.fromResult(v));
@@ -1,12 +1,12 @@
1
1
  /** ACA technical rating: 1–4 */
2
- export declare enum AcaTechnicalRating {
2
+ export declare enum AcaTechnicalSubRating {
3
3
  One = "1",
4
4
  Two = "2",
5
5
  Three = "3",
6
6
  Four = "4"
7
7
  }
8
8
  /** ACA water rating: A, B, C, or C1–C4 */
9
- export declare enum AcaWaterRating {
9
+ export declare enum AcaWaterSubRating {
10
10
  A = "A",
11
11
  B = "B",
12
12
  C = "C",
@@ -16,7 +16,7 @@ export declare enum AcaWaterRating {
16
16
  C4 = "C4"
17
17
  }
18
18
  /** ACA time rating: I–VI */
19
- export declare enum AcaTimeRating {
19
+ export declare enum AcaTimeSubRating {
20
20
  I = "I",
21
21
  II = "II",
22
22
  III = "III",
@@ -25,7 +25,7 @@ export declare enum AcaTimeRating {
25
25
  VI = "VI"
26
26
  }
27
27
  /** ACA risk rating */
28
- export declare enum AcaRiskRating {
28
+ export declare enum AcaRiskSubRating {
29
29
  G = "G",
30
30
  PG = "PG",
31
31
  PG13 = "PG13",
@@ -34,12 +34,12 @@ export declare enum AcaRiskRating {
34
34
  XX = "XX"
35
35
  }
36
36
  /** Total order for technical (lower index = easier). */
37
- export declare const ACA_TECHNICAL_ORDER: Record<AcaTechnicalRating, number>;
37
+ export declare const ACA_TECHNICAL_ORDER: Record<AcaTechnicalSubRating, number>;
38
38
  /** Total order for water: A < B < C < C1 < C2 < C3 < C4 */
39
- export declare const ACA_WATER_ORDER: Record<AcaWaterRating, number>;
40
- export declare const ACA_TIME_ORDER: Record<AcaTimeRating, number>;
39
+ export declare const ACA_WATER_ORDER: Record<AcaWaterSubRating, number>;
40
+ export declare const ACA_TIME_ORDER: Record<AcaTimeSubRating, number>;
41
41
  /** Lower index = milder risk */
42
- export declare const ACA_RISK_ORDER: Record<AcaRiskRating, number>;
42
+ export declare const ACA_RISK_ORDER: Record<AcaRiskSubRating, number>;
43
43
  /** @deprecated Use ACA_RISK_ORDER */
44
- export declare const RISK_ORDER: Record<AcaRiskRating, number>;
45
- //# sourceMappingURL=acaRatings.d.ts.map
44
+ export declare const RISK_ORDER: Record<AcaRiskSubRating, number>;
45
+ //# sourceMappingURL=acaSubRatings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"acaSubRatings.d.ts","sourceRoot":"","sources":["../../../src/models/difficulty/acaSubRatings.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,oBAAY,qBAAqB;IAC7B,GAAG,MAAM;IACT,GAAG,MAAM;IACT,KAAK,MAAM;IACX,IAAI,MAAM;CACb;AAED,0CAA0C;AAC1C,oBAAY,iBAAiB;IACzB,CAAC,MAAM;IACP,CAAC,MAAM;IACP,CAAC,MAAM;IACP,EAAE,OAAO;IACT,EAAE,OAAO;IACT,EAAE,OAAO;IACT,EAAE,OAAO;CACZ;AAED,4BAA4B;AAC5B,oBAAY,gBAAgB;IACxB,CAAC,MAAM;IACP,EAAE,OAAO;IACT,GAAG,QAAQ;IACX,EAAE,OAAO;IACT,CAAC,MAAM;IACP,EAAE,OAAO;CACZ;AAED,sBAAsB;AACtB,oBAAY,gBAAgB;IACxB,CAAC,MAAM;IACP,EAAE,OAAO;IACT,IAAI,SAAS;IACb,CAAC,MAAM;IACP,CAAC,MAAM;IACP,EAAE,OAAO;CACZ;AAED,wDAAwD;AACxD,eAAO,MAAM,mBAAmB,EAAE,MAAM,CAAC,qBAAqB,EAAE,MAAM,CAKrE,CAAC;AAEF,2DAA2D;AAC3D,eAAO,MAAM,eAAe,EAAE,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAQ7D,CAAC;AAEF,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAO3D,CAAC;AAEF,gCAAgC;AAChC,eAAO,MAAM,cAAc,EAAE,MAAM,CAAC,gBAAgB,EAAE,MAAM,CAO3D,CAAC;AAEF,qCAAqC;AACrC,eAAO,MAAM,UAAU,kCAAiB,CAAC"}
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.RISK_ORDER = exports.ACA_RISK_ORDER = exports.ACA_TIME_ORDER = exports.ACA_WATER_ORDER = exports.ACA_TECHNICAL_ORDER = exports.AcaRiskSubRating = exports.AcaTimeSubRating = exports.AcaWaterSubRating = exports.AcaTechnicalSubRating = void 0;
4
+ /** ACA technical rating: 1–4 */
5
+ var AcaTechnicalSubRating;
6
+ (function (AcaTechnicalSubRating) {
7
+ AcaTechnicalSubRating["One"] = "1";
8
+ AcaTechnicalSubRating["Two"] = "2";
9
+ AcaTechnicalSubRating["Three"] = "3";
10
+ AcaTechnicalSubRating["Four"] = "4";
11
+ })(AcaTechnicalSubRating || (exports.AcaTechnicalSubRating = AcaTechnicalSubRating = {}));
12
+ /** ACA water rating: A, B, C, or C1–C4 */
13
+ var AcaWaterSubRating;
14
+ (function (AcaWaterSubRating) {
15
+ AcaWaterSubRating["A"] = "A";
16
+ AcaWaterSubRating["B"] = "B";
17
+ AcaWaterSubRating["C"] = "C";
18
+ AcaWaterSubRating["C1"] = "C1";
19
+ AcaWaterSubRating["C2"] = "C2";
20
+ AcaWaterSubRating["C3"] = "C3";
21
+ AcaWaterSubRating["C4"] = "C4";
22
+ })(AcaWaterSubRating || (exports.AcaWaterSubRating = AcaWaterSubRating = {}));
23
+ /** ACA time rating: I–VI */
24
+ var AcaTimeSubRating;
25
+ (function (AcaTimeSubRating) {
26
+ AcaTimeSubRating["I"] = "I";
27
+ AcaTimeSubRating["II"] = "II";
28
+ AcaTimeSubRating["III"] = "III";
29
+ AcaTimeSubRating["IV"] = "IV";
30
+ AcaTimeSubRating["V"] = "V";
31
+ AcaTimeSubRating["VI"] = "VI";
32
+ })(AcaTimeSubRating || (exports.AcaTimeSubRating = AcaTimeSubRating = {}));
33
+ /** ACA risk rating */
34
+ var AcaRiskSubRating;
35
+ (function (AcaRiskSubRating) {
36
+ AcaRiskSubRating["G"] = "G";
37
+ AcaRiskSubRating["PG"] = "PG";
38
+ AcaRiskSubRating["PG13"] = "PG13";
39
+ AcaRiskSubRating["R"] = "R";
40
+ AcaRiskSubRating["X"] = "X";
41
+ AcaRiskSubRating["XX"] = "XX";
42
+ })(AcaRiskSubRating || (exports.AcaRiskSubRating = AcaRiskSubRating = {}));
43
+ /** Total order for technical (lower index = easier). */
44
+ exports.ACA_TECHNICAL_ORDER = {
45
+ [AcaTechnicalSubRating.One]: 0,
46
+ [AcaTechnicalSubRating.Two]: 1,
47
+ [AcaTechnicalSubRating.Three]: 2,
48
+ [AcaTechnicalSubRating.Four]: 3,
49
+ };
50
+ /** Total order for water: A < B < C < C1 < C2 < C3 < C4 */
51
+ exports.ACA_WATER_ORDER = {
52
+ [AcaWaterSubRating.A]: 0,
53
+ [AcaWaterSubRating.B]: 1,
54
+ [AcaWaterSubRating.C]: 2,
55
+ [AcaWaterSubRating.C1]: 3,
56
+ [AcaWaterSubRating.C2]: 4,
57
+ [AcaWaterSubRating.C3]: 5,
58
+ [AcaWaterSubRating.C4]: 6,
59
+ };
60
+ exports.ACA_TIME_ORDER = {
61
+ [AcaTimeSubRating.I]: 0,
62
+ [AcaTimeSubRating.II]: 1,
63
+ [AcaTimeSubRating.III]: 2,
64
+ [AcaTimeSubRating.IV]: 3,
65
+ [AcaTimeSubRating.V]: 4,
66
+ [AcaTimeSubRating.VI]: 5,
67
+ };
68
+ /** Lower index = milder risk */
69
+ exports.ACA_RISK_ORDER = {
70
+ [AcaRiskSubRating.G]: 0,
71
+ [AcaRiskSubRating.PG]: 1,
72
+ [AcaRiskSubRating.PG13]: 2,
73
+ [AcaRiskSubRating.R]: 3,
74
+ [AcaRiskSubRating.X]: 4,
75
+ [AcaRiskSubRating.XX]: 5,
76
+ };
77
+ /** @deprecated Use ACA_RISK_ORDER */
78
+ exports.RISK_ORDER = exports.ACA_RISK_ORDER;
@@ -0,0 +1,29 @@
1
+ import type { AcaRiskSubRating } from './acaSubRatings';
2
+ /** Discriminator for page/route difficulty rating scales (extensible). */
3
+ export declare enum DifficultyRatingSystem {
4
+ ACA = "ACA"
5
+ }
6
+ /**
7
+ * Registers the parser for {@link DifficultyRating.fromResult} for a given
8
+ * {@link DifficultyRatingSystem}. Call once per scale from the corresponding module at load time
9
+ * (see `registerDifficultyRatingParsers.ts`).
10
+ */
11
+ export declare function registerDifficultyParser(type: DifficultyRatingSystem, parse: (result: unknown) => DifficultyRating): void;
12
+ /**
13
+ * Base difficulty rating type for page previews and full page views.
14
+ * Concrete scales extend this (e.g. {@link AcaDifficultyRating}).
15
+ */
16
+ export declare abstract class DifficultyRating {
17
+ abstract readonly difficultyRatingSystem: DifficultyRatingSystem;
18
+ /** Risk level for display (e.g. effective ACA risk). Non-ACA scales may return null. */
19
+ abstract getEffectiveRiskForDisplay(): AcaRiskSubRating | null;
20
+ /**
21
+ * Parses a difficulty rating object from API/JSON. Dispatches on `difficultyRatingSystem`
22
+ * (or legacy `difficultyType`, case-insensitive); a missing discriminator defaults to
23
+ * {@link DifficultyRatingSystem.ACA}.
24
+ */
25
+ static fromResult(result: unknown): DifficultyRating;
26
+ }
27
+ /** Reads nested difficulty rating JSON from legacy or current property names. */
28
+ export declare function resolveDifficultyRatingFromRecord(r: Record<string, unknown>): unknown;
29
+ //# sourceMappingURL=difficultyRating.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"difficultyRating.d.ts","sourceRoot":"","sources":["../../../src/models/difficulty/difficultyRating.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAExD,0EAA0E;AAC1E,oBAAY,sBAAsB;IAC9B,GAAG,QAAQ;CACd;AAOD;;;;GAIG;AACH,wBAAgB,wBAAwB,CACpC,IAAI,EAAE,sBAAsB,EAC5B,KAAK,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,gBAAgB,GAC7C,IAAI,CAEN;AAED;;;GAGG;AACH,8BAAsB,gBAAgB;IAClC,QAAQ,CAAC,QAAQ,CAAC,sBAAsB,EAAE,sBAAsB,CAAC;IAEjE,wFAAwF;IACxF,QAAQ,CAAC,0BAA0B,IAAI,gBAAgB,GAAG,IAAI;IAE9D;;;;OAIG;IACH,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,GAAG,gBAAgB;CAqCvD;AAED,iFAAiF;AACjF,wBAAgB,iCAAiC,CAC7C,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC3B,OAAO,CAET"}