Compare commits
8 Commits
71be9ec6ea
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 8ac0215247 | |||
| 07f224ff18 | |||
| 91e9432a07 | |||
| 50e2907f47 | |||
| e3bab25418 | |||
| 6298763f2f | |||
| 7259dfaa37 | |||
| 64df9edb95 |
121
.gitea/workflows/release.yaml
Normal file
121
.gitea/workflows/release.yaml
Normal file
@@ -0,0 +1,121 @@
|
|||||||
|
name: Generate and Release Protos
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
tags:
|
||||||
|
- 'v*'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
release:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v6
|
||||||
|
with:
|
||||||
|
fetch-depth: 0
|
||||||
|
persist-credentials: false
|
||||||
|
|
||||||
|
- name: Get Version
|
||||||
|
id: get_version
|
||||||
|
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
|
||||||
|
|
||||||
|
- uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: '1.24'
|
||||||
|
|
||||||
|
- uses: actions/setup-node@v6
|
||||||
|
with:
|
||||||
|
node-version: '18.18.x'
|
||||||
|
registry-url: 'https://git.fjla.uk/api/packages/owlboard/npm'
|
||||||
|
scope: '@owlboard'
|
||||||
|
|
||||||
|
- name: Install Generators
|
||||||
|
run: |
|
||||||
|
npm install -g json-schema-to-typescript typescript
|
||||||
|
go install github.com/atombender/go-jsonschema@latest
|
||||||
|
echo "$(go env GOPATH)/bin" >> $GITHUB_PATH
|
||||||
|
|
||||||
|
- run: bash scripts/build.sh
|
||||||
|
|
||||||
|
- name: Build and Publish TS
|
||||||
|
working-directory: gen/ts
|
||||||
|
run: |
|
||||||
|
npm init -y
|
||||||
|
|
||||||
|
# Build index.ts
|
||||||
|
echo "// Auto-generated" > index.ts
|
||||||
|
find . -maxdepth 1 -name "*.ts" -not -name "index.ts" | sed 's|^\./||; s|\.ts$||' | awk '{
|
||||||
|
# Use gsub to turn hyphens into underscores so we can split easily
|
||||||
|
clean = $0;
|
||||||
|
gsub(/-/, "_", clean);
|
||||||
|
|
||||||
|
n = split(clean, parts, "_");
|
||||||
|
name = "";
|
||||||
|
for (i=1; i<=n; i++) {
|
||||||
|
if (length(parts[i]) > 0) {
|
||||||
|
name = name toupper(substr(parts[i],1,1)) substr(parts[i],2);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
# name will now be 'DataIngressPisData' (valid TS)
|
||||||
|
printf "export * as %s from \"./%s.js\";\n", name, $0
|
||||||
|
}' >> index.ts
|
||||||
|
|
||||||
|
VERSION="${{ steps.get_version.outputs.VERSION }}"
|
||||||
|
REPO_URL="${{ github.server_url }}/${{ github.repository }}.git"
|
||||||
|
jq --arg ver "$VERSION" \
|
||||||
|
--arg name "@owlboard/api-schema-types" \
|
||||||
|
--arg repo "$REPO_URL" \
|
||||||
|
'.name = $name |
|
||||||
|
.description = "TypeScript type definitions for OwlBoard API schemas" |
|
||||||
|
.author = "Frederick Boniface" |
|
||||||
|
.version = $ver |
|
||||||
|
.type = "module" |
|
||||||
|
.main = "./dist/index.js" |
|
||||||
|
.license = "MIT" |
|
||||||
|
.repository = { "type": "git", "url": $repo } |
|
||||||
|
.files = ["dist"] |
|
||||||
|
.sideEffects = false |
|
||||||
|
.dependencies = {} |
|
||||||
|
.devDependencies = {} |
|
||||||
|
.exports = {
|
||||||
|
".": {
|
||||||
|
"types": "./dist/index.d.ts",
|
||||||
|
"import": "./dist/index.js"
|
||||||
|
}
|
||||||
|
} |
|
||||||
|
.types = "./dist/index.d.ts"' \
|
||||||
|
package.json > package.json.new && mv package.json.new package.json
|
||||||
|
|
||||||
|
# Compile
|
||||||
|
npx tsc index.ts --declaration --module nodenext --target es2022 --moduleResolution nodenext --outDir dist/ --skipLibCheck true
|
||||||
|
|
||||||
|
# Publish
|
||||||
|
npm config set //git.fjla.uk/api/packages/owlboard/npm/:_authToken ${{ secrets.PACKAGE_PUSH }}
|
||||||
|
npm publish
|
||||||
|
|
||||||
|
- name: Publish Go
|
||||||
|
run: |
|
||||||
|
VERSION="v${{ steps.get_version.outputs.VERSION }}"
|
||||||
|
MOD_NAME="git.fjla.uk/owlboard/api-schema-types/v3"
|
||||||
|
ZIP_ROOT="/tmp/go_upload"
|
||||||
|
FULL_PATH="$ZIP_ROOT/$MOD_NAME@$VERSION"
|
||||||
|
|
||||||
|
# 1. Prepare
|
||||||
|
cd gen/go
|
||||||
|
|
||||||
|
# 2. Initialize the module
|
||||||
|
go mod init "$MOD_NAME"
|
||||||
|
|
||||||
|
# 3. Create the structure
|
||||||
|
mkdir -p "$FULL_PATH"
|
||||||
|
|
||||||
|
# 4. Copy the CONTENTS of models to the root of the module
|
||||||
|
# This flattens the structure so the .go files are next to go.mod
|
||||||
|
cp -r models/* "$FULL_PATH/"
|
||||||
|
cp go.mod "$FULL_PATH/"
|
||||||
|
|
||||||
|
# 5. Zip and Upload
|
||||||
|
cd "$ZIP_ROOT"
|
||||||
|
zip -r -D "$GITHUB_WORKSPACE/module.zip" .
|
||||||
|
|
||||||
|
curl -f --user "owlbot:${{ secrets.PACKAGE_PUSH }}" \
|
||||||
|
--upload-file "$GITHUB_WORKSPACE/module.zip" \
|
||||||
|
"${{ github.server_url }}/api/packages/owlboard/go/upload?version=$VERSION"
|
||||||
2
LICENSE
2
LICENSE
@@ -1,6 +1,6 @@
|
|||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2026 OwlBoard
|
Copyright (c) 2026 Frederick Boniface
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and
|
||||||
associated documentation files (the "Software"), to deal in the Software without restriction, including
|
associated documentation files (the "Software"), to deal in the Software without restriction, including
|
||||||
|
|||||||
43
schemas/api/envelope.json
Normal file
43
schemas/api/envelope.json
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
{
|
||||||
|
"$id": "https://schema.owlboard.info/api/api-envelope.schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "Envelope",
|
||||||
|
"description": "OwlBoard API Envelope",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"t": {
|
||||||
|
"type": "integer",
|
||||||
|
"minimum": 0,
|
||||||
|
"description": "Unix timestamp showing when the data was generated, or the time the error was encountered"
|
||||||
|
},
|
||||||
|
"d": {
|
||||||
|
"description": "Payload data. Type depends on request endpoint"
|
||||||
|
},
|
||||||
|
"e": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"code": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Type of error encountered",
|
||||||
|
"enum": [
|
||||||
|
"VALIDATION",
|
||||||
|
"AUTH",
|
||||||
|
"NOT_FOUND",
|
||||||
|
"RATE_LIMIT",
|
||||||
|
"SERVER"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"msg": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "Human-readable descriptive error message."
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["t"],
|
||||||
|
"oneOf": [
|
||||||
|
{"required": ["e"]},
|
||||||
|
{"required": ["d"]}
|
||||||
|
],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
56
schemas/api/pis-object.json
Normal file
56
schemas/api/pis-object.json
Normal file
@@ -0,0 +1,56 @@
|
|||||||
|
{
|
||||||
|
"$id": "https://schema.owlboard.info/api/pis-object.schema.json",
|
||||||
|
"$schema": "https://json-schema.org/draft-07/schema#",
|
||||||
|
"title": "PisObjects",
|
||||||
|
"description": "PIS API Resonse, contains the code and optionally, TOC and/or a list of CRS, TIPLOC",
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"code": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "PIS Code - Code that is entered in to the PIS system"
|
||||||
|
},
|
||||||
|
"toc": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 2,
|
||||||
|
"maxLength": 2,
|
||||||
|
"pattern": "^[a-zA-Z]+$",
|
||||||
|
"description": "Two letter TOC Code"
|
||||||
|
},
|
||||||
|
"crsStops": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 3,
|
||||||
|
"maxLength": 3,
|
||||||
|
"pattern": "^[a-zA-Z]+$"
|
||||||
|
},
|
||||||
|
"description": "List of 3ALPHA/CRS Codes"
|
||||||
|
},
|
||||||
|
"tiplocStops": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string",
|
||||||
|
"minLength": 4,
|
||||||
|
"maxLength": 7,
|
||||||
|
"pattern": "^[a-zA-Z0-9]+$"
|
||||||
|
},
|
||||||
|
"description": "List of TIPLOC Codes"
|
||||||
|
},
|
||||||
|
"skip": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"skip": {
|
||||||
|
"type": "integer",
|
||||||
|
"description": "Number of stops to skip"
|
||||||
|
},
|
||||||
|
"position": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": ["head", "tail"],
|
||||||
|
"description": "Position of stops to be skipped, either 'head' or 'tail'"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"required": ["code"],
|
||||||
|
"additionalProperties": false
|
||||||
|
}
|
||||||
25
scripts/build.sh
Normal file
25
scripts/build.sh
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# Create clean output directories
|
||||||
|
rm -rf gen && mkdir -p gen/ts gen/go/models
|
||||||
|
|
||||||
|
# Find all .json files
|
||||||
|
FILES=$(find schemas -name "*.json")
|
||||||
|
|
||||||
|
# Initialize the TypeScript Barrel File
|
||||||
|
echo "// Auto-generated barrel file" > gen/ts/index.ts
|
||||||
|
|
||||||
|
for file in $FILES; do
|
||||||
|
# Get a clean name (e.g., data-ingress_pis-mapping)
|
||||||
|
clean_name=$(echo "${file#schemas/}" | sed 's/\//_/g' | sed 's/\.json//g')
|
||||||
|
|
||||||
|
# OGenerate TS
|
||||||
|
npx --yes json-schema-to-typescript "$file" > "gen/ts/${clean_name}.ts"
|
||||||
|
|
||||||
|
# Generate Go
|
||||||
|
go-jsonschema -p contracts "$file" > "gen/go/models/${clean_name}.go"
|
||||||
|
done
|
||||||
|
|
||||||
|
echo "✅ Generated single TS package in gen/ts"
|
||||||
|
echo "✅ Generated single Go package in gen/go/models"
|
||||||
Reference in New Issue
Block a user