ropegeo-common 1.0.11 → 1.0.13

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.
@@ -39,7 +39,7 @@ export declare class PagePreview {
39
39
  title: string;
40
40
  /** Region names (not ids) */
41
41
  regions: string[];
42
- /** Difficulty ratings (technical, water, time, risk); always present. risk is set to effective risk when built via fromDbRow. */
42
+ /** Difficulty ratings (technical, water, time, risk); always present. risk is the effective risk (derived from technical when not set). */
43
43
  difficulty: Difficulty;
44
44
  /** Map data id for the page route, or null if none */
45
45
  mapData: string | null;
@@ -50,12 +50,8 @@ export declare class PagePreview {
50
50
  constructor(id: string, source: PageDataSource, imageUrl: string | null, rating: number | null, ratingCount: number | null, title: string, regions: string[], difficulty: Difficulty, mapData: string | null, externalLink: string | null, permit: PermitStatus | null);
51
51
  /**
52
52
  * Builds a PagePreview from a getRopewikiPagePreview query row.
53
- * Sets difficulty.risk to the effective risk (derived from technical when risk is not set).
54
53
  */
55
54
  static fromDbRow(row: GetRopewikiPagePreviewRow, mapData: string | null, regions?: string[]): PagePreview;
56
55
  private static parsePermit;
57
- private static readonly RISK_ORDER;
58
- private static getDefaultRisk;
59
- private static getEffectiveRisk;
60
56
  }
61
57
  //# sourceMappingURL=pagePreview.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"pagePreview.d.ts","sourceRoot":"","sources":["../../../../src/types/api/getRoutePreview/pagePreview.ts"],"names":[],"mappings":"AAAA,OAAO,EACH,UAAU,EAGb,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;GAGG;AACH,qBAAa,WAAW;IACpB,6CAA6C;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,yCAAyC;IACzC,MAAM,EAAE,cAAc,CAAC;IACvB,wEAAwE;IACxE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,iDAAiD;IACjD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,oDAAoD;IACpD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,iIAAiI;IACjI,UAAU,EAAE,UAAU,CAAC;IACvB,sDAAsD;IACtD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,yDAAyD;IACzD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,0DAA0D;IAC1D,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;gBAGxB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EAAE,EACjB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,MAAM,EAAE,YAAY,GAAG,IAAI;IAe/B;;;OAGG;IACH,MAAM,CAAC,SAAS,CACZ,GAAG,EAAE,yBAAyB,EAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,OAAO,CAAC,EAAE,MAAM,EAAE,GACnB,WAAW;IAuBd,OAAO,CAAC,MAAM,CAAC,WAAW;IAM1B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,UAAU,CAOhC;IAEF,OAAO,CAAC,MAAM,CAAC,cAAc;IAS7B,OAAO,CAAC,MAAM,CAAC,gBAAgB;CAUlC"}
1
+ {"version":3,"file":"pagePreview.d.ts","sourceRoot":"","sources":["../../../../src/types/api/getRoutePreview/pagePreview.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD;;;GAGG;AACH,MAAM,WAAW,yBAAyB;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACnB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED;;;GAGG;AACH,qBAAa,WAAW;IACpB,6CAA6C;IAC7C,EAAE,EAAE,MAAM,CAAC;IACX,yCAAyC;IACzC,MAAM,EAAE,cAAc,CAAC;IACvB,wEAAwE;IACxE,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACxB,iDAAiD;IACjD,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,oDAAoD;IACpD,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,oBAAoB;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,6BAA6B;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,2IAA2I;IAC3I,UAAU,EAAE,UAAU,CAAC;IACvB,sDAAsD;IACtD,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,yDAAyD;IACzD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,0DAA0D;IAC1D,MAAM,EAAE,YAAY,GAAG,IAAI,CAAC;gBAGxB,EAAE,EAAE,MAAM,EACV,MAAM,EAAE,cAAc,EACtB,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,MAAM,EAAE,MAAM,GAAG,IAAI,EACrB,WAAW,EAAE,MAAM,GAAG,IAAI,EAC1B,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,MAAM,EAAE,EACjB,UAAU,EAAE,UAAU,EACtB,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,YAAY,EAAE,MAAM,GAAG,IAAI,EAC3B,MAAM,EAAE,YAAY,GAAG,IAAI;IAe/B;;OAEG;IACH,MAAM,CAAC,SAAS,CACZ,GAAG,EAAE,yBAAyB,EAC9B,OAAO,EAAE,MAAM,GAAG,IAAI,EACtB,OAAO,CAAC,EAAE,MAAM,EAAE,GACnB,WAAW;IAsBd,OAAO,CAAC,MAAM,CAAC,WAAW;CAK7B"}
@@ -24,11 +24,9 @@ class PagePreview {
24
24
  }
25
25
  /**
26
26
  * Builds a PagePreview from a getRopewikiPagePreview query row.
27
- * Sets difficulty.risk to the effective risk (derived from technical when risk is not set).
28
27
  */
29
28
  static fromDbRow(row, mapData, regions) {
30
29
  const difficulty = new difficulty_1.Difficulty(row.technicalRating, row.waterRating, row.timeRating, row.riskRating);
31
- difficulty.risk = PagePreview.getEffectiveRisk(difficulty);
32
30
  return new PagePreview(row.pageId, pageDataSource_1.PageDataSource.Ropewiki, row.bannerFileUrl ?? null, row.quality != null ? Number(row.quality) : null, row.userVotes ?? null, row.title, regions ?? [row.regionName], difficulty, mapData, row.url ?? null, PagePreview.parsePermit(row.permits));
33
31
  }
34
32
  static parsePermit(value) {
@@ -37,33 +35,5 @@ class PagePreview {
37
35
  const trimmed = value.trim();
38
36
  return Object.values(permitStatus_1.PermitStatus).includes(trimmed) ? trimmed : null;
39
37
  }
40
- static getDefaultRisk(difficulty) {
41
- if (difficulty.technical === difficulty_1.DifficultyTechnical.One)
42
- return difficulty_1.DifficultyRisk.G;
43
- if (difficulty.technical === difficulty_1.DifficultyTechnical.Two)
44
- return difficulty_1.DifficultyRisk.PG;
45
- if (difficulty.technical === difficulty_1.DifficultyTechnical.Three || difficulty.technical === difficulty_1.DifficultyTechnical.Four) {
46
- return difficulty_1.DifficultyRisk.PG13;
47
- }
48
- return null;
49
- }
50
- static getEffectiveRisk(difficulty) {
51
- const defaultRisk = PagePreview.getDefaultRisk(difficulty);
52
- if (difficulty.risk != null) {
53
- return defaultRisk != null &&
54
- PagePreview.RISK_ORDER[difficulty.risk] < PagePreview.RISK_ORDER[defaultRisk]
55
- ? defaultRisk
56
- : difficulty.risk;
57
- }
58
- return defaultRisk;
59
- }
60
38
  }
61
39
  exports.PagePreview = PagePreview;
62
- PagePreview.RISK_ORDER = {
63
- [difficulty_1.DifficultyRisk.G]: 0,
64
- [difficulty_1.DifficultyRisk.PG]: 1,
65
- [difficulty_1.DifficultyRisk.PG13]: 2,
66
- [difficulty_1.DifficultyRisk.R]: 3,
67
- [difficulty_1.DifficultyRisk.X]: 4,
68
- [difficulty_1.DifficultyRisk.XX]: 5,
69
- };
@@ -36,6 +36,7 @@ export declare enum DifficultyRisk {
36
36
  /**
37
37
  * Difficulty ratings for a page (e.g. Ropewiki technical, water, time, risk).
38
38
  * Each property is nullable; the object is always present on PagePreview.
39
+ * risk is set to the effective risk (derived from technical when risk is not set).
39
40
  * Throws if a non-empty rating string is not one of the allowed enum values.
40
41
  */
41
42
  export declare class Difficulty {
@@ -44,6 +45,8 @@ export declare class Difficulty {
44
45
  time: DifficultyTime | null;
45
46
  risk: DifficultyRisk | null;
46
47
  constructor(technicalRating: string | null | undefined, waterRating: string | null | undefined, timeRating: string | null | undefined, riskRating: string | null | undefined);
48
+ private getDefaultRisk;
49
+ private getEffectiveRisk;
47
50
  private static parseDifficultyField;
48
51
  }
49
52
  //# sourceMappingURL=difficulty.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"difficulty.d.ts","sourceRoot":"","sources":["../../src/types/difficulty.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,oBAAY,mBAAmB;IAC3B,GAAG,MAAM;IACT,GAAG,MAAM;IACT,KAAK,MAAM;IACX,IAAI,MAAM;CACb;AAED,0CAA0C;AAC1C,oBAAY,eAAe;IACvB,CAAC,MAAM;IACP,CAAC,MAAM;IACP,CAAC,MAAM;IACP,EAAE,OAAO;IACT,EAAE,OAAO;IACT,EAAE,OAAO;IACT,EAAE,OAAO;CACZ;AAED,6CAA6C;AAC7C,oBAAY,cAAc;IACtB,CAAC,MAAM;IACP,EAAE,OAAO;IACT,GAAG,QAAQ;IACX,EAAE,OAAO;IACT,CAAC,MAAM;IACP,EAAE,OAAO;CACZ;AAED,yCAAyC;AACzC,oBAAY,cAAc;IACtB,CAAC,MAAM;IACP,EAAE,OAAO;IACT,IAAI,SAAS;IACb,CAAC,MAAM;IACP,CAAC,MAAM;IACP,EAAE,OAAO;CACZ;AAED;;;;GAIG;AACH,qBAAa,UAAU;IACnB,SAAS,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACtC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IAC9B,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;gBAGxB,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC1C,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACtC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACrC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAwBzC,OAAO,CAAC,MAAM,CAAC,oBAAoB;CActC"}
1
+ {"version":3,"file":"difficulty.d.ts","sourceRoot":"","sources":["../../src/types/difficulty.ts"],"names":[],"mappings":"AAAA,gCAAgC;AAChC,oBAAY,mBAAmB;IAC3B,GAAG,MAAM;IACT,GAAG,MAAM;IACT,KAAK,MAAM;IACX,IAAI,MAAM;CACb;AAED,0CAA0C;AAC1C,oBAAY,eAAe;IACvB,CAAC,MAAM;IACP,CAAC,MAAM;IACP,CAAC,MAAM;IACP,EAAE,OAAO;IACT,EAAE,OAAO;IACT,EAAE,OAAO;IACT,EAAE,OAAO;CACZ;AAED,6CAA6C;AAC7C,oBAAY,cAAc;IACtB,CAAC,MAAM;IACP,EAAE,OAAO;IACT,GAAG,QAAQ;IACX,EAAE,OAAO;IACT,CAAC,MAAM;IACP,EAAE,OAAO;CACZ;AAED,yCAAyC;AACzC,oBAAY,cAAc;IACtB,CAAC,MAAM;IACP,EAAE,OAAO;IACT,IAAI,SAAS;IACb,CAAC,MAAM;IACP,CAAC,MAAM;IACP,EAAE,OAAO;CACZ;AAYD;;;;;GAKG;AACH,qBAAa,UAAU;IACnB,SAAS,EAAE,mBAAmB,GAAG,IAAI,CAAC;IACtC,KAAK,EAAE,eAAe,GAAG,IAAI,CAAC;IAC9B,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;IAC5B,IAAI,EAAE,cAAc,GAAG,IAAI,CAAC;gBAGxB,eAAe,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EAC1C,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACtC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,EACrC,UAAU,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS;IAyBzC,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,gBAAgB;IAUxB,OAAO,CAAC,MAAM,CAAC,oBAAoB;CActC"}
@@ -40,9 +40,19 @@ var DifficultyRisk;
40
40
  DifficultyRisk["X"] = "X";
41
41
  DifficultyRisk["XX"] = "XX";
42
42
  })(DifficultyRisk || (exports.DifficultyRisk = DifficultyRisk = {}));
43
+ /** Order of risk levels for effective-risk comparison (lower index = milder). */
44
+ const RISK_ORDER = {
45
+ [DifficultyRisk.G]: 0,
46
+ [DifficultyRisk.PG]: 1,
47
+ [DifficultyRisk.PG13]: 2,
48
+ [DifficultyRisk.R]: 3,
49
+ [DifficultyRisk.X]: 4,
50
+ [DifficultyRisk.XX]: 5,
51
+ };
43
52
  /**
44
53
  * Difficulty ratings for a page (e.g. Ropewiki technical, water, time, risk).
45
54
  * Each property is nullable; the object is always present on PagePreview.
55
+ * risk is set to the effective risk (derived from technical when risk is not set).
46
56
  * Throws if a non-empty rating string is not one of the allowed enum values.
47
57
  */
48
58
  class Difficulty {
@@ -50,7 +60,27 @@ class Difficulty {
50
60
  this.technical = Difficulty.parseDifficultyField(technicalRating, Object.values(DifficultyTechnical), 'technical');
51
61
  this.water = Difficulty.parseDifficultyField(waterRating, Object.values(DifficultyWater), 'water');
52
62
  this.time = Difficulty.parseDifficultyField(timeRating, Object.values(DifficultyTime), 'time');
53
- this.risk = Difficulty.parseDifficultyField(riskRating, Object.values(DifficultyRisk), 'risk');
63
+ const parsedRisk = Difficulty.parseDifficultyField(riskRating, Object.values(DifficultyRisk), 'risk');
64
+ this.risk = this.getEffectiveRisk(parsedRisk);
65
+ }
66
+ getDefaultRisk() {
67
+ if (this.technical === DifficultyTechnical.One)
68
+ return DifficultyRisk.G;
69
+ if (this.technical === DifficultyTechnical.Two)
70
+ return DifficultyRisk.PG;
71
+ if (this.technical === DifficultyTechnical.Three || this.technical === DifficultyTechnical.Four) {
72
+ return DifficultyRisk.PG13;
73
+ }
74
+ return null;
75
+ }
76
+ getEffectiveRisk(rawRisk) {
77
+ const defaultRisk = this.getDefaultRisk();
78
+ if (rawRisk != null) {
79
+ return defaultRisk != null && RISK_ORDER[rawRisk] < RISK_ORDER[defaultRisk]
80
+ ? defaultRisk
81
+ : rawRisk;
82
+ }
83
+ return defaultRisk;
54
84
  }
55
85
  static parseDifficultyField(value, allowed, fieldName) {
56
86
  if (value == null || value === '')
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ropegeo-common",
3
- "version": "1.0.11",
3
+ "version": "1.0.13",
4
4
  "description": "Shared types and utilities for RopeGeo and WebScraper",
5
5
  "license": "ISC",
6
6
  "repository": {
@@ -12,9 +12,12 @@
12
12
  "types": "dist/index.d.ts",
13
13
  "scripts": {
14
14
  "build": "tsc",
15
- "test": "echo \"Error: no test specified\" && exit 1"
15
+ "test": "jest -i --no-watchman"
16
16
  },
17
17
  "devDependencies": {
18
+ "@types/jest": "^29.5.14",
19
+ "jest": "^30.2.0",
20
+ "ts-jest": "^29.2.5",
18
21
  "typescript": "^5.9.3"
19
22
  },
20
23
  "files": [