Compare commits
13 Commits
v3.0.0-dev
...
v3.0.0-dev
| Author | SHA1 | Date | |
|---|---|---|---|
| d160ad87f9 | |||
| fc74e933d6 | |||
| ad355fe15e | |||
| 4dd8bd1108 | |||
| e2f4433042 | |||
| 7775abbbca | |||
| f340c57ffd | |||
| 6c6a603cd8 | |||
| 35167f1853 | |||
| 815ae473db | |||
| ff3052f3b0 | |||
| 0985e40ead | |||
| 23afe71752 |
@@ -4,7 +4,7 @@ on:
|
||||
push:
|
||||
tags:
|
||||
- "v*"
|
||||
|
||||
|
||||
jobs:
|
||||
build-and-publish:
|
||||
runs-on: ubuntu-22.04
|
||||
@@ -19,7 +19,8 @@ jobs:
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 20
|
||||
registry-url: "https://registry.npmjs.org"
|
||||
registry-url: 'https://git.fjla.uk/api/packages/owlboard/npm'
|
||||
scope: '@OwlBoard'
|
||||
|
||||
- name: Install Dependencies
|
||||
run: npm ci
|
||||
@@ -27,12 +28,10 @@ jobs:
|
||||
- name: Build
|
||||
run: npm run build
|
||||
|
||||
# - name: Publish to NPM
|
||||
# run: npm publish --access public
|
||||
# env:
|
||||
# NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
|
||||
- name: Publish to Gitea Repo
|
||||
run: npm publish --registry=https://git.fjla.uk
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.REPO_TOKEN }}
|
||||
run: |
|
||||
VERSION=${GITHUB_REF_NAME#v}
|
||||
npm version $VERSION --no-git-tag-version
|
||||
npm config set //git.fjla.uk/api/packages/owlboard/npm/:_authToken ${{ secrets.REPO_TOKEN }}
|
||||
npm config set //git.fjla.uk/api/packages/OwlBoard/npm/:_authToken ${{ secrets.REPO_TOKEN }}
|
||||
npm publish --registry=https://git.fjla.uk
|
||||
30
package-lock.json
generated
30
package-lock.json
generated
@@ -1,15 +1,19 @@
|
||||
{
|
||||
"name": "owlboard-ts",
|
||||
"name": "@owlboard/owlboard-ts",
|
||||
"version": "3.0.0",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "owlboard-ts",
|
||||
"name": "@owlboard/owlboard-ts",
|
||||
"version": "3.0.0",
|
||||
"license": "GPL-3.0",
|
||||
"dependencies": {
|
||||
"@owlboard/api-schema-types": "^3.0.2-alpha3",
|
||||
"latlon-geohash": "^2.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@owlboard/api-schema-types": "^3.0.1-alpha3",
|
||||
"@types/latlon-geohash": "^2.0.4",
|
||||
"@types/node": "^25.3.0",
|
||||
"ts-node": "^10.9.2",
|
||||
"tsx": "^4.21.0",
|
||||
@@ -500,10 +504,9 @@
|
||||
}
|
||||
},
|
||||
"node_modules/@owlboard/api-schema-types": {
|
||||
"version": "3.0.1-alpha3",
|
||||
"resolved": "https://git.fjla.uk/api/packages/OwlBoard/npm/%40owlboard%2Fapi-schema-types/-/3.0.1-alpha3/api-schema-types-3.0.1-alpha3.tgz",
|
||||
"integrity": "sha512-5CVm1k/C++/VrtAw4NkvclDunH+RmYLnDZZMSWTM1mm+WlEVnmD+MVnTgC/FhcsAmsNHV8swm66RCqkCuhbOnA==",
|
||||
"dev": true,
|
||||
"version": "3.0.2-alpha3",
|
||||
"resolved": "https://git.fjla.uk/api/packages/OwlBoard/npm/%40owlboard%2Fapi-schema-types/-/3.0.2-alpha3/api-schema-types-3.0.2-alpha3.tgz",
|
||||
"integrity": "sha512-3NFP21QdSfjziwlGQixlNnUWC55HlKZGyWANIOimWu0FZejWQWExJiaAVfb6m3Sbv+zvQMu3B8mzcMCcGadZCQ==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@tsconfig/node10": {
|
||||
@@ -534,6 +537,13 @@
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/latlon-geohash": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/@types/latlon-geohash/-/latlon-geohash-2.0.4.tgz",
|
||||
"integrity": "sha512-R/wb/V8lhhI0hyRGDTkT6F4C3lynkF/D29iMSN5B4bYswaa4R+wajgcTv9z73BotGArf4Q8BnDNtmLeI+WiKkQ==",
|
||||
"dev": true,
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/@types/node": {
|
||||
"version": "25.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.0.tgz",
|
||||
@@ -664,6 +674,12 @@
|
||||
"url": "https://github.com/privatenumber/get-tsconfig?sponsor=1"
|
||||
}
|
||||
},
|
||||
"node_modules/latlon-geohash": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/latlon-geohash/-/latlon-geohash-2.0.0.tgz",
|
||||
"integrity": "sha512-OKBswTwrvTdtenV+9C9euBmvgGuqyjJNAzpQCarRz1m8/pYD2nz9fKkXmLs2S3jeXaLi3Ry76twQplKKUlgS/g==",
|
||||
"license": "MIT"
|
||||
},
|
||||
"node_modules/make-error": {
|
||||
"version": "1.3.6",
|
||||
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
|
||||
|
||||
@@ -6,7 +6,9 @@
|
||||
"type": "module",
|
||||
"sideEffects": false,
|
||||
"types": "./dist/index.d.ts",
|
||||
"files": ["dist"],
|
||||
"files": [
|
||||
"dist"
|
||||
],
|
||||
"exports": {
|
||||
".": {
|
||||
"types": "./dist/index.d.ts",
|
||||
@@ -28,9 +30,11 @@
|
||||
"author": "Frederick Boniface",
|
||||
"license": "GPL-3.0",
|
||||
"dependencies": {
|
||||
"@owlboard/api-schema-types": "^3.0.1-alpha3"
|
||||
"@owlboard/api-schema-types": "^3.0.2-alpha3",
|
||||
"latlon-geohash": "^2.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/latlon-geohash": "^2.0.4",
|
||||
"@types/node": "^25.3.0",
|
||||
"ts-node": "^10.9.2",
|
||||
"tsx": "^4.21.0",
|
||||
|
||||
12
src/index.ts
12
src/index.ts
@@ -1,5 +1,9 @@
|
||||
export * from './lib/base.js';
|
||||
export * from './lib/client.js';
|
||||
export * from './lib/errors.js';
|
||||
export { OwlBoardClient } from './lib/client.js';
|
||||
export { ValidationError, ApiError } from './lib/errors.js';
|
||||
|
||||
export * from './modules/pis.js';
|
||||
// Re-export API Schema types
|
||||
export type * from '@owlboard/api-schema-types'
|
||||
|
||||
// Useful exports for Type Hinting
|
||||
export { PisModule } from './modules/pis.js';
|
||||
export { LocationFilterModule } from './modules/locationFilter.js';
|
||||
|
||||
@@ -1,12 +1,18 @@
|
||||
import { BaseClient } from "./base.js";
|
||||
import { PisModule } from "../modules/pis.js";
|
||||
import { LocationFilterModule } from "../modules/locationFilter.js";
|
||||
import { StationDataModule } from "src/modules/stationData.js";
|
||||
|
||||
export class OwlBoardClient extends BaseClient {
|
||||
public readonly pis: PisModule;
|
||||
public readonly locationFilter: LocationFilterModule;
|
||||
public readonly stationData: StationDataModule;
|
||||
|
||||
constructor(baseUrl: string, apiKey?: string) {
|
||||
super(baseUrl, apiKey);
|
||||
|
||||
this.pis = new PisModule(this);
|
||||
this.locationFilter = new LocationFilterModule(this);
|
||||
this.stationData = new StationDataModule(this);
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,7 @@
|
||||
/**
|
||||
* Checks if a string is a valid CRS
|
||||
* Checks if a string is a valid CRS (Syntactically Only)
|
||||
* using byte level checking for max performance
|
||||
* @param CRS The CRS Code to be validated
|
||||
*/
|
||||
export const IsValidCrs = (CRS: string): boolean => {
|
||||
if (CRS.length !== 3) return false;
|
||||
@@ -15,8 +16,9 @@ export const IsValidCrs = (CRS: string): boolean => {
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a string is a valid TIPLOC
|
||||
* Checks if a string is a valid TIPLOC (Syntactically Only)
|
||||
* using byte level checking for max performance
|
||||
* @param TIPLOC The TIPLOC to be validated
|
||||
*/
|
||||
export const IsValidTiploc = (TIPLOC: string): boolean => {
|
||||
const l = TIPLOC.length;
|
||||
@@ -33,9 +35,10 @@ export const IsValidTiploc = (TIPLOC: string): boolean => {
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a string is a valid PIS Code
|
||||
* Checks if a string is a valid PIS Code (Syntactically Only)
|
||||
* using byte level checking for max performance
|
||||
* ONLY GWR (4-digit) CODES SUPPORTED
|
||||
* @param PIS The PIS Code to be validated
|
||||
*/
|
||||
export const IsValidPis = (PIS: string): boolean => {
|
||||
if (PIS.length !== 4) return false;
|
||||
@@ -44,4 +47,15 @@ export const IsValidPis = (PIS: string): boolean => {
|
||||
if (!(char >= 48 && char <= 57)) return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Validates Geohash string against standard b32 alphabet
|
||||
* (Syntactically Only validation)
|
||||
* @param hash The geohash to be validated
|
||||
* @param maxLen Defaults to 6 - which is enforced by the server, should not need changing
|
||||
*/
|
||||
export const IsValidGeoHash = (hash: string, maxLen: number = 6): boolean => {
|
||||
const geoHashRegex = new RegExp(`^[0-9bcdefghjkmnpqrstuvwxyz]{1,${maxLen}}$`, 'i');
|
||||
return geoHashRegex.test(hash);
|
||||
}
|
||||
15
src/modules/locationFilter.ts
Normal file
15
src/modules/locationFilter.ts
Normal file
@@ -0,0 +1,15 @@
|
||||
import { ApiLocationFilter } from "@owlboard/api-schema-types";
|
||||
import type { BaseClient, ApiResult } from '../lib/base.js';
|
||||
|
||||
export class LocationFilterModule {
|
||||
constructor(private client: BaseClient) {}
|
||||
|
||||
async getLocationFilterData(): Promise<ApiResult<ApiLocationFilter.LocationFilterObject[]>> {
|
||||
const path = '/locationFilter/data';
|
||||
|
||||
return this.client.request<ApiLocationFilter.LocationFilterObject[]>(
|
||||
path,
|
||||
{method: "GET"}
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
import { ApiPisObject } from '@owlboard/api-schema-types';
|
||||
import type { BaseClient, ApiResult } from '../lib/base.js';
|
||||
import { IsValidCrs, IsValidTiploc, IsValidPis } from 'src/lib/validation.js';
|
||||
import { ValidationError } from 'src/lib/errors.js';
|
||||
import { IsValidCrs, IsValidPis } from '../lib/validation.js';
|
||||
import { ValidationError } from '../lib/errors.js';
|
||||
|
||||
export class PisModule {
|
||||
constructor(private client: BaseClient) {}
|
||||
|
||||
37
src/modules/stationData.ts
Normal file
37
src/modules/stationData.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
import { ApiStationsNearestStations } from '@owlboard/api-schema-types';
|
||||
import type { BaseClient, ApiResult } from '../lib/base.js';
|
||||
import { IsValidGeoHash } from '../lib/validation.js';
|
||||
import { ValidationError } from '../lib/errors.js';
|
||||
import Geohash from 'latlon-geohash';
|
||||
|
||||
export class StationDataModule {
|
||||
constructor(private client: BaseClient) {}
|
||||
|
||||
/**
|
||||
* Generates a 6-char Geohash for the given co-ordinates
|
||||
* @param lt Latitude
|
||||
* @param ln Longitude
|
||||
* @returns Geohash as string
|
||||
*/
|
||||
static generateGeohash(lt: number, ln: number): string {
|
||||
return Geohash.encode(lt, ln, 6);
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @param geohash Geohash as string (up to six characters), generate using this.generateGeohash()
|
||||
* @returns Nearest Stations API Response (CRS, Name)
|
||||
*/
|
||||
async getNearestStations(geohash: string): Promise<ApiResult<ApiStationsNearestStations.StationsNearestStations[]>> {
|
||||
if (!IsValidGeoHash(geohash)) {
|
||||
throw new ValidationError("hash", "Invalid Geohash requested");
|
||||
}
|
||||
|
||||
const path = `/stationData/nearest/${geohash}`;
|
||||
return this.client.request<ApiStationsNearestStations.StationsNearestStations[]>(path, {
|
||||
method: 'GET',
|
||||
})
|
||||
}
|
||||
|
||||
// getStationSate(crs: string){}
|
||||
}
|
||||
@@ -21,6 +21,7 @@
|
||||
"sourceMap": true,
|
||||
"declaration": true,
|
||||
"declarationMap": true,
|
||||
"composite": true,
|
||||
|
||||
// Stricter Typechecking Options
|
||||
"noUncheckedIndexedAccess": true,
|
||||
|
||||
Reference in New Issue
Block a user