Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 7fe1be9b48 | |||
| c8731caadd | |||
| 20cb7b101c | |||
| ac3124ff14 | |||
| b29f42c004 | |||
| 051721ce02 | |||
| 04ed0ede29 | |||
| a17e7a5290 |
@@ -17,14 +17,9 @@ jobs:
|
|||||||
id: get_version
|
id: get_version
|
||||||
run: echo "VERSION=${GITHUB_REF#refs/tags/v}" >> $GITHUB_OUTPUT
|
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
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: '1.23'
|
go-version: '1.24'
|
||||||
|
|
||||||
- uses: actions/setup-node@v6
|
- uses: actions/setup-node@v6
|
||||||
with:
|
with:
|
||||||
@@ -32,49 +27,49 @@ jobs:
|
|||||||
registry-url: 'https://git.fjla.uk/api/packages/owlboard/npm'
|
registry-url: 'https://git.fjla.uk/api/packages/owlboard/npm'
|
||||||
scope: '@owlboard'
|
scope: '@owlboard'
|
||||||
|
|
||||||
- name: Install Go Protoc Plugin
|
- name: Install Generators
|
||||||
run: |
|
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@latest
|
||||||
echo "$(go env GOPATH)/bin" >> $GITHUB_PATH
|
echo "$(go env GOPATH)/bin" >> $GITHUB_PATH
|
||||||
|
|
||||||
- name: Install TS-Proto Plugin
|
- run: bash scripts/build.sh
|
||||||
run: |
|
|
||||||
npm install ts-proto typescript
|
|
||||||
echo "$PATH:$(pwd)/ts-proto" >> $GITHUB_PATH
|
|
||||||
|
|
||||||
- name: Generate Code
|
|
||||||
run: buf generate
|
|
||||||
|
|
||||||
- name: Build and Publish TS
|
- name: Build and Publish TS
|
||||||
working-directory: gen/ts
|
working-directory: gen/ts
|
||||||
run: |
|
run: |
|
||||||
npm init -y
|
npm init -y
|
||||||
|
|
||||||
# 1. Create a dynamic index.ts using Namespace exports
|
# Build index.ts
|
||||||
# This converts 'rail_backend/v1/pis_mapping.ts'
|
echo "// Auto-generated" > index.ts
|
||||||
# into 'export * as PisMapping from "./rail_backend/v1/pis_mapping";'
|
find . -maxdepth 1 -name "*.ts" -not -name "index.ts" | sed 's|^\./||; s|\.ts$||' | awk '{
|
||||||
# We use awk to handle the naming conversion (snake_case to PascalCase-ish)
|
# Use gsub to turn hyphens into underscores so we can split easily
|
||||||
find . -name "*.ts" -not -name "index.ts" | sed 's|^\./||; s|\.ts$||' | awk -F'/' '{
|
clean = $0;
|
||||||
name=$NF;
|
gsub(/-/, "_", clean);
|
||||||
gsub(/_/, "", name);
|
|
||||||
printf "export * as %s from \"./%s\";\n", toupper(substr(name,1,1)) substr(name,2), $0
|
|
||||||
}' > index.ts
|
|
||||||
|
|
||||||
# 2. Update package.json
|
n = split(clean, parts, "_");
|
||||||
jq '.name = "@owlboard/backend-data-contracts" |
|
name = "";
|
||||||
.version = "${{ steps.get_version.outputs.VERSION }}" |
|
for (i=1; i<=n; i++) {
|
||||||
.type = "module" |
|
if (length(parts[i]) > 0) {
|
||||||
.main = "./dist/index.js" |
|
name = name toupper(substr(parts[i],1,1)) substr(parts[i],2);
|
||||||
.types = "./dist/index.d.ts" |
|
}
|
||||||
.publishConfig = { "registry": "https://git.fjla.uk/api/packages/owlboard/npm" }' \
|
}
|
||||||
package.json > temp.json && mv temp.json package.json
|
# name will now be 'DataIngressPisData' (valid TS)
|
||||||
|
printf "export * as %s from \"./%s.js\";\n", name, $0
|
||||||
|
}' >> index.ts
|
||||||
|
|
||||||
# 3. Compile
|
VERSION="${{ steps.get_version.outputs.VERSION }}"
|
||||||
npx tsc index.ts --declaration --module esnext --target es2022 --moduleResolution node --outDir dist/
|
jq --arg ver "$VERSION" \
|
||||||
|
--arg name "@owlboard/backend-data-contracts" \
|
||||||
|
'.name = $name | .version = $ver | .type = "module" | .main = "./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
|
npm publish
|
||||||
env:
|
|
||||||
NODE_AUTH_TOKEN: ${{ secrets.PACKAGE_PUSH }}
|
|
||||||
|
|
||||||
- name: Publish Go
|
- name: Publish Go
|
||||||
run: |
|
run: |
|
||||||
|
|||||||
17
buf.gen.yaml
17
buf.gen.yaml
@@ -1,17 +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
|
|
||||||
9
buf.yaml
9
buf.yaml
@@ -1,9 +0,0 @@
|
|||||||
version: v2
|
|
||||||
modules:
|
|
||||||
- path: protos
|
|
||||||
lint:
|
|
||||||
use:
|
|
||||||
- DEFAULT
|
|
||||||
breaking:
|
|
||||||
use:
|
|
||||||
- FILE
|
|
||||||
54
schemas/data-ingress/pis-data.json
Normal file
54
schemas/data-ingress/pis-data.json
Normal file
@@ -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
|
||||||
|
}
|
||||||
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 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"
|
||||||
Reference in New Issue
Block a user