From 04ed0ede291fa5fe0f1d1042f6bd9ec0aecdb120 Mon Sep 17 00:00:00 2001 From: Fred Boniface Date: Wed, 7 Jan 2026 17:23:56 +0000 Subject: [PATCH] Switch to JSON Schema rather than protobuf --- .gitea/workflows/release.yaml | 22 ++++-------- buf.gen.yaml | 18 ---------- buf.yaml | 9 ----- schemas/data-ingress/pis-data.json | 54 ++++++++++++++++++++++++++++++ scripts/build.sh | 26 ++++++++++++++ 5 files changed, 86 insertions(+), 43 deletions(-) delete mode 100644 buf.gen.yaml delete mode 100644 buf.yaml create mode 100644 schemas/data-ingress/pis-data.json create mode 100644 scripts/build.sh diff --git a/.gitea/workflows/release.yaml b/.gitea/workflows/release.yaml index 9fb8cfe..9f66b07 100644 --- a/.gitea/workflows/release.yaml +++ b/.gitea/workflows/release.yaml @@ -16,34 +16,24 @@ jobs: - name: Get Version id: get_version run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT - - - uses: bufbuild/buf-action@v1.3 - with: - setup_only: true - version: '1.63.0' - + - uses: actions/setup-go@v5 with: go-version: '1.23' - + - 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 Go Protoc Plugin + - name: Install Generators run: | - go install google.golang.org/protobuf/cmd/protoc-gen-go@latest + npm install -g json-schema-to-typescript typescript + go install github.com/atombender/go-jsonschema/cmd/go-jsonschema@latest echo "$(go env GOPATH)/bin" >> $GITHUB_PATH - - name: Install TS-Proto Plugin - run: | - npm install ts-proto typescript - echo "$PATH:$(pwd)/ts-proto" >> $GITHUB_PATH - - - name: Generate Code - run: buf generate + - run: scripts/build.sh - name: Build and Publish TS working-directory: gen/ts diff --git a/buf.gen.yaml b/buf.gen.yaml deleted file mode 100644 index f008890..0000000 --- a/buf.gen.yaml +++ /dev/null @@ -1,18 +0,0 @@ -version: v2 -managed: - enabled: true - override: - - file_option: go_package_prefix - value: github.com/owlboard/backend-data-contracts -plugins: - - local: protoc-gen-go - out: gen/go - opt: paths=source_relative - - local: ./node_modules/ts-proto/protoc-gen-ts_proto - out: gen/ts - opt: - - esModuleInterop=true - - outputJsonMethods=true - - forceLong=string - - importSuffix=.js - - outputExtensions=true \ No newline at end of file diff --git a/buf.yaml b/buf.yaml deleted file mode 100644 index 0de2cc6..0000000 --- a/buf.yaml +++ /dev/null @@ -1,9 +0,0 @@ -version: v2 -modules: - - path: protos -lint: - use: - - DEFAULT -breaking: - use: - - FILE \ No newline at end of file diff --git a/schemas/data-ingress/pis-data.json b/schemas/data-ingress/pis-data.json new file mode 100644 index 0000000..d92b1d6 --- /dev/null +++ b/schemas/data-ingress/pis-data.json @@ -0,0 +1,54 @@ +{ + "$id": "https://schema.owlboard.info/data-ingress/pis-data.schema.json", + "$schema": "https://json-schema.org/draft-07/schema#", + "title": "PisObjects", + "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" + }, + "crsHash": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[0-9]+$", + "description": "Stringified 64-bit hash" + }, + "tiplocStops": { + "type": "array", + "items": { + "type": "string", + "minLength": 4, + "maxLength": 7, + "pattern": "^[a-zA-Z0-9]+$" + }, + "description": "List of TIPLOC Codes" + }, + "tiplocHash": { + "type": "string", + "minLength": 1, + "maxLength": 64, + "pattern": "^[0-9]+$" + } + }, + "required": ["code", "toc", "crsStops", "crsHash", "tiplocStops", "tiplocHash"], + "additionalProperties": false +} \ No newline at end of file diff --git a/scripts/build.sh b/scripts/build.sh new file mode 100644 index 0000000..f177ec5 --- /dev/null +++ b/scripts/build.sh @@ -0,0 +1,26 @@ +#!/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') + + # Output to one folder and add to index + npx --yes json-schema-to-typescript "$file" > "gen/ts/${clean_name}.ts" + echo "export * from './${clean_name}.js';" >> gen/ts/index.ts + + # Generate Go + go-jsonschema -p models "$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" \ No newline at end of file