Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 23 additions & 0 deletions .github/workflows/type-check.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
name: Type Check

on:
pull_request:
branches:
- main
jobs:
typecheck:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v4

- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version: '24'

- name: Install dependencies
run: npm i

- name: Run type check
run: npm run check:types
250 changes: 131 additions & 119 deletions lib/compile/csdl2openapi.js

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions lib/compile/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -184,4 +184,5 @@ function _servicePath(csdl, csn, protocols) {

return paths;
}
return {}
}
50 changes: 50 additions & 0 deletions lib/compile/types.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
type StringSchema = {
type: 'string'
format?: 'base64url' | 'uuid' | 'time' | 'date' | 'date-time' | 'duration'
maxLength?: number
example?: string
pattern?: string
}

type NumberSchema = {
type: 'number' | 'integer'
format?: 'float' | 'double' | 'decimal' | 'uint8' | 'int8' | 'int16' | 'int32' | 'int64'
multipleOf?: number
example?: number,
minimum?: number
maximum?: number
exclusiveMinimum?: boolean
exclusiveMaximum?: boolean
}

type BooleanSchema = {
type: 'boolean'
}

type ArraySchema = {
type: 'array',
items: Schema
}

type Meta = {
nullable?: boolean
default?: unknown
example?: string | number,
description?: string
'$ref'?: unknown
}

type SingleSchema = (StringSchema | NumberSchema | BooleanSchema | ArraySchema) & Meta

type AnyOf = { anyOf: Schema[] } & Meta
type AllOf = { allOf: Schema[] } & Meta
type MultiSchema = AnyOf | AllOf

export type Schema = (SingleSchema | MultiSchema)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Beautiful! 🤩




export type TargetRestrictions = {
Countable?: boolean
Expandable?: boolean
}
7 changes: 5 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@
],
"scripts": {
"test": "npx jest --silent",
"lint": "npx eslint ."
"lint": "npx eslint .",
"check:types": "npx tsc --noEmit"
},
"dependencies": {
"pluralize": "^8.0.0"
Expand All @@ -31,7 +32,9 @@
"@sap/cds": ">=7.6"
},
"devDependencies": {
"@types/node": "^24.3.0",
"eslint": "^8.56.0",
"jest": ">=29",
"eslint": "^8.56.0"
"typescript": "^5.9.2"
}
}
31 changes: 31 additions & 0 deletions tsconfig.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
{
// Visit https://aka.ms/tsconfig to read more about this file
"compilerOptions": {
"module": "nodenext",
"target": "esnext",
"lib": ["esnext"],
"types": ["node"],
"allowJs": true,
"checkJs": true,
"noUncheckedIndexedAccess": false,
"exactOptionalPropertyTypes": true,
"noImplicitOverride": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"noPropertyAccessFromIndexSignature": true,
"strict": true,
"jsx": "react-jsx",
"verbatimModuleSyntax": true,
"isolatedModules": true,
"noUncheckedSideEffectImports": true,
"moduleDetection": "force",
"skipLibCheck": true,
// enable after first round
"noImplicitReturns": false,
"noImplicitAny": false,
},
"exclude": [
"**/*.test.js"
]
}